对于堆栈地址,我有以下来自Windgb的PDE / PTE信息:
kd> !pte 6EFFC
VA 0006effc
PDE at C0600000 PTE at C0000370
contains 0000000065D39867 contains 0000000000000020
pfn 65d39 ---DA--UWEV not valid
DemandZero
Protect: 1 - Readonly
如果即使PTE无效也能如何更改,WinDBG如何了解只读状态?必须通过VAD完成吗?
答案 0 :(得分:3)
如果' valid
'未设置PTE的位(在您的示例中就是这种情况),然后PTE由操作系统处理,而不是由MMU处理。
在这种情况下,您的PTE是一个软件PTE(_MMPTE_SOFTWARE
结构;!= _MMPTE_HARDWARE
[您可以' dt
' windbg上的两个结构],这可能导致4种类型的软件PTE,具体取决于位域中设置的位。
如果第12到31位全部为零,则这是一个" Demand Zero" PTE(因此,不通过VAD解析)。第5位到第9位表示页面保护(0x20 =第5位设置=只读)。
保护位未正式记录,但您可以在网上的某些页面上找到它们的值。取自this reactos page:
#define MM_ZERO_ACCESS 0 // this value is not used.
#define MM_READONLY 1
#define MM_EXECUTE 2
#define MM_EXECUTE_READ 3
#define MM_READWRITE 4 // bit 2 is set if this is writable.
#define MM_WRITECOPY 5
#define MM_EXECUTE_READWRITE 6
#define MM_EXECUTE_WRITECOPY 7
#define MM_NOCACHE 8
#define MM_DECOMMIT 0x10
#define MM_NOACCESS MM_DECOMMIT|MM_NOCACHE
(注意:记住你必须左移5以上常数,因为保护位从第5位开始)
请参阅此博客文章" Windows Virtual Address Translation and the Pagefile" (特别是讨论软件PTE的部分)可以很好地解释各种PTE。