原文链接 -> 传送门
函数功能:
改变调用进程的虚拟地址空间提交页区域的保护属性。
可以调用 VirtualProtectEx 函数改变其他进程的访问保护。
API 函数原型:
注释:_In_ 说明该参数是输入的,_Out_ 说明该参数是输出的。
BOOL WINAPI VirtualProtect( _In_ LPVOID lpAddress, _In_ SIZE_T dwSize, _In_ DWORD flNewProtect, _Out_ PDWORD lpflOldProtect );
参数解析:
|
参数 |
含义 |
|
lpAddress |
1. 指向要被改变访问保护属性页面区域起始页地址指针 |
|
dwSize |
1. 指定要变更的访问保护属性区域大小,单位字节 |
|
flNewProtect |
1. 内存保护属性选项,是内存保护常量(详见:Memory Protection Constants)之一 |
|
lpflOldProtect |
1. 指向指定页面区域起始页的原访问保护变量值的指针 |
返回值:
1. 如果函数调用成功,返回一个非 0 值;
2. 如果函数调用失败,返回值是 0。
若想获得更多的错误信息,请调用 GetLastError 函数。
备注:
1. 只有在已提交的页面,您才可以设置访问保护值。如果区域内有一个页面状态是未被提交,那么函数调用失败且该区域任何页面的访问保护都不会被修改。
2. 使用 PAGE_GUARD 参数值创建保护页。该保护页作为一次性访问警示。更多信息,查阅 Creating Guard Pages。
3. 最后避免使用 VirtualProtect 函数修改那些被 GlobalAlloc、HeapAlloc 或者 LocalAlloc 函数分配的内存块的页面保护属性。因为在一个页面中会存在多个内存块,堆管理器默认所有堆中的页面都可进行读写操作。
4. 当保护将要执行区域,调用程序应该通过调用对应的 FlushInstructionCache 函数确保缓存一致性和相应的代码是否被编写。否则执行代码超出新可执行区域可能产生不可预知的结果。
需求:
|
Minimum supported client |
Windows xp [仅桌面应用程序] |
|
Minimum supported server |
Windows 2003 服务器版 [仅桌面应用程序] |
|
Header |
WinBase.h (包含于 Windows.h) |
|
Library |
Kernel32.lib |
|
DLL |
Kernel32.dll |




