Deklarieren von Funktionen mithilfe von Funktionsrollentypen für NDIS-Treiber
Um SDV in die Lage zu versetzen, einen NDIS-Treiber zu analysieren, müssen Sie Ihre Funktionen unter Verwendung der Funktionsrollentyp-Deklarationen für NDIS deklarieren. Die Funktionsrollentypen sind in Ndis.h definiert.
Eine Liste der Funktionsrollentypen und der entsprechenden Ereignis-Rückruf-Funktionen finden Sie unter Static Driver Verifier NDIS Function Declarations.
Jede Rückruf-Funktion in einem NDIS-Treiber muss durch Angabe des entsprechenden Rollentyps deklariert werden.
Das folgende Codebeispiel zeigt die Funktionsrollendeklaration für die Rückruf-Funktion MiniportPause . In diesem Beispiel wird die Rückruf-Funktion aufgerufen myMiniportPause. Der Funktionsrollentyp ist MINIPORT_PAUSE.
MINIPORT_PAUSE myMiniportPause;
Wenn eine Rückruf-Funktion eine Funktionsprototyp-Deklaration hat, müssen Sie den Funktionsprototyp durch die Funktionsrollentyp-Deklaration ersetzen.
Das folgende Beispiel zeigt NDIS-Funktionsdeklarationen aus der Header-Datei MP.h, die sich im Unterverzeichnis SDV fail_drivers des WDK befindet. Die entsprechenden Funktionen werden in Main.c deklariert.
\tools\sdv\samples\fail_drivers\NDIS\fail_driver1.
/--------------------------------------
// Miniport routines in MAIN.C
//--------------------------------------
NDIS_STATUS
DriverEntry(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath
);
MINIPORT_ALLOCATE_SHARED_MEM_COMPLETE MPAllocateComplete;
MINIPORT_HALT MPHalt;
MINIPORT_SET_OPTIONS MPSetOptions;
MINIPORT_INITIALIZE MPInitialize;
MINIPORT_PAUSE MPPause;
MINIPORT_RESTART MPRestart;
MINIPORT_OID_REQUEST MPOidRequest;
MINIPORT_INTERRUPT_DPC MPHandleInterrupt;
MINIPORT_ISR MPIsr;
MINIPORT_RESET MPReset;
MINIPORT_RETURN_NET_BUFFER_LISTS MPReturnNetBufferLists;
MINIPORT_CANCEL_OID_REQUEST MPCancelOidRequest;
MINIPORT_SHUTDOWN MPShutdown;
MINIPORT_SEND_NET_BUFFER_LISTS MPSendNetBufferLists;
MINIPORT_CANCEL_SEND MPCancelSendNetBufferLists;
MINIPORT_DEVICE_PNP_EVENT_NOTIFY MPPnPEventNotify;
MINIPORT_UNLOAD MPUnload;
MINIPORT_CHECK_FOR_HANG MPCheckForHang;
MINIPORT_ENABLE_INTERRUPT MpEnableInterrupt;
MINIPORT_DISABLE_INTERRUPT MpDisableInterrupt;
MINIPORT_SYNCHRONIZE_INTERRUPT MPSynchronizeInterrupt;
MINIPORT_PROCESS_SG_LIST MPProcessSGList;
NDIS_TIMER_FUNCTION MpDemonstrationTimer;
NDIS_IO_WORKITEM MPQueuedWorkItem;
Funktionsparameter und Funktionsrollentypen
Wie in der Programmiersprache C vorgeschrieben, müssen die Parametertypen, die Sie in der Funktionsdefinition verwenden, mit den Parametertypen des Funktionsprototyps bzw. in diesem Fall mit dem Funktionsrollentyp übereinstimmen. SDV hängt von den Funktionssignaturen für die Analyse ab und ignoriert Funktionen, deren Signaturen nicht übereinstimmen.
Beispielsweise sollten Sie eine Funktion MiniportInterrupt unter Verwendung des Funktionsrollentyps MINIPORT_ISR deklarieren:
MINIPORT_ISR myMPIsr;
Wenn Sie die Unterbrechungsroutine myMPIsr implementieren, müssen die Parametertypen mit denen übereinstimmen, die von MINIPORT_ISR verwendet werden, nämlich NDIS_HANDLE, PBOOLEAN und PULONG (Syntax siehe MiniportInterrupt-Funktion).
BOOLEAN
myMPIsr(
__in NDIS_HANDLE MiniportInterruptContext,
__out PBOOLEAN QueueMiniportInterruptDpcHandler,
__out PULONG TargetProcessors
) {
}
Ausführen von Code Analysis for Drivers zur Überprüfung der Funktionsdeklarationen
Um zu ermitteln, ob der Quellcode vorbereitet ist, führen Sie Code Analysis for Drivers aus. Code Analysis for Drivers prüft die Deklarationen von Funktionsrollentypen und kann helfen, Funktionsdeklarationen zu identifizieren, die möglicherweise übersehen wurden, oder Sie zu warnen, wenn die Parameter der Funktionsdefinition nicht mit denen des Funktionsrollentyps übereinstimmen.