基于 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。