다음을 통해 공유


IRQL 규칙 집합(WDM)

이러한 규칙을 사용하여 드라이버가 필요한 IRQL에서 DDI 호출을 만드는지 확인합니다.

IRQL 규칙을 따르지 않는 드라이버는 작업 중에 심각한 문제를 일으킬 수 있으며 이로 인해 교착 상태 또는 컴퓨터 충돌이 발생할 수 있습니다.

섹션 내용

항목 Description

ForwardedAtBadIrql

ForwardedAtBadIrql 규칙은 전달되는 IRP 주요 함수 코드가 다음 중 하나가 아닌 한 드라이버가 IRQL<DISPATCH_LEVEL IoCallDriverPoCallDriver를 호출하도록 지정합니다.

ForwardedAtBadIrqlAllocate

ForwardedAtBadIrqlAllocate 규칙은 전달되는 IRP 주요 함수 코드가 다음 중 하나가 아닌 한 드라이버가 IRQL<DISPATCH_LEVEL IoCallDriverPoCallDriver를 호출하도록 지정합니다.

ForwardedAtBadIrqlFsdAsync

ForwardedAtBadIrqlFsdAsync 규칙은 전달되는 IRP 주요 함수 코드가 다음 중 하나가 아닌 한 드라이버가 IRQL<DISPATCH_LEVEL IoCallDriverPoCallDriver를 호출하도록 지정합니다.

ForwardedAtBadIrqlFsdSync

ForwardedAtBadIrqlFsdSync 규칙은 전달되는 IRP 주요 함수 코드가 다음 중 하나가 아닌 한 드라이버가 IRQL<DISPATCH_LEVEL IoCallDriverPoCallDriver를 호출하도록 지정합니다.

IrqlApcLte

IrqlApcLte 규칙은 드라이버가 IRQL <= APC_LEVEL 실행되는 경우에만 ObGetObjectSecurityObReleaseObjectSecurity를 호출한다고 지정합니다.

IrqlDispatch

IrqlDispatch 규칙은 드라이버가 IRQL = DISPATCH_LEVEL 실행되는 경우에만 다음 DDI를 호출한다고 지정합니다.

IrqlExAllocatePool

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

IrqlExApcLte1

IrqlExApcLte1 규칙은 드라이버가 IRQL <= APC_LEVEL ExAcquireFastMutexExTryToAcquireFastMutex를 호출하는 것을 지정합니다.

IrqlExApcLte2

IrqlExApcLte2 규칙은 드라이버가 IRQL <= APC_LEVEL 다음 루틴을 호출하는 것을 지정합니다.

IrqlExApcLte3

IrqlExApcLte3 규칙은 드라이버가 IRQL <= APC_LEVEL 다음 임원 지원 루틴을 호출한다고 지정합니다.

IrqlExApcLteInline

IrqlExApcLteInline 규칙은 DDI가 적절한 IRQL 수준에서만 호출되도록 지정합니다.

IrqlExFree1

IrqlExFree1 규칙은 ExFreePool 및 ExFreePoolWithTag가 적절한 IRQL에서 호출되도록 지정합니다.

IrqlExFree2

IrqlExFree2 규칙은 ExFreePool 및 ExFreePoolWithTag가 적절한 IRQL에서 호출되도록 지정합니다.

IrqlExFree3

IrqlExFree3 규칙은 ExFreePool 및 ExFreePoolWithTag가 적절한 IRQL에서 호출되도록 지정합니다.

IrqlExPassive

IrqlExPassive 규칙은 드라이버가 IRQL = PASSIVE_LEVEL 다음 임원 지원 루틴을 호출한다고 지정합니다.

IrqlExPassive 규칙은 드라이버가 IRQL <= APC_LEVEL ExRaiseStatus를 호출하는 것을 지정합니다.

IrqlIoApcLte

IrqlIoApcLte 규칙은 드라이버가 IRQL <= APC_LEVEL 실행되는 경우에만 다음 I/O 관리자 루틴을 호출한다고 지정합니다.

IrqlIoDispatch

IrqlIoDispatch 규칙은 드라이버가 IRQL <= DISPATCH_LEVEL: IoGetDeviceToVerify, IoSetDeviceToVerify에서 실행되는 경우에만 다음 I/O 관리자 루틴을 호출한다고 지정합니다.

IrqlIoPassive1

IrqlIoPassive1 규칙은 드라이버가 IRQL = PASSIVE_LEVEL 실행 중인 경우에만 다음 루틴을 호출한다고 지정합니다.

IrqlIoPassive2

IrqlIoPassive2 규칙은 드라이버가 IRQL = PASSIVE_LEVEL 다음 I/O 관리자 루틴만 호출하는 것을 지정합니다.

IrqlIoPassive3

IrqlIoPassive3 규칙은 드라이버가 IRQL = PASSIVE_LEVEL 실행 중인 경우에만 다음 루틴을 호출한다고 지정합니다.

IrqlIoPassive4

IrqlIoPassive4 규칙은 드라이버가 IRQL = PASSIVE_LEVEL 실행 중인 경우에만 다음 루틴을 호출한다고 지정합니다.

IrqlIoPassive5

IrqlIoPassive5 규칙은 드라이버가 IRQL = PASSIVE_LEVEL 실행되는 경우에만 특정 I/O 관리자 루틴을 호출하는 것을 지정합니다.

IrqlIoRtlZwPassive

IrqlIoRtlZwPassive 규칙은 드라이버가 IRQL = PASSIVE_LEVEL 실행되는 경우에만 특정 I/O 관리자 루틴을 호출한다고 지정합니다.

IrqlKeApcLte1

IrqlKeApcLte1 규칙은 드라이버가 IRQL <= APC_LEVEL 실행되는 경우에만 다음 커널 루틴을 호출한다고 지정합니다.

IrqlKeApcLte2

IrqlKeApcLte2 규칙은 드라이버가 IRQL <= APC_LEVEL 실행되는 경우에만 다음 커널 루틴을 호출한다고 지정합니다.

IrqlKeDispatchLte

IrqlKeDispatchLte 규칙은 드라이버가 IRQL <= DISPATCH_LEVEL 실행되는 경우에만 다음 커널 루틴을 호출한다고 지정합니다.

IrqlKeRaiseLower

IrqlKeRaiseLower 규칙은 IRQL을 발생시키고 낮출 때 드라이버가 다음을 수행한다고 지정합니다.

드라이버가 KeRaiseIrql을 호출하면 NewIrql 매개 변수 값보다 낮거나 같은 IRQL에서 실행됩니다.
드라이버는 KeRaiseIrql 또는 KeRaiseIrqlToDpcLevel을 호출한 후에만 KeLowerIrql 호출합니다.

IrqlKeRaiseLower2

IrqlKeRaiseLower2 규칙은 드라이버가 KeLowerIrql을 사용하여 KeRaiseIrql 또는 KeRaiseIrqlToDpcLevel에 대한 이전 호출로 발생한 원래 IRQL을 복원하도록 지정합니다.

IrqlKeReleaseSpinLock

IrqlKeReleaseSpinLock 규칙은 드라이버가 IRQL = DISPATCH_LEVEL 실행되는 경우에만 KeReleaseSpinLock을 호출한다고 지정합니다.

IrqlKeSetEvent

IrqlKeSetEvent 규칙은 Wait가 FALSE로 설정된 경우 IRQL <= DISPATCH_LEVEL, WaitTRUE로 설정된 경우 IRQL <= APC_LEVEL KeSetEvent 루틴만 호출하도록 지정합니다.

IrqlKeWaitForMutexObject

IrqlKeWaitForMutexObject 규칙은 Timeout 매개 변수의 값에 따라 적절한 IRQL에서 KeWaitForMutexObject 루틴을 호출할 드라이버를 지정합니다.

IrqlKeWaitForMultipleObjects

IrqlKeWaitForMultipleObjects 규칙은 Timeout 매개 변수에 따라 KeWaitForMultipleObjects 루틴의 호출자가 적절한 IRQL에서 실행되도록 지정합니다.

IrqlMmApcLte

IrqlMmApcLte 규칙은 드라이버가 IRQL <= APC_LEVEL 실행 중인 경우에만 다음 메모리 관리자 루틴을 호출한다고 지정합니다.

IrqlMmDispatch

IrqlMmDispatch 규칙은 드라이버가 IRQL <= DISPATCH_LEVEL 실행되는 경우에만 MmFreeContiguousMemory를 호출한다고 지정합니다.

IrqlNtifsApcPassive

IIrqlNtifsApcPassive 규칙은 드라이버가 IRQL = PASSIVE_LEVEL 또는 IRQL <= APC_LEVEL 실행하는 경우에만 규칙에 나열된 DDI를 호출한다고 지정합니다.

IrqlObPassive

IrqlObPassive 규칙은 드라이버가 IRQL = PASSIVE_LEVEL 실행되는 경우에만 ObReferenceObjectByHandle을 호출한다고 지정합니다.

IrqlPsPassive

IrqlPsPassive 규칙은 드라이버가 IRQL = PASSIVE_LEVEL 실행되는 경우에만 다음 프로세스 구조 루틴을 호출한다고 지정합니다.

IrqlReturn

IrqlReturn 규칙은 드라이버의 디스패치 루틴이 호출된 동일한 IRQL에서 반환되도록 지정합니다.

IrqlRtlPassive

IrqlRtlPassive 규칙은 드라이버가 IRQL = PASSIVE_LEVEL 실행되는 경우에만 RtlDeleteRegistryValue 를 호출한다고 지정합니다.

IrqlZwPassive

IrqlZwPassive 규칙은 드라이버가 IRQL = PASSIVE_LEVEL 실행 중인 경우에만 ZwClose를 호출한다고 지정합니다.

Irql 규칙 집합을 선택하려면

  1. Microsoft Visual Studio에서 드라이버 프로젝트(.vcxProj)를 선택합니다. 드라이버 메뉴에서 정적 드라이버 검증 도구 시작...을 클릭합니다.

  2. 규칙 탭을 클릭합니다. 규칙 집합에서 Irql을 선택합니다.

    Visual Studio 개발자 명령 프롬프트 창에서 기본 규칙 집합을 선택하려면 /검사 옵션을 사용하여 Irql.sdv를 지정합니다. 예를 들면 다음과 같습니다.

    msbuild /t:sdv /p:Inputs="/check:Irql.sdv" mydriver.VcxProj /p:Configuration="Win8 Release" /p:Platform=Win32
    

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