Menangani Pemeriksaan Bug Ketika Pemverifikasi Driver Diaktifkan
Pemverifikasi Driver mendeteksi kesalahan driver pada durasi. Anda dapat menggunakan Pemverifikasi Driver bersama dengan perintah !analyze debugger untuk mendeteksi dan menampilkan informasi tentang kesalahan di driver Anda.
Di Windows 8, Driver Verifier telah ditingkatkan dengan fitur baru, termasuk Pemeriksaan Kepatuhan DDI. Di sini kami memberikan contoh yang menunjukkan Pemeriksaan Kepatuhan DDI.
Gunakan prosedur berikut untuk menyiapkan.
- Buat sesi debugging mode kernel antara host dan komputer target.
- Instal driver Anda di komputer target.
- Pada komputer target, buka jendela Prompt Perintah dan masukkan pemverifikasi perintah. Gunakan Driver Verifier Manager untuk mengaktifkan Pemverifikasi Driver untuk driver Anda.
- Reboot komputer target.
Ketika Driver Verifier mendeteksi kesalahan, ia menghasilkan pemeriksaan bug. Kemudian Windows memecah ke debugger dan menampilkan deskripsi singkat tentang kesalahan tersebut. Berikut adalah contoh di mana Driver Verifier menghasilkan Bug Check 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
Di debugger, masukkan !analyze -v untuk mendapatkan deskripsi terperinci tentang kesalahan.
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
Dalam output sebelumnya, Anda dapat melihat nama dan deskripsi aturan, IrqlExApcLte1, yang dilanggar, dan Anda dapat memilih tautan ke halaman referensi yang menjelaskan aturan IrqlExApcLte1 (wdm). Anda juga dapat memilih tautan perintah debugger, !ruleinfo 0x20005, untuk mendapatkan informasi tentang aturan. Dalam hal ini, aturan menyatakan bahwa Anda tidak dapat memanggil ExAcquireFastMutex jika tingkat permintaan interupsi (IRQL) lebih besar dari APC_LEVEL. Output menunjukkan bahwa IRQL saat ini adalah 9, dan dalam wdm.h Anda dapat melihat bahwa APC_LEVEL memiliki nilai 1. Untuk informasi selengkapnya tentang IIRQL, lihat Mengelola Prioritas Perangkat Keras.
Output dari !analyze -v berlanjut dengan jejak tumpukan dan informasi tentang kode yang menyebabkan kesalahan. Dalam output berikut, Anda dapat melihat bahwa rutinitas OnInterrupt di MyDriver.sys yang disebut ExAcquireFastMutex. OnInterrupt adalah rutinitas layanan interupsi yang berjalan pada IRQL yang lebih besar dari APC_LEVEL, sehingga merupakan pelanggaran bagi rutinitas ini untuk memanggil 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