使用這些規則來確認您的驅動程式在必要的 IRQL 上進行 DDI 呼叫。
未遵循 IRQL 規則的驅動程式可能會導致作業期間發生嚴重問題,而導致死結狀況或電腦當機。
本節中
| 主題 | 說明 |
|---|---|
ForwardedAtBadIrql 規則指定驅動程式應該在 IRQLDISPATCH_LEVEL呼叫 IoCallDriver 和 <,除非轉送的 IRP 主要函式程式代碼是下列其中一項: |
|
ForwardedAtBadIrqlAllocate 規則會指定驅動程式應該在 IRQLDISPATCH_LEVEL呼叫 IoCallDriver 和 <,除非轉送的 IRP 主要函式程式代碼是下列其中一項: |
|
ForwardedAtBadIrqlFsdAsync 規則指定驅動程式應在 IRQLDISPATCH_LEVEL 呼叫 IoCallDriver 和 <,除非要轉送的 IRP 主要功能代碼是以下其中之一: |
|
ForwardedAtBadIrqlFsdSync 規則要求驅動程式在 IRQLDISPATCH_LEVEL 呼叫 IoCallDriver 和 <,除非被轉送的 IRP 主要功能程式代碼是下列其中之一: |
|
IrqlApcLte 規則指定驅動程式只有在 IRQL = APC_LEVEL 執行時,才會呼叫 ObGetObjectSecurity 和 <。 |
|
IrqlDispatch 規則指定驅動程式只有在執行於 IRQL = DISPATCH_LEVEL 時,才會呼叫下列 DDI。 |
|
IrqlExAllocatePool 規則會指定驅動程式只有在 IRQL=DISPATCH_LEVEL 執行時,才會呼叫 ExAllocatePoolWithTagWithPoolWithPoolWithTagPriority。< |
|
IrqlExApcLte1 規則指定驅動程式只會在 IRQL = APC_LEVEL 呼叫 ExAcquireFastMutex 和 <。 |
|
IrqlExApcLte2 規則指定驅動程式只會在 IRQL <= APC_LEVEL 呼叫下列例程。 |
|
IrqlExApcLte3 規則指定驅動程式只會在 IRQL <= APC_LEVEL 呼叫下列執行支援例程。 |
|
IrqlExApcLteInline 規則指定 DDI 只能在適當的 IRQL 層級呼叫 |
|
IrqlExFree1 規則指定在適當的 IRQL 呼叫 ExFreePool 和 ExFreePoolWithTag。 |
|
IrqlExFree2 規則指定在適當的 IRQL 呼叫 ExFreePool 和 ExFreePoolWithTag。 |
|
IrqlExFree3 規則規定必須在適當的 IRQL 上呼叫ExFreePool和ExFreePoolWithTag。 |
|
IrqlExPassive 規則指定驅動程式只會在 IRQL = PASSIVE_LEVEL 呼叫下列執行支援例程: IrqlExPassive 規則還會指定驅動程式在 IRQL = APC_LEVEL 時呼叫 <。 |
|
IrqlIoApcLte 規則指定只有當驅動程式在 IRQL <= APC_LEVEL執行時,才會呼叫下列 I/O 管理員例程: |
|
IrqlIoDispatch 規則指定只有當驅動程式在 IRQL <= DISPATCH_LEVEL執行時,驅動程式才會呼叫下列 I/O 管理員例程:IoGetDeviceToVerify、IoSetDeviceToVerify。 |
|
IrqlIoPassive1 規則指定只有當驅動程式在 IRQL = PASSIVE_LEVEL執行時,才會呼叫下列例程: |
|
IrqlIoPassive2 規則指定驅動程式只會在 IRQL = PASSIVE_LEVEL 呼叫下列 I/O 管理員例程: |
|
IrqlIoPassive3 規則指定只有當驅動程式在 IRQL = PASSIVE_LEVEL執行時,才會呼叫下列例程: |
|
IrqlIoPassive4 規則指定只有當驅動程式在 IRQL = PASSIVE_LEVEL執行時,才會呼叫下列例程: |
|
IrqlIoPassive5 規則指定只有在驅動程式在 IRQL = PASSIVE_LEVEL執行時,才會呼叫特定的 I/O 管理員例程。 |
|
IrqlIoRtlZwPassive 規則指定只有當驅動程式在 IRQL = PASSIVE_LEVEL執行時,才會呼叫特定的 I/O 管理員例程。 |
|
IrqlKeApcLte1 規則指定只有當驅動程式在 IRQL <= APC_LEVEL執行時,才會呼叫下列核心例程: |
|
IrqlKeApcLte2 規則指定只有當驅動程式在 IRQL <= APC_LEVEL執行時,才會呼叫下列核心例程: |
|
IrqlKeDispatchLte 規則指定只有當驅動程式在 IRQL <= DISPATCH_LEVEL執行時,才會呼叫下列核心例程: |
|
IrqlKeRaiseLower 規則會指定驅動程式在提高和降低 IRQL 時執行下列動作: 當驅動程式呼叫 KeRaiseIrql 時,它會在小於或等於 NewIrql 參數值的 IRQL 上執行。只有在呼叫 KeRaiseIrql 或 KeRaiseIrqlToDpcLevel 之後,驅動程式才會呼叫 KeLowerIrql。 |
|
IrqlKeRaiseLower2 規則指定驅動程式使用 KeLowerIrql 還原先前呼叫 KeRaiseIrql 或 KeRaiseIrqlToDpcLevel 所引發的原始 IRQL。 |
|
IrqlKeReleaseSpinLock 規則指定只有當驅動程式在 IRQL = DISPATCH_LEVEL執行時,才會呼叫 KeReleaseSpinLock。 |
|
IrqlKeSetEvent 規則指定 KeSetEvent 例程只會在 IRQL <= DISPATCH_LEVEL當 Wait 設定為 FALSE 時呼叫,而當 < 設定為 TRUE 時,在 IRQL = APC_LEVEL。 |
|
IrqlKeWaitForMutexObject 規則會根據 Timeout 參數的值,指定在適當的 IRQL 上呼叫 KeWaitForMutexObject 例程的驅動程式: |
|
IrqlKeWaitForMultipleObjects 規則指定 KeWaitForMultipleObjects 例程的呼叫端必須根據 Timeout 參數在適當的 IRQL 執行。 |
|
IrqlMmApcLte 規則指定只有當驅動程式在 IRQL <= APC_LEVEL執行時,才會呼叫下列記憶體管理員例程: |
|
IrqlMmDispatch 規則指定只有當驅動程式在 IRQL = DISPATCH_LEVEL執行時,才會呼叫 <。 |
|
IIrqlNtifsApcPassive 規則指定,只有當驅動程式在 IRQL = PASSIVE_LEVEL 或 IRQL <= APC_LEVEL 時,才會呼叫規則中列出的 DDIs。 |
|
IrqlObPassive 規則指定只有當驅動程式在 IRQL = PASSIVE_LEVEL執行時,才會呼叫 ObReferenceObjectByHandle。 |
|
IrqlPsPassive 規則會指定驅動程式只有在 IRQL = PASSIVE_LEVEL執行時,才會呼叫特定的進程結構例程。 |
|
IrqlReturn 規則指定驅動程式的分派例行程序必須在被呼叫的相同 IRQL 下返回。 |
|
IrqlRtlPassive 規則指定只有當驅動程式在 IRQL = PASSIVE_LEVEL執行時,才會呼叫 RtlDeleteRegistryValue 。 |
|
IrqlZwPassive 規則指定只有在驅動程式在 IRQL = PASSIVE_LEVEL 執行時,才會呼叫 ZwClose。 |
若要選取 Irql 規則集
在 Visual Studio Microsoft中選取您的驅動程式專案 (.vcxProj)。 從 驅動程式 選單中,點擊 啟動靜態驅動程式驗證程式…。
按兩下 [ 規則] 索引標籤。在 [規則集] 底下,選取 [Irql]。
若要從 Visual Studio 開發人員命令提示字元視窗中選取預設規則集,請使用 /check 選項指定 Irql.sdv。 例如:
msbuild /t:sdv /p:Inputs="/check:Irql.sdv" mydriver.VcxProj /p:Configuration="Win8 Release" /p:Platform=Win32如需詳細資訊,請參閱 使用靜態驅動程式驗證器尋找驅動程式中的瑕疵 和 靜態驅動程式驗證器命令(MSBuild)。