Partager via


Ensemble de règles IrpProcessing (WDM)

Utilisez ces règles pour vérifier que votre pilote traite correctement les paquets de demandes d’E/S (IRP).

Contenu de cette section

Rubrique Description

CompleteRequest

La règle CompleteRequest vérifie que la routine IoCompleteRequest n’est pas appelée après l’exécution d’une routine d’achèvement et qu’elle ne retourne pas STATUS_MORE_PROCESSING_REQUIRED.

CompleteRequestStatusCheck

La règle CompleteRequestStatusCheck vérifie que la valeur de status d’E/S dans l’IRP correspond à la valeur status retournée par le pilote inférieur.

CompletionRoutineRegistered

La règle CompletionRoutineRegistered spécifie que si la routine de dispatch inscrit une routine IoCompletion à l’aide de IoSetCompletionRoutineEx, la routine de répartition doit ensuite appeler IoCallDriver ou PoCallDriver.

DoubleCompletion

La règle DoubleCompletion (WDM) spécifie que le pilote ne doit pas appeler la routine IoCompleteRequest deux fois pour le même IRP.

IoReuseIrp

La règle IoReuseIrp spécifie qu’un pilote doit utiliser IoReuseIrp uniquement sur les IRP qu’il a précédemment alloués avec IoAllocateIrp.

IoReuseIrp2

La règle IoReuseIrp2 spécifie qu’un pilote doit utiliser IoReuseIrp uniquement sur les IRP qu’il a précédemment alloués dans le pilote.

IoSetCompletionExCompleteIrp

La règle IoSetCompletionExCompleteIrp spécifie que la routine IoSetCompletionRoutineEx retourne une valeur NTSTATUS. Le pilote doit case activée cette valeur pour déterminer si la routine IoCompletion a été correctement enregistrée avant d’appeler IoCallDriver ou PoCallDriver et si IoSetCompletionRoutineEx échoue, l’IRP doit être effectué et la routine de distribution doit être retournée.

IoSetCompletionRoutineExCheck

La règle IoSetCompletionRoutineExCheck spécifie que la routine IoSetCompletionRoutineEx retourne une valeur NTSTATUS. Le pilote doit case activée cette valeur pour déterminer si la routine IoCompletion a été correctement inscrite avant d’appeler IoCallDriver ou PoCallDriver.

IoSetCompletionRoutineExCheckDeviceObject

La règle IoSetCompletionRoutineExCheckDeviceObject spécifie que si l’objet d’appareil actuel n’est pas passé à IoSetCompletionRoutineEx et que l’objet d’appareil inférieur l’est, cela peut entraîner une condition de concurrence dans laquelle l’objet d’appareil actuel peut être déchargé même si la routine d’achèvement n’a pas été exécutée.

IoSetCompletionRoutineNonPnpDriver

La règle IoSetCompletionRoutineNonPnpDriver spécifie que les pilotes qui ne sont pas des pilotes PnP doivent utiliser IoSetCompletionRoutineEx et non IoSetCompletionRoutine.

IrpCancelField

La règle IrpCancelField spécifie que le pilote case activée la valeur du membre Irp-Cancel> lors de la définition d’une routine d’annulation sur un IRP qu’il a suspendu.

IrpProcessingComplete

La règle IrpProcessingComplete spécifie que si une routine de répartition retourne STATUS_SUCCESS, l’IRP doit avoir été effectuée par le pilote lui-même ou par un pilote de niveau inférieur.

LowerDriverReturn

La règle LowerDriverReturn spécifie qu’après avoir utilisé PoCallDriver ou IoCallDriver pour appeler un pilote inférieur, le pilote enregistre le retour status de l’appel et transmet le retour status qu’il a reçu à la routine de distribution.

SignalEventInCompletion

La règle SignalEventInCompletion spécifie que lors du traitement d’une IRP asynchrone, le pilote doit appeler keSetEvent dans la routine d’achèvement lorsque l’indicateur Irp-PendingReturned> est défini.

SignalEventInCompletion2

La règle SignalEventInCompletion2 spécifie que lors du traitement d’une IRP asynchrone, le pilote doit appeler keSetEvent dans la routine d’achèvement lorsque l’indicateur Irp-PendingReturned> est défini.

SignalEventInCompletion3

La règle SignalEventInCompletion3 spécifie que lors du traitement d’un IRP asynchrone, le pilote doit appeler keSetEvent dans la routine d’achèvement lorsque l’indicateur Irp-PendingReturned> est défini.

StartIoCancel

La règle StartIoCancel spécifie que le pilote ne doit pas appeler IoSetStartIoAttributes avec le paramètre NonCancelable défini sur FALSE avant d’appeler IoSetCancelRoutine avec une routine d’annulation non NULL.

StartIoRecursion

La règle StartIoRecursion spécifie que si la routine StartIo d’un pilote inclut un appel à IoStartNextPacket, le pilote doit d’abord appeler IoSetStartIoAttributes avec l’attribut DeferredStartIo défini sur TRUE. Sinon, une récursivité infinie peut en résulter.

PnpRemove

La règle PnpRemove spécifie que le pilote ne peut pas effectuer IRP_MN_SURPRISE_REMOVAL, IRP_MN_CANCEL_REMOVE_DEVICE, IRP_MN_CANCEL_STOP_DEVICE ou IRP_MN_REMOVE_DEVICE demandes ayant échoué.

PnpSurpriseRemove

La règle PnpSurpriseRemove spécifie que le pilote n’appelle pas IoDeleteDevice ou IoDetachDevice lors du traitement d’une demande de IRP_MN_SURPRISE_REMOVAL .

PowerDownAllocate

La règle PowerDownAllocate spécifie qu’un pilote FDO et FIDO ne doivent pas allouer de mémoire lors du traitement d’une demande de IRP_MN_SET_POWER pour une transition SystemPowerState qui passe de s0 à [S1... S5].

PowerDownFail

La règle PowerDownFail spécifie qu’un pilote FDO ou FIDO ne doit pas faire échouer une demande de IRP_MN_SET_POWER lorsque l’appareil est hors tension. Cette règle s’applique uniquement aux pilotes FDO et FIDO.

PowerIrpDDIs

La règle PowerIrpDDIs spécifie que lorsqu’un pilote traite un système ou un appareil IRP_MJ_POWER avec IRP_MN_SET_POWER, il ne doit pas appeler des DDIs qui ne peuvent être appelées qu’à PASSIVE_LEVEL.

PowerUpFail

La règle PowerUpFail spécifie qu’un pilote FDO ou FIDO ne doit pas échouer une demande de IRP_MN_SET_POWER lorsque l’appareil est mis sous tension.

PnpIrpCompletion

La règle PnpIrpCompletion vérifie qu’un pilote FDO transmet des IRP PnP au pilote inférieur.

WmiComplete

La règle WmiComplete spécifie que lors du traitement d’une IRP mineure WMI, le pilote appelle IoCompleteRequest avant de revenir de la routine DispatchSystemControl .

WmiForward

La règle WmiForward spécifie que le pilote doit transférer les irps secondaires WMI lorsque le transfert est nécessaire.

Pour sélectionner l’ensemble de règles IrpProcessing

  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 IrpProcessing.

    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 IrpProcessing.sdv avec l’option /case activée. Par exemple :

    msbuild /t:sdv /p:Inputs="/check:IrpProcessing.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).