VirtualAlloc功能在调用进程的虚拟地址空间中保留或提交一个页面区域。由此函数分配的内存将自动初始化为零。
// address of region to reserve or commit
LPVOID 【lpAddress】, | //保留或提交地区的地址 |
DWORD 【的dwSize】, | //区域大小 |
DWORD 【flAllocationType】, | //分配类型 |
DWORD 【//访问类型保护】 | //访问类型保护 |
); |
参数
【lpAddress】
指定要分配的区域的所需起始地址。如果正在保留内存,则指定的地址将舍入到下一个64千字节的边界。如果存储器已经被保留并被提交,地址被向下舍入到下一页边界。要确定主机上页面的大小,请使用GetSystemInfo功能。如果此参数为NULL,系统将确定在哪里分配该区域。
【的dwSize】
指定区域的大小(以字节为单位)。如果【lpAddress】参数为NULL,则该值向上舍入到下一页边界。否则,分配的页面包括包含从【lpAddress】到(【lpAddress】 + 【的dwSize】)范围内的一个或多个字节的所有页面。这意味着跨越页面边界的2字节范围会导致两个页面都包含在分配的区域中。
【flAllocationType】
指定分配类型。您可以指定以下标志的任意组合:
旗 | 含义 |
MEM_COMMIT | 在存储器或磁盘上的分页文件中分配指定区域的物理存储空间。 |
提交已经提交的页面的尝试不会导致该函数失败。这意味着可以提交一系列提交或已解除的页面,而无需担心失败。 | |
MEM_RESERVE | 在不分配任何物理存储的情况下,保留进程的虚拟地址空间的范围。任何其他分配操作(的malloc函数,LocalAlloc函数等等)不能使用保留范围,直到它被释放。在后续调用VirtualAlloc功能时,可以提交保留的页面。 |
MEM_TOP_DOWN | 以尽可能高的地址分配内存。 |
【//访问类型保护】
指定访问保护的类型。如果正在提交页面,则可以根据需要指定以下标志中的任何一个以及PAGE_GUARD和PAGE_NOCACHE保护修饰符标志:
旗 | 含义 |
PAGE_READONLY | 启用对提交的页面区域的读取访问。尝试写入承诺的区域导致访问冲突。如果系统区分只读访问权限和执行访问权限,则在承诺域中执行代码的尝试导致访问冲突。 |
PAGE_READWRITE | 启用对提交的页面区域的读取和写入访问。 |
PAGE_EXECUTE | 启用对页面的承诺区域的执行访问。尝试读取或写入承诺的区域导致访问冲突。 |
PAGE_EXECUTE_READ | 启用对页面的提交区域的执行和读取访问。尝试写入承诺的区域导致访问冲突。 |
PAGE_EXECUTE_READWRITE | 对页面的提交区域执行,读取和写入访问。 |
PAGE_GUARD | 该地区的页面变成了保护页面。任何从保护页面读取或写入的尝试都会导致操作系统引起STATUS_GUARD_PAGE异常并关闭保护页面状态。因此,保护??页作为一次性访问报警。 PAGE_GUARD标志是页面保护修饰符。应用程序使用它与其他页面保护标志之一,但有一个例外:它不能与PAGE_NOACCESS一起使用。当访问尝试导致操作系统关闭保护页面状态时,底层页面保护将接管。 如果在系统服务期间发生保护页异常,则该服务通常返回故障状态指示符。 |
PAGE_NOACCESS | 禁用对提交的页面区域的所有访问。在承诺区域中读取,写入或执行的尝试导致访问冲突异常,称为通用保护(GP)故障。 |
PAGE_NOCACHE | 不允许缓存已提交的页面区域。物理内存的硬件属性应指定为“无缓存”。这是不推荐一般用途。它对于设备驱动程序是有用的;例如,映射没有缓存的视频帧缓冲区。此标志是页面保护修饰符,仅当与PAGE_NOACCESS之外的页面保护之一使用时才有效。 |
返回值
如果函数成功,则返回值是分配的页面区域的基址。
如果函数失败,返回值为NULL。要获取扩展错误信息,请调用GetLastError.
备注
VirtualAlloc可以执行以下操作:
*提交由VirtualAlloc功能先前调用保留的页面区域。
*保留一个免费页面的区域。
*保留并提交一个免费页面的区域。
您可以使用VirtualAlloc预留一个页面块,然后再调用VirtualAlloc从保留的块中提交单个页面。这使得进程能够在不需要物理存储的情况下保留其虚拟地址空间的范围,直到需要。
进程的虚拟地址空间中的每个页面都是三种状态之一:
州 | 含义 |
自由 | 该页面未提交或保留,并且该进程不可访问。VirtualAlloc可以保留或同时保留和提交免费页面。 |
保留的 | 其他分配功能不能使用地址范围,但该页面不可访问,并且没有与之相关的物理存储。VirtualAlloc可以提交保留页面,但不能再次保留。VirtualFree功能可以释放保留页面,使其成为一个免费的页面。 |
承诺 | 为页面分配物理存储,访问由保护代码控制。只有在首次尝试读取或写入该页面时,系统才会将每个已提交的页面初始化并加载到物理内存中。当进程终止时,系统释放已提交页面的存储。VirtualAlloc可以提交已经提交的页面。这意味着您可以提交一系列页面,无论它们是否已被提交,并且该函数不会失败。VirtualFree可以解除提交的页面,释放页面的存储空间,或者可以同时解除并释放提交的页面。 |
如果【lpAddress】参数不为NULL,则该函数使用【lpAddress】和【的dwSize】参数来计算要分配的页面的区域。整个页面范围的当前状态必须与【flAllocationType】参数指定的分配类型兼容。否则,该函数失败,并且没有页面被分配。这种兼容性要求不排除提交已经提交的页面;请参见前面的列表。
PAGE_GUARD保护修饰符标志建立防护页。保护页作为单次访问警报。见守卫页.
也可以看看
GlobalAlloc, HeapAlloc, VirtualFree, VirtualLock, VirtualProtect, VirtualQuery