Freigeben über


IrqlExAllocatePool-Regel (wdm)

Die IrqlExAllocatePool-Regel gibt an, dass der Treiber ExAllocatePoolWithTag und ExAllocatePoolWithTagPriority nur aufruft, wenn er mit IRQL<=DISPATCH_LEVEL ausgeführt wird.

Ein Aufrufer, der bei DISPATCH_LEVEL ausgeführt wird, muss einen NonPagedXxx-Wert für PoolType angeben. Ein Aufrufer, der bei IRQL <= APC_LEVEL ausgeführt wird, kann einen beliebigen POOL_TYPE Wert angeben.

Treibermodell: WDM

Fehlerüberprüfungen mit dieser Regel gefunden: Bug Check 0xC4: DRIVER_VERIFIER_DETECTED_VIOLATION (0x00020004), Bug Check 0xA: IRQL_NOT_LESS_OR_EQUAL

Beispiel

Im folgenden Beispiel wird die ExAllocatePoolWithTag-Routine nach der KeAcquireSpinLock-Routine aufgerufen, die IRQL auf DISPATCH_LEVEL festlegt. Die ExAllocatePoolWithTag-Routine wird mit PagedPool aufgerufen, was gegen die Regel verstößt.

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;
}

So führen Sie einen Test durch

Beim Kompilieren:

Führen Sie Static Driver Verifier aus, und geben Sie die IrqlExAllocatePool-Regel an.

Gehen Sie folgendermaßen vor, um Ihren Code zu analysieren:
  1. Bereiten Sie den Code vor (verwenden Sie Rollentypdeklarationen).
  2. Führen Sie Static Driver Verifier aus.
  3. Überprüfen und analysieren Sie die Ergebnisse.

Weitere Informationen finden Sie unter Verwenden der statischen Treiberüberprüfung, um Fehler in Treibern zu finden.

Zur Laufzeit

Führen Sie Driver Verifier aus, und wählen Sie die Option DDI-Konformitätsüberprüfung aus .

Gilt für:

ExAllocatePoolWithTagExAllocatePoolWithTagPriority

Weitere Informationen

Verwalten vonHardwareprioritäten zur Vermeidung von Fehlern und Deadlocks bei Verwendung von Drehsperren