Bug Check 0xD1 : DRIVER_IRQL_NOT_LESS_OR_EQUAL
Le bug check DRIVER_IRQL_NOT_LESS_OR_EQUAL a une valeur de 0x000000D1. Cela indique qu’un pilote en mode noyau a tenté d’accéder à une mémoire pageable alors que l’IRQL de processus était trop élevé.
Important
Cet article s’adresse aux programmeurs. Si vous êtes un client et que vous avez reçu ce code d’erreur d’écran bleu en utilisant votre ordinateur, consultez Résoudre les erreurs d’écran bleu.
Paramètres de DRIVER_IRQL_NOT_LESS_OR_EQUAL
Paramètre | Description |
---|---|
1 |
Mémoire référencée. |
2 |
IRQL au moment de la référence. |
3 |
|
4 |
Adresse ayant référencé la mémoire. Utilisez ln (list nearest symbols) sur cette adresse pour voir le nom de la fonction. |
Cause
Pour déterminer la cause, il faut utiliser le débogueur Windows, avoir de l’expérience en programmation et accéder au code source du module défaillant.
En général, lorsque cette erreur survient, un pilote a tenté d’accéder à une adresse qui est pageable (ou qui est complètement invalide) alors que le niveau de requête d’interruption (IRQL) était trop élevé. Cela peut être provoqué par :
Déréférencement d’un pointeur incorrect (tel qu’un pointeur null ou libéré) lors de l’exécution au niveau DISPATCH_LEVEL ou au-dessus.
Accès aux données paginables au niveau DISPATCH_LEVEL ou au-dessus.
Exécution de code paginable au niveau DISPATCH_LEVEL ou au-dessus.
Si un pilote responsable de l’erreur peut être identifié, son nom est affiché sur l’écran bleu et stocké en mémoire à l’emplacement (PUNICODE_STRING) KiBugCheckDriver. Vous pouvez utiliser dx (display debugger object model expression), une commande du débogueur, pour afficher ceci : dx KiBugCheckDriver.
Ce contrôle de bogue est généralement causé par des pilotes qui ont utilisé des adresses mémoire incorrectes.
Les causes possibles de la faute de page incluent les événements suivants :
La fonction a été marquée comme pageable et s’exécutait à un IRQL élevé (ce qui inclut l’obtention d’un verrou).
L’appel de fonction a été fait vers une fonction dans un autre pilote, et ce pilote a été déchargé.
La fonction a été appelée en utilisant un pointeur de fonction qui était un pointeur invalide.
Pour plus d’informations sur les IRQL de Windows, veuillez consulter la section Windows Internals 7th Edition Part 1 de Pavel Yosifovich, Mark E.Russinovich, David A.Solomon et Alex Ionescu.
Résolution
Si le problème est causé par le pilote que vous développez, assurez-vous que la fonction qui s’exécutait au moment du contrôle de bogue :
- N’est pas marquée comme pageable
- N’appelle aucune autre fonction inline qui pourrait être paginée.
L’extension de débogueur !analyze affiche des informations sur le contrôle d’erreur et peut être utile pour déterminer la cause racine. L’exemple suivant est la sortie de !analyze.
DRIVER_IRQL_NOT_LESS_OR_EQUAL (d1)
An attempt was made to access a pageable (or completely invalid) address at an
interrupt request level (IRQL) that is too high. This is usually
caused by drivers using improper addresses.
If kernel debugger is available get stack backtrace.
Arguments:
Arg1: fffff808add27150, memory referenced
Arg2: 0000000000000002, IRQL
Arg3: 0000000000000000, value 0 = read operation, 1 = write operation
Arg4: fffff808adc386a6, address which referenced memory
Si un pilote responsable de l’erreur peut être identifié, son nom est affiché sur l’écran bleu et stocké en mémoire à l’emplacement (PUNICODE_STRING) KiBugCheckDriver. Vous pouvez utiliser dx (afficher l’expression du modèle d’objet de débogueur), une commande de débogueur, pour l’afficher : dx KiBugCheckDriver
.
0: kd> dx KiBugCheckDriver
KiBugCheckDriver : 0xffffc6092de892c8 : "Wdf01000.sys" [Type: _UNICODE_STRING *]
Si une trame de piégeage est disponible dans le fichier de vidage, utilisez la commande .trap pour définir votre contexte à l’adresse fournie.
Pour commencer à déboguer ce type de contrôle de bogue, examinez la trace d’appels en utilisant les commandes k, kb, kc, kd, kp, kP, kv (display stack backtrace).
Dans le débogueur, exécutez la commande !irql pour afficher des informations sur l’IRQL d’un processeur sur l’ordinateur cible avant l’interruption du débogueur. Par exemple :
0: kd> !irql
Debugger saved IRQL for processor 0x0 -- 2 (DISPATCH_LEVEL)
Dans la majorité des cas de ce type de contrôle de bogue, le problème n’est pas le niveau IRQL, mais plutôt la mémoire qui est accédée.
Étant donné que ce contrôle de bogue est généralement causé par des pilotes qui ont utilisé des adresses mémoire incorrectes, utilisez les paramètres 1, 3 et 4 pour approfondir l’enquête.
Utilisez ln (list nearest symbols) avec le paramètre 4 pour voir le nom de la fonction qui a été appelée. Examinez également la sortie de !analyze pour voir si le code fautif est identifié.
Utilisez !pool sur l’adresse du paramètre 1 pour voir s’il s’agit d’un pool paginé. Utilisez !address et la commande avancée !pte pour en savoir plus sur cette zone de mémoire.
Utilisez les commandes display memory pour examiner la mémoire référencée dans la commande du paramètre 1.
Utilisez les commandes u, ub, uu (unassemble) pour examiner le code à l’adresse qui a référencé la mémoire dans le paramètre 4.
Utilisez la commande lm t n
pour lister les modules chargés en mémoire. Utilisez !memusage pour examiner l’état général de la mémoire du système.
Driver Verifier
Driver Verifier est un outil qui s’exécute en temps réel pour examiner le comportement des pilotes. Par exemple, Driver Verifier vérifie l’utilisation des ressources mémoire, telles que les pools de mémoire. S’il identifie des erreurs dans l’exécution du code du pilote, il crée de manière proactive une exception pour permettre un examen plus approfondi de cette partie du code du pilote. Le gestionnaire de vérification des pilotes est intégré à Windows et est disponible sur tous les PC Windows.
Pour démarrer le gestionnaire de vérification des pilotes, saisissez verifier à l’invite de commande. Vous pouvez configurer quels pilotes vérifier. Le code qui vérifie les pilotes ajoute une surcharge lors de son exécution, essayez donc de vérifier le moins de pilotes possible. Pour plus d’informations, consultez Type de débogage.
Notes
Si vous n’êtes pas équipé pour utiliser le débogueur Windows pour travailler sur ce problème, vous pouvez utiliser quelques techniques de dépannage de base.
Vérifiez le journal système dans le Visualisateur d’événements pour des messages d’erreur supplémentaires qui pourraient aider à identifier le périphérique ou le pilote qui cause ce bug check.
Si un pilote est identifié dans le message de bug check, désactivez le pilote ou vérifiez auprès du fabricant les mises à jour du pilote.
Confirmez que tout nouveau matériel installé est compatible avec la version installée de Windows. Par exemple, vous pouvez obtenir des informations sur le matériel requis sur les Spécifications de Windows 10.
Pour davantage d’informations concernant le dépannage, veuillez consulter la section Analyser les données d’écran bleu de vérification des bogues.