1.第一个驱动程序
前面一章节我们已经学习了如何对windows系统进行调试:Windows 驱动开发环境搭建与内核调试入门。
本节将开始学习如何开发、调试windows驱动程序。
上一章节下载了WDK后,我们就可以来到vs中,安装一些插件。
直接来到组件页面,搜索关键字:v143 最新
勾选上面红框中的组件,然后继续勾选下面的组件:
然后再搜索driver关键字,下载下面这个组件:
点击完成,开始安装组件,安装完成后,我们就可以来到创建新项目的目录中,找到WDM模板:
点击创建即可,这和普通的C++程序项目没什么区别。
然后随便取个项目名字:
创建一个入口文件,注意要以.c
作为文件后缀,比如driver.c
:
一个最简单的代码如下:
#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
函数使用。