IrqlExAllocatePool ルール (wdm)
IrqlExAllocatePool ルールでは、ドライバーが IRQL<=DISPATCH_LEVEL で実行されている場合にのみ、 ExAllocatePoolWithTag および ExAllocatePoolWithTagPriority を呼び出す必要があります。
DISPATCH_LEVELで実行する呼び出し元は、 PoolType に NonPagedXxx 値を指定する必要があります。 IRQL <= APC_LEVEL で実行している呼び出し元は、任意の POOL_TYPE 値を指定できます。
ドライバーモデル: WDM
このルールで見つかったバグチェック: バグチェック 0xC4: DRIVER_VERIFIER_DETECTED_VIOLATION (0x00020004), バグチェック 0xA: IRQL_NOT_LESS_OR_EQUAL
例
次の例では、 ExAllocatePoolWithTag ルーチンは、IRQL をDISPATCH_LEVELに設定する KeAcquireSpinLock ルーチンの後に呼び出されます。 ExAllocatePoolWithTag ルーチンは、規則に違反する PagedPool で呼び出されます。
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
)
{
NTSTATUS Status;
...
//
// RULE VIOLATION! - IrqlExAllocatePool executing at DISPATCH_LEVEL must specify
// a NonPagedXxx value for PoolType.
//
DeviceRequest->Context = ExAllocatePool(PagedPool, sizeof(REQUEST_CONTEXT));
if (DeviceRequest->Context == NULL) {
Status = STATUS_INSUFFICIENT_RESOURCES;
}
...
return Status;
}
テスト方法
コンパイル時 |
---|
静的ドライバー検証ツール を実行し、 IrqlExAllocatePool 規則を指定します。 コードの分析を実行するには、次の手順に従います。詳細については、 「静的ドライバー検証ツールを使用してドライバー の欠陥を見つける」を参照してください。 |
実行時 |
---|
ドライバー検証ツール を実行し、 DDI コンプライアンス チェック オプションを選択します。 |
適用対象
ExAllocatePoolWithTagExAllocatePoolWithTagPriority