Partager via


Jeu de règles d’utilisation DDI (KMDF)

Utilisez ces règles pour vérifier que votre pilote utilise les DDIs KMDF correctement.

Dans cette section

Sujet Descriptif

BufAfterReqCompletedIoctl

La règle BufAfterReqCompletedIoctl spécifie que dans la fonction de rappel EvtIoDeviceControl , la mémoire tampon de requête d’E/S récupérée est inaccessible une fois la requête d’E/S terminée.

BufAfterReqCompletedIntIoctl

La règle BufAfterReqCompletedIntIoctl spécifie qu’une fois qu’une demande est terminée, sa mémoire tampon ne peut pas être accessible (à l’intérieur de la fonction de rappel EvtIoInternalDeviceControl uniquement). La mémoire tampon est récupérée en appelant WdfRequestRetrieveOutputBuffer ou WdfRequestRetrieveUnsafeUserOutputBuffer ou WdfRequestRetrieveInputBuffer ou WdfRequestRetrieveUnsafeUserInputBuffer.

BufAfterReqCompletedIntIoctlA

La règle BufAfterReqCompletedIntIoctlA vérifie qu’une fois qu’une demande est terminée, sa mémoire tampon ne peut pas être accessible (à l’intérieur de EvtIoInternalDeviceControl callback uniquement). La mémoire tampon a été récupérée en appelant WdfRequestRetrieveInputBuffer ou WdfRequestRetrieveOutputBuffer ou WdfRequestRetrieveUnsafeUserInputBuffer ou WdfRequestRetrieveUnsafeUserOutputBuffer.

BufAfterReqCompletedIoctlA

La règle BufAfterReqCompletedIoctlA spécifie que dans la fonction de rappel EvtIoDeviceControl , la mémoire tampon de requête d’E/S récupérée est inaccessible une fois la requête d’E/S terminée.

BufAfterReqCompletedRead

La règle BufAfterReqCompletedRead spécifie que dans la fonction de rappel EvtIoRead , la mémoire tampon de requête d’E/S récupérée est inaccessible une fois la requête d’E/S terminée. Il existe 14 DDIS qui servent de méthodes d’accès aux mémoires tampons possibles.

BufAfterReqCompletedReadA

La règle BufAfterReqCompletedReadA spécifie que dans la fonction de rappel EvtIoRead , la mémoire tampon de requête d’E/S récupérée est inaccessible une fois la requête d’E/S terminée. Il existe 14 DDIS qui servent de méthodes d’accès aux mémoires tampons possibles.

BufAfterReqCompletedWrite

La règle BufAfterReqCompletedWrite spécifie que dans la fonction de rappel EvtIoWrite , la mémoire tampon de requête d’E/S récupérée est inaccessible une fois la requête d’E/S terminée.

BufAfterReqCompletedWriteA

La règle BufAfterReqCompletedWriteA spécifie que dans la fonction de rappel EvtIoWrite , la mémoire tampon de requête d’E/S récupérée est inaccessible une fois la requête d’E/S terminée.

ChildDeviceInitApi

La règle ChildDeviceInitApi spécifie que pour un appareil enfant, les méthodes d’initialisation d’objet d’appareil framework doivent être appelées avant que le pilote appelle la méthode WdfDeviceCreate pour l’objet d’appareil enfant.

AppareilDeContrôleSupprimé

La règle ControDeviceDeleted spécifie que si un pilote PnP crée un objet de périphérique de contrôle, le pilote doit supprimer l'objet de périphérique de contrôle dans l'une des fonctions de rappel de nettoyage avant le déchargement du pilote.

ControlDeviceInitAPI

La règle ControlDeviceInitAPI spécifie que WdfControlDeviceInitAllocate et toutes les autres DDIS d’initialisation d’objet d’appareil qui configurent une structure WDFDEVICE_INIT pour l’appareil de contrôle doivent être appelées avant WdfDeviceCreate pour l’appareil de contrôle.

CtlDeviceFinishInitDeviceAdd

La règle CtlDeviceFinishInitDeviceAdd spécifie que si un pilote crée un objet de périphérique de contrôle dans une fonction de rappel EvtDriverDeviceAdd , il doit appeler WdfControlFinishInitializing une fois l’appareil créé et avant de quitter la fonction de rappel EvtDriverDeviceAdd . Cette règle ne s’applique pas aux pilotes non PnP.

CtlDeviceFinishInitDrEntry

La règle CtlDeviceFinishInitDrEntry spécifie que si un pilote crée un objet de périphérique de contrôle dans une fonction de rappel DriverEntry , il doit appeler WdfControlFinishInitializing une fois l’appareil créé et avant de quitter la fonction de rappel EvtDriverDeviceAdd . Cette règle ne s’applique pas aux pilotes non PnP.

DeviceCreateFail

La règle DeviceCreateFail spécifie que EVT_WDF_DRIVER_DEVICE_ADD retourne un état d’erreur lorsque l’appel à WdfDeviceCreate échoue.

DeviceInitAllocate

La règle DeviceInitAllocate spécifie que, pour un appareil PDO ou un objet d’appareil de contrôle, les méthodes d’initialisation d’objet d’appareil framework WdfPdoInitAllocate ou WdfControlDeviceInitAllocate doivent être appelées avant que le pilote appelle WdfDeviceCreate.

DeviceInitAPI

Pour un appareil FDO, les méthodes d’initialisation de l'objet de périphérique de framework et les méthodes d’initialisation FDO de framework doivent être appelées avant que le pilote appelle la méthode WdfDeviceCreate pour l'objet de périphérique.

DoubleDeviceInitFree

La règle DoubleDeviceInitFree spécifie que les pilotes ne doivent pas libérer la structure d’initialisation des appareils deux fois.

DriverCreate

La règle DriverCreate spécifie qu’un pilote qui utilise KMDF (Kernel Mode Driver Framework) doit appeler la méthode WdfDriverCreate pour créer un objet de pilote d’infrastructure à partir de sa routine DriverEntry .

InitFreeDeviceCallback

La règle InitFreeDeviceCallback spécifie qu’un pilote doit appeler WdfDeviceInitFree si le pilote rencontre une erreur pendant qu’il initialise un nouvel objet de périphérique d’infrastructure et si le pilote a reçu la structure WDFDEVICE_INIT d’un appel à WdfControlDeviceInitAllocate.

InitFreeDeviceCreate

La règle InitFreeDeviceCreate spécifie qu’un pilote doit appeler WdfDeviceInitFree au lieu de WdfDeviceCreate si une erreur se produit dans l’une des méthodes d’initialisation de l’objet d’appareil et si le pilote a reçu la structure WDFDEVICE_INIT d’un appel à WdfControlDeviceInitAllocate.

InitFreeDeviceCreateType2

La règle InitFreeDeviceCreateType2 spécifie qu’un pilote ne doit pas appeler WdfDeviceCreate après avoir appelé WdfDeviceInitFree.

InitFreeDeviceCreateType4

La règle InitFreeDeviceCreateType4 spécifie qu’un pilote doit appeler WdfDeviceInitFree si le pilote rencontre une erreur pendant qu’il appelle WdfDeviceCreate et si le pilote a reçu la structure WDFDEVICE_INIT d’un appel à WdfControlDeviceInitAllocate.

InitFreeNull

La règle InitFreeNull spécifie que les DDIs recevant PWDFDEVICE_INIT en tant que paramètre ne peuvent pas être appelés à l’aide d’un pointeur NULL vers une structure WDFDEVICE_INIT .

MdlAfterReqCompletedIntIoctl

La règle MdlAfterReqCompletedIntIoctl spécifie que dans la fonction de rappel EvtIoInternalDeviceControl , la liste de descripteurs de mémoire (MDL) n’est pas accessible une fois la requête d’E/S terminée.

MdlAfterReqCompletedIntIoctlA

La règle MdlAfterReqCompletedIntIoctlA spécifie que dans la fonction de rappel EvtIoInternalDeviceControl , la liste de descripteurs de mémoire (MDL) n’est pas accessible une fois la requête d’E/S terminée.

MdlAfterReqCompletedIoctl

La règle MdlAfterReqCompletedIoctl spécifie que dans la fonction de rappel EvtIoDeviceControl , la liste de descripteur de mémoire (MDL) ne peut pas être accessible une fois la requête d’E/S terminée.

MdlAfterReqCompletedIoctlA

La règle MdlAfterReqCompletedIoctlA spécifie que dans la fonction de rappel EvtIoDeviceControl , la liste de descripteurs de mémoire (MDL) n’est pas accessible une fois la requête d’E/S terminée.

MdlAfterReqCompletedRead

La règle MdlAfterReqCompletedRead spécifie que dans la fonction de rappel EvtIoRead , l’objet de descripteur de mémoire récupéré (MDL) est inaccessible une fois la requête d’E/S terminée.

MdlAfterReqCompletedReadA

La règle MdlAfterReqCompletedReadA spécifie que dans la fonction de rappel EvtIoRead , l’objet de descripteur mémoire récupéré est inaccessible une fois la requête d’E/S terminée.

MdlAfterReqCompletedWrite

La règle MdlAfterReqCompletedWrite spécifie que dans la fonction de rappel EvtIoWrite , l’objet descripteur de mémoire récupéré est inaccessible une fois la requête d’E/S terminée.

MdlAfterReqCompletedWriteA

La règle MdlAfterReqCompletedWriteA spécifie que dans la fonction de rappel EvtIoWrite , l’objet de la liste de descripteurs de mémoire (MDL) récupéré est inaccessible une fois la requête d’E/S terminée.

MemAfterReqCompletedIntIoctl

La règle MemAfterReqCompletedIntIoctl spécifie que dans la fonction de rappel EvtIoInternalDeviceControl , l’objet mémoire de l’infrastructure n’est pas accessible une fois la requête d’E/S terminée.

MemAfterReqCompletedIntIoctlA

La règle MemAfterReqCompletedIntIoctlA spécifie que dans la fonction de rappel EvtIoInternalDeviceControl , l’objet mémoire du framework n’est pas accessible une fois la requête d’E/S terminée.

MemAfterReqCompletedIoctl

La règle MemAfterReqCompletedIoctl spécifie que dans la fonction de rappel EvtIoDeviceControl , l’objet mémoire du framework n’est pas accessible une fois la requête d’E/S terminée.

MemAfterReqCompletedIoctlA

La règle MemAfterReqCompletedIoctlA spécifie que dans la fonction de rappel EvtIoDeviceControl , l’objet mémoire du framework n’est pas accessible une fois la requête d’E/S terminée.

MemAfterReqCompletedRead

La règle MemAfterReqCompletedRead spécifie que dans la fonction de rappel EvtIoRead , l’objet mémoire de l’infrastructure n’est pas accessible une fois la requête d’E/S terminée.

MemAfterReqCompletedReadA

La règle MemAfterReqCompletedReadA spécifie que dans la fonction de rappel EvtIoRead , l’objet mémoire de l’infrastructure n’est pas accessible une fois la requête d’E/S terminée.

MemAfterReqCompletedWrite

La règle MemAfterReqCompletedWrite spécifie que dans la fonction de rappel EvtIoWrite , l’objet mémoire de l’infrastructure n’est pas accessible une fois la requête d’E/S terminée.

MemAfterReqCompletedWriteA

La règle MemAfterReqCompletedWriteA spécifie que dans la fonction de rappel EvtIoWrite , l’objet mémoire du framework n’est pas accessible une fois la requête d’E/S terminée.

NullCheck

La règle NullCheck vérifie qu'une valeur NULL à l'intérieur du code du pilote n'est pas déréférencée ultérieurement dans le pilote. Cette règle signale un défaut si l’une de ces conditions est vraie :

  • Il existe une affectation de NULL qui est déréférencée ultérieurement.
  • Il existe un paramètre global ou une procédure dans un pilote qui peut être NULL et qui est déréférencée ultérieurement. Il y a une vérification explicite dans le pilote qui suggère que la valeur initiale du pointeur peut être NULL.

Avec les violations de règle NullCheck, les instructions de code les plus pertinentes sont mises en surbrillance dans le volet d’arborescence de trace. Pour plus d'informations sur l'utilisation de la sortie du rapport, consultez Rapport du Vérificateur de Pilotes Statique et Comprendre la Visionneuse de Trace.

PdoDeviceInitAPI

La règle PdoDeviceInitAPI spécifie que WdfPdoInitAllocate et toutes les autres DDIS d’initialisation d’objet d’appareil qui configurent une structure WDFDEVICE_INIT pour l’objet d’appareil physique (PDO) doivent être appelés avant que le pilote appelle WdfDeviceCreate pour l’objet PDO.

PdoInitFreeDeviceCallback

La règle PdoInitFreeDeviceCallback spécifie que le pilote doit appeler WdfDeviceInitFree si une erreur se produit lorsque le pilote appelle une fonction d’initialisation d’objet d’appareil framework.

PdoInitFreeDeviceCreate

La règle PdoInitFreeDeviceCreate spécifie qu’un pilote doit appeler WdfDeviceInitFree au lieu de WdfDeviceCreate si une erreur se produit dans l’une des fonctions d’initialisation de l’objet d’appareil et si le pilote a reçu la structure WDFDEVICE_INIT d’un appel à WdfPdoInitAllocate.

PdoInitFreeDeviceCreateType2

La règle PdoInitFreeDeviceCreateType2 spécifie qu’un pilote ne doit pas appeler WdfDeviceCreate après avoir appelé WdfDeviceInitFree.

PdoInitFreeDeviceCreateType4

La règle PdoInitFreeDeviceCreateType4 spécifie que le pilote doit appeler WdfDeviceInitFree si une erreur se produit lorsque le pilote appelle WdfDeviceCreate.

ControlDeviceInitAllocate

La règle ControlDeviceInitAllocate spécifie que pour un objet de périphérique de contrôle, le pilote doit appeler la méthode d’initialisation de l’objet d’appareil framework WdfControlDeviceInitAllocate avant que le pilote appelle WdfDeviceCreate.

InputBufferAPI

La règle InputBufferAPI spécifie que les DDIs corrects pour la récupération de mémoire tampon sont utilisés dans la fonction de rappel EvtIoRead. Dans la fonction de rappel EvtIoRead , les DDIs suivants ne peuvent pas être appelés pour la récupération de mémoire tampon :

Pour sélectionner l’ensemble de règles d’utilisation DDI

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

  2. Cliquez sur l’onglet Règles . Sous Ensembles de règles, sélectionnez DDIUsage.

    Pour sélectionner l’ensemble de règles par défaut à partir d’une fenêtre d’invite de commandes du développeur Visual Studio, spécifiez DDIUsage.sdv avec l’option /check . Par exemple:

    msbuild /t:sdv /p:Inputs="/check:DDIUsage.sdv" mydriver.VcxProj /p:Configuration="Win8 Release" /p:Platform=Win32
    

    Pour plus d’informations, veuillez consulter la section Utilisation de Static Driver Verifier pour rechercher des défauts dans les pilotes et les commandes MSBuild (Static Driver Verifier).