Hàm DeviceIoControl API (The DeviceIoControl API) Hàm DeviceIoControl API (The DeviceIoControl API) Bởi: Khoa CNTT ĐHSP KT Hưng Yên User-mode DeviceIoControl API có nguyên mẫu sau đây: result = DeviceIoControl(Handle, Code, InputData, InputLength, OutputData, OutputLength, &Feedback, &Overlapped); Handle (HANDLE) kênh điều khiển mở thiết bị Bạn thu kênh việc gọi CreateFile lệnh sau : Handle = CreateFile("\\\\.\\IOCTL", GENERIC_READ │ GENERIC_WRITE, 0, NULL, OPEN_EXISTING, flags, NULL); if (Handle == INVALID_HANDLE_VALUE) CloseHandle(Handle); Những cờ đối số tới CreateFile FILE_FLAG_OVERLAPPED hay để bạn biểu diễn hay không hoạt động dị với kênh điều khiển tệp tin Trong bạn có kênh điều khiển mở, bạn làm gọi tới ReadFile, WriteFile, hay DeviceIoControl Hoặc bạn truy cập thiết bị, bạn cần phải đóng dứt khoát kênh điều khiển việc gọi CloseHandle.Phải hướng vào tâm trí, nhưng, hệ điều hành tự động đóng kênh điều khiển mà mở phía trái trình (của) bạn hoàn thành Code (DWORD) đối số tới DeviceIoControl mã điều khiển mà báo thao tác điều khiển (phép toán kiểm tra) bạn muốn thực Tôi bàn luận việc bạn định nghĩa mã xa (in “Defining I/O Control Codes”) InputData (PVOID) InputLength (DWORD) đối sốmô tả vùng liệu mà bạn gửi tới trình điều 1/5 Hàm DeviceIoControl API (The DeviceIoControl API) khiển thiết bị (Nghĩa là, liệu nhập vào từ phối cảnh (của) trình điều khiển.) The OutputData (PVOID) and OutputLength (DWORD) đối sốmô tả vùng liệu mà trình điều khiển hoàn toàn hay phần làm đầy thông tin mà muốn nhắn quay trở lại cho bạn (Nghĩa là, liệu đầu từ phối cảnh (của) trình điều khiển.) Trình điều khiển cập nhật the Feedback variable (a DWORD) để báo byte liệu đưa cho bạn mặt sau Hình 9-1 minh họa mối quan hệ đệm với ứng dụng trình điều khiển Cấu trúc Overlapped (OVERLAPPED) dùng để giúp đỡ kiểm soát tác vụ đồng bộ, mà đề tài mục Nếu bạn rõ FILE_FLAG_OVERLAPPED gọi tới CreateFile, bạn phải rõ OVERLAPPED trỏ cấu trúc Nếu bạn không rõ FILE_FLAG_OVERLAPPED, bạn có lẽ cung cấp tốt NULL cho đối sốcuối hệ thống lờ Hình 9-1 Đầu vào đệm cho DeviceIoControl Liệu có phải thao tác điều khiển (phép toán kiểm tra) đặc biệt yêu cầu đệm vào hay đệm phụ thuộc vào chức thực hiện.Chẳng hạn, điều khiển I/O (IOCTL) mà khôi phục số phiên trình điều khiển có lẽ yêu cầu đệm Một IOCTL mà đơn thông báo trình điều khiển thực tế gắn liền với ứng dụng có lẽ yêu cầu đệm vào Bạn hình dung hoạt động thao tác khác mà yêu cầu hai không đầu vào đệm ra-nó thứ phụ thuộc vào mà thao tác điều khiển (phép toán kiểm 2/5 Hàm DeviceIoControl API (The DeviceIoControl API) tra) làm Giá trị trở lại từ DeviceIoControl giá trị Đại số Boole mà báo thành công ( Nếu Thật ) hay thất bại ( Sai) Trong hoàn cảnh thất bại, ứng dụng gọi cho GetLastError để tìm gọi bị phá sản Synchronous Asynchronous gọi tới DeviceIoControl Khi bạn làm gọi đồng tới DeviceIoControl, khối luồng gọi thao tác điều khiển (phép toán kiểm tra) hoàn thành Chẳng hạn: HANDLE Handle = CreateFile("\\\\.\\IOCTL", , 0, NULL); DWORD version, junk; if (DeviceIoControl(Handle, IOCTL_GET_VERSION_BUFFERED, NULL, 0, &version, sizeof(version), &junk, NULL)) printf("IOCTL.SYS version %d.%2.2d\n", HIWORD(version), LOWORD(version)); else printf("Error %d in IOCTL_GET_VERSION_BUFFERED call\n", GetLastError()); mở ô điều khiển thiết bị cờ FILE_FLAG_OVERLAPPED Việc gọi tới DeviceIoControl không trở lại trình điều khiển cung cấp câu trả lời mà yêu cầu Khi bạn làm gọi không đồng tới DeviceIoControl, luồng gọi không hướng tới khối Thay vào đó, tiếp tục xử lý đạt đến điểm nơi yêu cầu kết thao tác điều khiển (phép toán kiểm tra) Tại điểm gọi API mà ngăn chặn luồng trình điều khiển hoàn thành thao tác Chẳng hạn: HANDLE Handle = CreateFile("\\\\.\\IOCTL", , FILE_FLAG_OVERLAPPED, NULL); DWORD version, junk; OVERLAPPED Overlapped; 3/5 Hàm DeviceIoControl API (The DeviceIoControl API) Overlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); DWORD code; if (DeviceIoControl(Handle, , &Overlapped)) code = 0; else code = GetLastError(); if (code == ERROR_IO_PENDING) { if (GetOverlappedResult(Handle, &Overlapped, &junk, TRUE)) code = 0; else code = GetLastError(); } CloseHandle(Overlapped.hEvent); if (code != 0) Định nghĩa mã Điều khiển vào/ra Đối số mã tới DeviceIoControl số 32- bit số mà bạn định nghĩa sử dụng tiền xử lý CTL_CODE vỹ mô điều phận hai DDK tảng SDK Hình 9-2 minh họa cách hệ điều hành phân chia 32-bit mã vào trường 4/5 Hàm DeviceIoControl API (The DeviceIoControl API) Hình 9-2 Những lĩnh vực mã điều khiển vào/ra Những lĩnh vực có giải thích sau đây: Kiểu thiết bị (16 bít, đối số tới CTL_CODE) báo kiểu thiết bị mà thực thao tác điều khiển (phép toán kiểm tra) _Bạn cần phải sử dụng giá trị (Chẳng hạn, FILE_DEVICE_UNKNOWN) bạn sử dụng trình điều khiển bạn gọi IoCreateDevice (Những mã kiểu thiết bị hệ tập tin gây quản lý I/O để sử dụng mã chức khác cho IRP) _Mã truy nhập (2 bít, đối số thứ tư tới CTL_CODE ) báo quyền lợi truy nhập ứng dụng cần tới thiết bị để phát hành thao tác điều khiển (phép toán kiểm tra) _Mã chức (12 bít, đối số thứ hai tới CTL_CODE) báo xác thao tác điều khiển (phép toán kiểm tra) mà điều viết mã mô tả Microsoft dự trữ nửa phạm vi trường này-điều đó, đánh giá từ đến 2047-cho tiêu chuẩn kiểm soát thao tác Bạn Tôi gán giá trị phạm vi từ 2048 đến 4095 Mục đích quy ước cho phép bạn định nghĩa thao tác điều khiển (phép toán kiểm tra) riêng tư cho thiết bị tiêu chuẩn _Phương pháp đệm (2 bít, đối sốthứ ba tới CTL_CODE) báo I/O Manager xử lý đầu vào đệm cung cấp ứng dụng Tôi có thoả thuận lớn để nói lĩnh vực mục tiếp theo, Tôi mô tả để thực IRP_MJ_DEVICE_CONTROL trình điều khiển 5/5 ... phụ thuộc vào mà thao tác điều khiển (phép toán kiểm 2/5 Hàm DeviceIoControl API (The DeviceIoControl API) tra) làm Giá trị trở lại từ DeviceIoControl giá trị Đại số Boole mà báo thành công (... junk; OVERLAPPED Overlapped; 3/5 Hàm DeviceIoControl API (The DeviceIoControl API) Overlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); DWORD code; if (DeviceIoControl( Handle, , &Overlapped)).. .Hàm DeviceIoControl API (The DeviceIoControl API) khiển thiết bị (Nghĩa là, liệu nhập vào từ phối cảnh (của) trình điều