1. visual studio 2019 communication 다운로드
- 반드시 visual c++이 설치되어야 한다.
2. WDK 10 다운로드
- https://developer.microsoft.com/ko-kr/windows/hardware/windows-driver-kit
- 윈도우 드라이버 킷(windows Driver Kit, WDK 10)
- 드라이버를 빌드하는데 사용하는 부가적인 헤더파일, 라이브러리, 샘플 드라이버, 커널디버거(WinDBG)를 제공함
- 반드시 VS2019가 다운로드 된 후에 설치해야함.
3. 디버그 메시지 출력기 다운로드
- https://technet.microsoft.com/en-us/sysinternals/debugview.aspx
- 커널디버거를 사용할 필요 없이, 간단하게 내가 작성한 드라이버가 정확히 동작하고 있는지를 확인하기 위해서
디버거 메세지를 코드상에 삽입을 하고, 그 삽입한 문장을 통해 출력되는 디버그 메세지를 사용자가 눈으로 확인할 때 필요한 툴
- MS의 DBGVIEW 설치
?? 드라이버 코드는 어떻게 작성하나요?(커널레벨 드라이버)
1) 헤더 파일 선언
#include <ntddk.h>
// NT Legacy Style 드라이버(디바이스 스택을 사용하지 않는 드라이버를 개발하려는 경우)
// 커널레벨에서 동작하는 어플리케이션?
#include <wdm.h>
// WDM Style 드라이버(윈도우즈 디바이스 스택을 사용하는 드라이버를 작성하려는 경우)
// 보다 세련된, 실제로 하드웨어와 연동되는 드라이버를 제작하는 경우 주로 포함
2) 함수 구현
#C STYLE
NTSTATUS DriveEntry( // 드라이버코드 시작(main)
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath
)
{
UNREFERENCED_PARAMETER(DriverObject);
UNREFERENCED_PARAMETER(RegistryPath);
// 전달받은 파라미터를 소스내에서 사용하지 않음 : 컴파일 에러
// 사용하지 않는 파라미터를 매크로 코드에 넣음
DbgPrintEx(DPFLTR_IHVDRIVER_ID, 0, "Hello World\n");
// 디버그메시지(Hello World)를 DBGView 프로그램으로 출력
return STATUS_UNSUCCESSFUL;
// 드라이버가 메모리에 상주하지 않도록 설정
// 드라이버가 메모리에 올라갔다가, 에러값으로 인해 메모리에서 내려옴(의도된 바)
}
#C++ STYLE
extern "C" NTSTATUS DriveEntry(
// extern "C" : c++언어의 맹글링(mangling)을 피하기 위해 반드시 사용해야함, C처럼 사용하겠다 라는 뜻
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath
)
{
return STATUS_UNSUCCESSFUL;
}
**DriveEntry 함수 이름은 정해진 이름이기 때문에 컴파일이후에도 같은 이름의 함수로 만들어져야함.
(그렇지 않으면, c++ 언어는 함수의 이름을 바꿔버림)
3) 드라이버 빌드
- "Empty WDM Driver" 템플릿을 선택
* 간단한 드라이버는 NT Legacy Style을 사용하지만, VS가 특별히 이런 사항을 구분하지 않기 때문
>> NT Legacy Style 템플릿이 없음(vs2015기준) / 나중에 속성, 세부정보를 NT Legacy style에서만 필요로 하는 내용이 되도록 수정을 해야함
- 속성값 변경
가) Target OS Version을 Windows 7로 변경 : Windows는 하휘호환성 특징을 가지기 때문
나) 프로젝트 솔루션탐색기 항목을 수정 : .inf 파일 제거
*NT Legacy System : 설치파일이 필요X, 서비스 형식으로 로딩해서 쓰는 드라이버
- 새로운 소스파일 작성
4) 드라이버 설치
'고흐의 연구실 > OS' 카테고리의 다른 글
정적파일의 바이너리 값 가져오기(정적파일 hex값) ------ (0) | 2020.11.14 |
---|---|
다른 프로세스의 Baseaddress 가져오기 (0) | 2020.11.14 |
[만들면서 배우는 OS(32bit)] 부트스트랩 (0) | 2020.10.13 |
[만들면서 배우는 OS(32bit)] 개발환경구성 NASM, Rawrite (0) | 2020.10.13 |