基于 IRP 的 IOCTL 和 FSCTL 操作

以下基于 IRP 的 I/O 操作使用与 IOCTL 控制代码的定义中指定的传输类型匹配的缓冲方法 (IOCTL) 或文件系统控制代码 (FSCTL) :

  • IRP_MJ_DEVICE_CONTROL

  • IRP_MJ_FILE_SYSTEM_CONTROL

  • IRP_MJ_INTERNAL_DEVICE_CONTROL

传输类型在 CTL_CODE 宏的 TransferType 参数中指定。 若要获取给定 IOCTL 或 FSCTL 的传输类型,请使用以下宏:

#define METHOD_FROM_CTL_CODE(ctrlCode)         ((ULONG)(ctrlCode & 3))

此宏返回以下值之一:

#define METHOD_BUFFERED                 0
#define METHOD_IN_DIRECT                1
#define METHOD_OUT_DIRECT               2
#define METHOD_NEITHER                  3

有关CTL_CODE宏的详细信息,请参阅 定义 I/O 控制代码

请注意,IRP_MJ_DEVICE_CONTROL也可以是快速 I/O 操作。 当它是快速 I/O 操作时,无论 IOCTL 的传输类型如何,它始终既不使用缓冲 I/O,也不使用直接 I/O。 有关IRP_MJ_DEVICE_CONTROL何时可以是快速 I/O 操作的详细信息,请参阅 可IRP-Based的操作或快速 I/O