첫 번째 KMDF(USB 클라이언트 드라이버)를 작성하는 방법

이 문서에서는 Microsoft Visual Studio와 함께 제공되는 USB Kernel-Mode 드라이버 템플릿을 사용하여 KMDF(간단한 커널 모드 드라이버 프레임워크) 기반 클라이언트 드라이버를 작성합니다. 클라이언트 드라이버를 빌드하고 설치한 후에는 장치 관리자 클라이언트 드라이버를 보고 디버거에서 드라이버 출력을 볼 수 있습니다.

템플릿에서 생성된 소스 코드에 대한 설명은 USB 클라이언트 드라이버에 대한 KMDF 템플릿 코드 이해를 참조하세요.

사전 요구 사항

커널 모드 드라이버를 개발, 디버깅 및 설치하려면 다음 두 대의 컴퓨터가 필요합니다.

  • Windows 7 이상 버전의 Windows 운영 체제를 실행하는 호스트 컴퓨터입니다. 호스트 컴퓨터는 드라이버를 작성하고 디버그하는 개발 환경입니다.
  • Windows Vista 이상 버전의 Windows를 실행하는 대상 컴퓨터입니다. 대상 컴퓨터에는 디버그하려는 커널 모드 드라이버가 있습니다.

시작하기 전에 다음 요구 사항을 충족하는지 확인합니다.

소프트웨어 요구 사항

하드웨어 요구 사항

클라이언트 드라이버를 작성할 USB 디바이스를 가져옵니다. 대부분의 경우 USB 디바이스 및 하드웨어 사양이 제공됩니다. 사양은 디바이스 기능 및 지원되는 공급업체 명령을 설명합니다. 사양을 사용하여 USB 드라이버의 기능 및 관련 디자인 결정을 결정합니다.

USB 드라이버 개발을 접하는 경우 OSR USB FX2 학습 키트를 사용하여 WDK에 포함된 USB 샘플을 연구합니다. OSR Online에서 학습 키트를 가져올 수 있습니다. 여기에는 USB FX2 디바이스와 클라이언트 드라이버를 구현하는 데 필요한 모든 하드웨어 사양이 포함되어 있습니다.

MUTT(Microsoft USB 테스트 도구) 디바이스를 가져올 수도 있습니다. MUTT 하드웨어는 JJG Technologies에서 구입할 수 있습니다. 디바이스에 설치된 펌웨어가 없습니다. 펌웨어를 설치하려면 이 웹 사이트에서 MUTT 소프트웨어 패키지를 다운로드하고 MUTTUtil.exe 실행합니다. 자세한 내용은 패키지에 포함된 설명서를 참조하세요.

1단계: Visual Studio USB 드라이버 템플릿을 사용하여 KMDF 드라이버 코드 생성

KMDF 드라이버 코드를 생성하는 방법에 대한 지침은 템플릿을 기반으로 KMDF 드라이버 작성의 단계를 참조하세요.

USB 관련 코드의 경우 Visual Studio에서 다음 옵션을 선택합니다.

  1. 새 프로젝트 대화 상자의 맨 위에 있는 검색 상자에 USB를 입력합니다.
  2. 가운데 창에서 커널 모드 드라이버, USB(KMDF)를 선택합니다.
  3. 다음을 선택합니다.
  4. 프로젝트 이름을 입력하고 저장 위치를 선택한 다음 만들기를 선택합니다.

다음 스크린샷은 USB Kernel-Mode 드라이버 템플릿에 대한 새 프로젝트 대화 상자를 보여 줍니다.

visual studio 새 프로젝트 옵션입니다.

visual studio 새 프로젝트 옵션 두 번째 화면.

이 문서에서는 Visual Studio 프로젝트의 이름이 "MyUSBDriver_"라고 가정합니다. 여기에는 다음 파일이 포함됩니다.

파일 설명
Public.h USB 디바이스와 통신하는 클라이언트 드라이버 및 사용자 애플리케이션에서 공유하는 일반적인 선언을 제공합니다.
<Project name.inf> 대상 컴퓨터에 클라이언트 드라이버를 설치하는 데 필요한 정보를 포함합니다.
Trace.h 추적 함수 및 매크로를 선언합니다.
Driver.h; Driver.c 드라이버 진입점 및 이벤트 콜백 루틴을 선언하고 정의합니다.
Device.h; Device.c prepare-hardware 이벤트에 대한 이벤트 콜백 루틴을 선언하고 정의합니다.
Queue.h; Queue.c 프레임워크의 큐 개체에서 발생하는 이벤트에 대한 이벤트 콜백 루틴을 선언하고 정의합니다.

2단계: 디바이스에 대한 정보를 추가하도록 INF 파일 수정

드라이버를 빌드하기 전에 디바이스에 대한 정보, 특히 하드웨어 ID 문자열을 사용하여 템플릿 INF 파일을 수정해야 합니다.

솔루션 탐색기드라이버 파일에서 INF 파일을 두 번 클릭합니다.

INF 파일에서 제조업체 및 공급자 이름, 디바이스 설정 클래스 등의 정보를 제공할 수 있습니다. 제공해야 하는 정보 중 하나는 디바이스의 하드웨어 식별자입니다.

하드웨어 ID 문자열을 제공하려면 다음을 수행합니다.

  1. USB 디바이스를 호스트 컴퓨터에 연결하고 Windows에서 디바이스를 열거하도록 합니다.

  2. 장치 관리자 열고 디바이스에 대한 속성을 엽니다.

  3. 세부 정보 탭의 속성 아래에서 하드워드 ID를 선택합니다.

    디바이스의 하드웨어 ID가 목록 상자에 표시됩니다. 를 선택하고 길게 누르거나 마우스 오른쪽 단추로 클릭하고 하드웨어 ID 문자열을 복사합니다.

  4. 다음 줄의 USB\VID_vvvv&PID_pppp 하드웨어 ID 문자열로 바꿉니다.

    [Standard.NT$ARCH$] %MyUSBDriver_.DeviceDesc%=MyUSBDriver__Device, USB\VID_vvvv&PID_pppp

3단계: USB 클라이언트 드라이버 코드 빌드

드라이버를 빌드하려면 다음을 수행합니다.

  1. Visual Studio에서 드라이버 프로젝트 또는 솔루션 열기
  2. 솔루션 탐색기 솔루션을 길게 누르거나 마우스 오른쪽 단추로 클릭하고 Configuration Manager 선택합니다.
  3. Configuration Manager 관심 있는 빌드 유형에 해당하는 활성 솔루션 구성(예: 디버그 또는 릴리스) 및 활성 솔루션 플랫폼(예: Win32)을 선택합니다.
  4. 빌드 메뉴에서 솔루션 빌드를 선택합니다.

자세한 내용은 드라이버 빌드를 참조하세요.

4단계: 테스트 및 디버깅을 위한 컴퓨터 구성

드라이버를 테스트하고 디버그하려면 호스트 컴퓨터에서 디버거를 실행하고 대상 컴퓨터에서 드라이버를 실행합니다. 지금까지 호스트 컴퓨터에서 Visual Studio를 사용하여 드라이버를 빌드했습니다. 다음으로 대상 컴퓨터를 구성해야 합니다. 대상 컴퓨터를 구성하려면 드라이버 배포 및 테스트를 위해 컴퓨터 프로비전의 지침을 따릅니다.

5단계: 커널 디버깅에 추적 사용

템플릿 코드에는 함수 호출을 추적하는 데 도움이 되는 여러 추적 메시지(TraceEvents)가 포함되어 있습니다. 소스 코드의 모든 함수에는 루틴의 진입 및 종료를 표시하는 추적 메시지가 포함됩니다. 오류의 경우 추적 메시지에는 오류 코드와 의미 있는 문자열이 포함됩니다. 드라이버 프로젝트에 WPP 추적이 사용되므로 빌드 프로세스 중에 만든 PDB 기호 파일에는 추적 메시지 서식 지정 지침이 포함되어 있습니다. WPP 추적을 위해 호스트 및 대상 컴퓨터를 구성하는 경우 드라이버는 파일 또는 디버거에 추적 메시지를 보낼 수 있습니다.

WPP 추적을 위해 호스트 컴퓨터를 구성하려면 다음을 수행합니다.

  1. PDB 기호 파일에서 추적 메시지 서식 지정 지침을 추출하여 TMF(추적 메시지 형식) 파일을 만듭니다.

    Tracepdb.exe 사용하여 TMF 파일을 만들 수 있습니다. 이 도구는 WDK의 <Windows Kits\10.0\bin\<architecture> 폴더 설치> 폴더에 있습니다. 다음 명령은 드라이버 프로젝트에 대한 TMF 파일을 만듭니다.

    tracepdb -f <PDBFiles> -p <TMFDirectory>

    -f 옵션은 PDB 기호 파일의 위치와 이름을 지정합니다. -p 옵션은 Tracepdb에서 만든 TMF 파일의 위치를 지정합니다. 자세한 내용은 Tracepdb 명령을 참조하세요.

    지정된 위치에 세 개의 파일(프로젝트의 .c 파일당 하나씩)이 표시됩니다. GUID 파일 이름이 지정됩니다.

  2. 디버거에서 다음 명령을 입력합니다.

    1. .load Wmitrace

      Wmitrace.dll 확장을 로드합니다.

    2. .체인

      디버거 확장이 로드되었는지 확인합니다.

    3. !wmitrace.searchpath +<TMF 파일 위치>

      TMF 파일의 위치를 디버거 확장의 검색 경로에 추가합니다.

      다음과 유사한 출력이 표시됩니다.

      Trace Format search path is: 'C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE;c:\drivers\tmf'

WPP 추적을 위해 대상 컴퓨터를 구성하려면 다음을 수행합니다.

  1. 대상 컴퓨터에 Tracelog 도구가 있는지 확인합니다. 도구는 WDK의 <install_folder>Windows Kits\8.0\Tools\<arch> 폴더에 있습니다. 자세한 내용은 Tracelog 명령 구문을 참조하세요.

  2. 명령 창을 열고 관리자 권한으로 실행합니다.

  3. 다음 명령을 입력합니다.

    tracelog -start MyTrace -guid #c918ee71-68c7-4140-8f7d-c907abbcb05d -flag 0xFFFF -level 7-rt -kd

    명령은 MyTrace라는 추적 세션을 시작합니다.

    guid 인수는 클라이언트 드라이버인 추적 공급자의 GUID를 지정합니다. Visual Studio Professional 2019 프로젝트에서 Trace.h에서 GUID를 가져올 수 있습니다. 다른 옵션으로 다음 명령을 입력하고 .guid 파일에서 GUID를 지정할 수 있습니다. 파일에는 하이픈 형식의 GUID가 포함되어 있습니다.

    tracelog -start MyTrace -guid c:\drivers\Provider.guid -flag 0xFFFF -level 7-rt -kd

    다음 명령을 입력하여 추적 세션을 중지할 수 있습니다.

    tracelog -stop MyTrace

6단계: 대상 컴퓨터에 드라이버 배포

  1. 솔루션 탐색기 창에서 *<프로젝트 이름>*패키지 를 길게 누르거나 마우스 오른쪽 단추로 클릭하고 속성을 선택합니다.
  2. 왼쪽 창에서 구성 속성 > 드라이버 설치 > 배포로 이동합니다.
  3. 배포 사용을 선택하고 드라이버 저장소로 가져오기를 검사.
  4. 원격 컴퓨터 이름에 대상 컴퓨터의 이름을 지정합니다.
  5. 설치 및 확인을 선택합니다.
  6. 확인을 선택합니다.
  7. 디버그 메뉴에서 디버깅 시작을 선택하거나 키보드에서 F5 키를 누릅니다.

참고

하드웨어 ID 드라이버 업데이트에서 디바이스의 하드웨어 ID를 지정하지 마세요. 하드웨어 ID는 드라이버의 정보(INF) 파일에서만 지정해야 합니다.

Visual Studio에서 대상 시스템에 드라이버를 배포하는 방법에 대한 자세한 내용은 테스트 컴퓨터에 드라이버 배포를 참조하세요.

장치 관리자 사용하여 대상 컴퓨터에 드라이버를 수동으로 설치할 수도 있습니다. 명령 프롬프트에서 드라이버를 설치하려는 경우 다음 유틸리티를 사용할 수 있습니다.

  • Pnputil

    이 도구는 Windows와 함께 제공됩니다. Windows\System32에 있습니다. 이 유틸리티를 사용하여 드라이버 저장소에 드라이버를 추가할 수 있습니다.

    C:\>pnputil /a m:\MyDriver_.inf
    Microsoft PnP Utility
    
    Processing inf : MyDriver_.inf
    Driver package added successfully.
    Published name : oem22.inf
    

    자세한 내용은 PnPUtil 예제를 참조하세요.

  • DevCon 업데이트

    이 도구는 WDK와 함께 제공됩니다. 드라이버를 설치하고 업데이트하는 데 사용할 수 있습니다.

    devcon update c:\windows\inf\MyDriver_.inf USB\VID_0547&PID_1002\5&34B08D76&0&6
    

7단계: 장치 관리자 드라이버 보기

  1. 다음 명령을 입력하여 장치 관리자 엽니다.

    devmgmt
    
  2. 장치 관리자 다음 노드에 대한 노드를 표시하는지 확인합니다.

    샘플

    MyUSBDriver_Device

8단계: 디버거에서 출력 보기

Visual Studio는 먼저 출력 창에 진행률을 표시합니다. 그런 다음 디버거 직접 실행 창을 엽니다. 추적 메시지가 호스트 컴퓨터의 디버거에 표시되는지 확인합니다. 출력은 다음과 같아야 합니다. 여기서 "MyUSBDriver_"은 드라이버 모듈의 이름입니다.

[3]0004.0054::00/00/0000-00:00:00.000 [MyUSBDriver_]MyUSBDriver_EvtDriverContextCleanup Entry
[1]0004.0054::00/00/0000-00:00:00.000 [MyUSBDriver_]MyUSBDriver_EvtDriverDeviceAdd Entry
[1]0004.0054::00/00/0000-00:00:00.000 [MyUSBDriver_]MyUSBDriver_EvtDriverDeviceAdd Exit
[0]0004.0054::00/00/0000-00:00:00.000 [MyUSBDriver_]DriverEntry Entry
[0]0004.0054::00/00/0000-00:00:00.000 [MyUSBDriver_]DriverEntry Exit