Deklarieren von Funktionen mithilfe von Funktionsrollentypen für NDIS-Treiber

Damit SDV einen NDIS-Treiber analysieren kann, müssen Sie Ihre Funktionen mithilfe der Funktionsrollentypdeklarationen für NDIS deklarieren. Die Funktionsrollentypen sind in Ndis.h definiert.

Eine Liste der Funktionsrollentypen und der zugehörigen Ereignisrückruffunktionen finden Sie unter NDIS-Funktionsdeklarationen der Statischen Treiberüberprüfung.

Jede Rückruffunktion in einem NDIS-Treiber muss durch Angabe des entsprechenden Rollentyps deklariert werden.

Das folgende Codebeispiel zeigt die Funktionsrollentypdeklaration für die Rückruffunktion MiniportPause . In diesem Beispiel heißt die Rückruffunktion myMiniportPause. Der Funktionsrollentyp ist MINIPORT_PAUSE.

MINIPORT_PAUSE myMiniportPause;

Wenn eine Rückruffunktion über eine Funktionsprototypdeklaration verfügt, müssen Sie den Funktionsprototyp durch die Funktionsrollentypdeklaration ersetzen.

Das folgende Beispiel zeigt NDIS-Funktionsdeklarationen aus der Headerdatei MP.h, die sich im SDV-fail_drivers Unterverzeichnis des WDK befindet. Die zugehörigen 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 erforderlich, müssen die Parametertypen, die Sie in der Funktionsdefinition verwenden, mit den Parametertypen des Funktionsprototyps oder in diesem Fall dem Funktionsrollentyp übereinstimmen. SDV hängt von den Funktionssignaturen für die Analyse ab und ignoriert Funktionen, deren Signaturen nicht übereinstimmen.

Sie sollten beispielsweise eine MiniportInterrupt-Funktion mit dem Rollentyp MINIPORT_ISR deklarieren:

MINIPORT_ISR myMPIsr;

Wenn Sie die Interruptroutine myMPIsr implementieren, müssen die Parametertypen mit denen übereinstimmen, die von MINIPORT_ISR verwendet werden, nämlich NDIS_HANDLE, PBOOLEAN und PULONG (Syntax finden Sie in der MiniportInterrupt-Funktion ).

BOOLEAN 
myMPIsr(
    __in  NDIS_HANDLE      MiniportInterruptContext,
    __out PBOOLEAN        QueueMiniportInterruptDpcHandler,
    __out PULONG          TargetProcessors
    ) {
}

Ausführen der Codeanalyse für Treiber zum Überprüfen der Funktionsdeklarationen

Führen Sie die Codeanalyse für Treiber aus, um zu ermitteln, ob der Quellcode vorbereitet ist. Die Codeanalyse für Treiber sucht nach Funktionsrollentypdeklarationen und kann dabei helfen, Funktionsdeklarationen zu identifizieren, die möglicherweise verpasst wurden, oder Sie warnen, wenn die Parameter der Funktionsdefinition nicht mit denen im Funktionsrollentyp übereinstimmen.