Vérification des E/S
Le vérificateur de pilotes a deux niveaux de vérification d’E/S :
La vérification d’E/S de niveau 1 est toujours active chaque fois que la vérification d’E/S est sélectionnée.
La vérification d’E/S de niveau 2 est toujours active chaque fois que la vérification d’E/S est sélectionnée dans Windows XP et versions ultérieures.
Voir aussi : Vérification améliorée des E/S dans Windows 7 et versions ultérieures du système d’exploitation Windows, la vérification améliorée des E/S est automatiquement activée lorsque vous sélectionnez Vérification d’E/S. Il n’est pas disponible ou nécessaire pour le sélectionner en tant qu’option distincte.
Vérification des E/S de niveau 1
Lorsque la vérification des E/S de niveau 1 est activée, toutes les adresses IP virtuelles obtenues via IoAllocateIrp sont allouées à partir d’un pool spécial et leur utilisation est suivie.
En outre, le vérificateur de pilotes vérifie les appels d’E/S non valides, notamment :
Tente de libérer un IRP dont le type n’est pas IO_TYPE_IRP
Passage d’objets d’appareil non valides à IoCallDriver
Passe un IRP à IoCompleteRequest qui contient un état non valide ou qui a toujours un jeu de routine d’annulation
Modifications apportées au runtime d’intégration d’un appel à la routine de répartition du pilote
Tente de libérer un IRP qui reste associé à un thread
Transmet un objet d’appareil à IoInitializeTimer qui contient déjà un minuteur initialisé
Transmet une mémoire tampon non valide à IoBuildAsynchronousFsdRequest ou IoBuildDeviceIoControlRequest
Passe un bloc d’état d’E/S à un IRP lorsque ce bloc d’état d’E/S est alloué sur une pile qui a déwound trop loin
Transmet un objet d’événement à un IRP, lorsque cet objet d’événement est alloué sur une pile qui a déwound trop loin
Étant donné que le pool IRP spécial est de taille limitée, la vérification des E/S est la plus efficace lorsqu’elle n’est utilisée que sur un seul pilote à la fois.
Les échecs de vérification d’E/S niveau 1 entraînent l’émission d’une vérification des bogues 0xC9. Le premier paramètre de cette vérification de bogue indique la violation qui s’est produite. Consultez 0xC9 de vérification des bogues (DRIVER_VERIFIER_IOMANAGER_VIOLATION) pour obtenir une description complète des paramètres.
Vérification des E/S de niveau 2
Les erreurs de vérification d’E/S niveau 2 s’affichent de différentes manières : sur l’écran bleu, dans un fichier de vidage sur incident et dans un débogueur de noyau.
Sur l’écran bleu, ces erreurs sont notées par le message IO SYSTEM VERIFICATION ERROR et la chaîne WDM DRIVER ERRORXXX, où XXX est un code d’erreur d’E/S.
Dans un fichier de vidage sur incident, la plupart de ces erreurs sont notées par le message BugCheck 0xC9 (DRIVER_VERIFIER_IOMANAGER_VIOLATION), ainsi que le code d’erreur d’E/S. Dans ce cas, le code d’erreur d’E/S apparaît comme le premier paramètre de la vérification des bogues 0xC9. Le reste est noté par le message Vérification des bogues 0xC4 (DRIVER_VERIFIER_DETECTED_VIOLATION), ainsi qu’un code d’erreur du vérificateur de pilote. Dans ce cas, le code d’erreur du vérificateur de pilote apparaît en tant que premier paramètre de la vérification des bogues 0xC4.
Dans un débogueur de noyau (KD ou WinDbg), ces erreurs sont notées par le message WDM DRIVER ERROR et une chaîne de texte descriptive. Lorsque le débogueur du noyau est actif, il est possible d’ignorer les erreurs de niveau 2 et de reprendre l’opération système. (Cela n’est pas possible avec d’autres vérifications de bogues.)
L’écran bleu, le fichier de vidage sur incident et le débogueur du noyau affichent également des informations supplémentaires. Pour obtenir une description complète de la plupart des messages d’erreur de niveau d’E/S 2, consultez vérification des bogues 0xC9. Pour le reste, consultez vérification des bogues 0xC4.
À compter de Window Vista, l’option Vérification des E/S vérifie les erreurs de pilote suivantes :
Il faut trop de temps pour terminer et annuler les IRPs qui proviennent d’applications en mode utilisateur.
Libération d’un verrou de suppression qui n’a pas encore été acquis.
Appel d’IoReleaseRemoveLock ou IoReleaseRemoveLockAndWait avec un paramètre de balise qui diffère du paramètre de balise utilisé dans l’appel IoAcquireRemoveLock correspondant.
Retour d’une routine de répartition du pilote avec des interruptions désactivées.
Retour d’une routine de distribution de pilotes avec un IRQL modifié.
Retour d’une routine de distribution de pilotes avec les API désactivées. Dans ce cas, le pilote a peut-être appelé KeEnterCriticalRegion plus de fois que KeLeaveCriticalRegion, qui est la cause principale de la vérification des bogues 0x20 (KERNEL_APC_PENDING_DURING_EXIT) et de la vérification des bogues 0x1 (APC_INDEX_MISMATCH).
À compter de Windows 7, l’option Vérification des E/S recherche les erreurs de pilote suivantes :
- Tente de libérer des irps en appelant ExFreePool. Les irps doivent être libérés avec IoFreeIrp.
En outre, vous pouvez utiliser cette option pour détecter un autre bogue de pilote courant : réinitialiser la suppression des verrous. Supprimer les structures de données de verrouillage doit être allouée à l’intérieur des extensions d’appareil. Cela garantit que le gestionnaire d’E/S libère la mémoire qui contient la structure IO_REMOVE_LOCK uniquement lorsque l’objet de l’appareil est supprimé. Si le pilote effectue les trois étapes suivantes, il est possible qu’après l’étape 2, une application ou un pilote conserve toujours une référence à Device1 :
- Alloue la structure IO_REMOVE_LOCK qui correspond à Device1, mais effectue l’allocation en dehors de l’extension de Device1.
- Appelle IoReleaseRemoveLockAndWait quand Device1 est supprimé.
- Appelle IoInitializeRemoveLock pour le même verrou afin de le réutiliser en tant que verrou de suppression pour Device2.
Il est possible qu’après l’étape 2, une application ou un pilote conserve toujours une référence à Device1. L’application ou le pilote peut toujours envoyer des demandes à Device1, même si cet appareil a été supprimé. Par conséquent, il n’est pas sûr de réutiliser la même mémoire qu’un nouveau verrou de suppression jusqu’à ce que le gestionnaire d’E/S supprime Device1. Réinitialiser le même verrou alors qu’un autre thread tente de l’acquérir peut entraîner l’altération du verrou, avec des résultats imprévisibles pour le pilote et l’ensemble du système.
Dans Windows 7 et versions ultérieures du système d’exploitation Windows, la vérification améliorée des E/S est automatiquement activée lorsque vous sélectionnez Vérification d’E/S.
Activation de cette option
Vous pouvez activer la fonctionnalité vérification d’E/S pour un ou plusieurs pilotes à l’aide du Gestionnaire du vérificateur de pilotes ou de la ligne de commande Verifier.exe. Pour plus d’informations, consultez Sélection des options du vérificateur de pilote.
Sur la ligne de commande.
Sur la ligne de commande, l’option Vérification d’E/S est représentée par Bit 4 (0x10). Pour activer la vérification des E/S, utilisez une valeur d’indicateur de 0x10 ou ajoutez 0x10 à la valeur d’indicateur. Par exemple :
verifier /flags 0x10 /driver MyDriver.sys
La fonctionnalité sera active après le démarrage suivant.
Vous pouvez également activer et désactiver la vérification des E/S sans redémarrer l’ordinateur en ajoutant le paramètre /volatile à la commande. Par exemple :
verifier /volatile /flags 0x10 /adddriver MyDriver.sys
Ce paramètre est effectif immédiatement, mais est perdu lorsque vous arrêtez ou redémarrez l’ordinateur. Pour plus d’informations, consultez Utilisation des paramètres volatiles.
La fonctionnalité vérification des E/S est également incluse dans les paramètres standard. Par exemple :
verifier /standard /driver MyDriver.sys
Utilisation du Gestionnaire du vérificateur de pilotes
- Sélectionnez Créer des paramètres personnalisés (pour les développeurs de code), puis cliquez sur Suivant.
- Sélectionnez Sélectionner des paramètres individuels dans une liste complète.
- Sélectionnez (vérifier) la vérification des E/S.
La fonctionnalité vérification des E/S est également incluse dans les paramètres standard. Pour utiliser cette fonctionnalité, dans le Gestionnaire du vérificateur de pilotes, cliquez sur Créer des paramètres standard.