在 Windows 上修改页面 table 条目

Modify page table entry on Windows

对于堆栈地址,我有以下来自 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 完成吗?

如果未设置 PTE 的“valid”位(在您的示例中就是这种情况),则 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 位开始)

请参阅此博客post“Windows Virtual Address Translation and the Pagefile”(尤其是讨论软件 PTE 的部分)以获得关于各种 PTE 的非常好的解释。