VirtualProtect是否需要页面开头的地址?
Does VirtualProtect require the address of the beginning of the page?
我需要使用VirtualProtect,我的问题是关于传递给函数的区域地址。它说(在 MSDN 上)"描述起始页的地址",它必须是页面开头的地址还是该页面中的任何地址?换句话说,我应该首先使用VirtualQuery来确定页面的起始地址吗?
不需要传入页面的基址。 VirtualProtect
将接受页面中的任何地址。dwSize
参数的描述清楚地表明了这一点:
受影响页面的区域包括包含从 lpAddress 参数到 (lpAddress+dwSize) 范围内的一个或多个字节的所有页面。这意味着跨越页面边界的 2 字节范围会导致两个页面的保护属性发生更改。
如果您能够有一个跨越页面边界的双字节范围,那么lpAddress
必须在页面结束之前只有一个字节。页面不能只有一个字节长,因此它不在页面的开头。
无论哪种情况,您都不需要VirtualQuery
- 页面始终是PAGE_SIZE
的倍数,通常为 4 KiB。因此,您只需要将数字四舍五入到最接近的PAGE_SIZE
。
但我不认为你需要四舍五入;我认为任何地址都可以。不过,可能值得仔细检查。
相关文章:
- 将数组的地址分配给变量并删除
- 空基优化子对象的地址
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 如何在c++程序中找到函数的地址
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 被解释为低级别const的const对象的地址
- 将地址分配给本地指针后,公共对象的变量将消失
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- 内联程序集printf将整数解释为地址
- 为什么指针不写入类的地址?
- 如何在C++中获取该对象的类声明中对象的地址?
- 通过按地址访问变量
- 当一个新对象被分配到它的地址时,对象是否必须被销毁
- 函数名是c中该函数的第一条指令的地址吗
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- ReadProcessMemory() 不适用于像 0x2840C6C68D8 这样的长地址
- 如何表示指向地址空间开头的指针
- 为什么内存地址以0x开头
- VirtualProtect是否需要页面开头的地址?