Utilisation du vérificateur de pilote statique pour rechercher des défauts dans les pilotes Windows

Static Driver Verifier (SDV) utilise un ensemble de règles d’interface et un modèle du système d’exploitation pour déterminer si le pilote interagit correctement avec le système d’exploitation Windows. SDV détecte des défauts dans le code du pilote qui pourraient pointer vers des bogues potentiels dans les pilotes.

SDV peut analyser les pilotes en mode noyau qui sont conformes à l’un des modèles de pilotes suivants : WDM, KMDF, NDIS ou Storport. Pour plus d’informations, consultez Pilotes pris en charge et Déterminer si static Driver Verifier prend en charge votre pilote ou bibliothèque. En outre, SDV fournit une prise en charge limitée (un ensemble de règles fortement restreint axé sur les erreurs générales telles que les déréférencements null) pour les pilotes qui ne suivent pas les modèles de pilotes ci-dessus.

Préparation de votre code source

Utilisez les étapes suivantes pour préparer votre code pour l’analyse.

  1. Déclarer des fonctions fournies par le pilote à l’aide de types de rôles de fonction

    SDV nécessite que les fonctions soient déclarées à l’aide de déclarations de type de rôle de fonction. Par exemple, une routine DriverEntry doit être déclarée à l’aide du type de rôle de fonction DRIVER_INITIALIZE :

    DRIVER_INITIALIZE DriverEntry;
    

    Après la déclaration, vous implémentez (ou définissez) votre routine de rappel comme suit :

    /
    // Driver initialization routine
    //
    NTSTATUS
      DriverEntry(
        _In_ struct _DRIVER_OBJECT  *DriverObject,
        _In_ PUNICODE_STRING  RegistryPath
        )
      {
          // Function body
      }
    

    Chaque modèle de pilote pris en charge a un ensemble de types de rôles de fonction pour les fonctions de rappel de pilote et les routines de répartition. Ces types de rôles de fonction sont déclarés dans les fichiers d’en-tête WDK. Par exemple, voici le prototype de fonction pour le type de rôle DRIVER_INITIALIZE tel qu’il apparaît dans Wdm.h.

    /
    // Define driver initialization routine type.
    //
    _Function_class_(DRIVER_INITIALIZE)
    _IRQL_requires_same_
    typedef
    NTSTATUS
    DRIVER_INITIALIZE (
        _In_ struct _DRIVER_OBJECT *DriverObject,
        _In_ PUNICODE_STRING RegistryPath
        );
    
    typedef DRIVER_INITIALIZE *PDRIVER_INITIALIZE;
    

    Étant donné que les types de rôles de fonction sont déjà définis dans les fichiers d’en-tête WDK, il vous suffit de déclarer vos fonctions de rappel comme étant de ce type. Dans ce cas, vous déclarez DriverEntry de type DRIVER_INITIALIZE. Pour obtenir la liste complète des types de rôles de fonction pour les modèles de pilotes, consultez Utilisation des déclarations de type de rôle de fonction.

  2. Exécuter l’analyse du code pour C/C++

    Pour vous aider à déterminer si le code source est préparé, exécutez l’outil Analyse du code dans Visual Studio. L’outil Analyse du code recherche les déclarations de type de rôle de fonction requises par SDV. L’outil Analyse du code peut vous aider à identifier les déclarations de fonction qui ont pu être 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.

    • Ouvrez votre projet de pilote dans Visual Studio.
    • Dans le menu Générer , cliquez sur Exécuter l’analyse du code sur la solution.

    Les résultats sont affichés dans la fenêtre Analyse du code . Corrigez toutes les déclarations de fonction que vous avez peut-être manquées. Vous pouvez également configurer l’outil Analyse du code afin qu’il s’exécute chaque fois que vous générez votre solution.

    Le tableau suivant présente certains avertissements que l’outil Analyse du code peut trouver dans votre code de pilote. Pour exécuter Static Driver Verifier, votre pilote doit être exempt de ces défauts.

    Analyse du code pour l’avertissement C/C++ Description
    C28101 Le module Pilotes a déduit que la fonction actuelle est une <fonction de type> fonction
    C28022 Les classes de fonctions sur cette fonction ne correspondent pas aux classes de fonctions sur le typedef utilisé pour les définir.
    C28023 La fonction affectée ou transmise doit avoir une annotation _Function_class_ pour au moins l’une des classes
    C28024 Le pointeur de la fonction attribuée est annoté avec la classe de fonction, laquelle n’est pas contenue dans la liste des classes de fonctions.
    C28169 La fonction <> dispatch n’a pas d’annotations _Dispatch_type_
    C28208 La signature de fonction ne correspond pas aux déclarations de fonction

Exécution du vérificateur de pilote statique

  1. Ouvrez votre fichier de projet de pilote (.vcxProj) dans Visual Studio. Dans le menu Pilote , cliquez sur Lancer le vérificateur de pilote statique....

    Cela ouvre l’application Static Driver Verifier, où vous pouvez contrôler, configurer et planifier quand Static Driver Verifier effectue une analyse.

  2. Si votre pilote inclut une bibliothèque, cliquez sur l’onglet Bibliothèques , puis sur Ajouter une bibliothèque pour ajouter la bibliothèque.

    Accédez au répertoire du code source de votre bibliothèque et sélectionnez le fichier projet (.vcxProj). Ajoutez toutes les bibliothèques que votre pilote inclut. Les bibliothèques doivent être ajoutées avant que SDV analyse votre pilote. Lorsque vous démarrez une analyse de votre pilote, SDV analyse également les bibliothèques qui n’ont pas été traitées. Une fois qu’une bibliothèque est traitée, elle est stockée dans le cache SDV global. Pour plus d’informations, consultez Traitement de bibliothèque dans le vérificateur de pilote statique

  3. Vérifiez les paramètres de configuration de Static Driver Verifier. Cliquez sur l'onglet Configurer.

    Configuration du projet La configuration du projet affiche les paramètres de configuration et de plateforme que vous avez sélectionnés dans Visual Studio.

    Ressources Dans la plupart des cas, vous pouvez utiliser les paramètres par défaut. Si SDV signale timeout, GiveUp ou Spaceout, vous pouvez essayer d’ajuster ces paramètres. Pour plus d’informations, consultez Recommandations pour la résolution des problèmes liés au vérificateur de pilote statique.

    Horaire Sélectionnez une heure de début pour que la vérification commence. Le paramètre par défaut consiste à commencer l’analyse immédiatement après avoir cliqué sur Démarrer sous l’onglet Principal . Selon la taille du pilote et sa complexité, l’analyse statique peut prendre beaucoup de temps. Vous souhaiterez peut-être planifier le début de l’analyse au moment le plus pratique pour vous ; par exemple, à la fin de la journée.

    Notes

    ]Veillez à case activée le plan de gestion de l’alimentation de votre ordinateur pour vous assurer que l’ordinateur ne sera pas mis en veille pendant l’analyse.

  4. Cliquez sur l’onglet Règles pour sélectionner les règles d’utilisation de l’API de pilote à vérifier lorsque vous démarrez l’analyse.

    Static Driver Verifier détecte le type de pilote que vous analysez (WDF, WDM, NDIS ou Storport) et sélectionne l’ensemble de règles par défaut pour votre type de pilote. Si c’est la première fois que vous exécutez SDV sur votre pilote, vous devez exécuter l’ensemble de règles par défaut.

    Pour plus d’informations sur les règles, consultez Règles de conformité DDI.

  5. Démarrez l’analyse statique. Cliquez sur l’onglet Principal , puis sur Démarrer. Lorsque vous cliquez sur Démarrer, un message s’affiche pour vous informer que l’analyse statique est planifiée et que l’exécution de l’analyse peut prendre beaucoup de temps. Pour continuer, cliquez sur OK . L’analyse commence à l’heure que vous avez planifiée.

Affichage et analyse des résultats

Au fur et à mesure de l’analyse statique, SDV signale la status de l’analyse. Une fois l’analyse terminée, SDV signale les résultats et les statistiques. Si le pilote ne satisfait pas à une règle d’utilisation de l’API, le résultat est signalé comme un défaut.

Si des problèmes ont été rencontrés, SDV les affiche sur les pages Avertissements et Erreurs . La page Propriétés du pilote affiche les résultats des tests pour certaines propriétés de pilote. Les tests des propriétés du pilote sont utilisés pour identifier les fonctionnalités du pilote afin de qualifier davantage l’analyse. Vous pouvez utiliser les résultats Propriétés du pilote pour confirmer les propriétés attendues et les fonctionnalités prises en charge de votre pilote.

Pour afficher des défauts spécifiques dans le rapport du vérificateur de pilote statique, cliquez sur défaut dans le volet Résultats . Cette opération ouvre la visionneuse de traces, qui affiche une trace du chemin d’accès du code à la violation de règle. Pour plus d’informations, consultez Interprétation des résultats du vérificateur de pilote statique.

Notes

Static Driver Verifier conserve les résultats et les paramètres de l’analyse. Pour effacer les résultats, cliquez sur Nettoyer.

Résolution des problèmes liés aux résultats du vérificateur de pilote statique

Si SDV signale qu’aucun défaut n’a été trouvé, case activée l’onglet Principal pour vous assurer que les points d’entrée sont détectés. Si le pilote ne déclare pas de fonctions à l’aide des types de rôles de fonction, SDV ne peut pas analyser et rechercher les défauts dans le code du pilote. Pour plus d’informations, consultez Utilisation des déclarations de type de rôle de fonction.

Si SDV signale des délais d’expiration ou ne parvient pas à retourner des résultats utiles, vous devrez peut-être modifier quelques options de configuration SDV. Pour plus d’informations sur la résolution des problèmes liés à SDV, consultez Recommandations pour la résolution des problèmes liés au vérificateur de pilote statique.

Déterminer si Static Driver Verifier prend en charge votre pilote ou bibliothèque

Utilisation des déclarations de type de rôle de fonction

Règles du vérificateur de pilote statique

Outil Analyse du code