1. Hello World 驱动
任务说明
本案例目标是在 Windows 10/11 x64 环境下,从零编写一个最小化的内核驱动,使其在加载时向内核调试器输出 Hello World 字符串。驱动不执行任何设备 I/O 操作,仅演示驱动入口点、卸载例程与调试输出机制,验证驱动开发环境与调试链路是否正常。
实现原理
Windows 内核驱动必须导出 DriverEntry 入口点,并在其中完成初始化。本驱动在 DriverEntry 中调用 DbgPrint 输出字符串,随后设置卸载例程 DriverUnload,该例程在驱动被停止时输出退出信息。驱动不创建设备对象,因此卸载时无需额外清理。
代码实现
创建源文件 HelloWorld.c:
#include <ntddk.h>
VOID DriverUnload(PDRIVER_OBJECT DriverObject)
{
UNREFERENCED_PARAMETER(DriverObject);
DbgPrint("[HelloWorld] Driver Unloaded\r\n");
}
NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
{
UNREFERENCED_PARAMETER(RegistryPath);
DbgPrint("[HelloWorld] Hello World\r\n");
DriverObject->DriverUnload = DriverUnload;
return STATUS_SUCCESS;
}
编译配置
创建源文件 HelloWorld.inf(用于生成驱动安装包):
[Version]
Signature = "$WINDOWS NT$"
Class = "NT"
ClassGuid = {4d36e97d-e325-11ce-bfc1-08002be10318}
Provider = %ProviderName%
DriverVer = 01/01/2025,1.0.0
CatalogFile = HelloWorld.cat
[DestinationDirs]
DefaultDestDir = 12
[DefaultInstall.NT]
CopyFiles = DriverFiles
[DefaultInstall.NT.Services]
AddService = HelloWorld,0x00000002,DriverService
[DriverFiles]
HelloWorld.sys = ,,
[DriverService]
DisplayName = "HelloWorld Driver"
ServiceType = 1
StartType = 3
ErrorControl = 1
ServiceBinary = %12%\HelloWorld.sys
[Strings]
ProviderName = "Example Corp"
构建步骤
- 安装 Windows Driver Kit (WDK) 与 Visual Studio(含“使用 C++ 的桌面开发”工作负载)。
- 在 Visual Studio 中创建“Empty WDM Driver”项目,将
HelloWorld.c与HelloWorld.inf加入项目。 - 选择
x64配置,生成解决方案。输出目录中应得到HelloWorld.sys。
加载与验证
在目标测试机(需开启测试签名模式)上,以管理员身份打开命令提示符:
bcdedit /set testsigning on
重启系统
重启后将 HelloWorld.sys 复制到 C:\Windows\System32\drivers\,然后创建服务并启动:
sc create HelloWorld type= kernel binPath= C:\Windows\System32\drivers\HelloWorld.sys
sc start HelloWorld
若需停止并删除:
sc stop HelloWorld
sc delete HelloWorld
验证方法:使用 WinDbg 连接目标机的内核调试会话(网络或串口)。在驱动加载前执行 ed nt!Kd_DEFAULT_MASK 0xFFFFFFFF 确保所有调试输出可见。执行 sc start HelloWorld 后,在 WinDbg 的调试输出窗口应观察到:
[HelloWorld] Hello World
执行 sc stop HelloWorld 后,应观察到:
[HelloWorld] Driver Unloaded
判定标准:若 WinDbg 中按顺序出现上述两条输出,且系统无蓝屏,则驱动加载、调试输出与卸载链路均验证通过。
注意事项
- 测试机必须开启
testsigning,否则系统拒绝加载未签名驱动。 - 若使用虚拟机调试,需在 VM 中启用虚拟化中断(如 VMware 的“Virtualize Intel VT-x/EPT”),并配置 COM 管道或网络调试。
- 驱动仅用于开发验证,不应在生产环境加载。