다음을 통해 공유


IrpTracking 규칙 집합(WDM)

이러한 규칙을 사용하여 드라이버가 IRP(I/O 요청 패킷)를 올바르게 추적하여 IRP가 처리 중인 동안 디바이스가 제거되지 않도록 합니다.

섹션 내용

항목 설명

IoReleaseRemoveLockAndWaitOutsideRemoveDevice

IoReleaseRemoveLockAndWaitOutsideRemoveDevice 규칙은 PnP 드라이버에 대한 IRP_MN_REMOVE_DEVICE 사용하여 IRP_MJ_PNP 외부에서 IoReleaseRemoveLockAndWait를 호출하지 않도록 지정합니다.

NsRemoveLockMnRemove

NsRemoveLockMnRemove 규칙은 MinorFunction IRP_MN_REMOVE_DEVICE 사용하여 IRP_MJ_PNP 처리할 때 드라이버가 STATUS_NOT_SUPPORTED 반환하지 않는지 확인합니다. 이 규칙은 FDO 및 FIDO 드라이버에만 적용됩니다.

NsRemoveLockMnSurpriseRemove

NsRemoveLockMnSurpriseRemove 규칙은 minorFunction IRP_MN_SUPRISE_REMOVAL 사용하여 IRP_MJ_PNP 요청을 처리할 때 드라이버가 STATUS_NOT_SUPPORTED 반환하지 않는지 확인합니다. 이 규칙은 FDO 및 FIDO 드라이버에만 적용됩니다.

NsRemoveLockQueryMnRemove

NsRemoveLockQueryMnRemove 규칙은 MinorFunction IRP_MN_QUERY_REMOVE 사용하여 IRP_MJ_PNP 처리할 때 드라이버가 STATUS_NOT_SUPPORTED 반환하지 않는지 확인합니다. 이 규칙은 FDO 및 FIDO 드라이버에만 적용됩니다.

RemoveLock

RemoveLock 규칙은 IoAcquireRemoveLock IoReleaseRemoveLock에 대한 호출이 올바르게 사용되도록 지정합니다. 또한 IRP_MJ_PNP 또는 IRP_MJ_POWER 루틴이 끝날 때 드라이버는 RemoveLock보유해서는 안 됩니다.

RemoveLockCheck

RemoveLockCheck 규칙은 MinorFunction IRP_MN_REMOVE_DEVICE 사용하여 IRP_MJ_PNP 처리할 때 IoAcquireRemoveLockIoReleaseRemoveLockAndWait에 대한 호출이 올바르게 사용되는지 확인합니다.

RemoveLockForward

RemoveLockForward 규칙은 IRP를 다른 디바이스로 전달할 때 IoAcquireRemoveLockIoReleaseRemoveLock에 대한 호출이 올바르게 사용되는지 확인합니다.

RemoveLockForward2

RemoveLockForward2 규칙은 IRP를 다른 디바이스로 전달할 때 IoAcquireRemoveLockIoReleaseRemoveLock에 대한 호출이 올바르게 사용되는지 확인합니다.

RemoveLockForwardDeviceControl

RemoveLockForwardDeviceControl 규칙은 드라이버가 IoCallDriver사용하여 IRP를 다른 디바이스로 전달할 때 IoAcquireRemoveLockIoReleaseRemoveLock에 대한 호출이 올바르게 사용되는지 확인합니다.

RemoveLockForwardDeviceControl2

RemoveLockForwardDeviceControl2 규칙은 드라이버가 IoCallDriver사용하여 IRP를 다른 디바이스로 전달할 때 IoAcquireRemoveLockIoReleaseRemoveLock에 대한 호출이 올바르게 사용되는지 확인합니다.

RemoveLockForwardDeviceControlInternal

RemoveLockForwardDeviceControlInternal 규칙은 IoCallDriver를 사용하여 IRP를 다른 디바이스로 전달할 때 IoAcquireRemoveLock IoReleaseRemoveLock에 대한 호출이 올바르게 사용되는지 확인합니다.

RemoveLockForwardDeviceControlInternal2

RemoveLockForwardDeviceControlInternal2 규칙은 IoCallDriver를 사용하여 IRP를 다른 디바이스로 전달할 때 IoAcquireRemoveLock IoReleaseRemoveLock에 대한 호출이 올바르게 사용되는지 확인합니다.

RemoveLockForwardRead

RemoveLockForwardRead 규칙은 IoAcquireRemoveLock 및 IoReleaseRemoveLock에 대한 호출이 올바르게 사용되는지 확인합니다.

RemoveLockForwardRead2

RemoveLockForwardRead2 규칙은 IoCallDriver를 사용하여 IRP를 다른 디바이스로 전달할 때 IoAcquireRemoveLock IoReleaseRemoveLock에 대한 호출이 올바르게 사용되는지 확인합니다.

RemoveLockForwardWrite

RemoveLockForwardWrite 규칙은 IoCallDriver를 사용하여 IRP를 다른 디바이스로 전달할 때 IoAcquireRemoveLock IoReleaseRemoveLock에 대한 호출이 올바르게 사용되는지 확인합니다.

RemoveLockForwardWrite2

RemoveLockForwardWrite2 규칙은 IoCallDriver를 사용하여 IRP를 다른 디바이스로 전달할 때 IoAcquireRemoveLock IoReleaseRemoveLock에 대한 호출이 올바르게 사용되는지 확인합니다.

RemoveLockMnRemove

RemoveLockMnRemove 규칙은 MinorFunction IRP_MN_REMOVE_DEVICE IRP_MJ_PNP 처리할 때 IoAcquireRemoveLockIoReleaseRemoveLockAndWait에 대한 호출이 올바르게 사용되는지 확인합니다.

RemoveLockMnRemove2

RemoveLockMnRemove2 규칙은 IRP가 낮은 드라이버로 전달되기 전에 IRP_MN_REMOVE_DEVICE 요청을 처리할 때 IoAcquireRemoveLockIoReleaseRemoveLockAndWait에 대한 호출이 올바르게 사용되는지 확인합니다.

RemoveLockMnSurpriseRemove

RemoveLockMnSurpriseRemove 규칙은 MinorFunction IRP_MN_SUPRISE_REMOVAL 사용하여 IRP_MJ_PNP 처리할 때 IoAcquireRemoveLockIoReleaseRemoveLockAndWait에 대한 호출이 올바르게 사용되는지 확인합니다. 드라이버는 스택 아래로 IRP를 전달하기 전에 제거 잠금을 획득해야 합니다.

RemoveLockQueryMnRemove

RemoveLockQueryMnRemove 규칙은 MinorFunction IRP_MN_QUERY_REMOVE_DEVICE 사용하여 IRP_MJ_PNP 처리할 때 IoAcquireRemoveLockIoReleaseRemoveLock에 대한 호출이 올바르게 사용되는지 확인합니다. 드라이버는 스택 아래로 IRP를 전달하기 전에 제거 잠금을 획득해야 합니다.

RemoveLockRelease2

RemoveLockRelease2 규칙은 IoAcquireRemoveLockIoReleaseRemoveLock에 대한 호출이 엄격한 변경에 사용되는지 확인합니다. 또한 디스패치 루틴의 끝에서 드라이버는 제거 잠금을 보유해서는 안됩니다.

RemoveLockReleaseCleanup

RemoveLockReleaseCleanup 규칙은 IoAcquireRemoveLock IoReleaseRemoveLock에 대한 호출이 엄격한 변경에 사용되도록 지정합니다. IoAcquireRemoveLock에 대한 각 호출에는 IoReleaseRemoveLock에 대한 일치 호출이 있어야 합니다. 또한 디스패치 루틴의 끝에서 드라이버는 제거 잠금을 보유해서는 안됩니다.

RemoveLockReleaseClose

RemoveLockReleaseClose 규칙은 IoAcquireRemoveLock 및 IoReleaseRemoveLock에 대한 호출이 엄격한 변경에 사용되는지 확인합니다. 또한 디스패치 루틴의 끝에서 드라이버는 제거 잠금을 보유해서는 안됩니다.

RemoveLockReleaseCreate

RemoveLockReleaseCreate 규칙은 IoAcquireRemoveLock IoReleaseRemoveLock에 대한 호출이 엄격한 변경에 사용되는지 확인합니다. 또한 디스패치 루틴의 끝에서 드라이버는 제거 잠금을 보유해서는 안됩니다.

RemoveLockReleaseDeviceControl

RemoveLockReleaseDeviceControl 규칙은 IoAcquireRemoveLock 및 IoReleaseRemoveLock에 대한 호출이 엄격한 변경에 사용되는지 확인합니다. 또한 디스패치 루틴의 끝에서 드라이버는 제거 잠금을 보유해서는 안됩니다.

RemoveLockReleaseInternalDeviceControl

RemoveLockReleaseInternalDeviceControl 규칙은 IoAcquireRemoveLock 및 IoReleaseRemoveLock에 대한 호출이 엄격한 변경에 사용되는지 확인합니다. 또한 디스패치 루틴의 끝에서 드라이버는 제거 잠금을 보유해서는 안됩니다.

RemoveLockReleasePnp

RemoveLockReleasePnp 규칙은 IoAcquireRemoveLock 및 IoReleaseRemoveLock에 대한 호출이 엄격한 변경에 사용되는지 확인합니다. 또한 디스패치 루틴의 끝에서 드라이버는 제거 잠금을 보유해서는 안됩니다.

RemoveLockReleasePower

RemoveLockReleasePower 규칙은 IoAcquireRemoveLock IoReleaseRemoveLock에 대한 호출이 엄격한 변경에 사용되는지 확인합니다. 또한 디스패치 루틴의 끝에서 드라이버는 제거 잠금을 보유해서는 안됩니다.

RemoveLockReleaseRead

RemoveLockReleaseRead 규칙은 IoAcquireRemoveLock IoReleaseRemoveLock에 대한 호출이 엄격한 변경에 사용되는지 확인합니다. 또한 디스패치 루틴의 끝에서 드라이버는 제거 잠금을 보유해서는 안됩니다.

RemoveLockReleaseShutdown

RemoveLockReleaseShutdown 규칙은 IoAcquireRemoveLock 및 IoReleaseRemoveLock에 대한 호출이 엄격한 변경에 사용되는지 확인합니다. 또한 디스패치 루틴의 끝에서 드라이버는 제거 잠금을 보유해서는 안됩니다.

RemoveLockReleaseSystemControl

RemoveLockReleaseSystemControl 규칙은 IoAcquireRemoveLock 및 IoReleaseRemoveLock에 대한 호출이 엄격한 변경에 사용되는지 확인합니다. 또한 디스패치 루틴의 끝에서 드라이버는 제거 잠금을 보유해서는 안됩니다.

RemoveLockReleaseWrite

RemoveLockReleaseWrite 규칙은 IoAcquireRemoveLock IoReleaseRemoveLock에 대한 호출이 엄격한 변경에 사용되는지 확인합니다. 또한 디스패치 루틴의 끝에서 드라이버는 제거 잠금을 보유해서는 안됩니다.

IrpTracking 규칙 집합을 선택하려면

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

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

    Visual Studio 개발자 명령 프롬프트 창에서 기본 규칙 집합을 선택하려면 /검사 옵션을 사용하여 IrpTracking.sdv지정합니다. 예시:

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

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