zdhe
驱动太牛
驱动太牛
  • 注册日期2001-12-26
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分72362分
  • 威望362260点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
20楼#
发布于: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分
21楼#
发布于:2002-05-13 16:48
我找了另一台非开发的2000机器又试了一试,还是行。
难道我装的2000光盘有问题?呵呵
zdhe
驱动太牛
驱动太牛
  • 注册日期2001-12-26
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分72362分
  • 威望362260点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
22楼#
发布于: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分
23楼#
发布于: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分
  • 社区居民
24楼#
发布于: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分
25楼#
发布于:2002-05-14 14:53
〉〉驱动创的HANDLE实际上就在当前进程句柄表里
---------------------------------------------------
你没注意到这句话,或是我没说清楚吧,呵呵。在使用EVENT的PROCESS context中创的HANDLE就在这个进程的句柄表里,经检验没有权限限制,可以由应用直接使用;而在system context中创建的HANDLE当然就在SYSTEM进程里啦,若单单传句柄值给应用,而句柄表里根本就没有对应的句柄,当然不成功了。解决的办法之一是ZwDuplicateObject;另一个办法是驱动中ZwOpenEvent,有了句柄再告诉应用程序就成了。我验证了一下,工作得很好。
cicada
驱动小牛
驱动小牛
  • 注册日期2003-12-09
  • 最后登录2008-07-11
  • 粉丝1
  • 关注0
  • 积分74分
  • 威望15点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
26楼#
发布于: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);这样啊。

上一页 下一页
游客

返回顶部