-
-
[求助]VAD中已经显示了COMMIT,并且已经访问过内存,PTE仍然无效
-
发表于:
2008-12-23 22:26
5011
-
[求助]VAD中已经显示了COMMIT,并且已经访问过内存,PTE仍然无效
受牛人启发,做了个实验
主要如下
先Reserve一个地址
PVOID address = VirtualAlloc(NULL,0x1000,MEM_TOP_DOWN | MEM_RESERVE,PAGE_READWRITE);
返回的地址都是0x7ff90000,检查vad可以看见已经有reserve了:
lkd> !vad 7ff90000
VAD level start end commit
8553a4d8 (-1) 7ff90 7ff90 0 Private READWRITE
然后Commit
address = VirtualAlloc(address,0x1000,MEM_COMMIT,PAGE_READWRITE);
检查vad也正常:
lkd> !vad 7ff90000
VAD level start end commit
8553a4d8 (-1) 7ff90 7ff90 1 Private READWRITE
而且检查PTE和PDE发现PDE已经建立,但是pte是无效的
然后我向这个地址写入数据了:
char* charPointer = reinterpret_cast<char*>(address);
for (int i = 0; i < length; ++i)
{
charPointer[i] = str[i];
}
但是,此时PTE仍然是无效的:
lkd> !pte 7ff90000
VA 7ff90000
PDE at C03007FC PTE at C01FFE40
contains 1E9FE867 contains 00000000
pfn 1e9fe ---DA--UWEV
折腾了好几天了,求牛人帮助。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课