• Windows内核开发中如何区分文件对象究竟是文件还是文件夹?(FILE_OBJECT包括了无数详细信息)


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

    http://www.cnblogs.com/cxun/p/3465761.html

  • 相关阅读:
    CocoaPods 的安装和使用介绍
    C 语言宏快速入门
    C中的预编译宏定义
    __block 与 __weak的区别理解
    Xcode7 项目转 Xcode6 时 出现问题
    css margin 参数
    第三方框架 INTULocationManager 定位的一些方法
    ios 定位 监听是否跨入某个指定的区域
    ios 指南针
    ios 定位 航向检测
  • 原文地址:https://www.cnblogs.com/findumars/p/5543092.html
Copyright © 2020-2023  润新知