Partager via


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

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

Contenu de cette section

Rubrique Description

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 ne peut pas être accessible une fois la demande 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 n’est pas accessible (dans 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 la demande terminée, sa mémoire tampon est inaccessible (dans le rappel EvtIoInternalDeviceControl 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 qu’au sein de la fonction de rappel EvtIoDeviceControl , la mémoire tampon de requête d’E/S récupérée n’est pas accessible une fois la demande 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 ne peut pas être accessible une fois la demande d’E/S terminée. Il existe 14 DDIs qui servent de méthodes d’accès à la mémoire tampon possibles.

BufAfterReqCompletedReadA

La règle BufAfterReqCompletedReadA spécifie qu’au sein de la fonction de rappel EvtIoRead , la mémoire tampon de requête d’E/S récupérée n’est pas accessible une fois la demande d’E/S terminée. Il existe 14 DDIs qui servent de méthodes d’accès à la mémoire tampon 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 ne peut pas être accessible une fois la demande 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 demande d’E/S terminée.

ChildDeviceInitApi

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

ControlDeviceDeleted

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 tous les autres DDIS d’initialisation d’objet d’appareil qui configurent une structure WDFDEVICE_INIT pour le périphérique de contrôle doivent être appelés avant WdfDeviceCreate pour le périphérique 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 qu’il ne se quitte de 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 qu’il ne quitte 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 une erreur status lorsque l’appel à WdfDeviceCreate échoue.

DeviceInitAllocate

La règle DeviceInitAllocate spécifie que, pour un appareil PDO ou un objet de périphérique de contrôle, les méthodes d’initialisation de l’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 d’objet de périphérique d’infrastructure et les méthodes d’initialisation FDO de l’infrastructure 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 deux fois la structure d’initialisation de périphérique.

DriverCreate

La règle DriverCreate spécifie qu’un pilote qui utilise l’infrastructure du pilote en mode noyau (KMDF) doit appeler la méthode WdfDriverCreate pour créer un objet 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 lors de l’initialisation d’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 de périphérique 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 des 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 qu’au sein de la fonction de rappel EvtIoInternalDeviceControl , la liste de descripteurs mémoire (MDL) n’est pas accessible une fois la demande d’E/S terminée.

MdlAfterReqCompletedIntIoctlA

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

MdlAfterReqCompletedIoctl

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

MdlAfterReqCompletedIoctlA

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

MdlAfterReqCompletedRead

La règle MdlAfterReqCompletedRead spécifie qu’au sein de la fonction de rappel EvtIoRead , l’objet de liste de descripteurs mémoire (MDL) récupéré n’est pas accessible une fois la demande d’E/S terminée.

MdlAfterReqCompletedReadA

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

MdlAfterReqCompletedWrite

La règle MdlAfterReqCompletedWrite spécifie que dans la fonction de rappel EvtIoWrite , l’objet de liste de descripteurs mémoire (MDL) récupéré ne peut pas être accessible une fois la demande d’E/S terminée.

MdlAfterReqCompletedWriteA

La règle MdlAfterReqCompletedWriteA spécifie que dans la fonction de rappel EvtIoWrite , l’objet de liste de descripteurs mémoire (MDL) récupéré ne peut pas être accessible une fois la demande d’E/S terminée.

MemAfterReqCompletedIntIoctl

La règle MemAfterReqCompletedIntIoctl spécifie que, dans la fonction de rappel EvtIoInternalDeviceControl , l’objet mémoire du framework est inaccessible une fois la demande d’E/S terminée.

MemAfterReqCompletedIntIoctlA

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

MemAfterReqCompletedIoctl

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

MemAfterReqCompletedIoctlA

La règle MemAfterReqCompletedIoctlA spécifie qu’au sein de la fonction de rappel EvtIoDeviceControl , l’objet mémoire du framework n’est pas accessible une fois la demande d’E/S terminée.

MemAfterReqCompletedRead

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

MemAfterReqCompletedReadA

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

MemAfterReqCompletedWrite

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

MemAfterReqCompletedWriteA

La règle MemAfterReqCompletedWriteA spécifie qu’au sein de la fonction de rappel EvtIoWrite , l’objet mémoire du framework n’est pas accessible une fois la demande 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 remplie :

  • Il existe une affectation de NULL qui est déréférencée ultérieurement.
  • Il existe un paramètre/global pour une procédure dans un pilote qui peut être NULL qui sera déréférencé ultérieurement, et il existe un case activée 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 de l’arborescence de trace. Pour plus d’informations sur l’utilisation de la sortie de rapport, consultez Rapport du vérificateur de pilote statique et Présentation de la visionneuse de trace.

PdoDeviceInitAPI

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

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 de périphérique d’infrastructure.

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 d’objet de périphérique 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 de périphérique d’infrastructure 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 développeur Visual Studio, spécifiez DDIUsage.sdv avec l’option /case activée. Par exemple :

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

    Pour plus d’informations, consultez Utilisation du vérificateur de pilote statique pour rechercher des défauts dans les pilotes et commandes MSBuild (Static Driver Verifier).