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 |
---|---|
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. |
|
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. |
|
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. |
|
La règle DoubleCompletionLocal spécifie que les pilotes ne doivent pas effectuer une demande d’E/S deux fois. |
|
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. |
|
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. |
|
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. |
|
La règle FileObjectConfigured spécifie qu’un appel à la méthode WdfRequestGetFileObject est précédé d’un appel à WdfDeviceInitSetFileObjectConfig. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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 : |
|
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 : |
|
La règle ReadReqs spécifie que les demandes de lecture ne sont pas passées à des méthodes KMDF inappropriées. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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é. |
|
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. |
|
Règle RequestGetStatusValid qui spécifie que WdfRequestGetStatus doit être appelé pour une requête dans l’une des situations suivantes :
|
|
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. |
|
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. |
|
La règle StopAckWithinEvtIoStop spécifie que la fonction WdfRequestStopAcknowledge est appelée uniquement à partir de la fonction de rappel EvtIoStop . |
|
La règle WdfIoQueueFindRequestFailed spécifie que WdfIoQueueRetrieveFoundRequest ou WdfObjectDereference ne doivent être appelés qu’après que WdfIoQueueFindRequestFailed a retourné STATUS_SUCCESS. |
|
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. |
|
La règle WdfIoQueueRetrieveNextRequest spécifie que WdfIoQueueRetueRieveNextRequest n’est pas appelé après l’appel de WdfIoQueueFindRequest . |
|
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
Sélectionnez votre projet de pilote (.vcxProj) dans Microsoft Visual Studio. Dans le menu Pilote , cliquez sur Lancer le vérificateur de pilote statique....
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).