假设我使用VirtualAlloc()
从0x06000000
到0x06010000
(那是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上问它
答案 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。