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 à l’aide des déclarations de type de rôle de fonction pour NDIS. Les types de rôles de fonction sont définis dans Ndis.h.

Pour obtenir la liste des types de rôles de fonction et leurs fonctions de rappel d’événements correspondantes, consultez Déclarations de fonction NDIS du vérificateur de pilote statique.

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 les déclarations de fonction NDIS 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ôles de fonction

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

Par exemple, vous devez déclarer une fonction MiniportInterrupt à l’aide du 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 du code pour les pilotes pour vérifier les déclarations de fonction

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