在完成了进程和线程的学习后,我们发现,很多实验都受限于权限的限制,很难直接操纵0环的结构,然而,依靠中断门等提权方式进入0环,需要手动在Windbg中设置段描述符,就会变得很麻烦。而驱动恰恰可以解决这个问题,驱动可以直接和操作系统打交道,话不多说,开始驱动的学习吧。
环境配置搭建
环境及工具
先安装Visual Studio 2017在本机,再安装WDK到本机。DbgView和KmdManager则安装至虚拟机上。因为驱动若发生错误,则会导致系统崩溃,因而选择在虚拟机上进行实验。
项目创建
- 安装完VS2017后,要安装SDK,且版本要与WDK的版本一致,如图我的SDK版本是17763 ![]() 那么安装的WDK版本,也得是17763 那么安装的WDK版本,也得是17763![]()  
- 校验好版本后,来创建驱动程序,新建项目 -> Visual C++ -> 测试 -> Legacy -> Empty WDM Driver ![]() 有人可能会问了,为什么要创建WDM的驱动程序,而不创建WDF的驱动程序呢?因为如果创建了WDF的驱动程序,在xp上执行会发生系统找不到指定文件的错误 有人可能会问了,为什么要创建WDM的驱动程序,而不创建WDF的驱动程序呢?因为如果创建了WDF的驱动程序,在xp上执行会发生系统找不到指定文件的错误![]() 具体原因也不是很清楚,至于这俩的区别可以参考WDM和WDF之间的差异 具体原因也不是很清楚,至于这俩的区别可以参考WDM和WDF之间的差异
- 接着点击确定,即可创建驱动程序项目了,但是需要注意一点,就是第一步中,SDK和WDK的版本必须要一致,否则会出现一个奇怪的错误 ![]() 如果版本相同,就不会出现这样的错误啦 如果版本相同,就不会出现这样的错误啦
项目属性配置
编写第一个驱动程序
创建过程
- 编写驱动代码,具体如下 c- 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 //卸载函数
 VOID DriverUnload(PDRIVER_OBJECT driver)
 {
 DbgPrint("驱动程序已停止.\r\n");
 }
 //驱动程序入口函数,相当于控制台的main函数
 NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegistryPath)
 {
 DbgPrint("驱动程序已运行.\r\n");
 //设置一个卸载函数 便于退出
 DriverObject->DriverUnload = DriverUnload;
 return STATUS_SUCCESS;
 }
结果验证
- 将HelloDriver/Debug目录下的HelloDriver.sys复制进虚拟机Windows Xp中
- 打开DbgView,勾选Capture Kernel选项,用于捕获内核调试信息 ![]() 
- 打开KmdManager,导入HelloDriver.sys,注册并运行,验证结果。![]() 
总结
总体不难,但是第一次搞驱动,踩了不少坑,最终还是花了一个上午的时间才弄好。真的非常感谢Joney老大解答问题,这让我少花了很多时间,不然我可能搞到晚上都弄不出来。。。
参考文章:




















