次の方法で共有


IRQL の規則セット (WDM)

これらのルールを使用して、ドライバーが必要な IRQL で DDI 呼び出しを行っているかを検証します。

IRQL ルールに従わないドライバーは、操作中に重大な問題を引き起こす可能性があり、デッドロック状態やコンピューターのクラッシュにつながる可能性があります。

このセクションの内容

裁判官 説明

ForwardedAtBadIrql

ForwardedAtBadIrql ルールは、転送される IRP の主要な関数コードが次のいずれかでない限り、ドライバーが IRQL<DISPATCH_LEVELで IoCallDriverPoCallDriver を呼び出す必要があることを指定します。

ForwardedAtBadIrqlAllocate

ForwardedAtBadIrqlAllocate ルールは、転送される IRP の主要な関数コードが次のいずれかでない限り、ドライバーが IRQL<DISPATCH_LEVELで IoCallDriverPoCallDriver を呼び出す必要があることを指定します。

ForwardedAtBadIrqlFsdAsync

ForwardedAtBadIrqlFsdAsync ルールは、転送される IRP の主要な関数コードが次のいずれかでない限り、ドライバーが IRQL<DISPATCH_LEVELで IoCallDriverPoCallDriver を呼び出す必要があることを指定します。

ForwardedAtBadIrqlFsdSync

ForwardedAtBadIrqlFsdSync ルールは、転送される IRP の主要な関数コードが次のいずれかでない限り、ドライバーが IRQL<DISPATCH_LEVELで IoCallDriverPoCallDriver を呼び出す必要があることを指定します。

IrqlApcLte

IrqlApcLte ルールは、ドライバーが IRQL< = APC_LEVEL で実行されている場合にのみ ObGetObjectSecurityObReleaseObjectSecurity を呼び出す必要があります。

IrqlDispatch

IrqlDispatch ルールでは、ドライバーが IRQL = DISPATCH_LEVEL で実行されている場合にのみ、次の DDI を呼び出す必要があります。

IrqlExAllocatePool

IrqlExAllocatePool ルールでは、ドライバーが IRQL< = DISPATCH_LEVEL で実行されている場合にのみ、ExAllocatePoolWithTag および ExAllocatePoolWithTagPriority を呼び出す必要があります。

IrqlExApcLte1

IrqlExApcLte1 ルールは、ドライバーは IRQL< = APC_LEVEL でのみ ExAcquireFastMutexExTryToAcquireFastMutex を呼び出す必要があります。

IrqlExApcLte2

IrqlExApcLte2 ルールでは、ドライバーは IRQL <= APC_LEVEL でのみ次のルーチンを呼び出す必要があります。

IrqlExApcLte3

IrqlExApcLte3 ルールでは、ドライバーは IRQL <= APC_LEVEL でのみ次のエグゼクティブ サポート ルーチンを呼び出す必要があります。

IrqlExApcLteInline

IrqlExApcLteInline ルールでは、DDI は適切な IRQL レベルでのみ呼び出される必要があります。

IrqlExFree1

IrqlExFree1 ルールは、ExFreePoolExFreePoolWithTag が適切な IRQL で呼び出されるように指定します。

IrqlExFree2

IrqlExFree2 ルールは、ExFreePoolExFreePoolWithTag が適切な IRQL で呼び出されるように指定します。

IrqlExFree3

IrqlExFree3 ルールは、ExFreePoolExFreePoolWithTag が適切な IRQL で呼び出されるように指定します。

IrqlExPassive

IrqlExPassive ルールでは、ドライバーは IRQL = PASSIVE_LEVEL で次のエグゼクティブ サポート ルーチンを呼び出す必要があります。

IrqlExPassive ルールでは、ドライバーは IRQL <= APC_LEVEL で ExRaiseStatus を呼び出す必要があります。

IrqlIoApcLte

IrqlIoApcLte ルールでは、ドライバーは IRQL <= APC_LEVEL で実行されている場合にのみ、次の I/O マネージャー ルーチンを呼び出す必要があります。

IrqlIoDispatch

IrqlIoDispatch ルールは 、ドライバーが IRQL =< DISPATCH_LEVEL: IoGetDeviceToVerifyIoSetDeviceToVerify で実行されている場合にのみ、次の I/O マネージャー ルーチンを呼び出すように指定します。

IrqlIoPassive1

IrqlIoPassive1 ルールでは、ドライバーは IRQL = PASSIVE_LEVEL で実行されている場合にのみ、次のルーチンを呼び出す必要があります。

IrqlIoPassive2

IrqlIoPassive2 ルールでは、ドライバーは IRQL = PASSIVE_LEVEL でのみ、次の I/O マネージャー ルーチンを呼び出す必要があります。

IrqlIoPassive3

IrqlIoPassive3 ルールでは、ドライバーは IRQL = PASSIVE_LEVEL で実行されている場合にのみ、次のルーチンを呼び出す必要があります。

IrqlIoPassive4

IrqlIoPassive4 ルールでは、ドライバーは IRQL = PASSIVE_LEVEL で実行されている場合にのみ、次のルーチンを呼び出す必要があります。

IrqlIoPassive5

IrqlIoPassive5 ルールでは、ドライバーは IRQL = PASSIVE_LEVEL で実行されている場合にのみ、特定の I/O マネージャー ルーチンを呼び出す必要があります。

IrqlIoRtlZwPassive

IrqlIoRtlZwPassive ルールでは、ドライバーは IRQL = PASSIVE_LEVEL で実行されている場合にのみ、特定の I/O マネージャー ルーチンを呼び出す必要があります。

IrqlKeApcLte1

IrqlKeApcLte1 ルールでは、ドライバーは IRQL <= APC_LEVEL で実行されている場合にのみ、次のカーネル ルーチンを呼び出す必要があります。

IrqlKeApcLte2

IrqlKeApcLte2 ルールでは、ドライバーは IRQL <= APC_LEVEL で実行されている場合にのみ、次のカーネル ルーチンを呼び出す必要があります。

IrqlKeDispatchLte

IrqlKeDispatchLte ルールでは、ドライバーは IRQL <= DISPATCH_LEVEL で実行されている場合にのみ、次のカーネル ルーチンを呼びだす必要があります。

IrqlKeRaiseLower

IrqlKeRaiseLower ルールでは、IRQL を上げたり下げたりする場合に、ドライバーは次の処理を行う必要があります。

ドライバーから KeRaiseIrql が呼び出されると、NewIrql パラメーターの値以下の IRQL で実行されます。
ドライバーは、KeRaiseIrql または KeRaiseIrqlToDpcLevel を呼び出した後にのみ KeLowerIrql を呼び出します。

IrqlKeRaiseLower2

IrqlKeRaiseLower2 ルールでは、ドライバーは KeLowerIrql を使用して、KeRaiseIrql または KeRaiseIrqlToDpcLevel の前の呼び出しによって発生した元の IRQL を復元する必要があります。

IrqlKeReleaseSpinLock

IrqlKeReleaseSpinLock ルールでは、ドライバーは IRQL = DISPATCH_LEVEL で実行されている場合にのみ、 KeReleaseSpinLock を呼び出す必要があります。

IrqlKeSetEvent

IrqlKeSetEvent ルールでは、Wait が FALSE に設定されている場合は IRQL <= DISPATCH_LEVEL でのみ KeSetEvent ルーチンが呼び出され Standard Edition、WAITTRUE に設定されている場合は IRQL <= APC_LEVEL で呼び出されます。

IrqlKeWaitForMutexObject

IrqlKeWaitForMutexObject ルールでは、Timeout パラメーターの値に基づいて、適切な IRQL で KeWaitForMutexObject ルーチンを呼び出すドライバーが指定されます。

IrqlKeWaitForMultipleObjects

IrqlKeWaitForMultipleObjects ルールでは、KeWaitForMultipleObjects ルーチンの呼び出し元が Timeout パラメーターに基づいて適切な IRQL で実行されている必要があります。

IrqlMmApcLte

IrqlMmApcLte ルールでは、ドライバーは IRQL <= APC_LEVEL で実行されている場合にのみ、次のメモリ マネージャー ルーチンを呼び出す必要があります。

IrqlMmDispatch

IrqlMmDispatch ルールでは、ドライバーは IRQL< = DISPATCH_LEVEL で実行されている場合にのみ、 MmFreeContiguousMemory を呼び出す必要があります。

IrqlNtifsApcPassive

IIrqlNtifsApcPassive ルールは、ドライバーが IRQL = PASSIVE_LEVEL または IRQL <= APC_LEVELで実行されている場合にのみ、ルールに記載されている DDI を呼び出すように指定します。

IrqlObPassive

IrqlObPassive ルールでは、ドライバーが IRQL = PASSIVE_LEVEL で実行されている場合にのみ、ObReferenceObjectByHandle を呼び出す必要があります。

IrqlPsPassive

IrqlPsPassive ルールでは、ドライバーは IRQL = PASSIVE_LEVEL で実行されている場合にのみ、次のプロセス構造ルーチンを呼び出す必要があります。

IrqlReturn

IrqlReturn ルールは、ドライバーのディスパッチ ルーチンが呼び出されたのと同じ IRQL で返されることを指定します。

IrqlRtlPassive

IrqlRtlPassive ルールでは、ドライバーは IRQL = PASSIVE_LEVEL で実行されている場合にのみ、 RtlDeleteRegistryValue を呼び出す必要があります。

IrqlZwPassive

IrqlZwPassive ルールでは、ドライバーが IRQL = PASSIVE_LEVEL で実行されている場合にのみ、ZwClose を呼び出す必要があります。

Irql ルール セットを選択するには

  1. Microsoft Visual Studio でドライバー プロジェクト (.vcxProj) を選択します。 [ドライバー] メニューから [静的ドライバー検証ツールの起動...] をクリックします。

  2. [ルール] タブをクリックします。[ルール セット] で、[Irql] を選択します。

    Visual Studio の開発者コマンド プロンプト ウィンドウから既定のルール セットを選択するには、/check オプションで Irql.sdv を指定します。 次に例を示します。

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

    詳細については、「静的ドライバー検証ツールを使用して、ドライバーの欠陥を検出する」と「静的ドライバー検証ツールコマンド (MSBuild)」を参照してください。