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


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

Kernel-Mode Driver Framework (KMDF) и User-Mode Driver Framework (UMDF) поддерживают часть Windows IRPs. В следующей таблице перечислены основные типы 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. Стрелки указывают, обрабатывает ли FDO WDM 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 вызывает методы WdfDeviceInitXxxx для задания свойств устройства во время инициализации, чтобы платформа самостоятельно реагировала на этот запрос без уведомления драйвера.
IRP_MN_QUERY_CAPABILITIES Нет. Драйвер KMDF вызывает методы WdfDeviceInitXxxx для задания свойств устройства во время инициализации, чтобы платформа самостоятельно реагировала на этот запрос без уведомления драйвера.
IRP_MN_QUERY_DEVICE_RELATIONS (связи с автобусом, удалением и изъятием) EvtDeviceRelationsQuery
IRP_MN_QUERY_DEVICE_TEXT Нет. Драйвер KMDF вызывает методы WdfDeviceInitXxxx для задания свойств устройства во время инициализации, чтобы платформа самостоятельно реагировала на этот запрос без уведомления драйвера.
IRP_MN_QUERY_ID Нет. Драйвер KMDF вызывает методы WdfDeviceInitXxxx для задания свойств устройства во время инициализации, чтобы платформа самостоятельно реагировала на этот запрос без уведомления драйвера.
IRP_MN_QUERY_INTERFACE EvtDeviceProcessQueryInterfaceRequest (только KMDF)
IRP_MN_QUERY_PNP_DEVICE_STATE Нет. Драйвер KMDF вызывает методы WdfDeviceInitXxxx для задания свойств устройства во время инициализации, чтобы платформа самостоятельно реагировала на этот запрос без уведомления драйвера.
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 вызывает методы WdfDeviceInitXxxx для задания свойств устройства во время инициализации, чтобы платформа самостоятельно реагировала на этот запрос без уведомления драйвера.
IRP_MN_REMOVE_DEVICE

После IRP_MN_QUERY_REMOVE_DEVICE:

EvtDeviceSelfManagedIoSuspendEvtIoStop (WdfRequestStopActionSuspend флаг) EvtDmaEnablerSelfManagedIoStop (только KMDF)EvtDmaEnablerDisable (только KMDF)EvtDmaEnablerFlush (только KMDF)EvtDeviceD0ExitPreInterruptsDisabledEvtInterruptDisableEvtDeviceD0Exit (WdfPowerDeviceD3Final состояние) EvtDeviceReleaseHardwareEvtIoStop (WdfRequestStopActionPurge флаг) для управляемых питанием очередей EvtDeviceSelfManagedIoFlushEvtIoStop (WdfRequestStopActionPurge флаг) для неуправляемых очередей EvtDeviceSelfManagedIoCleanupEvtCleanupCallback для WDFDEVICE EvtDestroyCallback для WDFDEVICE

После IRP_MN_SURPRISE_REMOVAL:

EvtIoStop (флаг WdfRequestStopActionPurge) для неуправляемых очередей 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 ru-RU: EvtDeviceSelfManagedIoSuspendEvtIoStop (WdfRequestStopActionSuspend флаг) EvtDmaEnablerSelfManagedIoStop (только KMDF)EvtDmaEnablerDisable (только KMDF)EvtDmaEnablerFlush (только KMDF)EvtDeviceD0ExitPreInterruptsDisabledEvtInterruptDisableEvtDeviceD0Exit (WdfPowerDeviceD3Final состояние) EvtDeviceReleaseHardware
IRP_MN_SURPRISE_REMOVAL EvtDeviceSurpriseRemovalEvtDeviceSelfManagedIoSuspendEvtIoStop (флаг WdfRequestStopActionSuspend) EvtDmaEnablerSelfManagedIoStop (только KMDF)EvtDmaEnablerDisable (только KMDF)EvtDmaEnablerFlush (только KMDF)EvtDeviceD0ExitPreInterruptsDisabledEvtInterruptDisableEvtDeviceD0Exit (WdfPowerDeviceD3Final state) EvtDeviceReleaseHardwareEvtIoStop (флаг WdfRequestStopActionPurge) для управляемых питанием очередей EvtDeviceSelfManagedIoFlush
IRP_MN_WRITE_CONFIG Нет. Драйвер KMDF вызывает методы WdfDeviceInitXxxx для задания свойств устройства во время инициализации, чтобы платформа самостоятельно реагировала на этот запрос без уведомления драйвера.

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

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

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

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