다음을 통해 공유


IrqlExAllocatePool 규칙(wdm)

IrqlExAllocatePool 규칙은 드라이버가 IRQL<=DISPATCH_LEVEL 실행되는 경우에만 ExAllocatePoolWithTagExAllocatePoolWithTagPriority를 호출함을 지정합니다.

DISPATCH_LEVEL 실행되는 호출자는 PoolType에 대해 NonPagedXxx 값을 지정해야 합니다. IRQL <= APC_LEVEL 실행되는 호출자는 POOL_TYPE 값을 지정할 수 있습니다.

드라이버 모델: WDM

버그 검사 0xC4: DRIVER_VERIFIER_DETECTED_VIOLATION(0x00020004), 버그 검사 0xA: IRQL_NOT_LESS_OR_EQUAL 규칙으로 발견된 버그 검사

예제

다음 예제에서 ExAllocatePoolWithTag 루틴은 IRQL을 DISPATCH_LEVEL 설정하는 KeAcquireSpinLock 루틴 이후에 호출됩니다. ExAllocatePoolWithTag 루틴은 규칙을 위반하는 PagedPool을 사용하여 호출됩니다.

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;
}

테스트 방법

컴파일 시

정적 드라이버 검증 도구 를 실행하고 IrqlExAllocatePool 규칙을 지정합니다.

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

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

런타임 시

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

적용 대상

ExAllocatePoolWithTagExAllocatePoolWithTagPriority

추가 정보

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