首页
社区
课程
招聘
[分享]菜鸟也写驱动程序
发表于: 2008-5-21 08:35 8139

[分享]菜鸟也写驱动程序

2008-5-21 08:35
8139

1.编译器
驱动说到底是由编译器产生的一个二进制文件,后缀sys,和普通的"console application "和"WINDOWS application "一样,也是pe结构,但是他们运行的子系统不同,link时driver程序链接的子系统为NATIVE,为编译器传递/SUBSYSTEM:NATIVE参数.一般不用手动命令行的方式打命令编译,可以写好makefile(内容固定不变)和SOURCE文件,cd 到程序目录下,build即可,还可以用前辈制作的vc向导生成,或者用更简单的quicksys,easysys等工具编译.搜索一下全都有了-_- quicksys我只能用0.2版本的,最新的0.4版本用着有些问题..

2.入口点,驱动的"main"函数
我们知道一个简单的console程序入口点通常为main,windows程序入口点为WinMain,驱动也有类似的东西,被称为DriverEntry例程,是每个驱动函数必须要有的,原型如下:
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegistryPath);
这个例程由I/O管理器在装载时调用.并在注册表里生成相关键值,也就是传递的第二个参数,UNICODE_STRING字符串指针,指向该键值.驱动里统一用UNICODE_STRING,它不是普通的数据,而是一个结构体,而且不是NULL结尾的,如果NULL结尾,将产生蓝屏.初始化要用特殊手段,调用RtlInitUnicodeString函数.
DRIVER_OBJECT是一个用来代表(represent)驱动的数据结构,用他来初始化驱动一些数据结构,为他们例程做准备工作.指向返回NTSTATUS系统状态.

3.DriverUnload例程
参数为一个DriverOjbect,如其名,由DriverOjbect的unload域指定,做一些清理工作,比如删除设备对象,删除符号连接等工作,名称可以任意.
创建了链接名,设备才能为win32子系统可见,
3.DeviceOjbect, 设备对象
设备对象是代表I/O操作目标的虚拟/逻辑/物理设备,我的理解是驱动程序负责创建出来真正起实际作用的,是Driver程序操作的目标对象.由IoCreateDevice创建,IoCreateDevice在DriverEntry或AddDevice中调用,取决于是否为WDM模型,我们编写的一般都不是WDM模型,所以在DriverEntry中调用,下面是一段代码:

NTSTATUS 
DriverEntry(PDRIVER_OBJECT pDriverObj, PUNICODE_STRING pRegistryString)
{
	NTSTATUS status;
	ULONG ulDeviceNumber = 0;
	pDriverObj->DriverUnload = ExampleUnload;

	PDEVICE_OBJECT pDevObj;
	UNICODE_STRING usDeviceName,usDosDeviceName;
	RtlInitUnicodeString(&usDeviceName,L"\\Device\\Example");
	RtlInitUnicodeString(&usDosDeviceName,L"\\Dos\\DosDevices\\Example");
	status = IoCreateDevice(pDriverObj,0,
					&usDeviceName,FILE_DEVICE_UNKNOWN,
					FILE_DEVICE_SECURE_OPEN,
					FALSE,&pDevObj);

	IoCreateSymbolicLink(&usDosDeviceName,&usDeviceName);
	return status;	
}
void ExampleUnload(PDRIVER_OBJECT pDriverObj)
{
	// delete symboliclink
	UNICODE_STRING usDosDeviceName;
	RtlInitUnicodeString(&usDosDeviceName,L"\\Dos\\DosDevices\\Example");
	IoDeleteSymbolicLink(&usDosDeviceName);

	// delete the Device
	IoDeleteDevice(pDriverObj->DeviceObject);
}

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 7
支持
分享
最新回复 (9)
雪    币: 125
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
写得出这些,还算菜鸟?
2008-5-21 09:12
0
雪    币: 102
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
当然算了,ccdebug的驱动入门我看了半天都理解不了
上传quicksys0.2版本,和DbgView
上传的附件:
2008-5-21 09:20
0
雪    币: 254
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
不会是从那里粘贴的吧
2008-5-21 09:20
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
完全看不懂……

看来小弟以后不能自称菜鸟,偶跟“菜鸟”级别相差太远了~~
2008-5-21 11:23
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
呵呵,lz水平不低啊
2008-5-24 10:16
0
雪    币: 102
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
菜的掉渣,这论坛里高手太多了,
这贴沉了三天以后又奇迹般浮出水面
2008-5-24 11:56
0
雪    币: 387
活跃值: (25)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
8
very good, very powerful
2009-5-1 21:56
0
雪    币: 437
活跃值: (82)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
楼主不是菜鸟吧,貌似过了菜鸟阶段
2009-5-2 11:20
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
写驱动还算“菜鸟”么?
2009-5-2 21:01
0
游客
登录 | 注册 方可回帖
返回
//