阅读:5214回复: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); 返回总是失败,为什么? |
|
最新喜欢:![]()
|
沙发#
发布于:2004-09-23 15:42
看你说的那么认真,我有点怀疑我自己了。是不是我们说的不是同一个东西。 这段程序我调不通啊,一执行RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer,&hEvent,4);就蓝屏,是不是应该RtlCopyMemory(&(Irp->AssociatedIrp.SystemBuffer),&hEvent,4);这样啊。 |
|
板凳#
发布于:2002-05-14 14:53
〉〉驱动创的HANDLE实际上就在当前进程句柄表里
--------------------------------------------------- 你没注意到这句话,或是我没说清楚吧,呵呵。在使用EVENT的PROCESS context中创的HANDLE就在这个进程的句柄表里,经检验没有权限限制,可以由应用直接使用;而在system context中创建的HANDLE当然就在SYSTEM进程里啦,若单单传句柄值给应用,而句柄表里根本就没有对应的句柄,当然不成功了。解决的办法之一是ZwDuplicateObject;另一个办法是驱动中ZwOpenEvent,有了句柄再告诉应用程序就成了。我验证了一下,工作得很好。 |
|
地板#
发布于:2002-05-13 21:26
确认过了,如你所述。
成为问题的只有一点,就是如果EVENT是在PROCESS context里做的,那么没有问题。如果EVENT在system context下做的,就不行。 前面我的说法太武断了,lU0说的时候也带了SYSTEM CONTEXT, 我做的时候也利用SYSTEM CONTEXT. 花些功夫再次澄清一个问题,也算收获,多谢。 |
|
地下室#
发布于:2002-05-13 18:04
看你说的那么认真,我有点怀疑我自己了。是不是我们说的不是同一个东西。
这个简单程序的确运行好好的呀: void ppppp(PVOID event) { KeWaitForSingleObject((PKEVENT)event,Executive,UserMode,0,0); //......验证处 } ...... WCHAR wEventNameBuf[]=L\"\\\\BaseNamedObjects\\\\SharedEvent\"; UNICODE_STRING uEventName; PKEVENT pEvent; HANDLE hEvent,hThread; ...... case IOCTL_******: RtlInitUnicodeString(&uEventName,wEventNameBuf); pEvent = IoCreateNotificationEvent(&uEventName,&hEvent); KeResetEvent(pEvent); RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer,&hEvent,4); PsCreateSystemThread(&hThread,THREAD_ALL_ACCESS,0,0,0,ppppp,pEvent); 应用中: if(!DeviceIoControl(hDevice,IOCTL_******,0,0,&Handle,4,&Bytes,0)) MessageBox(\"DeviceIo Error!\"); esle{ wsprintf(str,\"%x,%x,%x\",hDevice,Bytes,Handle); MessageBox(str); if(!SetEvent((HANDLE)Handle)) ...... } 点击MessageBox OK后ppppp的确继续执行了。 内部版本号:2195 SP2 |
|
5楼#
发布于:2002-05-13 17:12
老兄, 我真的快相信了.
能否把SOURCE贴出来让咱也帮着测试一下? 不相干的删除就是. 只是想确认一下这一点本身. 我做过KERNEL <-> USER0 CHANNEL级的通讯, 各种可能性都测试过的. 结论是不行. 如果这样可以,真就省事了. 这个站上以前的贴子里LU0 也回答过这个问题.不是这个样子. W2K的版本也请教一下. 该有的版本我都能找到. 当然不能排除你通过程序改变PROCESS 的TOKEN. 自己升级到权限足够高,当然也就行了. 看看SOURCE如何? |
|
6楼#
发布于:2002-05-13 16:48
我找了另一台非开发的2000机器又试了一试,还是行。
难道我装的2000光盘有问题?呵呵 |
|
7楼#
发布于:2002-05-13 16:00
你八成改过系统的SECURITY POLICY. 比如给ADMINSTRATORS ( AS part of OS)的权限了.
一般系统上不会这样做的.换台你没有用过的非开发的机器就不能重复了. [编辑 - 5/13/02 by zdhe] |
|
8楼#
发布于:2002-05-13 15:53
让应用程序改变Driver创建的Event的状态
---------------------------------------------------------- 我试过了,上面的方法在我的2000上可以在应用中唤醒驱动中挂起的线程。 |
|
9楼#
发布于:2002-05-13 14:40
如何察看我得到的事件句柄HANDLE是正确的
------------------------------------------------------ 内核调试器里看就行了,自己写程序也行。还有不少工具可用 |
|
10楼#
发布于:2002-05-13 14:28
哦,我用的是NT4.0
能否让应用程序改变Driver创建的Event的状态?我需要在应用程序中唤醒驱动程序中的线程。 |
|
|
11楼#
发布于:2002-05-13 14:24
咦?我试怎么行呀。我在应用里随意Set、Reset呀,而且在应用里WaitForSingleObject也照。难道我的2000这么有个性?
|
|
12楼#
发布于:2002-05-13 14:12
KERNEL里做出来的EVENT, DEFAULT 在USER MODE你只有WAIT的权限.
|
|
13楼#
发布于:2002-05-13 14:08
pjf, 我试过你的简单方法了,结果在应用程序调用SetEvent时,返回失败,错误代码为ERROR_ACCESS_DENIED。
你确信这样行得通吗?我如何察看我得到的事件句柄HANDLE是正确的? |
|
|
14楼#
发布于:2002-05-13 13:36
为何GetSecurityInfo失败还未去看,不过使用EVENT句柄有更简单的办法:驱动创的HANDLE实际上就在当前进程句柄表里,直接将IoCreateNotificationEvent(&uEventName,&hEvent)中的hEvent传给应用程序即可使用了,我查看了一下该句柄的掩码,与在应用中创建的EVENT句柄无异。根本不用OpenEvent,呵呵。
|
|
15楼#
发布于: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.\"); 哪位大侠帮我看看,事情很急!!! 拜托拜托。 |
|
|
16楼#
发布于:2002-04-18 12:43
你可以通过GetSecurityInfo、SetEntriesInAcl与SetSecurityInfo这些API来修改对象的ACE
很简单,具体你去看看MSDN吧 |
|
17楼#
发布于:2002-04-18 10:36
内核创建的event的缺省权限不允许用户态程序以EVENT_ALL_ACCESS方式打开,如果你使用event做同步用,SYNCHRONIZE访问权限够用了. 那如果我想要有对这个驱动程序创建的EVENT对象的MODIFY权限应该怎么做?能实现吗? |
|
|
18楼#
发布于:2002-04-16 13:47
内核创建的event的缺省权限不允许用户态程序以EVENT_ALL_ACCESS方式打开,如果你使用event做同步用,SYNCHRONIZE访问权限够用了.
如果你想知道用户对这个事件的访问权限,你可以使用WinObj(from www.sysinternals.com)来察看 |
|
19楼#
发布于:2002-04-16 11:21
有试过WMI吗?
试试WmiFireEvent |
|
|
上一页
下一页