IRQL の規則セット (WDM)
これらのルールを使用して、ドライバーが必要な IRQL で DDI 呼び出しを行っているかを検証します。
IRQL ルールに従わないドライバーは、操作中に重大な問題を引き起こす可能性があり、デッドロック状態やコンピューターのクラッシュにつながる可能性があります。
このセクションの内容
裁判官 | 説明 |
---|---|
ForwardedAtBadIrql ルールは、転送される IRP の主要な関数コードが次のいずれかでない限り、ドライバーが IRQL<DISPATCH_LEVELで IoCallDriver と PoCallDriver を呼び出す必要があることを指定します。 |
|
ForwardedAtBadIrqlAllocate ルールは、転送される IRP の主要な関数コードが次のいずれかでない限り、ドライバーが IRQL<DISPATCH_LEVELで IoCallDriver と PoCallDriver を呼び出す必要があることを指定します。 |
|
ForwardedAtBadIrqlFsdAsync ルールは、転送される IRP の主要な関数コードが次のいずれかでない限り、ドライバーが IRQL<DISPATCH_LEVELで IoCallDriver と PoCallDriver を呼び出す必要があることを指定します。 |
|
ForwardedAtBadIrqlFsdSync ルールは、転送される IRP の主要な関数コードが次のいずれかでない限り、ドライバーが IRQL<DISPATCH_LEVELで IoCallDriver と PoCallDriver を呼び出す必要があることを指定します。 |
|
IrqlApcLte ルールは、ドライバーが IRQL< = APC_LEVEL で実行されている場合にのみ ObGetObjectSecurity と ObReleaseObjectSecurity を呼び出す必要があります。 |
|
IrqlDispatch ルールでは、ドライバーが IRQL = DISPATCH_LEVEL で実行されている場合にのみ、次の DDI を呼び出す必要があります。 |
|
IrqlExAllocatePool ルールでは、ドライバーが IRQL< = DISPATCH_LEVEL で実行されている場合にのみ、ExAllocatePoolWithTag および ExAllocatePoolWithTagPriority を呼び出す必要があります。 |
|
IrqlExApcLte1 ルールは、ドライバーは IRQL< = APC_LEVEL でのみ ExAcquireFastMutex と ExTryToAcquireFastMutex を呼び出す必要があります。 |
|
IrqlExApcLte2 ルールでは、ドライバーは IRQL <= APC_LEVEL でのみ次のルーチンを呼び出す必要があります。 |
|
IrqlExApcLte3 ルールでは、ドライバーは IRQL <= APC_LEVEL でのみ次のエグゼクティブ サポート ルーチンを呼び出す必要があります。 |
|
IrqlExApcLteInline ルールでは、DDI は適切な IRQL レベルでのみ呼び出される必要があります。 |
|
IrqlExFree1 ルールは、ExFreePool と ExFreePoolWithTag が適切な IRQL で呼び出されるように指定します。 |
|
IrqlExFree2 ルールは、ExFreePool と ExFreePoolWithTag が適切な IRQL で呼び出されるように指定します。 |
|
IrqlExFree3 ルールは、ExFreePool と ExFreePoolWithTag が適切な IRQL で呼び出されるように指定します。 |
|
IrqlExPassive ルールでは、ドライバーは IRQL = PASSIVE_LEVEL で次のエグゼクティブ サポート ルーチンを呼び出す必要があります。 IrqlExPassive ルールでは、ドライバーは IRQL <= APC_LEVEL で ExRaiseStatus を呼び出す必要があります。 |
|
IrqlIoApcLte ルールでは、ドライバーは IRQL <= APC_LEVEL で実行されている場合にのみ、次の I/O マネージャー ルーチンを呼び出す必要があります。 |
|
IrqlIoDispatch ルールは 、ドライバーが IRQL =< DISPATCH_LEVEL: IoGetDeviceToVerify、IoSetDeviceToVerify で実行されている場合にのみ、次の I/O マネージャー ルーチンを呼び出すように指定します。 |
|
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 ルールでは、Wait が FALSE に設定されている場合は IRQL <= DISPATCH_LEVEL でのみ KeSetEvent ルーチンが呼び出され Standard Edition、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で実行されている場合にのみ、ルールに記載されている DDI を呼び出すように指定します。 |
|
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)」を参照してください。