共用方式為


IrqlExAllocatePool 規則 (wdm)

IrqlExAllocatePool 規則指定驅動程式只有在 IRQL<=DISPATCH_LEVEL 執行時,才會呼叫 ExAllocatePoolWithTagWithPoolWithPoolWithTagPriority

在 DISPATCH_LEVEL 執行的呼叫端必須指定 PoolType 的 NonPagedXxx 值。 在 IRQL <= APC_LEVEL執行的呼叫端可以指定任何 POOL_TYPE 值。

驅動程式模型:WDM

此規則找到的錯誤檢查 () 錯誤檢查0xC4:DRIVER_VERIFIER_DETECTED_VIOLATION (0x00020004) 錯誤檢查0xA:IRQL_NOT_LESS_OR_EQUAL

範例

在下列範例中, ExAllocatePoolWithTag 例程會在 KeAcquireSpinLock 例程之後呼叫,其會將 IRQL 設定為 DISPATCH_LEVEL。 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

另請參閱

管理使用微調鎖定時防止錯誤和死結的硬體優先順序