windows - Windows下如何判断两个地址是否在同一个页面?

标签 windows

具体来说,如果在不同的时间读取ESP寄存器指向的地址(包含栈顶地址),如何判断这两个地址是否在同一页?我相信这些地址是物理地址而不是虚拟地址,对吧?这两个读数可能来自不同的进程。 Windows 是如何进行页面分配的?

补充:也许我明白了。那么如果我们使用一个 4KB 的页面,是否意味着从 0x....XXXX0000 到 0x....XXXX1000 的地址在同一个页面中?

最佳答案

你几乎是对的。这个想法很合理,但范围是 0x????00000x????0FFF。如果你要使用 DWORD_PTRULONG_PTR 你也可以屏蔽掉低 12 位 (ptr & 0xFFF) 并比较你得到的两个指针值. ULONG_PTRDWORD_PTR 应该适用于 x64 和 x86。

请记住,您的系统可能正在使用大页面。所以一定要使用 GetNativeSystemInfo和/或 GetSystemInfo 分别。您正在 SYSTEM_INFO 结构中查找 dwAllocationGranularity 的值。

所有这些在同一个进程内存空间内是正确的。

关于物理地址的问题:,我重复,用户模式进程可以看到实际的物理地址,除非某些驱动程序或内核本身搞砸了。

假设您谈论的是 DLL 中的地址,您无法对从 Vista 及其 ASLR 功能开始的共享页面做出正确的假设。

关于windows - Windows下如何判断两个地址是否在同一个页面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15377035/

相关文章:

java - 如何从 Java (127.0.0.1) 获取本地主机 IP

c++ - Windows 线程 : when should you use InterlockedExchangeAdd()?

c# - 如何保存 Windows 程序的电子邮件/密码组合?

windows - "Can' t 读取文件“尝试在批处理文件中排除目录时

mysql - 安装后无法连接到 'localhost' (10061) 上的 MySQL 服务器

java - 为什么我无法启动 orbd 服务 CORBA IIOP?

c++ - OpenGL Performer 最简单的移植路径?

python - 在 Windows 机器上并行处理 32 位和 64 位 Python 安装的标准方法是什么?

windows - 在一个 windows cmd 行中运行两个命令,一个命令是 SET 命令

c++ - 等待 ShellExecuteEx(在 Windows 进程上设置访问权限)