Dichiarazioni di funzione KMDF del driver statico
Per abilitare SDV per verificare il driver KMDF, è necessario dichiarare ogni funzione di callback usando un tipo di ruolo funzione di callback. I tipi di ruolo della funzione di callback sono definiti nei vari file di intestazione WDF e vengono inclusi quando si compila il driver con il file di intestazione Wdf.h. La tabella seguente illustra i tipi di ruolo della funzione e le funzioni di callback degli eventi a cui sono associate.
È necessario dichiarare le funzioni di callback del driver prima delle definizioni di funzione di callback. Nell'esempio seguente viene illustrata la dichiarazione del tipo di ruolo della funzione per la funzione di callback EvtDriverDeviceAdd . In questo esempio la funzione di callback è denominata EvtDriverDeviceAdd.
#include <NTDDK.h>
#include <wdf.h>
EVT_WDF_DRIVER_DEVICE_ADD EvtDriverDeviceAdd
Se una funzione di callback ha una dichiarazione di prototipo di funzione, è necessario sostituire il prototipo di funzione con la dichiarazione del tipo di ruolo della funzione. Per altre informazioni sulle dichiarazioni dei tipi di ruolo della funzione, vedere Using Function Role Type Declarations.
La tabella seguente illustra i tipi di funzione di callback e le funzioni di callback degli eventi a cui sono associate.
Tipo di ruolo funzione | Funzione di callback degli eventi |
---|---|
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 |
Tipi di ruolo funzione che consentono più funzioni di callback
Esistono alcuni tipi di ruolo di funzione che possono avere più funzioni di callback eventi associate. Ad esempio, un driver potrebbe avere più funzioni di callback EvtTimerFunc o EvtDpcFunc . La tabella seguente mostra il numero massimo di callback supportati da SDV per ogni tipo di ruolo di funzione. Sebbene non sia corretto per un driver avere più del numero massimo di funzioni di callback elencate nella tabella, il processo di verifica viene complicato quando si usa SDV. Per informazioni sulle modifiche che potrebbe essere necessario apportare al file Sdv-map.h per supportare le funzioni di callback aggiuntive, vedere Punti di ingresso duplicati per un tipo di ruolo di funzione.
Tipo di ruolo funzione | Numero massimo di funzioni di callback |
---|---|
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 |
Tipi di ruolo funzione e code di I/O
Usare i tipi di ruolo di funzione seguenti quando si dichiarano i gestori di richieste e le funzioni di callback che si basano sul framework KMDF per recapitare le richieste di I/O al driver (per l'invio sequenziale o parallelo). Non usare questi tipi di ruolo funzione per le funzioni che inoltrano manualmente le richieste dalla coda predefinita ad altre code (invio manuale). SDV non supporta un modello di memoria che consente di tenere traccia delle richieste da una coda a un'altra.
Per altre informazioni sulle code di I/O, vedere Creazione di code di I/O.
Tipi di ruolo funzione usati per la coda di I/O configurata per l'invio manuale |
---|
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 |
Tipi di ruolo delle funzioni per le funzioni EvtCleanupCallback e EvtDestroyCallback
È necessario dichiarare la funzione EvtCleanupCallback e EvtDestroyCallback con tipi di ruolo specifici dell'oggetto. SDV richiede questi tipi di ruolo specifici dell'oggetto per determinare se il driver usa correttamente la funzione di callback. Usare le tabelle seguenti per determinare quale tipo di funzione usare.
Tipo oggetto | Tipo di ruolo funzione per EvtCleanupCallback |
---|---|
Oggetto dispositivo |
EVT_WDF_DEVICE_CONTEXT_CLEANUP |
Oggetto coda I/O |
EVT_WDF_IO_QUEUE_CONTEXT_CLEANUP_CALLBACK |
File (oggetto) |
EVT_WDF_FILE_CONTEXT_CLEANUP_CALLBACK |
Tutti gli altri oggetti |
EVT_WDF_OBJECT_CONTEXT_CLEANUP |
Tipo oggetto | Tipo di ruolo funzione per EvDestroyCallback |
---|---|
Oggetto dispositivo |
EVT_WDF_DEVICE_CONTEXT_DESTROY |
Oggetto coda I/O |
EVT_WDF_IO_QUEUE_CONTEXT_DESTROY_CALLBACK |
File (oggetto) |
EVT_WDF_FILE_CONTEXT_DESTROY_CALLBACK |
Tutti gli altri oggetti |
EVT_WDF_OBJECT_CONTEXT_DESTROY |