驱动学习笔记— Hello World !

来源:互联网 发布:xp怎样连接网络打印机 编辑:程序博客网 时间:2024/04/30 07:35

编译环境用xp下VC6+DDK

新建一个文件夹当作工程目录,路径是E:/lingdux/

从别的工程copy过来两个文件,

一个是makefile,它用来指定文件之间的依赖关系,确定项目中哪些文件时需要重新编译的,那些事已经编译过的。里面的内容不用改,直接默认就OK

另一个是source,它用来保存一些配置信息,内容如下:

TARGETNAME=lingdux  这句用来指定目标程序存放的路径

TARGETTYPE=DRIVER 这句是指定目标类型,DRIVER为驱动程序

TARGETPATH=Driver 这句指定编译时的中间文件存放的路径

SOURCES=lingdux.c  这句指定了源文件

在工程目录想创建一个空文件命名lingdux.c,双击用VC6打开,开始写代码~!

遵循C语言,只有一个入口函数DriverEntry,有两个参数

NTSTATUS Driver Entry(IN PDRIVER_OBJECT DriverObject, 第一个是PDRIVER_OBJECT类型 系统进程调用的驱动对象
                            IN OUNICODE_STRING RegistryPath)  第二个是IN OUNICODE_STRING类型  字符串类型,注册路径

返回值类型为NTSTATUS,系统状态。

输出函数为DbgPrint(),包含的头文件是ntddk.h

编写完成后,发现这个驱动程序没有退出功能,系统加载后不能停止,重新启动后才能再次加载,不利于调试,下面就添加一个退出功能。

DriverObject->DriverUnload=Unload 为驱动对象注册一个卸载例程指定一个空函数

在驱动停止的时候被调用,用于删除一些设备对象,符号链接,释放驱动加载的资源。

VOID Unload(IN PDRIVER_OBJECT DriverObject)

{

}

完整代码如下:

#include <ntddk.h>
VOID Unload(IN PDRIVER_OBJECT DriverObject)
{
}

NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath)
{
DriverObject->DriverUnload=Unload;
DbgPrint(”Hello World!”);
return STATUS_SUCCESS;
}

保存以上代码,然后打开DDK,路径选择工程目录,运行build命令,

编译出来的驱动文件为E:/lingdux/driver/i386/lingdux.sys

用coderui的驱动加载工具加载
用debug viwe成功截获到输出hello world!