编译环境用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!
引自: http://forum.darkst.com/viewthread.php?tid=42298