VirtualProtectEx 函数 (memoryapi.h)
更改指定进程的虚拟地址空间中已提交页面区域的保护。
语法
BOOL VirtualProtectEx(
[in] HANDLE hProcess,
[in] LPVOID lpAddress,
[in] SIZE_T dwSize,
[in] DWORD flNewProtect,
[out] PDWORD lpflOldProtect
);
参数
[in] hProcess
要更改其内存保护的进程句柄。 句柄必须具有 PROCESS_VM_OPERATION 访问权限。 有关详细信息,请参阅 进程安全和访问权限。
[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保护修饰符建立保护页。 保护页充当一次性访问警报。 有关更多信息,请参见创建保护页。
最好避免使用 VirtualProtectEx 更改 GlobalAlloc、HeapAlloc 或 LocalAlloc 分配的内存块上的页面保护,因为单个页面上可能有多个内存块。 堆管理器假定堆中的所有页面至少授予读取和写入访问权限。
保护可执行的区域时,调用程序负责在代码设置到位后通过适当调用 FlushInstructionCache 来确保缓存一致性。 否则,尝试在新可执行区域之外执行代码可能会产生不可预知的结果。
要求
要求 | 值 |
---|---|
最低受支持的客户端 | Windows XP [桌面应用 | UWP 应用] |
最低受支持的服务器 | Windows Server 2003 [桌面应用 | UWP 应用] |
目标平台 | Windows |
标头 | memoryapi.h (包括 Windows.h、Memoryapi.h) |
Library | onecore.lib |
DLL | Kernel32.dll |