Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:5211回复: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
Tom.Cat
禁止发言
禁止发言
  • 注册日期2001-10-10
  • 最后登录2019-07-29
  • 粉丝1
  • 关注0
  • 积分-53792分
  • 威望197411点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2002-04-15 17:08
用户被禁言,该主题自动屏蔽!
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-04-15 17:14
我试过用驱动程序创建Event,用应用程序引用,这样不行。我记得有本书也说过。
后来,改用应用程序创建,驱动程序引用,就行。

    DDK文档中说,NT4.0及以上的版本才支持这种在应用程序和驱动程序之间共享命名事件,DriverWorks文档中也有如此一说。按理来说应该是完全可以的,为什么就不行呢?
Tom_lyd
Tom.Cat
禁止发言
禁止发言
  • 注册日期2001-10-10
  • 最后登录2019-07-29
  • 粉丝1
  • 关注0
  • 积分-53792分
  • 威望197411点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2002-04-15 17:53
用户被禁言,该主题自动屏蔽!
zdhe
驱动太牛
驱动太牛
  • 注册日期2001-12-26
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分72362分
  • 威望362260点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
地下室#
发布于: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对象, 我最开始的版本就是如此偷懒的.
Tom.Cat
禁止发言
禁止发言
  • 注册日期2001-10-10
  • 最后登录2019-07-29
  • 粉丝1
  • 关注0
  • 积分-53792分
  • 威望197411点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2002-04-15 18:49
用户被禁言,该主题自动屏蔽!
ymvv
驱动牛犊
驱动牛犊
  • 注册日期2001-11-30
  • 最后登录2005-05-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-04-16 08:53
Try this:

hEvent=OpenEvent(SYNCHRONIZE, FALSE, EVENT_NAME);

EVENT_NAME为你的事件名

没有什么不行的,我一直都这么做的
没有你,我不知道怎么办...
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-04-16 09:44
To ymvv:
   我原来的用法如下:
hEvent = OpEvent(EVENT_ALL_ACCESS,FALSE,EventName);
将第一个参数改为SYNCHRONIZE成功通过,不过你能告诉我为什么吗?用EVENT_ALL_ACCESS或其它参数为什么不行?哪里有相关的文档描述?

Tom_lyd
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于: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]
icube
驱动牛犊
驱动牛犊
  • 注册日期2002-04-11
  • 最后登录2004-12-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-04-16 13:47
内核创建的event的缺省权限不允许用户态程序以EVENT_ALL_ACCESS方式打开,如果你使用event做同步用,SYNCHRONIZE访问权限够用了.
如果你想知道用户对这个事件的访问权限,你可以使用WinObj(from www.sysinternals.com)来察看
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-04-18 10:36
内核创建的event的缺省权限不允许用户态程序以EVENT_ALL_ACCESS方式打开,如果你使用event做同步用,SYNCHRONIZE访问权限够用了.
如果你想知道用户对这个事件的访问权限,你可以使用WinObj(from www.sysinternals.com)来察看

那如果我想要有对这个驱动程序创建的EVENT对象的MODIFY权限应该怎么做?能实现吗?
Tom_lyd
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-04-18 12:43
你可以通过GetSecurityInfo、SetEntriesInAcl与SetSecurityInfo这些API来修改对象的ACE
很简单,具体你去看看MSDN吧
ymvv
驱动牛犊
驱动牛犊
  • 注册日期2001-11-30
  • 最后登录2005-05-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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.\");


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

没有你,我不知道怎么办...
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
13楼#
发布于: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分
14楼#
发布于:2002-05-13 14:08
pjf, 我试过你的简单方法了,结果在应用程序调用SetEvent时,返回失败,错误代码为ERROR_ACCESS_DENIED。

你确信这样行得通吗?我如何察看我得到的事件句柄HANDLE是正确的?
没有你,我不知道怎么办...
zdhe
驱动太牛
驱动太牛
  • 注册日期2001-12-26
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分72362分
  • 威望362260点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
15楼#
发布于:2002-05-13 14:12
KERNEL里做出来的EVENT, DEFAULT 在USER MODE你只有WAIT的权限.
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2002-05-13 14:24
咦?我试怎么行呀。我在应用里随意Set、Reset呀,而且在应用里WaitForSingleObject也照。难道我的2000这么有个性?
ymvv
驱动牛犊
驱动牛犊
  • 注册日期2001-11-30
  • 最后登录2005-05-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于: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分
18楼#
发布于:2002-05-13 14:40
如何察看我得到的事件句柄HANDLE是正确的
------------------------------------------------------

内核调试器里看就行了,自己写程序也行。还有不少工具可用
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2002-05-13 15:53
让应用程序改变Driver创建的Event的状态
----------------------------------------------------------
我试过了,上面的方法在我的2000上可以在应用中唤醒驱动中挂起的线程。
上一页
游客

返回顶部