Введение в коды элементов управления вводом-выводом

Коды управления вводом-выводом (IOCTL) используются для взаимодействия между приложениями пользовательского режима и драйверами или для внутреннего взаимодействия между драйверами в стеке. Коды управления вводом-выводом отправляются с помощью IRP.

Приложения в пользовательском режиме отправляют ioCTL драйверам, вызывая DeviceIoControl, как описано в Microsoft Windows SDK документации. Вызовы DeviceIoControl приводят к тому, что диспетчер ввода-вывода создает запрос IRP_MJ_DEVICE_CONTROL и отправляет его самому верхнему драйверу.

Кроме того, драйверы верхнего уровня могут отправлять ioCTL драйверам нижнего уровня, создавая и отправляя IRP_MJ_DEVICE_CONTROL или IRP_MJ_INTERNAL_DEVICE_CONTROL запросы. Драйверы обрабатывают эти запросы в подпрограммах DispatchDeviceControl и DispatchInternalDeviceControl . (Приложения в пользовательском режиме не могут отправлять запросы IRP_MJ_INTERNAL_DEVICE_CONTROL .)

Некоторые ioCTL являются общедоступными, а некоторые — частными. Общедоступные ioCTL обычно определяются системой и документируются корпорацией Майкрософт в комплекте драйверов Windows (WDK) или Windows SDK. Они могут быть отправлены с помощью вызовов компонента пользовательского режима к DeviceIoControl или от одного драйвера режима ядра к другому с помощью IRP_MJ_DEVICE_CONTROL или IRP_MJ_INTERNAL_DEVICE_CONTROL запросов. Примеры общедоступных ioCTL включают коды управления вводом-выводом порта SCSI и внутренние запросы управления устройствами мыши I8042prt.

Частные ioCTL, с другой стороны, предназначены для использования исключительно программными компонентами поставщика для взаимодействия друг с другом. Частные ioCTL обычно определяются в файле заголовка, предоставленном поставщиком, и они не являются общедоступными. Как и общедоступные ioCTL, они могут отправляться с помощью вызовов компонента пользовательского режима к DeviceIoControl или от одного драйвера режима ядра к другому с помощью IRP_MJ_DEVICE_CONTROL или IRP_MJ_INTERNAL_DEVICE_CONTROL запросов.

Между написанием общедоступных и частных IOCTL нет никакой разницы. Однако существуют различия во внутренних кодах, которые можно использовать в определяемых поставщиком IOCTL, по сравнению с кодами, которые используются для определяемых системой ioCTL. Если доступные общедоступные ioCTL не соответствуют вашим потребностям, можно определить новые частные ICTL, которые могут использоваться программными компонентами для взаимодействия друг с другом. Дополнительные сведения см. в разделе Определение кодов управления вводом-выводом.