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

IoCreateFile?ObOpenObjectByName是否能避免重入?帖里详细说明,请大家帮我.感激!

楼主#
更多 发布于:2007-01-28 00:08
  首先,小弟先明确一下重入的概念,希望各位大牛能够帮我指正

我的理解是,当试图在IRP_MJ_CREATE消息的处理例程里再次打开文件时,会导致我们的例程接收到这个文件打开的消息,如此循环则发生重入了.
这是我的理解,不知道是否正确

关于向下层Driver发送Irp消息来避免重入的理解是:
此时,我们可以自己构造一个MJ_Create Irp然后传递到下层驱动.之所以这个IRP不会发生重入的原因是该IRP不再经过我们的Filter了.

关于使用ObOpenObjectByName是否能避免重入?.

首先它是通过一个OPEN_PACKET来打开文件的.在Filter中,我们自定义一个OPEN_PACKET结构并且填充它,通过ObOpenObjectByName来打开,以下是NT源码中打开文件时的参数传递:

ObOpenObjectByName会将参数传递到ObLookUpObjectName函数,接着该函数会传递到lopParseDevice.lopParseDevice会正式开始组装Irp结构,并开始传递.这几天分析NT4Src很累.所以直接请问各位大牛,lopParseDevice中的IoCallDriver也就是Irp是传递到下层文件系统驱动还是传递后这个Irp还是会被我们自己的Filter捕获?简单点说就是lopParseDevice发送的IRP是否会被我们的Filter捕获?

我估计可能仍然会重入,因为我曾经尝试过IoCreateFile时重入了.WDK也明确指出IoCreateFile的MJ_CREATE消息会被捕捉到.而IoCreateFile函数所做的也就是填充一个OPEN_PACKET结构交给ObOpenObjectByName处理,接下来的工作上面说了.所以我在想,我使用ObOpenObjectByName打开可能会重入,不知道这个想法对吗?

解决办法的可行度:

在lopParseDevice中让IoCallDriver发送到下层设备.

这个解决办法可否解决问题,

请各位大牛帮我,谢谢.再次简洁的说明下问题.

第一:在MJ_CREATE例程中使用ObOpenObjectByName打开文件是否会重入?
第二:lopParseDevice函数将其构造的IRP发到过滤驱动的下层设备还是依然会经过过滤驱动?
第三:在lopParseDevice中让IoCallDriver发送到下层设备.这个方案是否可行,我所做的也是改变IoCallDriver的第一个参数而已.
第四:抄袭lopParseDevice中构造IRP的方法发送到下层设备要注意什么吗?

!谢谢!

问题太多,不好意思.第一,第二个问题是最重要的.在线等
michaelgz
论坛版主
论坛版主
  • 注册日期2005-01-26
  • 最后登录2012-10-22
  • 粉丝1
  • 关注1
  • 积分150分
  • 威望1524点
  • 贡献值1点
  • 好评度213点
  • 原创分0分
  • 专家分2分
沙发#
发布于:2007-02-01 01:11
To queue a context sensitive MJ_CREATE IRP in a system thread may have security issue.

Since evey directory and file must be opened before use, this system thead may become bottleneck of whole file system.
liio
驱动小牛
驱动小牛
  • 注册日期2005-12-24
  • 最后登录2022-06-16
  • 粉丝4
  • 关注1
  • 积分24分
  • 威望343点
  • 贡献值0点
  • 好评度171点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2007-01-31 12:45
liang.xiao .我有用过这种方法,但是同步主线程好象有问题
liang.xiao
驱动牛犊
驱动牛犊
  • 注册日期2005-10-09
  • 最后登录2009-04-17
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望4点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-01-31 09:11
自己创建一个内核线程,使用该线程来执行任何其他额外的操作(这样做的另一个好处是可以避开高中断级别的IRQL),在任何例程中通过检测线程ID来识别是否为自己的内核线程执行的操作以避免重入产生的问题;再有就是在一些参数中加入特需的标识来进行检测,需要注意的是其他用户也可能使用该标识
hmily
michaelgz
论坛版主
论坛版主
  • 注册日期2005-01-26
  • 最后登录2012-10-22
  • 粉丝1
  • 关注1
  • 积分150分
  • 威望1524点
  • 贡献值1点
  • 好评度213点
  • 原创分0分
  • 专家分2分
地下室#
发布于:2007-01-30 23:28
Re:IoCreateFile?ObOpenObjectByName是否能避免重入?帖里详
IoCreateFileSpecifyDeviceObjectHint is provided in W2K security update.

Or you have to develop your own Shadow Device. This has been discussed in this forum before.
liio
驱动小牛
驱动小牛
  • 注册日期2005-12-24
  • 最后登录2022-06-16
  • 粉丝4
  • 关注1
  • 积分24分
  • 威望343点
  • 贡献值0点
  • 好评度171点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2007-01-30 03:19
IoCreateFileSpecifyDeviceObjectHint好像这个函数只支持xp以上的系统
michaelgz
论坛版主
论坛版主
  • 注册日期2005-01-26
  • 最后登录2012-10-22
  • 粉丝1
  • 关注1
  • 积分150分
  • 威望1524点
  • 贡献值1点
  • 好评度213点
  • 原创分0分
  • 专家分2分
6楼#
发布于:2007-01-30 01:03
"在MJ_CREATE例程中使用ObOpenObjectByName打开文件是否会重入?"
I believe so since stack construction is done in IO Manager not Object Manager.

Why not use the function IoCreateFileSpecifyDeviceObjectHint() ?
游客

返回顶部