Bagikan melalui


Seperangkat aturan IRQL (WDM)

Gunakan aturan ini untuk memverifikasi bahwa driver Anda melakukan panggilan DDI di IRQL yang diperlukan.

Driver yang tidak mengikuti aturan IRQL dapat menyebabkan masalah serius selama operasi yang dapat menyebabkan kondisi kebuntuan atau crash komputer.

Di bagian ini

Topik Deskripsi

ForwardedAtBadIrql

Aturan ForwardedAtBadIrql menentukan bahwa driver harus memanggil IoCallDriver dan PoCallDriver di IRQL<DISPATCH_LEVEL kecuali kode fungsi utama IRP yang diteruskan adalah salah satu dari berikut ini:

ForwardedAtBadIrqlAllocate

Aturan ForwardedAtBadIrqlAllocate menentukan bahwa driver harus memanggil IoCallDriver dan PoCallDriver di IRQL<DISPATCH_LEVEL, kecuali kode fungsi utama IRP yang diteruskan adalah salah satu hal berikut:

ForwardedAtBadIrqlFsdAsync

Aturan ForwardedAtBadIrqlFsdAsync menentukan bahwa panggilan driver IoCallDriver dan PoCallDriver di IRQL<DISPATCH_LEVEL, kecuali kode fungsi utama IRP yang diteruskan adalah salah satu dari berikut ini:

ForwardedAtBadIrqlFsdSync

Aturan ForwardedAtBadIrqlFsdSync menentukan bahwa panggilan driver IoCallDriver dan PoCallDriver di IRQL<DISPATCH_LEVEL, kecuali kode fungsi utama IRP yang diteruskan adalah salah satu dari berikut ini:

IrqlApcLte

Aturan IrqlApcLte menentukan bahwa driver memanggil ObGetObjectSecurity dan ObReleaseObjectSecurity hanya ketika dijalankan di IRQL <= APC_LEVEL.

IrqlDispatch

Aturan IrqlDispatch menentukan bahwa driver memanggil DDI berikut hanya ketika dijalankan di IRQL = DISPATCH_LEVEL.

IrqlExAllocatePool

Aturan IrqlExAllocatePool menentukan bahwa driver memanggil ExAllocatePoolWithTag dan ExAllocatePoolWithTagPriority hanya ketika dijalankan di IRQL<=DISPATCH_LEVEL.

IrqlExApcLte1

Aturan IrqlExApcLte1 menentukan bahwa driver memanggil ExAcquireFastMutex dan ExTryToAcquireFastMutex hanya di IRQL <= APC_LEVEL.

IrqlExApcLte2

Aturan IrqlExApcLte2 menentukan bahwa driver memanggil rutinitas berikut hanya di IRQL <= APC_LEVEL.

IrqlExApcLte3

Aturan IrqlExApcLte3 menentukan bahwa driver memanggil rutinitas dukungan eksekutif berikut hanya di IRQL <= APC_LEVEL.

IrqlExApcLteInline

Aturan IrqlExApcLteInline menentukan bahwa DDI hanya dipanggil pada tingkat IRQL yang tepat

IrqlExFree1

Aturan IrqlExFree1 menentukan bahwa ExFreePool dan ExFreePoolWithTag dipanggil pada IRQL yang tepat.

IrqlExFree2

Aturan IrqlExFree2 menentukan bahwa ExFreePool dan ExFreePoolWithTag dipanggil pada IRQL yang tepat.

IrqlExFree3

Aturan IrqlExFree3 menentukan bahwa ExFreePool dan ExFreePoolWithTag dipanggil pada IRQL yang tepat.

IrqlExPassive

Aturan IrqlExPassive menentukan bahwa driver memanggil rutinitas dukungan eksekutif berikut hanya di IRQL = PASSIVE_LEVEL:

Aturan IrqlExPassive juga menentukan bahwa driver memanggil ExRaiseStatus di IRQL <= APC_LEVEL

IrqlIoApcLte

Aturan IrqlIoApcLte menentukan bahwa driver memanggil rutinitas manajer I/O berikut hanya ketika dijalankan di IRQL <= APC_LEVEL:

IrqlIoDispatch

Aturan IrqlIoDispatch menentukan bahwa driver memanggil rutinitas Manajer I/O berikut hanya ketika dijalankan di IRQL <= DISPATCH_LEVEL: IoGetDeviceToVerify, IoSetDeviceToVerify.

IrqlIoPassive1

Aturan IrqlIoPassive1 menentukan bahwa driver memanggil rutinitas berikut hanya ketika dijalankan di IRQL = PASSIVE_LEVEL:

IrqlIoPassive2

Aturan IrqlIoPassive2 menentukan bahwa driver memanggil rutinitas Manajer I/O berikut hanya di IRQL = PASSIVE_LEVEL:

IrqlIoPassive3

Aturan IrqlIoPassive3 menentukan bahwa driver memanggil rutinitas berikut hanya ketika dijalankan di IRQL = PASSIVE_LEVEL:

IrqlIoPassive4

Aturan IrqlIoPassive4 menentukan bahwa driver memanggil rutinitas berikut hanya ketika dijalankan di IRQL = PASSIVE_LEVEL:

IrqlIoPassive5

Aturan IrqlIoPassive5 menentukan bahwa driver memanggil rutinitas I/O Manager tertentu hanya ketika dijalankan di IRQL = PASSIVE_LEVEL.

IrqlIoRtlZwPassive

Aturan IrqlIoRtlZwPassive menentukan bahwa driver memanggil rutinitas I/O Manager tertentu hanya ketika dijalankan di IRQL = PASSIVE_LEVEL.

IrqlKeApcLte1

Aturan IrqlKeApcLte1 menentukan bahwa driver memanggil rutinitas kernel berikut hanya ketika dijalankan di IRQL <= APC_LEVEL:

IrqlKeApcLte2

Aturan IrqlKeApcLte2 menentukan bahwa driver memanggil rutinitas kernel berikut hanya ketika dijalankan di IRQL <= APC_LEVEL:

IrqlKeDispatchLte

Aturan IrqlKeDispatchLte menentukan bahwa driver memanggil rutinitas kernel berikut hanya ketika dijalankan di IRQL <= DISPATCH_LEVEL:

IrqlKeRaiseLower

Aturan IrqlKeRaiseLower menentukan bahwa driver melakukan hal berikut saat menaikkan dan menurunkan IRQL:

Ketika driver memanggil KeRaiseIrql, driver dijalankan pada IRQL yang lebih rendah dari atau sama dengan nilai parameter NewIrql .
Driver memanggil KeLowerIrql hanya setelah memanggil KeRaiseIrql atau KeRaiseIrqlToDpcLevel.

IrqlKeRaiseLower2

Aturan IrqlKeRaiseLower2 menentukan bahwa driver menggunakan KeLowerIrql untuk memulihkan IRQL asli yang dinaikkan oleh panggilan sebelumnya ke KeRaiseIrql atau KeRaiseIrqlToDpcLevel.

IrqlKeReleaseSpinLock

Aturan IrqlKeReleaseSpinLock menentukan bahwa driver memanggil KeReleaseSpinLock hanya ketika dijalankan di IRQL = DISPATCH_LEVEL.

IrqlKeSetEvent

Aturan IrqlKeSetEvent menentukan bahwa rutinitas KeSetEvent hanya dipanggil di IRQL <= DISPATCH_LEVEL saat Wait diatur ke FALSE, dan pada IRQL <= APC_LEVEL saat Wait diatur ke TRUE.

IrqlKeWaitForMutexObject

Aturan IrqlKeWaitForMutexObject menentukan driver untuk memanggil rutinitas KeWaitForMutexObject di IRQL yang tepat berdasarkan nilai parameter Timeout :

IrqlKeWaitForMultipleObjects

Aturan IrqlKeWaitForMultipleObjects menentukan bahwa pemanggil rutin KeWaitForMultipleObjects harus berjalan pada IRQL yang tepat berdasarkan parameter Timeout .

IrqlMmApcLte

Aturan IrqlMmApcLte menentukan bahwa driver memanggil rutinitas manajer memori berikut hanya ketika dijalankan di IRQL <= APC_LEVEL:

IrqlMmDispatch

Aturan IrqlMmDispatch menentukan bahwa driver memanggil MmFreeContiguousMemory hanya ketika dijalankan di IRQL <= DISPATCH_LEVEL.

IrqlNtifsApcPassive

Aturan IIrqlNtifsApcPassive menentukan bahwa driver memanggil DDI yang tercantum dalam aturan hanya ketika dijalankan baik di IRQL = PASSIVE_LEVEL atau di IRQL <= APC_LEVEL.

IrqlObPassive

Aturan IrqlObPassive menentukan bahwa driver memanggil ObReferenceObjectByHandle hanya ketika dijalankan di IRQL = PASSIVE_LEVEL.

IrqlPsPassive

Aturan IrqlPsPassive menentukan bahwa driver memanggil rutinitas Struktur Proses berikut hanya ketika dijalankan di IRQL = PASSIVE_LEVEL:

IrqlReturn

Aturan IrqlReturn menentukan bahwa rutinitas pengiriman driver kembali pada IRQL yang sama tempat mereka dipanggil.

IrqlRtlPassive

Aturan IrqlRtlPassive menentukan bahwa driver memanggil RtlDeleteRegistryValue hanya ketika dijalankan di IRQL = PASSIVE_LEVEL.

IrqlZwPassive

Aturan IrqlZwPassive menentukan bahwa driver memanggil ZwClose hanya ketika dijalankan di IRQL = PASSIVE_LEVEL.

Untuk memilih seperangkat aturan Irql

  1. Pilih proyek driver Anda (.vcxProj) di Microsoft Visual Studio. Dari menu Driver , klik Luncurkan Pemverifikasi Driver Statis....

  2. Klik tab Aturan . Di bawah Seperangkat Aturan, pilih Irql.

    Untuk memilih seperangkat aturan default dari jendela prompt perintah pengembang Visual Studio, tentukan Irql.sdv dengan opsi /check . Contohnya:

    msbuild /t:sdv /p:Inputs="/check:Irql.sdv" mydriver.VcxProj /p:Configuration="Win8 Release" /p:Platform=Win32
    

    Untuk informasi selengkapnya, lihat Menggunakan Pemverifikasi Driver Statis untuk Menemukan Cacat dalam perintah Driver dan Verifier Driver Statis (MSBuild).