首页
社区
课程
招聘
[旧帖] [原创] 乱谈文件双缓存 0.00雪花
发表于: 2013-5-31 23:18 5092

[旧帖] [原创] 乱谈文件双缓存 0.00雪花

2013-5-31 23:18
5092

发现我看雪等级太低 ,所以乱说说 windows文件双缓存, 希望能赚点Kx。

由于时间问题我没时间多说。这里我就说说 fcb的创建和cache的创建。

好吧 ,说正题!

先说说 fcb
大家都知道 ,什么jb结构体不就是一块内存嘛,我分配一块不就行了。那fcb到底什么样呢?搞过文件过滤的都知道,每种文件系统 fcb都是不一样的 。 我们先看几个文件系统中是怎么定义的 。

fat文件系统:

typedef struct _FCB {

  

  FSRTL_ADVANCED_FCB_HEADER Header;

    PNON_PAGED_FCB         NonPaged;

    ULONG                         FirstClusterOfFile;

    LIST_ENTRY                         ParentDcbLinks;

    struct _FCB                         *ParentDcb;

    PVCB                                 Vcb;
    ULONG                         FcbState;

    FCB_CONDITION          FcbCondition;

    SHARE_ACCESS                 ShareAccess;

#ifdef SYSCACHE_COMPILE

    PULONG         WriteMask;

    ULONG         WriteMaskData;

#endif

   

    CLONG          UncleanCount;

    CLONG          OpenCount;

    CLONG         NonCachedUncleanCount;

    VBO             DirentOffsetWithinDirectory;

    VBO             LfnOffsetWithinDirectory;

    LARGE_INTEGER       CreationTime;

    LARGE_INTEGER       LastAccessTime;

 LARGE_INTEGER        LastWriteTime;
  
 ULONG                       ValidDataToDisk;
  
    LARGE_MCB Mcb;

  

    union {

        struct {

            LIST_ENTRY         ParentDcbQueue;

            ULONG                DirectoryFileOpenCount;

            PFILE_OBJECT     DirectoryFile;

            VBO                    UnusedDirentVbo;

            VBO                    DeletedDirentHint;
            
            PRTL_SPLAY_LINKS   RootOemNode;

            PRTL_SPLAY_LINKS     RootUnicodeNode;

            RTL_BITMAP FreeDirentBitmap;

            ULONG FreeDirentBitmapBuffer[1];

        } Dcb;
        struct {

                       FILE_LOCK     FileLock;

                       OPLOCK         Oplock;

                        PVOID           LazyWriteThread;

        } Fcb;

    } Specific;

    ULONG EaModificationCount;

    FILE_NAME_NODE ShortName;

    UNICODE_STRING FullFileName;

    USHORT FinalNameLength;

    UCHAR DirentFatFlags;

    UNICODE_STRING ExactCaseLongName;

   

    union {

              FILE_NAME_NODE Oem;

              FILE_NAME_NODE Unicode;

    } LongName;

       PKEVENT MoveFileEvent;

} FCB, *PFCB;

ntfs4.x  文件系统

typedef struct _SCB {

   

    FSRTL_ADVANCED_FCB_HEADER Header;

    LIST_ENTRY FcbLinks;

  PFCB Fcb;

   

    PVCB Vcb;

    ULONG ScbState;

  

    CLONG NonCachedCleanupCount;

   

    CLONG CleanupCount;

   

    CLONG CloseCount;

    SHARE_ACCESS ShareAccess;

  

    ATTRIBUTE_TYPE_CODE AttributeTypeCode;
    UNICODE_STRING AttributeName;

   

    PFILE_OBJECT FileObject;

    PVOID LazyWriteThread[2];

   

    PSCB_NONPAGED NonpagedScb;

  

    NTFS_MCB Mcb;
    NTFS_MCB_INITIAL_STRUCTS McbStructs;

  

    ULONG CompressionUnit;

   

    USHORT AttributeFlags;
    UCHAR CompressionUnitShift;
    UCHAR PadUchar;

    LONGLONG ValidDataToDisk;

    LONGLONG ExcessFromSplitMcb;

    LONGLONG TotalAllocated;

   

  LIST_ENTRY EofListHead;
  
    union {

        PMOVE_FILE_DATA MoveData;

    } Union;

    struct _SCB_SNAPSHOT * ScbSnapshot;
    ULONG PadUlong;

       union {

        SCB_DATA Data;
        SCB_INDEX Index;
        SCB_MFT Mft;

    } ScbType;

} SCB;

RFS 文件系统:

typedef struct _RFSD_FCBVCB {
   
    // FCB header required by NT
    FSRTL_COMMON_FCB_HEADER         CommonFCBHeader;

    SECTION_OBJECT_POINTERS         SectionObject;

    ERESOURCE                       MainResource;

    ERESOURCE                       PagingIoResource;

    // end FCB header required by NT
   
    // Identifier for this structure
    RFSD_IDENTIFIER                 Identifier;

} RFSD_FCBVCB, *PRFSD_FCBVCB;

我们再看看

typedef struct _FSRTL_ADVANCED_FCB_HEADER {
FSRTL_COMMON_FCB_HEADER DUMMYSTRUCTNAME;
  PFAST_MUTEX             FastMutex;
  LIST_ENTRY              FilterContexts;
  EX_PUSH_LOCK            PushLock;
  PVOID                   *FileContextSupportPointer;
  union {
    OPLOCK Oplock;
    PVOID  ReservedForRemote;
  };
} FSRTL_ADVANCED_FCB_HEADER, *PFSRTL_ADVANCED_FCB_HEADER;

看到有什么共同点了不  它们都有一个 FSRTL_COMMON_FCB_HEADER


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 5
支持
分享
最新回复 (15)
雪    币: 346
活跃值: (45)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
这结构是系统和缓存管理要用的,所以说fcb 最重要的就这一个  其它都是浮云,在你的文件系统里
你定义fcb的时候只要有它  ,其它的你想加什么就加什么。 然后 分配内存,把 ERESOURCE 初始好   把地址写到fileobj 的 FsContext; fcb就算建好了。

这里给一下fileobj的结构:

     typedef struct _FILE_OBJECT                                // 30 elements, 0x80 bytes (sizeof)
          {
/*0x000*/     INT16        Type;
/*0x002*/     INT16        Size;
/*0x004*/     struct _DEVICE_OBJECT* DeviceObject;
/*0x008*/     struct _VPB* Vpb;
/*0x00C*/     VOID*        FsContext;
/*0x010*/     VOID*        FsContext2;
/*0x014*/     struct _SECTION_OBJECT_POINTERS* SectionObjectPointer;
/*0x018*/     VOID*        PrivateCacheMap;
/*0x01C*/     LONG32       FinalStatus;
/*0x020*/     struct _FILE_OBJECT* RelatedFileObject;
/*0x024*/     UINT8        LockOperation;
/*0x025*/     UINT8        DeletePending;
/*0x026*/     UINT8        ReadAccess;
/*0x027*/     UINT8        WriteAccess;
/*0x028*/     UINT8        DeleteAccess;
/*0x029*/     UINT8        SharedRead;
/*0x02A*/     UINT8        SharedWrite;
/*0x02B*/     UINT8        SharedDelete;
/*0x02C*/     ULONG32      Flags;
/*0x030*/     struct _UNICODE_STRING FileName;                       // 3 elements, 0x8 bytes (sizeof)
/*0x038*/     union _LARGE_INTEGER CurrentByteOffset;                // 4 elements, 0x8 bytes (sizeof)
/*0x040*/     ULONG32      Waiters;
/*0x044*/     ULONG32      Busy;
/*0x048*/     VOID*        LastLock;
/*0x04C*/     struct _KEVENT Lock;                                   // 1 elements, 0x10 bytes (sizeof)
/*0x05C*/     struct _KEVENT Event;                                  // 1 elements, 0x10 bytes (sizeof)
/*0x06C*/     struct _IO_COMPLETION_CONTEXT* CompletionContext;
/*0x070*/     ULONG32      IrpListLock;
/*0x074*/     struct _LIST_ENTRY IrpList;                            // 2 elements, 0x8 bytes (sizeof)
/*0x07C*/     VOID*        FileObjectExtension;
          }FILE_OBJECT, *PFILE_OBJECT;

好了 下一步 我们就是建缓存了

缓存创建一般是在文件第一次读写的时候创建,  当然你想乱玩,在文件创建完成的时候也可以创建
调用下 CcInitializeCacheMap就行了。

VOID CcInitializeCacheMap(
  _In_  PFILE_OBJECT FileObject,
  _In_  PCC_FILE_SIZES FileSizes,
  _In_  BOOLEAN PinAccess,
  _In_  PCACHE_MANAGER_CALLBACKS Callbacks,
  _In_  PVOID LazyWriteContext
);

注意 在调这个函前 fileobj中的   
struct _SECTION_OBJECT_POINTERS* SectionObjectPointer; 结构 要自己分配,你可以像fat那样 把它定义在fcb中
还有  在文件的操作中ERESOURCE 的获取也很重要! 自己去研一下吧!

我这里叫乱谈,是因为我没时间去写demo, 因为要忙着找工作和学习android开发。   如果你觉我这是“只说不撸” 就当我是用左手吧 ! 哎!没学历真他妈难混啊!
2013-6-1 00:00
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
前排入坐!!感谢楼主分享,希望可以做成一个系列!嘻嘻
2013-6-1 11:03
0
雪    币: 346
活跃值: (45)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
只是现在忙,没时间写,有时间了一定写个demo
2013-6-1 11:11
0
雪    币: 221
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
希望楼主解释下"双缓存"
2013-6-1 16:09
0
雪    币: 346
活跃值: (45)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
我这里只是说一下建缓存的思路 。 这个可以自由发辉,双缓的实现有很多方式 ,比如等文件创建完后  你自己建一个 fcb然后做一个 fcb和源fcb的映射。 还有 v校有篇文章中也提到过把源文件当磁盘 等很多方式。
2013-6-1 17:09
0
雪    币: 58
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
友情绑定,lz是一驱动大牛啊。。不能让这贴落下。。
2013-6-4 12:17
0
雪    币: 84
活跃值: (203)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
"双缓存"  看看什么意思 。
2013-6-4 12:42
0
雪    币: 859
活跃值: (309)
能力值: ( LV11,RANK:180 )
在线值:
发帖
回帖
粉丝
9
mark 一下。。。学习
2013-6-4 13:02
0
雪    币: 49
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
建缓存  和 双缓存
题目 和 内容
差的有点远啊

标 题: 【原创】  fcb的创建和cache的创建
作 者: DegerYang

这个标题是不是好点?
2013-6-6 09:35
0
雪    币: 346
活跃值: (45)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
11
确实有点偏题了!感谢纠正!  下次发贴一定注意!
2013-6-6 11:12
0
雪    币: 45
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
深入,我等只知道flush,可以把缓存写入硬盘
2013-6-7 01:06
0
雪    币: 30
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
mark and learn~
2013-6-7 07:43
0
雪    币: 79
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
对于Storage Device上同一个文件,过滤驱动主动调用CcInitializeCacheMap( ccFileObj , FileSizes , TRUE, ccCallbacks , DrvContext );来创建缓存与NTFS驱动调用CcInitializeCacheMap生成的缓存是通过FileObject来区分的,那FileObject如何生成就是关键点,但无论用哪个IoCreateStreamFileObject创建,都要先初始化FileObject的数据结构。
问题是这时候怎样填充各Field的值。看到有人使用fcb->NodeTypeCode == 0x8000之类的来区别。
2013-10-17 09:08
0
雪    币: 24
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
15
可能我对文件系统不了解,你这么说了我还是不懂!
2013-10-17 15:40
0
雪    币: 79
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
简单理解就是,双缓存就是在底层文件系统之上再实现另外一个文件系统,在上层文件系统中需要自行和CC、MM打交道,对于自己关心的文件,创建一个与下层缺省创建的File Object不一样的对象,指向不同的SectionObject,然后使用此FileObject来初始化缓存。

这样对于硬盘上的同一个文件,涉密进程打开时,由上层文件系统接管,创建一个缓存;非涉密进程打开时,由底层文件系统创建另外一个缓存
2013-10-19 11:48
0
游客
登录 | 注册 方可回帖
返回
//