Regra IrqlExAllocatePool (wdm)
A regra IrqlExAllocatePool especifica que o driver chama ExAllocatePoolWithTag e ExAllocatePoolWithTagPriority somente quando está sendo executado em IRQL<=DISPATCH_LEVEL.
Um chamador em execução no DISPATCH_LEVEL deve especificar um valorXxx NãoPaged para PoolType. Um chamador em execução em IRQL <= APC_LEVEL pode especificar qualquer valor de POOL_TYPE .
Modelo de driver: WDM
Marcar de bugs encontrados com esta regra: 0xC4 de Verificação de Bugs: DRIVER_VERIFIER_DETECTED_VIOLATION (0x00020004), Verificação de Bugs 0xA: IRQL_NOT_LESS_OR_EQUAL
Exemplo
No exemplo a seguir, a rotina ExAllocatePoolWithTag é chamada após a rotina KeAcquireSpinLock , que define IRQL como DISPATCH_LEVEL. A rotina ExAllocatePoolWithTag é chamada com PagedPool, o que viola a regra.
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;
}
Como testar
Em tempo de compilação |
---|
Execute o Verificador de Driver Estático e especifique a regra IrqlExAllocatePool . Use as seguintes etapas para executar uma análise do código:
Para obter mais informações, consulte Usando o verificador de driver estático para localizar defeitos em drivers. |
Em tempo de execução |
---|
Execute o Verificador de Driver e selecione a opção de verificação de conformidade da DDI . |
Aplica-se a
ExAllocatePoolWithTagExAllocatePoolWithTagPriority
Confira também
Gerenciando prioridades de hardwareimpedindo erros e deadlocks ao usar bloqueios de rotação