首页
社区
课程
招聘
一个驱动难题,请高手指教
发表于: 2008-9-18 02:43 6588

一个驱动难题,请高手指教

2008-9-18 02:43
6588
在普通的windows程序中有CreateMutex,比如在程序A里用
CreateMutex(NULL, true, "RunningFlag")来判断是否可以运行,在程序B里也用
CreateMutex(NULL, true, "RunningFlag"),结果就是同一时间只有一个程序(A或B)在运行,而不会出现两个同时在运行的情况,那么问题出来了,在驱动程序里,类似有2个驱动D1.sys,D2.sys
有没有办法来解决类似的问题呢,就是比如我用驱动加载工具,如果加载了D1.sys那么再加载D2.sys就不会成功,如果加载了D2.sys那么再加载D1.sys就不会成功,谢谢。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (14)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
这么简单的问题,难道没人知道?
2008-9-18 09:57
0
雪    币: 431
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
可以用CreateService
如果是已加载的驱动,再次调用将不成功
2008-9-18 14:43
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
驱动程序里用CreateService??
2008-9-18 15:49
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
kcynic你理解错我的意思了。
2008-9-18 15:49
0
雪    币: 3
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
很简单,当加载D1.sys的时候, 驱动先去查找D2.sys是否已经被加载了(可以查找驱动程序列表),如果是,则退出; D2.sys里同理....

如果D1.sys与D2.sys都不是你写的,你没有源代码; 你可以从用户程序里判断, 每个驱动程序一般都会有个符号连接,供用户层程序来使用, 你可以在用户层程序里用CreateFile来判断设备对象是否已经存在.....
2008-9-18 23:04
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
d1.sys不知道d2.sys是文件名的啊,也不知道对方的符号名和设备名。
2008-9-18 23:25
0
雪    币: 709
活跃值: (2575)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
8
LZ,你在异想天开吗?

6楼的回答已经很贴切了.
2008-9-19 10:24
0
雪    币: 213
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
大米的回答很幽默,呵呵
2008-9-19 12:22
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
写注册表、写文件、选一个大多数程序都不会去 HOOK的API 将其HOOK 。。。两个驱动都导出接口在DriverEntry相互调。。。。
2008-9-19 17:49
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
开来是没类似用户态下的方便的办法了。
2008-9-19 20:04
0
雪    币: 3
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
我都说了, 在用户程序里用CreateFile来判断设备对象是否已经存在;

驱动程序会创建设备对象的, 还会为这个设备对象创建符号连接,以供用户程序来使用, 如, d1.sys加载后, 如果是NT式驱动, IO管理器会为其创建一个驱动对象, 这个驱动对象的名称就按你加载此驱动的服务名称来定; 然后, d1.sys会在此驱动对象里创建一个设备对象, 如 \Device\d1 , 同时, 还会创建符号连接, 你在用户层里就可以通过CreateFile来打开这个设备对象, 如: HANDLE d1h = CreateFile("\\\\.\\d1", ... ) 然后GetLastError来判断是何种状态, 就可以正确地判断出 d1.sys 到底有没有被加载.

设备名与符号连接可以通过一些驱动查看工具来获得;
2008-9-19 22:56
0
雪    币: 63
活跃值: (17)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
13
不算难题...
2008-9-20 00:54
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
13能否指教一二
2008-9-21 07:57
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
真是不明白你到底想干啥。

你举的例子就正好说明了一个问题:那个RunningFlag标志必须是你知道的特征,所以你才能利用它来防止重复运行。在驱动中也可以利用相关的特征才达到目的,比如模块名、设备名等特征,如果啥特征都不知道,估计上帝也不知道你想干啥.

一旦知道特征了就容易了,在DriverEntry()里边进行检测,如果存在就返回STATUS_UNSUCCESSFULLY,想不失败都难。
2008-9-21 10:19
0
游客
登录 | 注册 方可回帖
返回