Share via


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 規則を指定します。

コードの分析を実行するには、次の手順に従います。
  1. コードを準備します (ロール型宣言を使用します)。
  2. 静的ドライバー検証ツールを実行します。
  3. 結果を表示および分析します。

詳細については、 「静的ドライバー検証ツールを使用してドライバー の欠陥を見つける」を参照してください。

実行時

ドライバー検証ツール を実行し、 DDI コンプライアンス チェック オプションを選択します。

適用対象

ExAllocatePoolWithTagExAllocatePoolWithTagPriority

関連項目

スピン ロックの使用中にエラーとデッドロックを防止するハードウェア優先度の管理