I/O 控制代码简介

I/O 控制代码(IOCTLs)用于用户模式应用程序和驱动程序之间的通信,或用于在堆栈中的驱动程序内部通信。 I/O 控制代码是使用 IRP 发送的。

用户模式应用程序通过调用 DeviceIoControl(Microsoft Windows SDK 文档中所述)将 IOCTL 发送到驱动程序。 对 DeviceIoControl 的调用会导致 I/O 管理器创建 IRP_MJ_DEVICE_CONTROL 请求并将其发送到最顶层的驱动程序。

此外,高级驱动程序可以通过创建和发送 IRP_MJ_DEVICE_CONTROLIRP_MJ_INTERNAL_DEVICE_CONTROL 请求,将 IOCTL 发送到较低级别的驱动程序。 驱动程序在 DispatchDeviceControlDispatchInternalDeviceControl 例程中处理这些请求。 (用户模式应用程序无法发送 IRP_MJ_INTERNAL_DEVICE_CONTROL 请求。

某些 IOCTL 是公共的,有些是私有的。 公共 IOCTL 通常由 Microsoft 在 Windows 驱动程序工具包(WDK)或 Windows SDK 中由系统定义和记录。 它们可能会随着用户模式组件对 DeviceIoControl 的调用而被发送出去,也可能会通过 IRP_MJ_DEVICE_CONTROLIRP_MJ_INTERNAL_DEVICE_CONTROL 请求从一个内核模式驱动程序向另一个内核模式驱动程序发送。

另一方面,专用 IOCTL 则仅供供应商的软件组件用于相互通信。 专用 IOCTL 通常在供应商提供的头文件中定义,不会公开记录。 与公共 IOCTL 一样,它们可能通过用户模式组件调用 DeviceIoControl 来发送,或者可能通过 IRP_MJ_DEVICE_CONTROLIRP_MJ_INTERNAL_DEVICE_CONTROL 请求从一个内核模式驱动程序发送到另一个内核模式驱动程序。

公共和专用 IOCTL 的编码没有区别。 不过,与系统定义的 IOCTL 所使用的内部代码相比,供应商定义的 IOCTL 中可能使用的内部代码存在差异。 如果可用的公共 IOCTL 不符合你的需求,则可以定义软件组件可用于相互通信的新专用 IOCTL。 有关详细信息,请参阅 定义 I/O 控制代码