본문 바로가기
정리/Device Driver

1. 디바이스 드라이버란

by 스꼬맹이브로 2022. 8. 9.
728x90
반응형
SMALL

https://www.youtube.com/watch?v=jsXHLMDIokM&t=273s 

 

  • 디바이스 드라이버
    = 디바이스 혹은 하드웨어 구동기
  • 서비스프로그램(NT서비스프로그램)
    = 로그온 사용자(Session)의 로그아웃(Log out)과 무관하게 윈도우 시스템에서 계속 동작할 수 있는 프로그램
    = 일반적인 응용프로그램과 달리 GUI(Graphic User Interface)를 사용할 수 없음

디바이스 드라이버는 서비스프로그램과 같은 형태로 관리

즉, 부팅과 정중에 윈도우 시스템에 자동으로 상주할 수도 있고 언제든지 메모리에서 제거될 수 있음

로그온 사용자(Session)와 무관하게 계속 동작 가능

 

- 서비스프로그램과 시스템 레지스트리

  • Services 밑 이름들이 서비스 이름
  • imagePath : 드라이버 파일 위치
  • type : 드라이버서비스(1의 값은 커널에서 사용되는 디바이스드라이버임을 나타냄)
  • Start : 부팅 시 중요순위 (0부터 드라이버에 올림)

 

- 드라이버의 이중역할(Dual Role)

  1. 응용프로그램에세 서비스를 제공하는 역할
    - 응용프로그램은 드라이버를 통해서만 디바이스를 인식
    - 엉뚱한 디바이스를 사용하는 것을 응용프로그램은 알 수 없음
  2. 디바이스 드라이버가 하드웨어를 동작시켜 원하는 결과를 얻어내는 역할

 

- 드라이버 개발 시 필요한 툴

  • 빌드(Build)하기 위한 빌드환경 : 컴파일러, 링커, 헤더파일, 라이브러리, 도움말파일
    * 마이크로소프트 사이트를 통해 무료 또는 유료로 공급
  • 드라이버의 동작을 실시간으로 확인하기 위한 디버깅환경 : 디버그메세지 출력기, 커널 디버거 등
    * 마이크로소프트 사이트를 통해 무료로 공금
  1. Visual Studio - 디스크공간이 많이 필요하며 반드시 비쥬얼C++환경이 포함되어 설치되어야 함
  2. WDK 10 - 드라이버를 빌드하는데 사용하는 헤더, 라이브러리, 샘플, 커널디버거를 제공
    * 반드시 비쥬얼 스튜디오를 먼저 설치해야함
  3. 디버그 메시지 출력기 : 대표적으로 DBGVIEW가 있음

 

- 가장 간단한 드라이버 코드 작성 방

 

1. 헤더파일 선언

  • #include <ntddk.h> // NT Legacy Style - 디바이스 스택을 사용하지 않는 드라이버/간단한 드라이버
  • #include <wdm.h> // WDM Style - 디바이스 스택을 사용하는 드라이버

2. 함수 구현

*C Style*
// 드라이버코드가 시작되는 곳
// IN은 컴파일에는 참여하지 않음, 드라이버 작성자에게 도움주는 역할
NTSTATUS DriverEntry(
//DriverObject, RegistryPath  = 운영체제가 드라이버에 대한 설명과 레지스트리 설치 위치를 알려줌
	IN PDRIVER_OBJECT DriverObject,	 
	IN PUNICODE_STRING RegistryPath  
)
{
	return STATUS_UNSUCCESSFUL; //드라이버가 메모리에 상주하지 않도록 설정
}

*C++ Style*
// C++ 언어의 맹글링(mangling)을 피하기 위해서 반드시 사용해야 함
extern "C" NTSTATUS DriverEntry(
//DriverObject, RegistryPath  = 운영체제가 드라이버에 대한 설명과 레지스트리 설치 위치를 알려줌
	IN PDRIVER_OBJECT DriverObject,	 
	IN PUNICODE_STRING RegistryPath  
)
{
	return STATUS_UNSUCCESSFUL; //드라이버가 메모리에 상주하지 않도록 설정
}

[주의!] DriverEntry 함수 이름은 정해진 이름이므로 컴파일 이후에도 같은 이름의 함수로 만들어져야함


3. 드라이버 빌드

* UNREFERENCED_PARAMETER() : 사용하지 않는 오브젝트가 있을 시 발생하는 오류를 막아주는 매크로

* 32비트 환경에서는 "x86", 64비트 환경에서는 "x64" 를 선택

 

4. 드라이버 설치

- 드라이버는 서비스 프로그램과 같은 방식으로 관리

- 윈도우는 서비스 프로그램을 다루기 쉽도록 command 프롬프트 상에서 "SC.EXE" 프로그램을 지원

command 대표적 종류 5가지

  • create : 서비스를 생성하는 명령어
  • query : 서비스 상태를 확인하는 명령어
  • start : 서비스를 실행하는 명령어 - 드라이버가 메모리에 상주
  • stop : 서비스의 동작을 멈추는 명령어 - 드라이버가 메모리에서 제거
  • delete : 서비스를 제거하는 명령어

* 64비트에서는 인증서명이 있어야 사용할 수 있음

 

5. 디버그 메세지 확인(DBGVIEW)

DBGVIEW 프로그램을 사용해서 드라이버가 메모리에 상주하는 상황을 확인할 수 있음

 

 

 

728x90
반응형
LIST