Déclarations de fonction KMDF du vérificateur de pilote statique
Pour permettre à SDV de vérifier votre pilote KMDF, vous devez déclarer chaque fonction de rappel, à l’aide d’un type de rôle de fonction de rappel. Les types de rôles de fonction de rappel sont définis dans les différents fichiers d’en-tête WDF et sont inclus lorsque vous générez votre pilote avec le fichier d’en-tête Wdf.h. Le tableau suivant montre les types de rôles de fonction et les fonctions de rappel d’événements auxquelles ils sont associés.
Vous devez déclarer les fonctions de rappel du pilote avant les définitions de la fonction de rappel. L’exemple suivant montre la déclaration de type de rôle de fonction pour la fonction de rappel EvtDriverDeviceAdd . Dans cet exemple, la fonction de rappel est appelée EvtDriverDeviceAdd.
#include <NTDDK.h>
#include <wdf.h>
EVT_WDF_DRIVER_DEVICE_ADD EvtDriverDeviceAdd
Si une fonction de rappel a une déclaration de prototype de fonction, vous devez remplacer le prototype de fonction par la déclaration de type de rôle de fonction. Pour plus d’informations sur les déclarations de type de rôle de fonction, consultez Utilisation des déclarations de type de rôle de fonction.
Le tableau suivant montre les types de fonctions de rappel et les fonctions de rappel d’événements auxquelles ils sont associés.
Type de rôle de fonction | Fonction de rappel d’événement |
---|---|
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 |
Types de rôles de fonction qui autorisent plusieurs fonctions de rappel
Certains types de rôles de fonction peuvent avoir plusieurs fonctions de rappel d’événement associées. Par exemple, un pilote peut avoir plusieurs fonctions de rappel EvtTimerFunc ou EvtDpcFunc . Le tableau suivant indique le nombre maximal de rappels pris en charge par SDV pour chaque type de rôle de fonction. Bien qu’il ne soit pas incorrect pour un pilote d’avoir plus que le nombre maximal de fonctions de rappel répertoriées dans le tableau, cela complique le processus de vérification lors de l’utilisation de SDV. Pour plus d’informations sur les modifications que vous devrez peut-être apporter au fichier Sdv-map.h pour prendre en charge les fonctions de rappel supplémentaires, consultez Dupliquer les points d’entrée pour un type de rôle de fonction.
Type de rôle de fonction | Nombre maximal de fonctions de rappel |
---|---|
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 |
Types de rôles de fonction et files d’attente d’E/S
Utilisez les types de rôles de fonction suivants lorsque vous déclarez les gestionnaires de demandes et les fonctions de rappel qui s’appuient sur l’infrastructure KMDF pour remettre les demandes d’E/S au pilote (pour la répartition séquentielle ou parallèle). N’utilisez pas ces types de rôles de fonction pour les fonctions qui transfèrent manuellement les demandes de la file d’attente par défaut vers d’autres files d’attente (répartition manuelle). SDV ne prend pas en charge un modèle de mémoire qui lui permet de suivre les demandes d’une file d’attente à une autre.
Pour plus d’informations sur les files d’attente d’E/S, consultez Création de files d’attente d’E/S.
Types de rôles de fonction utilisés pour la file d’attente d’E/S configurée pour la distribution manuelle |
---|
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 |
Types de rôles de fonction pour les fonctions EvtCleanupCallback et EvtDestroyCallback
Vous devez déclarer les fonctions EvtCleanupCallback et EvtDestroyCallback avec des types de rôles de fonction spécifiques à l’objet. SDV nécessite ces types de rôles spécifiques à l’objet pour déterminer si le pilote utilise correctement la fonction de rappel. Utilisez les tableaux suivants pour déterminer le type de fonction à utiliser.
Type d’objet | Type de rôle de fonction pour EvtCleanupCallback |
---|---|
Objet d’appareil |
EVT_WDF_DEVICE_CONTEXT_CLEANUP |
Objet file d’attente d’E/S |
EVT_WDF_IO_QUEUE_CONTEXT_CLEANUP_CALLBACK |
File (objet) |
EVT_WDF_FILE_CONTEXT_CLEANUP_CALLBACK |
Tous les autres objets |
EVT_WDF_OBJECT_CONTEXT_CLEANUP |
Type d’objet | Type de rôle de fonction pour EvDestroyCallback |
---|---|
Objet d’appareil |
EVT_WDF_DEVICE_CONTEXT_DESTROY |
Objet file d’attente d’E/S |
EVT_WDF_IO_QUEUE_CONTEXT_DESTROY_CALLBACK |
File (objet) |
EVT_WDF_FILE_CONTEXT_DESTROY_CALLBACK |
Tous les autres objets |
EVT_WDF_OBJECT_CONTEXT_DESTROY |