能力值:
( LV2,RANK:10 )
|
-
-
2 楼
faint,还没人回
我想了下,可能是这个样子的:操作系统将4G的空间划分成为不同的内存区间,为了便于快速的查找这些区间,使用一个平衡二叉树VAD(Linux有相同的实现).但是,如果进程只是申请一个内存区间的话,会构建相应的_CONTROL_AREA结构,但是并没有文件映射到该内存区间,因此_FILE_OBJECT是无效的。
也就是说,VAD节点_MMVAD(还有其他的vad类型)不必要对应一个文件对象_FILE_OBJECT.
我想可能是这个样子的,抛砖引玉了算是~~
|
能力值:
( LV9,RANK:610 )
|
-
-
3 楼
召唤小伟来告诉你~
|
能力值:
( LV8,RANK:130 )
|
-
-
4 楼
很惭愧~我不懂。
我当时只是乱搞的。。具体的原理并不清楚。
不过抹掉ntdll之后,每个进程里面都看不到了(在is里面)。
召唤Sysnap来告诉你。
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
right here waiting ~
|
能力值:
( LV12,RANK:600 )
|
-
-
6 楼
看你的文字看了那么久就是理解不了你想问什么..晕..俺的理解能力有问题
还是给几个说明性的文字你自己看看吧
VAD: 是windows用来描述进程地址空间的底2G中哪些已经被保留,哪些还没有..
比如我们一个线程访问0x51000000这个用户态地址..如果这个地址是首次被访问到..那系统会遍历VAD..尝试找个描述这个地址的VAD..然后MM管理器会为0x51000000创建一个页表项,如果找到了VAD...就把VAD中相关的信息填到这个页表项中...如果0x51000000没有对应的VAD描述..说明这个地址还没被保留..产生访问错误..否则就是缺页中断..
我想VAD既然是所有进程共享的文件...你先VAD这句理解有问题吧...首不等于DLL....只是一般情况下那些DLL是可以共享的...
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
刚开始的时候,想岔了,以为一个VAD节点必定对应一个文件对象。现在明白了~~
谢谢~~
很深的感觉是Linux和Windows真的在许多方面有许多是一样的~
|
能力值:
( LV8,RANK:130 )
|
-
-
8 楼
vad tree里面还有nls~
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
写了个函数,前序遍历 VAD树,运行时,老是 访问错误,还以为是 自己的程序写错了。。。。
MiIsAddressValid( Control_Area, TRUE ) 这个函数到底检查什么呢?
感觉好像是虚拟内存是否在物理内存中。请赐教!
怎么来标志,一个VAD描述的块 是用来 映射 DLL的,还是只是分配的内存区?
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
一直跟到:
dt _MMVAD 0x81d081d0
nt!_MMVAD
+0x000 u1 : __unnamed
+0x004 LeftChild : (null)
+0x008 RightChild : (null)
+0x00c StartingVpn : 0x10
+0x010 EndingVpn : 0x10
+0x014 u : __unnamed
+0x018 ControlArea : 0x0a130004 _CONTROL_AREA
+0x01c FirstPrototypePte : 0xe56c6946 _MMPTE
+0x020 LastContiguousPte : 0x81d76940 _MMPTE
+0x024 u2 : __unnamed
kd> dt _CONTROL_AREA 0x0a130004
nt!_CONTROL_AREA
+0x000 Segment : ????
+0x004 DereferenceList : _LIST_ENTRY
+0x00c NumberOfSectionReferences : ??
+0x010 NumberOfPfnReferences : ??
+0x014 NumberOfMappedViews : ??
+0x018 NumberOfSystemCacheViews : ??
+0x01c NumberOfUserReferences : ??
+0x020 u : __unnamed
+0x024 FilePointer : ????
+0x028 WaitingForDeletion : ????
+0x02c ModifiedWriteCount : ??
+0x02e FlushInProgressCount : ??
+0x030 WritableUserReferences : ??
+0x034 QuadwordPad : ??
全是问号了,呵呵!
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
我还有另一个疑问,就是 VAD的跟,也就是 在Eprocess 结构体里得到的vadroot,它的CONTROL_AREA 里的 file_object 的值始终都是 0x40000000 !!!!
很奇怪:第一,这个值,为什么不变。更奇怪的是: file_object 是个文件对象,既然是文件对象,那么,就应该在内核空间,也就是 高2g空间,可是这却是 4000-0000,纳闷。。。
|
|
|