Gestion d’une vérification de bogue lorsque le vérificateur de pilote est activé

Driver Verifier détecte les erreurs de pilote au moment de l’exécution. Vous pouvez utiliser le vérificateur de pilotes avec la commande !analyze du débogueur pour détecter et afficher des informations sur les erreurs dans votre pilote.

Dans Windows 8, Driver Verifier a été amélioré avec de nouvelles fonctionnalités, notamment la vérification de conformité DDI. Ici, nous donnons un exemple qui illustre la vérification de la conformité DDI.

Utilisez la procédure suivante pour effectuer la configuration.

  1. Établissez une session de débogage en mode noyau entre un hôte et un ordinateur cible.
  2. Installez votre pilote sur l’ordinateur cible.
  3. Sur l’ordinateur cible, ouvrez une fenêtre d’invite de commandes et entrez le vérificateur de commandes. Utilisez le Gestionnaire du vérificateur de pilotes pour activer le vérificateur de pilotes pour votre pilote.
  4. Redémarrez l’ordinateur cible.

Lorsque driver verifier détecte une erreur, il génère un bogue case activée. Ensuite, Windows s’insère dans le débogueur et affiche une brève description de l’erreur. Voici un exemple où le vérificateur de pilote génère des DRIVER_VERIFIER_DETECTED_VIOLATION de vérification de bogues (C4).

Driver Verifier: Extension abort with Error Code 0x20005
Error String ExAcquireFastMutex should only be called at IRQL <= APC_LEVEL.

*** Fatal System Error: 0x000000c4
                       (0x0000000000020005,0xFFFFF88000E16F50,0x0000000000000000,0x0000000000000000)

Break instruction exception - code 80000003 (first chance)

A fatal system error has occurred.
Debugger entered on first try; Bugcheck callbacks have not been invoked.

A fatal system error has occurred.

nt!DbgBreakPointWithStatus:
fffff802`a40ef930 cc              int     3

Dans le débogueur, entrez !analyze -v pour obtenir une description détaillée de l’erreur.

0: kd> !analyze -v
Connected to Windows 8 9200 x64 target at (Thu Oct 11 13:48:31.270 2012 (UTC - 7:00)), ptr64 TRUE
Loading Kernel Symbols
...............................................................
................................................................
...................
Loading User Symbols
..................................................
Loading unloaded module list
............
*******************************************************************************
*                                                                             *
*                        Bugcheck Analysis                                    *
*                                                                             *
*******************************************************************************

DRIVER_VERIFIER_DETECTED_VIOLATION (c4)
A device driver attempting to corrupt the system has been caught.  This is
because the driver was specified in the registry as being suspect (by the
administrator) and the kernel has enabled substantial checking of this driver.
If the driver attempts to corrupt the system, bugchecks 0xC4, 0xC1 and 0xA will
be among the most commonly seen crashes.
Arguments:
Arg1: 0000000000020005, ID of the 'IrqlExApcLte1' rule that was violated.
Arg2: fffff88000e16f50, A pointer to the string describing the violated rule condition.
Arg3: 0000000000000000, An optional pointer to the rule state variable(s).
Arg4: 0000000000000000, Reserved (unused)

## Debugging Details:

...

DV_VIOLATED_CONDITION:  ExAcquireFastMutex should only be called at IRQL <= APC_LEVEL.

DV_MSDN_LINK: !url https://go.microsoft.com/fwlink/p/?linkid=216022

DV_RULE_INFO: !ruleinfo 0x20005

BUGCHECK_STR:  0xc4_IrqlExApcLte1_XDV

DEFAULT_BUCKET_ID:  WIN8_DRIVER_FAULT

PROCESS_NAME:  TiWorker.exe

CURRENT_IRQL:  9

Dans la sortie précédente, vous pouvez voir le nom et la description de la règle , IrqlExApcLte1, qui a été violée, et vous pouvez sélectionner un lien vers la page de référence qui décrit la règle IrqlExApcLte1 (wdm). Vous pouvez également sélectionner un lien de commande de débogueur, !ruleinfo 0x20005, pour obtenir des informations sur la règle. Dans ce cas, la règle indique que vous ne pouvez pas appeler ExAcquireFastMutex si le niveau de demande d’interruption (IRQL) est supérieur à APC_LEVEL. La sortie indique que l’IRQL actuel est 9, et dans wdm.h, vous pouvez voir que APC_LEVEL a une valeur de 1. Pour plus d’informations sur les IRQL, consultez Gestion des priorités matérielles.

La sortie de !analyze -v se poursuit avec une trace de pile et des informations sur le code à l’origine de l’erreur. Dans la sortie suivante, vous pouvez voir que la routine OnInterrupt dans MyDriver.sys appelée ExAcquireFastMutex. OnInterrupt est une routine de service d’interruption qui s’exécute à un IRQL supérieur à APC_LEVEL. Il s’agit donc d’une violation pour cette routine d’appeler ExAcquireFastMutex.

LAST_CONTROL_TRANSFER:  from fffff802a41f00ea to fffff802a40ef930

STACK_TEXT:  
... : nt!DbgBreakPointWithStatus ...
... : nt!KiBugCheckDebugBreak+0x12 ...
... : nt!KeBugCheck2+0x79f ...
... : nt!KeBugCheckEx+0x104 ...
... : VerifierExt!SLIC_abort+0x47 ...
... : VerifierExt!SLIC_ExAcquireFastMutex_entry_irqlexapclte1+0x25 ...
... : VerifierExt!ExAcquireFastMutex_wrapper+0x1a ...
... : nt!ViExAcquireFastMutexCommon+0x1d ...
... : nt!VerifierExAcquireFastMutex+0x1a ...
... : MyDriver!OnInterrupt+0x69 ...
... : nt!KiScanInterruptObjectList+0x6f ...
... : nt!KiChainedDispatch+0x19a ...
...

STACK_COMMAND:  kb

FOLLOWUP_IP: 
MyDriver!OnInterrupt+69 ...
fffff880`16306649 4c8d0510040000  lea     r8,[MyDriver! ?? ::FNODOBFM::`string' (fffff880`16306a60)]

FAULTING_SOURCE_LINE:  c:\MyDriverwdm03\cpp\MyDriver\pnp.c

FAULTING_SOURCE_FILE:  c:\MyDriverwdm03\cpp\MyDriver\pnp.c

FAULTING_SOURCE_LINE_NUMBER:  26

FAULTING_SOURCE_CODE:  
    22:    if(1 == interruptStatus)
    23:    {
    24:       ...
    25:       ExAcquireFastMutex( &(fdoExt->fastMutex) );
>   26:       ...
    27:       ExReleaseFastMutex( &(fdoExt->fastMutex) );
    28:       ...
    29:       return TRUE;
    30:    }
    31:    else


SYMBOL_STACK_INDEX:  9

SYMBOL_NAME:  MyDriver!OnInterrupt+69

FOLLOWUP_NAME:  ...

MODULE_NAME: MyDriver

IMAGE_NAME:  MyDriver.sys

DEBUG_FLR_IMAGE_TIMESTAMP:  50772f37

BUCKET_ID_FUNC_OFFSET:  69

FAILURE_BUCKET_ID:  0xc4_IrqlExApcLte1_XDV_VRF_MyDriver!OnInterrupt

BUCKET_ID:  0xc4_IrqlExApcLte1_XDV_VRF_MyDriver!OnInterrupt

Voir aussi

Vérificateur de pilote statique