阅读:5211回复:26
内核创建的命名事件对象为什么应用程序打不开?
我在内核创建了命名事件对象,然后在应用程序右试图用OpenEvent得到其句柄,失败。
相关代码如下: 驱动程序端: WCHAR wEventNameBuf[]=L\"\\\\BaseNamedObjects\\\\SharedEvent\"; UNICODE_STRING uEventName; PKEVENT pEvent; HANDLE hEvent; RtlInitUnicode(&uEventName,wEventNameBuf); pEvent = IoCreateNotificationEvent(&uEventName,&hEvent); if( !pEvent ) return FALSE; 应用程序端: TCHAR EventName[]=_T(\"SharedEvent\"); HANDLE hEvent; hEvent = OpEvent(EVENT_ALL_ACCESS,FALSE,EventName); 返回总是失败,为什么? |
|
最新喜欢:![]()
|
沙发#
发布于:2002-04-15 17:08
用户被禁言,该主题自动屏蔽! |
|
板凳#
发布于:2002-04-15 17:14
我试过用驱动程序创建Event,用应用程序引用,这样不行。我记得有本书也说过。 DDK文档中说,NT4.0及以上的版本才支持这种在应用程序和驱动程序之间共享命名事件,DriverWorks文档中也有如此一说。按理来说应该是完全可以的,为什么就不行呢? |
|
|
地板#
发布于:2002-04-15 17:53
用户被禁言,该主题自动屏蔽! |
|
地下室#
发布于:2002-04-15 18:11
因为在SYSTEM CONTEXT中建立的这些KERNELOBJECT 的SECURITY ATTRIBUTE不允许USER MODE打开. 否则, 你用HANDLE看一下系统的EVENT LIST, 然后就可以随意改变系统的控制流程了.
在多SESSION的计算机环境下(WTS或者XP), 不同SESSION之间的OBJECT也是同样. 即使这些OBJEC是GLOBAL\\ 做的. 如果你想让不同SESSION的可以彼此打开对方的有名EVENT, 在创建时,必须把SECURITY_ATTRIBUTE 设置好.用DEFAULT 的NULL不行. 如果你有足够的精力,可以设法先修改SYSTEM PROCESS 的DACL,CACL, 由此做出的OBJECT SECURITY属性也就跟着变了. 这样或许可以实现你的目的. 但是如此一来算是把WINDOWS的SECURITYSYSTEM 给搞掉了, 别的PROCESS 的一个简单的错误或许能使系统崩溃. 有一种懒方法, 你做一个单独的DRIVER, 他只接受一个DEVICEIOCONTROL, 你可以在KERNEL OPEN 并且WAIT 你的EVENT对象, 我最开始的版本就是如此偷懒的. |
|
5楼#
发布于:2002-04-15 18:49
用户被禁言,该主题自动屏蔽! |
|
6楼#
发布于:2002-04-16 08:53
Try this:
hEvent=OpenEvent(SYNCHRONIZE, FALSE, EVENT_NAME); EVENT_NAME为你的事件名 没有什么不行的,我一直都这么做的 |
|
|
7楼#
发布于:2002-04-16 09:44
To ymvv:
我原来的用法如下: hEvent = OpEvent(EVENT_ALL_ACCESS,FALSE,EventName); 将第一个参数改为SYNCHRONIZE成功通过,不过你能告诉我为什么吗?用EVENT_ALL_ACCESS或其它参数为什么不行?哪里有相关的文档描述? |
|
|
8楼#
发布于:2002-04-16 11:21
有试过WMI吗?
试试WmiFireEvent |
|
|
9楼#
发布于:2002-04-16 13:47
内核创建的event的缺省权限不允许用户态程序以EVENT_ALL_ACCESS方式打开,如果你使用event做同步用,SYNCHRONIZE访问权限够用了.
如果你想知道用户对这个事件的访问权限,你可以使用WinObj(from www.sysinternals.com)来察看 |
|
10楼#
发布于:2002-04-18 10:36
内核创建的event的缺省权限不允许用户态程序以EVENT_ALL_ACCESS方式打开,如果你使用event做同步用,SYNCHRONIZE访问权限够用了. 那如果我想要有对这个驱动程序创建的EVENT对象的MODIFY权限应该怎么做?能实现吗? |
|
|
11楼#
发布于:2002-04-18 12:43
你可以通过GetSecurityInfo、SetEntriesInAcl与SetSecurityInfo这些API来修改对象的ACE
很简单,具体你去看看MSDN吧 |
|
12楼#
发布于:2002-05-13 10:48
你可以通过GetSecurityInfo、SetEntriesInAcl与SetSecurityInfo这些API来修改对象的ACE
很简单,具体你去看看MSDN吧 ---------------------------------------------------------- 这样行吗?我用GetSecurityInfo了,但返回失败,说 ERROR_ACCESS_DENIED。我的源代码为 PACL pAcl; PSECURITY_DESCRIPTOR pSd; DWORD returnValue; hEvent=OpenEvent(SYNCHRONIZE, FALSE, \"ThreadEvent\"); if(hEvent==NULL) { MessageBox(\"Can\'t Open Event.\"); return; } else MessageBox(\"OpenEvent OK.\"); ///Get security info returnValue=GetSecurityInfo(hEvent, SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, &pAcl, NULL, &pSd); if(returnValue!=ERROR_SUCCESS) { MessageBox(\"GetNamedSecutiryInfo failed.\"); return; } else MessageBox(\"GetNamedSecurityInfo OK.\"); 哪位大侠帮我看看,事情很急!!! 拜托拜托。 |
|
|
13楼#
发布于:2002-05-13 13:36
为何GetSecurityInfo失败还未去看,不过使用EVENT句柄有更简单的办法:驱动创的HANDLE实际上就在当前进程句柄表里,直接将IoCreateNotificationEvent(&uEventName,&hEvent)中的hEvent传给应用程序即可使用了,我查看了一下该句柄的掩码,与在应用中创建的EVENT句柄无异。根本不用OpenEvent,呵呵。
|
|
14楼#
发布于:2002-05-13 14:08
pjf, 我试过你的简单方法了,结果在应用程序调用SetEvent时,返回失败,错误代码为ERROR_ACCESS_DENIED。
你确信这样行得通吗?我如何察看我得到的事件句柄HANDLE是正确的? |
|
|
15楼#
发布于:2002-05-13 14:12
KERNEL里做出来的EVENT, DEFAULT 在USER MODE你只有WAIT的权限.
|
|
16楼#
发布于:2002-05-13 14:24
咦?我试怎么行呀。我在应用里随意Set、Reset呀,而且在应用里WaitForSingleObject也照。难道我的2000这么有个性?
|
|
17楼#
发布于:2002-05-13 14:28
哦,我用的是NT4.0
能否让应用程序改变Driver创建的Event的状态?我需要在应用程序中唤醒驱动程序中的线程。 |
|
|
18楼#
发布于:2002-05-13 14:40
如何察看我得到的事件句柄HANDLE是正确的
------------------------------------------------------ 内核调试器里看就行了,自己写程序也行。还有不少工具可用 |
|
19楼#
发布于:2002-05-13 15:53
让应用程序改变Driver创建的Event的状态
---------------------------------------------------------- 我试过了,上面的方法在我的2000上可以在应用中唤醒驱动中挂起的线程。 |
|
上一页
下一页