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 規則。 使用下列步驟來執行程式碼的分析:如需詳細資訊,請參閱 使用靜態驅動程式驗證器尋找驅動程式中的瑕疵。 |
运行时 |
---|
執行 驅動程式驗證器 ,然後選取 [DDI 合規性檢查 ] 選項。 |
適用於
ExAllocatePoolWithTagExAllocatePoolWithTagPriority