Regla IrqlExAllocatePool (wdm)
La regla IrqlExAllocatePool especifica que el controlador llama a ExAllocatePoolWithTag y ExAllocatePoolWithTagPriority solo cuando se ejecuta en IRQL<=DISPATCH_LEVEL.
Un llamador que se ejecuta en DISPATCH_LEVEL debe especificar un valorNonPaged Xxx para PoolType. Un llamador que se ejecuta en IRQL <= APC_LEVEL puede especificar cualquier valor de POOL_TYPE .
Modelo de controlador: WDM
Comprobaciones de errores encontradas con esta regla: Comprobación de errores 0xC4: DRIVER_VERIFIER_DETECTED_VIOLATION (0x00020004 ), Comprobación de errores 0xA: IRQL_NOT_LESS_OR_EQUAL
Ejemplo
En el ejemplo siguiente, se llama a la rutina ExAllocatePoolWithTag después de la rutina KeAcquireSpinLock , que establece IRQL en DISPATCH_LEVEL. Se llama a la rutina ExAllocatePoolWithTag con PagedPool, que infringe la regla.
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;
}
Cómo probar
En tiempo de compilación |
---|
Ejecute el Comprobador de controladores estáticos y especifique la regla IrqlExAllocatePool . Usa los pasos siguientes para ejecutar un análisis de tu código:
Para obtener más información, vea Usar comprobador de controladores estáticos para buscar defectos en controladores. |
En tiempo de ejecución |
---|
Ejecute Comprobador de controladores y seleccione la opción comprobación de cumplimiento de DDI . |
Se aplica a
ExAllocatePoolWithTagExAllocatePoolWithTagPriority
Consulte también
Administración de prioridades de hardwareque impiden errores y interbloqueos al usar bloqueos de número