Share via


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 규칙을 지정합니다.

다음 단계를 사용하여 코드 분석을 실행합니다.
  1. 코드를 준비합니다(역할 형식 선언 사용).
  2. 정적 드라이버 검증 도구를 실행합니다.
  3. 결과를 보고 분석합니다.

자세한 내용은 정적 드라이버 검증 도구를 사용하여 드라이버에서 결함 찾기를 참조하세요.

런타임 시

드라이버 검증 도구를 실행하고 DDI 규정 준수 확인 옵션을 선택합니다.

적용 대상

ExAcquireResourceExclusiveLiteExAcquireResourceSharedLiteExAcquireSharedStarveExclusiveExAcquireSharedWaitForExclusiveExConvertExclusiveToSharedLiteExDeleteResourceLite

추가 정보

스핀 잠금을 사용하는 동안 오류 및 교착 상태를 방지하는하드웨어 우선 순위 관리