驱动程序的调度例程(参见 DRIVER_DISPATCH)分别处理带有 IRP_MJ_DEVICE_CONTROL 和 IRP_MJ_INTERNAL_DEVICE_CONTROL I/O 函数代码的 IRP。
对于每种常见类型的外围设备,系统为 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.IoControlCodeIO_STACK_LOCATION结构中。 然后,I/O 管理器调用链中最高级别的驱动程序的 DispatchDeviceControl 例程。
对于某些旨在与新驱动程序互作和支持新驱动程序的系统提供的驱动程序,作系统还定义了一组 I/O 控制代码,用于 IRP_MJ_INTERNAL_DEVICE_CONTROL 请求。 在大多数情况下,这些公共 I/O 控制代码允许加载项更高级别驱动程序与基础设备驱动程序进行互作。
例如,系统提供的并行驱动程序支持供应商提供的驱动程序在 IRP_MJ_INTERNAL_DEVICE_CONTROL 请求中发送的一组内部 I/O 控制代码。 有关详细信息,请参阅 并行设备驱动程序设计指南。
几乎所有通过系统定义的 I/O 控制代码请求的作都使用缓冲 I/O,因为这种类型的请求很少需要传输大量数据。 也就是说,即使是为直接 I/O 设置其设备对象的驱动程序,也会收到 IRP,用于设备控制请求,将数据传输到或从 Irp-AssociatedIrp.SystemBuffer> 缓冲区传出(某些与 Win32 多媒体驱动程序紧密耦合的顶级设备驱动程序除外)。
此外,驱动程序还可以定义一组专用 I/O 控制代码,其他驱动程序可以使用这些代码与之通信。 新的公共 I/O 控制代码只能与 Microsoft Corporation 的合作添加到系统中,因为公共 I/O 控制代码内置于作系统本身中。
有关不同类型的驱动程序必须支持的公共 I/O 控制代码集以及定义专用 I/O 控制代码的特定信息,请参阅 Windows 驱动程序工具包(WDK)的设备特定参考部分。