Подпрограммы DispatchDeviceControl и DispatchInternalDeviceControl

Подпрограммы диспетчеризации драйвера (см . DRIVER_DISPATCH) обрабатывают irp с кодами функций ввода-вывода IRP_MJ_DEVICE_CONTROL и IRP_MJ_INTERNAL_DEVICE_CONTROL соответственно.

Для каждого общего типа периферийного устройства система определяет набор кодов управления вводом-выводом для запросов IRP_MJ_DEVICE_CONTROL . Новые драйверы для каждого типа устройства должны поддерживать эти запросы. В большинстве случаев эти коды управления общедоступным вводом-выводом для каждого типа устройства не экспортируются в приложения пользовательского режима.

Некоторые из этих системных кодов управления вводом-выводом используются драйверами более высокого уровня, которые создают IRP для базового драйвера устройства путем вызова IoBuildDeviceIoControlRequest. Другие используются компонентами Win32 для взаимодействия с базовым драйвером устройства путем вызова функции Win32 DeviceIoControl (описано в документации по Microsoft Windows SDK), которая, в свою очередь, вызывает системную службу. Диспетчер ввода-вывода настраивает IRP и сохраняет код основной функции IRP_MJ_DEVICE_CONTROL и заданный код элемента управления вводом-выводом в структуре IO_STACK_LOCATIONв Parameters.DeviceIoControl.IoControlCode. Затем диспетчер ввода-вывода вызывает подпрограмму DispatchDeviceControl драйвера самого высокого уровня в цепочке.

Для некоторых системных драйверов, предназначенных для взаимодействия и поддержки новых драйверов, операционная система также определяет набор кодов управления вводом-выводом для IRP_MJ_INTERNAL_DEVICE_CONTROL запросов. В большинстве случаев эти коды управления общедоступным вводом-выводом позволяют драйверам надстройки более высокого уровня взаимодействовать с базовым драйвером устройства.

Например, предоставляемые системой параллельные драйверы поддерживают набор внутренних кодов управления вводом-выводом, которые предоставляемые поставщиком драйверы отправляют в IRP_MJ_INTERNAL_DEVICE_CONTROL запросах. Дополнительные сведения см. в разделах Внутренние запросы управления устройствами для параллельных портов и Внутренние запросы на управление устройствами для параллельных устройств.

Почти все операции, запрашиваемые с помощью системных кодов управления вводом-выводом, используют буферизированные операции ввода-вывода, так как такой тип запроса редко требует передачи больших объемов данных. Это значит, что даже драйверы, которые настраивают объекты устройства для прямого ввода-вывода, отправляются irp для запросов управления устройствами с данными, передаваемыми в буфер irp-AssociatedIrp.SystemBuffer> или из него (за исключением некоторых типов драйверов устройств самого высокого уровня с тесно связанными мультимедийными драйверами Win32).

Кроме того, драйвер может определить набор частных кодов управления вводом-выводом, которые другие драйверы могут использовать для взаимодействия с ним. Новые коды управления общедоступным вводом-выводом можно добавить в систему только в сотрудничестве с корпорацией Майкрософт, так как коды управления общедоступным вводом-выводом встроены в саму операционную систему.

Конкретные сведения о наборе кодов управления общедоступным вводом-выводом, которые должны поддерживаться различными типами драйверов, и об определении кодов управления частным вводом-выводом см. в разделах справки для конкретных устройств в комплекте драйверов Windows (WDK).