zoukankan      html  css  js  c++  java
  • Windows内核开发中如何区分文件对象究竟是文件还是文件夹?

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

  • 相关阅读:
    [bzoj 3048] [Usaco2013 Jan]Cow Lineup
    [bzoj 3192] [JLOI2013]删除物品
    搬迁至新博客的原因
    洛谷 P3317 [SDOI2014]重建(矩阵树定理+数学推导) [bzoj3534]
    [bzoj1002]: [FJOI2007]轮状病毒(矩阵树定理)
    [bzoj1006]: [HNOI2008]神奇的国度(最大势算法)
    高精度板子
    洛谷 P3211 [HNOI2011]XOR和路径(推dp+高斯消元)
    字符串--manacher算法(回文串匹配)
    洛谷 P2633 Count on a tree[bzoj2588](倍增lca+主席树)
  • 原文地址:https://www.cnblogs.com/cxun/p/3465761.html
Copyright © 2011-2022 走看看