目录

Windows内核编程三-内核驱动运行与调试

Windows内核编程(三)-内核驱动运行与调试

内核驱动运行与调试

驱动的运行

驱动的运行通过服务来实现。

微软规定,驱动文件必须经过微软的数字签名后,才可以运行在64位系统上,如果把没有经过签名的驱动直接放在64位操作系统中运行,结果是驱动加载失败,失败原因是驱动没有签名。

解决方法:

  1. 把操作系统配置成调试模式,调式模式的系统,默认允许未签名的驱动运行
  2. l临时关闭系统驱动签名校验,在开机时修改启动参数

对于Windows 7操作系统来说,开机时可以在键盘上按 F8 键,选择禁用驱动程序签名强制

对于Windows 10 系统来说,可以在高级重启中设置,具体操作为: 开始菜单设置更新安全恢复 ,在高级启动下点击 立即重新启动 按钮,然后在出现的界面中选择 疑难解答高级选项启动设置 ,点击 重启 按钮,系统开始重启,在启动过程中会显示启动选项,在键盘上输入数字 7 ,即选择 禁用驱动程序强制签名

https://i-blog.csdnimg.cn/blog_migrate/e7b2352d8a2001a97dd5e7d03cc2aeeb.png#pic_center

https://i-blog.csdnimg.cn/blog_migrate/ee39ad6aa6914b3cf3e7b0579ac904ad.png#pic_center

https://i-blog.csdnimg.cn/blog_migrate/df049b06c73fc4cadd570f47ad8c3fb4.png#pic_center

https://i-blog.csdnimg.cn/blog_migrate/bf7617f67eb29808ce1d5d0dc861e472.png#pic_center

https://i-blog.csdnimg.cn/blog_migrate/05397602ca908a6c038cc4c0ae2a4e7c.png#pic_center

https://i-blog.csdnimg.cn/blog_migrate/b9a2b16e2dbf2bcb00b0516dcee7f2fe.png#pic_center

https://i-blog.csdnimg.cn/blog_migrate/b43ea6a32926b303665004b69619600a.png#pic_center

https://i-blog.csdnimg.cn/blog_migrate/3a724acf3345bf27872f035d88e970a2.png#pic_center

  1. 还可以把系统驱动程序强制签名永久去掉,但是这样会大大降低系统的安全性,不建议使用。

把驱动程序放在系统的C盘下,以管理员权限运行cmd(命令提示符),在cmd中输入注册驱动的命令:

sc create MyDriver binPath="C:\MyDriver.sys" type= kernel start= demand

https://i-blog.csdnimg.cn/blog_migrate/dfbce97cedd08c1db9aa6f148cb83280.png#pic_center

其中 sc create 表示创建一个服务, binPath 指驱动文件所在磁盘位置, type 表示驱动的类型, start 表示该服务启动类型, demand 表示手动启动。

注意 :在上面的命令中,等号(=)后面需要有一个空格(测试没有也行,不知道是不是微软修复了这个bug)。

sc 命令内部也是通过服务的 API 对服务进行注册,与直接通过API创建服务的效果相同,通过sc命令,可以省区编写注册服务的代码。

成功创建后,使用sc命令来启动服务,命令如下:

sc start MyDriver

其中MyDriver为服务名,对应sc create后面的名字,这个命令的功能等同于StartService函数,服务成功运行后,命令行上显示创建的信息

https://i-blog.csdnimg.cn/blog_migrate/7a8358fca8311f0ee26b67a961174f40.png#pic_center

驱动的调试

驱动运行之后,没有在代码中打印的调试信息没有显示,使用工具DbgView.exe进行调试,

https://i-blog.csdnimg.cn/blog_migrate/dd7d394be4301c80104119dc91c37191.png#pic_center

以管理员权限打开Dbgview.exe,在菜单上选择 Capture,依次勾选"Capture Kernel" 以及 “Enable Verbose Kernel Output”。

https://i-blog.csdnimg.cn/blog_migrate/6e2f3fb06df8c16af63d5f7c5b86dcbc.png#pic_center

由于MyDriver已经运行,如果需要观察DriverEntry的日志,首先需要停止驱动服务,然后再次启动驱动服务,停止驱动服务的命令为: sc stop MyDriver

成功执行停止命令后,保持DbgView不关闭,再次执行 sc start MyDriver ,可以在DbgView的窗口中看到以下日志

https://i-blog.csdnimg.cn/blog_migrate/9cbd87b0f7ff8d51ebd57dba0bc6fd04.png#pic_center

可以通过 sc delete MyDriver 命令删除先前已注册和创建的服务。