Top

윈도우 USB 디바이스 드라이버 [WDM부터 최신 KDMF와 UMDF까지 윈도우 드라이버 모델 입문과 실전]

  • 원서명Windows Vistaデバイスドライバプログラミング (ISBN 9784797343229)
  • 지은이하마다 켄이치로
  • 옮긴이최강민
  • ISBN : 9788960771925
  • 40,000원
  • 2011년 04월 15일 펴냄 (절판)
  • 페이퍼백 | 920쪽 | 188*250mm
  • 시리즈 : 윈도우 시스템 프로그래밍

판매처

  • 현재 이 도서는 구매할 수 없습니다.

책 소개

윈도우 환경에서 WDM은 물론, 그 후속 드라이버 모델인 KMDF와 UMDF를 이용해 USB 저장 장치 드라이버를 작성하는 방법에 대해 설명한다. 또한 동일한 기능의 드라이버를 각각의 드라이버 모델로 재구성하여 설명하므로 드라이버 모델 간의 개발 방법에 대한 차이를 더 잘 이해할 수 있을 것이다. USB 디바이스 드라이버에 처음 입문하거나 기존 USB 드라이버를 최신 드라이버 모델로 재구성해야 하는 개발자라면 반드시 읽어야 할 필독서다.


[ 이 책의 구성 ]

■ 1장에서는 오래 전부터 있었던 윈도우 표준 드라이버 모델인 WDM을 사용해 디바이스 드라이버에 대한 기본적인 개념을 배운다.

■ 2장에서는 이 책에서 다룰 USB 사양을 설명한다. 필요한 USB 관련 지식은 이 책에서 거의 다루므로 USB 드라이버 예제 작성에 관한 한 다른 USB 참고서적을 구해 보지 않아도 된다.

■ 3장에서는 윈도우 비스타 버전부터 추가되고 현재는 윈도우 XP 등에도 적용된 KMDF 드라이버 사양에 기반을 둔 프로그램을 설명한다. KMDF는 객체지향 개념을 사용해 WDM에 비해 코드 양도 줄었는데, 실습을 통해 그 이유를 이해할 수 있다.

■ 4장에서는 윈도우 비스타 버전용으로 개발된 UMDF 드라이버 사양에 기반을 둔 프로그램을 설명한다. 64비트 버전의 윈도우 비스타부터는 서명이 없으면 드라이버를 로드할 수 없는데, 이 UMDF라면 서명이 없어도 동작시킬 수 있다. 그러나 UMDF로 구현하려면 COM이라는 객체지향 프로그래밍을 해야 한다. 이 COM과 UMDF와의 관계는 마이크로소프트 문서에도 자세히 설명돼 있지 않으므로 이 책에서 중점적으로 다룬다.

저자/역자 소개

[ 저자 서문 ]

내가 처음으로 이 책의 출간 기획을 들은 것은 2006년 8월이었다. 당초 기획 목표는 2007년 초에 선보일 예정이던 윈도우 비스타 출시에 맞춰 디바이스 드라이버 책을 펴내는 것이었다. 나는 당시 다른 원고를 집필 중이었고 일도 바빴던 탓에 이 기획에 참여할 의사가 없었다. 또한 윈도우 비스타가 NT 커널을 기반으로 한다는 점을 알고 있었기에, 윈도우 98/2000에서야 비로소 구조가 확립된 드라이버 사양인 WDM을 약간 변경한 정도일 거라 예상했다. 그러므로 드라이버 레벨은 종래와 크게 다르지 않으리라고 생각했다.

그러던 중 소프트뱅크 크리에이티브 출판사로부터 ‘출간 시기를 조정한다’라는 얘기를 듣고 ‘그럼 한번 써보시겠어요?’라는 제안을 받아들였다. WDM에 관한 책은 이미 몇 권이나 출간됐으므로 독자적으로 어떻게 내용을 작성할지 고민 중일 때, ‘윈도우 비스타부터는 KMDF라는 새로운 사양과 사용자 모드에서 동작하는 UMDF라는 드라이버 모델도 추가됐다.’라는 이야기를 편집자가 내게 전했다. 조사해 본 결과, 확실히 KMDF와 UMDF라는 새로운 드라이버 모델이 생겨났고 코드도 지금까지와는 전혀 달랐다. 물론, 그럼에도 종래의 WDM이라는 드라이버 사양도 건재했다.

‘결국 비스타 버전부터 드라이버를 작성해야 하는 사람은 WDM도 어느 정도 알고 있어야 하고, 새로 추가된 2가지 드라이버 모델도 알아야 하지 않을까? 책을 쓰더라도 참고가 될 만한 해설서가 있었으면……’하고 절실히 느꼈다.

이 책의 특징

‘읽고 나면 WDM이나 KMDF/UMDF의 기본 정도는 알 수 있는 책’을 목표로 집필했다. 또한 드라이버나 윈도우 프로그래밍에 정통하지 않아도 C나 C++ 언어에 대한 지식만 있다면 드라이버를 작성할 수 있도록 설명해주는 책을 목표로 잡았다. 실제로 코드를 조금씩 작성하며 실습헤볼 수 있도록 엮었다. 나는 복잡한 프로그램일수록 코드를 실제로 동작시키며 이해하는 것이 가장 빠른 길이라고 확신하기에, 독자가 가능한 한 순서대로 실습할 수 있도록 책을 구성했다. 이 책의 설명만으로 이해하기 어렵더라도 디버그 메시지를 추가하거나 반복해 동작시키다 보면 좀 더 이해하기 쉬울 것이라 생각한다.

이 책에서는 제어 대상으로 USB를 선택했다. USB를 선택한 이유는 USB가 KMDF와 UMDF 모두 지원하며, 쉽게 구할 수 있고, PC용 주변기기 규격으로서는 가장 많이 보급돼 있기 때문이다. 또한 다른 종류의 드라이버에 비해 실습하기 쉬우며, 배우기도 쉽기 때문이다. 이 책에서는 USB 디바이스 드라이버를 작성할 것이지만 다른 종류의 드라이버를 작성할 때도 KMDF나 UMDF의 기본구조를 이해하는 데 참고가 되리라 생각한다.


[ 저자 소개 ]

하마다 켄이치로 (浜田憲一郎)
중학교 시절 MZ-1200이란 PC를 손에 넣은 이래 베이식, 기계어, FORM, WICS 등을 경험한 후 얄팍하지만 두루두루 다양한 언어를 탐하는 어중간한 오타쿠가 됐다. 전문학교 졸업 후 시스템 하우스에 취직했으나 연필로 회로설계를 하는 것이 싫어 좌절하기도 했다. 그 후 어셈블러나 C 코딩을 하거나, VxWorks 애플리케이션, 비주얼 베이식 애플리케이션을 작성하며, 무선 제어기 수리와 영업직까지 맡고 있는 자신을 발견하고 엔지니어 길에서 벗어났다는 생각에 98년에 전직해 USB를 시작으로 임베디드 분야로 진로를 바꿨다. 정리 해고가 두려워 어느 OS벤더 회사로 전직했으나 훨씬 고수준의 업무에 늘 쫓기고 있다. 『Windows XP 디바이스 드라이버 프로그래밍 입문과 실전』(기술평론사, 2003년), 『입문 UPnP』(일본 브레인웨어, 2007년) 등을 집필한 바 있다.


[ 옮긴이의 말 ]

USB는 없어서는 안 될 표준 버스 규격이 됐다고 해도 과언이 아닐 것이다. 주변기기를 위한 다양한 버스 규격이 있음에도 불구하고 이처럼 널리 보급된 이유에는 여러 가지가 있다. USB가 성공한 배경에는 버스 자체의 간결성과 기존 다른 버스 규격들을 포용하는 범용성을 고려한 구조에 있지 않았을까 감히 생각해본다.

USB는 얼마 전 USB 3.0 명세서가 발표되면서 고속성과 신뢰성을 무기로 지금도 계속 진화 중이며, 앞으로도 더욱 다양한 분야에서 활용할 수 있는 범용 버스로서의 역할을 톡톡히 하게 될 것이다.

여기 또 하나의 윈도우 디바이스 드라이버 서적이 나왔다.

이미 시중에는 윈도우 디바이스 드라이버에 관련된 훌륭한 서적들이 많이 있다. 그러나 USB에 할애하는 지면이 극히 적거나 이론적인 내용만 소개함으로써 부족함을 느꼈을지 모른다. 사실 USB는 범용성을 위해 설계된 만큼 버스 규격이 복잡하고 방대하다. 특정 클래스까지 모두 완벽하게 소화하려면 그 내용만으로도 수백 페이지에 이를 것이다. 이런 이유로 인해 USB 버스에 치중해 내용을 전개해 나가는 데 한계가 있었을 것이다.

이 책은 USB용 윈도우 디바이스 드라이버의 개발 방법을 주로 다룬다. 우선 USB에 전체를 할애했다는 점에서 매우 반갑다. USB에 관한 기초 지식뿐만 아니라 USB용 저장 장치 드라이버 개발에 필요한 대용량 저장 장치 클래스를 설명한다. 물론 윈도우 환경에서 동작하는 디바이스 드라이버인 만큼 WDM은 물론 그 후속 모델인 KMDF, UMDF도 다룬다. 특히 동일한 드라이버를 각 드라이버 모델로 재구성해 설명함으로써 각 드라이버 모델 간의 개발 방법에 대한 차이를 더 잘 이해할 수 있게 했다. 또한 이론과 실습을 적절히 겸비해 지루하지 않게 구성됐다. 단계별로 드라이버 작성에 필요한 지식을 설명하고 검증을 통해 그 지식을 확인하는 형태로 구성돼 있으므로 그리 어렵지 않게 접근할 수 있을 것이다. 특히 특정 타겟을 위한 전용 USB 디바이스 드라이버를 작성해야 하는 임베디드 개발자나 윈도우 드라이버 개발에 입문하는 윈도우 시스템 개발자에게 모두 도움이 될 것이다.


이 책의 원제는 『윈도우 비스타 디바이스 드라이버 프로그래밍』으로 윈도우 비스타 환경을 염두에 두고 있지만 윈도우 비스타에만 국한된 내용은 아니다. 윈도우 디바이스 드라이버 모델들을 총칭하는 WDF(Windows Driver Framework)를 다루므로 윈도우 7에도 그대로 적용할 수 있다. 한글판에서는 시대의 흐름에 맞춰 윈도우 7에서 동작을 확인하고 그 실행 결과를 담았다.


[ 옮긴이 소개 ]

최강민
임베디드 시스템 컨설팅 및 개발 회사인 디오이즈에서 각종 임베디드 소프트웨어 개발 업무를 담당했으며, 현재는 uITRON 사양의 RTOS 개발 회사인 MiSPO에서 근무 중이며, RTOS 포팅과 미들웨어 개발 업무를 담당 중이다.

목차

목차
  • 1장 WDM 디바이스 드라이버 기초
    • 1.1 디바이스 드라이버 입문
      • 1.1.1 디바이스 드라이버의 정의
      • 1.1.2 추상화 인터페이스 제공
      • 1.1.3 디바이스 드라이버의 계층 구조
      • 1.1.4 디클래스 드라이버와 벤더 드라이버
    • 1.2 윈도우 디바이스 드라이버
      • 1.2.1 윈도우의 간략한 역사
      • 1.2.2 윈도우 비스타의 커널 구성(2가지 모드)
      • 1.2.3 윈도우 비스타가 지원하는 3가지 종류의 드라이버
    • 1.3 디바이스 드라이버 개발 입문
      • 1.3.1 디바이스 드라이버 실행
      • 1.3.2 디바이스 드라이버 개발 환경 구축
      • 1.3.3 WDK 폴더 구성
      • 1.3.4 WDK를 사용한 빌드 방법
      • 1.3.5 디버그 환경 구축
      • 1.3.6 디바이스 드라이버 프로그래밍 입문
      • 1.3.7 디바이스 드라이버 빌드
      • 1.3.8 INF 파일 작성
      • 1.3.9 드라이버 셋업
      • 1.3.10 INF 파일 구조
      • 1.3.11 레지스트리와 디바이스 드라이버 관련 설정
    • 1.4 WDM의 기본
      • 1.4.1 DriverEntry 함수
      • 1.4.2 펑션 드라이버에 등록해야 하는 함수
      • 1.4.3 이벤트부터 하위 드라이버와의 통신
      • 1.4.4 WDM의 핵이 되는 4가지 구조체
      • 1.4.5 메모리 할당과 해제
      • 1.4.6 MajorFunction 작성 방법
      • 1.4.7 스켈톤 드라이버 작성
    • 1.5 AddDevice 디바이스 초기화 처리
      • 1.5.1 AddDevice 함수에 작성해야 할 것
      • 1.5.2 AddDevice 함수 코드
      • 1.5.3 AddDevice 함수의 검증
    • 1.6 플러그앤플레이
      • 1.6.1 플러그앤플레이 개요
      • 1.6.2 플러그앤플레이 구현
      • 1.6.3 플러그앤플레이 검증
    • 1.7 전원 관리
      • 1.7.1 전원 관리를 구현하지 않을 경우
      • 1.7.2 전원 관리 처리의 개요
      • 1.7.3 전원 관리 처리 구현
      • 1.7.4 전원 관리 처리 검증
    • 1.8 애플리케이션에서 디바이스 제어
      • 1.8.1 애플리케이션에서 열기/닫기
      • 1.8.2 IRP MJ CREATE, IRP MJ CLOSE 처리
      • 1.8.3 애플리케이션에서 읽고 쓰기
      • 1.8.4 읽기/쓰기 검증
      • 1.8.5 디바이스 제어 코드 작성법
      • 1.8.6 디바이스 제어 코드 검증
    • 1.9 정리
  • 2장 USB 저장 장치의 기초
    • 2.1 USB의 개요
      • 2.1.1 USB의 특징
      • 2.1.2 주소
      • 2.1.3 4가지 전송 방식과 엔드포인트
      • 2.1.4 하드웨어 개요
    • 2.2 USB 프로토콜 계층의 개요
      • 2.2.1 패킷
      • 2.2.2 트랜잭션
      • 2.2.3 각종 전송 데이터
    • 2.3 USB 디바이스의 구성과 디스크립터
      • 2.3.1 USB 디바이스의 구성
      • 2.3.2 리틀 엔디언
      • 2.3.3 디스크립터
      • 2.3.4 디바이스 디스크립터
      • 2.3.5 컨피규레이션 디스크립터
      • 2.3.6 인터페이스 디스크립터
      • 2.3.7 엔드포인트 디스크립터
      • 2.3.8 문자열 디스크립터
      • 2.3.9 디바이스 쿼리 디스크립터, 기타 속도 컨피규레이션 디스크립터
    • 2.4 리퀘스트
      • 2.4.1 GET STATUS
      • 2.4.2 CLEAR FEATURE
      • 2.4.3 SET FEATURE
      • 2.4.4 SET ADDRESS
      • 2.4.5 GET DESCRIPTOR
      • 2.4.6 GET CONFIGURATION
      • 2.4.7 SET CONFIGURATION
      • 2.4.8 GET INTERFACE
      • 2.4.9 SET INTERFACE
      • 2.4.10 클래스 리퀘스트와 벤더 리퀘스트
    • 2.5 USB 디바이스로서의 동작
    • 2.6 대용량 저장 장치 클래스
      • 2.6.1 대용량 저장 장치 클래스의 개요
      • 2.6.2 CB/CBI 프로토콜
      • 2.6.3 벌크 전용 프로토콜
      • 2.6.4 디스크 접근
      • 2.6.5 SCSI 규격의 개요
    • 2.7 정리
  • 3장 KMDF 디바이스 드라이버 개발
    • 3.1 KMDF 개요
      • 3.1.1 공통 부분의 라이브러리화
      • 3.1.2 KMDF의 기본 구성
      • 3.1.3 주요 구조체(오브젝트)
    • 3.2 KMDF 입문
      • 3.2.1 KMDF 기본 코드
      • 3.2.2 KMDF용 INF 파일 작성
      • 3.2.3 KMDF 드라이버 작성
      • 3.2.4 KMDF 드라이버 빌드와 실습
      • 3.2.5 플러그앤플레이와 전원 관리
    • 3.3 KMDF 드라이버의 기본 오브젝트
      • 3.3.1 WDF OBJECT ATTRIBUTES 구조체
      • 3.3.2 WDFQUEUE 오브젝트
      • 3.3.3 WDFREQUEST 오브젝트
      • 3.3.4 WDFFILEOBJECT 오브젝트
      • 3.3.5 WDFMEMORY 오브젝트
    • 3.4 KMDF 드라이버 개발의 기본
      • 3.4.1 애플리케이션에서 접근
      • 3.4.2 데이터 읽기/쓰기
      • 3.4.3 디바이스 제어
    • 3.5 윈도우의 USB 드라이버 개요
      • 3.5.1 USB 호스트 드라이버의 구조
      • 3.5.2 KMDF의 USB 기본 처리
    • 3.6 USB 디바이스의 초기화와 종료
      • 3.6.1 KMDF의 USB 초기화, 종료 처리
      • 3.6.2 컨피규레이션 디스크립터 얻기
      • 3.6.3 WDFUSBPIPE 오브젝트 얻기
      • 3.6.4 초기화와 종료 처리 코드
    • 3.7 USB 디바이스 제어
      • 3.7.1 디바이스 드라이버의 사양
      • 3.7.2 DeviceIoControl의 제어 코드 정의
      • 3.7.3 컨피규레이션 디스크립터 얻기
      • 3.7.4 컨피규레이션 디스크립터 확인
    • 3.8 클래스 리퀘스트 발행
      • 3.8.1 클래스 리퀘스트 발행 순서
      • 3.8.2 클래스 리퀘스트 발행 코드
    • 3.9 벌크 전송 처리
      • 3.9.1 벌크 전송 처리 구현 방법
      • 3.9.2 벌크 전송 구현
    • 3.10 SCSI 명령어 처리
      • 3.10.1 SCSI 명령어 발행
      • 3.10.2 INQUIRY 처리
      • 3.10.3 SCSI 명령어 발행 실습
    • 3.11 미디어 용량 측정
      • 3.11.1 READ CAPACITY 처리
      • 3.11.2 파이프 리셋 처리
      • 3.11.3 REQUEST SENSE 처리
    • 3.12 미디어 리더 프로그램
      • 3.12.1 MBR
      • 3.12.2 READ10 명령어로 읽기
      • 3.12.3 MBR 읽기 실습
    • 3.13 정리
  • 4장 UMDF 디바이스 드라이버 개발
    • 4.1 UMDF 드라이버의 개요
      • 4.1.1 UMDF의 개념
      • 4.1.2 UMDF의 디바이스 제어 처리 흐름
      • 4.1.3 UMDF 드라이버 개발을 위한 준비
    • 4.2 DLL 개발과 설치
      • 4.2.1 UMDF를 설치하기 위한 INF 파일
      • 4.2.2 UMDF 드라이버가 DLL인 이유
      • 4.2.3 DLL 필수 구현 함수
      • 4.2.4 디버그를 위한 WPP
      • 4.2.5 UMDF 드라이버 스켈톤 코드
      • 4.2.6 UMDF 빌드 필수 파일
      • 4.2.7 DLL 설치
    • 4.3 UCOM의 기본 동작과 IDriverEntry 인터페이스
      • 4.3.1 COM 개론
      • 4.3.2 C++에서의 Interface 정의
      • 4.3.3 IUnknown 구현
      • 4.3.4 IClassFactory 구현
      • 4.3.5 MIDriverEntry부터 디바이스 클래스의 임시 구현
      • 4.3.6 COM 모듈의 동작 실습
    • 4.4 플러그앤플레이와 전원 관리
      • 4.4.1 UMDF 디바이스 드라이버의 기본 구조
      • 4.4.2 IPnpCallbackHardware 인터페이스
      • 4.4.3 IPnpCallback 인터페이스
      • 4.4.4 디바이스 클래스 구현
      • 4.4.5 디바이스 클래스 생성 코드
      • 4.4.6 플러그앤플레이와 전원 관리 실습
    • 4.5 UCOM 드라이버의 기본 제어
      • 4.5.1 프레임워크(I/O 관리자)의 리퀘스트에 응답
      • 4.5.2 애플리케이션의 접근부터 큐 클래스 구현
      • 4.5.3 디바이스 읽기/쓰기부터 IWDFMemory 인터페이스
      • 4.5.4 DeviceIoControl 함수로 제어
    • 4.6 디바이스의 제어 처리
      • 4.6.1 IWDFIoRequest와 IWDFIoTarget
      • 4.6.2 IWDFIoRequest::Send 함수로 디바이스 제어
      • 4.6.3 새 리퀘스트를 작성해 제어
    • 4.7 USB 디바이스 초기화
      • 4.7.1 UMDF의 USB 기본 처리
      • 4.7.2 UMDF 디바이스 드라이버의 USB 초기화
      • 4.7.3 초기화 처리를 위한 준비
      • 4.7.4 IWDFUsbTargetDevice 얻기
      • 4.7.5 IWDFUsbInterface 얻기
      • 4.7.6 IWDFUsbTargetPipe 얻기
      • 4.7.7 SetPipePolicy로 통신 설정
      • 4.7.8 USB 디바이스의 초기화와 종료 처리
      • 4.7.9 USB 디바이스의 초기화와 종료 처리 구현
    • 4.8 디바이스 드라이버의 사양
    • 4.9 컨피규레이션 디스크립터 얻기
      • 4.9.1 컨피규레이션 디스크립터를 얻는 코드
      • 4.9.2 OnDeviceIoControl 함수 수정
      • 4.9.3 컨피규레이션 디스크립터 확인
    • 4.10 클래스 리퀘스트 발행 처리
      • 4.10.1 제어 전송 처리 구현
      • 4.10.2 클래스 리퀘스트 발행 처리 구현
      • 4.10.3 OnDeviceIoControl 함수 수정
    • 4.11 벌크 전송 처리
      • 4.11.1 IRequestCallbackRequestCompletion 인터페이스 상속
      • 4.11.2 ForwardFormattedRequest와 OnCompletion 함수의 구현
      • 4.11.3 OnRead와 OnWrite 함수의 구현
      • 4.11.4 드라이버 빌드와 검증용 윈도우 PC에 복사
    • 4.12 SCSI 명령어 처리
      • 4.12.1 INQUIRY 명령어 확인
      • 4.12.2 READ CAPACITY 명령어 확인
    • 4.13 미디어 리더 프로그램
    • 4.14 정리
  • 부록
  • A 릴리즈 버전 드라이버 작성
  • B 64비트 PC에서 동작
    • B.1 INF 파일
    • B.2 64비트 환경에서 실행하는 방법
  • C 서명(KMCS)
  • D GUID 생성
  • E Driver Install Frameworks API 이용

도서 오류 신고

도서 오류 신고

에이콘출판사에 관심을 가져 주셔서 고맙습니다. 도서의 오탈자 정보를 알려주시면 다음 개정판 인쇄 시 반영하겠습니다.

오탈자 정보는 다음과 같이 입력해 주시면 됩니다.

(예시) p.100 아래에서 3행 : '몇일'동안 -> 며칠동안