Declarações de função KMDF do verificador de driver estático
Para habilitar o SDV para verificar o driver KMDF, você deve declarar cada função de retorno de chamada usando um tipo de função de retorno de chamada. Os tipos de função de retorno de chamada são definidos nos vários arquivos de cabeçalho do WDF e são incluídos quando você cria o driver com o arquivo de cabeçalho Wdf.h. A tabela a seguir mostra os tipos de função de função e as funções de retorno de chamada de evento às quais eles estão associados.
Você deve declarar as funções de retorno de chamada do driver antes das definições da função de retorno de chamada. O exemplo a seguir mostra a declaração de tipo de função para a função de retorno de chamada EvtDriverDeviceAdd . Neste exemplo, a função de retorno de chamada é chamada EvtDriverDeviceAdd.
#include <NTDDK.h>
#include <wdf.h>
EVT_WDF_DRIVER_DEVICE_ADD EvtDriverDeviceAdd
Se uma função de retorno de chamada tiver uma declaração de protótipo de função, você deverá substituir o protótipo de função pela declaração de tipo de função de função. Para obter mais informações sobre as declarações de tipo de função, consulte Usando declarações de tipo de função.
A tabela a seguir mostra os tipos de função de retorno de chamada e as funções de retorno de chamada de evento às quais eles estão associados.
Tipo de função | Função de retorno de chamada de evento |
---|---|
EVT_WDF_CHILD_LIST_ADDRESS_DESCRIPTION_CLEANUP |
|
EVT_WDF_CHILD_LIST_ADDRESS_DESCRIPTION_COPY |
|
EVT_WDF_CHILD_LIST_ADDRESS_DESCRIPTION_DUPLICATE |
|
EVT_WDF_CHILD_LIST_CREATE_DEVICE |
|
EVT_WDF_CHILD_LIST_DEVICE_REENUMERATED |
|
EVT_WDF_CHILD_LIST_IDENTIFICATION_DESCRIPTION_CLEANUP |
|
EVT_WDF_CHILD_LIST_IDENTIFICATION_DESCRIPTION_COMPARE |
|
EVT_WDF_CHILD_LIST_IDENTIFICATION_DESCRIPTION_COPY |
|
EVT_WDF_CHILD_LIST_IDENTIFICATION_DESCRIPTION_DUPLICATE |
|
EVT_WDF_CHILD_LIST_SCAN_FOR_CHILDREN |
|
EVT_WDF_DEVICE_ARM_WAKE_FROM_S0 |
|
EVT_WDF_DEVICE_ARM_WAKE_FROM_SX |
|
EVT_WDF_DEVICE_CONTEXT_CLEANUP |
|
EVT_WDF_DEVICE_CONTEXT_DESTROY |
|
EVT_WDF_DEVICE_D0_ENTRY |
|
EVT_WDF_DEVICE_D0_ENTRY_POST_INTERRUPTS_ENABLED |
|
EVT_WDF_DEVICE_D0_EXIT |
|
EVT_WDF_DEVICE_D0_EXIT_PRE_INTERRUPTS_DISABLED |
|
EVT_WDF_DEVICE_DISABLE_WAKE_AT_BUS |
|
EVT_WDF_DEVICE_DISARM_WAKE_FROM_S0 |
|
EVT_WDF_DEVICE_DISARM_WAKE_FROM_SX |
|
EVT_WDF_DEVICE_EJECT |
|
EVT_WDF_DEVICE_ENABLE_WAKE_AT_BUS |
|
EVT_WDF_DEVICE_FILE_CREATE |
|
EVT_WDF_DEVICE_FILTER_RESOURCE_REQUIREMENTS |
|
EVT_WDF_DEVICE_PNP_STATE_CHANGE_NOTIFICATION |
|
EVT_WDF_DEVICE_POWER_POLICY_STATE_CHANGE_NOTIFICATION |
|
EVT_WDF_DEVICE_POWER_STATE_CHANGE_NOTIFICATION |
|
EVT_WDF_DEVICE_PREPARE_HARDWARE |
|
EVT_WDF_DEVICE_PROCESS_QUERY_INTERFACE_REQUEST |
|
EVT_WDF_DEVICE_QUERY_REMOVE |
|
EVT_WDF_DEVICE_QUERY_STOP |
|
EVT_WDF_DEVICE_RELATIONS_QUERY |
|
EVT_WDF_DEVICE_RELEASE_HARDWARE |
|
EVT_WDF_DEVICE_REMOVE_ADDED_RESOURCES |
|
EVT_WDF_DEVICE_RESOURCE_REQUIREMENTS_QUERY |
|
EVT_WDF_DEVICE_RESOURCES_QUERY |
|
EVT_WDF_DEVICE_SELF_MANAGED_IO_CLEANUP |
|
EVT_WDF_DEVICE_SELF_MANAGED_IO_FLUSH |
|
EVT_WDF_DEVICE_SELF_MANAGED_IO_INIT |
|
EVT_WDF_DEVICE_SELF_MANAGED_IO_RESTART |
|
EVT_WDF_DEVICE_SELF_MANAGED_IO_SUSPEND |
|
EVT_WDF_DEVICE_SET_LOCK |
|
EVT_WDF_DEVICE_SHUTDOWN_NOTIFICATION |
|
EVT_WDF_DEVICE_SURPRISE_REMOVAL |
|
EVT_WDF_DEVICE_USAGE_NOTIFICATION |
|
EVT_WDF_DEVICE_WAKE_FROM_S0_TRIGGERED |
|
EVT_WDF_DEVICE_WAKE_FROM_SX_TRIGGERED |
|
EVT_WDF_DMA_ENABLER_DISABLE |
|
EVT_WDF_DMA_ENABLER_ENABLE |
|
EVT_WDF_DMA_ENABLER_FILL |
|
EVT_WDF_DMA_ENABLER_FLUSH |
|
EVT_WDF_DMA_ENABLER_SELFMANAGED_IO_START |
|
EVT_WDF_DMA_ENABLER_SELFMANAGED_IO_STOP |
|
EVT_WDF_DPC |
|
EVT_WDF_DRIVER_DEVICE_ADD |
|
EVT_WDF_DRIVER_UNLOAD |
|
EVT_WDF_FILE_CLEANUP |
|
EVT_WDF_FILE_CLOSE |
|
EVT_WDF_FILE_CONTEXT_CLEANUP_CALLBACK |
|
EVT_WDF_FILE_CONTEXT_DESTROY_CALLBACK |
|
EVT_WDF_INTERRUPT_DISABLE |
|
EVT_WDF_INTERRUPT_DPC |
|
EVT_WDF_INTERRUPT_ENABLE |
|
EVT_WDF_INTERRUPT_ISR |
|
EVT_WDF_INTERRUPT_SYNCHRONIZE |
|
EVT_WDF_IO_IN_CALLER_CONTEXT |
|
EVT_WDF_IO_QUEUE_CONTEXT_CLEANUP_CALLBACK |
|
EVT_WDF_IO_QUEUE_CONTEXT_DESTROY_CALLBACK |
|
EVT_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE |
|
EVT_WDF_IO_QUEUE_IO_DEFAULT |
|
EVT_WDF_IO_QUEUE_IO_DEVICE_CONTROL |
|
EVT_WDF_IO_QUEUE_IO_INTERNAL_DEVICE_CONTROL |
|
EVT_WDF_IO_QUEUE_IO_READ |
|
EVT_WDF_IO_QUEUE_IO_RESUME |
|
EVT_WDF_IO_QUEUE_IO_STOP |
|
EVT_WDF_IO_QUEUE_IO_WRITE |
|
EVT_WDF_IO_QUEUE_STATE |
|
EVT_WDF_IO_TARGET_QUERY_REMOVE |
|
EVT_WDF_IO_TARGET_REMOVE_CANCELED |
|
EVT_WDF_IO_TARGET_REMOVE_COMPLETE |
|
EVT_WDF_OBJECT_CONTEXT_CLEANUP |
|
EVT_WDF_OBJECT_CONTEXT_DESTROY |
|
EVT_WDF_PROGRAM_DMA |
|
EVT_WDF_REQUEST_CANCEL |
|
EVT_WDF_REQUEST_COMPLETION_ROUTINE |
|
EVT_WDF_TIMER |
|
EVT_WDF_TRACE_CALLBACK |
|
EVT_WDF_WMI_INSTANCE_EXECUTE_METHOD |
|
EVT_WDF_WMI_INSTANCE_QUERY_INSTANCE |
|
EVT_WDF_WMI_INSTANCE_SET_INSTANCE |
|
EVT_WDF_WMI_INSTANCE_SET_ITEM |
|
EVT_WDF_WMI_PROVIDER_FUNCTION_CONTROL |
|
EVT_WDF_WORKITEM |
|
EVT_WDFDEVICE_WDM_IRP_PREPROCESS |
Tipos de função de função que permitem várias funções de retorno de chamada
Há alguns tipos de função de função que podem ter várias funções de retorno de chamada de evento associadas a eles. Por exemplo, um driver pode ter várias funções de retorno de chamada EvtTimerFunc ou EvtDpcFunc . A tabela a seguir mostra o número máximo de retornos de chamada aos quais o SDV dá suporte para cada tipo de função. Embora não esteja incorreto para um driver ter mais do que o número máximo de funções de retorno de chamada listadas na tabela, isso complica o processo de verificação ao usar o SDV. Para obter informações sobre as alterações que talvez seja necessário fazer no arquivo Sdv-map.h para acomodar as funções de retorno de chamada adicionais, consulte Duplicar pontos de entrada para um tipo de função de função.
Tipo de função | Número máximo de funções de retorno de chamada |
---|---|
EVT_WDF_DPC |
7 |
EVT_WDF_INTERRUPT_SYNCHRONIZE |
11 |
EVT_WDF_TIMER |
6 |
EVT_WDF_WMI_INSTANCE_EXECUTE_METHOD |
5 |
EVT_WDF_WMI_INSTANCE_QUERY_INSTANCE |
5 |
EVT_WDF_WMI_INSTANCE_SET_INSTANCE |
5 |
EVT_WDF_WMI_INSTANCE_SET_ITEM |
5 |
Tipos de função e filas de E/S
Use os seguintes tipos de função de função ao declarar os Manipuladores de Solicitação e as funções de retorno de chamada que dependem da estrutura KMDF para entregar as solicitações de E/S ao driver (para expedição sequencial ou paralela). Não use esses tipos de função para as funções que encaminham manualmente solicitações da fila padrão para outras filas (expedição manual). O SDV não dá suporte a um modelo de memória que permite que ele acompanhe solicitações de uma fila para outra.
Para obter mais informações sobre filas de E/S, consulte Criando filas de E/S.
Tipos de função usados para fila de E/S configurada para expedição manual |
---|
EVT_WDF_IO_QUEUE_CONTEXT_CLEANUP_CALLBACK |
EVT_WDF_IO_QUEUE_CONTEXT_DESTROY_CALLBACK |
EVT_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE |
EVT_WDF_IO_QUEUE_IO_DEFAULT |
EVT_WDF_IO_QUEUE_IO_DEVICE_CONTROL |
EVT_WDF_IO_QUEUE_IO_INTERNAL_DEVICE_CONTROL |
EVT_WDF_IO_QUEUE_IO_READ |
EVT_WDF_IO_QUEUE_IO_RESUME |
EVT_WDF_IO_QUEUE_IO_STOP |
EVT_WDF_IO_QUEUE_IO_WRITE |
EVT_WDF_IO_QUEUE_STATE |
Tipos de função para as funções EvtCleanupCallback e EvtDestroyCallback
Você deve declarar a função EvtCleanupCallback e EvtDestroyCallback com tipos de função específicos do objeto. O SDV requer esses tipos de função específicos do objeto para determinar se o driver está usando corretamente a função de retorno de chamada. Use as tabelas a seguir para determinar qual tipo de função usar.
Tipo de objeto | Tipo de função para EvtCleanupCallback |
---|---|
Objeto de dispositivo |
EVT_WDF_DEVICE_CONTEXT_CLEANUP |
Objeto de fila de E/S |
EVT_WDF_IO_QUEUE_CONTEXT_CLEANUP_CALLBACK |
Objeto de arquivo |
EVT_WDF_FILE_CONTEXT_CLEANUP_CALLBACK |
Todos os outros objetos |
EVT_WDF_OBJECT_CONTEXT_CLEANUP |
Tipo de objeto | Tipo de função para EvDestroyCallback |
---|---|
Objeto de dispositivo |
EVT_WDF_DEVICE_CONTEXT_DESTROY |
Objeto de fila de E/S |
EVT_WDF_IO_QUEUE_CONTEXT_DESTROY_CALLBACK |
Objeto de arquivo |
EVT_WDF_FILE_CONTEXT_DESTROY_CALLBACK |
Todos os outros objetos |
EVT_WDF_OBJECT_CONTEXT_DESTROY |