阅读:5145回复:6
关于openEvent打开内核创建的Event,请高手指点
在用户态用OpentEvent函数打开一个在内核态创建的事件(Event),总是打开失败,不知道其中的什么原因。
代码如下: InitializeObjectAttributes(&oa,&Str,0,NULL,NULL); status = ZwCreateEvent(&hEvent,EVENT_ALL_ACCESS,&oa,SynchronizationEvent,FALSE); 不知道其中哪里有问题,是不是初始化对象oa的时候有点问题??我不确定...如果是,应该怎么修改 |
|
沙发#
发布于:2007-01-17 11:32
OpenEvent()的参数可能不对
![]() 我以前只能使用SYNCHRONIZE打开,其它全部失败. |
|
板凳#
发布于:2007-01-17 12:45
OpenEvent参数只有三个,而且第一个参数MSDN上说只能用EVENT_ALL_ACCESS。第二个是否允许继承,第三个是打开的事件名,应该没有错吧。
现在我把事件的创建放在用户线程,然后再把handle传给驱动,驱动在通过handle得到指针。这样也还能work,勉强凑合着先用。搜到一篇文章说在内核态创建的event安全描述符得设置正确,但是确没有具体提到。海~ |
|
地板#
发布于:2007-01-17 22:45
注意在创建event的时候的security descriptor,如果你在driverentry里面创建,那么event将继承system的security descriptory用户模式的进程只有在system账户下的才能打开,即使打开也只能查询状态不能修改,当然你可以在kernel修改event的security descriptor,不过太麻烦了。。。
|
|
地下室#
发布于:2007-01-18 15:23
内核程序:
RtlInitUnicodeString(&uszProcessEventString,L"\\BaseNamedObjects\\test"); hProcessEvent = IoCreateNotificationEvent (&uszProcessEventString, hProcessHandle); 用户程序: m_hEvent = ::OpenEvent(SYNCHRONIZE, FALSE, "test"); 应该这样就可以了 |
|
5楼#
发布于:2007-01-19 22:21
非常感谢四楼!
关于使用RtlInitUnicodeString(&uszProcessEventString,L"\\BaseNamedObjects\\test"); hProcessEvent = IoCreateNotificationEvent (&uszProcessEventString, hProcessHandle); 在驱动中创建事件且在应用程序中试图使用CreateEvent打开但被拒绝的问题,我也是发愁了2个多小时了。在四楼的指点下,解决了。 |
|
6楼#
发布于:2007-01-19 23:08
能不能顺便问一下NotificationEvent和Event有什么区别呢?creatEvent也可以设置成Notification的,那为什么又要有一个NotificationEvent
|
|