惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

H
Hackread – Cybersecurity News, Data Breaches, AI and More
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
V
V2EX
T
The Blog of Author Tim Ferriss
腾讯CDC
Hugging Face - Blog
Hugging Face - Blog
雷峰网
雷峰网
爱范儿
爱范儿
GbyAI
GbyAI
H
Help Net Security
I
InfoQ
罗磊的独立博客
酷 壳 – CoolShell
酷 壳 – CoolShell
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
人人都是产品经理
人人都是产品经理
J
Java Code Geeks
Microsoft Security Blog
Microsoft Security Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
N
Netflix TechBlog - Medium
Last Week in AI
Last Week in AI
宝玉的分享
宝玉的分享
云风的 BLOG
云风的 BLOG
Project Zero
Project Zero
P
Privacy & Cybersecurity Law Blog
A
Arctic Wolf
Know Your Adversary
Know Your Adversary
G
Google Developers Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
T
Tor Project blog
V
Vulnerabilities – Threatpost
Y
Y Combinator Blog
WordPress大学
WordPress大学
V
Visual Studio Blog
博客园_首页
G
GRAHAM CLULEY
K
Kaspersky official blog
T
Tailwind CSS Blog
T
Threat Research - Cisco Blogs
博客园 - Franky
D
Docker
Security Latest
Security Latest
I
Intezer
有赞技术团队
有赞技术团队
Application and Cybersecurity Blog
Application and Cybersecurity Blog
博客园 - 【当耐特】
B
Blog RSS Feed
T
The Exploit Database - CXSecurity.com
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻

博客园 - cxun

使用 Sublime Text 将含下划线的字符串批量替换为驼峰命名法格式的字符串 如何使用iTunes与iTools导出微信聊天记录 git 常用命令粗略总结 如何从第三方应用下载广播电台的缓存节目内容 在 Windows 10 中启用 Windows Photo Viewer iOS版微信朋友圈数据库的简要分析 如何将密切好友的微信聊天记录恢复到自己的微信中 Hash工具下载地址 微信聊天记录查看器(程序+源码) - iOS版 XEN的启动信息输出到“Platform timer is 14.318MHz HPET”就暂停接收的解决办法 利用 Serial Over Lan(SOL)搭建 XEN 的调试信息输出环境 白盒密码入门 [转] win32内核程序中进程的pid,handle,eprocess之间相互转换的方法 Windows Language Packs Downloading Links 使用VirtualBox SDK之初步编译 VirtualBox开发环境的搭建详解 最简单的7z API接口 Chrome的Awesome Screenshot的插件离线下载 Chrome插件安装文件提取方法及 PwdHash Port 的插件下载
Windows内核开发中如何区分文件对象究竟是文件还是文件夹?
cxun · 2013-12-09 · via 博客园 - cxun

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