Bagikan melalui


Pemeriksaan Otomatis

Driver Verifier melakukan pemeriksaan berikut setiap kali memverifikasi satu atau beberapa driver. Anda tidak dapat mengaktifkan atau menonaktifkan pemeriksaan ini. Mulai dari Windows 10, versi 1709, pemeriksaan otomatis ini telah dipindahkan ke bendera standar yang relevan. Akibatnya, pengguna yang mengaktifkan Driver Verifier dengan tanda standar tidak akan melihat adanya pengurangan dalam pemeriksaan yang berlaku.

Memantau IRQL dan Rutinitas Memori

Driver Verifier memantau driver yang dipilih untuk tindakan terlarang berikut:

  • Menaikkan IRQL dengan memanggil KeLowerIrql

  • Menurunkan IRQL dengan memanggil KeRaiseIrql

  • Meminta alokasi memori berukuran nol

  • Mengalokasikan atau membebaskan kumpulan halaman dengan IRQL > APC_LEVEL

  • Mengalokasikan atau membebaskan kumpulan non-halaman dengan IRQL > DISPATCH_LEVEL

  • Mencoba membebaskan alamat yang tidak dikembalikan dari alokasi sebelumnya

  • Mencoba membebaskan alamat yang sudah dibebaskan

  • Memperoleh atau melepaskan mutex cepat dengan IRQL > APC_LEVEL

  • Memperoleh atau melepaskan kunci putaran dengan IRQL tidak sama dengan DISPATCH_LEVEL

  • Melepaskan kunci putaran dua kali.

  • Penandaan permintaan alokasi sebagai MUST_SUCCEED. Tidak ada permintaan seperti itu yang diizinkan.

Jika Driver Verifier tidak aktif, pelanggaran ini mungkin tidak menyebabkan crash sistem langsung dalam semua kasus. Driver Verifier memantau perilaku driver dan mengeluarkan pemeriksaan bug 0xC4 jika salah satu pelanggaran ini terjadi. Lihat Pemeriksaan Kesalahan 0xC4 (DRIVER_VERIFIER_DETECTED_VIOLATION) untuk melihat daftar parameter pemeriksaan kesalahan.

Pemantauan Pengalihan Tumpukan

Driver Verifier memantau penggunaan memori tumpukan oleh driver yang sedang diverifikasi. Jika driver mengubah tumpukan, dan tumpukan baru bukan tumpukan utas atau tumpukan DPC, maka bug check dilakukan. (Ini akan menjadi pemeriksaan bug 0xC4 dengan parameter pertama yang sama dengan 0x90.) Tumpukan yang ditampilkan oleh perintah debugger KB biasanya akan mengungkapkan driver yang melakukan operasi ini.

Memeriksa Pembongkaran Driver

Setelah driver yang sedang diverifikasi dibongkar, Driver Verifier melakukan beberapa pemeriksaan untuk memastikan bahwa driver telah dibersihkan.

Secara khusus, Driver Verifier mencari:

  • Timer yang tidak dihapus

  • Panggilan prosedur tertunda (DPC) yang tertunda

  • Daftar lookaside yang tidak dihapus

  • Thread pekerja yang tidak dihapus

  • Antrean yang belum dihapus

  • Sumber daya serupa lainnya

Masalah seperti ini berpotensi menyebabkan pemeriksaan bug sistem terpicu beberapa saat setelah driver di-unload, dan penyebab dari pemeriksaan bug ini dapat sangat sulit untuk ditentukan. Ketika Driver Verifier aktif, pelanggaran tersebut akan mengakibatkan bug check 0xC7 dilakukan segera setelah driver dibongkar. Lihat Bug Check 0xC7 (TIMER_OR_DPC_INVALID) untuk daftar parameter bug check.

Memantau Penggunaan Daftar Deskriptor Memori (MDL)

Di Windows Vista, Pemverifikasi Driver juga memantau driver yang dipilih untuk tindakan terlarang berikut:

  • Memanggil MmProbeAndLockPages atau MmProbeAndLockProcessPages pada MDL yang tidak memiliki flag yang sesuai. Misalnya, salah memanggil MmProbeAndLockPages untuk MDL yang telah dibuat dengan menggunakan MmBuildMdlForNonPagedPool.

  • Memanggil MmMapLockedPages pada MDL yang tidak memiliki bendera yang sesuai. Misalnya, salah memanggil MmMapLockedPages untuk MDL yang sudah dipetakan ke alamat sistem atau MDL yang tidak dikunci.

  • Memanggil MmUnlockPages atau MmUnmapLockedPages pada MDL parsial, yaitu MDL yang dibuat dengan menggunakan IoBuildPartialMdl.

  • Memanggil MmUnmapLockedPages pada MDL yang tidak dipetakan ke alamat sistem.

Jika Pemverifikasi Driver tidak aktif, pelanggaran ini mungkin tidak menyebabkan sistem segera berhenti merespons dalam semua kasus. Driver Verifier memantau perilaku driver dan mengeluarkan pemeriksaan bug 0xC4 jika salah satu pelanggaran ini terjadi. Lihat Pemeriksaan Kesalahan 0xC4 (DRIVER_VERIFIER_DETECTED_VIOLATION) untuk melihat daftar parameter pemeriksaan kesalahan.

Alokasi Objek Sinkronisasi dari Memori NonPagedPoolSession

Mulai dari Windows 7, Pemverifikasi Driver memeriksa objek sinkronisasi dari memori sesi.

Objek sinkronisasi harus tidak dapat dijangkau. Mereka juga harus tinggal di ruang alamat virtual global di seluruh sistem.

Driver grafis dapat mengalokasikan memori sesi dengan memanggil API seperti EngAllocMem. Tidak seperti ruang alamat global, ruang alamat sesi divirtualisasi untuk setiap sesi Server Terminal. Ini berarti bahwa alamat virtual yang sama yang digunakan dalam konteks dua sesi berbeda mengacu pada dua objek yang berbeda. Kernel Windows harus dapat mengakses objek sinkronisasi dari sesi Server Terminal mana pun. Mencoba mereferensikan alamat memori sesi dari sesi lain memiliki hasil yang tidak dapat diprediksi, seperti crash sistem atau kerusakan senyap dari data sesi lain.

Mulai windows 7, ketika driver terverifikasi menginisialisasi objek sinkronisasi dengan memanggil API seperti KeInitializeEvent atau KeInitializeMutex, Driver Verifier memeriksa apakah alamat objek berada di dalam ruang alamat virtual sesi. Jika Driver Verifier mendeteksi alamat yang salah semacam ini, Driver Verifier mengeluarkan Bug Check 0xC4: DRIVER_VERIFIER_DETECTED_VIOLATION, dengan nilai parameter 1 sebesar 0xDF.

Perubahan Penghitung Referensi Objek dari 0 ke 1

Dimulai di Windows 7, Driver Verifier memeriksa kelas tambahan dari referensi objek yang salah.

Saat pengelola objek kernel Windows membuat objek, seperti objek File atau objek Utas, penghitung referensi objek baru diatur ke 1. Penghitung referensi bertambah berdasarkan panggilan ke API seperti ObReferenceObjectByPointer atau ObReferenceObjectByHandle. Penghitung referensi dikurangi oleh setiap panggilan ObDereferenceObject untuk objek yang sama.

Setelah penghitung referensi mencapai nilai 0, objek menjadi memenuhi syarat untuk dibebaskan. Manajer objek mungkin membebaskannya segera, atau mungkin membebaskannya nanti. Memanggil ObReferenceObjectByPointer atau ObDereferenceObject dan mengubah penghitung referensi dari 0 ke 1 berarti menaikkan penghitung referensi objek yang sudah dibebaskan. Ini selalu salah karena dapat mengakibatkan kerusakan alokasi memori orang lain.

Blok atau Penundaan Matikan Sistem

Mulai dari Windows 7, Driver Verifier akan menghentikan sistem sebentar untuk masuk ke debugger kernel jika penghentian sistem tidak selesai 20 menit setelah dimulai. Driver Verifier menetapkan awal matikan sistem sebagai waktu ketika kernel Windows mulai mematikan berbagai subsistemnya, seperti Registri, Plug And Play, atau subsistem manajer I/O.

Jika debugger kernel tidak dilampirkan ke sistem, Driver Verifier mengeluarkan Pemeriksaan Bug 0xC4: DRIVER_VERIFIER_DETECTED_VIOLATION, dengan nilai parameter 1 sebesar 0x115, alih-alih breakpoint ini.

Sering kali, penghentian sistem yang tidak dapat diselesaikan dalam waktu lebih dari 20 menit menunjukkan bahwa salah satu driver yang berjalan pada sistem tersebut tidak berfungsi dengan baik. Menjalankan !analyze -v dari debugger kernel menampilkan jejak stack utas pekerja sistem yang bertanggung jawab terhadap penghentian. Anda harus memeriksa pelacakan tumpukan tersebut dan menentukan apakah utas matikan diblokir oleh salah satu driver yang sedang diuji.

Terkadang sistem tidak dapat dimatikan karena mengalami pengujian stres berat—meskipun semua driver berfungsi dengan benar. Pengguna dapat memilih untuk melanjutkan eksekusi setelah titik henti Driver Verifier ini dan memeriksa apakah sistem akhirnya dimatikan.