liio
驱动小牛
驱动小牛
  • 注册日期2005-12-24
  • 最后登录2022-06-16
  • 粉丝4
  • 关注1
  • 积分24分
  • 威望343点
  • 贡献值0点
  • 好评度171点
  • 原创分0分
  • 专家分0分
  • 社区居民
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

希望大大们给点提示。谢谢。

我努力学习中。
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
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);
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
22楼#
发布于:2007-02-01 13:19
以前使用SynchronizationEvent 出现过问题,使用NotificationEvent 就好了,所以现在就一直偏爱NotificationEvent 了,纯粹是个人喜好,
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分
23楼#
发布于:2007-02-01 13:26
因为Sy那个玩意产生过问题,所以使用Notifi了~

不过只是习惯和风格而已~
哈哈~
没有战争就没有进步 X3工作组 为您提供最好的军火
liio
驱动小牛
驱动小牛
  • 注册日期2005-12-24
  • 最后登录2022-06-16
  • 粉丝4
  • 关注1
  • 积分24分
  • 威望343点
  • 贡献值0点
  • 好评度171点
  • 原创分0分
  • 专家分0分
  • 社区居民
24楼#
发布于:2007-02-01 14:20
感谢几位大大,
AllenZh
killvxk
当然还有wow。感谢你们

我接下来做的是根据截获的IRP取产生这个IRP的线程ID,不知道哪位大大能提示下该怎么做吗?
liio
驱动小牛
驱动小牛
  • 注册日期2005-12-24
  • 最后登录2022-06-16
  • 粉丝4
  • 关注1
  • 积分24分
  • 威望343点
  • 贡献值0点
  • 好评度171点
  • 原创分0分
  • 专家分0分
  • 社区居民
25楼#
发布于:2007-02-01 14:49
不知道是不是Irp->Tail.Overlay.Thread。哈哈
ldljlzw
驱动中牛
驱动中牛
  • 注册日期2002-03-16
  • 最后登录2014-01-02
  • 粉丝1
  • 关注0
  • 积分1021分
  • 威望372点
  • 贡献值0点
  • 好评度187点
  • 原创分0分
  • 专家分0分
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
    );
  得到一个给定事件当前的信号状态.
  返回非零说明是有信号状态;
  返回  零说明是无信号状态;
lwsmile
驱动牛犊
驱动牛犊
  • 注册日期2006-01-02
  • 最后登录2009-02-17
  • 粉丝0
  • 关注0
  • 积分363分
  • 威望40点
  • 贡献值0点
  • 好评度36点
  • 原创分0分
  • 专家分0分
27楼#
发布于:2008-03-12 15:53
虽然是老帖了,可楼上的说的实在太精彩了
上一页 下一页
游客

返回顶部