扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
下面我们介绍如何在Windows XP平台上开发一个简单的设备驱动程序。在此过程中,我们要用到设备驱动程序开发包DDK。需要注意的是,微软为不同的Windows版本提供了不同的DDK。就目前来说,我们可以使用Windows 2003 DDK,因为该版本能够支持Windows 2000、Windows XP和Windows 2003等三个平台下的设备驱动程序的开发。
1. 驱动程序源文件
首先在C盘根目录下新建一个目录,本例为C:\myrootkit,此后向相应文件都存放在该目录之下。然后可以在VC++下建立一个C源文件,让其内容如下所示:
//一个简单的驱动程序实例
#include "ntddk.h"
NTSTATUS DriverEntry ( IN PDRIVER_OBJECT theDriverObject,
IN PUNICODE_STRING theRegistryPath )
{
DbgPrint("I am a driver!");
return STATUS_SUCCESS;
}
之后,将其保存在我们的C:\myrootkit目录下,并且该文件命名为mydriver.c。下面对上面的代码作简要的解释:
DriverEntry是该驱动程序的入口点,即当该驱动程序启动时,操作系统会首先调用该函数。它相当于一般C/C++程序中的main或Winmain函数。另外,我们看到DriverEntry的两个参数中都含有一个关键词IN,说明这两个参数只能用于输入。第一个参数指向应被初始化的当前驱动程序的驱动对象;第二个参数是设备服务键的键名。
该驱动程序实在太简单了,它只是在内核运行时,利用调试语句给出一则消息:“I am a driver!”。不过,和一般程序不同,该消息不会显示在标准输出设备上,也就是说,我们在屏幕上看不到这则消失,关于调试输出的处理我们会在后文中加以详细介绍。
有一点需要指出,那就是上面的驱动程序没有设置卸载例程。尽管卸载例程不是必需的,但有时它却非常有用:启动驱动程序时,系统会将参数theDriverObject传递给该驱动程序的主函数,这个参数指向的数据结构含有许多函数指针,其中一个指针称为“unload routine”。如果我们设置该指针,就能从内存中卸载驱动程序;如果不设置该指针的话,除非重新启动机器,否则无法将载入内存的驱动程序卸载掉。同时,驱动程序在开发过程中,会不断添加或改变功能,所以要经常装载以及卸载它们。为了避免每次测试新版本的驱动程序时都必须重启系统,我们应当设置“unload routine”指针。事实上,设置该指针并不是什么难事:先建立一个卸载例程,就可以设置该卸载指针了。
现在以前面的驱动程序为例,介绍如何为其添加卸载例程:
//一个简单的驱动程序实例
#include "ntddk.h"
// 这里是我们的卸载函数
VOID MyUnload( IN PDRIVER_OBJECT DriverObject )
{
DbgPrint("MyUnload called\n");
}
NTSTATUS DriverEntry(IN PDRIVER_OBJECT theDriverObject,
IN PUNICODE_STRING theRegistryPath)
{
DbgPrint("I am a driver and I loaded!");
// 初始化DriverObject对象中指向卸载函数的指针
theDriverObject->DriverUnload = MyUnload;
return STATUS_SUCCESS;
}
这样一来,我们用重启系统就能方便地装载和卸载驱动程序了。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。