Поделиться через


Правило IrqlExAllocatePool (wdm)

Правило IrqlExAllocatePool указывает, что драйвер вызывает ExAllocatePoolWithTag и ExAllocatePoolWithTagPriority только при выполнении в IRQL<=DISPATCH_LEVEL.

Вызывающий объект, выполняющийся в DISPATCH_LEVEL, должен указать значениеNonPaged Xxx для poolType. Вызывающий объект, выполняющий команду 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

См. также раздел

Управление приоритетами оборудования, предотвращение ошибок и взаимоблокировок при использовании спин-блокировок