liio
驱动小牛
驱动小牛
  • 注册日期2005-12-24
  • 最后登录2022-06-16
  • 粉丝4
  • 关注1
  • 积分24分
  • 威望343点
  • 贡献值0点
  • 好评度171点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:6201回复:27

驱动在棺材里睡死了.KeWaitForSingleObject后再也起不来.

楼主#
更多 发布于:2007-01-30 22:49
这是一个Sfilter文件过滤驱动.我在驱动创建时启动了一个线程,该线程不停的激活全局事件EvEnt

在SfCreate函数中等待全局事件被激活,然后处理某些事,处理完后清除信号量KeClearEvent

结果是创建的线程GetPESignContext 激活不了,SfCreate永远的等待,趴棺材里不起来了

在IRP_MJ_CREATE的处理中的代码:


sfCreate
(...)
{
.....省略部分,其实上面没代码


    //上面加判断线城ID
    KeWaitForSingleObject(&Event,Executive,KernelMode,FALSE,(PLARGE_INTEGER)NULL);

    IoSkipCurrentIrpStackLocation(Irp);
//清除信号量
    KeClearEvent(&Event);
    return IoCallDriver(devExt->NLExtHeader.AttachedToDeviceObject, Irp);
}


驱动入口部分代码:

KeInitializeEvent( &Event, SynchronizationEvent , FALSE );

    status = PsCreateSystemThread(
                &threadHandle,
                PROCESS_ALL_ACCESS,
                NULL,
                NULL,        //My system thread,why is system?haha,因为,系统线程只有系统关闭时才结束,
                NULL,
                GetPESignContext,
                NULL
                );


线程函数:

VOID
GetPESignContext (PVOID pContext)
{
    pContext = NULL;

    KeSetPriorityThread (KeGetCurrentThread() ,LOW_REALTIME_PRIORITY);

    while(TRUE)
    {
        KeSetEvent(&Event ,0 ,FALSE);
    }
}
WQXNETQIQI
驱动大牛
驱动大牛
  • 注册日期2006-06-12
  • 最后登录2010-10-26
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望1076点
  • 贡献值0点
  • 好评度895点
  • 原创分1分
  • 专家分0分
沙发#
发布于:2007-01-30 22:53
路过。楼主的比喻学得不错
驱动开发者 呵呵
liio
驱动小牛
驱动小牛
  • 注册日期2005-12-24
  • 最后登录2022-06-16
  • 粉丝4
  • 关注1
  • 积分24分
  • 威望343点
  • 贡献值0点
  • 好评度171点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2007-01-30 23:00
你别见死不救啊..

555....
killvxk
论坛版主
论坛版主
  • 注册日期2005-10-03
  • 最后登录2014-04-14
  • 粉丝3
  • 关注1
  • 积分1082分
  • 威望2003点
  • 贡献值0点
  • 好评度1693点
  • 原创分2分
  • 专家分0分
地板#
发布于:2007-01-31 11:15
路过~飘过~
没有战争就没有进步 X3工作组 为您提供最好的军火
killvxk
论坛版主
论坛版主
  • 注册日期2005-10-03
  • 最后登录2014-04-14
  • 粉丝3
  • 关注1
  • 积分1082分
  • 威望2003点
  • 贡献值0点
  • 好评度1693点
  • 原创分2分
  • 专家分0分
地下室#
发布于:2007-01-31 11:17
严重提醒不要使用KeClearEvent(&Event);
没有战争就没有进步 X3工作组 为您提供最好的军火
killvxk
论坛版主
论坛版主
  • 注册日期2005-10-03
  • 最后登录2014-04-14
  • 粉丝3
  • 关注1
  • 积分1082分
  • 威望2003点
  • 贡献值0点
  • 好评度1693点
  • 原创分2分
  • 专家分0分
5楼#
发布于:2007-01-31 11:18
如果你还要用那个事件就不要用那个Clear,要其它手段~如果你不需要那个event了,那你应该在thread里判断下~
没有战争就没有进步 X3工作组 为您提供最好的军火
killvxk
论坛版主
论坛版主
  • 注册日期2005-10-03
  • 最后登录2014-04-14
  • 粉丝3
  • 关注1
  • 积分1082分
  • 威望2003点
  • 贡献值0点
  • 好评度1693点
  • 原创分2分
  • 专家分0分
6楼#
发布于:2007-01-31 11:20
重设event要用KeResetEvent的说,无奈了~
没有战争就没有进步 X3工作组 为您提供最好的军火
liio
驱动小牛
驱动小牛
  • 注册日期2005-12-24
  • 最后登录2022-06-16
  • 粉丝4
  • 关注1
  • 积分24分
  • 威望343点
  • 贡献值0点
  • 好评度171点
  • 原创分0分
  • 专家分0分
  • 社区居民
7楼#
发布于:2007-01-31 13:00
首先,我要大声宣布,我从现在起爱上
killvxk老大



....  
KeResetEvent和KeClearEvent在WDK Document中的说明就一句

KeC是清除信号但不返回之前值,KeR是清除但返回之前值

难道Microsoft骗人?

killvxk老大能否解释下具体的原因?

那现在置事件为无信号使用KeResetEvent对吗?
liio
驱动小牛
驱动小牛
  • 注册日期2005-12-24
  • 最后登录2022-06-16
  • 粉丝4
  • 关注1
  • 积分24分
  • 威望343点
  • 贡献值0点
  • 好评度171点
  • 原创分0分
  • 专家分0分
  • 社区居民
8楼#
发布于:2007-01-31 13:58
还是不行,唤醒不来。

驱动入口:
KeInitializeEvent( &Event, SynchronizationEvent , FALSE );
    KeInitializeEvent( &irpEvent, SynchronizationEvent , FALSE );

在主线程里:

KeSetEvent(&Event ,0 ,FALSE);
    KeWaitForSingleObject(&irpEvent,Executive,KernelMode,FALSE,(PLARGE_INTEGER)NULL);

    //上面加判断线城ID
    
    DbgPrint("Thread change is : %x",ThreadReturn);
    IoSkipCurrentIrpStackLocation(Irp);

    //清除信号量
    KeResetEvent(&irpEvent);
    return IoCallDriver(devExt->NLExtHeader.AttachedToDeviceObject, Irp);

在工作线程里,需要同步的这个

    while(1)
    {
        //等待事件.
        KeWaitForSingleObject(&Event,Executive,KernelMode,FALSE,(PLARGE_INTEGER)NULL);
        DbgPrint("Thread is active...");
        ThreadReturn = TRUE;
        KeSetEvent(&irpEvent ,0 ,FALSE);
        KeResetEvent(&Event);
    }
liio
驱动小牛
驱动小牛
  • 注册日期2005-12-24
  • 最后登录2022-06-16
  • 粉丝4
  • 关注1
  • 积分24分
  • 威望343点
  • 贡献值0点
  • 好评度171点
  • 原创分0分
  • 专家分0分
  • 社区居民
9楼#
发布于:2007-01-31 14:10
我觉得问题是不是在这?

//清除信号量
   KeResetEvent(&irpEvent);
   return IoCallDriver(devExt->NLExtHeader.AttachedToDeviceObject, Irp);

这句会导致return前主线程休眠了?

那我是否可以放到完成例程里去?
killvxk
论坛版主
论坛版主
  • 注册日期2005-10-03
  • 最后登录2014-04-14
  • 粉丝3
  • 关注1
  • 积分1082分
  • 威望2003点
  • 贡献值0点
  • 好评度1693点
  • 原创分2分
  • 专家分0分
10楼#
发布于:2007-01-31 14:11
我等待的方法和你不一样~
没有战争就没有进步 X3工作组 为您提供最好的军火
liio
驱动小牛
驱动小牛
  • 注册日期2005-12-24
  • 最后登录2022-06-16
  • 粉丝4
  • 关注1
  • 积分24分
  • 威望343点
  • 贡献值0点
  • 好评度171点
  • 原创分0分
  • 专家分0分
  • 社区居民
11楼#
发布于:2007-01-31 14:25
killvxk
可以告诉我你的方法吗?我知道这种行为不好.但是我真的是束手无策了.

现在工作线程是正常睡眠正常唤醒.而主线程则是不正常的.
liio
驱动小牛
驱动小牛
  • 注册日期2005-12-24
  • 最后登录2022-06-16
  • 粉丝4
  • 关注1
  • 积分24分
  • 威望343点
  • 贡献值0点
  • 好评度171点
  • 原创分0分
  • 专家分0分
  • 社区居民
12楼#
发布于:2007-01-31 17:48
有没有人来救救我啊?
xikug
驱动小牛
驱动小牛
  • 注册日期2001-09-25
  • 最后登录2013-09-27
  • 粉丝1
  • 关注0
  • 积分1001分
  • 威望169点
  • 贡献值0点
  • 好评度168点
  • 原创分1分
  • 专家分0分
13楼#
发布于:2007-01-31 22:39
引用第4楼killvxk2007-01-31 11:17发表的“”:
严重提醒不要使用KeClearEvent(&Event);

同意。。。

打强心针就能起来了。。。
http://www.debugman.com
liio
驱动小牛
驱动小牛
  • 注册日期2005-12-24
  • 最后登录2022-06-16
  • 粉丝4
  • 关注1
  • 积分24分
  • 威望343点
  • 贡献值0点
  • 好评度171点
  • 原创分0分
  • 专家分0分
  • 社区居民
14楼#
发布于:2007-02-01 00:29
我在后面的代码使用了

KeResetEvent(&irpEvent);后工作线程是正常的,但是主线程的等待唤醒不了。

请楼上的大大和老V大大帮忙!!!
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
15楼#
发布于:2007-02-01 09:41
别用什么EVENT了,自己设置块内存,轮巡访问吧,自己的东西好控制,那些同步什么的最麻烦,大不了自己用什么CMPXCHG系列的指令自己来处理.
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2007-02-01 10:27
KeInitializeEvent( &Event, SynchronizationEvent , FALSE );
修改为KeInitializeEvent( &Event, NotificationEvent , FALSE );
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
killvxk
论坛版主
论坛版主
  • 注册日期2005-10-03
  • 最后登录2014-04-14
  • 粉丝3
  • 关注1
  • 积分1082分
  • 威望2003点
  • 贡献值0点
  • 好评度1693点
  • 原创分2分
  • 专家分0分
17楼#
发布于:2007-02-01 10:37
哈,AllenZh一语道破~我今天也短消息给LZ说了~
没有战争就没有进步 X3工作组 为您提供最好的军火
liio
驱动小牛
驱动小牛
  • 注册日期2005-12-24
  • 最后登录2022-06-16
  • 粉丝4
  • 关注1
  • 积分24分
  • 威望343点
  • 贡献值0点
  • 好评度171点
  • 原创分0分
  • 专家分0分
  • 社区居民
18楼#
发布于:2007-02-01 12:32
使用
KeInitializeEvent( &Event, NotificationEvent , FALSE );
KeInitializeEvent( &irpEvent, NotificationEvent , FALSE );

失败了。依然

使用老V老大短信说的。也依然失败了。。唤醒不了。
附件名称/大小 下载次数 最后更新
WINFilter.rar (304KB)  30 2007-02-01 12:32
killvxk
论坛版主
论坛版主
  • 注册日期2005-10-03
  • 最后登录2014-04-14
  • 粉丝3
  • 关注1
  • 积分1082分
  • 威望2003点
  • 贡献值0点
  • 好评度1693点
  • 原创分2分
  • 专家分0分
19楼#
发布于:2007-02-01 12:46
无语~
没有战争就没有进步 X3工作组 为您提供最好的军火
上一页
游客

返回顶部