编写第一个HelloWorld驱动程序

来源:互联网 发布:npm 淘宝源 编辑:程序博客网 时间:2024/06/06 02:58

开发应用程序需要用到SDK,内核编程需要使用WDK(Windows Driver Kit),WDK已经自带所需要的头文件,库,C/C++语言及汇编语言的编译器与链接器,所有完全可以不用安装Visual Studio。

1.首先我们下载安装WinDDK,安装过程没有需要特备注意的地方,只有两点:

(1)安装到一个简单一点的路径,最好是根目录。而且尤其要注意避免在安装路径上出现空格,否则会出现编译问题

(2)选择“完全安装”,否则会错过一些代码例子。

2.编写第一个C文件

首先打开记事本新建一个文件,然后把文件命名为first.c,在first.c中写入下列代码:

////// @file first.c/// @author /// @date /// #include <ntddk.h>// 提供一个Unload函数只是为了VOID DriverUnload(PDRIVER_OBJECT driver){// 但是实际上我们什么都不做,只打印一句话:DbgPrint("goodbye");}// DriverEntry,入口函数。相当于main。NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path){// 这是我们的内核模块的入口,可以在这里写入我们想写的东西。// 我在这里打印一句话。因为”Hello,world” 常常被高手耻笑,所以// 我们打印一点别的。DbgPrint("first: Hello, my salary!");// 设置一个卸载函数便于这个函数能退出。driver->DriverUnload = DriverUnload;return STATUS_SUCCESS;}
上面的DriverEntry是每个内核模块的入口,相当于应用程序编程中的main函数,在加载这个模块时被系统进程System调用一次。在其中我们写了DriverUnload函数,这个模块可以被动态的卸载(这样方便我们调试程序)。

现在建立一个文件夹first,然后把first.c文件保存在这个目录下,下面简单介绍下编译的方法。


3.编译一个工程

前面已经建立了工程first,虽然这个工程只有一个first.c文件作为代码文件,现在必须在这个目录下增加这两个文件,以便WDK的build工具可以build它。其中一个文件的名字必须是makefile,这个文件的内容是固定的,如下:

## DO NOT EDIT THIS FILE!!!  Edit .\sources. if you want to add a new source# file to this component.  This file merely indirects to the real make file# that is shared by all the driver components of the Windows NT DDK#!INCLUDE $(NTMAKEENV)\makefile.def
另外,还需要一个名字为SOURCES的文件,这个文件的内容关系到这个模块要编译哪些文件,以及编译出来的.sys文件的名字,我的内容是这样的:

TARGETNAME=firstTARGETTYPE=DRIVERSOURCES=first.c
其中TARGETNAME表示名字,编译出来之后,模块的名字为first.sys,SOURCES表示要编译的.c文件,如果有多个,请用空格分隔。

下面从开始菜单中打开WDK的build环境配置,如图:


如果你最终是在XP系统中运行这个程序,则选择XP,根据你最终运行程序的系统来选择。然后会有checkd和free另种版本可供选择,测试选择checkd版本,最后发布选择free版本。

出现了一个控制台,这个控制台已经配置好了编译环境,进入到我们需要编译的目录中,然后build即可


编译结束,first.sys出现在\first\objchk_wxp_x86\i386下。


这个文件不像普通的exe文件可以双击执行,它需要一个安装工具进行安装。

4.安装编译好的内核模块

这里选择的是srvinstw.exe。安装好之后打开:

(1)选择安装服务并单击下一步按钮,然后找到first.sys,这时需要输入服务名称,可以任意取名,在这里输入first,名字只要不和已经存在的服务名称冲突即可。

(2)输入.sys的路径,注意要进行手工输入,浏览是找不到的

(3)选择设备驱动,下一步

(4)输入“NT设备驱动器名”,不需要输入任何东西,直接点击下一步

(5)选择手动,方便操作。

5.运行安装好的内核模块。

cmd打开控制台,输入net start first 看到服务启动成功就可以了。net stop first用于停止服务。

输出的结果如何看到呢?下一篇将介绍Windbg的配置以及在虚拟机中运行内核模块。

0 0
原创粉丝点击