fengger
驱动牛犊
驱动牛犊
  • 注册日期2001-05-02
  • 最后登录
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3748回复:9

两个驱动程序如何共享一个Event?

楼主#
更多 发布于:2001-05-16 12:21
我看了资料,好像通过在两个不同的驱动程序之间共享Event的话,
可以通信,我想思路大概如此:
驱动程序A注册一个Dpc例程,当制定事件发生的时候,Dpc例程就
触发这个时间的处理线程,
而在另外一个驱动程序B,当某件事情发生时,他就发出一个关于
那个事件的信号,
问题是,第一,B如何发出这个信号,才能让A收到呢?
       第二,A如何知道这个事件发生了呢?

最新喜欢:

txysptxysp
儿须成名,酒须醉; 酒后畅谈,是心言。
softice
驱动牛犊
驱动牛犊
  • 注册日期2001-05-09
  • 最后登录2009-07-30
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2001-05-25 14:20
  你可以在其中一个驱动中创建一个命名的事件或信号量(如ZwCreateEvent)。比如\BaseNamedObjects\hook1001。然后在另一个驱动中利用ObReferenceObjectByName找到这个命名对象并得到一个可用的指针。以后两个驱动可以用此共享对象进行同步。如一个驱动调用KeWaitForSingleObject在这个对象上等待,另一个驱动可以通过KeSetEvent唤醒它。其实这种方法不仅限于驱动间通信,驱动和ring3级客户程序间也可利用此法(病毒实时监控就是这样做的)  
  当然这种方法只适用于NT/2000,WIN9X下则需要变通一下。
jeosph
驱动中牛
驱动中牛
  • 注册日期2001-04-19
  • 最后登录2006-08-08
  • 粉丝0
  • 关注0
  • 积分96分
  • 威望11点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2001-06-02 10:11
ntddk里把这个问题说得清清楚楚,只不过你没有看罢了,我昨天试了一下,果然很有意思!!
大概相关的函数是:ExRegisterCallback(),顺着这个线索你一定会找到答案的!!
RtlInitializeUnicodeString()
ExIninitialAttributes()
ExRgisterCallback()

ExNotifyFunction()

名称我实在是记不住,你或许在想那你为什么不查查,嘿,嘿,我上网机器是公用的,而且资料只能发到我的计算机里,我那里的东西,就..
HuYuguang
论坛版主
论坛版主
  • 注册日期2001-04-25
  • 最后登录2013-04-29
  • 粉丝3
  • 关注1
  • 积分92分
  • 威望11点
  • 贡献值0点
  • 好评度9点
  • 原创分1分
  • 专家分0分
地板#
发布于:2001-06-11 23:06
我再在这里给大家提供一个非正规,但是却颇有趣的方法。
你编译驱动程序的时候,让sys生成一个lib,输出一个函数,
于是两个driver之间就可以互相调用,不要说传递一个event,
传递什么东西都可以了。
不再回忆从前,我已经生活在幸福当中。
wangbo
驱动牛犊
驱动牛犊
  • 注册日期2001-06-11
  • 最后登录2002-07-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2001-06-21 11:41
请教 softice兄:
  
   我在2000DDK文档里只找到了
ObReferenceObjectByHandle
ObReferenceObjectByPointer
ObReferenceObject三个函数
就是没有找到你说的  ObReferenceObjectByName
为什么呀?急!
 
神仙?妖怪? 谢谢!
dazzy
驱动中牛
驱动中牛
  • 注册日期2001-03-23
  • 最后登录2008-08-12
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望10点
  • 贡献值1点
  • 好评度10点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2001-06-21 12:45
NTSYSAPI
NTSTATUS NTAPI ObReferenceObjectByName(
IN PUNICODE_STRING  ObjectPath,
IN ULONG Attribute,  
IN PACCESS_STATE PassedAccess OPTIONAL,
IN POBJECT_TYPE ObjectType,
IN KPROCESSOR_MODE AccessMode,
IN OUT PVOID Context OPTIONAL,
OUT PVOID *PObject
);
wangbo
驱动牛犊
驱动牛犊
  • 注册日期2001-06-11
  • 最后登录2002-07-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2001-06-21 13:36
多谢dazzy
   那里有参数的说明呀?我想找到这个函数的文档!
神仙?妖怪? 谢谢!
wangbo
驱动牛犊
驱动牛犊
  • 注册日期2001-06-11
  • 最后登录2002-07-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2001-06-21 14:00
已经找到了,多谢
神仙?妖怪? 谢谢!
beyoar1
驱动牛犊
驱动牛犊
  • 注册日期2010-03-09
  • 最后登录2010-07-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望71点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2010-04-06 17:38
引用第7楼wangbo于2001-06-21 14:00发表的  :
已经找到了,多谢

这是个未公开的函数,你能找到文档?
tonyfirst1
驱动牛犊
驱动牛犊
  • 注册日期2008-02-26
  • 最后登录2010-08-06
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望138点
  • 贡献值1点
  • 好评度14点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2010-04-12 16:16
只要驱动A知道驱动B的事件地址即可。

用IOCTRL通知一下驱动B,驱动A的事件指针。

PS:内核空间驱动A、B公用,所以完全可以这样做。
游客

返回顶部