IRQL 규칙 집합(WDM)
이러한 규칙을 사용하여 드라이버가 필요한 IRQL에서 DDI 호출을 만드는지 확인합니다.
IRQL 규칙을 따르지 않는 드라이버는 작업 중에 심각한 문제를 일으킬 수 있으며 이로 인해 교착 상태 또는 컴퓨터 충돌이 발생할 수 있습니다.
섹션 내용
항목 | Description |
---|---|
ForwardedAtBadIrql 규칙은 전달되는 IRP 주요 함수 코드가 다음 중 하나가 아닌 한 드라이버가 IRQL<DISPATCH_LEVEL IoCallDriver 및 PoCallDriver를 호출하도록 지정합니다. |
|
ForwardedAtBadIrqlAllocate 규칙은 전달되는 IRP 주요 함수 코드가 다음 중 하나가 아닌 한 드라이버가 IRQL<DISPATCH_LEVEL IoCallDriver 및 PoCallDriver를 호출하도록 지정합니다. |
|
ForwardedAtBadIrqlFsdAsync 규칙은 전달되는 IRP 주요 함수 코드가 다음 중 하나가 아닌 한 드라이버가 IRQL<DISPATCH_LEVEL IoCallDriver 및 PoCallDriver를 호출하도록 지정합니다. |
|
ForwardedAtBadIrqlFsdSync 규칙은 전달되는 IRP 주요 함수 코드가 다음 중 하나가 아닌 한 드라이버가 IRQL<DISPATCH_LEVEL IoCallDriver 및 PoCallDriver를 호출하도록 지정합니다. |
|
IrqlApcLte 규칙은 드라이버가 IRQL <= APC_LEVEL 실행되는 경우에만 ObGetObjectSecurity 및 ObReleaseObjectSecurity를 호출한다고 지정합니다. |
|
IrqlDispatch 규칙은 드라이버가 IRQL = DISPATCH_LEVEL 실행되는 경우에만 다음 DDI를 호출한다고 지정합니다. |
|
IrqlExAllocatePool 규칙은 드라이버가 IRQL<=DISPATCH_LEVEL 실행되는 경우에만 ExAllocatePoolWithTag 및 ExAllocatePoolWithTagPriority를 호출함을 지정합니다. |
|
IrqlExApcLte1 규칙은 드라이버가 IRQL <= APC_LEVEL ExAcquireFastMutex 및 ExTryToAcquireFastMutex를 호출하는 것을 지정합니다. |
|
IrqlExApcLte2 규칙은 드라이버가 IRQL <= APC_LEVEL 다음 루틴을 호출하는 것을 지정합니다. |
|
IrqlExApcLte3 규칙은 드라이버가 IRQL <= APC_LEVEL 다음 임원 지원 루틴을 호출한다고 지정합니다. |
|
IrqlExApcLteInline 규칙은 DDI가 적절한 IRQL 수준에서만 호출되도록 지정합니다. |
|
IrqlExFree1 규칙은 ExFreePool 및 ExFreePoolWithTag가 적절한 IRQL에서 호출되도록 지정합니다. |
|
IrqlExFree2 규칙은 ExFreePool 및 ExFreePoolWithTag가 적절한 IRQL에서 호출되도록 지정합니다. |
|
IrqlExFree3 규칙은 ExFreePool 및 ExFreePoolWithTag가 적절한 IRQL에서 호출되도록 지정합니다. |
|
IrqlExPassive 규칙은 드라이버가 IRQL = PASSIVE_LEVEL 다음 임원 지원 루틴을 호출한다고 지정합니다. IrqlExPassive 규칙은 드라이버가 IRQL <= APC_LEVEL ExRaiseStatus를 호출하는 것을 지정합니다. |
|
IrqlIoApcLte 규칙은 드라이버가 IRQL <= APC_LEVEL 실행되는 경우에만 다음 I/O 관리자 루틴을 호출한다고 지정합니다. |
|
IrqlIoDispatch 규칙은 드라이버가 IRQL <= DISPATCH_LEVEL: IoGetDeviceToVerify, IoSetDeviceToVerify에서 실행되는 경우에만 다음 I/O 관리자 루틴을 호출한다고 지정합니다. |
|
IrqlIoPassive1 규칙은 드라이버가 IRQL = PASSIVE_LEVEL 실행 중인 경우에만 다음 루틴을 호출한다고 지정합니다. |
|
IrqlIoPassive2 규칙은 드라이버가 IRQL = PASSIVE_LEVEL 다음 I/O 관리자 루틴만 호출하는 것을 지정합니다. |
|
IrqlIoPassive3 규칙은 드라이버가 IRQL = PASSIVE_LEVEL 실행 중인 경우에만 다음 루틴을 호출한다고 지정합니다. |
|
IrqlIoPassive4 규칙은 드라이버가 IRQL = PASSIVE_LEVEL 실행 중인 경우에만 다음 루틴을 호출한다고 지정합니다. |
|
IrqlIoPassive5 규칙은 드라이버가 IRQL = PASSIVE_LEVEL 실행되는 경우에만 특정 I/O 관리자 루틴을 호출하는 것을 지정합니다. |
|
IrqlIoRtlZwPassive 규칙은 드라이버가 IRQL = PASSIVE_LEVEL 실행되는 경우에만 특정 I/O 관리자 루틴을 호출한다고 지정합니다. |
|
IrqlKeApcLte1 규칙은 드라이버가 IRQL <= APC_LEVEL 실행되는 경우에만 다음 커널 루틴을 호출한다고 지정합니다. |
|
IrqlKeApcLte2 규칙은 드라이버가 IRQL <= APC_LEVEL 실행되는 경우에만 다음 커널 루틴을 호출한다고 지정합니다. |
|
IrqlKeDispatchLte 규칙은 드라이버가 IRQL <= DISPATCH_LEVEL 실행되는 경우에만 다음 커널 루틴을 호출한다고 지정합니다. |
|
IrqlKeRaiseLower 규칙은 IRQL을 발생시키고 낮출 때 드라이버가 다음을 수행한다고 지정합니다. 드라이버가 KeRaiseIrql을 호출하면 NewIrql 매개 변수 값보다 낮거나 같은 IRQL에서 실행됩니다.드라이버는 KeRaiseIrql 또는 KeRaiseIrqlToDpcLevel을 호출한 후에만 KeLowerIrql을 호출합니다. |
|
IrqlKeRaiseLower2 규칙은 드라이버가 KeLowerIrql을 사용하여 KeRaiseIrql 또는 KeRaiseIrqlToDpcLevel에 대한 이전 호출로 발생한 원래 IRQL을 복원하도록 지정합니다. |
|
IrqlKeReleaseSpinLock 규칙은 드라이버가 IRQL = DISPATCH_LEVEL 실행되는 경우에만 KeReleaseSpinLock을 호출한다고 지정합니다. |
|
IrqlKeSetEvent 규칙은 Wait가 FALSE로 설정된 경우 IRQL <= DISPATCH_LEVEL, Wait가 TRUE로 설정된 경우 IRQL <= APC_LEVEL KeSetEvent 루틴만 호출하도록 지정합니다. |
|
IrqlKeWaitForMutexObject 규칙은 Timeout 매개 변수의 값에 따라 적절한 IRQL에서 KeWaitForMutexObject 루틴을 호출할 드라이버를 지정합니다. |
|
IrqlKeWaitForMultipleObjects 규칙은 Timeout 매개 변수에 따라 KeWaitForMultipleObjects 루틴의 호출자가 적절한 IRQL에서 실행되도록 지정합니다. |
|
IrqlMmApcLte 규칙은 드라이버가 IRQL <= APC_LEVEL 실행 중인 경우에만 다음 메모리 관리자 루틴을 호출한다고 지정합니다. |
|
IrqlMmDispatch 규칙은 드라이버가 IRQL <= DISPATCH_LEVEL 실행되는 경우에만 MmFreeContiguousMemory를 호출한다고 지정합니다. |
|
IIrqlNtifsApcPassive 규칙은 드라이버가 IRQL = PASSIVE_LEVEL 또는 IRQL <= APC_LEVEL 실행하는 경우에만 규칙에 나열된 DDI를 호출한다고 지정합니다. |
|
IrqlObPassive 규칙은 드라이버가 IRQL = PASSIVE_LEVEL 실행되는 경우에만 ObReferenceObjectByHandle을 호출한다고 지정합니다. |
|
IrqlPsPassive 규칙은 드라이버가 IRQL = PASSIVE_LEVEL 실행되는 경우에만 다음 프로세스 구조 루틴을 호출한다고 지정합니다. |
|
IrqlReturn 규칙은 드라이버의 디스패치 루틴이 호출된 동일한 IRQL에서 반환되도록 지정합니다. |
|
IrqlRtlPassive 규칙은 드라이버가 IRQL = PASSIVE_LEVEL 실행되는 경우에만 RtlDeleteRegistryValue 를 호출한다고 지정합니다. |
|
IrqlZwPassive 규칙은 드라이버가 IRQL = PASSIVE_LEVEL 실행 중인 경우에만 ZwClose를 호출한다고 지정합니다. |
Irql 규칙 집합을 선택하려면
Microsoft Visual Studio에서 드라이버 프로젝트(.vcxProj)를 선택합니다. 드라이버 메뉴에서 정적 드라이버 검증 도구 시작...을 클릭합니다.
규칙 탭을 클릭합니다. 규칙 집합에서 Irql을 선택합니다.
Visual Studio 개발자 명령 프롬프트 창에서 기본 규칙 집합을 선택하려면 /검사 옵션을 사용하여 Irql.sdv를 지정합니다. 예를 들면 다음과 같습니다.
msbuild /t:sdv /p:Inputs="/check:Irql.sdv" mydriver.VcxProj /p:Configuration="Win8 Release" /p:Platform=Win32
자세한 내용은 정적 드라이버 검증 도구를 사용하여 드라이버에서 결함 찾기 및 정적 드라이버 검증 도구 명령(MSBuild)을 참조하세요.