Regra IrqlExApcLte3 (wdm)
A regra IrqlExApcLte3 especifica que o driver chama as seguintes rotinas de suporte executivo somente em IRQL <= APC_LEVEL.
Os drivers que têm erros relacionados ao IRQL podem causar sérios problemas e podem causar uma falha no computador.
Modelo de driver: WDM
Marcar de bug encontrado com esta regra: 0xC4 de Verificação de Bugs: DRIVER_VERIFIER_DETECTED_VIOLATION (0x20007), 0xA de Verificação de Bugs: IRQL_NOT_LESS_OR_EQUAL
Exemplo
O código a seguir viola essa 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
)
{
ERESOURCE Resource;
NTSTATUS Status;
...
Resource = DeviceRequest->GetTableLock();
//
// RULE VIOLATION! - ExAcquireSharedStarveExclusive can be called only at
// IRQL <= APC_LEVEL.
//
if(!ExAcquireSharedStarveExclusive(&Resource, FALSE)) {
return STATUS_UNSUCCESSFUL;
}
...
ExReleaseResourceLite(&Resource);
...
return Status;
}
Como testar
Em tempo de compilação |
---|
Execute o Verificador de Driver Estático e especifique a regra IrqlExApcLte3 . 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
ExAcquireResourceExclusiveLiteExAcquireResourceSharedLiteExAcquireSharedStarveExclusiveExAcquireSharedWaitForExclusiveExConvertExclusiveToSharedLiteExDeleteResourceLite
Confira também
Gerenciando prioridades de hardwareimpedindo erros e deadlocks ao usar bloqueios de rotação