今天有同行問了一個問題,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