DispatchDeviceControl 和 DispatchInternalDeviceControl 例程

驱动程序的调度例程 (查看 DRIVER_DISPATCH) 处理 I/O 函数代码分别为 IRP_MJ_DEVICE_CONTROLIRP_MJ_INTERNAL_DEVICE_CONTROL 的 I/O。

对于每种常见类型的外围设备,系统都会为 IRP_MJ_DEVICE_CONTROL 请求定义一组 I/O 控制代码。 每种类型的设备的新驱动程序必须支持这些请求。 在大多数情况下,每种类型的设备的这些公共 I/O 控制代码不会导出到用户模式应用程序。

其中一些系统定义的 I/O 控制代码由更高级别的驱动程序使用,这些驱动程序通过调用 IoBuildDeviceIoControlRequest 为基础设备驱动程序创建 IRP。 Win32 组件使用其他组件通过调用 win32 函数 DeviceIoControl (与基础设备驱动程序进行通信,Microsoft Windows SDK文档) 后者又调用系统服务。 I/O 管理器设置 IRP,并将主要函数代码IRP_MJ_DEVICE_CONTROL和给定的 I/O 控制代码存储在 Parameters.DeviceIoControl.IoControlCode的IO_STACK_LOCATION结构中。 然后,I/O 管理器调用链中最高级别驱动程序的 DispatchDeviceControl 例程。

对于某些旨在与新驱动程序互操作和支持新驱动程序的系统提供的驱动程序,操作系统还为 IRP_MJ_INTERNAL_DEVICE_CONTROL 请求定义了一组 I/O 控制代码。 在大多数情况下,这些公共 I/O 控制代码允许更高级别的加载项驱动程序与基础设备驱动程序互操作。

例如,系统提供的并行驱动程序支持供应商提供的驱动程序在 IRP_MJ_INTERNAL_DEVICE_CONTROL 请求中发送的一组内部 I/O 控制代码。 有关详细信息,请参阅 并行端口的内部设备控制请求并行设备的内部设备控制请求

几乎所有通过系统定义的 I/O 控制代码请求的操作都使用缓冲 I/O,因为这种类型的请求很少需要传输大量数据。 也就是说,即使是为直接 I/O 设置设备对象的驱动程序,也会向设备控制请求发送 IRP,并将数据传入或传出 Irp-AssociatedIrp.SystemBuffer> (,但某些类型具有紧密耦合 Win32 多媒体驱动程序) 的最高级别设备驱动程序除外。

此外,驱动程序可以定义一组专用 I/O 控制代码,其他驱动程序可以使用这些代码与之通信。 只有与 Microsoft Corporation 合作,才能将新的公共 I/O 控制代码添加到系统中,因为公共 I/O 控制代码内置于操作系统本身中。

有关不同类型的驱动程序必须支持的公共 I/O 控制代码集以及定义专用 I/O 控制代码的特定信息,请参阅 Windows 驱动程序工具包 (WDK) 的设备特定参考部分。