ZwFreeVirtualMemory 函数 (ntifs.h)

ZwFreeVirtualMemory 例程发布、取消提交或同时释放指定进程的虚拟地址空间中的页面区域。

语法

NTSYSAPI NTSTATUS ZwFreeVirtualMemory(
  [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 必须是保留区域时 ZwAllocateVirtualMemory 返回的基址。

[in, out] RegionSize

指向将接收页面释放区域的实际大小的变量(以字节为单位)的指针。 例程将此变量的初始值舍入到下一个主机页大小边界,并将舍入值写回此变量。

如果在 FreeType 参数中设置了MEM_RELEASE标志,则由 RegionSize 指向的变量必须为零。 ZwFreeVirtualMemory 释放初始分配调用中保留的整个区域,ZwAllocateVirtualMemory

如果在 FreeType 参数中设置了MEM_DECOMMIT标志,ZwFreeVirtualMemory 将包含从 BaseAddress 参数到(BaseAddress + RegionSize)范围内包含一个或多个字节的所有内存页。 例如,这意味着,如果内存的双字节区域跨越页面边界,则两个页面都已取消提交。

ZwFreeVirtualMemory 取消提交由 ZwAllocateVirtualMemory保留的整个区域。 如果满足以下三个条件,则整个区域将进入保留状态:

  • 设置MEM_DECOMMIT标志。
  • BaseAddress 是保留区域时 ZwAllocateVirtualMemory 返回的基址。
  • RegionSize< 为零。

[in] FreeType

一个位掩码,其中包含描述 ZwFreeVirtualMemory 将针对指定页面区域执行的任意操作的类型。 可能的值如下:

  • MEM_DECOMMIT

    • ZwFreeVirtualMemory 将取消提交指定的页面区域。 这些页面进入保留状态。

    • 如果尝试取消提交页面,ZwFreeVirtualMemory 不会失败。 这意味着可以取消提交一系列页面,而无需首先确定其当前承诺状态。

  • MEM_RELEASE

    ZwFreeVirtualMemory 将释放页面的指定区域。 页面进入免费状态。

    如果指定此标志,则 RegionSize 点的变量必须为零,BaseAddress 必须在保留区域时 ZwAllocateVirtualMemory 返回的基址。 ZwFreeVirtualMemory 如果未满足上述任一条件,则失败。

    如果区域中的任何页面当前已提交,ZwFreeVirtualMemory 先取消提交,然后释放它们。

ZwFreeVirtualMemory 尝试发布处于不同状态的页面(某些保留页面和已提交页面)不会失败。 这意味着你可以释放一系列页面,而无需首先确定其当前承诺状态。

返回值

ZwFreeVirtualMemory 返回STATUS_SUCCESS或错误状态代码。 可能的错误状态代码包括以下内容。

返回代码 描述
STATUS_ACCESS_DENIED 进程已请求访问对象,但尚未授予这些访问权限。
STATUS_INVALID_HANDLE 指定了无效 ProcessHandle 值。
STATUS_OBJECT_TYPE_MISMATCH 请求的操作所需的对象类型与请求中指定的对象类型不匹配。

言论

进程的虚拟地址空间中的每个页面都处于以下三种状态之一。

  • 状态为免费

    该页既未提交也不保留。 进程无法访问该页面。 尝试读取或写入免费页面会导致访问冲突异常。

    可以使用 ZwFreeVirtualMemory 将保留或提交的页面置于免费状态。

  • 状态为 RESERVED

    保留页面。 其他分配函数不能使用地址范围。 进程无法访问该页面,并且没有与之关联的物理存储。 尝试读取或写入保留页会导致访问冲突异常。

    可以使用 ZwFreeVirtualMemory 将提交的内存页置于保留状态,并将保留的内存页置于可用状态。

  • 状态为 COMMITTED

    页面已提交。 为页面分配内存中或磁盘上的分页文件中的物理存储,访问由保护代码控制。

    系统仅在第一次尝试读取或写入该页时,才会将每个提交的页面初始化并加载到物理内存中。

    进程终止时,系统会释放已提交页面的所有存储。

    可以使用 ZwAllocateVirtualMemory 将提交的内存页置于保留状态或免费状态。

ZwFreeVirtualMemory 可以执行以下操作:

  • 取消提交或未提交的页面的区域。 此操作后,页面处于保留状态。
  • 释放保留页的区域。 此操作后,页面处于免费状态。
  • 取消提交并释放已提交或未提交的页面区域。 此操作后,页面处于免费状态。

ZwFreeVirtualMemory 可以取消提交处于不同状态、某些已提交和未提交的一系列页面。 这意味着可以取消提交一系列页面,而无需首先确定每个页面的当前承诺状态。 取消提交页面会释放其物理存储,无论是在内存中还是在磁盘上的分页文件中。

如果已取消提交但未发布页面,则其状态将更改为保留。 随后可以调用 ZwFreeVirtualMemory 提交它,或者 ZwFreeVirtualMemory 发布它。 尝试读取或写入保留页会导致访问冲突异常。

ZwFreeVirtualMemory 可以发布处于不同状态、某些保留和已提交的一系列页面。 这意味着你可以释放一系列页面,而无需首先确定每个页面的当前承诺状态。 最初由 ZwAllocateVirtualMemory 保留的整个页面范围必须同时发布。

如果发布页面,其状态将更改为免费,并且可用于后续分配操作。 释放或取消提交内存后,永远无法再次引用内存。 该内存中可能已存在的任何信息将永远消失。 尝试读取或写入免费页面会导致访问冲突异常。 如果需要信息,请不要取消提交或释放包含该信息的内存。

有关内核模式驱动程序的内存管理支持的详细信息,请参阅 Windows 驱动程序的内存管理

注意

如果在用户模式下调用 ZwFreeVirtualMemory 函数,则应使用名称“NtFreeVirtualMemory”而不是“ZwFreeVirtualMemory”。

对于内核模式驱动程序的调用,NtXxxZwXxx 版本的 Windows 本机系统服务例程的行为方式可能以不同的方式处理和解释输入参数。 有关 NtXxxZwXxx 例程之间的关系的详细信息,请参阅 使用 Nt 和 Zw 版本的本机系统服务例程

要求

要求 价值
最低支持的客户端 Windows 2000
目标平台 普遍
标头 ntifs.h(包括 Ntifs.h、Fltkernel.h)
NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL
DDI 符合性规则 HwStorPortProhibitedDIS(storport)PowerIrpDDis(wdm)

另请参阅

ZwAllocateVirtualMemory