阅读:3748回复:9
两个驱动程序如何共享一个Event?
我看了资料,好像通过在两个不同的驱动程序之间共享Event的话,
可以通信,我想思路大概如此: 驱动程序A注册一个Dpc例程,当制定事件发生的时候,Dpc例程就 触发这个时间的处理线程, 而在另外一个驱动程序B,当某件事情发生时,他就发出一个关于 那个事件的信号, 问题是,第一,B如何发出这个信号,才能让A收到呢? 第二,A如何知道这个事件发生了呢? |
|
最新喜欢:txysp
|
沙发#
发布于:2001-05-25 14:20
你可以在其中一个驱动中创建一个命名的事件或信号量(如ZwCreateEvent)。比如\BaseNamedObjects\hook1001。然后在另一个驱动中利用ObReferenceObjectByName找到这个命名对象并得到一个可用的指针。以后两个驱动可以用此共享对象进行同步。如一个驱动调用KeWaitForSingleObject在这个对象上等待,另一个驱动可以通过KeSetEvent唤醒它。其实这种方法不仅限于驱动间通信,驱动和ring3级客户程序间也可利用此法(病毒实时监控就是这样做的)
当然这种方法只适用于NT/2000,WIN9X下则需要变通一下。 |
|
板凳#
发布于:2001-06-02 10:11
ntddk里把这个问题说得清清楚楚,只不过你没有看罢了,我昨天试了一下,果然很有意思!!
大概相关的函数是:ExRegisterCallback(),顺着这个线索你一定会找到答案的!! RtlInitializeUnicodeString() ExIninitialAttributes() ExRgisterCallback() ExNotifyFunction() 名称我实在是记不住,你或许在想那你为什么不查查,嘿,嘿,我上网机器是公用的,而且资料只能发到我的计算机里,我那里的东西,就.. |
|
地板#
发布于:2001-06-11 23:06
我再在这里给大家提供一个非正规,但是却颇有趣的方法。
你编译驱动程序的时候,让sys生成一个lib,输出一个函数, 于是两个driver之间就可以互相调用,不要说传递一个event, 传递什么东西都可以了。 |
|
|
地下室#
发布于:2001-06-21 11:41
请教 softice兄:
我在2000DDK文档里只找到了 ObReferenceObjectByHandle ObReferenceObjectByPointer ObReferenceObject三个函数 就是没有找到你说的 ObReferenceObjectByName 为什么呀?急! |
|
|
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 ); |
|
6楼#
发布于:2001-06-21 13:36
多谢dazzy
那里有参数的说明呀?我想找到这个函数的文档! |
|
|
7楼#
发布于:2001-06-21 14:00
已经找到了,多谢
|
|
|
8楼#
发布于:2010-04-06 17:38
|
|
9楼#
发布于:2010-04-12 16:16
只要驱动A知道驱动B的事件地址即可。
用IOCTRL通知一下驱动B,驱动A的事件指针。 PS:内核空间驱动A、B公用,所以完全可以这样做。 |
|