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

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

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

Кроме того, драйверы верхнего уровня могут отправлять запросы IOCTL к драйверам более низкого уровня путем создания и отправки запросов IRP_MJ_DEVICE_CONTROL или IRP_MJ_INTERNAL_DEVICE_CONTROL . Драйверы обрабатывают эти запросы в поддиспатчдевицеконтрол и процедурах диспатчинтерналдевицеконтрол . (Приложения пользовательского режима не могут отправить запросы 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 не соответствуют вашим потребностям, можно определить новые частные запросы IOCTL, которые могут использоваться компонентами программного обеспечения для взаимодействия друг с другом. Дополнительные сведения см. в разделе Определение управляющих кодов ввода-вывода.