Freigeben über


Behandeln einer Fehlerüberprüfung, wenn die Treiberüberprüfung aktiviert ist

Driver Verifier erkennt Treiberfehler zur Laufzeit. Sie können die Treiberüberprüfung zusammen mit dem Befehl !analyze debugger verwenden, um Informationen zu Fehlern in Ihrem Treiber zu erkennen und anzuzeigen.

In Windows 8 wurde driver verifier um neue Features erweitert, einschließlich der DDI-Konformitätsüberprüfung. Hier finden Sie ein Beispiel, das die DDI-Konformitätsüberprüfung veranschaulicht.

Führen Sie zum Einrichten das folgende Verfahren aus.

  1. Richten Sie eine Debugsitzung im Kernelmodus zwischen einem Host und einem Zielcomputer ein.
  2. Installieren Sie Ihren Treiber auf dem Zielcomputer.
  3. Öffnen Sie auf dem Zielcomputer ein Eingabeaufforderungsfenster, und geben Sie die Befehlsüberprüfung ein. Verwenden Sie den Treiberüberprüfungs-Manager , um die Treiberüberprüfung für Ihren Treiber zu aktivieren.
  4. Starten Sie den Zielcomputer neu.

Wenn driver verifier einen Fehler erkennt, wird eine Fehlerüberprüfung generiert. Dann bricht Windows den Debugger ein und zeigt eine kurze Beschreibung des Fehlers an. Hier sehen Sie ein Beispiel, in dem die Treiberüberprüfung die Fehlerüberprüfung DRIVER_VERIFIER_DETECTED_VIOLATION (C4) generiert.

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

Geben Sie im Debugger !analyze -v ein, um eine detaillierte Beschreibung des Fehlers zu erhalten.

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 der vorherigen Ausgabe sehen Sie den Namen und die Beschreibung der Regel IrqlExApcLte1, die verletzt wurde, und Sie können einen Link zur Referenzseite auswählen, die die IrqlExApcLte1-Regel (wdm) beschreibt. Sie können auch einen Debuggerbefehlslink ( !ruleinfo 0x20005) auswählen, um Informationen zur Regel abzurufen. In diesem Fall besagt die Regel, dass Sie ExAcquireFastMutex nicht aufrufen können, wenn die Interruptanforderungsebene (Interrupt Request Level, IRQL) größer als APC_LEVEL ist. Die Ausgabe zeigt, dass die aktuelle IRQL 9 ist, und in wdm.h sehen Sie, dass APC_LEVEL den Wert 1 hat. Weitere Informationen zu IRQLs finden Sie unter Verwalten von Hardwareprioritäten.

Die Ausgabe von !analyze -v wird mit einer Stapelüberwachung und Informationen zum Code fortgesetzt, der den Fehler verursacht hat. In der folgenden Ausgabe sehen Sie, dass die OnInterrupt-Routine in MyDriver.sys als ExAcquireFastMutex bezeichnet wird. OnInterrupt ist eine Interruptdienstroutine, die in einer IRQL ausgeführt wird, die größer als APC_LEVEL ist. Daher stellt es einen Verstoß für diese Routine dar, ExAcquireFastMutex aufzurufen.

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

Siehe auch

Static Driver Verifier