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 ...
随机推荐
- 如何解决google ping不通的问题。
1. 用http://ping.chinaz.com/ ping google的域名. 2. 会ping出很多ip,但是chinaz用的是测试网点去ping的,不是你本地宽带, 所以把ping出ip拷 ...
- php如何查看变量是真实被引用
$var1 = 'Hello World'; $var2 = ''; $var2 =&$var1; debug_zval_dump(&$var1); $a = "aaa&qu ...
- 百钱买百鸡问题 php版本
/* * 百钱买百鸡问题 * * 我国古代数学家张丘建在<算经>一书中曾提出过著名的“百钱买百鸡”问题,该问题叙述如下:鸡翁一,值钱五:鸡母一,值钱三:鸡雏三,值钱一:百钱买百鸡,则翁.母 ...
- jQuery简单易用的网页内容打印插件
简要教程 jQuery.print是一款简单易容且功能强大的网页内容打印jQuery插件.该网页打印插件可以打印指定区域的网页元素,可以指定跳过不打印某些元素,还可以打印整个页面内容.并且提供了丰富的 ...
- 刷新DNS命令 如何刷新DNS缓存(flushdns)
运行:ipconfig /displaydns这个命令,查看一下本机已经缓存了那些的dns信息的,然后输入下面的命令 ipconfig /flushdns 这时本机的dns ...
- Tomcat与Jre绿色环境配置(生产环境)
Tomcat与Jre绿色环境配置(生产环境) 博客分类: Apache Java jreapachetomcat Tomcat运行时需要jre的支持,一般有两种方式,一种是用jdk带的jre,另一种 ...
- javascript 数字进制转换
//十进制转其他 var x=110; alert(x); alert(x.toString(8)); alert(x.toString(32)); alert(x.toString(16)); // ...
- ajax下载多文件,并且打包 C#中 ,文件批下载zip
//提交要下载的文件 $.ajax({ url:"/sub/ZipFile.aspx", data:"paras="+datas, type: 'HEAD', ...
- Onethink1.1 钩子和插件的使用!
Onethink下载请自行百度咯,安装也就几秒钟. 高手(略),只是针对和我一样需要了解的菜鸟. 主要讲一讲onethink插件的使用,因为这对我们的快速开发有帮助,所以记录一下,同时也希望能够帮助一 ...
- Maven的依赖和传递性质
1. 引入项目所需jar包 Maven项目直白的一大特点就是一般情况下不需要去自行下载jar包以及目标jar包的依赖包并导入,只需要在去Maven的中央仓库http://mvnrepository.c ...


