NtFreeVirtualMemory 函数 (ntifs.h)
NtFreeVirtualMemory 例程发布、取消提交或同时发布和取消提交,这是指定进程的虚拟地址空间中的页面区域。
语法
__kernel_entry NTSYSCALLAPI NTSTATUS NtFreeVirtualMemory(
[in] HANDLE ProcessHandle,
[in, out] PVOID *BaseAddress,
[in, out] PSIZE_T RegionSize,
[in] ULONG FreeType
);
参数
[in] ProcessHandle
要释放的页面所在的进程的句柄。 使用 Ntddk.h中定义的 NtCurrentProcess 宏来指定当前进程。
[in, out] BaseAddress
指向将接收页面释放区域的基虚拟地址的变量的指针。
如果在 FreeType 参数中设置了MEM_RELEASE标志,*BaseAddress 必须是保留区域时 NtAllocateVirtualMemory 返回的基址。
[in, out] RegionSize
指向将接收页面释放区域的实际大小的变量(以字节为单位)的指针。 例程将此变量的初始值舍入到下一个主机页大小边界,并将舍入值写回此变量。
如果在 *FreeType中设置了MEM_RELEASE标志,*RegionSize 必须为零。 NtFreeVirtualMemory 释放初始分配调用中保留的整个区域,以 NtAllocateVirtualMemory。
如果在 *FreeType中设置了MEM_DECOMMIT标志,NtFreeVirtualMemory 取消提交范围中包含一个或多个字节的所有内存页,这些内存页的范围从 *BaseAddress 到 (*BaseAddress + *RegionSize)。 例如,这意味着,如果内存的双字节区域跨越页面边界,则两个页面都已取消提交。
NtFreeVirtualMemory 取消提交由 NtAllocateVirtualMemory保留的整个区域。 如果满足以下三个条件,则整个区域将进入保留状态:
- 设置MEM_DECOMMIT标志。
- *BaseAddress 是保留区域时 NtAllocateVirtualMemory 返回的基址。
- *RegionSize 为零。
[in] FreeType
一个位掩码,其中包含描述 NtFreeVirtualMemory 将针对指定页面区域执行的任意作类型的标志。 下表列出了可能的值。
旗 | 意义 |
---|---|
MEM_DECOMMIT | NtFreeVirtualMemory 将取消提交指定的页面区域。 这些页面进入保留状态。 如果尝试取消提交的页面,NtFreeVirtualMemory 不会失败。 这意味着可以取消提交一系列页面,而无需首先确定其当前承诺状态。 |
MEM_RELEASE | NtFreeVirtualMemory 将释放指定的页面区域。 页面进入免费状态。 如果指定此标志,RegionSize 必须为零,BaseAddress 必须在保留区域时 NtAllocateVirtualMemory 返回的基址。 如果未满足上述任一条件,则 NtFreeVirtualMemory 失败。 如果区域中的任何页面当前已提交,NtFreeVirtualMemory 先取消提交,然后释放它们。 NtFreeVirtualMemory 尝试发布处于不同状态的页面(某些保留页和已提交页面)不会失败。 这意味着你可以释放一系列页面,而无需首先确定其当前承诺状态。 |
返回值
NtFreeVirtualMemory 返回STATUS_SUCCESS或错误状态代码。 可能的错误状态代码包括以下内容。
返回代码 | 描述 |
---|---|
STATUS_ACCESS_DENIED | 进程已请求访问对象,但尚未授予这些访问权限。 |
STATUS_INVALID_HANDLE | 指定了无效 ProcessHandle 值。 |
STATUS_OBJECT_TYPE_MISMATCH | 请求的作所需的对象类型与请求中指定的对象类型不匹配。 |
言论
进程的虚拟地址空间中的每个页面都处于下表中所述的三种状态之一。
州 | 意义 |
---|---|
自由 | 该页既未提交也不保留。 进程无法访问该页面。 尝试读取或写入免费页面会导致访问冲突异常。 可以使用 NtFreeVirtualMemory 将保留或提交的页面置于免费状态。 |
保留 | 保留页面。 其他分配函数不能使用地址范围。 进程无法访问该页面,并且没有与之关联的物理存储。 尝试读取或写入保留页会导致访问冲突异常。 可以使用 NtFreeVirtualMemory 将提交的内存页置于保留状态,并将保留的内存页置于可用状态。 |
承诺 | 页面已提交。 为页面分配内存中或磁盘上的分页文件中的物理存储,访问由保护代码控制。 系统仅在第一次尝试读取或写入该页时,才会将每个提交的页面初始化并加载到物理内存中。 进程终止时,系统会释放已提交页面的所有存储。 可以使用 NtAllocateVirtualMemory 将提交的内存页置于保留状态或免费状态。 |
NtFreeVirtualMemory 可以执行以下作:
- 取消提交或未提交的页面的区域。 此作后,页面处于保留状态。
- 释放保留页的区域。 此作后,页面处于免费状态。
- 取消提交并释放已提交或未提交的页面区域。 此作后,页面处于免费状态。
NtFreeVirtualMemory 可以取消提交处于不同状态、某些已提交和未提交的一系列页面。 这意味着可以取消提交一系列页面,而无需首先确定每个页面的当前承诺状态。 取消提交页面会释放其物理存储,无论是在内存中还是在磁盘上的分页文件中。
如果已取消提交但未发布页面,则其状态将更改为保留。 随后可以调用 NtAllocateVirtualMemory 提交它,或者 NtFreeVirtualMemory 发布它。 尝试读取或写入保留页会导致访问冲突异常。
NtFreeVirtualMemory 可以释放处于不同状态、某些保留和已提交的一系列页面。 这意味着你可以释放一系列页面,而无需首先确定每个页面的当前承诺状态。 NtAllocateVirtualMemory 最初保留的整个页面范围必须同时发布。
如果发布页面,其状态将更改为免费,并且可用于后续分配作。 释放或取消提交内存后,永远无法再次引用内存。 该内存中可能已存在的任何信息将永远消失。 尝试读取或写入免费页面会导致访问冲突异常。 如果需要信息,请不要取消提交或释放包含该信息的内存。
有关内核模式驱动程序的内存管理支持的详细信息,请参阅 Windows 驱动程序的内存管理。
注意
如果在用户模式下调用 NtFreeVirtualMemory 函数,则应使用名称“NtFreeVirtualMemory”而不是“ZwFreeVirtualMemory”。
对于内核模式驱动程序的调用,NtXxx 和 ZwXxx 版本的 Windows 本机系统服务例程的行为方式可能以不同的方式处理和解释输入参数。 有关 NtXxx 与 ZwXxx 例程之间的关系的详细信息,请参阅 使用 Nt 和 Zw 版本的本机系统服务例程。
要求
要求 | 价值 |
---|---|
最低支持的客户端 | Windows 2000 |
目标平台 | 普遍 |
标头 | ntifs.h(包括 Ntifs.h、Fltkernel.h) |
库 | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL |
DDI 符合性规则 | HwStorPortProhibitedDDI、PowerIrpDDis |