VirtualProtectEx功能可以更改指定进程的虚拟地址空间中已提交页面区域的访问保护。请注意,此函数与VirtualProtect不同,只会调用调用进程的访问保护。
BOOL VirtualProtectEx(
HANDLE 【hProcess】, | //处理进程 |
LPVOID 【lpAddress】, | //提交的页面的地址 |
DWORD 【的dwSize】, | //区域大小 |
DWORD 【flNewProtect】, | //所需的访问保护 |
PDWORD 【lpflOldProtect】 | //变址变址取得旧保护 |
); |
参数
【hProcess】
标识要更改其内存保护的进程。句柄必须具有PROCESS_VM_OPERATION权限。有关PROCESS_VM_OPERATION的更多信息,请参阅OpenProcess.
【lpAddress】
指向要更改其访问保护属性的页面区域的基址。
必须在VirtualAlloc或VirtualAllocEx功能的单一调用中分配指定区域中的所有页面。这些页面不能跨越通过单独调用VirtualAlloc或VirtualAllocEx分配的相邻区域。
【的dwSize】
指定访问保护属性更改的区域的大小(以字节为单位)。受影响页面的区域包括从【lpAddress】参数到(【lpAddress】 + 【的dwSize】)范围内的一个或多个字节的所有页面。这意味着跨越页面边界的2字节范围会导致两个页面的保护属性被更改。
【flNewProtect】
指定新的访问保护。可以根据需要指定以下标志中的任何一个以及PAGE_GUARD和PAGE_NOCACHE保护修饰符标志:
值 | 含义 |
PAGE_READONLY | 启用对提交的页面区域的读取访问。尝试写入承诺的区域导致访问冲突。如果系统区分只读访问权限和执行访问权限,则在承诺域中执行代码的尝试导致访问冲突。 |
PAGE_READWRITE | 启用对提交的页面区域的读取和写入访问。 |
PAGE_WRITECOPY | 给予承诺的页面区域的写时拷贝访问权限。 |
PAGE_EXECUTE | 启用对页面的承诺区域的执行访问。尝试读取或写入承诺的区域导致访问冲突。 |
PAGE_EXECUTE_READ | 启用对页面的提交区域的执行和读取访问。尝试写入承诺的区域导致访问冲突。 |
PAGE_EXECUTE_READWRITE | 对页面的提交区域执行,读取和写入访问。 |
PAGE_EXECUTE_WRITECOPY | 对页面的提交区域执行,读取和写入访问。页面是共享的读写和写时复制。 |
PAGE_GUARD | 该地区的页面变成了保护页面。任何从保护页面读取或写入的尝试都会导致操作系统引起STATUS_GUARD_PAGE异常,并关闭保护页面状态。因此,保护??页作为一次性访问报警。 PAGE_GUARD标志是页面保护修饰符。应用程序使用它与其他页面保护标志之一,但有一个例外:它不能与PAGE_NOACCESS一起使用。当访问尝试导致操作系统关闭保护页面状态时,底层页面保护将接管。 如果在系统服务期间发生保护页异常,则该服务通常返回故障状态指示符。 |
PAGE_NOACCESS | 禁用对提交的页面区域的所有访问。在承诺区域中读取,写入或执行的尝试导致访问冲突异常,称为通用保护(GP)故障。 |
PAGE_NOCACHE | 不允许缓存已提交的页面区域。物理内存的硬件属性应设置为“无缓存”。这是不推荐一般用途。它对于设备驱动程序是有用的;例如,映射没有缓存的视频帧缓冲区。此标志是页面保护修饰符,仅当与PAGE_NOACCESS之外的页面保护之一使用时才有效。 |
【lpflOldProtect】
指向接收页面指定区域中第一页的先前访问保护的变量。如果此参数为NULL或不指向有效变量,则该函数将失败。
返回值
如果函数成功,返回值不为零。
如果函数失败,返回值为零。要获取扩展错误信息,请调用GetLastError.
备注
访问保护值只能在提交的页面上设置。如果指定区域中的任何页面的状态未被提交,则该函数将失败并返回,而不会修改指定区域中任何页面的访问保护。
VirtualProtectEx与VirtualProtect功能相同,只不过它更改了指定进程中内存的访问保护。
PAGE_GUARD保护修饰符标志建立防护页。保护页作为单次访问警报。见守卫页.进一步讨论后卫页面。
也可以看看