能力值:
( 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开发。 如果你觉我这是“只说不撸” 就当我是用左手吧 ! 哎!没学历真他妈难混啊!
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
前排入坐!!感谢楼主分享,希望可以做成一个系列!嘻嘻
|
能力值:
( LV3,RANK:20 )
|
-
-
4 楼
只是现在忙,没时间写,有时间了一定写个demo
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
希望楼主解释下"双缓存"
|
能力值:
( LV3,RANK:20 )
|
-
-
6 楼
我这里只是说一下建缓存的思路 。 这个可以自由发辉,双缓的实现有很多方式 ,比如等文件创建完后 你自己建一个 fcb然后做一个 fcb和源fcb的映射。 还有 v校有篇文章中也提到过把源文件当磁盘 等很多方式。
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
友情绑定,lz是一驱动大牛啊。。不能让这贴落下。。
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
"双缓存" 看看什么意思 。
|
能力值:
( LV11,RANK:180 )
|
-
-
9 楼
mark 一下。。。学习
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
建缓存 和 双缓存
题目 和 内容
差的有点远啊
标 题: 【原创】 fcb的创建和cache的创建
作 者: DegerYang
这个标题是不是好点?
|
能力值:
( LV3,RANK:20 )
|
-
-
11 楼
确实有点偏题了!感谢纠正! 下次发贴一定注意!
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
深入,我等只知道flush,可以把缓存写入硬盘
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
mark and learn~
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
对于Storage Device上同一个文件,过滤驱动主动调用CcInitializeCacheMap( ccFileObj , FileSizes , TRUE, ccCallbacks , DrvContext );来创建缓存与NTFS驱动调用CcInitializeCacheMap生成的缓存是通过FileObject来区分的,那FileObject如何生成就是关键点,但无论用哪个IoCreateStreamFileObject创建,都要先初始化FileObject的数据结构。
问题是这时候怎样填充各Field的值。看到有人使用fcb->NodeTypeCode == 0x8000之类的来区别。
|
能力值:
( LV3,RANK:20 )
|
-
-
15 楼
可能我对文件系统不了解,你这么说了我还是不懂!
|
能力值:
( LV2,RANK:10 )
|
-
-
16 楼
简单理解就是,双缓存就是在底层文件系统之上再实现另外一个文件系统,在上层文件系统中需要自行和CC、MM打交道,对于自己关心的文件,创建一个与下层缺省创建的File Object不一样的对象,指向不同的SectionObject,然后使用此FileObject来初始化缓存。
这样对于硬盘上的同一个文件,涉密进程打开时,由上层文件系统接管,创建一个缓存;非涉密进程打开时,由底层文件系统创建另外一个缓存
|
|
|