VirtualProtect 函数 (memoryapi.h)
更改调用进程的虚拟地址空间中已提交页面区域的保护。
若要更改任何进程的访问保护,请使用 VirtualProtectEx 函数。
语法
BOOL VirtualProtect(
[in] LPVOID lpAddress,
[in] SIZE_T dwSize,
[in] DWORD flNewProtect,
[out] PDWORD lpflOldProtect
);
参数
[in] lpAddress
要更改其访问保护属性的页区域的起始页的地址。
指定区域中的所有页面都必须在使用 MEM_RESERVE 调用 VirtualAlloc 或 VirtualAllocEx 函数时分配 的同一保留区域。 这些页面不能跨通过单独调用 VirtualAlloc 或 VirtualAllocEx(使用 MEM_RESERVE)分配的相邻保留区域。
[in] dwSize
要更改其访问保护属性的区域的大小(以字节为单位)。 受影响页面的区域包括从 lpAddress 参数到 (lpAddress+dwSize)
的范围中包含一个或多个字节的所有页面。 这意味着跨页边界的 2 字节范围会导致两个页面的保护属性发生更改。
[in] flNewProtect
内存保护选项。 此参数可以是 内存保护常量之一。
对于映射视图,此值必须与映射视图时指定的访问保护兼容 (请参阅 MapViewOfFile、 MapViewOfFileEx 和 MapViewOfFileExNuma) 。
[out] lpflOldProtect
指向变量的指针,该变量接收指定页区域中第一页的先前访问保护值。 如果此参数为 NULL 或未指向有效的变量,则该函数将失败。
返回值
如果该函数成功,则返回值为非零值。
如果函数失败,则返回值为零。 要获得更多的错误信息,请调用 GetLastError。
注解
只能在提交的页面上设置访问保护值。 如果未提交指定区域中任何页面的状态,则函数将失败并返回 ,而不会修改指定区域中任何页面的访问保护。
PAGE_GUARD保护修饰符建立保护页。 保护页充当一次性访问警报。 有关更多信息,请参见创建保护页。
最好避免使用 VirtualProtect 更改由 GlobalAlloc、HeapAlloc 或 LocalAlloc 分配的内存块上的页面保护,因为单个页上可以存在多个内存块。 堆管理器假定堆中的所有页面至少授予读取和写入访问权限。
保护可执行的区域时,调用程序负责在代码设置到位后通过适当调用 FlushInstructionCache 来确保缓存一致性。 否则,尝试在新可执行区域之外执行代码可能会产生不可预知的结果。
要求
最低受支持的客户端 | Windows XP [桌面应用 | UWP 应用] |
最低受支持的服务器 | Windows Server 2003 [桌面应用 | UWP 应用] |
目标平台 | Windows |
标头 | memoryapi.h (包括 Windows.h、Memoryapi.h) |
Library | onecore.lib |
DLL | Kernel32.dll |