Delen via


Een bugcontrole afhandelen wanneer stuurprogrammacontrole is ingeschakeld

stuurprogrammaverifier stuurprogrammafouten detecteert tijdens runtime. U kunt Driver Verifier samen met de opdracht !analyze foutopsporingsprogramma gebruiken om informatie over fouten in uw stuurprogramma te detecteren en weer te geven.

In Windows 8 is stuurprogrammacontrole uitgebreid met nieuwe functies, waaronder DDI-compatibiliteitscontrole. Hier geven we een voorbeeld met DDI-nalevingscontrole.

Gebruik de volgende procedure om de configuratie uit te voeren.

  1. Stel een foutopsporingssessie in de kernelmodus tot stand tussen een host en doelcomputer.
  2. Installeer uw stuurprogramma op de doelcomputer.
  3. Open op de doelcomputer een opdrachtpromptvenster en voer de opdracht verifierin. Gebruik Driver Verifier Manager om Driver Verifier in te schakelen voor uw stuurprogramma.
  4. Start de doelcomputer opnieuw op.

Wanneer Driver Verifier een fout detecteert, genereert het een foutcontrole. Vervolgens breekt Windows in het foutopsporingsprogramma en geeft een korte beschrijving van de fout weer. Hier volgt een voorbeeld waarin Driver Verifier bug check DRIVER_VERIFIER_DETECTED_VIOLATION (C4)genereert.

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

Voer in het foutopsporingsprogramma !analyze -v in om een gedetailleerde beschrijving van de fout op te halen.

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

In de voorgaande uitvoer ziet u de naam en beschrijving van de regel, IrqlExApcLte1, die is geschonden en kunt u een koppeling naar de referentiepagina selecteren die de IrqlExApcLte1-regel (wdm)beschrijft. U kunt ook een opdrachtkoppeling voor foutopsporingsprogramma, !ruleinfo 0x20005, selecteren om informatie over de regel op te halen. In dit geval geeft de regel aan dat u geen ExAcquireFastMutex kunt aanroepen als het onderbrekingsaanvraagniveau (IRQL) groter is dan APC_LEVEL. De uitvoer laat zien dat de huidige IRQL 9 is en in wdm.h ziet u dat APC_LEVEL een waarde van 1 heeft. Zie Hardwareprioriteiten beherenvoor meer informatie over IRQLs.

De uitvoer van !analyze -v gaat verder met een stack-trace en informatie over de code die de fout heeft veroorzaakt. In de volgende uitvoer ziet u dat de OnInterrupt routine in MyDriver.sys de ExAcquireFastMutexheeft aangeroepen. OnInterrupt is een onderbrekingsserviceroutine die wordt uitgevoerd op een IRQL die groter is dan APC_LEVEL, dus het is een schending voor deze routine om ExAcquireFastMutex-aan te roepen.

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

Zie ook

statische stuurprogrammaverifier