IRPs WDM e funções de retorno de chamada de eventos WDF

Kernel-Mode Driver Framework (KMDF) e User-Mode Driver Framework (UMDF) suportam um subconjunto de IRPs do Windows. A tabela a seguir lista os principais tipos de IRP WDM e as funções de retorno de chamada de evento do framework correspondentes. A menos que especificado de outra forma, os retornos de chamada aplicam-se tanto ao KMDF como ao UMDF.

Código IRP principal Função de callback de evento WDF
IRP_MJ_CLEANUP EvtFileCleanup
IRP_MJ_CLOSE EvtFileClose
IRP_MJ_CREATE EvtDeviceFileCreate ou EvtIoDefault
IRP_MJ_CREATE_MAILSLOT Sem apoio direto; implementar EvtDeviceWdmIrpPreprocess (somente KMDF)
IRP_MJ_DEVICE_CHANGE Sem apoio direto; implementar EvtDeviceWdmIrpPreprocess (somente KMDF)
IRP_MJ_DEVICE_CONTROL EvtIoDeviceControl ou EvtIoDefault
IRP_MJ_DIRECTORY_CONTROL Sem apoio direto; implementar EvtDeviceWdmIrpPreprocess (somente KMDF)
#B0 #A1 Controle do sistema de arquivos (IRP_MJ_FILE_SYSTEM_CONTROL) #A2 #C3 Sem apoio direto; implementar EvtDeviceWdmIrpPreprocess (somente KMDF)
#B0 #A1 IRP_MJ_FLUSH_BUFFERS #A2 #C3 Sem apoio direto; implementar EvtDeviceWdmIrpPreprocess (somente KMDF)
IRP_MJ_INTERNAL_DEVICE_CONTROL EvtIoInternalDeviceControl ou EvtIoDefault
#B0 #A1 Controle de Bloqueio de IRP_MJ #A2 #C3 Sem apoio direto; implementar EvtDeviceWdmIrpPreprocess (somente KMDF)
IRP_MJ_PNP Muitos; consulte KMDF Callbacks para IRP_MJ_PNP.
IRP_MJ_POWER Muitos; consulte KMDF Callbacks para IRP_MJ_POWER.
IRP_MJ_QUERY_EA Sem apoio direto; implementar EvtDeviceWdmIrpPreprocess (somente KMDF)
#B0 #A1 IRP_MJ_QUERY_INFORMATION #A2 #C3 Sem apoio direto; implementar EvtDeviceWdmIrpPreprocess (somente KMDF)
IRP_MJ_QUERY_QUOTA Sem apoio direto; implementar EvtDeviceWdmIrpPreprocess (somente KMDF)
IRP_MJ_QUERY_SECURITY Sem apoio direto; implementar EvtDeviceWdmIrpPreprocess (somente KMDF)
#B0 #A1 IRP_MJ_QUERY_VOLUME_INFORMATION #A2 #C3 Sem apoio direto; implementar EvtDeviceWdmIrpPreprocess (somente KMDF)
IRP_MJ_READ EvtIoRead ou EvtIoDefault
IRP_MJ_SET_EA Sem apoio direto; implementar EvtDeviceWdmIrpPreprocess (somente KMDF)
#B0 #A1 IRP_MJ_SET_INFORMATION #A2 #C3 Sem apoio direto; implementar EvtDeviceWdmIrpPreprocess (somente KMDF)
IRP_MJ_SET_QUOTA Sem apoio direto; implementar EvtDeviceWdmIrpPreprocess (somente KMDF)
IRP_MJ_SET_SECURITY Sem apoio direto; implementar EvtDeviceWdmIrpPreprocess (somente KMDF)
IRP_MJ_SET_VOLUME_INFORMATION Sem apoio direto; implementar EvtDeviceWdmIrpPreprocess (somente KMDF)
IRP_MJ_SHUTDOWN

Para objetos de dispositivo de controle, implemente EvtDeviceShutdownNotification (somente KMDF)

Para todos os objetos de dispositivo Plug and Play: Não é suportado; implemente EvtDeviceWdmIrpPreprocess (somente KMDF).

IRP_MJ_SYSTEM_CONTROL Crie objetos WDFWMIPROVIDER e WDFWMIINSTANCE e implemente retornos de chamada EvtWmiXxx (somente KMDF).
IRP_MJ_WRITE EvtIoWrite ou EvtIoDefault

Retornos de chamada KMDF para IRP_MJ_PNP

A tabela a seguir lista, em ordem de execução, os retornos de chamada KMDF que correspondem aos códigos IRP secundários para IRP_MJ_PNP. As setas indicam se um WDM FDO manipula o IRP à medida que ele viaja para cima ou para baixo na pilha.

Observação Em um driver KMDF, o Plug and Play e o gerenciamento de energia são operações integradas e o driver não recebe as solicitações individuais de IRP_MJ_PNP ou IRP_MJ_POWER menores. Em vez disso, a estrutura chama um conjunto principal de retornos de chamada na inicialização e um conjunto correspondente na desativação, e chama retornos de chamada adicionais antes e depois desse conjunto principal, conforme apropriado para cada solicitação Plug and Play individual. Para obter diagramas abrangentes que mostram as sequências de power-up e power-down, consulte Porting PnP and Power Management Functionality.

IRP_MJ_PNP código menor Retornos de chamada KMDF
IRP_MN_CANCEL_REMOVE_DEVICE Nenhum
IRP_MN_CANCEL_STOP_DEVICE Nenhum
IRP_MN_DEVICE_USAGE_NOTIFICATION EvtDeviceUsageNotification
IRP_MN_EJECT EvtDeviceEject (somente KMDF)
IRP_MN_FILTER_RESOURCE_REQUIREMENTS EvtDeviceFilterRemoveResourceRequirements (apenas para KMDF)
IRP_MN_FILTER_RESOURCE_REQUIREMENTS EvtDeviceFilterAddResourceRequirements (somente KMDF)
IRP_MN_QUERY_BUS_INFORMATION Nenhum. O driver KMDF chama os métodos WdfDeviceInitXxx para definir as propriedades do dispositivo durante a inicialização para que a estrutura possa responder a essa consulta por conta própria sem notificar o driver.
IRP_MN_QUERY_CAPABILITIES Nenhum. O driver KMDF chama os métodos WdfDeviceInitXxx para definir as propriedades do dispositivo durante a inicialização para que a estrutura possa responder a essa consulta por conta própria sem notificar o driver.
IRP_MN_QUERY_DEVICE_RELATIONS (relações de bus, remoção e extração) EvtDeviceRelationsQuery
IRP_MN_QUERY_DEVICE_TEXT Nenhum. O driver KMDF chama os métodos WdfDeviceInitXxx para definir as propriedades do dispositivo durante a inicialização para que a estrutura possa responder a essa consulta por conta própria sem notificar o driver.
IRP_MN_QUERY_ID Nenhum. O driver KMDF chama os métodos WdfDeviceInitXxx para definir as propriedades do dispositivo durante a inicialização para que a estrutura possa responder a essa consulta por conta própria sem notificar o driver.
IRP_MN_QUERY_INTERFACE EvtDeviceProcessQueryInterfaceRequest (somente KMDF)
IRP_MN_QUERY_PNP_DEVICE_STATE Nenhum. O driver KMDF chama os métodos WdfDeviceInitXxx para definir as propriedades do dispositivo durante a inicialização para que a estrutura possa responder a essa consulta por conta própria sem notificar o driver.
IRP_MN_QUERY_REMOVE_DEVICE EvtDeviceQueryRemove
IRP_MN_QUERY_RESOURCE_REQUIREMENTS EvtDeviceResourceRequirementsQuery (apenas KMDF)
IRP_MN_QUERY_RESOURCES EvtDeviceResourcesQuery (somente KMDF)
IRP_MN_QUERY_STOP_DEVICE EvtDeviceQueryStop
IRP_MN_READ_CONFIG (Configuração de Leitura IRP_MN) Nenhum. O driver KMDF chama os métodos WdfDeviceInitXxx para definir as propriedades do dispositivo durante a inicialização para que a estrutura possa responder a essa consulta por conta própria sem notificar o driver.
IRP_MN_REMOVE_DEVICE

Após IRP_MN_QUERY_REMOVE_DEVICE:

EvtDeviceSelfManagedIoSuspendEvtIoStop (sinalizador WdfRequestStopActionSuspend ) EvtDmaEnablerSelfManagedIoStop (somente KMDF)EvtDmaEnablerDisable (somente KMDF)EvtDmaEnablerFlush (somente KMDF)EvtDeviceD0ExitPreInterruptsDisabledEvtInterruptDisableEvtDeviceD0Exit (WdfPowerDeviceD3Final state) EvtDeviceReleaseHardwareEvtIoStop (Sinalizador WdfRequestStopActionPurge ) para filas gerenciadas por energia EvtDeviceSelfManagedIoFlushEvtIoStop (sinalizador WdfRequestStopActionPurge ) para filas não gerenciadas por energia EvtDeviceSelfManagedIoCleanupEvtCleanupCallback para WDFDEVICE EvtDestroyCallback para WDFDEVICE

Após IRP_MN_SURPRISE_REMOVAL:

EvtIoStop (sinalizador WdfRequestStopActionPurge ) para filas não gerenciadas por energia EvtDeviceSelfManagedIoCleanupEvtCleanupCallback para WDFDEVICE EvtDestroyCallback para WDFDEVICE
IRP_MN_SET_LOCK EvtDeviceSetLock (somente KMDF)
IRP_MN_START_DEVICE

Após a enumeração:

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

Após IRP_MN_STOP_DEVICE:

EvtDeviceRemoveAddedResources (somente KMDF)EvtDevicePrepareHardwareEvtDeviceD0EntryEvtInterruptEnableEvtDeviceD0EntryPostInterruptsEnabledEvtDmaEnablerFill (somente KMDF)EvtDmaEnablerEnable (somente KMDF)EvtDmaEnablerSelfManagedIoStart (somente KMDF)EvtIoResumeEvtDeviceSelfManagedIoRestart
IRP_MN_STOP_DEVICE EvtDeviceSelfManagedIoSuspendEvtIoStop (sinalizador WdfRequestStopActionSuspend) EvtDmaEnablerSelfManagedIoStop (apenas KMDF)EvtDmaEnablerDisable (apenas KMDF)EvtDmaEnablerFlush (apenas KMDF)EvtDeviceD0ExitPreInterruptsDisabledEvtInterruptDisableEvtDeviceD0Exit (WdfPowerDeviceD3Final estado) EvtDeviceReleaseHardware
IRP_MN_SURPRISE_REMOVAL EvtDeviceSurpriseRemovalEvtDeviceSelfManagedIoSuspendEvtIoStop (sinalizador WdfRequestStopActionSuspend ) EvtDmaEnablerSelfManagedIoStop (somente KMDF)EvtDmaEnablerDisable (somente KMDF)EvtDmaEnablerFlush (somente KMDF)EvtDeviceD0ExitPreInterruptsDisabledEvtInterruptDisableEvtDeviceD0Exit (WdfPowerDeviceD3Final state) EvtDeviceReleaseHardwareEvtIoStop (sinalizador WdfRequestStopActionPurge ) para filas gerenciadas por energia EvtDeviceSelfManagedIoFlush
IRP_MN_WRITE_CONFIG Nenhum. O driver KMDF chama os métodos WdfDeviceInitXxx para definir as propriedades do dispositivo durante a inicialização para que a estrutura possa responder a essa consulta por conta própria sem notificar o driver.

Retornos de chamada KMDF para IRP_MJ_POWER

A tabela a seguir lista, em ordem de execução, os retornos de chamada KMDF que correspondem aos códigos IRP secundários para IRP_MJ_POWER. As setas indicam se um WDM FDO manipula o IRP à medida que ele viaja para cima ou para baixo na pilha.

Observação Nota: Num driver KMDF, o Plug and Play e o gerenciamento de energia são operações integradas, e o driver não recebe os pedidos individuais menores de IRP_MJ_PNP ou IRP_MJ_POWER. Em vez disso, a estrutura chama um conjunto principal de retornos de chamada na inicialização e um conjunto correspondente na desativação, e chama retornos de chamada adicionais antes e depois desse conjunto principal, conforme apropriado para cada solicitação Plug and Play individual. Para obter diagramas abrangentes que mostram as sequências de power-up e power-down, consulte Porting PnP and Power Management Functionality.

Código menor do IRP_MJ_POWER Retornos de chamada de framework
IRP_MN_SET_POWER para D1, D2 ou D3 (redução de energia) pt-PT: EvtDeviceSelfManagedIoSuspendEvtIoStop (sinalizador WdfRequestStopActionSuspend) EvtDeviceArmWakeFromS0 ou EvtDeviceArmWakeFromSxEvtDmaEnablerSelfManagedIoStop (apenas KMDF)EvtDmaEnablerDisable (apenas KMDF)EvtDmaEnablerFlush (apenas KMDF)EvtDeviceD0ExitPreInterruptsDisabledEvtInterruptDisableEvtDeviceD0Exit
IRP_MN_SET_POWER para D0 (ativação de energia) EvtDeviceD0EntryEvtInterruptEnableEvtDeviceD0EntryPostInterruptsEnabledEvtDmaEnablerFill (apenas KMDF)EvtDmaEnablerEnable (apenas KMDF)EvtDmaEnablerSelfManagedIoStart (apenas KMDF)EvtIoResumeEvtDeviceSelfManagedIoRestart
IRP_MN_SET_POWER para Sx Nenhum
IRP_MN_SET_POWER para Sx Nenhum
#B0 #A1 IRP_MN_POWER_SEQUENCE #A2 #C3 Nenhum
IRP_MN_WAIT_WAKE EvtDeviceEnableWakeAtBus (somente KMDF)
IRP_MN_WAIT_WAKE EvtDeviceDisableWakeAtBus (apenas KMDF)