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;
}
 

```

Windows内核编程学习1:构建HelloWorld

 

生成完毕后,就是运行项目了。这时候你到项目文件夹下会找到一个“.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中会立刻出现调试信息(迅速一定要迅速!!!),我这里把我的给大家看看:

Windows内核编程学习1:构建HelloWorld

 同样,“停止”之后,会有驱动程序卸载的信息:

Windows内核编程学习1:构建HelloWorld

 接下来可以卸载了。

今天的学习就结束了!感谢大家的阅读!也欢迎大家提出问题!

上一篇:for循环语句


下一篇:关于redisTemplate的使用遇到的问题