WDM (IRQL 規則集)
使用這些規則來確認您的驅動程式在必要的 IRQL 進行 DDI 呼叫。
未遵循 IRQL 規則的驅動程式可能會導致作業期間發生嚴重問題,導致死結狀況或電腦當機。
本節內容
主題 | 描述 |
---|---|
ForwardedAtBadIrql 規則指定驅動程式應該在 IRQL<呼叫 IoCallDriver 和 PoCallDriver DISPATCH_LEVEL,除非轉送的 IRP 主要函式程式代碼是下列其中一項: |
|
ForwardedAtBadIrqlAllocate 規則指定驅動程式應該在 IRQL<DISPATCH_LEVEL呼叫 IoCallDriver 和 PoCallDriver,除非轉送的 IRP 主要函式程式代碼是下列其中一項: |
|
ForwardedAtBadIrqlFsdAsync 規則會指定驅動程式在 IRQL<DISPATCH_LEVEL呼叫 IoCallDriver 和 PoCallDriver,除非正在轉送的 IRP 主要函式程式代碼是下列其中一項: |
|
ForwardedAtBadIrqlFsdSync 規則會指定驅動程式在 IRQL<DISPATCH_LEVEL呼叫 IoCallDriver 和 PoCallDriver,除非轉送的 IRP 主要函式程式代碼是下列其中一項: |
|
IrqlApcLte 規則指定驅動程式只有在 IRQL <= APC_LEVEL執行時,才會呼叫 ObGetObjectSecurity 和 ObReleaseObjectSecurity。 |
|
IrqlDispatch 規則會指定只有在驅動程式在 IRQL = DISPATCH_LEVEL執行時,才會呼叫下列 DIS。 |
|
IrqlExAllocatePool 規則指定驅動程式只有在 IRQL<=DISPATCH_LEVEL執行時,才會呼叫 ExAllocatePoolWithTagWithTagWithPoolWithTagPriority。 |
|
IrqlExApcLte1 規則指定驅動程式只在 IRQL <= APC_LEVEL呼叫 ExAcquireFastMutex 和 ExTryToAcquireFastMutex。 |
|
IrqlExApcLte2 規則指定驅動程式只會在 IRQL <= APC_LEVEL呼叫下列例程。 |
|
IrqlExApcLte3 規則指定驅動程式只會在 IRQL <= APC_LEVEL呼叫下列主管支援例程。 |
|
IrqlExApcLteInline 規則指定只有在適當的 IRQL 層級上呼叫 DDI |
|
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設定為 FALSE 時呼叫 KeSetEvent 例程,而當 Wait 設定為 TRUE 時,在 IRQL <= APC_LEVEL。 |
|
IrqlKeWaitForMutexObject 規則會根據 Timeout 參數的值,指定在適當的 IRQL 上呼叫 KeWaitForMutexObject 例程的驅動程式: |
|
IrqlKeWaitForMultipleObjects 規則指定 KeWaitForMultipleObjects 例程的呼叫端必須根據 Timeout 參數在適當的 IRQL 上執行。 |
|
IrqlMmApcLte 規則指定驅動程式只在 IRQL <= APC_LEVEL執行時,才會呼叫下列記憶體管理員例程: |
|
IrqlMmDispatch 規則指定驅動程式只在 IRQL <= DISPATCH_LEVEL執行時,才會呼叫 MmFreeContiguousMemory。 |
|
IIrqlNtifsApcPassive 規則指定只有在驅動程式在 IRQL = PASSIVE_LEVEL或 IRQL <= APC_LEVEL 執行時,驅動程式才會呼叫規則中列出的 DIS。 |
|
IrqlObPassive 規則指定驅動程式只在 IRQL = PASSIVE_LEVEL執行時呼叫 ObReferenceObjectByHandle。 |
|
IrqlPsPassive 規則指定只有在驅動程式在 IRQL = PASSIVE_LEVEL執行時,才會呼叫下列進程結構例程: |
|
IrqlReturn 規則會指定驅動程式的分派例程會在呼叫它們所在的相同 IRQL 傳回。 |
|
IrqlRtlPassive 規則指定驅動程式只在 IRQL = PASSIVE_LEVEL執行時呼叫 RtlDeleteRegistryValue 。 |
|
IrqlZwPassive 規則指定驅動程式只在 IRQL = PASSIVE_LEVEL執行時呼叫 ZwClose。 |
若要選取 Irql 規則集
在 Microsoft Visual Studio 中選取驅動程式項目 (.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) 。