保护VirtualAlloc分配的内存中的各个页面

时间:2012-01-17 05:10:22

标签: c winapi memory protection

假设我使用VirtualAlloc()0x060000000x06010000(那是16个4KB页面)PAGE_READWRITE保护VirtualProtect()分配了几页连续内存。但过了一段时间,我想在内存可执行区域中创建一个页面。在阅读mprotect的msdn文档之后,如果可能或不可能,我会感到困惑。在linux中,它与 +-------------------------------------------------------+ | Commited memory with a single VirtualAlloc call (RW-) | +-------------------------------------------------------+ ↑ ↑ 0x06000000 0x06010000

我正在尝试做的视觉示例:

     +------------------+-----------+------------------------+
     |      (RW-)       |   (RWX)   |         (RW-)          |
     +------------------+-----------+------------------------+
     ↑                  ↑           ↑                        ↑
0x06000000         0x06003000  0x06004000               0x06010000

我想将保护更改为此(不按比例):

VirtualProtect()

我可以通过VirtualProtect(0x06003000, 0x1000, PAGE_EXECUTE_READWRITE, &oldProtection); 这样的电话接听吗?

{{1}}

我目前无法访问Windows系统来测试这个,这就是为什么我在SO上问它

2 个答案:

答案 0 :(得分:1)

VirtualProtect(0x06003000, 0x1000, PAGE_EXECUTE_READWRITE, &oldProtection);对于从0x06003000开始的已分配/已提交的0x1000字节的内存块是正确的。

答案 1 :(得分:0)

VirtualProtect的文档非常明确:

  

受影响网页的区域包含包含一个或多个网页的所有网页   从lpAddress参数到(lpAddress + dwSize)的范围内的字节数。   这意味着跨越页面边界的2字节范围会导致   要更改的两个页面的保护属性。

请注意,您只能更改已提交页面上的保护(MEM_RESERVE仅保留进程虚拟地址空间中的空间)

以下引用不适用于您的具体问题,但如果您更改设计,则应牢记这一点:

  

指定区域中的所有页面必须位于相同的保留区域内   调用VirtualAlloc或VirtualAllocEx时分配的区域   功能使用MEM_RESERVE。页面不能跨越相邻的保留   通过单独调用VirtualAlloc或分配的区域   VirtualAllocEx使用MEM_RESERVE。