Windows Driver Model은 윈도우즈에서 사용되는 디바이스 드라이버를 설계하는 하나의 방법이다.
Win32 응용프로그램이 디바이스드라이버를 사용하는 방식을 쉽게 규정하고, 디바이스드라이버를 개발하는 개발자들 또한, 규정된 드라이버개발방식을 따름으로써, 다양한 디바이스드라이버 개발에 서로 상이한 부분을 최소화 하도록 지원하는 개발방식을 의미한다. 또한 Win98/Me와 Win2000/XP용 드라이버를 따로 개발할 필요가 없이 두 OS를 지원하는 이점도 있다.
그러나 WDM개발방식을 윈도우즈가 지원한다고 해서, 모든 디바이스드라이버를 WDM방식으로 만들 수 있는 것은 아니다. Windows 9x계열의 운영체제에서는, 대부분의 디바이스드라이버를 WDM방식으로 개발할 수 없으며, 몇몇 디바이스드라이버만 WDM을 지원받을 수 있다. Windows 2000계열의 운영체제에서는, 대부분의 디바이스드라이버를 WDM방식으로 개발할 수 있으나, 역시 그렇지 못한 드라이버도 있다.
반면에 USB버스, 1394버스 등을 지원하는 버스 드라이버는 WDM 방식으로 작성되어 있기 때문에, 디바이스 드라이버 또한 반드시 WDM으로 작성해야만 버스 드라이버를 사용할 수 있다.
드라이버는 시작과 동시에 운영시스템 커널의 일부가 되는 소프트웨어의 한 부분이다. 드라이버는 하나 이상의 사용 가능한 디바이스를 유저모드 프로그램에 제공하며, 각각의 디바이스는 실제 혹은 논리적인 하드웨어를 나타내게 된다.
윈도우즈에서 드라이버는 언제나 디바이스를 파일처럼 보이도록 한다. 때문에 Win32 프로그래머는 파일 API로 디바이스를 접근한다. CreateFile() 로 디바이스의 핸들을 얻으며, CloseHandle()로 핸들을 닫기 전까지 ReadFile(), WriteFile() 등의 함수를 사용하여 드라이버에 읽기/쓰기를 요청한다.
또 DeviceIoControl()을 사용하여 데이터를 드라이버로 전송한다거나 데이터를 읽어 들이는 특별한 종류의 요구를 한 번의 호출로 해결할 수 있다. 미리 정의된 이런 특별한 종류의 IOCTL 코드들이 있기는 하지만, 사용자의 드라이버에 대해서는 따로 만들 수 있다.
윈도우즈 2000, XP계역의 응용프로그램들은 실제로 WDM과 통신하는 것이 아니라, 윈도우즈커널모듈인 IoManager와 통신한다.
1.1.1 Windows Driver Model의 특징
Windows Driver Model은 NT4에서 사용되는 디바이스 드라이버 모델에 기반하고 있으며 Windows 2000의 새로운 성격인 Plug and Play, Power Management, Windows Management Instrumentation을 지원하며 이에 대한 표준을 제공한다. 즉, Windows Driver Model은 디바이스 드라이버의 설치와 시동, 사용자 요청에 제공해야 하는 서비스와 하드웨어와의 통신 등을 규정한다. WDM 디바이스 드라이버는 플러그 앤 플레이 시스템에 적합하게 설계되어 사용자가 디바이스를 플러그 인 할 때, 소프트웨어적으로 구성되도록 지원해야 한다.
1.1.2 마이크로소프트에서 버스와 클래스 드라이버를 지원함
하나의 큰 특징은 마이크로소프트가 버스와 클래스 드라이버를 공통적인 형태의 디바이스에 대해 제공한다는 것이다. 마이크로소프트는 많은 형태의 디바이스들에 대해 필요한 기본적인 기능성을 수행하는 일련의 시스템 드라이버를 제공한다. USB, SCSI, 1394와 같은 형태의 버스 디바이스들, 오디오 포트 디바이스 외에, HID(Human Input Devices)와 같은 표준 윈도우즈 기능과 커널 스트림을 제공한다. 또 STI(Still Image Architecture)는 정지 영상, 스캐너 등을 처리할 골격을 제공한다.
이들 시스템 드라이버들은 특정한 형태의 디바이스 드라이버 제작을 무척 간단하게 만들 수 있다. 예로 USB 시스템 드라이버는 이 버스의 하위 레벨에서 이루어지는 모든 통신을 처리한다. 다시 말해, 인터페이스가 다른 드라이버들에 대해 제공될 수 있는 것이다. 이는 USB버스에 요구를 제공하는 것을 상당히 간단하게 만들 수 있다.
1.1.3 소스와 이진 호환성
Windows Driver Model은 모든 윈도우즈 플랫폼에서 소스 호환성을 가진다. 또한 Win98과 Win2000에서 이진 호환이 가능하다. 그렇지 못한 경우도 있지만 많은 경우에 두 OS에 같은 WDM 드라이버가 사용되는 것이 가능하다.
1.1.4 계층화
새로운 드라이버를 설계하는 것은 어떤 일반 드라이버를 사용할 수 있는가를 명시하는 것으로부터 출발하는 경우가 많다. 이처럼 WDM에서는 계층화된 드라이버 스택이 가장 큰 특징이라 할 수 있다. 드라이버 개발에 있어서 내 드라이버가 어디에 속하는지가 (내 드라이버 위에 뭐가 있고 내 드라이버 밑에 뭐가 있는지) 굉장히 중요하다. 각 드라이버의 최상위에 계층화된 스택은 사용자의 요청을 단계별로 수행한다. 하위 버스 드라이버는 모든 기본적인 하드웨어와의 통신을 처리할 수 있다. 중간 단계의 클래스 드라이버는 모든 종류의 디바이스에 대해 공통적인 기능을 제공할 수 있다. 이 디바이스 드라이버 계층화는 차후에도 여러 가지 예로 자주 언급할 것이다.
Windows Driver Model에서 각 하드웨어 디바이스는 적어도 두 개의 디바이스 드라이버를 가진다. 그 중 하나는 디바이스의 메인 드라이버로 우리가 ‘Function Driver’ 라고 부르는 평소 디바이스 드라이버라고 생각해 왔던 것이다. 그것은 어떻게 하드웨어가 작업하는지에 대한 세부적인 모든 것을 가지고 있다. 그리고 이러한 I/O오퍼레이션을 초기화 할 의무가 있다. 또 ‘Function Driver’에게는 끝마쳐질 때 발생하는 인터럽트들을 처리할 책임과 엔드 유저가 어떻게 디바이스를 제어하든지 간에 적합한 방법을 제공해야 할 의무가 있다. 두개의 드라이버들 중 다른 하나는 ‘Bus Driver'이다. 이 드라이버는 하드웨어와 컴퓨터간의 연결을 관리하는 물리적 드라이버('Physical Driver')이다. 예를 들면, PCI 버스를 위한 버스 드라이버는 여러분의 메인보드에 PCI카드가 PCI 슬롯에 꽂혀 있는가를 실제로 탐지하고 그 카드의 I/O처리와 메모리 맵핑된 커넥션을 위해 필요한 것이 무엇인지를 결정하는 소프트웨어 구성 요소이다. 버스 드라이버는 또한 이 카드 슬롯을 on/off하기 위한 전기적 흐름을 바꾸는 소프트웨어이기도 하다.
어떤 디바이스는 이 두개의 드라이버 외에 Function Driver 위아래로 다른 드라이버가 존재하기도 한다. 이러한 드라이버를 일반적으로 'Filter Driver'라고 한다. Function Driver의 위에 존재하는 필터 드라이버를 상위 필터드라이버('Upper Filter')라고 하며 이미 존재하는 Function Driver의 행동을 수정하기 위해 사용된다. 상위 필터드라이버는 Function Driver 보다 먼저 IRP(I/O Request Packet)를 접한다. 그리고 그 Function Driver가 알지 못하는 추가적 특성을 지원할 기회를 가진다. 그러므로 상위 필터드라이버가 들어감으로써 Function Driver의 기능에 날개를 달수 있을 것이다. 반대로 Function Driver 아래로 들어가는 하위 필터드라이버('Lower Filter')는 버스 드라이버에게 Function Driver가 보내려고 하는 IRP를 수정할 수 있다. 예로 USB에 장착되어질 경우 하위 필터드라이버는 Function Driver가 수행하려는 버스 오퍼레이션의 스트림을 수정 할 수 있다.
“참고문헌”
"Windows NT Device Driver Development"
New Riders Publishing, Peter Viscarola, W. Anthony Mason, Anthony W. Mason
"Developing Windows NT Device Drivers: A Programmer's Handbook"
Addison-Wesley Pub Co, Edward N. Dekker, Joseph M. Newcomer
"The Windows 2000 Device Driver Book: A Guide for Programmers"
Prentice Hall PTR, Jerry Lozano, Art Baker
"Writing Windows WDM Device Drivers: Covers Nt 4, Win 98, and Win 2000"
CMP Books, Chris Cant
"Programming the Microsoft Windows Driver Model"
Microsoft Press,Walter Oney
"Undocumented Windows NT"
John Wiley & Sons, Prasad Dabak, Sandeep Phadke, Milind Borate
"Inside Microsoft Windows 2000"
Microsoft Press, David A. Solomon, Mark Russinovich
"Undocumented Windows 2000 Secrets: A Programmer's Cookbook"
Addison-Wesley Pub Co, Sven B. Schreiber
"Windows NT/2000 Native API Reference"
Que, Gary Nebbett
"Windows 2000 Kernel Debugging"
Prentice Hall, Steven McDowell
"Inside the Windows Nt File System"
Microsoft Press, Helen Custer
"Windows NT File System Internals : A Developer's Guide"
O'Reilly & Associates, Stan Mitchell
"Using for 80486"
Ohmsha, W. B. Surujanto
"Intel Pentium Processor Manual"
Intel
"80386 Technical Reference"
Brady Book, Edmund Strauss
“마이크로 소프트웨어 94년 7월 "보호모드 프로그래밍 그 이론과 실제"