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 규정 준수 확인 옵션을 선택합니다. |
적용 대상
ExAcquireResourceExclusiveLiteExAcquireResourceSharedLiteExAcquireSharedStarveExclusiveExAcquireSharedWaitForExclusiveExConvertExclusiveToSharedLiteExDeleteResourceLite