omo
omo
驱动牛犊
驱动牛犊
  • 注册日期2002-08-07
  • 最后登录2004-11-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1859回复:5

ring0 线程间通信,请老大们进来看看!coolice,欣赏你!

楼主#
更多 发布于:2003-01-11 19:00
我用用IFS写了一个文件扫描器,思路如下:

在IFSMgr Hook住一个文件后,打开它。但是遇到IFS重入问题,看了coolice的解答,用另外线程来打开我想要打开的文件,可以解决此问题。我在另外的VxD中提供了对文件解析的Services等等处理。此时,将hook数据传送给HookedFileProcessThreadProc(线程处理函数),这时设计到一个线程间通信的问题。该如何处理?
如果此时线程正忙于处理第一个Hookedfile,我又该如何处理?
将处理结果返回给HookProc,HookProc将真实的文件IO传向下一个IFS Manager。
在这些过程中我需要注意哪些问题呢?
钱就是驱动,驱动就是钱。
Coolice
驱动小牛
驱动小牛
  • 注册日期2002-11-13
  • 最后登录2003-08-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-01-13 15:22
2000下比较容易些,可以把IRP直接扔给自己的线程处理。
98下可以把参数添加到list或者array,通过事件激活自己的线程处理(list需要互锁访问),线程处理完毕设置完成事件,激活原线程

这种方式的优点是,由于在同一个线程中处理ir,可以省却很多同步操作,缺点是效率不高,代码较多。

98下更推荐的方法是在调用线程中记录线程ID,而不使用独立线程
omo
omo
驱动牛犊
驱动牛犊
  • 注册日期2002-08-07
  • 最后登录2004-11-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-01-13 18:50
coolice老大,我还是没有整明白,如果方便,能联系你吗?什么联系方式都可以。
我用的是Vxd,2000的driver还没有动工。
现在问题出在如果在主线程中通知我的处理线程呢?
我查看了VtoolsD中所有有关Event的函数,如果用Schedule_Evnent的话,那么Event的callback函数就会被VMM调用,接下来该Event消失。仍然不能跑到我的处理线程中去。
如果用Set Event函数,然后在处理线程中用Vwin32_WaitForSignalObject.但Set Event需要传入一个以OpenVxdHandle打开的句柄,但不仅OpenVxdHandle的帮助说不能在Vxd中调用,而且我好像还要传入一个ring3的HANDLE。
本来我可以设计成在Ring3中解析文件,而且ring3中解析文件要简单一些。但我们头告诉我说这样效率不高,所以需要在vxd中完成这些task。
我是看来的,还没有仔细溜达,如何给分?
非常感谢!
钱就是驱动,驱动就是钱。
omo
omo
驱动牛犊
驱动牛犊
  • 注册日期2002-08-07
  • 最后登录2004-11-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-01-13 18:54
coolice老大,您说得在调用线程中记录线程ID是在ring3中的线程调用,记录该ID吗?这样做是否效率会比较低呢?我怎样测试他们之间的效率呢?
钱就是驱动,驱动就是钱。
Coolice
驱动小牛
驱动小牛
  • 注册日期2002-11-13
  • 最后登录2003-08-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-01-14 10:02
98下是有点麻烦啊,所以建议你用记录线程ID的方式,具体的实现要点可以查看前面的帖子。
Coolice
驱动小牛
驱动小牛
  • 注册日期2002-11-13
  • 最后登录2003-08-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-01-14 10:18
BTW: 事件只是广义的说法,可以用Create_Semaphore或者_BlockOnID等实现
游客

返回顶部