디바이스 드라이버

1. 디바이스 드라이버

1) 사용될 유형에 의한 분류

- 오디오 디바이스 드라이버

- 배터리 디바이스 드라이버

- 블루투스 디바이스 드라이버

- 디스플레이 디바이스 드라이버

- HID 디바이스 드라이버

- 이미징 디바이스 드라이버

- 파일 시스템 디바이스 드라이버

- 네트워크 디바이스 드라이버

- 프린터 디바이스 드라이버

- 센서 디바이스 드라이버

- 스마트카드 리더 디바이스 드라이버

- 스토리지 디바이스 드라이버

- 버스 디바이스 드라이버

- 포트 디바이스 드라이버

- 적외선 디바이스 드라이버


2) 환경에 따른 분류

- PNP 드라이버: 플러그 앤 플레이(PNP, Plug and Play) 환경을 사용하는 경우

- 레거시 드라이버: PNP 환경을 사용하지 않는 경우


2. 레거시 드라이버(Legacy Driver)

1) 레거시 드라이버의 의미

-  실제 하드웨어가 존재하지 않는 상황에서 가상의 하드웨어를 하나 만든뒤 이를 위한 드라이버를 만드는데 사용(PNP 드라이버)

- 커널레벨 에서 동작하는 코드를 얻는 드라이버를 만드는데 사용(PNP 관리자와 Power 관리자의 영향력에서 벗어나는 드라이버)

(응용 프로그램 혹은 서비스 프로그램이 원할 때 메모리에서 상주하거나 메모리에서 제거되는 목적으로 사용)


2) 레거시 드라이버를 작성하는데 개발자가 준비해야되는 함수

- DriverEntry: 드라이버가 메모리에 상주할 때 호출되는 함수

- DriverUnload: 드라이버가 메모리에서 해제될 때 호출되는 콜백함수

- IRP Dispatch: 외부에서 드라이버로 전달되는 명령어를 받아 들이는 진입점 함수


3. PNP 드라이버

1) PNP 드라이버의 의미

- 윈도우가 운영하는 PNP 관리자, Power 관리자와 함께 운용될 드라이버를 의미


2) PNP 드라이버를 작성하는데 개발자가 준비해야되는 함수

- DriverEntry, DriverUnload, IRP Dispatch: 레거시 드라이버와 동일

- AddDevice: 

디바이스 스택(발견된 하드웨어를 여러 PNP 드라이버들이 효과적으로 운영하기 위해 만든 자료구조)이 구성되면 호출되는 콜백함수, 

디바이스 스택에 동참할 디바이스 오브젝트를 만들어서 디바이스 스택에 올려놓는 역할을 수행, 

드라이버가 관여할 하드웨어가 발견되었다는 의미로 호출 

- IRP_MJ_PNP: 

PNP 관리자가 전달하는 IRP를 처리하는 콜백함수

PNP 관리자는 여러가지 플러그 앤 플레이와 관련된 사건들이 발생할 때마다 IRP에  담아서 드라이버에게 전달함

- IRP_MJ_POWER:

POWER 관리자가 전달하는 IRP를 처리하는 콜백함수

POWER 관리자는 전력공급과 관련된 사건들이 발생할 때마다 IRP에 담아서 드라이버에게 전달함


4. WDK(Windows Driver Kits)의 설치

- 이전에는 DDK(Driver Development Kits)이라는 이름으로 공급, 현재는 WDK라는 이름으로 변경되어 공급

- WDK 7버전까지는 컴파일러가 함께 포함되었으나 현재는 컴파일러를 포함하지 않음, 별도의 컴파일 환경을 구축해야 함


5. 가장 간단한 드라이버 코드 작성 방법

1) 헤더파일 선언

2) 함수 구현

3) 드라이버 빌드

4) 드라이버 설치


6. HelloWorldDriver 코드 생성

1) C 스타일로 HelloWorldDriver 코드 생성