본문 바로가기
정상을향해/OS·Kernel Driver·Rootkit

1. 윈도우 디바이스 드라이버(Windows Device Driver)

by 사이테일 2014. 12. 16.


윈도우 디바이스 드라이버(Windows Device Driver)를 개발하기 위한 환경을 구축하기에 앞서 몇몇 용어를 정리하는 것이 필요하다.

개발에 필요한 도구와 관련되어 언급되는 용어에 대해 정리해보자.


윈도우의 디바이스 드라이버 모델은 여러가지가 있다.

즉, 디바이스 드라이버 제작 방법과 사용환경에 따라 여러가지 형태를 지원하고 있다.

예를 들어, 네트워크 디바이스 드라이버 개발자는 WDM(Windows Driver Model)보다는 NDIS(Network Driver Interface Specification) 드라이버 개발 방법을 공부해야 한다.

멀티미디어를 위한 Direct Show 필터 드라이버를 개발하려는 경우에는 WDM Kernel Stream Driver를 개발하는 방법을 습득해야 한다.

이와 같이 다양한 형태의 드라이버를 개발할 수 있도록, 마이크로소프트는 샘플 드라이버들의 소스 파일과 도움말이 포함된 DDK를 제공한다.


DDK (Device Driver Development Kit)

윈도우 디바이스 드라이버를 개발하기 위해 필수적인 툴로, 드라이버 개발에 필요한 컴파일러를 포함하고 있다.

(단, Windows 98 DDK와 2000 DDK는 컴파일러를 포함하지 않고 있다.)

DDK는 Windows 버전마다 출시가 되고, Windows Vista(6000), Windows Server 2008(6001)부터는 WDK로 명칭이 통일되었다.


WDK (Windows Driver Kit)

WDK는 앞서 언급한 것처럼 Windows Vista 이후에 출시되었다.

WDK는 드라이버를 개발, 빌드, 패키징, 베포, 테스트 및 디버그하는 데 필요한 도구를 제공한다.

WDF(Windows Driver Frameworks), USB(범용 직렬 버스), 인쇄, 네트워킹 및 파일 시스템 필터를 비롯한 여러 기술 및 드라이버 모델용 템플릿이 포함되어 있다.

http://msdn.microsoft.com/library/windows/hardware/ff557573


WLK (Windows Logo Kit)

윈도우 로고 인증을 위한 테스트 툴이다.

만약 윈도우 로고 인증을 받고자 한다면, WLK를 설치해 테스트 결과를 통해 윈도우 로고 프로그램을 진행하면 된다.

http://msdn.microsoft.com/ko-kr/library/windows/hardware/dn641155.aspx


WDF (Windows Driver Foundation)

마이크로소프트는 WDM(Windows Driver Model) 형태로 드라이버를 개발하면서 겪는 여러가지 어려운 점을 고려하여 WDF(Windows Driver Foundation)라는 새로운 개발 방식을 선보이게 되었다.

이를 통해 개발자가 기존의 WDM 방식을 사용했을 때 코딩하는데 고생했던 PNP, POWER, WMI와 관련된 문제로부터 자유롭도록 지원하고 있다.


I/O 관리자는 드라이버(WDM)를 커널 레벨에서 관리하기 위해서 드라이버가 가져야 하는 필수 루틴들을 구현해야 한다.

 - DriverEntry Routine : 드라이버가 메모리에 로딩되는 시기에 호출됨

 - AddDevice Routine : 드라이버가 관여해야 하는 디바이스 스택이 형성되는 경우에 호출됨

 - PnP IRP Dispatch Routine : PnP 관리자에서 디바이스 스택으로 전달하는 IRP를 다루는 핸들러

 - POWER IRP Dispatch Routine : Power 관리자에서 디바이스 스택으로 전달하는 IRP를 다루는 핸들러

 - 그 밖에 WMI 명령을 다루는 루틴 등


이와 같은 루틴들은 WDM 디바이스 드라이버를 작성하는 개발자들에게는 부담스러운 작업이다.

WDM 디바이스 드라이버 소스에서 무수히 많이 나오는 DEVICE_OBJECT, IRP 등과 같은 자료구조는 C++에서 사용되는 객체(OBJECT)와 비슷하게 사용하는 구조체로 보인다.

하지만 실상 DDK에서 제공하는 함수들은 이것들을 객체가 아닌 단순한 핸들(HANDLE) 정도의 개념으로 사용하는 것이 현실이다.


이러한 문제들 때문에 마이크로소프트는 WDF(Windows Driver Foundation)라는 새로운 드라이버 개발 방식을 선보이게 되었다.

WDF는 커널모드에서 동작하는 KMDF(Kernel Mode Driver Frameworks)와 유저모드에서 동작하는 UMDF(User Mode Driver Frameworks)를 제공한다.


KMDF는 기존의 WDM과 크게 다르지 않은 환경을 제공한다.

대신 WDM 디바이스 드라이버 작성자들이 그동안 사용해오던 DDK가 요구하는 자료구조를 더이상 사용하지 않는다.

그러나 KMDF로 제작된 다바이스 드라이버는 결국 외형적으로는 WDM 형식으로 작성된 디바이스 드라이버와 크게 다르지 않다.


UMDF는 유저모드에서 동작하는 디바이스 드라이버다.

하드웨어 인터럽트를 처리해야하는 종류의 실시간성을 요구하는 드라이버 개발자들은 KMDF 형태로 드라이버를 만들어야 하지만, USB 버스, 1394 버스와 같은 환경에서 동작하는 클라이언트 드라이버들은 실제 하드웨어에 직접 접근하는 코드가 없으므로 UMDF 형태로 드라이버를 개발할 수 있다.

UMDF는 COM(Component Object Model) 인터페이스를 지원하도록 작성된다는 것이 큰 특징이다.