KMDF-Funktionsdeklarationen der statischen Treiberüberprüfung
Damit SDV Ihren KMDF-Treiber überprüfen kann, müssen Sie jede Rückruffunktion mithilfe eines Rückruffunktionsrollentyps deklarieren. Die Rückruffunktionsrollentypen werden in den verschiedenen WDF-Headerdateien definiert und sind enthalten, wenn Sie Ihren Treiber mit der Wdf.h-Headerdatei erstellen. Die folgende Tabelle zeigt die Funktionsrollentypen und die Ereignisrückruffunktionen, denen sie zugeordnet sind.
Sie müssen die Rückruffunktionen des Treibers vor den Rückruffunktionsdefinitionen deklarieren. Das folgende Beispiel zeigt die Funktionsrollentypdeklaration für die Rückruffunktion EvtDriverDeviceAdd . In diesem Beispiel heißt die Rückruffunktion EvtDriverDeviceAdd.
#include <NTDDK.h>
#include <wdf.h>
EVT_WDF_DRIVER_DEVICE_ADD EvtDriverDeviceAdd
Wenn eine Rückruffunktion über eine Funktionsprototypdeklaration verfügt, müssen Sie den Funktionsprototyp durch die Funktionsrollentypdeklaration ersetzen. Weitere Informationen zu den Funktionsrollentypdeklarationen finden Sie unter Verwenden von Funktionsrollentypdeklarationen.
Die folgende Tabelle zeigt die Rückruffunktionstypen und die Ereignisrückruffunktionen, denen sie zugeordnet sind.
Funktionsrollentyp | Ereignisrückruffunktion |
---|---|
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 |
Funktionsrollentypen, die mehrere Rückruffunktionen zulassen
Es gibt einige Funktionsrollentypen, denen mehrere Ereignisrückruffunktionen zugeordnet sein können. Beispielsweise kann ein Treiber über mehrere Rückruffunktionen evtTimerFunc oder EvtDpcFunc verfügen. Die folgende Tabelle zeigt die maximale Anzahl von Rückrufen, die SDV für jeden Funktionsrollentyp unterstützt. Es ist zwar nicht falsch, dass für einen Treiber mehr als die maximale Anzahl von Rückruffunktionen in der Tabelle aufgeführt ist, aber es erschwert den Überprüfungsprozess bei Verwendung von SDV. Informationen zu Änderungen, die Sie möglicherweise an der Datei Sdv-map.h vornehmen müssen, um die zusätzlichen Rückruffunktionen aufzunehmen, finden Sie unter Doppelte Einstiegspunkte für einen Funktionsrollentyp.
Funktionsrollentyp | Maximale Anzahl von Rückruffunktionen |
---|---|
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 |
Funktionsrollentypen und E/A-Warteschlangen
Verwenden Sie die folgenden Funktionsrollentypen, wenn Sie die Anforderungshandler und Rückruffunktionen deklarieren, die auf dem KMDF-Framework basieren, um die E/A-Anforderungen an den Treiber zu übermitteln (für sequenzielle oder parallele Verteilung). Verwenden Sie diese Funktionsrollentypen nicht für die Funktionen, die Anforderungen aus der Standardwarteschlange manuell an andere Warteschlangen weiterleiten (manuelle Versendung). SDV unterstützt kein Speichermodell, mit dem Anforderungen von einer Warteschlange zur anderen nachverfolgt werden können.
Weitere Informationen zu E/A-Warteschlangen finden Sie unter Erstellen von E/A-Warteschlangen.
Funktionsrollentypen, die für die E/A-Warteschlange verwendet werden, die für die manuelle Versendung konfiguriert sind |
---|
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 |
Funktionsrollentypen für die Funktionen EvtCleanupCallback und EvtDestroyCallback
Sie müssen die Funktion EvtCleanupCallback und EvtDestroyCallback mit objektspezifischen Funktionsrollentypen deklarieren. SDV erfordert diese objektspezifischen Rollentypen, um zu bestimmen, ob der Treiber die Rückruffunktion ordnungsgemäß verwendet. Verwenden Sie die folgenden Tabellen, um zu bestimmen, welcher Funktionstyp verwendet werden soll.
Objekttyp | Funktionsrollentyp für EvtCleanupCallback |
---|---|
Geräteobjekt |
EVT_WDF_DEVICE_CONTEXT_CLEANUP |
E/A-Warteschlangenobjekt |
EVT_WDF_IO_QUEUE_CONTEXT_CLEANUP_CALLBACK |
File-Objekt |
EVT_WDF_FILE_CONTEXT_CLEANUP_CALLBACK |
Alle anderen Objekte |
EVT_WDF_OBJECT_CONTEXT_CLEANUP |
Objekttyp | Funktionsrollentyp für EvDestroyCallback |
---|---|
Geräteobjekt |
EVT_WDF_DEVICE_CONTEXT_DESTROY |
E/A-Warteschlangenobjekt |
EVT_WDF_IO_QUEUE_CONTEXT_DESTROY_CALLBACK |
File-Objekt |
EVT_WDF_FILE_CONTEXT_DESTROY_CALLBACK |
Alle anderen Objekte |
EVT_WDF_OBJECT_CONTEXT_DESTROY |