VirtualProtect

【勇芳软件工作室】汉化HomePreviousNext

VirtualProtect功能可以更改调用进程虚拟地址空间中已提交页面的访问保护。此函数不同于VirtualProtectEx ,,它会更改任何进程的访问保护。

BOOL VirtualProtect(

LPVOID 【lpAddress】,//提交的页面的地址
DWORD 【的dwSize】,//区域的大小
DWORD 【flNewProtect】,//所需的访问保护
PDWORD 【lpflOldProtect】//变址变址取得旧保护
); 

参数

【lpAddress】

指向要更改其访问保护属性的页面区域的基址。

必须在VirtualAllocVirtualAllocEx功能的一次调用中分配指定区域中的所有页面。这些页面不能跨越通过单独调用VirtualAllocVirtualAllocEx分配的相邻区域。

【的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.

备注

您只能在提交的页面上设置访问保护值。如果指定区域中的任何页面的状态未被提交,则该函数将失败并返回,而不会修改指定区域中任何页面的访问保护。

VirtualProtect功能更改了调用进程中内存的访问保护,并且VirtualProtectEx功能更改了指定进程中内存的访问保护。

PAGE_GUARD保护修饰符标志建立防护页。保护页作为单次访问警报。有关保护页面的进一步讨论,请参阅守卫页.

也可以看看

VirtualAlloc, VirtualProtectEx