Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:5214回复:26

内核创建的命名事件对象为什么应用程序打不开?

楼主#
更多 发布于:2002-04-15 16:36
我在内核创建了命名事件对象,然后在应用程序右试图用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);

返回总是失败,为什么?



最新喜欢:

cb615cbcb615c...
Tom_lyd
cicada
驱动小牛
驱动小牛
  • 注册日期2003-12-09
  • 最后登录2008-07-11
  • 粉丝1
  • 关注0
  • 积分74分
  • 威望15点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-09-23 15:42
看你说的那么认真,我有点怀疑我自己了。是不是我们说的不是同一个东西。
这个简单程序的确运行好好的呀:
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


这段程序我调不通啊,一执行RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer,&hEvent,4);就蓝屏,是不是应该RtlCopyMemory(&(Irp->AssociatedIrp.SystemBuffer),&hEvent,4);这样啊。

pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-05-14 14:53
〉〉驱动创的HANDLE实际上就在当前进程句柄表里
---------------------------------------------------
你没注意到这句话,或是我没说清楚吧,呵呵。在使用EVENT的PROCESS context中创的HANDLE就在这个进程的句柄表里,经检验没有权限限制,可以由应用直接使用;而在system context中创建的HANDLE当然就在SYSTEM进程里啦,若单单传句柄值给应用,而句柄表里根本就没有对应的句柄,当然不成功了。解决的办法之一是ZwDuplicateObject;另一个办法是驱动中ZwOpenEvent,有了句柄再告诉应用程序就成了。我验证了一下,工作得很好。
zdhe
驱动太牛
驱动太牛
  • 注册日期2001-12-26
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分72362分
  • 威望362260点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2002-05-13 21:26
确认过了,如你所述。
成为问题的只有一点,就是如果EVENT是在PROCESS context里做的,那么没有问题。如果EVENT在system context下做的,就不行。
前面我的说法太武断了,lU0说的时候也带了SYSTEM CONTEXT, 我做的时候也利用SYSTEM CONTEXT. 花些功夫再次澄清一个问题,也算收获,多谢。
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
地下室#
发布于: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
zdhe
驱动太牛
驱动太牛
  • 注册日期2001-12-26
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分72362分
  • 威望362260点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2002-05-13 17:12
老兄, 我真的快相信了.

能否把SOURCE贴出来让咱也帮着测试一下? 不相干的删除就是. 只是想确认一下这一点本身.

我做过KERNEL <-> USER0 CHANNEL级的通讯, 各种可能性都测试过的. 结论是不行. 如果这样可以,真就省事了. 这个站上以前的贴子里LU0 也回答过这个问题.不是这个样子.

W2K的版本也请教一下. 该有的版本我都能找到.

当然不能排除你通过程序改变PROCESS 的TOKEN. 自己升级到权限足够高,当然也就行了.

看看SOURCE如何?
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-05-13 16:48
我找了另一台非开发的2000机器又试了一试,还是行。
难道我装的2000光盘有问题?呵呵
zdhe
驱动太牛
驱动太牛
  • 注册日期2001-12-26
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分72362分
  • 威望362260点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
7楼#
发布于:2002-05-13 16:00
你八成改过系统的SECURITY POLICY. 比如给ADMINSTRATORS ( AS part of OS)的权限了.

一般系统上不会这样做的.换台你没有用过的非开发的机器就不能重复了.

[编辑 -  5/13/02 by  zdhe]
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-05-13 15:53
让应用程序改变Driver创建的Event的状态
----------------------------------------------------------
我试过了,上面的方法在我的2000上可以在应用中唤醒驱动中挂起的线程。
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-05-13 14:40
如何察看我得到的事件句柄HANDLE是正确的
------------------------------------------------------

内核调试器里看就行了,自己写程序也行。还有不少工具可用
ymvv
驱动牛犊
驱动牛犊
  • 注册日期2001-11-30
  • 最后登录2005-05-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-05-13 14:28
哦,我用的是NT4.0

能否让应用程序改变Driver创建的Event的状态?我需要在应用程序中唤醒驱动程序中的线程。
没有你,我不知道怎么办...
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-05-13 14:24
咦?我试怎么行呀。我在应用里随意Set、Reset呀,而且在应用里WaitForSingleObject也照。难道我的2000这么有个性?
zdhe
驱动太牛
驱动太牛
  • 注册日期2001-12-26
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分72362分
  • 威望362260点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
12楼#
发布于:2002-05-13 14:12
KERNEL里做出来的EVENT, DEFAULT 在USER MODE你只有WAIT的权限.
ymvv
驱动牛犊
驱动牛犊
  • 注册日期2001-11-30
  • 最后登录2005-05-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2002-05-13 14:08
pjf, 我试过你的简单方法了,结果在应用程序调用SetEvent时,返回失败,错误代码为ERROR_ACCESS_DENIED。

你确信这样行得通吗?我如何察看我得到的事件句柄HANDLE是正确的?
没有你,我不知道怎么办...
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-05-13 13:36
为何GetSecurityInfo失败还未去看,不过使用EVENT句柄有更简单的办法:驱动创的HANDLE实际上就在当前进程句柄表里,直接将IoCreateNotificationEvent(&uEventName,&hEvent)中的hEvent传给应用程序即可使用了,我查看了一下该句柄的掩码,与在应用中创建的EVENT句柄无异。根本不用OpenEvent,呵呵。
ymvv
驱动牛犊
驱动牛犊
  • 注册日期2001-11-30
  • 最后登录2005-05-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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.\");


哪位大侠帮我看看,事情很急!!!
拜托拜托。

没有你,我不知道怎么办...
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2002-04-18 12:43
你可以通过GetSecurityInfo、SetEntriesInAcl与SetSecurityInfo这些API来修改对象的ACE
很简单,具体你去看看MSDN吧
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2002-04-18 10:36
内核创建的event的缺省权限不允许用户态程序以EVENT_ALL_ACCESS方式打开,如果你使用event做同步用,SYNCHRONIZE访问权限够用了.
如果你想知道用户对这个事件的访问权限,你可以使用WinObj(from www.sysinternals.com)来察看

那如果我想要有对这个驱动程序创建的EVENT对象的MODIFY权限应该怎么做?能实现吗?
Tom_lyd
icube
驱动牛犊
驱动牛犊
  • 注册日期2002-04-11
  • 最后登录2004-12-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2002-04-16 13:47
内核创建的event的缺省权限不允许用户态程序以EVENT_ALL_ACCESS方式打开,如果你使用event做同步用,SYNCHRONIZE访问权限够用了.
如果你想知道用户对这个事件的访问权限,你可以使用WinObj(from www.sysinternals.com)来察看
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2002-04-16 11:21
有试过WMI吗?
试试WmiFireEvent
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
上一页
游客

返回顶部