silon212
驱动牛犊
驱动牛犊
  • 注册日期2007-03-11
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分70分
  • 威望8点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
阅读:2144回复:10

[问题]怎么根据FileObject判断它表示的是目录还是文件

楼主#
更多 发布于:2007-09-06 06:15
好像ChuKuangRen的文章中有,还没看到,因为我都是只看 IFS DDK 联机帮助。
我是知道一种方法,并试验成功了,不过太笨了:
1、知道 FileObject,就可以使用 ObQueryNameString() 拼出 "\Device\HarddiskVolume1\..." 形式的文件全路径
2、InitializeObjectAttributes(), ZwCreateFile(), ZwQueryInformationFile() 查询这个文件的 FILE_STANDARD_INFORMATION,其中有一个分量BOOLEAN Directory 就表示这个是不是目录。

现在不想用 ZwXXX() 函数,否则要考虑重入和缓冲问题,有没有其它方法来判断FileObject 是否是目录,越简单越好,比如FILE_OBJECT有没有标志位啦
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
沙发#
发布于:2007-09-06 08:35
你在CREATE的时候,在获得文件名的同时就可以获得其的属性了。
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
devia
论坛版主
论坛版主
  • 注册日期2005-05-14
  • 最后登录2016-04-05
  • 粉丝3
  • 关注0
  • 积分1029分
  • 威望712点
  • 贡献值1点
  • 好评度555点
  • 原创分8分
  • 专家分4分
板凳#
发布于:2007-09-06 12:38
引用第1楼wowocock于2007-09-06 08:35发表的  :
你在CREATE的时候,在获得文件名的同时就可以获得其的属性了。


其实不然!
人总在矛盾中徘徊。。。
looksail
荣誉会员
荣誉会员
  • 注册日期2005-05-22
  • 最后登录2014-03-15
  • 粉丝2
  • 关注0
  • 积分1016分
  • 威望991点
  • 贡献值0点
  • 好评度239点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-09-06 18:04
有些情况好像需要自己发IRP去查询到底是不是目录
提问归提问,还是只能靠自己
silon212
驱动牛犊
驱动牛犊
  • 注册日期2007-03-11
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分70分
  • 威望8点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-09-06 18:47
引用第1楼wowocock于2007-09-06 08:35发表的  :
你在CREATE的时候,在获得文件名的同时就可以获得其的属性了。

怎么个“获得文件名的同时就可以获得其的属性了”,是根据字符串形式么?
还有下发自己构造的IRP,是不是 IRP_MJ_QUERY_INFORMATION 型的啊?
silon212
驱动牛犊
驱动牛犊
  • 注册日期2007-03-11
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分70分
  • 威望8点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-09-06 19:02
引用第1楼wowocock于2007-09-06 08:35发表的  :
你在CREATE的时候,在获得文件名的同时就可以获得其的属性了。


你说的是不是 if ( FlagOn(IrpSp->Create.FileAttributes, FILE_ATTRIBUTE_DIRECTORY) ) 啊?
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
6楼#
发布于:2007-09-06 20:49
引用第5楼silon212于2007-09-06 19:02发表的  :


你说的是不是 if ( FlagOn(IrpSp->Create.FileAttributes, FILE_ATTRIBUTE_DIRECTORY) ) 啊?

根据上面传来的标志来判断,只能符合90%的情况,最好的方法是打开后发IRP查询。
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
wanghui219
禁止发言
禁止发言
  • 注册日期2007-08-28
  • 最后登录2019-07-29
  • 粉丝4
  • 关注3
  • 积分101166分
  • 威望505351点
  • 贡献值0点
  • 好评度137点
  • 原创分0分
  • 专家分4分
  • 社区居民
7楼#
发布于:2007-09-06 23:10
用户被禁言,该主题自动屏蔽!
silon212
驱动牛犊
驱动牛犊
  • 注册日期2007-03-11
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分70分
  • 威望8点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2007-09-08 02:05
引用第6楼wowocock于2007-09-06 20:49发表的  :

根据上面传来的标志来判断,只能符合90%的情况,最好的方法是打开后发IRP查询。

多谢了。可是我测试的情况是很少有IrpSp->Parameters.Create.FileAttributes设置FILE_ATTRIBUTE_DIRECTORY的,事实上我测试的结果值都为0,一个Flag都没设置,不知道为什么。我是在下层DO已处理完IRP后,并且NT_SUCCESS()通过后做的测试。
classfree
驱动小牛
驱动小牛
  • 注册日期2004-05-23
  • 最后登录2019-01-06
  • 粉丝1
  • 关注1
  • 积分873分
  • 威望276点
  • 贡献值0点
  • 好评度85点
  • 原创分0分
  • 专家分0分
  • 社区居民
9楼#
发布于:2007-09-13 14:51
引用第8楼silon212于2007-09-08 02:05发表的  :

多谢了。可是我测试的情况是很少有IrpSp->Parameters.Create.FileAttributes设置FILE_ATTRIBUTE_DIRECTORY的,事实上我测试的结果值都为0,一个Flag都没设置,不知道为什么。我是在下层DO已处理完IRP后,并且NT_SUCCESS()通过后做的测试。


不是通过FileAttributes, 是通过irpSp->Parameters.Create.Options来判断,楚狂人的教程中好像也是这么说的
低调点!
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
10楼#
发布于:2007-09-14 09:11
create时可以根据 fcb的nodetype来判断
前提是你的irp已经发到下层处理了
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
游客

返回顶部