윈도우 드라이버 빌드 및 컴파일 완벽 가이드입니다. 2026년 최신 환경인 Visual Studio와 WDK 설치부터 KMDF Hello World 코드 작성, 가상 머신(VM)을 이용한 안전한 배포, 그리고 WinDbg를 활용한 디버깅 및 블루스크린 해결법까지 드라이버 개발의 전 과정을 다룹니다.
목차
- I. 개발 환경 구축: 2026년 최신 툴셋 호환성 가이드
- II. 실전: 윈도우 드라이버 빌드 및 컴파일 (Core Section)
- III. 배포 및 테스트: VM을 활용한 안전한 로드
- IV. WinDbg 디버깅 기초: 커널의 속을 들여다보다
- V. 트러블슈팅: 자주 겪는 드라이버 에러 해결법
- VI. 결론 및 마무리
- 자주 묻는 질문 (FAQ)
안녕하세요! 윈도우 시스템의 가장 깊은 곳, 커널(Kernel) 세계에 오신 것을 환영합니다.
여러분은 평소 사용하는 프로그램들이 어떻게 하드웨어를 제어하는지 궁금한 적 없으신가요? 일반적인 애플리케이션(User Mode)은 운영체제의 보호 아래 안전하게 실행되지만, 드라이버(Kernel Mode)는 시스템의 심장부인 하드웨어와 직접 대화합니다. 그래서 드라이버 개발은 권한이 막강한 만큼, 실수 하나가 컴퓨터 전체를 멈추게 하는 ‘블루스크린(BSOD)’을 유발할 수도 있습니다.
많은 개발자분들이 “드라이버 개발을 배워보고 싶다”라고 생각하지만, 정작 코드를 한 줄도 짜기 전에 포기하곤 합니다. 그 이유는 복잡한 개발 환경 설정 때문입니다. 하지만 걱정하지 마세요. 성공적인 드라이버 개발의 시작은 올바른 윈도우 드라이버 빌드 및 컴파일 환경을 구축하는 것에서부터 시작됩니다.
오늘은 2026년 2월 기준, 가장 최신의 도구들을 활용해 누구나 따라 할 수 있는 가이드를 준비했습니다. 이 글 하나면 여러분도 직접 .sys 파일을 만들고, 가상 머신에서 실행하며, WinDbg로 내부를 들여다보는 능력을 갖추게 될 것입니다.
I. 개발 환경 구축: 2026년 최신 툴셋 호환성 가이드
드라이버 개발의 7할은 환경 설정이라고 해도 과언이 아닙니다. 특히 Visual Studio와 WDK(Windows Driver Kit)의 버전이 맞지 않으면 시작조차 할 수 없습니다. 2026년 현재, 윈도우 11과 12를 모두 지원하는 가장 안전하고 확실한 설치 방법을 알려드립니다.
1. 설치 순서의 중요성 (반드시 지켜주세요)
많은 분들이 무작정 설치하다가 재설치만 반복하곤 합니다. 다음 순서를 꼭 지켜야 합니다.
- Visual Studio 2022 또는 2025 설치
- Windows SDK (Software Development Kit) 설치
- WDK (Windows Driver Kit) 설치
2. Visual Studio 설정의 핵심: Spectre 라이브러리
Visual Studio를 설치할 때 ‘C++를 사용한 데스크톱 개발(Desktop development with C++)’ 워크로드를 선택하는 것은 기본입니다. 하지만 여기서 가장 중요한 포인트가 하나 더 있습니다.
- 설치 팁: 설치 관리자의 ‘개별 구성 요소(Individual components)’ 탭에서 검색창에 Spectre를 입력하세요.
- 체크 항목:
MSVC v143 - VS 2022 C++ x64/x86 Spectre-mitigated libs(버전에 맞게 선택)
이 항목을 체크하지 않으면 빌드 과정에서 수많은 링크 에러가 발생합니다. 드라이버는 보안이 생명이므로, 마이크로소프트는 Spectre 보안 취약점이 완화된 라이브러리 사용을 강제하고 있기 때문입니다.
3. WDK 설치: 2026년의 새로운 표준, NuGet
과거에는 별도의 설치 파일을 다운로드했지만, 이제는 NuGet 패키지 관리자를 통한 설치가 훨씬 간편하고 관리하기도 쉽습니다. Visual Studio의 패키지 관리자 콘솔에서 다음 명령어를 입력하면 최신 WDK가 설치됩니다.
Install-Package Microsoft.Windows.WDK
4. 설치 확인 체크리스트
모든 설치가 끝났다면, 제대로 설정되었는지 확인해 봅시다.
| 확인 항목 | 확인 방법 | 정상 상태 |
|---|---|---|
| 플랫폼 툴셋 | 프로젝트 속성 > 일반 > Platform Toolset | WindowsKernelModeDriver10.0 (또는 최신) |
| 타겟 OS | 프로젝트 속성 > Driver Settings | Windows 10 / 11 / 12 등 선택됨 |
| 링커 설정 | 프로젝트 속성 > Linker > General | WDK 경로 포함됨 |
부가 설명: 드라이버 개발 환경은 일반 앱 개발보다 훨씬 민감합니다. 위 표의 ‘Platform Toolset’이 일반적인 ‘v143’ 등이 아니라 반드시 KernelModeDriver로 설정되어 있어야 드라이버 전용 헤더 파일(<ntddk.h> 등)을 인식할 수 있습니다.
II. 실전: 윈도우 드라이버 빌드 및 컴파일 (Core Section)
환경 설정이 끝났으니 이제 실제로 코드를 작성하고 결과물을 만들어볼 차례입니다. 초보자에게 가장 추천하는 KMDF(Kernel-Mode Driver Framework) 방식을 사용해 ‘Hello World’를 출력해 보겠습니다.
1. 프로젝트 생성과 필수 속성
Visual Studio에서 ‘새 프로젝트 만들기’를 누르고 KMDF Empty Project를 선택합니다. WDM 방식보다 기본 코드가 깔끔해 초보자가 배우기에 훨씬 좋습니다.
- Target OS Version: Windows 10 이상 (최신 호환성을 위해 Windows 11 권장)
- Platform: x64 (최근 ARM64 기기가 늘고 있지만, 학습용으로는 x64가 표준입니다)
- Driver Signing: 개발 단계이므로 ‘Test Sign’ 모드가 켜져 있는지 확인합니다.
2. Hello World 코드 작성
DriverEntry.c 파일을 하나 만들고 아래 코드를 그대로 입력해 보세요. 이것이 드라이버의 시작점(Entry Point)입니다.
#include <ntddk.h>
// 드라이버가 메모리에서 내려갈 때 호출되는 함수
void UnloadDriver(PDRIVER_OBJECT DriverObject) {
UNREFERENCED_PARAMETER(DriverObject);
DbgPrint("Goodbye, Kernel World!\n");
}
// 드라이버의 메인 함수 (진입점)
NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath) {
UNREFERENCED_PARAMETER(RegistryPath);
// Unload 함수를 등록하지 않으면 드라이버를 중지할 수 없습니다 (재부팅 필요)
DriverObject->DriverUnload = UnloadDriver;
// 디버거에 메시지 출력
DbgPrint("Hello World from Kernel!\n");
return STATUS_SUCCESS;
}
3. 빌드 수행 및 결과물 확인
이제 Ctrl + Shift + B를 눌러 윈도우 드라이버 빌드 및 컴파일을 수행합니다. 성공적으로 완료되었다면 출력 폴더(x64/Debug)에 여러 파일이 생깁니다.
- MyDriver.sys: 실제 드라이버 바이너리 파일입니다. 핵심입니다.
- MyDriver.inf: 드라이버 설치 정보를 담은 스크립트 파일입니다.
- MyDriver.cat: 서명 정보를 담은 카탈로그 파일입니다.
부가 설명: 일반 프로그램은 .exe 파일만 있으면 실행되지만, 드라이버는 시스템에 등록하는 과정이 필요합니다. 이때 .sys 파일이 실제 작동하는 코드 덩어리이고, .inf 파일은 운영체제에게 “이 드라이버를 어떻게 설치해”라고 알려주는 설명서 역할을 합니다.
III. 배포 및 테스트: VM을 활용한 안전한 로드
드라이버를 개발할 때 가장 중요한 철칙은 “절대 내 컴퓨터(Host)에서 테스트하지 말 것”입니다. 코드 한 줄만 틀려도 블루스크린이 뜨며 작업 중인 모든 데이터를 날릴 수 있기 때문입니다. 반드시 VMware, VirtualBox 같은 가상 머신(Target)을 사용하세요.
1. 테스트 사이닝 모드 활성화 (필수)
윈도우는 보안상 디지털 서명이 없는 드라이버를 로드하지 않습니다. 우리가 만든 드라이버는 정식 서명이 없으므로, 테스트용 가상 머신에서 ‘테스트 모드’를 켜야 합니다. 가상 머신의 CMD(관리자 권한)에서 아래 명령어를 입력하고 재부팅하세요.
bcdedit /set testsigning on
바탕화면 우측 하단에 “Test Mode”라는 워터마크가 보인다면 준비 완료입니다.
2. 서비스 등록 및 실행
드라이버는 ‘서비스’ 형태로 실행됩니다. 가상 머신으로 .sys 파일을 옮긴 후, 관리자 권한 CMD에서 다음 명령어로 실행합니다.
-
서비스 등록:
sc create MyDriver type= kernel binPath= "C:\Drivers\MyDriver.sys" -
드라이버 시작:
sc start MyDriver
만약 “STATE: 4 RUNNING”이라는 메시지가 뜬다면 축하합니다! 여러분이 만든 코드가 커널에서 작동하고 있는 것입니다.
IV. WinDbg 디버깅 기초: 커널의 속을 들여다보다
드라이버는 화면에 창을 띄우거나 메시지 박스를 보여줄 수 없습니다. 그렇다면 DbgPrint("Hello World") 메시지는 어디서 볼 수 있을까요? 바로 마이크로소프트의 강력한 디버거, WinDbg를 사용해야 합니다.
1. KDNET 설정 (2026년 표준)
과거에는 느린 시리얼 포트를 썼지만, 이제는 빠르고 간편한 네트워크 디버깅(KDNET)이 표준입니다.
- Target (VM):
bcdedit /dbgsettings net hostip:<호스트PC IP> port:50000후 나오는 Key 복사. - Host (내 PC): WinDbg Preview 실행 -> ‘Attach to kernel’ -> ‘Net’ 탭에 Key와 Port 입력.
2. 필수 명령어 TOP 5
WinDbg 디버깅 기초만 알면 두려울 것이 없습니다. 아래 5가지 명령어는 꼭 기억하세요.
| 명령어 | 설명 | 활용 예시 |
|---|---|---|
| lm | 로드된 모듈 확인 | lm m MyDriver |
| bp | 중단점 설정 | bp MyDriver!DriverEntry |
| g | 실행 재개 (Go) | g |
| !analyze -v | 크래시 자동 분석 | 블루스크린 발생 시 사용 |
| ed | 메모리 값 수정 | ed fffff800... 1 |
V. 트러블슈팅: 자주 겪는 드라이버 에러 해결법
개발을 하다 보면 필연적으로 에러를 마주하게 됩니다. 초보자가 가장 자주 겪는 상황별 드라이버 에러 해결법을 정리했습니다.
Case 1. 빌드 에러 (LNK1181 등)
- 증상: “LNK1181: 입력 파일을 열 수 없습니다” 또는 라이브러리를 찾을 수 없다는 오류.
- 원인: WDK 라이브러리 경로가 꼬였거나, 앞서 강조한 Spectre 완화 라이브러리가 설치되지 않았을 때 발생합니다.
- 해결: Visual Studio 설치 관리자를 다시 열어 Spectre 구성 요소를 설치하고, 프로젝트 속성에서 라이브러리 디렉터리 경로를 확인하세요.
Case 2. 로드 에러 (System Error 1275)
- 증상:
sc start입력 시 “이 드라이버는 차단되어 로드할 수 없습니다” 메시지 출력. - 원인: 드라이버 서명 문제입니다.
- 해결: VM에서
bcdedit /set testsigning on이 적용되었는지 확인하고, BIOS 설정에서 Secure Boot(보안 부팅)를 꺼야 합니다.
Case 3. 런타임 에러 (BSOD – IRQL_NOT_LESS_OR_EQUAL)
- 증상: 드라이버 실행 직후 파란 화면(블루스크린) 발생.
- 원인: 메모리 접근 규칙 위반입니다.
- 해결: WinDbg에서
!analyze -v를 쳐서 문제 라인을 찾으세요. 보통NonPagedPool메모리를 사용하도록 코드를 수정하면 해결됩니다.
VI. 결론 및 마무리
오늘 우리는 윈도우 드라이버 빌드 및 컴파일의 A부터 Z까지를 살펴보았습니다.
드라이버 개발을 처음 접하면 낯선 용어와 복잡한 설정 때문에 막막할 수 있습니다. 하지만 기억하세요. 드라이버 개발의 70%는 올바른 ‘환경 설정’이고, 20%는 WinDbg를 통한 ‘디버깅’이며, 실제 코딩은 10%에 불과합니다. 오늘 가이드를 통해 환경 설정과 디버깅 기초를 잡으셨다면, 여러분은 이미 절반 이상 성공한 셈입니다.
다음 포스팅에서는 “사용자 모드 애플리케이션과 드라이버 간의 통신(IOCTL)”을 주제로, 실제 프로그램에서 드라이버에게 명령을 내리는 방법을 다뤄보겠습니다. 여러분의 첫 번째 드라이버가 무사히 로드되기를 응원합니다!
자주 묻는 질문 (FAQ)
Q: 내 컴퓨터에서 드라이버를 테스트하면 안 되나요?
A: 네, 절대 권장하지 않습니다. 커널 모드 드라이버는 운영체제의 핵심 영역에서 동작하므로, 사소한 오류로도 블루스크린(BSOD)이 발생하여 중요 데이터를 잃거나 시스템 부팅이 불가능해질 수 있습니다. 반드시 가상 머신(VM)을 사용하세요.
Q: Visual Studio 설치 시 Spectre 라이브러리는 꼭 필요한가요?
A: 네, 필수입니다. 최신 WDK는 보안 강화를 위해 Spectre 완화 라이브러리를 기본적으로 요구합니다. 이를 설치하지 않으면 빌드 시 링크 에러가 발생하여 컴파일이 되지 않습니다.
Q: 테스트 서명(Test Signing) 모드는 왜 필요한가요?
A: 64비트 윈도우는 보안을 위해 마이크로소프트의 디지털 서명이 없는 드라이버의 로드를 차단합니다. 개발 중인 드라이버는 정식 서명이 없으므로, 테스트 모드를 활성화해야만 운영체제에 로드하여 실행해 볼 수 있습니다.