Правило IrqlExApcLte3 (wdm)
Правило IrqlExApcLte3 указывает, что драйвер вызывает следующие исполнительные подпрограммы поддержки только в IRQL <= APC_LEVEL.
Драйверы с ошибками, связанными с IRQL, могут вызвать серьезные проблемы и привести к сбою компьютера.
Модель драйвера: WDM
Проверка ошибок, обнаруженных с помощью этого правила: 0xC4 проверки ошибок: DRIVER_VERIFIER_DETECTED_VIOLATION (0x20007), 0xA проверки ошибок: IRQL_NOT_LESS_OR_EQUAL
Пример
Следующий код нарушает это правило:
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;
}
Как тестировать
Во время компиляции |
---|
Запустите средство проверки статических драйверов и укажите правило IrqlExApcLte3 . Чтобы выполнить анализ кода, выполните следующие действия.
Дополнительные сведения см. в статье Использование средства проверки статических драйверов для поиска дефектов в драйверах. |
во время выполнения |
---|
Запустите средство проверки драйверов и выберите параметр проверки соответствия DDI . |
Применяется к
ExAcquireRequireResourceExclusiveLiteExAcquireResourceSharedLiteExAcquireSharedStarveExclusiveExAcquireSharedWaitForExclusiveExConvertExclusiveToSharedLiteExDeleteResourceLite
См. также раздел
Управление приоритетами оборудования. Предотвращение ошибок и взаимоблокировок при использовании спиновых блокировок