今天有同行问了一个问题,Windows文件过滤驱动里的如何去区分一个对象是文件仍是文件夹?我花了1小时左右翻阅了一些微软的文档以及之前的遗留代码,发如今WDK的帮助文档中是这么定义的:函数
FILE_OBJECT结构体中的一个成员:PVOID FsContext;spa
说明FsContext指向了一个结构体FSRTL_ADVANCED_FCB_HEADER,这个结构体中有一个成员:code
WDK帮助文档是这么描述这个结构体的:对象
里面提到了这个结构体包含的文件信息里已经代表了这个文件到底是文件?文件夹?卷区?交换数据流?并且其中的NodeTypeCode说明的是Reserved for system use!!! 这块知识只能从传说的微软未公开文档中才能找到吧。幸亏从遗留代码中找到用法,咱无论这未公开文档中是怎么定义的,咱知道如何去使用就好了,这里把关键代码拿出来给你们参考,也算这一个多小时的时间没白费吧(博主好小气~~~)blog
使用代码参考:文档
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,可是这个函数只能判断是否目录,若是不是目录的话,则有多是文件、卷区、交换数据流,因此不必定就是文件。it