WDF [윈도우를 위한 차세대 통합 드라이버 개발 모델]
- 원서명Developing Drivers with the Windows Driver Foundation (ISBN 9780735623743)
- 지은이Penny Orwick, Guy Smith, Carol Buchmiller, Annie Pearson
- 옮긴이김점갑, 최장욱
- ISBN : 9788960770294
- 45,000원
- 2008년 01월 07일 펴냄
- 페이퍼백 | 936쪽 | 188*255mm
- 시리즈 : 윈도우 시스템 프로그래밍
책 소개
차세대 통합 드라이버 모델, 윈도우 드라이버 파운데이션 WDF! 윈도우 드라이버 개발에 필요한 심층적이고도 전문적인 가이드북.
WDF 개발 팀이 직접 저술한 전문 가이드를 통해 견고한 드라이버를 개발해보자. 방대한 정보를 담고 있는 이 책으로 윈도우 개발 기술을 넓힘으로써 손쉽게 기본기를 뛰어넘을 수 있다.
최고의 프랙티스와 기법을 갖춘 지침을 얻을 수 있으며, 광범위한 코드 샘플을 통해 차세대 드라이버 모델의 난해함을 극복하고 드라이버 개발을 단순화할 수 있다.
[ 책 소개 ]
윈도우 드라이버 개발자라면 누구나 WDF로 단기간에 고품질의 드라이버를 개발할 수 있다.
수 년 동안 소프트웨어 개발자들이 마이크로소프트 윈도우 운영체제에서 동작하는 드라이버를 구현하는 것은 매우 도전적인 일이었다. 최근까지도 윈도우 드라이버 모델(WDM, Windows Driver Model)은 배우기가 힘들어 비교적 적은 그룹의 전문화된 개발자들만이 제한된 드라이버를 개발할 뿐이었다.
WDF는 안정된 윈도우 드라이버를 더 쉽게 구현하고 더 쉽게 배울 수 있는 드라이버 모델을 제공한다. WDF는 WDM을 대부분 대체하고 개발자가 운영체제의 복잡성보다는 제어해야 할 하드웨어의 요구 사항에만 집중하게 설계됐다. WDF는 이전에 커널 모드의 드라이버를 필요로 했던 주요 장치에 대해 유저 모드에서 동작하는 드라이버를 만들 수 있는 기능을 지원함으로써 시스템의 안정성을 향상시킨다.
WDF 프로그래밍 모델을 이용하면 대부분의 이벤트 처리는 WDF가 담당함으로써 개발자는 간단하지만 기능을 갖춘 드라이버를 단기간에 구현할 수 있다. 개발자는 이때부터 드라이버가 처리할 이벤트를 조금씩 늘려가면서 드라이버의 완전한 기능을 갖출 수 있다.
이 책은 윈도우 드라이버 개발에 관심 있거나 이전에 드라이버를 개발해 본 경험이 없는 소프트웨어 프로그래머에게 WDF를 소개하기 위해 설계됐다. 또한 WDF 구조를 설계하고 프레임워크를 만들고 프로그래머를 가이드할 예제 드라이버를 개발한 마이크로소프트 WDF 개발 팀의 파트너십 아래 작성됐다. WDF 구조와 프로그래밍 모델이라는 수준 높은 토론에서 시작하지만 이 책의 대부분은 예제를 통해 윈도우 드라이버 개발에 필요한 WDF 프레임워크를 소개할 수 있도록 실용적으로 고안됐다.
[ 이 책에서 다루는 내용 ]
● WDF을 사용한 커널 모드나 유저 모드 드라이버 개발
● 최소의 코드로써 플러그앤플레이와 전원 관리 지원이 가능한 드라이버 개발
● 견고한 I/O 핸들링 코드 구현
● 동기화와 병행성의 효과적인 관리
● 프로토콜과 시리얼 버스 기반의 디바이스에 대한 유저 모드 드라이버 개발
● USB 디바이스를 신속하게 개발하기 위한 프레임워크의 USB 기능 사용하기
● DMA 디바이스를 위한 커널 모드 드라이버 설계와 구현
● 소스 코드 분석과 정적 검증 툴을 이용한 드라이버 평가
● 드라이버 테스트와 디버그, 설치에 적용할 최고의 프랙티스 기법
[ 이 책의 대상 ]
윈도우 드라이버 구현에 흥미가 있으며, C 또는 C++ 언어를 사용하는 프로그래밍에 기초가 있는 개발자를 대상으로 한다.
■ WDF를 사용해 드라이버 구현 방법을 배우는 데 관심이 있는 드라이버 개발자: 경험이 있는 드라이버 개발자라면 새로운 모델에 쉽게 적응할 것이다. 하지만 WDF 유저 모드 드라이버는 COM 기반이라서 필요한 COM 프로그래밍에 대한 기본적인 소개를 한다.
■ 드라이버 개발을 시작하고자 하는 애플리케이션 개발자: WDF는 이전의 드라이버 모델(WDM)보다 쉽게 배울 수 있지만 애플리케이션은 드라이버, 특히 커널 모드 드라이버와는 많은 측면에서 매우 다르다. 윈도우 드라이버의 구조와 동작의 이해를 돕기 위해 기본적인 배경 정보를 제공한다. 이 배경 정보는 드라이버 개발에 대해 언급할 때 계속 사용된다.
■ 드라이버와 장치가 어떻게 연동하는지를 이해하고자 하는 하드웨어 엔지니어: WDF의 빠른 프로토타이핑(prototyping) 기능과 쉽게 배울 수 있는 기능을 통해 초기 하드웨어에서 구동할 드라이버를 만들어야 하는 엔지니어는 WDF 모델이 매우 유용하다는 것을 알 수 있을 것이다.
WDF에서 유저 모드 드라이버를 개발하려면 C++를 이해해야 하지만 커널 모드 드라이버는 항상 C로 작성된다. 두 언어 중에 하나라도 능숙하지 않다면 이 언어와 관련된 책을 참조해야 한다. C와 C++를 숙지하고 윈도우 프로그래밍에 익숙해졌다면 이 책은 WDF 드라이버를 시작하는 데 필요한 개념, 가이드라인, 프로그래밍 예제, 팁을 제공한다.
[ 이 책의 구성 ]
1부: 1부에서는 툴과 리소스, 윈도우 운영체제의 기본, 드라이버 개념, WDF 개론을 소개한다.
2부: WDF의 두 프레임워크는 매우 유사하지만 동일하지는 않다. 각 프레임워크는 장단점을 가진다. 2부에서는 프레임워크를 자세히 살펴볼 것이다.
3부: WDF 프레임워크의 구조와 구성 요소를 확실하게 이해했으므로 개발하는 동안 시간과 열정이 훨씬 많이 소비되는 윈도우 드라이버의 세부 사항을 살펴보자. 3부에서는 중요한 개념과 실제 상황에 대해 개괄적으로 소개한다.
4부: 사실상 커널 모드 드라이버는 윈도우 운영체제의 일부분이므로 유저 모드 드라이버와 관계없는 추가적인 복잡한 내용을 다루어야 한다. KMDF는 하드웨어 인터럽트와 다이렉트 메모리 액세스 같은 미묘한 사항을 다룰 필요도 있다. UMDF 드라이버의 경우 COM 오브젝트를 사용하고 구현하는 방법을 이해해야 한다. 4부에서는 이 주제를 심도 있게 살펴본다.
5부: 드라이버는 드라이버 개발을 위해 고안된 기술과 툴로써 빌드되고 테스트, 디버깅, 설치된다. 표준 툴뿐만 아니라 WDF는 견고한 WDF 드라이버를 쉽게 만들 수 있는 검증, 테스팅, 디버깅용 툴을 포함하고 있다.
[ 추천의 글 ]
마이크로소프트 윈도우의 핵심 커널 구성 요소를 소유하면 으레 뒤따르는 특권(또는 지저분한 일) 중의 하나는 그 구성 요소 내에서 발생하는 많은 운영체제 크래쉬를 분석해야 한다는 것이다. 필자는 I/O 매니저의 주인으로서 드라이버와 관련된 많은 문제를 디버깅할 기회가 있었고 이러한 크래쉬로부터 많은 것을 배웠다. 크래쉬 덤프를 디버깅하면서 패턴들이 나타나기 시작했다.
크래쉬를 야기하는 이런 문제를 완전히 이해하기 위해 저장 매체, 오디오, 디스플레이와 같은 다양한 장치 스택과 USB, 1394 같은 상호 연결체를 더 잘 이해해야 할 필요성을 절감했다. 그래서 윈도우 부서의 디바이스 팀 개발 리더와 드라이버 스택 검토를 시작했다. 많은 검토를 거친 후 기존 드라이버 모델이 너무나도 복잡하다는 결론을 내렸다. 마이크로소프트 사는 알맞은 추상화를 하지 않았고 드라이버 개발자에게 너무나도 많은 짐을 안겼다.
윈도우 드라이버 모델(WDM)은 14년 이상 개발에 사용되고 있다. WDM은 매우 유연하고 다양한 디바이스를 지원하지만 너무 로우레벨의 추상화를 제공한다. 윈도우 커널을 아주 깊이 이해하거나 커널 개발자들과 인연이 닿은 아주 극소수의 개발자만이 WDM을 사용했다. 현재 대부분 드라이버 개발자들은 WDM을 사용하지 않는 실정이다.
규칙이 너무 많아 이해하기도 어렵고 명확히 묘사하기도 매우 힘들었다. 플러그앤플레이와 전원 관리 지원과 같은 기본적 운영체제 기능은 윈도우 I/O 서브시스템과 잘 통합되지 않았는데, 그 이유는 플러그앤플레이 장치와 비 플러그앤플레이 장치를 동시에 수행시킬 수 있기를 원했기 때문이다. 이것은 결국 I/O 요청과 플러그앤플레이, 전원 이벤트를 동기화시켜야하는 커다란 짐을 드라이버로 떠넘기게 운영체제 설계를 몰고 갔음을 의미했다. 동기화 규칙은 복잡하고, 이해하기 어려우며, 잘 문서화돼 있지도 않다. 게다가 비동기, 취소 가능한 I/O는 초기의 운영체제(최초의 NT)부터 지원되게 설계됐지만 대부분의 드라이버는 이를 잘 처리하지 못했다.
이러한 결론이 직관적으로 명료해 보이지만 이를 검증하기 위해서는 외부 자료가 필요했다. 따라서 마이크로소프트 윈도우 XP에 온라인 크래쉬 분석(OCA)이 가능한 윈도우 에러 리포팅(WER)이라는 매우 뛰어난 기능을 포함시켰다. 윈도우가 예상치 않게 멈출 때 블루스크린상에 에러 메시지를 표시하고 시스템은 크래쉬에 대한 미니 덤프를 생성한다. 이 미니 덤프는 사용자가 크래쉬 자료를 마이크로소프트에게 보내기를 선택할 때 마이크로소프트에서 받을 수 있다. 크래쉬의 높은 빈도를 보고 드라이버 개발 방법에 대한 기본적인 변화가 필요하다는 것을 느꼈다.
드라이버 모델을 간단히 하기 위한 제안을 제시하고 우리가 발견한 사실을 입증하기 위해 조사를 한 후 여러 드라이버 개발자와 직접 마주 앉아 회의를 했다. 이러한 토론은 놀랄 만한 결론을 이끌어냈다. 대부분 드라이버 개발자는 우리의 드라이버 모델(특히 플러그앤플레이와 전원 관리, 비동기 요청의 취소)이 사용하기에 복잡하고 어렵다고 했다. 개발자들은 모두 좀 더 간단한 드라이버 모델을 선호했다. 게다가 우리가 전에 고려하지 못한 몇 가지 요구 사항도 추가했다.
첫째, 좀 더 간단한 드라이버 모델은 여러 운영체제 플랫폼에서 동작해야 한다. 하드웨어 업체들은 운영체제 버전에 관계없이 하나의 드라이버만을 작성하고 유지하기를 원했다. 최신 윈도우 버전에서만 동작하는 새로운 드라이버 모델은 수용될 수가 없었다.
둘째, 드라이버 개발자는 우리가 몇 가지 장치 클래스 특정 드라이버 모델에 사용했던 접근 방법인 소수의 API를 사용하는 데 제약을 받아서는 안 된다. 개발자는 기존 플랫폼의 드라이버 모델로부터 벗어날 수 있어야만 했다.
이러한 요구 사항을 가지고 WDF 작업을 시작했다. 목표는 모든 장치 클래스의 요구 사항을 만족시키는 차세대 드라이버 모델을 만드는 것이었다.
WDF의 경우 색다른 개발 방법론을 사용했다. 설계 초기부터 외부 드라이버 개발자를 참가시키는 설계 리뷰를 개최했다. 명세서를 만들어가면서 원탁회의(첫 번째는 2002년 11월)에 개발자들을 초대해 코딩을 시작하기도 전에 이미 많은 유용한 평가를 구했다. 이메일 계정을 지원하고 설계 선택을 위한 토론을 했던 토론 그룹을 지원했다. 다양한 내부와 외부의 얼리 어답터들이 드라이버를 작성하기 위해 우리의 프레임워크를 사용했고 매우 유용한 피드백을 주었다. 또한 WinHEC과 개발자 뉴스 그룹을 통해 많은 피드백을 찾고 구했다.
현재 WDF의 최종적 개발 모습은 여러 번의 반복 과정을 거쳐 이뤄졌다. 개발 기간 동안 얻어낸 피드백에 근거해 동기화 로직뿐만 아니라 플러그앤플레이와 전원 관리 구현을 수정했다. 특히 플러그앤플레이와 전원 관리 구현을 위해 상태도(state machines)를 사용하도록 재설계했다. 이것은 동작을 명확하게 하는 데 도움이 됐고 결과적으로 I/O와 플러그앤플레이 관계를 쉽게 이해하게 했다. WDF 드라이버를 개발함에 따라 플러그앤플레이와 전원 관리에 연관된 규칙을 발견하고 이 규칙을 상태도에 통합했다. WDF를 사용하는 가장 큰 장점은 모든 드라이버는 자동으로 잘 검증되고 잘 구조화된 플러그앤플레이와 전원 관리가 구현된 복사본을 가진다는 것이다.
우리는 OCA 자료를 보고 좀 더 확실한 방법으로 크래쉬 문제를 대처하기로 했다. OCA 자료는 예기치 않은 시스템 종료의 85%가 윈도우 커널 구성 요소가 아니라 드라이버에 의해 야기됨을 나타냈다. 분석을 통해 많은 장치 클래스(특히 USB와 블루투스, 1394 연결체) 드라이버가 커널 모드에 있을 필요가 없음을 알았다. 드라이버를 유저 모드로 옮기는 것은 이점이 많았다. 예를 들면 유저 모드 드라이버 크래쉬는 완전히 분리될 수 있고 시스템은 리부팅없이 복구될 수 있다. 유저 모드 프로그래밍 환경은 커널 모드보다 아주 간단하다. 유저 모드에서 개발자는 많은 툴을 가지고 풍부한 언어를 사용해 코드를 작성한다. WDF의 중요한 발전은 유저 모드와 커널 모드에서 동일한 드라이버 모델을 제공하는 것이다. 드라이버 모델 단순화는 시스템 크래쉬를 야기하는 많은 문제와 일맥상통하지만 버퍼 오버런, 초기화되지 않은 변수, 잘못된 시스템 루틴 사용(요청을 여러 번 완료시키기) 같은 문제를 언급하지는 않는다. 정적 분석 툴 분야의 마이크로소프트 리서치(MSR) 결과에 위에서 열거한 복잡한 문제가 언급돼 있다. MSR은 드라이버 모델 규칙을 이해할 수 있고 정형적으로 소스 코드를 분석할 수 있는 기초적인 툴을 개발했다. 이 두 가지 아이디어를 WDF의 한 부분이 된 툴에 넣기로 결정했다. 이것이 정적 드라이버 베리파이어(Verifier)와 드라이버 프리패스트(Prefast)이다.
윈도우 비스타 출시로 드라이버 개발자는 WDK를 통해 WDF 버전 1.0과 정적 툴을 사용할 수 있다. WDF와 정적 툴은 드라이버 개발 플랫폼에 훌륭한 기반을 제공한다. 윈도우 비스타 초기 출시본은 다양한 디바이스 클래스를 아우르는 17개의 KMDF 드라이버를 포함한다. 유저 모드에서 마이크로소프트 Sideshow와 윈도우 휴대용 미디어 기술은 UMDF 드라이버를 지원한다. 마이크로소프트는 현재와 미래의 장치 클래스 요구를 충족시킬 이 기반을 계속 확고히 할 것이다.
이 책은 WDF 프레임워크와 정적 툴의 핵심 사항을 포착하고 WDF와 연관된 모든 정보를 이용할 수 있는 최초의 유일한 창구이다. 이 책을 통해 드라이버 개발자(초급자일지라도)는 도움을 얻어 WDF로 빠르게 나아갈 수 있다. WDF를 통해 이전의 드라이버 모델보다 훨씬 단시간 내에 양질의 드라이버를 개발할 수 있다.
WDF 개발 팀이 직접 저술한 전문 가이드를 통해 견고한 드라이버를 개발해보자. 방대한 정보를 담고 있는 이 책으로 윈도우 개발 기술을 넓힘으로써 손쉽게 기본기를 뛰어넘을 수 있다.
최고의 프랙티스와 기법을 갖춘 지침을 얻을 수 있으며, 광범위한 코드 샘플을 통해 차세대 드라이버 모델의 난해함을 극복하고 드라이버 개발을 단순화할 수 있다.
[ 책 소개 ]
윈도우 드라이버 개발자라면 누구나 WDF로 단기간에 고품질의 드라이버를 개발할 수 있다.
- Nar Ganapathy, 마이크로소프트 사 윈도우 디바이스 익스피리언스 그룹 아키텍트
수 년 동안 소프트웨어 개발자들이 마이크로소프트 윈도우 운영체제에서 동작하는 드라이버를 구현하는 것은 매우 도전적인 일이었다. 최근까지도 윈도우 드라이버 모델(WDM, Windows Driver Model)은 배우기가 힘들어 비교적 적은 그룹의 전문화된 개발자들만이 제한된 드라이버를 개발할 뿐이었다.
WDF는 안정된 윈도우 드라이버를 더 쉽게 구현하고 더 쉽게 배울 수 있는 드라이버 모델을 제공한다. WDF는 WDM을 대부분 대체하고 개발자가 운영체제의 복잡성보다는 제어해야 할 하드웨어의 요구 사항에만 집중하게 설계됐다. WDF는 이전에 커널 모드의 드라이버를 필요로 했던 주요 장치에 대해 유저 모드에서 동작하는 드라이버를 만들 수 있는 기능을 지원함으로써 시스템의 안정성을 향상시킨다.
WDF 프로그래밍 모델을 이용하면 대부분의 이벤트 처리는 WDF가 담당함으로써 개발자는 간단하지만 기능을 갖춘 드라이버를 단기간에 구현할 수 있다. 개발자는 이때부터 드라이버가 처리할 이벤트를 조금씩 늘려가면서 드라이버의 완전한 기능을 갖출 수 있다.
이 책은 윈도우 드라이버 개발에 관심 있거나 이전에 드라이버를 개발해 본 경험이 없는 소프트웨어 프로그래머에게 WDF를 소개하기 위해 설계됐다. 또한 WDF 구조를 설계하고 프레임워크를 만들고 프로그래머를 가이드할 예제 드라이버를 개발한 마이크로소프트 WDF 개발 팀의 파트너십 아래 작성됐다. WDF 구조와 프로그래밍 모델이라는 수준 높은 토론에서 시작하지만 이 책의 대부분은 예제를 통해 윈도우 드라이버 개발에 필요한 WDF 프레임워크를 소개할 수 있도록 실용적으로 고안됐다.
[ 이 책에서 다루는 내용 ]
● WDF을 사용한 커널 모드나 유저 모드 드라이버 개발
● 최소의 코드로써 플러그앤플레이와 전원 관리 지원이 가능한 드라이버 개발
● 견고한 I/O 핸들링 코드 구현
● 동기화와 병행성의 효과적인 관리
● 프로토콜과 시리얼 버스 기반의 디바이스에 대한 유저 모드 드라이버 개발
● USB 디바이스를 신속하게 개발하기 위한 프레임워크의 USB 기능 사용하기
● DMA 디바이스를 위한 커널 모드 드라이버 설계와 구현
● 소스 코드 분석과 정적 검증 툴을 이용한 드라이버 평가
● 드라이버 테스트와 디버그, 설치에 적용할 최고의 프랙티스 기법
[ 이 책의 대상 ]
윈도우 드라이버 구현에 흥미가 있으며, C 또는 C++ 언어를 사용하는 프로그래밍에 기초가 있는 개발자를 대상으로 한다.
■ WDF를 사용해 드라이버 구현 방법을 배우는 데 관심이 있는 드라이버 개발자: 경험이 있는 드라이버 개발자라면 새로운 모델에 쉽게 적응할 것이다. 하지만 WDF 유저 모드 드라이버는 COM 기반이라서 필요한 COM 프로그래밍에 대한 기본적인 소개를 한다.
■ 드라이버 개발을 시작하고자 하는 애플리케이션 개발자: WDF는 이전의 드라이버 모델(WDM)보다 쉽게 배울 수 있지만 애플리케이션은 드라이버, 특히 커널 모드 드라이버와는 많은 측면에서 매우 다르다. 윈도우 드라이버의 구조와 동작의 이해를 돕기 위해 기본적인 배경 정보를 제공한다. 이 배경 정보는 드라이버 개발에 대해 언급할 때 계속 사용된다.
■ 드라이버와 장치가 어떻게 연동하는지를 이해하고자 하는 하드웨어 엔지니어: WDF의 빠른 프로토타이핑(prototyping) 기능과 쉽게 배울 수 있는 기능을 통해 초기 하드웨어에서 구동할 드라이버를 만들어야 하는 엔지니어는 WDF 모델이 매우 유용하다는 것을 알 수 있을 것이다.
WDF에서 유저 모드 드라이버를 개발하려면 C++를 이해해야 하지만 커널 모드 드라이버는 항상 C로 작성된다. 두 언어 중에 하나라도 능숙하지 않다면 이 언어와 관련된 책을 참조해야 한다. C와 C++를 숙지하고 윈도우 프로그래밍에 익숙해졌다면 이 책은 WDF 드라이버를 시작하는 데 필요한 개념, 가이드라인, 프로그래밍 예제, 팁을 제공한다.
[ 이 책의 구성 ]
1부: 1부에서는 툴과 리소스, 윈도우 운영체제의 기본, 드라이버 개념, WDF 개론을 소개한다.
2부: WDF의 두 프레임워크는 매우 유사하지만 동일하지는 않다. 각 프레임워크는 장단점을 가진다. 2부에서는 프레임워크를 자세히 살펴볼 것이다.
3부: WDF 프레임워크의 구조와 구성 요소를 확실하게 이해했으므로 개발하는 동안 시간과 열정이 훨씬 많이 소비되는 윈도우 드라이버의 세부 사항을 살펴보자. 3부에서는 중요한 개념과 실제 상황에 대해 개괄적으로 소개한다.
4부: 사실상 커널 모드 드라이버는 윈도우 운영체제의 일부분이므로 유저 모드 드라이버와 관계없는 추가적인 복잡한 내용을 다루어야 한다. KMDF는 하드웨어 인터럽트와 다이렉트 메모리 액세스 같은 미묘한 사항을 다룰 필요도 있다. UMDF 드라이버의 경우 COM 오브젝트를 사용하고 구현하는 방법을 이해해야 한다. 4부에서는 이 주제를 심도 있게 살펴본다.
5부: 드라이버는 드라이버 개발을 위해 고안된 기술과 툴로써 빌드되고 테스트, 디버깅, 설치된다. 표준 툴뿐만 아니라 WDF는 견고한 WDF 드라이버를 쉽게 만들 수 있는 검증, 테스팅, 디버깅용 툴을 포함하고 있다.
[ 추천의 글 ]
마이크로소프트 윈도우의 핵심 커널 구성 요소를 소유하면 으레 뒤따르는 특권(또는 지저분한 일) 중의 하나는 그 구성 요소 내에서 발생하는 많은 운영체제 크래쉬를 분석해야 한다는 것이다. 필자는 I/O 매니저의 주인으로서 드라이버와 관련된 많은 문제를 디버깅할 기회가 있었고 이러한 크래쉬로부터 많은 것을 배웠다. 크래쉬 덤프를 디버깅하면서 패턴들이 나타나기 시작했다.
크래쉬를 야기하는 이런 문제를 완전히 이해하기 위해 저장 매체, 오디오, 디스플레이와 같은 다양한 장치 스택과 USB, 1394 같은 상호 연결체를 더 잘 이해해야 할 필요성을 절감했다. 그래서 윈도우 부서의 디바이스 팀 개발 리더와 드라이버 스택 검토를 시작했다. 많은 검토를 거친 후 기존 드라이버 모델이 너무나도 복잡하다는 결론을 내렸다. 마이크로소프트 사는 알맞은 추상화를 하지 않았고 드라이버 개발자에게 너무나도 많은 짐을 안겼다.
윈도우 드라이버 모델(WDM)은 14년 이상 개발에 사용되고 있다. WDM은 매우 유연하고 다양한 디바이스를 지원하지만 너무 로우레벨의 추상화를 제공한다. 윈도우 커널을 아주 깊이 이해하거나 커널 개발자들과 인연이 닿은 아주 극소수의 개발자만이 WDM을 사용했다. 현재 대부분 드라이버 개발자들은 WDM을 사용하지 않는 실정이다.
규칙이 너무 많아 이해하기도 어렵고 명확히 묘사하기도 매우 힘들었다. 플러그앤플레이와 전원 관리 지원과 같은 기본적 운영체제 기능은 윈도우 I/O 서브시스템과 잘 통합되지 않았는데, 그 이유는 플러그앤플레이 장치와 비 플러그앤플레이 장치를 동시에 수행시킬 수 있기를 원했기 때문이다. 이것은 결국 I/O 요청과 플러그앤플레이, 전원 이벤트를 동기화시켜야하는 커다란 짐을 드라이버로 떠넘기게 운영체제 설계를 몰고 갔음을 의미했다. 동기화 규칙은 복잡하고, 이해하기 어려우며, 잘 문서화돼 있지도 않다. 게다가 비동기, 취소 가능한 I/O는 초기의 운영체제(최초의 NT)부터 지원되게 설계됐지만 대부분의 드라이버는 이를 잘 처리하지 못했다.
이러한 결론이 직관적으로 명료해 보이지만 이를 검증하기 위해서는 외부 자료가 필요했다. 따라서 마이크로소프트 윈도우 XP에 온라인 크래쉬 분석(OCA)이 가능한 윈도우 에러 리포팅(WER)이라는 매우 뛰어난 기능을 포함시켰다. 윈도우가 예상치 않게 멈출 때 블루스크린상에 에러 메시지를 표시하고 시스템은 크래쉬에 대한 미니 덤프를 생성한다. 이 미니 덤프는 사용자가 크래쉬 자료를 마이크로소프트에게 보내기를 선택할 때 마이크로소프트에서 받을 수 있다. 크래쉬의 높은 빈도를 보고 드라이버 개발 방법에 대한 기본적인 변화가 필요하다는 것을 느꼈다.
드라이버 모델을 간단히 하기 위한 제안을 제시하고 우리가 발견한 사실을 입증하기 위해 조사를 한 후 여러 드라이버 개발자와 직접 마주 앉아 회의를 했다. 이러한 토론은 놀랄 만한 결론을 이끌어냈다. 대부분 드라이버 개발자는 우리의 드라이버 모델(특히 플러그앤플레이와 전원 관리, 비동기 요청의 취소)이 사용하기에 복잡하고 어렵다고 했다. 개발자들은 모두 좀 더 간단한 드라이버 모델을 선호했다. 게다가 우리가 전에 고려하지 못한 몇 가지 요구 사항도 추가했다.
첫째, 좀 더 간단한 드라이버 모델은 여러 운영체제 플랫폼에서 동작해야 한다. 하드웨어 업체들은 운영체제 버전에 관계없이 하나의 드라이버만을 작성하고 유지하기를 원했다. 최신 윈도우 버전에서만 동작하는 새로운 드라이버 모델은 수용될 수가 없었다.
둘째, 드라이버 개발자는 우리가 몇 가지 장치 클래스 특정 드라이버 모델에 사용했던 접근 방법인 소수의 API를 사용하는 데 제약을 받아서는 안 된다. 개발자는 기존 플랫폼의 드라이버 모델로부터 벗어날 수 있어야만 했다.
이러한 요구 사항을 가지고 WDF 작업을 시작했다. 목표는 모든 장치 클래스의 요구 사항을 만족시키는 차세대 드라이버 모델을 만드는 것이었다.
WDF의 경우 색다른 개발 방법론을 사용했다. 설계 초기부터 외부 드라이버 개발자를 참가시키는 설계 리뷰를 개최했다. 명세서를 만들어가면서 원탁회의(첫 번째는 2002년 11월)에 개발자들을 초대해 코딩을 시작하기도 전에 이미 많은 유용한 평가를 구했다. 이메일 계정을 지원하고 설계 선택을 위한 토론을 했던 토론 그룹을 지원했다. 다양한 내부와 외부의 얼리 어답터들이 드라이버를 작성하기 위해 우리의 프레임워크를 사용했고 매우 유용한 피드백을 주었다. 또한 WinHEC과 개발자 뉴스 그룹을 통해 많은 피드백을 찾고 구했다.
현재 WDF의 최종적 개발 모습은 여러 번의 반복 과정을 거쳐 이뤄졌다. 개발 기간 동안 얻어낸 피드백에 근거해 동기화 로직뿐만 아니라 플러그앤플레이와 전원 관리 구현을 수정했다. 특히 플러그앤플레이와 전원 관리 구현을 위해 상태도(state machines)를 사용하도록 재설계했다. 이것은 동작을 명확하게 하는 데 도움이 됐고 결과적으로 I/O와 플러그앤플레이 관계를 쉽게 이해하게 했다. WDF 드라이버를 개발함에 따라 플러그앤플레이와 전원 관리에 연관된 규칙을 발견하고 이 규칙을 상태도에 통합했다. WDF를 사용하는 가장 큰 장점은 모든 드라이버는 자동으로 잘 검증되고 잘 구조화된 플러그앤플레이와 전원 관리가 구현된 복사본을 가진다는 것이다.
우리는 OCA 자료를 보고 좀 더 확실한 방법으로 크래쉬 문제를 대처하기로 했다. OCA 자료는 예기치 않은 시스템 종료의 85%가 윈도우 커널 구성 요소가 아니라 드라이버에 의해 야기됨을 나타냈다. 분석을 통해 많은 장치 클래스(특히 USB와 블루투스, 1394 연결체) 드라이버가 커널 모드에 있을 필요가 없음을 알았다. 드라이버를 유저 모드로 옮기는 것은 이점이 많았다. 예를 들면 유저 모드 드라이버 크래쉬는 완전히 분리될 수 있고 시스템은 리부팅없이 복구될 수 있다. 유저 모드 프로그래밍 환경은 커널 모드보다 아주 간단하다. 유저 모드에서 개발자는 많은 툴을 가지고 풍부한 언어를 사용해 코드를 작성한다. WDF의 중요한 발전은 유저 모드와 커널 모드에서 동일한 드라이버 모델을 제공하는 것이다. 드라이버 모델 단순화는 시스템 크래쉬를 야기하는 많은 문제와 일맥상통하지만 버퍼 오버런, 초기화되지 않은 변수, 잘못된 시스템 루틴 사용(요청을 여러 번 완료시키기) 같은 문제를 언급하지는 않는다. 정적 분석 툴 분야의 마이크로소프트 리서치(MSR) 결과에 위에서 열거한 복잡한 문제가 언급돼 있다. MSR은 드라이버 모델 규칙을 이해할 수 있고 정형적으로 소스 코드를 분석할 수 있는 기초적인 툴을 개발했다. 이 두 가지 아이디어를 WDF의 한 부분이 된 툴에 넣기로 결정했다. 이것이 정적 드라이버 베리파이어(Verifier)와 드라이버 프리패스트(Prefast)이다.
윈도우 비스타 출시로 드라이버 개발자는 WDK를 통해 WDF 버전 1.0과 정적 툴을 사용할 수 있다. WDF와 정적 툴은 드라이버 개발 플랫폼에 훌륭한 기반을 제공한다. 윈도우 비스타 초기 출시본은 다양한 디바이스 클래스를 아우르는 17개의 KMDF 드라이버를 포함한다. 유저 모드에서 마이크로소프트 Sideshow와 윈도우 휴대용 미디어 기술은 UMDF 드라이버를 지원한다. 마이크로소프트는 현재와 미래의 장치 클래스 요구를 충족시킬 이 기반을 계속 확고히 할 것이다.
이 책은 WDF 프레임워크와 정적 툴의 핵심 사항을 포착하고 WDF와 연관된 모든 정보를 이용할 수 있는 최초의 유일한 창구이다. 이 책을 통해 드라이버 개발자(초급자일지라도)는 도움을 얻어 WDF로 빠르게 나아갈 수 있다. WDF를 통해 이전의 드라이버 모델보다 훨씬 단시간 내에 양질의 드라이버를 개발할 수 있다.
Nar Ganapathy
마이크로소프트 사 윈도우 디바이스 익스피리언스 그룹 아키텍트
마이크로소프트 사 윈도우 디바이스 익스피리언스 그룹 아키텍트
목차
목차
- 1부 _ WDF 시작 1
- 01장 WDF 소개 3
- 이 책에 관해 4
- 이 책의 대상 독자 4
- 1부 소개: WDF 시작 5
- 2부 소개: 프레임워크 살펴보기 5
- 3부 소개: WDF 기본 적용 6
- 4부 소개: KMDF 드라이버의 다양한 주제 8
- 5부 소개: WDF 드라이버 빌드와 설치, 테스트 9
- 이 책에서 사용한 규약 10
- 드라이버 개발 시작 11
- 드라이버 개발에 필요한 시스템 요구 사항 12
- WDK의 구입과 설치 13
- WDK 라이브러리 14
- WDK 문서 14
- WDK 툴 15
- WDK 샘플 16
- 윈도우 체크드 빌드 구하기 17
- 디버깅 툴 구하기 18
- OSR 교육 장치 19
- 중요 정보 출처 20
- 중요한 참고 사항 22
- 중요한 참고 사항 22
- 이 책에 관해 4
- 02장 윈도우 드라이버 기본 23
- 드라이버란 무엇인가? 24
- 핵심 윈도우 구조 25
- 드라이버 아키텍처 27
- 커널 오브젝트와 데이터 구조체 31
- 윈도우 I/O 모델 31
- I/O 요청 32
- 디바이스 스택이 IRP를 처리하는 방법 33
- 데이터 버퍼와 I/O 전송 형태 34
- 디바이스와의 데이터 송수신 방법 35
- 플러그앤플레이와 전원 관리 36
- 커널 모드 프로그래밍 기초 36
- 인터럽트와 IRQL 37
- 병행성과 동기화 39
- 메모리 41
- 커널 모드 프로그래밍 팁 44
- 기본 용어 46
- 드라이버란 무엇인가? 24
- 03장 WDF의 기본 51
- WDF와 WDM 52
- WDF는 무엇인가? 52
- WDF 오브젝트 모델 54
- 프로그래밍 인터페이스 54
- 오브젝트 계층 55
- 병행성과 동기화 55
- I/O 모델 56
- I/O 요청 취소 56
- I/O 타깃 57
- 치명적이지 않은 에러를 처리하는 방법 58
- 플러그앤플레이와 전원 관리 59
- 보안 61
- 안전한 디폴트 62
- 인자 검증 62
- WDF 검증과 트레이싱, 디버깅 지원 63
- 사용성과 버전 규칙 63
- 2부 _ 프레임워크 살펴보기
- 04장 드라이버 프레임워크 개관 67
- 프레임워크: 개요 67
- UMDF 개요 68
- UMDF 프레임워크 오브젝트 69
- UMDF 콜백 오브젝트 70
- KMDF 개요 71
- KMDF 오브젝트 72
- KMDF 콜백 함수 73
- WDF 아키텍처 73
- UMDF 인프라 76
- UMDF 인프라 구성 요소 77
- UMDF 드라이버의 치명적 에러 80
- 전형적인 UMDF I/O 요청 80
- KMDF 인프라 81
- KMDF 인프라 구성 요소 82
- KMDF 드라이버의 치명적 에러 83
- 전형적 KMDF I/O 요청 84
- WDF에서 디바이스와 드라이버 지원 84
- UMDF 지원 디바이스 85
- KMDF 지원 디바이스 88
- 적절한 프레임워크 선택하기 89
- 05장 WDF 오브젝트 모델 91
- 오브젝트 모델 개요 92
- 메소드와 프로퍼티, 이벤트 92
- 이벤트 콜백 93
- 오브젝트 속성 94
- 오브젝트 계층과 생명 주기 94
- 오브젝트 컨텍스트 95
- UMDF 오브젝트 모델 구현 95
- UMDF 이름 규약 95
- UMDF 프레임워크 오브젝트와 인터페이스 97
- UMDF 드라이버 콜백 오브젝트와 인터페이스 99
- UMDF 예제: 오브젝트와 콜백 인터페이스 100
- KMDF 오브젝트 모델 구현 101
- KMDF 오브젝트 유형 102
- KMDF 이름 규약 104
- 오브젝트 생성 105
- UMDF 오브젝트 생성 105
- KMDF 오브젝트 생성 106
- 오브젝트 계층과 생명 주기 109
- UMDF 오브젝트 계층 111
- KMDF 오브젝트 계층 113
- 오브젝트 삭제 114
- 오브젝트 컨텍스트 영역 122
- UMDF 오브젝트 컨텍스트 데이터 122
- KMDF 오브젝트의 컨텍스트 영역 126
- 오브젝트 모델 개요 92
- 06장 드라이버 구조와 초기화 129
- 필요한 드라이버 구성 요소 130
- UMDF 드라이버 구조와 요구 사항 130
- KMDF 드라이버 구조와 요구 사항 133
- 드라이버 오브젝트 135
- UMDF 드라이버 콜백 오브젝트 생성 135
- KMDF 드라이버 오브젝트 생성 137
- 디바이스 오브젝트 140
- 디바이스 오브젝트의 유형 140
- WDF 드라이버와 드라이버 유형, 디바이스 오브젝트 유형 144
- 디바이스 프로퍼티 145
- 디바이스 오브젝트 초기화 146
- 큐와 기타 지원 오브젝트 147
- 디바이스 인터페이스 148
- UMDF 디바이스 오브젝트 생성과 초기화 149
- 디바이스 콜백 오브젝트 생성 150
- 프레임워크 디바이스 오브젝트 생성과 초기화 150
- UMDF 예제: 디바이스 인터페이스 152
- KMDF 디바이스 오브젝트 생성과 초기화 152
- KMDF 디바이스 초기화 구조체 153
- 디바이스 오브젝트 컨텍스트 영역 154
- KMDF 디바이스 오브젝트 생성 155
- EvtDriverDeviceAdd의 부가적인 작업 155
- KMDF 예제: EvtDriverDeviceAdd 콜백 함수 156
- 자식 디바이스 열거(KMDF PDO만 해당됨) 158
- 버스 드라이버의 정적 열거와 동적 열거 158
- PDO 종속적 초기화 159
- KMDF 드라이버의 디바이스 네이밍 기법 160
- 네임드 디바이스 오브젝트 160
- 보안 디스크립터 161
- 필요한 드라이버 구성 요소 130
- 3부 _ WDF 기본 적용
- 07장 플러그앤플레이와 전원 관리 165
- 플러그앤플레이와 전원 관리 소개 166
- 플러그앤플레이에 관해 167
- 전원 상태에 관해 168
- 전원 정책에 관해 170
- WDF에서 플러그앤플레이와 전원 관리 지원 170
- 플러그앤플레이와 전원 관리의 디폴트 기능 170
- I/O 큐와 전원 관리 171
- 플러그앤플레이와 전원 이벤트 콜백 172
- 유휴와 웨이크 지원(KMDF에만 해당) 173
- 파워 페이지블과 넌파워 페이지블 드라이버 174
- 플러그앤플레이와 전원 관리 콜백 순서 176
- 디바이스 열거와 시작 179
- 디바이스 파워다운과 제거 183
- 서프라이즈 리무브 186
- WDF 드라이버에서 플러그앤플레이와 전원 관리 구현 방법 188
- 소프트웨어 전용 드라이버에서 플러그앤플레이와 전원 관리 189
- UMDF 예제: 소프트웨어 전용 필터 드라이버에서 플러그앤플레이 190
- KMDF 예제: 소프트웨어 전용 필터 드라이버에서 플러그앤플레이 191
- 소프트웨어 전용 드라이버에서 프레임워크의 역할 193
- 간단한 하드웨어 드라이버에서 플러그앤플레이와 전원 관리 194
- 디바이스 파워업 초기화와 파워다운 해체 작업 194
- 하드웨어 펑션 드라이버에서 큐의 전원 관리 195
- UMDF 예제: 프로토콜 펑션 드라이버에서 플러그앤플레이와 전원 코드 196
- KMDF 예제: 간단한 하드웨어 펑션 드라이버에서 플러그앤플레이와 파워 코드 201
- 간단한 하드웨어 펑션 드라이버에서 프레임워크의 역할 205
- KMDF 드라이버의 고급 전원 관리 207
- KMDF 드라이버의 디바이스 파워다운 유휴 지원 207
- KMDF 드라이버에서 디바이스 웨이크 지원 212
- KMDF 예제: 디바이스 유휴와 웨이크 지원 217
- 디바이스 유휴를 지원하는 프레임워크의 동작 220
- 디바이스 웨이크를 지원하는 프레임워크의 동작 220
- 플러그앤플레이와 전원 관리 소개 166
- 08장 I/O 흐름과 전달 223
- 일반 I/O 요청 유형 224
- 생성 요청 224
- 클린업과 닫기 요청 225
- 읽기와 쓰기 요청 226
- 디바이스 I/O 컨트롤 요청 226
- I/O 요청 유형 요약 227
- I/O 전송 유형 228
- 버퍼드 I/O 230
- 다이렉트 I/O 230
- 버퍼드 I/O도 아니고 다이렉트 I/O도 아님 231
- I/O 요청 흐름 232
- UMDF 디바이스 스택을 경유하는 I/O 요청 경로 234
- KMDF 드라이버를 경유하는 I/O 요청 경로 236
- I/O 완료 처리 238
- 프레임워크 내에서 I/O 요청 흐름 239
- I/O 요청 핸들러 내의 처리 242
- I/O 요청 오브젝트 243
- I/O 버퍼와 메모리 오브젝트 244
- 요청과 메모리, 버퍼 포인터 생명 주기 253
- I/O 큐 253
- 큐 설정과 요청 유형 254
- 큐와 전원 관리 257
- 전달 유형 259
- 큐 제어 260
- UMDF 예제: I/O 큐 생성하기 261
- KMDF 예제: I/O 큐 생성 265
- 수동 큐에서 요청을 가져오기 268
- I/O 이벤트 콜백 272
- I/O에 있어서 파일 오브젝트 272
- 생성과 클린업, 닫기 요청을 자동으로 전송하기 273
- 생성 요청을 위한 I/O 이벤트 콜백 274
- 클린업과 닫기의 I/O 이벤트 콜백 281
- 읽기와 쓰기, 디바이스 I/O 컨트롤 요청의 I/O 이벤트 콜백 282
- I/O 요청 완료 292
- 취소된 요청과 서스펜드된 요청 294
- 요청 취소 294
- 요청 서스펜션 296
- UMDF에서의 적절한 타임아웃 297
- 셀프 매니지드 I/O 298
- 디바이스 시작과 재시작 동안의 셀프 매니지드 I/O 300
- 디바이스 파워다운과 제거 동안의 셀프 매니지드 I/O 300
- KMDF 예제: 와치독 타이머 구현 301
- 일반 I/O 요청 유형 224
- 09장 I/O 타깃 307
- I/O 타깃에 관해 308
- 디폴트 I/O 타깃 309
- KMDF 드라이버에서 원격 I/O 타깃 309
- 일반 I/O 타깃과 특수 I/O 타깃 309
- UMDF I/O 타깃 구현 310
- I/O 타깃의 생성과 관리 313
- 디폴트 I/O 타깃 구하기 314
- KMDF 드라이버에서 원격 I/O 타깃 생성 314
- I/O 타깃 상태 관리 319
- I/O 요청 생성 322
- UMDF 예제: WDF I/O 요청 오브젝트 생성 322
- KMDF 예제: WDF I/O 요청 오브젝트 생성 323
- 드라이버가 생성한 I/O 요청의 메모리 오브젝트와 버퍼 324
- I/O 요청의 메모리 오브젝트와 버퍼 할당 325
- UMDF 예제: 기존의 버퍼로 새로운 메모리 오브젝트 생성 329
- KMDF 예제: 새로운 메모리 오브젝트와 새로운 버퍼 생성 330
- I/O 요청 포맷 331
- 디폴트 I/O 타깃을 위해 변경되지 않는 요청을 포맷하는 방법 331
- 변경되는 요청이나 드라이버가 생성한 요청을 포맷하는 방법 332
- I/O 완료 콜백 335
- I/O 요청을 보내는 방법 337
- 요청을 보내는 옵션 338
- UMDF 예제: 디폴트 I/O 타깃으로 요청 전송 341
- KMDF 예제: 보내고 잊기 343
- KMDF 예제: I/O 요청을 포맷해 I/O 타깃으로 전송 345
- I/O 요청을 더 작은 요청들로 나누는 방법 346
- KMDF 예제: I/O 요청 오브젝트 재사용 348
- 보내진 요청을 취소하는 방법 351
- UMDF 드라이버에서 파일 핸들 I/O 타깃 353
- USB I/O 타깃 355
- USB 디바이스에 관해 356
- WDF에서 특수 USB I/O 타깃 359
- USB I/O 타깃을 구성하는 방법 362
- USB I/O 타깃으로 I/O 요청을 보내는 방법 370
- KMDF에서 USB 연속 리더 376
- I/O 요청을 보내기 위한 가이드라인 377
- I/O 타깃에 관해 308
- 10장 동기화 379
- 동기화가 필요한 시기 380
- 공유 데이터에 동기화된 접근: 예제 380
- WDF 드라이버의 동기화 요구 사항 383
- WDF 동기화 특징 383
- 참조 카운트와 계층적 오브젝트 모델 384
- 플러그앤플레이와 전원 콜백의 직렬화 384
- I/O 큐의 흐름 제어 385
- 오브젝트 제공 락 386
- 동기화 범위와 I/O 콜백 직렬화 386
- 디바이스 범위와 큐 전달 방법 387
- UMDF 드라이버에서 동기화 범위 390
- KMDF 드라이버에서 동기화 범위 391
- KMDF 대기 락과 스핀 락 398
- 대기 락 398
- 스핀 락 399
- KMDF 드라이버에서 I/O 요청 취소의 동기화 401
- 동기화 범위를 사용해 동기화된 취소 402
- 요청 컨텍스트 내의 상태를 추적함으로써 동기화된 취소 403
- 드라이버가 생성한 서브 요청을 가진 들어오는 요청의 동기화된 취소 408
- 동기화에 관한 요약과 일반 팁 409
- 동기화가 필요한 시기 380
- 11장 드라이버 트레이싱과 진단성 411
- WPP 소프트웨어 트레이싱의 기본 412
- WPP 소프트웨어 트레이싱의 장점 412
- WPP 소프트웨어 트레이싱 구성 요소 413
- WPP와 ETW 416
- 윈도우 비스타에서 ETW 416
- 트레이스 메시지 함수와 매크로 417
- DoTraceMessage 매크로 417
- 디버그 프린트문을 ETW로 변환하는 방법 418
- 메시지 조건 418
- 커스텀 트레이스 메시지 함수 419
- 드라이버에서 소프트웨어 트레이싱을 지원하는 방법 419
- WPP 전처리기를 수행하기 위한 Sources의 수정 420
- TMH 파일의 포함 424
- 컨트롤 GUID와 트레이스 플래그 정의 425
- 트레이싱의 초기화와 정리 427
- 드라이버 코드 조율 431
- 소프트웨어 트레이싱 툴 432
- 소프트웨어 트레이스 세션을 실행하는 방법 433
- 샘플의 준비 434
- TraceView를 사용해 드라이버 트레이스 로그 보기 435
- 중요 트레이싱 툴을 사용해 프레임워크 트레이스 로그 보기 437
- 가장 좋은 프랙티스: 진단성 설계 440
- WPP 소프트웨어 트레이싱의 기본 412
- 12장 WDF 지원 오브젝트 441
- 메모리 할당 442
- 지역 저장소 442
- 메모리 오브젝트와 I/O 버퍼 443
- 레지스트리 접근 447
- UMDF 디바이스 프로퍼티 저장소 447
- KMDF 레지스트리 오브젝트와 메소드 450
- 일반 오브젝트 454
- UMDF 예제: 일반 오브젝트를 생성하는 방법 454
- KMDF 예제: 일반 오브젝트를 생성하는 방법 455
- KMDF 컬렉션 오브젝트 456
- 컬렉션 메소드 457
- 예제: 컬렉션의 생성과 사용 457
- KMDF 타이머 오브젝트 460
- 타이머 오브젝트 메소드 460
- 타이머 주기 461
- EvtTimerFunc 콜백 함수 462
- 예제: 타이머 오브젝트의 사용 463
- KMDF 드라이버에서 WMI 지원 465
- WMI에 관해 465
- WMI 지원을 위한 필요 조건 466
- WMI 지원을 초기화하는 방법 466
- WMI 인스턴스 이벤트 콜백 471
- 메모리 할당 442
- 13장 UMDF 드라이버 템플릿 475
- Skeleton 샘플 설명 475
- Skeleton 샘플에 관해 476
- Skeleton 샘플 파일에 관해 476
- Skeleton 샘플 소스 파일 커스터마이즈 478
- DLL 인프라 478
- 기본적인 COM 지원 480
- Skeleton 샘플 드라이버의 콜백 오브젝트 481
- Skeleton 샘플의 디바이스 콜백 오브젝트 484
- Skeleton 샘플 빌드와 설치 지원 파일 커스터마이즈 486
- Sources 486
- Make 파일 488
- Exports 488
- 버전 리소스 파일 489
- INX 파일 489
- Skeleton 샘플 설명 475
- 4부 _ KMDF 드라이버의 다양한 주제
- 14장 프레임워크를 넘어서 497
- 프레임워크 외부의 시스템 서비스 사용법 497
- UMDF 드라이버에서 윈도우 API를 사용하는 방법 498
- KMDF 드라이버에서 커널 모드 드라이버 지원 루틴 사용법 500
- 프레임워크가 지원하지 않는 요청을 처리하는 방법 503
- 지원되지 않는 요청의 디폴트 처리 503
- KMDF 드라이버에서 지원되지 않는 요청을 처리하는 방법 504
- 프레임워크 외부의 시스템 서비스 사용법 497
- 15장 스케줄링과 스레드 컨텍스트, IRQL 507
- 스레드 508
- 스레드 스케줄링 508
- 스레드 컨텍스트 정의 509
- KMDF 드라이버 함수의 스레드 컨텍스트 510
- 인터럽트 요청 레벨 511
- 프로세서 종속적 IRQL과 스레드 종속적 IRQL 512
- DISPATCH_LEVEL 이상에서 실행 중일 때의 가이드라인 517
- 낮은 IRQL에서 실행하는 함수 호출 517
- 스레드 인터럽션 시나리오 518
- 단일 프로세서 시스템상의 스레드 인터럽션 518
- 멀티프로세서 시스템상의 스레드 인터럽션 519
- IRQL 문제에 대한 테스트 521
- 워크 아이템과 드라이버 스레드 523
- 워크 아이템에 대해서 524
- KMDF 예제: 워크 아이템의 사용 525
- KMDF 드라이버에서 스레드 컨텍스트와 IRQL을 관리하는 가장 좋은 프랙티스 527
- 스레드 508
- 16장 하드웨어 자원과 인터럽트 529
- 하드웨어 자원 530
- 하드웨어 자원 식별과 해체 530
- 자원 리스트 532
- 예제: 자원을 맵핑하는 방법 534
- 예제: 자원을 언맵핑하는 방법 537
- 인터럽트와 인터럽트 처리 538
- 인터럽트 오브젝트 539
- 인터럽트를 활성화하고 비활성화하는 방법 541
- 후 인터럽트 활성화와 선 인터럽트 비활성화 처리 543
- 인터럽트 서비스 루틴 544
- 인터럽트의 지연된 처리 547
- DIRQL에서 동기화된 처리 548
- 하드웨어 자원 530
- 17장 다이렉트 메모리 액세스 549
- 기본 DMA 개념과 용어 550
- DMA 트랜잭션과 DMA 전송 550
- 패킷 기반과 커먼 버퍼 DMA 551
- 스캐터/개더 지원 552
- DMA 종속적인 디바이스 정보 552
- 디바이스 정보와 DMA 드라이버 설계 553
- 고려 대상이 아닌 것 555
- 윈도우 DMA 추상화 555
- DMA 동작과 프로세서 캐시 556
- 캐시를 플러쉬함으로써 DMA 전송의 완료 557
- 맵 레지스터 557
- 시스템 스캐터/개더 지원 560
- 물리 메모리의 임의의 위치로 DMA 전송 562
- DMA 드라이버 구현 563
- 드라이버 DMA 초기화 565
- 트랜잭션 시작 569
- 요청 처리 572
- DMA 완료 처리 576
- DMA 드라이버 테스트 578
- DMA 특정적인 검증 578
- !dma 디버거 익스텐션 579
- DMA 용도의 KMDF 디버거 익스텐션 580
- 최고의 프랙티스: DMA 드라이버에서 할 것과 하지 말아야 할 것 581
- 기본 DMA 개념과 용어 550
- 18장 COM 소개 583
- 시작하기 전에 584
- UMDF 드라이버 구조체 584
- COM 개괄 586
- COM 오브젝트의 내용 587
- 오브젝트와 인터페이스 588
- IUnknown 589
- 참조 카운트 589
- AddRef와 Release의 가이드라인 590
- GUID 591
- VTables 592
- HRESULT 593
- 프로퍼티와 이벤트 594
- 액티브 템플릿 라이브러리 595
- 인터페이스 정의 언어 파일 595
- UMDF COM 오브젝트 사용법 597
- COM 오브젝트 사용을 시작하는 방법 597
- COM 오브젝트의 수명을 관리하는 법 600
- DLL 인프라 구현법 600
- DllMain 601
- DllGetClassObject 602
- 클래스 팩토리 603
- UMDF 콜백 오브젝트 구현법 607
- COM 오브젝트 클래스를 구현하는 방법 607
- IUnknown을 구현하는 방법 608
- UMDF 콜백 오브젝트를 구현하는 방법 612
- 5부 _ WDF 드라이버 빌드와 설치, 테스트
- 19장 WDF 드라이버 빌드 617
- 드라이버 빌드 시 일반적인 고려 사항 618
- UMDF 드라이버 빌드 고려 사항 618
- KMDF 드라이버 빌드 고려 사항 619
- 드라이버 빌드 소개 619
- 빌드 환경 619
- 빌드 유틸리티 지원 파일 620
- 프로젝트 빌드 방법 623
- UMDF 예제: Fx2_Driver 샘플 빌드 625
- Fx2_Driver의 Sources 파일 625
- Fx2_Driver의 Sources 파일에서 사용된 매크로 626
- Fx2_Driver의 Makefile과 Makefile.inc 629
- Fx2_Driver 빌드 방법 629
- KMDF 예제: Osrusbfx2 샘플 빌드 630
- Osrusbfx2 Sources 파일 630
- Osrusbfx2의 Sources 파일에서 사용된 매크로 631
- Osrusbfx2의 Makefile과 Makefile.inc 632
- Osrusbfx2 빌드 방법 634
- 드라이버 빌드 시 일반적인 고려 사항 618
- 20장 WDF 드라이버 설치 635
- 드라이버 설치 기본 636
- 드라이버 설치의 핵심 작업 636
- 설치 기술과 툴 636
- WDF 드라이버 설치 고려 사항 637
- WDF 버전 관리와 드라이버 설치 637
- 드라이버가 프레임워크에 바인드되는 방법 639
- WDF 코 인스톨러 패키지 640
- WDF 드라이버 패키지 컴포넌트 642
- WDF 드라이버 패키지 용도의 INF 생성 방법 643
- 일반적으로 사용되는 INF 섹션 643
- INF 툴 644
- 다른 CPU 아키텍처를 위한 INF 644
- WDF 드라이버의 INF: 코 인스톨러 섹션 646
- WDF의 INF 예제 648
- UMDF 예제: Fx2_Driver INF 648
- KMDF 예제: Osrusbfx2 INF 651
- 드라이버 패키지 서명과 배포 방법 652
- 서명된 카탈로그 파일 653
- INF에서 카탈로그 파일을 지정하는 방법 654
- 부트 스타트 드라이버의 서명 방법 654
- 드라이버 패키지 배포 방법 654
- 드라이버 설치 방법 655
- 테스트 설치 시 고려 사항 655
- 릴리즈 설치 시 고려사항 656
- PnP 매니저를 사용한 드라이버 설치 방법 656
- DPInst나 DIFxApp를 사용한 드라이버 설치 방법 657
- 커스텀 설치 애플리케이션을 사용한 드라이버 설치 방법 658
- DevCon을 사용한 드라이버 설치 및 업데이트 방법 658
- 디바이스 매니저를 사용한 드라이버 업데이트 659
- 드라이버 제거 방법 659
- 드라이버 설치 절차 659
- 제거 동작 660
- WDF 드라이버 설치 문제 해결 방법 663
- 설치 에러 디버그를 위해 WinDbg를 사용하는 방법 663
- 드라이버 설치 에러 로그 663
- 일반적인 WDF 설치 에러 665
- PnP 매니저 에러 코드 665
- 드라이버 설치 기본 636
- 21장 WDF 드라이버 테스트 툴 667
- 드라이버 테스트 시작 668
- 테스트 시스템 선택하기 668
- WDF 드라이버 테스트 툴: 개요 669
- 프리패스트와 SDV에 관해 670
- 기타 드라이버 테스트 툴 670
- 드라이버 베리파이어 676
- 드라이버 베리파이어를 사용하는 시점 677
- 드라이버 베리파이어 동작 방식 677
- 드라이버 베리파이어의 동작 678
- 드라이버 베리파이어 예제 679
- 디버깅 동안 드라이버 베리파이어 정보 사용하기 684
- KMDF 베리파이어 686
- KMDF 베리파이어를 사용하는 시점 687
- KMDF 베리파이어 동작 방식 687
- KMDF 베리파이어 활성화 방법 688
- 디버깅 시 KMDF 베리파이어 정보 사용법 689
- UMDF 베리파이어 690
- UMDF 버그 체크 691
- UMDF 에러 리포트 692
- 애플리케이션 베리파이어 692
- 애플리케이션 베리파이어 동작 방식 693
- 애플리케이션 베리파이어를 통한 UMDF 드라이버 검증법 693
- WDF 드라이버를 테스트하는 최선의 프랙티스 694
- 드라이버 빌드에 대한 조언 694
- 툴을 잘 사용하기 위한 조언 695
- 드라이버 생명 주기 테스트를 위한 조언 695
- 드라이버 테스트 시작 668
- 22장 WDF 드라이버 디버깅 697
- WDF 디버깅 툴에 관해 698
- WinDbg 698
- 기타 툴 699
- WPP 트레이싱 699
- 디버깅 매크로와 루틴 699
- WinDbg 기본 699
- 체크드 버전과 프리 버전 700
- 사용자 인터페이스 700
- 디버거 명령 702
- 심볼과 소스 코드 702
- 디버거 익스텐션 704
- UMDF 디버깅 준비 706
- 드라이버 로드와 스타트업 코드 디버깅 활성화 방법 706
- UMDF 드라이버의 드라이버 로드와 스타트업 코드 디버깅 시작 방법 707
- 실행 중인 UMDF 드라이버 디버깅 시작 708
- UMDF 오브젝트와 참조 카운트 추적 709
- UMDF 드라이버 크래쉬 디버깅 710
- KMDF 디버깅 준비 711
- 테스트 컴퓨터의 커널 디버깅 활성화 711
- KMDF 디버깅 용도로 테스트 컴퓨터 준비하기 713
- KMDF 디버깅 세션 시작 714
- KMDF 드라이버 크래쉬 디버깅 시작 715
- UMDF 실습: Fx2_Driver 샘플 디버깅 716
- Fx2_Driver 디버그 준비 716
- Fx2_Driver 디버그 세션 시작 716
- Fx2_Driver의 OnDeviceAdd 콜백 루틴 조사 717
- 디바이스 콜백 오브젝트 조사를 위한 UMDF 디버거 익스텐션 719
- I/O 요청 조사를 위한 UMDF 디버거 익스텐션 사용 720
- KMDF 실습: Osrusbfx2 샘플 디버깅 721
- Osrusbfx2의 디버깅 세션 준비 721
- Osrusbfx2의 디버깅 세션 시작 722
- EvtDriverDeviceAdd 콜백 루틴 조사 722
- 디바이스 오브젝트 조사에 KMDF 디버거 익스텐션 사용 723
- I/O 요청 조사에 KMDF 디버거 익스텐션 사용 724
- WinDbg로 트레이스 메시지 보기 725
- WinDbg로 KMDF 로그 보기 727
- 버그 체크 이후의 로그 정보 획득 728
- KMDF 로그 내용 제어 729
- WinDbg 실습에 대한 몇 가지 제안 730
- WDF 디버깅 툴에 관해 698
- 23장 드라이버 프리패스트 731
- 프리패스트 소개 732
- 프리패스트 동작 원리 732
- 프리패스트가 탐지할 수 있는 것 733
- 프리패스트 사용법 734
- 프리패스트 분석 모드 지정 방법 734
- 프리패스트 실행 방법 735
- 프리패스트 예제 빌드하기 736
- 프리패스트 결과 표시 방법 737
- 프리패스트 결과 예제 742
- 프리패스트 결과를 향상시키는 코딩 프랙티스 748
- 노이즈의 일반적인 원인을 나타내는 경고와 이에 대해 해야 할 것 749
- Noise를 없애는 Pragma 경고 지시자 사용법 751
- 노이즈를 제거하는 주석 사용법 752
- 주석 사용법 753
- 주석이 프리패스트 결과를 향상시키는 방법 753
- 코드 내의 주석 위치 755
- 일반 용도의 주석 760
- 입출력 인자 주석 761
- 주석 변경자 764
- 버퍼 크기 주석 765
- 스트링 주석 771
- 예약된 인자 773
- 함수 반환 값 773
- 드라이버 주석 774
- 드라이버 기본 주석과 규약 777
- 조건 주석 779
- 함수 결과 주석 783
- 유형 일치 주석 784
- 포인터 주석 786
- 상수와 비상수 인자 주석 787
- 포맷 스트링 주석 788
- 진단 주석 788
- __try문에서 함수 주석 789
- 메모리 주석 790
- 비메모리 자원 주석 792
- 함수 유형 클래스 주석 799
- 부동 소수점 주석 801
- IRQL 주석 802
- DODEVICEINITIALIZING 주석 808
- 인터락드 피연산자에 대한 주석 808
- 주석 처리된 시스템 함수의 예제 809
- 주석 작성과 디버깅 812
- 테스트 케이스 주석 예제 812
- 테스트 케이스 주석 작성 팁 813
- 프리패스트 최고의 프랙티스 814
- 프리패스트를 사용하는 최고의 프랙티스 814
- 주석을 사용하는 최고의 프랙티스 815
- 예제: Osrusbfx2.h 주석 817
- 프리패스트 소개 732
- 24장 정적 드라이버 베리파이어 823
- SDV 소개 824
- SDV 작동 원리 825
- SDV 규칙에 관해 826
- SDV가 드라이버 코드에 규칙을 적용하는 방법 827
- SDV 용도에 맞는 KMDF 드라이버 소스 코드 주석 832
- KMDF 드라이버의 함수 역할 유형 선언 832
- 예제: 샘플 드라이버에서 함수 역할 유형 833
- SDV 실행 방법 834
- SDV를 위해 파일을 준비하고 규칙을 선택하는 방법 834
- 검증을 실행하는 방법 839
- SDV 실습 841
- SDV 보고를 보는 방법 842
- SDV 결함 뷰어 844
- 최선의 프랙티스: SDV 결과 검사 845
- SDV의 KMDF 규칙 847
- KMDF의 DDI 순서 규칙 847
- KMDF의 디바이스 초기화 규칙 848
- KMDF의 컨트롤 디바이스 클린업 규칙 848
- KMDF의 요청 완료 규칙 849
- KMDF의 요청 취소 규칙 850
- 요청 버퍼와 MDL, 메모리 규칙 851
- 전원 정책 소유자 DDI 규칙 853
- 예제: Fail_Driver3의 SDV 분석 연습 855
- Fail_Driver3 검증 준비 855
- Fail_Driver3 검증 방법 857
- Fail_Driver3의 결과를 보는 방법 859
관련 블로그 글
국내 첫 WDF 책이 출간되었습니다!
『WDF: 윈도우를 위한 차세대 통합 드라이버 개발 모델』
Penny Orwick, Guy Smith 외 지음 | 김점갑 최장욱 옮김
2008년 1월 7일 출간 | 936쪽 | 45,000원
Penny Orwick, Guy Smith 외 지음 | 김점갑 최장욱 옮김
2008년 1월 7일 출간 | 936쪽 | 45,000원
차세대 통합 드라이버 모델, 윈도우 드라이버 파운데이션 WDF!
윈도우 드라이버 개발에 필요한 심층적이고도 전문적인 가이드북
『WDF: 윈도우를 위한 차세대 통합 드라이버 개발 모델』이 오늘 출간되었습니다. WDF 책으로서는 국내 첫 책인 셈이지요? 좀 유치하게 보일지 몰라도 아무래도 "첫"이라는 말만큼 설레는 단어도 없는 것 같긴 합니다.
마이크로소프트 WDF 개발팀이 직접 저술하고 안철수 연구소 기반기술팀 김점갑 팀장님과 최장욱님이 옮기신 이 책에서는 WDF에 관한 최고의 프랙티스와 기법을 갖춘 지침을 얻을 수 있으며, 광범위한 코드 샘플을 통해 차세대 드라이버 모델의 난해함을 극복하고 드라이버 개발을 단순화하는 방법을 배울 수 있습니다.
● WDF을 사용한 커널 모드나 유저 모드 드라이버 개발
● 최소의 코드로서 플러그앤플레이와 전원 관리 지원이 가능한 드라이버 개발
● 견고한 I/O 핸들링 코드 구현
● 동기화와 병행성의 효과적인 관리
● 프로토콜과 시리얼 버스 기반의 디바이스에 대한 유저 모드 드라이버 개발
● USB 디바이스를 신속하게 개발하기 위한 프레임워크의 USB 기능 사용하기
● DMA 디바이스를 위한 커널 모드 드라이버 설계와 구현
● 소스 코드 분석과 정적 검증 툴을 이용한 드라이버 평가
● 드라이버 테스트와 디버그, 설치에 적용할 최고의 프랙티스 기법
출간 기념 뽀나스 하나. 오늘 받은 월간 마이크로소프트에 나온 에이콘 책 광고 사진입니다. 여기서 잠깐, 돌발 퀴즈 나갑니다. 마소 편집장님과 기자분들을 궁금하게 했다는 그 문제인데요.
에이콘에서 새로 나온 보안 책은
□□□□합니다.
□□□□합니다.
크리에이티브 커먼즈 라이센스 이 저작물은 크리에이티브 커먼즈 코리아 저작자표시 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.