pub fn virtual_free(
h_process: HANDLE,
address: *mut c_void,
size: usize,
free_type: VIRTUAL_FREE_TYPE,
)Expand description
释放、取消提交或释放和取消提交指定进程的虚拟地址空间中的内存区域。
h_process 进程的句柄。 函数释放进程的虚拟地址空间中的内存。句柄必须具有 PROCESS_VM_OPERATION 访问权限。 有关详细信息,请参阅 进程安全和访问权限。
address 指向要释放的内存区域的起始地址的指针。如果 free_type 参数 MEM_RELEASE,则 address 必须是保留区域时 virtual_alloc_ex 函数返回的基址。
size 要释放的内存区域的大小(以字节为单位)。如果 free_type 参数 MEM_RELEASE,则 size 必须为 0 (零) 。 函数释放在 对 virtual_alloc_ex 的初始分配调用中保留的整个区域。如果 free_type MEM_DECOMMIT,则函数将取消提交包含从 address 参数到 (address+size)范围内的一个或多个字节的所有内存页。 例如,这意味着跨越页边界的 2 字节内存区域会导致两个页面都解除提交。 如果 address 是 virtual_alloc_ex 返回的基址,而 size 为 0 (零) ,则函数将取消提交 virtual_alloc_ex 分配的整个区域。 之后,整个区域将处于保留状态。
free_type 释放操作的类型。 此参数须为下列值之一。
- MEM_DECOMMIT 取消提交已提交页面的指定区域。 操作后,页面将处于保留状态。如果尝试取消提交未提交的页面,函数不会失败。 这意味着,无需先确定当前承诺状态,即可取消提交一系列页面。当 address 参数提供 enclave 的基址时,不支持MEM_DECOMMIT值。 对于不支持动态内存管理 ((即 SGX1) )的 enclave 也是如此。 SGX2 enclave 允许MEM_DECOMMIT enclave 中的任意位置。
- MEM_RELEASE释放指定的页面区域或占位符(占位符,释放地址空间并可用于)的其他分配。在执行该操作之后,这些页面将处于可用状态。如果指定此值,size必须为0(零),并且address必须指向保留区域时virtual_alloc函数返回的基址。如果未满足上述任一条件,该函数将失败。如果当前已提交区域中的任何页面,该函数将首先取消提交,然后释放它们。如果尝试释放处于不同状态(一些保留和一些已提交)的页面,函数不会失败。这意味着,无需首先确定当前承诺状态即可发布一系列页面。 使用 MEM_RELEASE 时,此参数还可以指定以下值之一。
- MEM_COALESCE_PLACEHOLDERS 若要合并两个相邻占位符,请指定 MEM_RELEASE | MEM_COALESCE_PLACEHOLDERS。 合并占位符时, address 和 size 必须与要合并的占位符的总体范围完全匹配。
- MEM_PRESERVE_PLACEHOLDER 使用 virtual_alloc2 或virtual2alloc_from_app) 将占位符替换为专用分配后,将分配释放回占位符 (。若要将占位符拆分为两个占位符,请指定 MEM_RELEASE | MEM_PRESERVE_PLACEHOLDER。