阅读:6204回复:27
驱动在棺材里睡死了.KeWaitForSingleObject后再也起不来.
这是一个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); } } |
|
沙发#
发布于:2007-01-30 22:53
路过。楼主的比喻学得不错
|
|
|
板凳#
发布于:2007-01-30 23:00
你别见死不救啊..
555.... |
|
地板#
发布于:2007-01-31 11:15
路过~飘过~
|
|
|
地下室#
发布于:2007-01-31 11:17
严重提醒不要使用KeClearEvent(&Event);
|
|
|
5楼#
发布于:2007-01-31 11:18
如果你还要用那个事件就不要用那个Clear,要其它手段~如果你不需要那个event了,那你应该在thread里判断下~
|
|
|
6楼#
发布于:2007-01-31 11:20
重设event要用KeResetEvent的说,无奈了~
|
|
|
7楼#
发布于:2007-01-31 13:00
首先,我要大声宣布,我从现在起爱上
killvxk老大 了 ![]() .... KeResetEvent和KeClearEvent在WDK Document中的说明就一句 KeC是清除信号但不返回之前值,KeR是清除但返回之前值 难道Microsoft骗人? killvxk老大能否解释下具体的原因? 那现在置事件为无信号使用KeResetEvent对吗? |
|
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); } |
|
9楼#
发布于:2007-01-31 14:10
我觉得问题是不是在这?
//清除信号量 KeResetEvent(&irpEvent); return IoCallDriver(devExt->NLExtHeader.AttachedToDeviceObject, Irp); 这句会导致return前主线程休眠了? 那我是否可以放到完成例程里去? |
|
10楼#
发布于:2007-01-31 14:11
我等待的方法和你不一样~
|
|
|
11楼#
发布于:2007-01-31 14:25
killvxk
可以告诉我你的方法吗?我知道这种行为不好.但是我真的是束手无策了. 现在工作线程是正常睡眠正常唤醒.而主线程则是不正常的. |
|
12楼#
发布于:2007-01-31 17:48
有没有人来救救我啊?
|
|
13楼#
发布于:2007-01-31 22:39
引用第4楼killvxk于2007-01-31 11:17发表的“”: 同意。。。 打强心针就能起来了。。。 |
|
|
14楼#
发布于:2007-02-01 00:29
我在后面的代码使用了
KeResetEvent(&irpEvent);后工作线程是正常的,但是主线程的等待唤醒不了。 请楼上的大大和老V大大帮忙!!! |
|
15楼#
发布于:2007-02-01 09:41
别用什么EVENT了,自己设置块内存,轮巡访问吧,自己的东西好控制,那些同步什么的最麻烦,大不了自己用什么CMPXCHG系列的指令自己来处理.
![]() |
|
|
16楼#
发布于:2007-02-01 10:27
KeInitializeEvent( &Event, SynchronizationEvent , FALSE );
修改为KeInitializeEvent( &Event, NotificationEvent , FALSE ); |
|
|
17楼#
发布于:2007-02-01 10:37
哈,AllenZh一语道破~我今天也短消息给LZ说了~
|
|
|
18楼#
发布于:2007-02-01 12:32
使用
KeInitializeEvent( &Event, NotificationEvent , FALSE ); KeInitializeEvent( &irpEvent, NotificationEvent , FALSE ); 失败了。依然 使用老V老大短信说的。也依然失败了。。唤醒不了。 |
|
|
19楼#
发布于:2007-02-01 12:46
![]() |
|
|
上一页
下一页