请教一个VirtualQuery函数问题

凌乱1980 2008-05-26 10:43:39
我现在想获取一个API函数所在的DLL路径,代码如下:
MEMORY_BASIC_INFORMATION mbi;
char *pfun = (char*)MessageBox;
char szModName[MAX_PATH]={0};
while(VirtualQuery(pfun, &mbi, sizeof(mbi)) == sizeof(mbi))
{
int nLen = GetModuleFileNameA((HINSTANCE) mbi.AllocationBase,
szModName, sizeof(szModName));
nLen = 0;
}
szModName被填充为USER32.dll(路径被我省略了)
现在有1个问题不是很明白:
MEMORY_BASIC_INFORMATION结构体里面的BaseAddress成员和AllocationBase成员的区别是什么呢?他们两者什么时候会相等呢?
...全文
133 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
凌乱1980 2008-06-07
  • 打赏
  • 举报
回复
好的,谢谢
sunlin7 2008-06-06
  • 打赏
  • 举报
回复
BaseAddress最初分配时的总地址,AllocationBase是二次分配(如果有的话)时的地址。
可以用以下代码帮助理解:
LPVOID p0 = vitualalloc(4096*4, MEM_COMMIT, ...); // 让系统自动决定分配地址
LPVOID p1 = VitualAlloc((LPBYTE)p0 + 4096 + 1, ...);// 在指定位置分配内存
然后分别对p0和p1使用VitualQuery(p0, ... ); 和 VitualQuery(p1, ... ); 就可以看到差别了。
凌乱1980 2008-06-03
  • 打赏
  • 举报
回复
救命啊,有人知道吗
凌乱1980 2008-05-31
  • 打赏
  • 举报
回复
有人知道嘛?
凌乱1980 2008-05-29
  • 打赏
  • 举报
回复
谢谢!
[Quote=引用 1 楼 cnzdgs 的回复:]
BaseAddress就是内存页开始地址,就是把VirtualQuery的第1个参数的第12位清0,没什么用。
AllocationBase是内存块的开始地址。
[/Quote]
为什么是第12位清0呢?

那BaseAddress和AllocationBase什么情况下会相等呢?
阿呆_ 2008-05-29
  • 打赏
  • 举报
回复
BaseAddress就是包含你查询的地址最近的内存页起始地址
AllocationBase就是整块内存被分配出来时的起始地址(分配的可能包含很多页)
cnzdgs 2008-05-27
  • 打赏
  • 举报
回复
BaseAddress就是内存页开始地址,就是把VirtualQuery的第1个参数的第12位清0,没什么用。
AllocationBase是内存块的开始地址。

15,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧