Windows内核开发中如何区分文件对象究竟是文件还是文件夹?
今天有同行问了一个问题,Windows文件过滤驱动里的如何去区分一个对象是文件还是文件夹?我花了1小时左右翻阅了一些微软的文档以及以前的遗留代码,发现在WDK的帮助文档中是这么定义的:
FILE_OBJECT结构体中的一个成员:PVOID FsContext;
说明FsContext指向了一个结构体FSRTL_ADVANCED_FCB_HEADER,这个结构体中有一个成员:
WDK帮助文档是这么描述这个结构体的:
里面提到了这个结构体包含的文件信息里已经表明了这个文件究竟是文件?文件夹?卷区?交换数据流?而且其中的NodeTypeCode说明的是Reserved for system use!!! 这块知识只能从传说的微软未公开文档中才能找到吧。幸好从遗留代码中找到用法,咱不管这未公开文档中是怎么定义的,咱知道如何去使用就行了,这里把关键代码拿出来给大家参考,也算这一个多小时的时间没白费吧(博主好小气~~~)
使用代码参考:
#define FAT_NTC_FCB 0x0502
#define FAT_NTC_DCB 0x0503
#define FAT_NTC_ROOT_DCB 0x0504
#define NTFS_NTC_DCB 0x0703
#define NTFS_NTC_ROOT_DCB 0x0704
#define NTFS_NTC_FCB 0x0705 #ifndef NodeType
//
// So all records start with
//
// typedef struct _RECORD_NAME {
// NODE_TYPE_CODE NodeTypeCode;
// NODE_BYTE_SIZE NodeByteSize;
// :
// } RECORD_NAME;
// typedef RECORD_NAME *PRECORD_NAME;
//
#define NodeType(Ptr) (*((PNODE_TYPE_CODE)(Ptr)))
#endif BOOLEAN
IsDirectoryEx(PFILE_OBJECT FileObject)
{
if ((NodeType(FileObject->FsContext) == FAT_NTC_DCB) ||
(NodeType(FileObject->FsContext) == FAT_NTC_ROOT_DCB) ||
(NodeType(FileObject->FsContext) == NTFS_NTC_DCB) ||
(NodeType(FileObject->FsContext) == NTFS_NTC_ROOT_DCB))
return TRUE;
else
return FALSE;
}
PS!!! 在我写完这篇博文之后准备发布时,我那位大牛朋友发现了一个函数可以更方便的区分是不是文件夹:FltIsDirectory,但是这个函数只能判断是否目录,如果不是目录的话,则有可能是文件、卷区、交换数据流,所以不一定就是文件。
Windows内核开发中如何区分文件对象究竟是文件还是文件夹?的更多相关文章
- Windows内核驱动中操作文件
本页主题:如何在windows内核驱动中对文件操作,实现对文件的拷贝.粘贴.删除.查询信息等,这是很常用也是很简单的方法. 部分内容参考:http://www.cppblog.com/aurain/a ...
- Windows内核开发-10-监听对象
Windows内核开发-10-监听对象 Windows内核除了可以监听进程,线程.dll还可以监听特定的对象和注册表.这里先讲一下监听对象. 监听对象 内核提供了一种可以监听对特定的对象类型的句柄进行 ...
- Windows内核开发-3-内核编程基础
Windows内核开发-3-内核编程基础 这里会深入讲解kernel内核的API.结构体.和一些定义.考察代码在内核驱动中运行的机制.最后把所有知识合在一起写一个有用的驱动. 本章学习要点: 1:通用 ...
- Windows内核开发-4-内核编程基础
Windows内核开发-4-内核编程基础 这里会构建一个简单但是完整的驱动程序和一个客户端,部署内核执行一些平时user下无法执行的操作. 将通过以下内容进行讲解: 1 介绍 2 驱动初始化 3 Cr ...
- Windows内核开发-6-内核机制 Kernel Mechanisms
Windows内核开发-6-内核机制 Kernel Mechanisms 一部分Windows的内核机制对于驱动开发很有帮助,还有一部分对于内核理解和调试也很有帮助. Interrupt Reques ...
- 【转】深入Windows内核——C++中的消息机制
上节讲了消息的相关概念,本文将进一步聊聊C++中的消息机制. 从简单例子探析核心原理 在讲之前,我们先看一个简单例子:创建一个窗口和两个按钮,用来控制窗口的背景颜色.其效果 图1.效果图 Win32 ...
- windows内核开发环境的简易搭建
一.windows内核开发需要的软件 1.WDK 2.WinDbg 3.virtualKD 4.DebugView 5.Visual C++ 6.0 6.VMware Workstation 二.wi ...
- Windows内核开发-Windows内部概述-2-
Windows内部概述-2- 线程: 执行代码的实体是线程.一个线程的包含在进程里面的,线程使用进程提供的资源来运行代码. 一个线程拥有以下的内容: 1:明确的运行模式,用户态或者内核态. 2:执行的 ...
- Windows内核开发-2-开始内核开发-2-内核开发入门
Windows内核开发-2-开始内核开发-2- 第一个驱动程序: 直接采用vs2019中的Empty WDM Driver 模块创建: 初始的项目文件夹中有一个Driver Files里面会有一个.i ...
随机推荐
- HTML 5 画布(canvas)
canvas 元素使用 JavaScript 在网页上绘制图像,本身是没有绘图能力. canvas 是一个矩形区域,可以控制其每一像素. canvas 拥有多种绘制路径.矩形.圆形.字符以及添加图像的 ...
- jQuery插件开发(转)
jQuery插件开发全解析 jQuery插件的开发包括两种: 一种是类级别的插件开发,即给jQuery添加新的全局函数,相当于给jQuery类本身添加方法.jQuery的全局函数就是属于jQuery命 ...
- Java编程中-servlet
今天将别人的项目导入eclipse之后,出现了“The import javax.servlet cannot be resolved”错误 import javax.servlet.ServletE ...
- Python强化训练笔记(七)——使用deque队列以及将对象保存为文件
collections模块中的deque对象是一个队列,它有着正常队列的先进先出原则.我们可以利用这个对象来实现数据的保存功能. 例如,现有一个猜数字大小的游戏,系统开始会随机roll点一个0-100 ...
- 阿里云服务器Linux CentOS安装配置(二)yum安装svn
阿里云服务器Linux CentOS安装配置(二)yum安装svn 1.secureCRT连接服务器 2.先创建一个文件夹,用来按自己的习惯来,用来存放数据 mkdir /data 3.yum安装sv ...
- frag General URL components
HTTP: The Definitive Guide 2.2.7 Fragments Some resource types, such as HTML, can be divided further ...
- nginx开启日志,指定格式,查看执行时间
nginx配置: access_log on; log_format access '$remote_addr – $remote_user [$time_local] "$request& ...
- Nodejs:fs模块 & rimraf模块
模块fs:可以通过他管理文件系统,文件的写入,删除等操作 模块rimraf: 递归删除文件的node插件,在项目的文件编译之前,可以清除dist文件夹里的内容 API样例: var fs = ...
- Application_Error VS OnException 遇到的坑
在工作中遇到一个巨坑,就是关于Application_Error和OnException, 本身我的应用程序设置了全局异常OnException处理,手动抛出异常,OnExcep ...
- C++学习笔记 四种新式类型转换
static_cast ,dynamic_cast,const_cast,reinterpret_cast static_cast 定义:通俗的说就是静态显式转换,用于基本的数据类型转换,及指针之间的 ...


