윈도우 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와의 관계는 마이크로소프트 문서에도 자세히 설명돼 있지 않으므로 이 책에서 중점적으로 다룬다.
[ 이 책의 구성 ]
■ 1장에서는 오래 전부터 있었던 윈도우 표준 드라이버 모델인 WDM을 사용해 디바이스 드라이버에 대한 기본적인 개념을 배운다.
■ 2장에서는 이 책에서 다룰 USB 사양을 설명한다. 필요한 USB 관련 지식은 이 책에서 거의 다루므로 USB 드라이버 예제 작성에 관한 한 다른 USB 참고서적을 구해 보지 않아도 된다.
■ 3장에서는 윈도우 비스타 버전부터 추가되고 현재는 윈도우 XP 등에도 적용된 KMDF 드라이버 사양에 기반을 둔 프로그램을 설명한다. KMDF는 객체지향 개념을 사용해 WDM에 비해 코드 양도 줄었는데, 실습을 통해 그 이유를 이해할 수 있다.
■ 4장에서는 윈도우 비스타 버전용으로 개발된 UMDF 드라이버 사양에 기반을 둔 프로그램을 설명한다. 64비트 버전의 윈도우 비스타부터는 서명이 없으면 드라이버를 로드할 수 없는데, 이 UMDF라면 서명이 없어도 동작시킬 수 있다. 그러나 UMDF로 구현하려면 COM이라는 객체지향 프로그래밍을 해야 한다. 이 COM과 UMDF와의 관계는 마이크로소프트 문서에도 자세히 설명돼 있지 않으므로 이 책에서 중점적으로 다룬다.
목차
목차
- 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 정리
- 1.1 디바이스 드라이버 입문
- 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 정리
- 2.1 USB의 개요
- 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 정리
- 3.1 KMDF 개요
- 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 정리
- 4.1 UMDF 드라이버의 개요
- 부록
- A 릴리즈 버전 드라이버 작성
- B 64비트 PC에서 동작
- B.1 INF 파일
- B.2 64비트 환경에서 실행하는 방법
- C 서명(KMCS)
- D GUID 생성
- E Driver Install Frameworks API 이용