Windows内核开发中如何区分文件对象究竟是文件还是文件夹?

今天有同行问了一个问题,Windows文件过滤驱动里的如何去区分一个对象是文件还是文件夹?我花了1小时左右翻阅了一些微软的文档以及以前的遗留代码,发现在WDK的帮助文档中是这么定义的:

FILE_OBJECT结构体中的一个成员:PVOID  FsContext;

说明FsContext指向了一个结构体FSRTL_ADVANCED_FCB_HEADER,这个结构体中有一个成员:

WDK帮助文档是这么描述这个结构体的:

里面提到了这个结构体包含的文件信息里已经表明了这个文件究竟是文件?文件夹?卷区?交换数据流?而且其中的NodeTypeCode说明的是Reserved for system use!!! 这块知识只能从传说的微软未公开文档中才能找到吧。幸好从遗留代码中找到用法,咱不管这未公开文档中是怎么定义的,咱知道如何去使用就行了,这里把关键代码拿出来给大家参考,也算这一个多小时的时间没白费吧(博主好小气~~~)

 

使用代码参考:

 1 #define FAT_NTC_FCB               0x0502
 2 #define FAT_NTC_DCB               0x0503
 3 #define FAT_NTC_ROOT_DCB          0x0504
 4 #define NTFS_NTC_DCB              0x0703
 5 #define NTFS_NTC_ROOT_DCB         0x0704
 6 #define NTFS_NTC_FCB              0x0705
 7 
 8 #ifndef NodeType
 9 //
10 //  So all records start with
11 //
12 //  typedef struct _RECORD_NAME {
13 //      NODE_TYPE_CODE NodeTypeCode;
14 //      NODE_BYTE_SIZE NodeByteSize;
15 //          :
16 //  } RECORD_NAME;
17 //  typedef RECORD_NAME *PRECORD_NAME;
18 //
19 #define NodeType(Ptr) (*((PNODE_TYPE_CODE)(Ptr)))
20 #endif
21 
22 
23 BOOLEAN
24 IsDirectoryEx(PFILE_OBJECT FileObject)
25 {
26     if ((NodeType(FileObject->FsContext) == FAT_NTC_DCB) ||
27         (NodeType(FileObject->FsContext) == FAT_NTC_ROOT_DCB) ||
28         (NodeType(FileObject->FsContext) == NTFS_NTC_DCB) ||
29         (NodeType(FileObject->FsContext) == NTFS_NTC_ROOT_DCB))
30         return TRUE;
31     else 
32         return FALSE;
33 }

 

 

PS!!! 在我写完这篇博文之后准备发布时,我那位大牛朋友发现了一个函数可以更方便的区分是不是文件夹:FltIsDirectory,但是这个函数只能判断是否目录,如果不是目录的话,则有可能是文件、卷区、交换数据流,所以不一定就是文件。

 

转载于:https://www.cnblogs.com/cxun/p/3465761.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值