VirtualProtect如何更改内存保护标志

时间:2014-02-25 09:52:53

标签: windows

VirtualProtect的第3个参数可以使用以下标志:

PAGE_EXECUTE
PAGE_NOACCESS
PAGE_READWRITE
PAGE_READONLY

...

首先我认为VirtualProtect可以通过使用PTE的标志来实现它。但是当我读取PTE的结构时,我在PTE中找不到记录该函数第3个参数的标志。

PTE的结构如下:

抱歉,我无法发布图片(因为没有10个声誉!),您可以在Google上找到它。

我想找到Windows记录虚拟内存页面保护标志的位置,不是PTE吗?

在阅读了一些材料之后,我注意到当PTE无效时,PTE字段的含义已经改变了!然后有5位用于保护标志。

1 个答案:

答案 0 :(得分:2)

可用的ProtectionFlags是英特尔处理器支持的超级集合。请记住,Windows是为了在各种处理器上运行而编写的,它曾经支持MIPS,Itanium,Alpha和PowerPC。今天仅仅是脚注,AMD /英特尔凭借ARM在移动设备上流行的滑坡而获胜。

英特尔处理器对页面保护​​属性的支持非常有限。页表条目具有:

  • 第1位(R / W),1允许写访问,0只允许读访问
  • 第2位(U / S),用户/监督,与用户模式代码无关
  • 第63位(XD),eXecute禁用。最新推出的AMD核心产品,最初以“增强型病毒防护”的形式销售,被英特尔采用。您今天找到的所有处理器都支持它。

所以内核映射保护标志,如下所示:

  • PAGE_NOACCESS:页面根本不会映射到RAM
  • PAGE_READONLY:R / W = 0,XD = 1
  • PAGE_READWRITE:R / W = 1,XD = 1
  • PAGE_EXECUTE:R / W = 0,XD = 0