PnP 테스트(디바이스 기본 사항)

디바이스 기본 사항 PnP 테스트는 드라이버가 거의 모든 PnP IRP를 처리하도록 강제합니다. 그러나 특히 강조되는 세 가지 영역은 제거, 리밸런스 및 기습 제거입니다. PnP 테스트는 이들 각각을 개별적으로 테스트하거나 모두 함께 테스트하는 메커니즘(즉, 스트레스 테스트)을 제공합니다. 이 PnP 테스트는 사용자 모드 API 호출(테스트 애플리케이션을 통해) 및 커널 모드 API 호출(상위 필터 드라이버를 통해)의 조합을 사용하여 수행됩니다.

PNP 테스트

PnP(플러그 앤 플레이) 테스트는 드라이버 및 사용자 모드 구성 요소에서 다양한 PnP 관련 코드 경로를 실행합니다. PnP 테스트는 테스트 컴퓨터에서 드라이버 검증 도구를 사용하도록 설정하여 실행해야 합니다. 드라이버 검증 도구 사용에 대한 자세한 내용은 드라이버 프로젝트에 대한 드라이버 검증 도구 속성을 참조하세요.

테스트 설명

EDT(향상된 디바이스 테스트) 지원 사용 안 함

이 테스트는 DQ 매개 변수를 사용하여 지정된 디바이스에서 테스트 필터 드라이버(msdmfilt.sys)를 상위 필터로 제거합니다. 이 테스트 필터는 이 테스트 범주에서 실행 중인 테스트의 일부로 설치됩니다.

매개 변수: - 디바이스 기본 사항 테스트 매개 변수 참조

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

IOType

IO를 사용하여 PNP(사용 안 함 및 사용) 다시 부팅 전후

이 테스트는 시스템 재부팅이 있는 디바이스에서 기본 PnP 사용 안 함/사용 및 I/O를 수행합니다.

이진 테스트: Devfund_PNP_DisableEnable_Reboot_With_IO_BeforeAndAfter.wsc

테스트 방법: PNP_DisableEnable_Reboot_With_IO_Before_And_After

매개 변수: - 디바이스 기본 사항 테스트 매개 변수 참조

DQ

IOPeriod

I/O를 사용하는 PNP(사용 안 함 및 사용) 전후

이 테스트는 디바이스에서 I/O 및 기본 PnP 사용 안 함/사용을 수행합니다.

이 테스트는 다음을 수행합니다.

  1. 시스템에 디바이스 문제 코드를 보고하는 디바이스가 없는지 확인합니다.
  2. WDTF 단순 I/O 플러그 인을 사용하여 시스템의 모든 디바이스에서 I/O를 테스트합니다. 자세한 내용은 제공된 WDTF 단순 I/O 플러그 인을 참조하세요.
  3. WDTF PnP 작업 인터페이스를 사용하여 시스템의 모든 디바이스를 사용하지 않도록 설정하고 사용하도록 설정합니다. 자세한 내용은 IWDTFPNPAction2::D isableDeviceIWDTFPNPAction2::EnableDevice 메서드를 참조하세요.
  4. 시스템에 디바이스 문제 코드를 보고하는 디바이스가 없는지 확인합니다.
  5. WDTF 단순 I/O 플러그 인을 사용하여 시스템의 모든 디바이스에서 I/O를 테스트합니다. 자세한 내용은 제공된 WDTF 단순 I/O 플러그 인을 참조하세요.
  6. 3-5단계를 여러 번 반복합니다.

이진 테스트: Devfund_PNP_DisableEnable_With_IO_BeforeAndAfter.wsc

테스트 메서드: PNP_DisableEnable_With_IO_Before_And_After

매개 변수: - 디바이스 기본 사항 테스트 매개 변수 참조

DQ

IOPeriod

PNP 디바이스 제거 테스트 취소

이 테스트는 EDT 필터 드라이버를 사용하여 대상 디바이스 스택에 IRP_MN_CANCEL_REMOVE_DEVICE 보냅니다.

자세한 내용은 디바이스 제거 테스트 정보를 참조하세요.

테스트 이진: Devfund_PnPDTest.dll

테스트 메서드: PNPCancelRemoveDevice

매개 변수: - 디바이스 기본 사항 테스트 매개 변수 참조

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

PNP 디바이스 중지 테스트 취소

이 테스트는 EDT 필터 드라이버를 사용하여 대상 디바이스 스택에 IRP_MN_CANCEL_STOP_DEVICE 보냅니다.

자세한 내용은 리밸런스 테스트 정보를 참조하세요.

테스트 이진: Devfund_PnPDTest.dll

테스트 메서드: PNPCancelStopDevice

매개 변수: - 디바이스 기본 사항 테스트 매개 변수 참조

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

PNP DIF 디바이스 테스트 제거

이 테스트는 SetupDi API를 사용하여 설치 관리자가 디바이스를 제거할 DIF_REMOVE 요청을 보냅니다.

테스트 이진: Devfund_PnPDTest.dll

테스트 방법: PNPDIFRemoveAndRescanParentDevice

매개 변수: - 디바이스 기본 사항 테스트 매개 변수 참조

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

PNP 디바이스 테스트 사용 안 함 및 사용

이 테스트는 대상 디바이스를 사용하지 않도록 설정 및 사용하도록 설정합니다.

테스트 이진: Devfund_PnPDTest.dll

테스트 메서드: PNPDisableAndEnableDevice

매개 변수: - 디바이스 기본 사항 테스트 매개 변수 참조

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

IOType

PNP 리밸런스 디바이스 테스트 다시 시작 실패

이 테스트는 EDT 필터 드라이버를 사용하여 대상 디바이스 스택에 IRP_MN_STOP_DEVICE 보내려고 시도합니다. 그런 다음 EDT 필터 드라이버는 IRP_MN_START_DEVICE 요청(IRP_MN_STOP_DEVICE 요청에 따라)에 실패하여 대상 디바이스의 깜짝 제거를 트리거합니다.

자세한 내용은 리밸런스 테스트 정보를 참조하세요.

테스트 이진: Devfund_PnPDTest.dll

테스트 방법: PNPTryStopDeviceAndFailRestart

매개 변수: - 디바이스 기본 사항 테스트 매개 변수 참조

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

PNP 리밸런스 요청 새 리소스 디바이스 테스트

이 테스트는 EDT 필터 드라이버를 사용하여 대상 디바이스 스택에 IRP_MN_STOP_DEVICE 보내려고 시도합니다. 또한 디바이스의 리소스 요구 사항을 조작하여 새 리소스가 디바이스에 할당되는 가능성을 최대화합니다.

자세한 내용은 리밸런스 테스트 정보를 참조하세요.

테스트 이진: Devfund_PnPDTest.dll

테스트 방법: PNPTryStopDeviceRequestNewResourcesAndRestartDevice

매개 변수: - 디바이스 기본 사항 테스트 매개 변수 참조

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

PNP 디바이스 제거 테스트

이 테스트를 통해 IRP_MN_QUERY_REMOVE_DEVICE 및 IRP_MN_REMOVE_DEVICE 대상 디바이스 스택으로 전송됩니다.

자세한 내용은 디바이스 제거 테스트 정보를 참조하세요.

테스트 이진: Devfund_PnPDTest.dll

테스트 방법: PNPRemoveAndRestartDevice

매개 변수: - 디바이스 기본 사항 테스트 매개 변수 참조

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

PNP 중지(리밸런스) 디바이스 테스트

이 테스트는 EDT 필터 드라이버를 사용하여 대상 디바이스 스택에 IRP_MN_STOP_DEVICE 보내려고 시도합니다.

자세한 내용은 리밸런스 테스트 정보를 참조하세요.

테스트 이진: Devfund_PnPDTest.dll

테스트 방법: PNPTryStopAndRestartDevice

매개 변수: - 디바이스 기본 사항 테스트 매개 변수 참조

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

PNP 서프라이즈 디바이스 제거 테스트

이 테스트는 EDT 필터 드라이버를 사용하여 대상 디바이스 스택에 IRP_MN_SURPRISE_REMOVAL 보냅니다.

자세한 내용은 서프라이즈 제거 테스트 정보를 참조하세요.

테스트 이진: Devfund_PnPDTest.dll

테스트 방법: PNPSurpriseRemoveAndRestartDevice

매개 변수: - 디바이스 기본 사항 테스트 매개 변수 참조

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

디바이스 제거 테스트 정보

  • PNP 디바이스 제거 테스트
  • PNP 디바이스 제거 취소 테스트

디바이스 제거 테스트는 IRP_MN_QUERY_REMOVE_DEVICE, IRP_MN_CANCEL_REMOVE_DEVICE 및 IRP_MN_REMOVE_DEVICE 포함합니다.

테스트는 대상 디바이스 스택에 상위 필터 드라이버를 설치하려고 시도합니다. 이렇게 하면 쿼리 제거 IRP가 생성됩니다.

이 쿼리 제거 IRP가 실패하면 테스트가 컴퓨터를 다시 시작하여 필터 드라이버를 디바이스 스택으로 가져옵니다. 제거 요청이 거부되지 않으면 디바이스 스택은 제거되고 디바이스 스택의 필터 드라이버로 다시 시작됩니다.

이 테스트는 설치 API를 사용하여 쿼리 제거 IRP를 디바이스 스택으로 보내도록 합니다. 필터 드라이버가 이 제거 요청에 실패하므로 제거 취소 IRP가 전송됩니다. 필터 드라이버는 제거 취소가 성공했다고 어설션합니다.

다음으로, 테스트 애플리케이션은 적절한 클래스 설치 관리자 및 등록된 공동 설치 관리자를 호출하여 디바이스를 비활성화 또는 활성화하고 디바이스를 제거 또는 다시 열거합니다. 이 테스트는 DICS_DISABLE, DICS_ENABLE, DICS_PROPCHANGE를 사용하여 DIF_PROPERTYCHANGE의 클래스 및 공동 설치 관리자 처리를 테스트합니다. IRP_MN_REMOVE_DEVICE를 수신하면 필터 드라이버는 하위 드라이버가 성공적으로 완료되었음을 어설션합니다.

이러한 각 단계에는 예비 제거 요청이 포함됩니다. 해당 요청이 거부되면 디바이스는 제거되지 않습니다. USB 카메라에서 비디오를 스트리밍하는 동안 또는 대상 디바이스가 부팅 또는 페이징 경로에 있는 경우와 같이 적절한 경우 제거 요청을 거부하도록 선택할 수 있습니다. 단순히 모든 제거 요청을 실패하는 것은 일반적으로 좋지 않습니다. 제거 IRP가 갑작스러운 제거 후에도 계속 실행되거나 디바이스 스택의 누군가가 시작 IRP에 실패하는 경우 모든 제거 요청을 실패해도 드라이버가 제거를 받지 못한다는 보장은 없습니다.

서프라이즈 제거 테스트 정보

  • PNP 서프라이즈 디바이스 제거 테스트

서프라이즈 제거 테스트는 IRP_MN_SURPRISE_REMOVAL 다음에 IRP_MN_REMOVE_DEVICE를 포함합니다.

이전 테스트와 마찬가지로 테스트 애플리케이션은 상위 필터를 대상 디바이스 스택에 추가한 다음, 스택을 다시 시작하려고 시도합니다. 이 시도가 성공하지 못하면 테스트에서 컴퓨터를 다시 시작합니다.

테스트 애플리케이션에 의해 트리거되면 필터 드라이버는 시스템이 IRP_MN_SURPRISE_REMOVAL을 디바이스 스택에 보낸 다음, IRP_MN_REMOVE_DEVICE를 보내도록 합니다. 필터 드라이버는 이 두 IRP가 하위 드라이버에 의해 성공적으로 완료되었다고 주장합니다.

서프라이즈 제거 테스트가 완료되면 디바이스가 제거되고 다시 열거되며 스택에서 필터 드라이버도 제거됩니다.

리밸런스 테스트 정보

  • PNP 중지(리밸런스) 디바이스 테스트
  • PNP 리밸런스 요청 새 리소스 디바이스 테스트
  • PNP 리밸런스 디바이스 다시 시작 실패 테스트
  • PNP 취소 디바이스 중지 테스트

제거 테스트와 마찬가지로 테스트 애플리케이션은 대상 디바이스 스택에 상위 필터를 추가한 다음, DIF_PROPERTYCHANGE에서 SetupDiCallClassInstaller를 사용하여 디바이스 스택을 다시 시작하려고 시도합니다. 이 시도가 실패하면(즉, 대상 디바이스 스택의 누군가가 IRP 쿼리-제거에 실패한 경우) 테스트는 컴퓨터를 다시 시작하여 리밸런스를 테스트합니다.

선택한 리밸런스 테스트에 따라 다음 이벤트가 발생합니다.

  1. PNP 중지(리밸런스) 디바이스 테스트 이 테스트는 디바이스 드라이버에 PnP IRP를 IRP_MN_QUERY_STOP_DEVICE 리밸런스 프로시저를 시작합니다.

    스택의 드라이버가 이 IRP에 실패하면 리밸런스 프로시저가 중단됩니다. Windows Vista에서는 다단계 리밸런스가 지원됩니다. 리프가 아닌 디바이스 노드에서 리밸런스가 시작되면 해당 디바이스 노드를 루트로 가진 디바이스 트리에 있는 모든 디바이스 스택도 다시 리밸런스를 거칩니다. 또한 하위 디바이스 스택이 쿼리 중지에 실패하면 전체 리밸런스 프로시저가 중단됩니다. 따라서 드라이버는 합리적인 이유 없이 쿼리 중지에 실패해서는 안 됩니다. 이 실패가 발생하면 PnP 관리자는 쿼리 중지를 보낸 모든 디바이스 스택에 중지 취소(IRP_MN_CANCEL_STOP)를 보냅니다.

    관련된 모든 디바이스 스택이 쿼리 중지를 통과하는 경우, 테스트는 리밸런스를 계속 진행하며 디바이스의 리소스 요구 사항을 찾기 위해 IRP_MN_QUERY_RESOURCE_REQUIREMENTS 및 IRP_MN_FILTER_RESOURCE_REQUIREMENTS IRPS를 보냅니다.

    이 시점 이후에는 대상 디바이스가 리소스를 사용하는지 여부에 따라 두 가지 경로가 가능합니다.

    • 디바이스에서 리소스를 사용하지 않는 경우 PnP 관리자 자체는 최적화 방법으로 중지 취소(IRP_MN_CANCEL_STOP_DEVICE)를 보냅니다.

      디바이스가 실제로 리소스를 사용하는 경우 IRP_MN_STOP_DEVICE 및 IRP_MN_START_DEVICE IRP로 리밸런스 프로시저가 완료됩니다.

    이 옵션을 사용하면 디바이스의 리소스가 변경되지 않습니다.

  2. PNP 디바이스 취소 중지 테스트: 이 테스트는 리밸런스 프로시저를 시작하지만 필터 드라이버는 의도적으로 쿼리 중지 IRP에 실패합니다. IRP의 순서는 IRP_MN_QUERY_STOP_DEVICE(필터 드라이버에서 발생하는 동안 실패하여 리밸런스 취소를 발생) 및 IRP_MN_CANCEL_STOP_DEVICE입니다.

    이 옵션을 사용하면 디바이스의 리소스가 변경되지 않습니다.

  3. PNP 리밸런스 요청 새 리소스 디바이스 테스트 이 테스트는 리밸런스를 시작하고 디바이스의 리소스 요구 사항을 조작하여 실제로 새 리소스가 디바이스에 할당될 가능성을 최대화합니다. 또한 이 옵션을 사용하면 리소스가 없는 디바이스에서 전체 리밸런스 절차를 실제로 진행할 수 있습니다.

    1. 먼저 간단한 리밸런스가 시작되어 다음 IRP가 발생합니다.

      • IRP_MN_QUERY_STOP_DEVICE(이 IRP가 모든 드라이버에 의해 통과되었다고 가정합니다. 테스트는 이미 이 IRP가 실패한 경우를 다루었습니다.)
      • IRP_MN_QUERY_RESOURCE_REQUIREMENTS
      • IRP_MN_FILTER_RESOURCE_REQUIREMENTS. 이 IRP에 대한 응답으로, 진행하는 동안 필터 드라이버는 디바이스가 리소스를 사용하는지 여부에 따라 작업을 수행합니다.
        • 디바이스에 리소스 요구 사항이 없는 경우 필터는 가짜 리소스를 할당합니다.
        • 디바이스에 리소스 요구 사항이 있는 경우 현재 할당을 변경할 가능성을 최대화하는 방식으로 리소스 요구 사항 목록을 재구성하려고 합니다. 예를 들어, 디바이스에 00에서 FF 사이의 2바이트 메모리가 필요하고 현재 3A-3B가 할당된 경우 새 리소스 요구 사항(기본 설정 순서)이 00-39, 3C-FF 또는 3A-3B처럼 보이도록 수정합니다. 마찬가지로 디바이스 리소스 요구 사항 목록에 대체 요구 사항이 있는 경우 대체 요구 사항이 목록의 앞부분에서 표시되도록 순서가 변경됩니다.
    2. 이제 디바이스는 항상 리밸런스 절차를 완료해야 합니다.

      IRP_MN_STOP_DEVICE

      IRP_MN_START_DEVICE(새로 할당된 리소스입니다. 가짜 요구 사항이 만들어진 경우 실제 드라이버의 새 리소스를 마스크합니다.)

  4. PNP 리밸런스 디바이스 테스트 다시 시작 실패 이 테스트는 리밸런스를 시작하지만 필터 드라이버가 리밸런스 후 시작되면 의도적으로 실패합니다. 이로 인해 놀라운 제거 IRP와 제거 IRP가 차례로 발생합니다.

    먼저 리밸런스 절차를 시작하고, 리소스를 사용하지 않는 디바이스에 대해 가짜 리소스 요구를 생성하여 드라이버가 중지되었다가 시작되도록 합니다.

    • IRP_MN_QUERY_STOP_DEVICE(이 IRP가 모든 드라이버에 의해 통과되었다고 가정합니다. 테스트는 이미 이 IRP가 실패한 경우를 다루었습니다.)
    • IRP_MN_QUERY_RESOURCE_REQUIREMENTS
    • IRP_MN_FILTER_RESOURCE_REQUIREMENTS(실제 리소스 요구가 null인 경우 필터는 가짜 리소스 요구를 할당하므로 중지 후 시작이 발생합니다.)
    • IRP_MN_STOP_DEVICE
    • IRP_MN_START_DEVICE(작동되는 동안 필터는 이 IRP를 실패합니다. 이 작업을 수행하면 예기치 않은 제거 IRP가 발생합니다.)
    • IRP_MN_SURPRISE_REMOVAL
    • IRP_MN_REMOVE

    리밸런스 테스트가 완료되면 디바이스가 제거되고 다시 열거되며 스택에서 필터 드라이버도 제거됩니다.

디바이스 오류 코드

테스트가 디바이스 상태 정상이 아님을 나타내는 오류 메시지를 제공하는 경우 장치 관리자 통해 디바이스 상태 대해 자세히 알아볼 수 있습니다. 다양한 디바이스 오류 코드에 대한 요약은 장치 관리자 오류 메시지를 참조하세요.

설치 API 로그를 사용하여 설치 실패 디버그

설치 API 로그(setupapi.app.log 및 setupapi.dev.log)에는 이 테스트에서 기록된 드라이버 설치 실패를 디버그하는 데 유용한 정보가 포함될 수 있습니다. 설치 API 로그는 테스트 시스템의 %windir%\inf\ 디렉터리에서 찾을 수 있습니다.

이러한 로그의 세부 정보 및 잠재적 유용성을 높이려면 다시 설치 테스트를 실행하기 전에 다음 레지스트리 키를 0x2000FFFF 설정합니다.

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Setup\LogLevel

Visual Studio를 사용하여 런타임에 드라이버를 테스트하는 방법

디바이스 기본 사항 테스트를 선택 및 구성하는 방법

디바이스 기본 사항 테스트

제공된 WDTF 간단한 I/O 플러그 인

명령 프롬프트에서 런타임에 드라이버를 테스트하는 방법