IRP 主要函数代码

每个 IRP 的每个特定于驱动程序的 I/O 堆栈位置 (IO_STACK_LOCATION) 都包含一个主要函数代码 (IRP_MJ_XXX) ,该代码告知驱动程序它或基础设备驱动程序应执行哪些操作来满足 I/O 请求。 每个内核模式驱动程序必须为它必须支持的主要函数代码提供调度例程。

驱动程序对给定 IRP_MJ_XXX 代码执行的特定操作在某种程度上取决于基础设备,尤其是 对于IRP_MJ_DEVICE_CONTROLIRP_MJ_INTERNAL_DEVICE_CONTROL 请求。 例如,发送到键盘驱动程序的请求必然与发送到磁盘驱动程序的请求略有不同。 但是,I/O 管理器为每个系统定义的主要函数代码定义参数和 I/O 堆栈位置内容。

每个较高级别的驱动程序必须在 IRP 中为下一个较低级别的驱动程序设置适当的 I/O 堆栈位置,并使用每个输入 IRP 调用 IoCallDriver,或者调用驱动程序创建的 IRP ((如果较高级别的驱动程序保留输入 IRP) )。 因此,每个中间驱动程序必须为基础设备驱动程序处理的每个主要函数代码提供调度例程。 否则,每当应用程序或更高级别的驱动程序尝试将 I/O 请求向下发送到基础设备驱动程序时,新的中间驱动程序就会“中断链”。

文件系统驱动程序和旧文件系统筛选器驱动程序还处理系统定义的 IRP_MJ_XXX 函数代码的必需子集,其中一些代码具有从属 IRP_MN_XXX 函数代码。 有关如何处理这些 IRP 的详细信息,请参阅 文件系统驱动程序和旧版 FS 筛选器驱动程序的 IRP 主要功能代码

驱动程序处理使用以下部分或全部主要函数代码设置的 IRP:

IRP_MJ_CLEANUP

IRP_MJ_CLOSE

IRP_MJ_CREATE

IRP_MJ_DEVICE_CONTROL

IRP_MJ_FILE_SYSTEM_CONTROL

IRP_MJ_FLUSH_BUFFERS

IRP_MJ_INTERNAL_DEVICE_CONTROL

IRP_MJ_PNP

IRP_MJ_POWER

IRP_MJ_QUERY_INFORMATION

IRP_MJ_READ

IRP_MJ_SET_INFORMATION

IRP_MJ_SHUTDOWN

IRP_MJ_SYSTEM_CONTROL

IRP_MJ_WRITE

本部分所述的输入和输出参数是 IRP 中特定于函数的参数。

有关 IRP 的详细信息,请参阅 处理 IRP