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成员指向这个分配的这个地址
对于后面对这个文件流的打开,则都统一指向前面第一次打开时分配的这个结构。