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)
- 응용프로그램에세 서비스를 제공하는 역할
- 응용프로그램은 드라이버를 통해서만 디바이스를 인식
- 엉뚱한 디바이스를 사용하는 것을 응용프로그램은 알 수 없음 - 디바이스 드라이버가 하드웨어를 동작시켜 원하는 결과를 얻어내는 역할
- 드라이버 개발 시 필요한 툴
- 빌드(Build)하기 위한 빌드환경 : 컴파일러, 링커, 헤더파일, 라이브러리, 도움말파일
* 마이크로소프트 사이트를 통해 무료 또는 유료로 공급 - 드라이버의 동작을 실시간으로 확인하기 위한 디버깅환경 : 디버그메세지 출력기, 커널 디버거 등
* 마이크로소프트 사이트를 통해 무료로 공금
- Visual Studio - 디스크공간이 많이 필요하며 반드시 비쥬얼C++환경이 포함되어 설치되어야 함
- WDK 10 - 드라이버를 빌드하는데 사용하는 헤더, 라이브러리, 샘플, 커널디버거를 제공
* 반드시 비쥬얼 스튜디오를 먼저 설치해야함 - 디버그 메시지 출력기 : 대표적으로 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