다음을 통해 공유


IrpProcessing 규칙 집합(WDM)

이러한 규칙을 사용하여 드라이버가 IRP(I/O 요청 패킷)를 올바르게 처리하는지 확인합니다.

섹션 내용

항목 Description

CompleteRequest

CompleteRequest 규칙은 완료 루틴이 실행된 후 IoCompleteRequest 루틴이 호출되지 않고 STATUS_MORE_PROCESSING_REQUIRED 반환하지 않는지 확인합니다.

CompleteRequestStatusCheck

CompleteRequestStatusCheck 규칙은 IRP의 I/O 상태 값이 하위 드라이버에서 반환한 상태 값과 일치하는지 확인합니다.

CompletionRoutineRegistered

CompletionRoutineRegistered 규칙은 디스패치 루틴이 IoSetCompletionRoutineEx를 사용하여 IoCompletion 루틴을 등록하는 경우 디스패치 루틴이 이후에 IoCallDriver 또는 PoCallDriver를 호출해야 한다고 지정합니다.

DoubleCompletion

WDM(DoubleCompletion) 규칙은 드라이버가 동일한 IRP에 대해 IoCompleteRequest 루틴을 두 번 호출해서는 안 됨을 지정합니다.

IoReuseIrp

IoReuseIrp 규칙은 드라이버가 이전에 IoAllocateIrp로 할당한 IRP에서만 IoReuseIrp를 사용하도록 지정합니다.

IoReuseIrp2

IoReuseIrp2 규칙은 드라이버가 이전에 드라이버 내에서 할당한 IRP에서만 IoReuseIrp를 사용하도록 지정합니다.

IoSetCompletionExCompleteIrp

IoSetCompletionExCompleteIrp 규칙은 IoSetCompletionRoutineEx 루틴이 NTSTATUS 값을 반환한다고 지정합니다. 드라이버는 이 값을 검사 IoCallDriver 또는 PoCallDriver를 호출하기 전에 IoCompletion 루틴이 성공적으로 등록되었는지 확인하고 IoSetCompletionRoutineEx가 실패하면 IRP가 완료되고 디스패치 루틴이 반환되어야 합니다.

IoSetCompletionRoutineExCheck

IoSetCompletionRoutineExCheck 규칙은 IoSetCompletionRoutineEx 루틴이 NTSTATUS 값을 반환한다고 지정합니다. 드라이버는 이 값을 검사 IoCallDriver 또는 PoCallDriver를 호출하기 전에 IoCompletion 루틴이 성공적으로 등록되었는지 확인해야 합니다.

IoSetCompletionRoutineExCheckDeviceObject

IoSetCompletionRoutineExCheckDeviceObject 규칙은 현재 디바이스 개체가 IoSetCompletionRoutineEx에 전달되지 않고 낮은 디바이스 개체인 경우 완료 루틴이 실행되지 않았더라도 현재 디바이스 개체를 언로드할 수 있는 경합 상태로 이어질 수 있음을 지정합니다.

IoSetCompletionRoutineNonPnpDriver

IoSetCompletionRoutineNonPnpDriver 규칙은 PnP 드라이버가 아닌 드라이버가 IoSetCompletionRoutineEx가 아닌 IoSetCompletionRoutineEx를 사용하도록 지정합니다.

IrpCancelField

IrpCancelField 규칙은 보류 중인 IRP에서 취소 루틴을 설정할 때 드라이버가 Irp-Cancel> 멤버의 값을 검사 지정합니다.

IrpProcessingComplete

IrpProcessingComplete 규칙은 디스패치 루틴이 STATUS_SUCCESS 반환하는 경우 드라이버 자체 또는 하위 수준 드라이버에서 IRP를 완료해야 한다고 지정합니다.

LowerDriverReturn

LowerDriverReturn 규칙은 PoCallDriver 또는 IoCallDriver를 사용하여 더 낮은 드라이버를 호출한 후 드라이버가 호출에서 반환 상태 저장하고 받은 반환 상태 디스패치 루틴에 전달하도록 지정합니다.

SignalEventInCompletion

SignalEventInCompletion 규칙은 비동기 IRP를 처리할 때 Irp-PendingReturned> 플래그가 설정된 경우 드라이버가 완료 루틴에서 KeSetEvent를 호출하도록 지정합니다.

SignalEventInCompletion2

SignalEventInCompletion2 규칙은 비동기 IRP를 처리할 때 Irp-PendingReturned> 플래그가 설정된 경우 드라이버가 완료 루틴에서 KeSetEvent를 호출하도록 지정합니다.

SignalEventInCompletion3

SignalEventInCompletion3 규칙은 비동기 IRP를 처리할 때 Irp-PendingReturned> 플래그가 설정된 경우 드라이버가 완료 루틴에서 KeSetEvent를 호출해야 한다고 지정합니다.

StartIoCancel

StartIoCancel 규칙은 드라이버가 NULL이 아닌 취소 루틴으로 IoSetCancelRoutine을 호출하기 전에 NONCancelable 매개 변수가 FALSE로 설정된 IoSetStartIoAttributes를 호출하지 않도록 지정합니다.

StartIoRecursion

StartIoRecursion 규칙은 드라이버의 StartIo 루틴에 IoStartNextPacket에 대한 호출이 포함된 경우 드라이버는 먼저 DeferredStartIo 특성이 TRUE로 설정된 IoSetStartIoAttributes를 호출해야 한다고 지정합니다. 그렇지 않으면 무한 재귀가 발생할 수 있습니다.

PnpRemove

PnpRemove 규칙은 드라이버가 실패로 IRP_MN_SURPRISE_REMOVAL, IRP_MN_CANCEL_REMOVE_DEVICE, IRP_MN_CANCEL_STOP_DEVICE 또는 IRP_MN_REMOVE_DEVICE 요청을 완료할 수 없음을 지정합니다.

PnpSurpriseRemove

PnpSurpriseRemove 규칙은 드라이버가 IRP_MN_SURPRISE_REMOVAL 요청을 처리하는 동안 IoDeleteDevice 또는 IoDetachDevice를 호출하지 않도록 지정합니다.

PowerDownAllocate

PowerDownAllocate 규칙은 FDO 및 FIDO 드라이버가 s0에서 [S1...로 전환되는 SystemPowerState 전환에 대한 IRP_MN_SET_POWER 요청을 처리할 때 메모리를 할당해서는 안 됨을 지정합니다. S5].

PowerDownFail

PowerDownFail 규칙은 디바이스 전원이 다운되면 FDO 또는 FIDO 드라이버가 IRP_MN_SET_POWER 요청에 실패하지 않도록 지정합니다. 이 규칙은 FDO 및 FIDO 드라이버에만 적용됩니다.

PowerIrpDDPI

PowerIrpDDDIs 규칙은 드라이버가 IRP_MN_SET_POWER 사용하여 시스템 또는 디바이스 IRP_MJ_POWER 처리할 때 PASSIVE_LEVEL 호출할 수 있는 DDI를 호출해서는 안 된다고 지정합니다.

PowerUpFail

PowerUpFail 규칙은 디바이스 전원이 켜질 때 FDO 또는 FIDO 드라이버가 IRP_MN_SET_POWER 요청에 실패하지 않도록 지정합니다.

PnpIrpCompletion

PnpIrpCompletion 규칙은 FDO 드라이버가 PnP IRP를 하위 드라이버에 전달하는지 확인합니다.

WmiComplete

WmiComplete 규칙은 WMI 부 IRP를 처리할 때 드라이버가 DispatchSystemControl 루틴에서 반환하기 전에 IoCompleteRequest를 호출한다고 지정합니다.

WmiForward

WmiForward 규칙은 전달이 필요할 때 드라이버가 WMI 부 IRP를 전달해야 한다고 지정합니다.

IrpProcessing 규칙 집합을 선택하려면

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

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

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

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

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