Déclaration de fonctions à l’aide de types de rôles de fonction pour les pilotes NDIS

Pour permettre à SDV d’analyser un pilote NDIS, vous devez déclarer vos fonctions en utilisant les déclarations de type de rôle de fonction pour NDIS. Les types de rôle de fonction sont définis dans Ndis.h.

Pour voir la liste des types de rôle de fonction et leurs fonctions de rappel d’événement correspondantes, consultez la section Déclarations de fonction NDIS de Static Driver Verifier.

Chaque fonction de rappel dans un pilote NDIS doit être déclarée en spécifiant le type de rôle correspondant.

L’exemple de code suivant montre la déclaration de type de rôle de fonction pour la fonction de rappel MiniportPause. Dans cet exemple, la fonction de rappel est appelée myMiniportPause. Le type de rôle de fonction est MINIPORT_PAUSE.

MINIPORT_PAUSE myMiniportPause;

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.

L’exemple suivant montre des déclarations de fonction NDIS à partir du fichier d’en-tête MP.h, qui se trouve dans le sous-répertoire SDV fail_drivers du WDK. Les fonctions associées sont déclarées dans Main.c.

\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;

Paramètres de fonction et types de rôle de fonction

Comme requis dans le langage de programmation C, les types de paramètres que vous utilisez dans la définition de la fonction doivent correspondre aux types de paramètres du prototype de fonction, ou dans ce cas, du type de rôle de fonction. SDV dépend des signatures des fonctions pour l’analyse et ignore les fonctions dont les signatures ne correspondent pas.

Par exemple, vous devez déclarer une fonction MiniportInterrupt en utilisant le type de rôle de fonction MINIPORT_ISR :

MINIPORT_ISR myMPIsr;

Lorsque vous implémentez la routine d’interruption, myMPIsr, les types de paramètres doivent correspondre à ceux utilisés par MINIPORT_ISR, à savoir, NDIS_HANDLE, PBOOLEAN et PULONG (voir la fonction MiniportInterrupt pour la syntaxe).

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

Exécution de l’analyse de code pour les pilotes afin de vérifier les déclarations de fonctions

Pour vous aider à déterminer si le code source est prêt, exécutez Analyse de code pour les pilotes. L’Analyse de code pour les pilotes vérifie les déclarations de type de rôle de fonction et peut aider à identifier les déclarations de fonctions qui pourraient avoir été manquées ou vous avertir lorsque les paramètres de la définition de la fonction ne correspondent pas à ceux du type de rôle de fonction.