I/O 控制代码简介
I/O 控制代码 (IOCTL) 用于用户模式应用程序和驱动程序之间的通信,或堆栈中驱动程序之间的内部通信。 I/O 控制代码是使用 IRP 发送的。
用户模式应用程序通过调用 DeviceIoControl 将 IOCTL 发送到驱动程序,如Microsoft Windows SDK文档中所述。 调用 DeviceIoControl 会导致 I/O 管理器创建 IRP_MJ_DEVICE_CONTROL 请求并将其发送到最顶层的驱动程序。
此外,高级驱动程序可以通过创建和发送 IRP_MJ_DEVICE_CONTROL 或 IRP_MJ_INTERNAL_DEVICE_CONTROL 请求,将 IOCTL 发送到较低级别的驱动程序。 驱动程序在 DispatchDeviceControl 和 DispatchInternalDeviceControl 例程中处理这些请求。 (用户模式应用程序无法发送 IRP_MJ_INTERNAL_DEVICE_CONTROL requests。)
某些 IOCTL 是“公共的”,有些是“专用的”。 公共 IOCTL 通常由 Microsoft 在 Windows 驱动程序工具包 (WDK) 或 Windows SDK 中由系统定义和记录。 它们可能通过用户模式组件对 DeviceIoControl 的调用进行发送,也可能使用 IRP_MJ_DEVICE_CONTROL 或 IRP_MJ_INTERNAL_DEVICE_CONTROL 请求从一个内核模式驱动程序发送到另一个内核模式驱动程序。 公共 IOCTL 的示例包括 SCSI 端口 I/O 控制代码 和 I8042prt 鼠标内部设备控制请求。
另一方面,专用 IOCTL 旨在由供应商的软件组件专门用来相互通信。 专用 IOCTL 通常在供应商提供的头文件中定义,不会公开记录。 与公共 IOCTL 一样,它们可能通过用户模式组件对 DeviceIoControl 的调用进行发送,或者使用 IRP_MJ_DEVICE_CONTROL 或 IRP_MJ_INTERNAL_DEVICE_CONTROL 请求从一个内核模式驱动程序发送到另一个内核模式驱动程序。
公共和专用 IOCTL 的编码没有区别。 但是,在供应商定义的 IOCTL 中使用的内部代码与用于系统定义的 IOCTL 的内部代码存在差异。 如果可用的公共 IOCTL 不符合你的需求,你可以定义新的专用 IOCTL,软件组件可以使用这些专用 IOCTL 彼此通信。 有关详细信息,请参阅 定义 I/O 控制代码。