20楼#
发布于:2007-02-01 13:03
killvxk,老大.不好意思.代码顺序错了。
我把错误的地方写上:希望能对以后的人有帮助 KeResetEvent(&irpEvent); 放在KeWaitForSingleObject(&irpEvent,Executive,KernelMode,FALSE,&Time)之后 对于A老大的改法。我之前有试过。好象还是不行。 对于NotificationEvent ,我看DDK上的说明是: NotificationEvent 会让所有等待该事件的线程休眠。 而SynchronizationEvent 则是单一线程吧 SynchronizationEvent 会自动清楚信号等。而NotificationEvent 则不会 为什么A老大和老V都用NotificationEvent 呢。可以让后生我知道吗? 对于内存轮询。总觉得不太好。While(1)循环好象不是效率的好办法 现在同步成功了。谢谢你,谢谢大大门。 感激。 不想发贴。顺便问问。在一个IRP_MJ_CREATE消息中。怎么才能得到发送这个消息的线程的ID 希望大大们给点提示。谢谢。 我努力学习中。 |
|
21楼#
发布于:2007-02-01 13:09
while(1)
{ //等待事件. KeResetEvent(&Event); while(KeWaitForSingleObject(&Event,Executive,KernelMode,FALSE,&Time)==STATUS_TIMEOUT);// //KeWaitForSingleObject(&Event,Executive,KernelMode,FALSE,(PLARGE_INTEGER)NULL); DbgPrint("Thread is active..."); ThreadReturn = TRUE; KeSetEvent(&irpEvent ,0 ,FALSE); } 修改为 KeResetEvent(&Event); while(1) { //等待事件. while(KeWaitForSingleObject(&Event,Executive,KernelMode,FALSE,&Time)==STATUS_TIMEOUT);// KeResetEvent(&Event); //KeWaitForSingleObject(&Event,Executive,KernelMode,FALSE,(PLARGE_INTEGER)NULL); DbgPrint("Thread is active..."); ThreadReturn = TRUE; KeSetEvent(&irpEvent ,0 ,FALSE); } KeResetEvent(&irpEvent); KeSetEvent(&Event ,0 ,FALSE); while(KeWaitForSingleObject(&irpEvent,Executive,KernelMode,FALSE,&Time)==STATUS_TIMEOUT);// 修改为 KeSetEvent(&Event ,0 ,FALSE); while(KeWaitForSingleObject(&irpEvent,Executive,KernelMode,FALSE,&Time)==STATUS_TIMEOUT);// KeResetEvent(&irpEvent); |
|
|
22楼#
发布于:2007-02-01 13:19
以前使用SynchronizationEvent 出现过问题,使用NotificationEvent 就好了,所以现在就一直偏爱NotificationEvent 了,纯粹是个人喜好,
![]() |
|
|
23楼#
发布于:2007-02-01 13:26
因为Sy那个玩意产生过问题,所以使用Notifi了~
不过只是习惯和风格而已~ 哈哈~ |
|
|
24楼#
发布于:2007-02-01 14:20
感谢几位大大,
AllenZh killvxk 当然还有wow。感谢你们 我接下来做的是根据截获的IRP取产生这个IRP的线程ID,不知道哪位大大能提示下该怎么做吗? |
|
25楼#
发布于:2007-02-01 14:49
不知道是不是Irp->Tail.Overlay.Thread。哈哈
|
|
26楼#
发布于:2007-02-02 11:10
哈哈,让我来告诉你们吧!
1. VOID KeInitializeEvent(IN PRKEVENT Event, IN EVENT_TYPE Type, IN BOOLEAN State); Type : 事件类型,可以是 NotificationEvent 和 而SynchronizationEvent. NotificationEvent 等待一个IO操作完成.当一个NotificationEvent事件用KeSetEvent设置成信号状态时, 所有等待在该事件上的线程都会开始执行,这是因为此类型事件不会自动清除信号,它 保留信号状态直到你手工用KeResetEvent 或 KeClearEvent 清除这个事件的信号状态. SynchronizationEvent 等待一个IO操作完成.当一个NotificationEvent事件用KeSetEvent设置成信号状态时, 则只能让等待在该事件上的单个线程开始执行,其它会继续等待,这是因为此类型在执 行 KeWaitForMultipleObjects 或 KeWaitForSingleObject 之后会自动清除这个事件 的信号状态, 而不必手工用 KeResetEvent 或 KeClearEvent 清除这个事件的信号状 态. State : 指明事件的信号初始化状态. 当是TRUE 时初始化事件是有信号状态. 当是FALSE时初始化事件是没信号状态. 2. LONG KeSetEvent ( IN PRKEVENT Event, IN KPRIORITY Increment, IN BOOLEAN Wait ); 设置事件为有信号状态. 3. NTSTATUS KeWaitForMultipleObjects ( IN ULONG Count, IN PVOID Object[], IN WAIT_TYPE WaitType, IN KWAIT_REASON WaitReason, IN KPROCESSOR_MODE WaitMode, IN BOOLEAN Alertable, IN PLARGE_INTEGER Timeout OPTIONAL, IN PKWAIT_BLOCK WaitBlockArray OPTIONAL ); 或 NTSTATUS KeWaitForSingleObject ( IN PVOID Object, IN KWAIT_REASON WaitReason, IN KPROCESSOR_MODE WaitMode, IN BOOLEAN Alertable, IN PLARGE_INTEGER Timeout OPTIONAL ); 等待事件信号状态的发生. 4. LONG KeResetEvent ( IN PRKEVENT Event ); 复位一个指定事件到没有信号状态并返回以前这个事件的信号状态. 返回非零说明以前是有信号状态; 返回 零说明以前是无信号状态; 5. VOID KeClearEvent ( IN PRKEVENT Event ); 设置一个指定事件到没有信号状态. 说明: KeResetEvent 和 KeClearEvent 都是设置一个指定事件到没有信号状态, 如果不想得到以前这个事件的信号状态的话用 KeClearEvent 更好. 6. LONG KeReadStateEvent( IN PRKEVENT Event ); 得到一个给定事件当前的信号状态. 返回非零说明是有信号状态; 返回 零说明是无信号状态; |
|
27楼#
发布于:2008-03-12 15:53
虽然是老帖了,可楼上的说的实在太精彩了
|
|
上一页
下一页