IrqlExApcLte3 ルール (wdm)
IrqlExApcLte3 ルールでは、ドライバーは IRQL <= APC_LEVEL でのみ次のエグゼクティブ サポート ルーチンを呼び出す必要があります。
IRQL に関連するエラーがあるドライバーは、重大な問題を引き起こす可能性があり、コンピューターがクラッシュする場合があります。
ドライバーモデル: WDM
このルールで見つかったバグチェック: バグチェック 0xC4: DRIVER_VERIFIER_DETECTED_VIOLATION (0x20007), バグチェック 0xA: IRQL_NOT_LESS_OR_EQUAL
規則に違反するコード例を次に示します。
NTSTATUS
DispatchRequest (
_In_ PDEVICE_REQUEST DeviceRequest
)
{
KIRQL OldIrql;
KSPIN_LOCK SpinLock;
NTSTATUS Status;
...
KeInitializeSpinLock(&SpinLock);
//
// KeAcquireSpinLock sets IRQL to DISPATCH_LEVEL and the previous IRQL is
// written to OldIrql after the lock is acquired.
//
KeAcquireSpinLock(&SpinLock, &OldIrql);
...
Status = ProcessRequest(DeviceRequest);
//
// KeReleaseSpinLock sets IRQL to the OldIrql returned by KeAcquireSpinLock.
//
KeReleaseSpinLock(&SpinLock, &OldIrql);
...
}
NTSTATUS
ProcessRequest (
_In_ PDEVICE_REQUEST DeviceRequest
)
{
ERESOURCE Resource;
NTSTATUS Status;
...
Resource = DeviceRequest->GetTableLock();
//
// RULE VIOLATION! - ExAcquireSharedStarveExclusive can be called only at
// IRQL <= APC_LEVEL.
//
if(!ExAcquireSharedStarveExclusive(&Resource, FALSE)) {
return STATUS_UNSUCCESSFUL;
}
...
ExReleaseResourceLite(&Resource);
...
return Status;
}
コンパイル時 |
---|
静的ドライバー検証ツール を実行し、 IrqlExApcLte3 規則を指定します。 コードの分析を実行するには、次の手順に従います。詳細については、 「静的ドライバー検証ツールを使用してドライバー の欠陥を見つける」を参照してください。 |
実行時 |
---|
ドライバー検証ツール を実行し、 DDI コンプライアンス チェック オプションを選択します。 |
ExAcquireResourceExclusiveLiteExAcquireResourceSharedLiteExAcquireSharedStarveExclusiveExAcquireSharedWaitForExclusiveExConvertExclusiveToSharedLiteExDeleteResourceLite