PnP 테스트(장치 기본)

장치 기본 PnP 테스트를 통해 드라이버는 거의 모든 PnP IRP를 처리할 수 있습니다. 하지만 특별히 강조되는 3가지 영역인 제거, 균형 재조정 및 예기치 않은 제거가 있습니다. PnP 테스트에서는 각 영역을 개별적으로 테스트하거나 모두 함께 테스트(스트레스 테스트라고 함)하는 메커니즘을 제공합니다. 이 PnP 테스트는 테스트 응용 프로그램을 통한 사용자 모드 API 호출과 상위 필터 드라이버를 통한 커널 모드 API 호출의 조합을 사용하여 수행됩니다.

PNP 테스트

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

테스트설명

EDT(고급 장치 테스트) 지원 사용 안 함

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

매개 변수: - 장치 기본 테스트 매개 변수 참조

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

IOType

다시 부팅 전후 PNP(사용 안 함/사용) 및 I/O 테스트

시스템을 다시 부팅하여 장치에서 기본 PnP 사용 안 함/사용 및 I/O를 수행합니다.

테스트 이진: Devfund_PNP_DisableEnable_Reboot_With_IO_BeforeAndAfter.wsc

테스트 메서드: PNP_DisableEnable_Reboot_With_IO_Before_And_After

매개 변수: - 장치 기본 테스트 매개 변수 참조

DQ

IOPeriod

PNP(사용 안 함/사용) 및 I/O 테스트

장치에서 I/O 및 기본 PnP 사용 안 함/사용을 수행합니다.

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

  1. 시스템에서 장치 문제 코드를 보고하는 장치가 없는지 확인합니다.
  2. WDTF 단순 I/O 플러그 인을 사용하여 시스템의 모든 장치에서 I/O를 테스트합니다. 자세한 내용은 제공된 WDTF 단순 I/O 플러그 인을 참조하세요.
  3. WDTF PnP 작업 인터페이스를 사용하여 시스템의 모든 장치를 사용 안 함 또는 사용으로 설정합니다. 자세한 내용은 IWDTFPNPAction2::DisableDeviceIWDTFPNPAction2::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

장치 DIF 제거 PNP 테스트

이 테스트는 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 테스트

제거 테스트와 마찬가지로 테스트 응용 프로그램에서는 대상 장치 스택에 상위 필터를 추가한 다음 SetupDiCallClassInstaller를 DIF_PROPERTYCHANGE와 함께 사용하여 장치 스택을 다시 시작하려고 합니다. 이 작업이 성공적으로 완료되지 않으면, 즉 대상 장치 스택에서 쿼리 제거 IRP에 실패할 경우 테스트에서는 균형 재조정 테스트를 위해 컴퓨터를 다시 시작합니다.

선택하는 균형 재조정 테스트에 따라 다음 이벤트가 발생합니다.

  1. 장치 중지(균형 재조정) PNP 테스트 이 테스트는 장치 드라이버로의 IRP_MN_QUERY_STOP_DEVICE PnP IRP 결과로 발생한 균형 재조정 프로시저를 시작합니다.

    스택에 있는 드라이버가 이 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 플러그 인
명령 프롬프트를 사용하여 런타임에 드라이버를 테스트하는 방법

 

 

표시:
© 2015 Microsoft