是的,您可以使用 VirtualAlloc 和 VirtualProtect 来设置受保护免于读/写操作的内存部分。
您必须重新实现operator new
and operator delete
(及其 [] 亲戚),以便您的内存分配由您的代码控制。
请记住,它只会以每页为基础,并且每次分配您将使用(至少)三页的虚拟内存 - 在 64 位系统上不是一个大问题,但可能会导致问题,如果您在 32 位系统中有许多分配。
大致你需要做的(你实际上应该找到构建 Windows 的页面大小 - 我太懒了,所以我将使用 4096 和 4095 来表示 pagesize 和 pagesize-1 - 你还需要做更多错误检查比此代码所做的检查!!!):
void *operator new(size_t size)
{
Round size up to size in pages + 2 pages extra.
size_t bigsize = (size + 2*4096 + 4095) & ~4095;
// Make a reservation of "size" bytes.
void *addr = VirtualAlloc(NULL, bigsize, PAGE_NOACCESS, MEM_RESERVE);
addr = reinterpret_cast<void *>(reinterpret_cast<char *>(addr) + 4096);
void *new_addr = VirtualAlloc(addr, size, PAGE_READWRITE, MEM_COMMIT);
return new_addr;
}
void operator delete(void *ptr)
{
char *tmp = reinterpret_cast<char *>(ptr) - 4096;
VirtualFree(reinterpret_cast<void*>(tmp));
}
正如我所说的那样,我没有尝试编译此代码,因为我只有一个 Windows VM,而且我懒得下载编译器并查看它是否真的编译。[我知道这个原则是有效的,因为我们在几年前工作的地方做过类似的事情]。