Partager via


Jeu de règles RequestProcessing (KMDF)

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

Contenu de cette section

Rubrique Description

ChangeQueueState

La règle ChangeQueueState spécifie que le pilote WDF n’essaie pas de modifier l’état de la file d’attente à partir de threads simultanés ou n’appelle pas les DDIs de changement d’état les uns après les autres à partir du même thread. Les fonctions de rappel de changement d’état de file d’attente sont WdfIoQueueStop, WdfIoQueueStopSynchronously, WdfIoQueuePurge,WdfIoQueuePurgeSynchronously, WdfIoQueueDrain, WdfIoQueueDrainSynchronously, WdfIoQueueStopAndPurge et WdfIoQueueStopAndPurgeSynchronously. Si ces DDIS sont appelés lorsqu’un changement d’état de file d’attente est déjà en cours, un ordinateur se bloque ou ne répond plus.

CompleteCanceledReq

La règle CompleteCanceledReq spécifie que si la requête a déjà été annulée, la requête n’est plus valide et le pilote ne doit pas la terminer. Bien que le pilote supprime la marque d’une demande qui a été précédemment marquée comme annulable, il doit case activée que la demande n’a pas déjà été annulée. Si le pilote n’effectue pas cette case activée, il peut effectuer une demande qui a été libérée.

DoubleCompletion

La règle DoubleCompletion spécifie que les pilotes ne doivent pas effectuer une demande d’E/S deux fois. Les méthodes suivantes ne doivent pas être appelées deux fois dans une ligne pour la même demande : WdfRequestComplete, WdfRequestCompleteWithInformation, WdfRequestCompleteWithPriorityBoost.

DoubleCompletionLocal

La règle DoubleCompletionLocal spécifie que les pilotes ne doivent pas effectuer une demande d’E/S deux fois.

EvtIoStopCancel

La règle EvtIoStopCancel spécifie que dans la fonction de rappel EvtIoStop , le pilote appelle l’une des méthodes suivantes pour les demandes d’E/S qui ne sont pas annulables.

EvtIoStopCompleteOrStopAck

La règle EvtIoStopCompleteOrStopAck spécifie que dans la fonction de rappel EvtIoStop , le pilote appelle l’une des méthodes suivantes pour chaque demande d’E/S présentée par le framework. Si ce n’est pas le cas, le pilote peut empêcher le système d’entrer dans un autre état d’alimentation inférieure.

EvtSurpriseRemoveNoSuspendQueue

La règle EvtSurpriseRemoveNoSuspendQueue spécifie que les pilotes WDF ne doivent pas vider, arrêter ou vider la file d’attente de la fonction de rappel EvtDeviceSurpriseRemoval . Les fonctions de rappel d’E/S autogérées doivent être utilisées. La fonction de rappel EvtDeviceSurpriseRemoval n’est pas synchronisée avec le chemin d’accès hors tension.

FileObjectConfigured

La règle FileObjectConfigured spécifie qu’un appel à la méthode WdfRequestGetFileObject est précédé d’un appel à WdfDeviceInitSetFileObjectConfig.

InternalIoctlReqs

La règle InternalIoctlReqs spécifie que les demandes IOCTL internes ne sont pas passées à des interfaces de pilote de périphérique (DDIs) kmDF inappropriées.

InvalidReqAccess

La règle InvalidReqAccess spécifie que les demandes ne sont pas accessibles une fois qu’elles sont terminées ou annulées. Cette règle peut chevaucher d’autres règles, telles que les règles qui case activée pour la double saisie semi-automatique, ou les règles qui case activée pour les demandes ont été marquées comme annulables deux fois.

InvalidReqAccessLocal

La règle InvalidReqAccessLocal spécifie que les demandes créées localement ne sont pas accessibles une fois qu’elles sont terminées ou annulées. Cette règle peut chevaucher d’autres règles, telles que les règles qui case activée pour la double saisie semi-automatique, ou les règles qui case activée pour les demandes ont été marquées comme annulables deux fois.

IoctlReqs

La règle IoctlReqs spécifie que les demandes IOCTL ne doivent pas être passées à une requête KMDF inappropriée ou à des interfaces de pilote de périphérique (DDIs) d’envoi.

MarkCancOnCancReqLocal

La règle MarkCancOnCancReqLocal spécifie que la méthode WdfRequestMarkCancelable ne peut pas être appelée deux fois consécutives sur la même demande d’E/S.

NoIoQueuePurgeSynchronously

La règle NoIoQueuePurgeSynchronously vérifie que les pilotes WDF n’appellent pas les fonctions WdfIoQueueStopSynchronously, WdfIoQueueDrainSynchronously, WdfIoQueueStopAndPurgeSynchronously ou WdfIoQueuePurgeSynchronously à partir des fonctions de rappel d’événement d’objet de file d’attente EvtIO suivantes :

OutputBufferAPI

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

ReadReqs

La règle ReadReqs spécifie que les demandes de lecture ne sont pas passées à des méthodes KMDF inappropriées.

ReqCompletionRoutine

La règle ReqCompletionRoutine spécifie qu’une routine d’achèvement doit être définie avant qu’une requête soit envoyée à une cible d’E/S.

ReqDelete

La règle ReqDelete spécifie que les demandes créées par le pilote ne sont pas passées aux fonctions WdfRequestCompleteXxx . Au lieu de cela, la demande doit être supprimée à l’achèvement.

ReqIsCancOnCancReq

La règle ReqIsCancOnCancReq spécifie que la méthode WdfRequestIsCanceled ne peut être appelée que sur une demande qui n’est pas marquée comme annulable.

ReqMarkCancelableSend

La règle ReqMarkCancelableSend spécifie que les demandes transférées par le pilote ne sont pas marquées comme annulables en appelant WdfRequestMarkCancelable.

RequestCompleted

La règle DeferredRequestCompleted spécifie que pour un pilote sans filtre, chaque requête présentée à la file d’attente d’E/S par défaut du pilote doit être terminée, sauf si la demande est différée ou transférée, ou si WdfRequestStopAcknowledge est appelé.

RequestFormattedValid

La règle RequestFormattedValid spécifie que le pilote met en forme toutes les requêtes, à l’exception d’une demande de WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET, avant de les envoyer à une cible d’E/S.

RequestGetStatusValid

Règle RequestGetStatusValid qui spécifie que WdfRequestGetStatus doit être appelé pour une requête dans l’une des situations suivantes :

  • Lorsque WdfRequestSend retourne un échec.
  • Lorsque la demande a été envoyée avec WDF_REQUEST_SEND_OPTION_SYNCHRONOUS.

RequestSendAndForgetNoFormatting

La règle RequestSendAndForgetNoFormatting vérifie que le pilote ne met pas en forme une requête à l’aide des fonctions de mise en forme cible d’E/S avant de l’envoyer à une cible d’E/S avec l’option d’envoi WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET.

RequestSendAndForgetNoFormatting2

La règle RequestSendAndForgetNoFormatting2 vérifie que le pilote ne met pas en forme une requête à l’aide des fonctions de mise en forme cible d’E/S avant de l’envoyer à une cible d’E/S avec l’option d’envoi WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET.

StopAckWithinEvtIoStop

La règle StopAckWithinEvtIoStop spécifie que la fonction WdfRequestStopAcknowledge est appelée uniquement à partir de la fonction de rappel EvtIoStop .

WdfIoQueueFindRequestFailed

La règle WdfIoQueueFindRequestFailed spécifie que WdfIoQueueRetrieveFoundRequest ou WdfObjectDereference ne doivent être appelés qu’après que WdfIoQueueFindRequestFailed a retourné STATUS_SUCCESS.

WdfIoQueueRetrieveFoundRequest

La règle WdfIoQueueRetrieveFoundRequest spécifie que la méthode WdfIoQueueRetueveFoundRequest est appelée uniquement après que WdfIoQueueFindRequest est appelé et retourné STATUS_SUCCESS et qu’aucun WdfObjectDereference n’est appelé sur la même requête.

WdfIoQueueRetrieveNextRequest

La règle WdfIoQueueRetrieveNextRequest spécifie que WdfIoQueueRetueRieveNextRequest n’est pas appelé après l’appel de WdfIoQueueFindRequest .

WriteReqs

La règle WriteReqs spécifie qu’une demande d’écriture n’est pas passée à des méthodes KMDF inappropriées.

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

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

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

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