在MSDN中,我发现以下`
BaseAddress – 指向页面区域的基址的指针.
AllocationBase – 指向VirtualAlloc函数分配的一系列页面的基址的指针. BaseAddress成员指向的页面包含在此分配范围内.
但我真的不明白有什么区别.谁能告诉我区别? (不像在MSDN :))
Windows上的虚拟内存分配的粒度为64千字节,即SYstem_INFO.dwAllocationGranularity的值.但虚拟内存页面为4096字节,SYstem_INFO.dwPageSize的值.
使用VirtualAlloc分配虚拟内存时,您将始终获得一个BaseAddress等于AllocationBase的块.但是,如果您随后更改了此块中一个或多个页面的页面保护,那么您可以观察到此块被细分为不同的BaseAddress.使用示例程序最佳显示,在MSVC上运行:
#include "stdafx.h" #include <Windows.h> #include <stdio.h> #include <conio.h> void showmem(void* mem) { MEMORY_BASIC_informatION info = {}; VirtualQuery(mem,&info,sizeof info); printf("Alloc = %p,base = %p,size = %d,protect = %d\n",info.AllocationBase,info.BaseAddress,info.RegionSize,info.Protect); } int main() { BYTE* mem = (BYTE*)VirtualAlloc(0,65536,MEM_COMMIT,PAGE_READWRITE); printf("%s","Initial allocation:\n"); showmem(mem); DWORD oldprotect; BOOL ok = VirtualProtect(mem + 4096,4096,PAGE_NOACCESS,&oldprotect); printf("%s","\nAfter protection changes:\n"); showmem(mem); showmem(mem + 4096); showmem(mem + 4096 + 4096); _getch(); return 0; }
该程序的示例输出:
Initial allocation: Alloc = 00ED0000,base = 00ED0000,size = 65536,protect = 4 After protection changes: Alloc = 00ED0000,size = 4096,protect = 4 Alloc = 00ED0000,base = 00ED1000,protect = 1 Alloc = 00ED0000,base = 00ED2000,size = 57344,protect = 4
并注意VirtualProtect()调用如何要求原始块在具有不同BaseAddress但具有相同AllocationBase的3个区域中分割.
原文地址:https://www.jb51.cc/windows/364794.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。