文件过滤驱动学习笔记(三)

 typedef struct _SECTION_OBJECT_POINTERS {

 PVOID DataSectionObject;

 PVOID SharedCacheMap;

 PVOID ImageSectionObject;

} SECTION_OBJECT_POINTERS,*PSECTION_OBJECT_POINTERS;

DataSectionObject:

         指向一个不透明的结构用于跟踪一个文件数据流的状态。内存管理器在第一次缓存数据流时设置这个值。如果这个值为NULL则表明当前文件的数据流不在内存中。这个值可以在任何时间被改变。其实这个值是一个nt!_CONTROL_AREA结构。

  +0x000 Segment          : Ptr32_SEGMENT

  +0x004 DereferenceList  :_LIST_ENTRY

  +0x00c NumberOfSectionReferences : Uint4B

  +0x010 NumberOfPfnReferences : Uint4B

  +0x014 NumberOfMappedViews : Uint4B

  +0x018 NumberOfUserReferences : Uint4B

   +0x01cu                :

  +0x020 FlushInProgressCount : Uint4B

  +0x024 FilePointer      :_EX_FAST_REF

  +0x028 ControlAreaLock  : Int4B

  +0x02c ModifiedWriteCount : Uint4B

  +0x02c StartingFrame    : Uint4B

  +0x030 WaitingForDeletion : Ptr32 _MI_SECTION_CREATION_GATE

  +0x034 u2               :

  +0x040 LockedPages      : Int8B

  +0x048 ViewList         :_LIST_ENTRY

SharedCacheMap

         这个是一个不透明结构,被于跟踪文件的数据流视图(即文件到内存的一个映谢)。缓存管理在第一次缓存数据流时设置应该值。为空则表明当前文件没有缓存。其实它是一个nt!_SHARED_CACHE_MAP结构。

+0x000 NodeTypeCode     :Int2B

  +0x002 NodeByteSize     : Int2B

  +0x004 OpenCount        : Uint4B

  +0x008 FileSize         :_LARGE_INTEGER

  +0x010 BcbList          :_LIST_ENTRY

  +0x018 SectionSize      :_LARGE_INTEGER

  +0x020 ValidDataLength  :_LARGE_INTEGER

  +0x028 ValidDataGoal    :_LARGE_INTEGER

  +0x030 InitialVacbs     : [4]Ptr32 _VACB

  +0x040 Vacbs            : Ptr32Ptr32 _VACB

  +0x044 FileObjectFastRef : _EX_FAST_REF

  +0x048 VacbLock         :_EX_PUSH_LOCK

  +0x04c DirtyPages       : Uint4B

  +0x050 LoggedStreamLinks : _LIST_ENTRY

  +0x058 SharedCacheMapLinks : _LIST_ENTRY

  +0x060 Flags            : Uint4B

  +0x064 Status           : Int4B

  +0x068 Mbcb             : Ptr32_MBCB

  +0x06c Section          : Ptr32Void

  +0x070 CreateEvent      : Ptr32_KEVENT

  +0x074 WaitOnActiveCount : Ptr32 _KEVENT

  +0x078 PagesToWrite     : Uint4B

  +0x080 BeyondLastFlush  : Int8B

  +0x088 Callbacks        : Ptr32_CACHE_MANAGER_CALLBACKS

  +0x08c LazyWriteContext : Ptr32 Void

  +0x090 PrivateList      : _LIST_ENTRY

  +0x098 LogHandle        : Ptr32Void

  +0x09c FlushToLsnRoutine : Ptr32    void

  +0x0a0 DirtyPageThreshold : Uint4B

  +0x0a4 LazyWritePassCount : Uint4B

  +0x0a8 UninitializeEvent : Ptr32 _CACHE_UNINITIALIZE_EVENT

  +0x0ac BcbLock          :_KGUARDED_MUTEX

  +0x0d0 LastUnmapBehindOffset : _LARGE_INTEGER

  +0x0d8 Event            : _KEVENT

  +0x0e8 HighWaterMappingOffset : _LARGE_INTEGER

  +0x0f0 PrivateCacheMap  :_PRIVATE_CACHE_MAP

  +0x148 WriteBehindWorkQueueEntry : Ptr32 Void

  +0x14c VolumeCacheMap   : Ptr32_VOLUME_CACHE_MAP

  +0x150 ProcImagePathHash : Uint4B

  +0x154 WritesInProgress : Uint4B

  +0x158 PipelinedReadAheadSize : Uint4B

ImageSectionObject

         也是一个nt!_CONTROL_AREA结构,不过用于跟踪一个可执行文件的数据流。当一个可执行镜像节被创建时内存管理器设置这个值。如果为空则说明可执行镜像不太内存中。

 

文件流(filestream):即文件的数据本身,要与文件对像,文件的打开实例区分开。

 

说明:

SECTION_OBJECT_POINTERS负责链结一个具体的文件对象到一个文件流的数据节对象的关系。SECTION_OBJECT_POINTERS与文件流是一对一的关系,每一个文件对象代表一个打开实例,若多个文件对象打开的是一个文件流,那么它们则对应同一个SECTION_OBJECT_POINTERS结构。即当一个文件流有多个打开实例时,那么每一个打印实例对应的文件对象结构中的SectionObjectPointer指向同一份SECTION_OBJECT_POINTERS地址(这个由文件系统保证)。

当每一个文件流第一次被打开时,文件系统或重定向器必须做:

1.      从非分页池中分配SECTION_OBJECT_POINTERS结构

2.      设置它的所有成员为NULL。

3.      设置文件对象的SectionObjectPointer成员指向这个分配的这个地址

对于后面对这个文件流的打开,则都统一指向前面第一次打开时分配的这个结构。


你可能感兴趣的:(文件过滤驱动学习笔记(三))