Bagikan melalui


Pemeriksaan Lain-lain

Opsi Pemeriksaan Lain-lain dari Driver Verifier memantau driver untuk kesalahan umum yang menyebabkan driver atau sistem mengalami crash, seperti membebaskan memori yang masih berisi objek kernel aktif.

Secara khusus, opsi Pemeriksaan Lain-lain mencari perilaku driver yang tidak tepat berikut:

  • Item kerja aktif dalam memori yang dikosongkan. Driver memanggil ExFreePool untuk membebaskan blok kumpulan yang berisi item kerja yang diantrekan dengan menggunakan IoQueueWorkItem.

  • Sumber daya aktif dalam memori yang dikosongkan. Driver memanggil ExFreePool untuk membebaskan blok kumpulan yang berisi struktur ERESOURCE aktif. Driver harus memanggil ExDeleteResource untuk menghapus objek ERESOURCE sebelum memanggil ExFreePool.

  • Daftar lookaside aktif dalam memori yang dikosongkan. Driver memanggil ExFreePool untuk membebaskan blok kumpulan yang masih berisi daftar lookaside aktif (struktur NPAGED_LOOKASIDE_LIST atau PAGED_LOOKASIDE_LIST . Driver harus memanggil ExDeleteNPagedLookasideList atau ExDeletePagedLookasideList untuk menghapus daftar lookaside sebelum memanggil ExFreePool.

  • Masalah pendaftaran Windows Management Instrumentation (WMI) dan Event Tracing for Windows (ETW). Masalah yang terdeteksi oleh Driver Verifier meliputi:

    • Driver yang mencoba membongkar tanpa membatalkan pendaftaran panggilan balik WMI-nya.

    • Driver yang mencoba menghapus objek perangkat yang belum terdaftar dari WMI.

    • Driver yang mencoba membongkar tanpa membatalkan pendaftaran penyedia mode kernel ETW-nya.

    • Driver yang mencoba membatalkan pendaftaran penyedia yang sudah tidak terdaftar.

  • Kesalahan penanganan kernel. (Windows Vista dan versi yang lebih baru) Mengaktifkan opsi Pemeriksaan Lain-lain juga akan memungkinkan pelacakan handel untuk proses sistem guna membantu menyelidiki kebocoran penanganan kernel dan Pemeriksaan Bug 0x93: INVALID_KERNEL_HANDLE. Dengan pelacakan handel diaktifkan, kernel akan mengumpulkan jejak tumpukan untuk operasi buka dan tutup handel terbaru. Jejak tumpukan dapat ditampilkan dalam debugger kernel menggunakan ekstensi debugger !htrace . Untuk informasi selengkapnya tentang !htrace, lihat dokumentasi Alat Penelusuran Kesalahan untuk Windows.

  • Handel mode pengguna dengan akses mode kernel Dimulai dengan Windows 7, ketika Anda memilih opsi Pemeriksaan Lain-lain, Driver Verifier juga memeriksa panggilan ke ObReferenceObjectByHandle. Anda tidak dapat melewati handel mode pengguna dengan akses mode kernel. Jika operasi seperti itu terjadi, Driver Verifier mengeluarkan 0xC4 Pemeriksaan Bug, dengan parameter 1 nilai 0xF6.

  • UserMode Tunggu Objek Sinkronisasi Dialokasikan pada Tumpukan Kernel

    Dimulai dengan Windows 7, Driver Verifier dapat mendeteksi cara tambahan yang dapat salah digunakan driver dengan mekanisme sinkronisasi multithreading yang disediakan sistem operasi.

    Mengalokasikan objek sinkronisasi, seperti struktur KEVENT, karena variabel lokal pada tumpukan kernel adalah praktik umum. Saat proses dimuat dalam memori, tumpukan kernel utasnya tidak pernah dipangkas dari set kerja atau di-page out ke disk. Mengalokasikan objek sinkronisasi dalam memori yang tidak dapat dibajak tersebut sudah benar.

    Namun, ketika driver memanggil API seperti KeWaitForSingleObject atau KeWaitForMultipleObjects untuk menunggu objek yang dialokasikan pada tumpukan, mereka harus menentukan nilai KernelMode untuk parameter WaitMode API. Ketika semua utas proses menunggu dalam mode UserMode , proses tersebut menjadi memenuhi syarat untuk ditukar ke disk. Oleh karena itu, jika driver menentukan UserMode sebagai parameter WaitMode , sistem operasi dapat menukar proses saat ini selama setiap utas lain dalam proses yang sama juga menunggu sebagai UserMode. Menukar seluruh proses ke disk termasuk menomori tumpukan kernelnya. Menunggu objek sinkronisasi yang ditukar sistem operasi salah. Pada titik tertentu utas harus ikut dan memberi sinyal objek sinkronisasi. Memberi sinyal objek sinkronisasi melibatkan kernel Windows yang memanipulasi objek di IRQL = DISPATCH_LEVEL atau lebih tinggi. Menyentuh paged out atau menukar memori pada DISPATCH_LEVEL atau lebih tinggi menyebabkan crash sistem.

    Mulai dari Windows 7, ketika Anda memilih opsi Pemeriksaan Lain-lain, Pemverifikasi Driver memeriksa bahwa objek sinkronisasi yang digunakan driver terverifikasi untuk menunggu di UserMode tidak dialokasikan pada tumpukan kernel utas saat ini. Ketika Driver Verifier mendeteksi penantian yang salah, Driver Verifier mengeluarkan 0xC4 Pemeriksaan Bug: DRIVER_VERIFIER_DETECTED_VIOLATION, dengan nilai parameter 1 0x123.

  • Referensi Handel Kernel Salah

    Setiap proses Windows memiliki tabel handel. Anda dapat melihat tabel handel sebagai array entri handel. Setiap nilai handel yang valid mengacu pada entri yang valid dalam array ini.

    Handel kernel sebagai handel yang valid untuk tabel handel proses Sistem. Handel pengguna sebagai handel yang valid untuk proses apa pun kecuali proses Sistem.

    Di Windows 7, Driver Verifier mendeteksi mencoba mereferensikan nilai handel kernel yang salah. Cacat driver ini dilaporkan sebagai 0x93 Pemeriksaan Bug: INVALID_KERNEL_HANDLE jika opsi Pemeriksaan Lain-lain Pemverifikasi Driver diaktifkan. Biasanya referensi handel yang salah semacam ini berarti bahwa driver telah menutup handel itu tetapi mencoba untuk terus menggunakannya. Cacat semacam ini dapat mengakibatkan masalah yang tidak dapat diprediksi untuk sistem karena nilai handel yang sedang direferensikan mungkin telah digunakan kembali oleh driver lain yang tidak terkait.

    Jika driver kernel baru-baru ini menutup handel kernel dan kemudian mereferensikan handel tertutup, Driver Verifier memaksa pemeriksaan bug seperti yang dijelaskan sebelumnya. Dalam hal ini output dari ekstensi debugger !htrace menyediakan jejak tumpukan untuk jalur kode yang menutup handel ini. Gunakan alamat proses Sistem sebagai parameter untuk !htrace. Untuk menemukan alamat proses Sistem, gunakan perintah !process 4 0 .

    Mulai dari Windows 7, Driver Verifier menambahkan pemeriksaan ke ObReferenceObjectByHandle. Sekarang dilarang untuk melewati handel ruang pengguna dengan akses KernelMode. Jika kombinasi seperti itu terdeteksi, Driver Verifier mengeluarkan 0xC4 Pemeriksaan Bug: DRIVER_VERIFIER_DETECTED_VIOLATION, dengan parameter 1 nilai 0xF6.

Mengaktifkan Opsi Ini

Anda dapat mengaktifkan opsi Pemeriksaan Lain-lain untuk satu atau beberapa driver dengan menggunakan Driver Verifier Manager atau baris perintah Verifier.exe. Untuk detailnya, lihat Memilih Opsi Pemverifikasi Driver.

  • Pada baris perintah

    Pada baris perintah, opsi Pemeriksaan Lain-lain diwakili oleh Bit 11 (0x800). Untuk mengaktifkan Pemeriksaan Lain-lain, gunakan nilai bendera 0x800 atau tambahkan 0x800 ke nilai bendera. Contohnya:

    verifier /flags 0x800 /driver MyDriver.sys
    

    Opsi akan aktif setelah boot berikutnya.

    Pada Windows Vista dan versi Windows yang lebih baru, Anda juga dapat mengaktifkan dan menonaktifkan Pemeriksaan Lain-lain tanpa me-reboot komputer dengan menambahkan parameter /volatile ke perintah . Contohnya:

    verifier /volatile /flags 0x800 /adddriver MyDriver.sys
    

    Pengaturan ini segera efektif, tetapi hilang ketika Anda mematikan atau me-reboot komputer. Untuk detailnya, lihat Menggunakan Pengaturan Volatil.

    Opsi Pemeriksaan Lain-lain juga disertakan dalam pengaturan standar. Contohnya:

    verifier  /standard /driver MyDriver.sys
    
  • Menggunakan Driver Verifier Manager

    1. Mulai Driver Verifier Manager. Ketik Pemverifikasi di jendela Prompt Perintah.

    2. Pilih Buat pengaturan kustom (untuk pengembang kode), lalu klik Berikutnya.

    3. Pilih Pilih pengaturan individual dari daftar lengkap.

    4. Pilih Pemeriksaan Lain-lain.

    Fitur Pemeriksaan Lain-lain juga disertakan dalam pengaturan standar. Untuk menggunakan fitur ini, di Driver Verifier Manager, klik Buat Pengaturan Standar.

Menampilkan Hasil

Untuk melihat hasil opsi Pemeriksaan Lain-lain, gunakan ekstensi !verifier di debugger kernel. (Untuk informasi tentang !verifier, lihat dokumentasi Alat Debugging untuk Windows .)

Dalam contoh berikut, opsi Pemeriksaan Lain-lain mendeteksi struktur ERESOURCE aktif dalam memori yang coba dikosongkan driver, menghasilkan Pemeriksaan Bug 0xC4: DRIVER_VERIFIER_DETECTED_VIOLATION. Tampilan 0xC4 Pemeriksaan Bug mencakup alamat ERESOURCE dan memori yang terpengaruh.

1: kd> !verifier 1

Verify Level 800 ... enabled options are:
 Miscellaneous checks enabled

Summary of All Verifier Statistics

RaiseIrqls                             0x0
AcquireSpinLocks                       0x0
Synch Executions                       0x0
Trims                                  0x0

Pool Allocations Attempted             0x1
Pool Allocations Succeeded             0x1
Pool Allocations Succeeded SpecialPool 0x0
Pool Allocations With NO TAG           0x0
Pool Allocations Failed                0x0
Resource Allocations Failed Deliberately   0x0

Current paged pool allocations         0x0 for 00000000 bytes
Peak paged pool allocations            0x0 for 00000000 bytes
Current nonpaged pool allocations      0x0 for 00000000 bytes
Peak nonpaged pool allocations         0x0 for 00000000 bytes

Driver Verification List

Entry     State           NonPagedPool   PagedPool   Module

8459ca50 Loaded           00000000       00000000    buggy.sys



*** Fatal System Error: 0x000000c4
 (0x000000D2,0x9655D4A8,0x9655D468,0x000000B0)


        0xD2 : Freeing pool allocation that contains active ERESOURCE.
               2 -  ERESOURCE address.
               3 -  Pool allocation start address.
               4 -  Pool allocation size.

Untuk menyelidiki alokasi kumpulan, gunakan ekstensi debugger !pool dengan alamat awal alokasi kumpulan, 9655D468. (Bendera 2 menampilkan informasi header hanya untuk kumpulan yang berisi alamat yang ditentukan. Informasi header untuk kumpulan lain ditekan.)

1: kd> !pool 9655d468  2
Pool page 9655d468 region is Paged pool
*9655d468 size:   b0 previous size:    8  (Allocated) *Bug_

Untuk menemukan informasi tentang ERESOURCE, gunakan ekstensi debugger !locks (!kdext*.locks) dengan alamat struktur.

1: kd> !locks 0x9655D4A8     <<<<<- ERESOURCE @0x9655D4A8 lives inside the pool block being freed

Resource @ 0x9655d4a8    Available
1 total locks

Anda juga dapat menggunakan perintah debugger kb untuk menampilkan jejak tumpukan panggilan yang menyebabkan kegagalan. Contoh berikut menunjukkan tumpukan, termasuk panggilan ke ExFreePoolWithTag yang disadap Driver Verifier.

1: kd> kb
ChildEBP RetAddr  Args to Child
92f6374c 82c2c95a 00000003 92f68cdc 00000000 nt!RtlpBreakWithStatusInstruction
92f6379c 82c2d345 00000003 9655d468 000000c4 nt!KiBugCheckDebugBreak+0x1c
92f63b48 82c2c804 000000c4 000000d2 9655d4a8 nt!KeBugCheck2+0x5a9
92f63b6c 82e73bae 000000c4 000000d2 9655d4a8 nt!KeBugCheckEx+0x1e
92f63b88 82e78c32 9655d4a8 9655d468 000000b0 nt!VerifierBugCheckIfAppropriate+0x3c
92f63ba4 82ca7dcb 9655d468 000000b0 00000000 nt!VfCheckForResource+0x52
92f63bc8 82e7fb2d 000000b0 00000190 9655d470 nt!ExpCheckForResource+0x21
92f63be4 82e6dc6c 9655d470 92f63c18 89b6c58c nt!ExFreePoolSanityChecks+0x1fb
92f63bf0 89b6c58c 9655d470 00000000 89b74194 nt!VerifierExFreePoolWithTag+0x28
92f63c00 89b6c0f6 846550c8 846550c8 846e2200 buggy!MmTestProbeLockForEverStress+0x2e
92f63c18 82e6c5f1 846e2200 846550c8 85362e30 buggy!TdDeviceControl+0xc4
92f63c38 82c1fd81 82d4d148 846550c8 846e2200 nt!IovCallDriver+0x251
92f63c4c 82d4d148 85362e30 846550c8 84655138 nt!IofCallDriver+0x1b
92f63c6c 82d4df9e 846e2200 85362e30 00000000 nt!IopSynchronousServiceTail+0x1e6
92f63d00 82d527be 00000001 846550c8 00000000 nt!IopXxxControlFile+0x684
92f63d34 82cb9efc 0000004c 00000000 00000000 nt!NtDeviceIoControlFile+0x2a
92f63d34 6a22b204 0000004c 00000000 00000000 nt!KiFastCallEntry+0x12c