阅读:1668回复:9
命名事件是怎么释放的?
驱动程序用IoCreateNotificationEvent创建一个命名事件。
应用程序用OpenEvent打开这个命名事件,等待这些操作都正常进行。 不过当我关闭这个应用程序后,问题就来了。我再打开这个应用程序,再也打不开那个命名事件了,好像已经被释放。 哪位大侠可以解释以下了。谢谢了 [编辑 - 1/17/03 by square] [编辑 - 1/17/03 by square] |
|
沙发#
发布于:2003-01-17 14:59
Maybe you need explicitly reference the event in your driver
|
|
板凳#
发布于:2003-01-17 19:41
试了以下调用ObReferenceObject这个函数,没有什么效果
应用程序一关掉。再也打不开那个事件了。 |
|
地板#
发布于:2003-01-18 02:12
Use winobj to see whether your event object is still there
|
|
地下室#
发布于:2004-09-10 16:37
我也遇到了相同的问题。。。
有什么办法解决吗??? |
|
5楼#
发布于:2004-09-10 19:46
在驱动UNLOADER的时候再ZWCLOSE,OBDEREFERENCEOBJECT
|
|
|
6楼#
发布于:2004-09-10 19:48
还有事件最好在应用层创建,在驱动层打开,然后应用用句柄,驱动用指针进行通信.
|
|
|
7楼#
发布于:2004-09-11 11:31
去年做的现在差不多都忘关了 好像是这个事件的创建是由应用程序调用驱动程序的接口创建,在应用程序退出后,这个事件就被释放了。 因此最好在驱动程序里面自己创建,这样应用程序就可以打开这个事件关闭后还可以继续打开。 不过创建这个事件驱动程序初始化的时候创建不能成功,得等到WIN32系统初始化完成后才能创建成功。那就不断的创建直到创建成功。 |
|
8楼#
发布于:2004-09-12 12:11
创建不成功是指在boot过程中创建吗?比如驱动是自动加载的,在AddDevice或DriverEntry中不成功吗?如果是这样当然是正确的,因为哪个时候的命名空间还没有OK |
|
|
9楼#
发布于:2004-09-13 11:03
正文
Q: 请问有什么方法实现驱动程序主动和应用程序进行实时通讯,而不用应用程序采用定时查询的方法? 比如驱动有一事件发生需要立即通知应用程序,或驱动程序需要向应用程序读取一些内容. A: 有一个很容易的方式,在驱动程序和应用程序之间用一个事件。 在应用程序CreateFile的时候,驱动程序IoCreateSynchronizationEvent一个有名的事件,然后应用程序CreateEvent/OpenEvent此有名事件即可。 注意点: 1,不要在驱动初始化的时候创建事件,此时大多不能成功创建; 2,让驱动先创建,那么此后应用程序打开时,只能读(Waitxxxx),不能写(SetEvent/ResetEvent)。反之,如果应用程序先创建,则应用程序和驱动程序都有读写权限; 3,用名字比较理想,注意驱动中名字在\BaseNamedObjects\下,例如应用程序用“xxxEvent”,那么驱动中就是“\BaseNamedObjects\xxxEvent”; 4,用HANDLE的方式也可以,但是在WIN98下是否可行,未知。 5,此后,驱动对读请求应立即返回,否则就返回失败。不然将失去用事件通知的意义(不再等待读完成,而是有需要(通知事件)时才会读); 6,应用程序发现有事件,应该在一个循环中读取,直到读取失败,表明没有数据可读;否则会漏掉后续数据,而没有及时读取; |
|
|