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,但是这个函数只能判断是否目录,如果不是目录的话,则有可能是文件、卷区、交换数据流,所以不一定就是文件。