Udostępnij za pośrednictwem


Obsługa sprawdzania błędów po włączeniu weryfikatora sterownika

Weryfikator sterownika wykrywa błędy sterownika podczas działania. Możesz użyć weryfikatora sterowników wraz z !przeanalizuj polecenie debugera w celu wykrywania i wyświetlania informacji o błędach w sterowniku.

W systemie Windows 8 Driver Verifier został wyposażony w nowe funkcje, w tym kontrolę zgodności DDI. W tym miejscu podajemy przykład ilustrujący sprawdzanie zgodności DDI.

Aby skonfigurować usługę , wykonaj poniższą procedurę.

  1. Ustanów sesję debugowania trybu jądra między hostem a komputerem docelowym.
  2. Zainstaluj sterownik na komputerze docelowym.
  3. Na komputerze docelowym otwórz okno wiersza poleceń i wprowadź polecenie verifier. Użyj Menedżera weryfikatora sterowników , aby włączyć weryfikatora sterowników dla swojego sterownika.
  4. Uruchom ponownie komputer docelowy.

Gdy weryfikator sterownika wykryje błąd, generuje sprawdzanie błędów. Następnie system Windows przechodzi do debugera i wyświetla krótki opis błędu. Oto przykład, w którym weryfikator sterownika generuje błąd sprawdzania DRIVER_VERIFIER_DETECTED_VIOLATION (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

W debugerze wprowadź !analyze -v, aby uzyskać szczegółowy opis błędu.

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

W poprzednich danych wyjściowych można zobaczyć nazwę i opis reguły IrqlExApcLte1, która została naruszona, i można wybrać link do strony referencyjnej, która opisuje regułę IrqlExApcLte1 (wdm). Możesz również wybrać link polecenia debugera, !ruleinfo 0x20005, aby uzyskać informacje o regule. W takim przypadku reguła stwierdza, że nie można wywołać ExAcquireFastMutex, jeśli poziom żądania przerwania (IRQL) jest większy niż APC_LEVEL. Dane wyjściowe pokazują, że bieżąca wartość IRQL wynosi 9, a w pliku wdm.h widać, że APC_LEVEL ma wartość 1. Aby uzyskać więcej informacji na temat IRQL, zobacz Zarządzanie priorytetami sprzętu.

Wynik działania !analyze -v zawiera dalszy ślad stosu oraz informacje o kodzie, który spowodował błąd. W poniższych danych wyjściowych widać, że rutyna OnInterrupt w MyDriver.sys wywołała ExAcquireFastMutex. OnInterrupt to rutyna obsługi przerwań, która działa na poziomie priorytetu IRQL większym niż APC_LEVEL, dlatego jest naruszeniem, jeśli ta procedura wywołuje 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

Zobacz również

statycznego weryfikatora sterowników