Windows内核编程学习1:构建HelloWorld
作者:互联网
首先下载VS+WDK,资源可以从微软上下,我这里资源也附在后面,但不是最新的。
今天我们开始第一个项目:HelloWorld
(我用的是VS2019)打开VS,[创建新项目]=>[Kernel Mode Driver Empty],再填写名称:HelloWorld
进入项目后,右击“解决方案管理器”中的“Source Files”,“添加”,“新建项”,不要选择上面的任何项目,直接在“名称”中填写“main.c”,然后在“main.c”里写入以下C语言代码:
```c
#include <ntddk.h>
VOID DriverUnload(PDRIVER_OBJECT driver) {
DbgPrint("HW: Our driver is unloading...\r\n");
}
NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path) {
DbgPrint("HW: Hello, World!\r\n");
driver->DriverUnload = DriverUnload;
return STATUS_SUCCESS;
}
```
保存项目。然后根据你的系统版本,在菜单栏中选择“x86”“x64”“ARM”或“ARM64”。
接着开始生成解决方案了。菜单栏中“生成”=>“生成解决方案”。
接下来有些人会遇到要添加Spectre缓解库的情况,可以从开始菜单里打开“Visual Studio 2019 Installer”,进行修改。修改完后重新生成。
还有个问题。VS会提示代码中有错误,原因在于driver与reg_path没用到过,可以改成下面的样子:(也就是自己给自己赋值了一下)
```c
#include <ntddk.h>
VOID DriverUnload(PDRIVER_OBJECT driver) {
DbgPrint("HW: Our driver is unloading...\r\n");
driver = driver;
}
NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path) {
DbgPrint("HW: Hello, World!\r\n");
reg_path = reg_path;
driver->DriverUnload = DriverUnload;
return STATUS_SUCCESS;
}
```
生成完毕后,就是运行项目了。这时候你到项目文件夹下会找到一个“.sys”的文件,因为我们这里项目名称叫HelloWorld,所以文件名为“HelloWorld.sys”。怎么运行呢?因为Windows内核程序不同于普通的应用程序,你也不要指望它会弹出个窗口,所以只能用`DbgPrint`,也就是调试输出,来查看它的状态。输出内容可以用DbgView软件查看——接下来介绍如何查看`DbgPrint`的内容。
先安装驱动程序。我这里用的InstDrv,资源附在后面。
打开InstDrv.exe,把HelloWorld.sys拖到输入框上,会自动输入文件路径。接下来先不忙安装启动,我们打开DbgView.exe,把菜单栏中“监视”栏中除了“启动日志”以外都勾上,接下来会出现一堆监视输出信息,不管它们,我们的程序还没安装呢。
但是启动失败了。为什么?因为没有签名。
打开测试模式,在测试模式下可以安装启动没有签名的驱动程序。Win+R,输入cmd回车,在命令提示符中输入`bcdedit /set testsigning on`打开测试模式,再重启就行了。(同理,`bcdedit /set testsigning off`可以再重启后关闭测试模式)
InstDrv中 安装=>启动 程序,DbgView中会立刻出现调试信息(迅速一定要迅速!!!),我这里把我的给大家看看:
同样,“停止”之后,会有驱动程序卸载的信息:
接下来可以卸载了。
今天的学习就结束了!感谢大家的阅读!也欢迎大家提出问题!
标签:DbgPrint,DriverUnload,Windows,driver,HelloWorld,内核,path,reg 来源: https://blog.csdn.net/github_66363853/article/details/122761866