WDM IRP 和 WDF 事件回调函数

Kernel-Mode 驱动程序框架(KMDF)和 User-Mode 驱动程序框架(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 在堆栈中向上或向下移动时是否处理该 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后:

EvtDeviceSelfManagedIoSuspendEvtIoStopWdfRequestStopActionSuspend 标志)EvtDmaEnablerSelfManagedIoStop (仅 KMDF)EvtDmaEnablerDisable (仅 KMDF)EvtDmaEnablerFlush (仅 KMDF)EvtDeviceD0ExitPreInterruptsDisabledEvtInterruptDisableEvtDeviceD0ExitWdfPowerDeviceD3Final 状态)EvtDeviceReleaseHardwareEvtIoStopWdfRequestStopActionPurge 标志)用于电源管理的队列 EvtDeviceSelfManagedIoFlushEvtIoStopWdfRequestStopActionPurge 标志)用于非电源管理的队列 EvtDeviceSelfManagedIoCleanupEvtCleanupCallback 用于 WDFDEVICE 的 EvtDestroyCallback 用于 WDFDEVICE 的

IRP_MN_SURPRISE_REMOVAL后:

EvtIoStopWdfRequestStopActionPurge 标志)用于非电源托管队列 EvtDeviceSelfManagedIoCleanupEvtCleanupCallback 用于 WDFDEVICE EvtDestroyCallback 用于 WDFDEVICE
IRP_MN_SET_LOCK EvtDeviceSetLock (仅 KMDF)
IRP_MN_START_DEVICE

枚举后:

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

IRP_MN_STOP_DEVICE后:

EvtDeviceRemoveAddedResources (仅 KMDF)EvtDevicePrepareHardwareEvtDeviceD0EntryEvtInterruptEnableEvtDeviceD0EntryPostInterruptsEnabledEvtDmaEnablerFill (仅 KMDF)EvtDmaEnablerEnable (仅 KMDF)EvtDmaEnablerSelfManagedIoStart (仅 KMDF)EvtIoResumeEvtDeviceSelfManagedIoRestart
IRP_MN_STOP_DEVICE EvtDeviceSelfManagedIoSuspendEvtIoStopWdfRequestStopActionSuspend 标志) EvtDmaEnablerSelfManagedIoStop (仅限 KMDF)EvtDmaEnablerDisable (仅限 KMDF)EvtDmaEnablerFlush (仅限 KMDF)EvtDeviceD0ExitPreInterruptsDisabledEvtInterruptDisableEvtDeviceD0ExitWdfPowerDeviceD3Final 状态) EvtDeviceReleaseHardware
IRP_MN_SURPRISE_REMOVAL EvtDeviceSurpriseRemovalEvtDeviceSelfManagedIoSuspendEvtIoStopWdfRequestStopActionSuspend 标志) EvtDmaEnablerSelfManagedIoStop (仅 KMDF)EvtDmaEnablerDisable (仅 KMDF)EvtDmaEnablerFlush (仅 KMDF)EvtDeviceD0ExitPreInterruptsDisabledEvtInterruptDisableEvtDeviceD0ExitWdfPowerDeviceD3Final 状态) EvtDeviceReleaseHardwareEvtIoStopWdfRequestStopActionPurge 标志) 用于电源管理的队列 EvtDeviceSelfManagedIoFlush
IRP_MN_WRITE_CONFIG 没有。 KMDF 驱动程序调用 WdfDeviceInitXxx 方法在初始化期间设置设备属性,以便框架可以自行响应此查询,而无需通知驱动程序。

KMDF 对于 IRP_MJ_POWER 的回调

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

注意 注意:在 KMDF 驱动程序中,即插即用和电源管理是集成作,驱动程序不会收到单个次要 IRP_MJ_PNPIRP_MJ_POWER 请求。 相反,该框架会在启动电源时调用一组核心回调,并在关闭电源时调用相应的一组回调,还会根据每个即插即用请求的需要,在这些核心回调之前和之后调用附加的回调。 有关显示启动和关机序列的完整图表,请参阅移植 PnP 和电源管理功能

IRP_MJ_POWER 次要代码 框架回调
IRP_MN_SET_POWER 对于 D1、D2 或 D3(降低电源状态) EvtDeviceSelfManagedIoSuspendEvtIoStopWdfRequestStopActionSuspend flag) EvtDeviceArmWakeFromS0EvtDeviceArmWakeFromSxEvtDmaEnablerSelfManagedIoStop (仅 KMDF)EvtDmaEnablerDisable (仅 KMDF)EvtDmaEnablerFlush (仅 KMDF)EvtDeviceD0ExitPreInterruptsDisabledEvtInterruptDisableEvtDeviceD0Exit
IRP_MN_SET_POWER D0(电源上电) EvtDeviceD0EntryEvtInterruptEnableEvtDeviceD0EntryPostInterruptsEnabledEvtDmaEnablerFill (仅 KMDF)EvtDmaEnablerEnable (仅 KMDF)EvtDmaEnablerSelfManagedIoStart (仅 KMDF)EvtIoResumeEvtDeviceSelfManagedIoRestart
IRP_MN_SET_POWER 适用于 Sx 没有
IRP_MN_SET_POWER 适用于 Sx 没有
IRP_MN_POWER_SEQUENCE 没有
IRP_MN_WAIT_WAKE EvtDeviceEnableWakeAtBus (仅 KMDF)
IRP_MN_WAIT_WAKE EvtDeviceDisableWakeAtBus (仅 KMDF)