处理框架不支持的 IRP
[仅适用于 KMDF]
框架不支持具有以下主要 IRP 代码的 I/O 请求:
- IRP_MJ_CREATE_MAILSLOT
- IRP_MJ_CREATE_NAMED_PIPE
- IRP_MJ_DEVICE_CHANGE
- IRP_MJ_DIRECTORY_CONTROL
- IRP_MJ_FILE_SYSTEM_CONTROL
- IRP_MJ_FLUSH_BUFFERS
- IRP_MJ_LOCK_CONTROL
- IRP_MJ_QUERY_EA
- IRP_MJ_QUERY_INFORMATION
- IRP_MJ_QUERY_QUOTA
- IRP_MJ_QUERY_SECURITY
- IRP_MJ_QUERY_VOLUME_INFORMATION
- IRP_MJ_SET_EA
- IRP_MJ_SET_INFORMATION
- IRP_MJ_SET_QUOTA
- IRP_MJ_SET_SECURITY
- IRP_MJ_SET_VOLUME_INFORMATION
如果框架收到包含其中一个 I/O 函数代码的 IRP,则框架不会处理 IRP。 如果驱动程序是筛选器驱动程序,框架会将 IRP 传递给驱动程序堆栈中下一个较低的驱动程序。 如果驱动程序不是筛选器驱动程序,框架会调用 IoCompleteRequest 以完成状态值为 STATUS_INVALID_DEVICE_REQUEST 的 IRP。
如果驱动程序必须处理包含其中任何 I/O 函数代码的 IRP,则驱动程序必须调用 WdfDeviceInitAssignWdmIrpPreprocessCallback ,以便为 I/O 函数代码注册 EvtDeviceWdmIrpPreprocess 事件回调函数。
当驱动程序收到包含驱动程序为其注册 EvtDeviceWdmIrpPreprocess 回调函数的 I/O 函数代码的 IRP 时,框架会将 IRP 传递给回调函数。 然后,回调函数必须遵循 处理 IRP 的 WDM 规则来处理 IRP。 驱动程序必须调用 IoCompleteRequest 来完成 IRP,或者必须调用 IoCallDriver 才能将 IRP 传递给下一个较低的驱动程序。
有关处理框架不支持的 IRP 的 EvtDeviceWdmIrpPreprocess 回调 函数的示例,请参阅 串行 示例驱动程序。