WDM IRP 和 WDF 事件回调函数

Kernel-Mode Driver Framework (KMDF) 和 User-Mode Driver Framework (UMDF) 支持一部分 Windows IRP。 下表列出了主要的 WDM IRP 类型和相应的框架事件回调函数。 除非另有指定,否则回调同时应用于 KMDF 和 UMDF。

主要 IRP 代码 WDF 事件回调函数
IRP_MJ_CLEANUP EvtFileCleanup
IRP_MJ_CLOSE EvtFileClose
IRP_MJ_CREATE EvtDeviceFileCreateEvtIoDefault
IRP_MJ_CREATE_MAILSLOT 无直接支持; 仅实现 EvtDeviceWdmIrpPreprocess (KMDF)
IRP_MJ_DEVICE_CHANGE 无直接支持; 仅实现 EvtDeviceWdmIrpPreprocess (KMDF)
IRP_MJ_DEVICE_CONTROL EvtIoDeviceControlEvtIoDefault
IRP_MJ_DIRECTORY_CONTROL 无直接支持; 仅实现 EvtDeviceWdmIrpPreprocess (KMDF)
IRP_MJ_FILE_SYSTEM_CONTROL 无直接支持; 仅实现 EvtDeviceWdmIrpPreprocess (KMDF)
IRP_MJ_FLUSH_BUFFERS 无直接支持; 仅实现 EvtDeviceWdmIrpPreprocess (KMDF)
IRP_MJ_INTERNAL_DEVICE_CONTROL EvtIoInternalDeviceControlEvtIoDefault
IRP_MJ_LOCK_CONTROL 无直接支持; 仅实现 EvtDeviceWdmIrpPreprocess (KMDF)
IRP_MJ_PNP 许多;有关 IRP_MJ_PNP,请参阅 KMDF 回调
IRP_MJ_POWER 许多;有关 IRP_MJ_POWER,请参阅 KMDF 回调
IRP_MJ_QUERY_EA 无直接支持; 仅实现 EvtDeviceWdmIrpPreprocess (KMDF)
IRP_MJ_QUERY_INFORMATION 无直接支持; 仅实现 EvtDeviceWdmIrpPreprocess (KMDF)
IRP_MJ_QUERY_QUOTA 无直接支持; 仅实现 EvtDeviceWdmIrpPreprocess (KMDF)
IRP_MJ_QUERY_SECURITY 无直接支持; 仅实现 EvtDeviceWdmIrpPreprocess (KMDF)
IRP_MJ_QUERY_VOLUME_INFORMATION 无直接支持; 仅实现 EvtDeviceWdmIrpPreprocess (KMDF)
IRP_MJ_READ EvtIoReadEvtIoDefault
IRP_MJ_SET_EA 无直接支持; 仅实现 EvtDeviceWdmIrpPreprocess (KMDF)
IRP_MJ_SET_INFORMATION 无直接支持; 仅实现 EvtDeviceWdmIrpPreprocess (KMDF)
IRP_MJ_SET_QUOTA 无直接支持; 仅实现 EvtDeviceWdmIrpPreprocess (KMDF)
IRP_MJ_SET_SECURITY 无直接支持; 仅实现 EvtDeviceWdmIrpPreprocess (KMDF)
IRP_MJ_SET_VOLUME_INFORMATION 无直接支持; 仅实现 EvtDeviceWdmIrpPreprocess (KMDF)
IRP_MJ_SHUTDOWN

对于控制设备对象, 仅) 实现 EvtDeviceShutdownNotification (KMDF

对于所有即插即用设备对象:不支持;仅) 实现 EVtDeviceWdmIrpPreprocess (KMDF

IRP_MJ_SYSTEM_CONTROL 创建 WDFWMIPROVIDER 和 WDFWMIINSTANCE 对象,并 仅) 回调实现 EvtWmiXxx (KMDF
IRP_MJ_WRITE EvtIoWriteEvtIoDefault

IRP_MJ_PNP的 KMDF 回调

下表按执行顺序列出了对应于 IRP_MJ_PNP的次要 IRP 代码的 KMDF 回调。 箭头指示 WDM FDO 在堆栈中上下移动时是处理 IRP。

注意在 KMDF 驱动程序中,即插即用和电源管理是集成操作,驱动程序不会接收单个次要IRP_MJ_PNPIRP_MJ_POWER请求。 相反,框架在通电时调用一组核心回调,在关机时调用相应的回调集,并根据需要为每个单独的即插即用请求调用此核心集之前和之后的其他回调。 有关显示开机和关机序列的综合关系图,请参阅 移植 PnP 和电源管理功能

IRP_MJ_PNP次要代码 KMDF 回调
о IRP_MN_CANCEL_REMOVE_DEVICE
·IRP_MN_CANCEL_STOP_DEVICE
IRP_MN_DEVICE_USAGE_NOTIFICATION EvtDeviceUsageNotification
·IRP_MN_EJECT EvtDeviceEject 仅 (KMDF)
IRP_MN_FILTER_RESOURCE_REQUIREMENTS EvtDeviceFilterRemoveResourceRequirements 仅 (KMDF)
IRP_MN_FILTER_RESOURCE_REQUIREMENTS EvtDeviceFilterAddResourceRequirements 仅 (KMDF)
IRP_MN_QUERY_BUS_INFORMATION 无。 KMDF 驱动程序调用 WdfDeviceInitXxx 方法在初始化期间设置设备属性,以便框架可以自行响应此查询,而无需通知驱动程序。
IRP_MN_QUERY_CAPABILITIES 无。 KMDF 驱动程序调用 WdfDeviceInitXxx 方法在初始化期间设置设备属性,以便框架可以自行响应此查询,而无需通知驱动程序。
·IRP_MN_QUERY_DEVICE_RELATIONS (总线、拆除和弹出关系) EvtDeviceRelationsQuery
IRP_MN_QUERY_DEVICE_TEXT 无。 KMDF 驱动程序调用 WdfDeviceInitXxx 方法在初始化期间设置设备属性,以便框架可以自行响应此查询,而无需通知驱动程序。
IRP_MN_QUERY_ID 无。 KMDF 驱动程序调用 WdfDeviceInitXxx 方法在初始化期间设置设备属性,以便框架可以自行响应此查询,而无需通知驱动程序。
IRP_MN_QUERY_INTERFACE EvtDeviceProcessQueryInterfaceRequest (KMDF 仅)
IRP_MN_QUERY_PNP_DEVICE_STATE 无。 KMDF 驱动程序调用 WdfDeviceInitXxx 方法在初始化期间设置设备属性,以便框架可以自行响应此查询,而无需通知驱动程序。
·IRP_MN_QUERY_REMOVE_DEVICE EvtDeviceQueryRemove
о IRP_MN_QUERY_RESOURCE_REQUIREMENTS EvtDeviceResourceRequirementsQuery 仅 (KMDF)
о IRP_MN_QUERY_RESOURCES EvtDeviceResourcesQuery 仅 (KMDF)
·IRP_MN_QUERY_STOP_DEVICE EvtDeviceQueryStop
IRP_MN_READ_CONFIG 无。 KMDF 驱动程序调用 WdfDeviceInitXxx 方法在初始化期间设置设备属性,以便框架可以自行响应此查询,而无需通知驱动程序。
IRP_MN_REMOVE_DEVICE

IRP_MN_QUERY_REMOVE_DEVICE后:

EvtDeviceSelfManagedIoSuspendEvtIoStop (WdfRequestStopActionSuspend flag) EvtDmaEnablerSelfManagedIoStop (KMDF only) EvtDmaEnablerDisable (KMDF only) EvtDmaEnablerFlush (KMDF 仅) EvtDeviceD0ExitPreInterruptsDisabledEvtInterruptDisableEvtDeviceD0Exit (WdfPowerDeviceD3Final 状态) EvtDeviceReleaseHardwareEvtIoStop (电源管理队列的 WdfRequestStopActionPurge 标志) EvtDeviceSelfManagedIoFlushEvtIoStop (WdfRequestStopActionPurge 标志) 非电源托管队列 EvtDeviceSelfManagedIoCleanupEvtCleanupCallback for WDFDEVICE EvtDestroyCallback

IRP_MN_SURPRISE_REMOVAL后:

EvtIoStop (WdfRequestStopActionPurge 标志) 非电源托管队列 EvtDeviceSelfManagedIoCleanupEvtCleanup EvtCleanupCallback for WDFDEVICE EvtDestroyCallback
IRP_MN_SET_LOCK EvtDeviceSetLock 仅 (KMDF)
IRP_MN_START_DEVICE

枚举后:

EvtDeviceRemoveAddedResources (KMDF 仅) EvtDevicePrepareHardwareEvtDeviceD0EntryEvtInterruptEnableEvtDeviceD0EntryPostInterruptsEnabledEvtDmaEnablerFill (KMDF only) EvtDmaEnablerEnable (KMDF only) EvtDmaEnablerSelfManagedIoStart (KMDF only) EvtDeviceSelfManagedIoInit

IRP_MN_STOP_DEVICE后:

EvtDeviceRemoveAddedResources (KMDF 仅) EvtDevicePrepareHardwareEvtDeviceD0EntryEvtInterruptEnableEvtDeviceD0EntryPostInterruptsEnabledEvtDmaEnabler 仅) EvtDmaEnablerEnable (KMDF (仅) EvtDmaEnablerSelfManagedIoStart (KMDF 仅) EvtIoResumeEvtDeviceSelfManagedIoRestart
IRP_MN_STOP_DEVICE EvtDeviceSelfManagedIoSuspendEvtIoStop (WdfRequestStopActionSuspend flag) EvtDmaEnablerSelfManagedIoStop (KMDF only) EvtDmaEnablerDisable (KMDF only) EvtDmaEnablerFlush (KMDF 仅) EvtDeviceD0ExitPreInterruptsDisabledEvtInterruptDisableEvtDeviceD0Exit (WdfPowerDeviceD3Final 状态) EvtDeviceReleaseHardware
о IRP_MN_SURPRISE_REMOVAL EvtDeviceSurpriseRemovalEvtDeviceSelfManagedIoSuspendEvtIoStop (WdfRequestStopActionSuspend 标志) EvtDmaEnablerSelfManagedIoStop (KMDF 仅) EvtDmaEnablerDisable (仅 KMDF) EvtDmaEnablerFlush (KMDF 仅) EvtDeviceD0ExitPreInterruptsDisabledEvtInterruptDisableEvtDeviceD0Exit (WdfPowerDeviceD3Final 状态) EvtDeviceReleaseHardwarePower-managed queuesEvtDeviceSelfManagedIoFlush 的 EvtIoStop (WdfRequestStopActionPurge 标志)
IRP_MN_WRITE_CONFIG 无。 KMDF 驱动程序调用 WdfDeviceInitXxx 方法在初始化期间设置设备属性,以便框架可以自行响应此查询,而无需通知驱动程序。

IRP_MJ_POWER的 KMDF 回调

下表按执行顺序列出了对应于 IRP_MJ_POWER的次要 IRP 代码的 KMDF 回调。 箭头指示 WDM FDO 在堆栈中上下移动时是处理 IRP。

注意注意:在 KMDF 驱动程序中,即插即用和电源管理是集成操作,驱动程序不会接收单个次要IRP_MJ_PNPIRP_MJ_POWER请求。 相反,框架在通电时调用一组核心回调,在关机时调用相应的回调集,并根据需要为每个单独的即插即用请求调用此核心集之前和之后的其他回调。 有关显示开机和关机序列的综合关系图,请参阅 移植 PnP 和电源管理功能

IRP_MJ_POWER次要代码 框架回调
D1、D2 或 D3 (关机) IRP_MN_SET_POWER EvtDeviceSelfManagedIoSuspendEvtIoStop (WdfRequestStopActionSuspend 标志) EvtDeviceArmWakeFromS0EvtDeviceArmWakeFromSxEvtDmaEnablerSelfManagedIoStop (仅 KMDF) EvtDmaEnablerDisable (KMDF 仅) EvtDmaEnablerFlush (KMDF 仅) EvtDeviceD0ExitPreInterruptsDisabledEvtInterruptDisableEvtDeviceD0Exit
•D0 ( 通电) IRP_MN_SET_POWER EvtDeviceD0EntryEvtInterruptEnableEvtDeviceD0EntryPostInterruptsEnabledEvtDmaEnablerFill (KMDF only) EvtDmaEnablerEnable (KMDF 仅) EvtDmaEnablerSelfManagedIoStart (KMDF 仅) EvtDeviceSelfManagedIoRestart
Sx 的 IRP_MN_SET_POWER
Sx 的 IRP_MN_SET_POWER
IRP_MN_POWER_SEQUENCE
о IRP_MN_WAIT_WAKE EvtDeviceEnableWakeAtBus (KMDF 仅)
IRP_MN_WAIT_WAKE EvtDeviceDisableWakeAtBus (KMDF 仅)