Поделиться через


WDM IRP и функции обратного вызова событий WDF

Kernel-Mode Driver Framework (KMDF) и User-Mode Driver Framework (UMDF) поддерживают подмножество irp Windows. В следующей таблице перечислены основные типы WDM IRP и соответствующие функции обратного вызова событий платформы. Если не указано иное, обратные вызовы применяются как к KMDF, так и к UMDF.

Основной код IRP Функция обратного вызова событий WDF
IRP_MJ_CLEANUP EvtFileCleanup
IRP_MJ_CLOSE EvtFileClose
IRP_MJ_CREATE EvtDeviceFileCreate или EvtIoDefault
IRP_MJ_CREATE_MAILSLOT Нет прямой поддержки; реализация EvtDeviceWdmIrpPreprocess (только KMDF)
IRP_MJ_DEVICE_CHANGE Нет прямой поддержки; реализация EvtDeviceWdmIrpPreprocess (только KMDF)
IRP_MJ_DEVICE_CONTROL EvtIoDeviceControl или EvtIoDefault
IRP_MJ_DIRECTORY_CONTROL Нет прямой поддержки; реализация EvtDeviceWdmIrpPreprocess (только KMDF)
IRP_MJ_FILE_SYSTEM_CONTROL Нет прямой поддержки; реализация EvtDeviceWdmIrpPreprocess (только KMDF)
IRP_MJ_FLUSH_BUFFERS Нет прямой поддержки; реализация EvtDeviceWdmIrpPreprocess (только KMDF)
IRP_MJ_INTERNAL_DEVICE_CONTROL EvtIoInternalDeviceControl или EvtIoDefault
IRP_MJ_LOCK_CONTROL Нет прямой поддержки; реализация EvtDeviceWdmIrpPreprocess (только KMDF)
IRP_MJ_PNP Много; См. раздел Обратные вызовы KMDF для IRP_MJ_PNP.
IRP_MJ_POWER Много; См. раздел Обратные вызовы KMDF для IRP_MJ_POWER.
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 EvtIoRead или EvtIoDefault
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)

Для всех Plug and Play объектов устройств: не поддерживается; реализуйте EvtDeviceWdmIrpPreprocess (только KMDF).

IRP_MJ_SYSTEM_CONTROL Создайте объекты WDFWMIPROVIDER и WDFWMIINSTANCE и реализуйте обратные вызовы EvtWmiXxx (только KMDF ).
IRP_MJ_WRITE EvtIoWrite или EvtIoDefault

Обратные вызовы KMDF для IRP_MJ_PNP

В следующей таблице в порядке выполнения перечислены обратные вызовы KMDF, соответствующие незначительным кодам IRP для IRP_MJ_PNP. Стрелки указывают, обрабатывает ли WDM FDO IRP при перемещении вверх или вниз по стеку.

Примечание В драйвере KMDF Plug and Play и управление питанием являются интегрированными операциями, и драйвер не получает отдельные незначительные запросы IRP_MJ_PNP или IRP_MJ_POWER. Вместо этого платформа вызывает основной набор обратных вызовов при выключении питания и соответствующий набор при выключении питания, а также вызывает дополнительные обратные вызовы до и после этого набора ядер в соответствии с каждым отдельным запросом Plug and Play. Подробные схемы, показывающие последовательности включения и выключения питания, см. в разделе Перенос 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 ) EvtDmaEnablerSelfManagedIoStop (только KMDF)EvtDmaEnablerDisable (только KMDF)EvtDmaEnablerFlush (только KMDF)EvtDeviceD0ExitPreInterruptsDisabledEvtInterruptDisableEvtDeviceD0Exit (WdfPowerDeviceD3Final state) EvtDeviceReleaseHardwareEvtIoStop ( Флаг WdfRequestStopActionPurge ) для управляемых питанием очередей EvtDeviceSelfManagedIoFlushEvtIoStop (флаг WdfRequestStopActionPurge ) для очередей, не управляемых питанием EvtDeviceSelfManagedIoCleanupEvtCleanupCallback для WDFDEVICE EvtDegradCallback для WDFDEVICE

После IRP_MN_SURPRISE_REMOVAL:

EvtIoStop (флаг WdfRequestStopActionPurge ) для очередей, не управляемых питанием , EvtDeviceSelfManagedIoCleanupEvtCleanupCallback для WDFDEVICE EvtDegradCallback для WDFDEVICE
,IRP_MN_SET_LOCK EvtDeviceSetLock (только KMDF)
^IRP_MN_START_DEVICE

После перечисления:

EvtDeviceRemoveAddedResources (только KMDF)EvtDevicePrepareHardwareEvtDeviceD0EntryEvtInterruptEnableEvtDeviceD0EntryPostInterruptsEnableEvtDmaEnablerFill (только KMDF)EvtDmaEnablerEnable (только KMDF)EvtDmaEnablerSelfManagedIoStart (только KMDF)EvtDeviceSelfManagedIoInit

После IRP_MN_STOP_DEVICE:

EvtDeviceRemoveAddedResources (только KMDF)EvtDevicePrepareHardwareEvtDeviceD0EntryEvtInterruptEnableEvtDeviceD0EntryPostInterruptsEnabledEvtDmaEnablerFill (только KMDF)EvtDmaEnablerEnable (только KMDF)EvtDmaEnablerSelfManagedIoStart (только KMDF)EvtIoResumeEvtDeviceSelfManagedIoRestart
,IRP_MN_STOP_DEVICE EvtDeviceSelfManagedIoSuspendEvtIoStop (WdfRequestStopActionSuspend flag) EvtDmaEnablerSelfManagedIoStop (только KMDF)EvtDmaEnablerDisable (только KMDF)EvtDmaEnablerFlush (только KMDF)EvtDeviceD0ExitPreInterruptsDisabledEvtInterruptDisableEvtDeviceD0Exit (WdfPowerDeviceD3Final state) EvtDeviceReleaseHardware
,IRP_MN_SURPRISE_REMOVAL EvtDeviceSurpriseRemovalEvtDeviceSelfManagedIoSuspendEvtIoStop (флаг WdfRequestStopActionSuspend ) EvtDmaEnablerSelfManagedIoStop (только KMDF)EvtDmaEnablerDisable (только KMDF))EvtDmaEnablerFlush (только KMDF)EvtDeviceD0ExitPreInterruptsDisabledEvtInterruptDisableEvtDeviceD0Exit (WdfPowerDeviceD3Final state) EvtDeviceReleaseHardwareEvtIoStop (флаг WdfRequestStopActionPurge ) для управляемых энергопотреблением очередей EvtDeviceSelfManagedIoFlush
IRP_MN_WRITE_CONFIG Нет. Драйвер KMDF вызывает методы WdfDeviceInitXxx для задания свойств устройства во время инициализации, чтобы платформа самостоятельно реагировала на этот запрос, не уведомляя драйвер.

Обратные вызовы KMDF для IRP_MJ_POWER

В следующей таблице в порядке выполнения перечислены обратные вызовы KMDF, соответствующие незначительным кодам IRP для IRP_MJ_POWER. Стрелки указывают, обрабатывает ли WDM FDO IRP при перемещении вверх или вниз по стеку.

Примечание Примечание. В драйвере KMDF Plug and Play и управление питанием являются интегрированными операциями, и драйвер не получает отдельные незначительные запросы IRP_MJ_PNP или IRP_MJ_POWER. Вместо этого платформа вызывает основной набор обратных вызовов при выключении питания и соответствующий набор при выключении питания, а также вызывает дополнительные обратные вызовы до и после этого набора ядер в соответствии с каждым отдельным запросом Plug and Play. Подробные схемы, показывающие последовательности включения и выключения питания, см. в разделе Перенос PnP и функции управления питанием.

IRP_MJ_POWER дополнительный код Обратные вызовы платформы
,IRP_MN_SET_POWER для D1, D2 или D3 (выключение питания) EvtDeviceSelfManagedIoSuspendEvtIoStop (WdfRequestStopActionSuspend flag) EvtDeviceArmWakeFromS0 или EvtDeviceArmWakeFromSxEvtDmaEnablerSelfManagedIoStop (только 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)