Aturan IrqlZwPassive (wdm)
Aturan IrqlZwPassive menentukan bahwa driver hanya memanggil ZwClose saat dijalankan di IRQL = PASSIVE_LEVEL.
Model driver: WDM
Pemeriksaan bug ditemukan dengan aturan ini: Pemeriksaan Bug 0xC4: DRIVER_VERIFIER_DETECTED_VIOLATION (0x2001F)
Contoh
Kode berikut melanggar aturan ini:
NTSTATUS
DriverCloseResources (
_In_ PDRIVER_CONTEXT Context
)
{
…
NT_ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL);
//
// ExAcquireFastMutex sets the IRQL to APC_LEVEL, and the caller continues
// to run at APC_LEVEL after ExAcquireFastMutex returns.
//
ExAcquireFastMutex(&Context->FastMutex);
....
if (NULL != Context->Handle) {
//
// RULE VIOLATION! - ZwClose can be called only at PASSIVE_LEVEL
//
ZwClose(Context->Handle);
Context->Handle = NULL;
}
....
//
// N.B. ExReleaseFastMutex restores the original IRQL.
//
ExReleaseFastMutex(&Context->FastMutex);
....
}
Cara menguji
Pada waktu kompilasi |
---|
Jalankan Pemverifikasi Driver Statis dan tentukan aturan IrqlZwPassive . Gunakan langkah-langkah berikut untuk menjalankan analisis kode Anda:
Untuk informasi selengkapnya, lihat Menggunakan Pemverifikasi Driver Statis untuk Menemukan Cacat pada Driver. |
Pada durasi |
---|
Jalankan Pemverifikasi Driver dan pilih opsi pemeriksaan kepatuhan DDI . |
Berlaku untuk
ZwCloseZwCreateKeyZwDeleteKeyZwEnumerateKeyZwEnumerateValueKeyZwFlushKeyZwOpenKeyZwQueryKeyZwQueryValueKeyZwSetValueKey