Правило 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 . Выполните следующие действия, чтобы выполнить анализ кода.
Дополнительные сведения см. в разделе Использование средства проверки статических драйверов для поиска дефектов в драйверах. |
во время выполнения |
---|
Запустите средство проверки драйверов и выберите параметр проверка соответствия DDI . |
Применяется к
ExAllocatePoolWithTagExAllocatePoolWithTagPriority
См. также раздел
Управление приоритетами оборудования, предотвращение ошибок и взаимоблокировок при использовании спин-блокировок