24. windows驱动开发入门

1.第一个驱动程序

前面一章节我们已经学习了如何对windows系统进行调试:Windows 驱动开发环境搭建与内核调试入门

本节将开始学习如何开发、调试windows驱动程序。

上一章节下载了WDK后,我们就可以来到vs中,安装一些插件。

直接来到组件页面,搜索关键字:v143 最新

image.png

勾选上面红框中的组件,然后继续勾选下面的组件:

image.png

然后再搜索driver关键字,下载下面这个组件:

image.png

点击完成,开始安装组件,安装完成后,我们就可以来到创建新项目的目录中,找到WDM模板:

image.png

点击创建即可,这和普通的C++程序项目没什么区别。

然后随便取个项目名字:

image.png

创建一个入口文件,注意要以.c作为文件后缀,比如driver.c

image.png

一个最简单的代码如下:

#include<ntifs.h>
#include<ntddk.h>


// 卸载驱动执行
VOID UnloadDriver(PDRIVER_OBJECT pDriver)
{
	pDriver;
	DbgPrint("Driver unloaded\n");
}


NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver, PUNICODE_STRING pRegistryPath) {
	pDriver->DriverUnload = UnloadDriver;
	pRegistryPath;
	DbgPrint("Driver Loaded\n");
	return STATUS_SUCCESS;
}

这两个函数中,DriverEntry为驱动加载时的入口函数,UnloadDriver为驱动卸载时要调用的函数。

驱动入口函数有两个参数,其中第一个参数pDriver为我们当前驱动运行时系统给我们创建的驱动对象,比如代码中我就是通过给该对象的DriverUnload参数设置我们驱动的卸载函数。

同时由于驱动编译较为严格,默认不允许有未被使用的参数,所以我这里对于暂时用不到的参数就直接将其放在代码中了。

DbgPrint函数就是内核中的打印函数,它的使用方法和printf函数几乎是一模一样的,你完全可以将其当作printf函数使用。

注意最后的返回值一定要为STATUS_SUCCESS,这代表我们驱动加载成功,如果返回其它值,系统就会认为我们的驱动加载失败、从而不会让其继续运行了。

2.编译调试驱动

上面我们完成了一个最简单的驱动程序代码编写,然后接下来我们开始编译驱动程序。

首先如果我们直接编译的,你应该会遇到下面这个报错:

image.png

解决方案是将默认生成的inf文件移除项目:

image.png

此时理论上来说就可以编译成功了。

如果你依旧编译失败,那么你需要确认你的WDK是否成功安装、以及是否成功配置,这可以从当前的项目属性中看到:

image.png

如果没有这些选项,你可能需要重新安装驱动程序了。

作者:余识
全部文章:0
会员文章:0
总阅读量:0
c/c++pythonrustJavaScriptwindowslinux