● VirtualQueryEx 函数
功能:检索在指定进程的虚拟地址空间内的一系列页面的信息。
函数参数
参数1:hProcess [in]
进程句柄
参数2:lpAddress [in, optional]
查询虚拟内存地址
参数3:lpBuffer [out]
MEMORY_BASIC_INFORMATION 结构体指针
参数4:dwLength [in]
结构体指针的大小
返回值:
函数写入lpBuffer的字节数,如果不等于sizeof(MEMORY_BASIC_INFORMATION)表示失败。
MEMORY_BASIC_INFORMATION 结构体
typedef struct _MEMORY_BASIC_INFORMATION {
PVOID BaseAddress; // 区域基地址。
PVOID AllocationBase; // 分配基地址。
DWORD AllocationProtect; // 区域被初次保留时赋予的保护属性。
SIZE_T RegionSize; // 区域大小(以字节为计量单位)。
DWORD State; // 状态(MEM_FREE、MEM_RESERVE或 MEM_COMMIT)。
DWORD Protect; // 保护属性。
DWORD Type; // 类型。
} MEMORY_BASIC_INFORMATION, *PMEMORY_BASIC_INFORMATION;
BaseAddress 与lpAddress参数的值相同
AllocationBase 指明用VirtualAlloc函数分配内存区域的基地址。lpAddress在该区域之内
AllocationProtect 指明该地址空间区域被初次保留时赋予该区域的保护属性。
PAGE_READONLY 只读属性
PAGE_READWRITE 允许读写
PAGE_EXECUTE_READ 允许执行和读取。
PAGE_EXECUTE_READWRITE 允许读写和执行代码。
PAGE_EXECUTE_WRITECOPY 对于该地址空间的区域,不管执行什么操作,都不会引发访问违规
PAGE_GUARD 在页面上写入一个字节时使应用程序收到一个通知(通过一个异常条件)
PAGE_NOACCESS 禁止一切访问
PAGE_NOCACHE 停用已提交页面的高速缓存。一般情况下最好不要使用该标志,因为它主要是供需要处理内存缓冲区的硬件设备驱动程序的开发人员使用的
RegionSize 用于指明内存块从基地址即BaseAddress开始的所有页面的大小
State 用于指明所有相邻页面的状态。
MEM_FREE 空闲状态
MEM_RESERVE 指明页面被保留
Protect 用于指明所有相邻页面
Type 用于指明支持所有相邻页面的物理存储器的类型(MEM_IMAGE,MEM_MAPPED或MEM_PRIVATE)
MEM_IMAGE 指明该区域的虚拟地址原先受内存映射的映像文件(如.exe或DLL文件)的支持
MEM_MAPPED 该区域的虚拟地址原先是受内存映射的数据文件的支持,但也许不再受数据文件的支持
MEM_PRIVATE 指明该内存区域是私有的。不被其他进程共享
1 #define UNICODE 2 #include <stdio.h> 3 #include <windows.h> 4 #include <process.h> 5 6 int main() 7 { 8 DWORD hProcessID = GetCurrentProcessId(); 9 HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, hProcessID); 10 MEMORY_BASIC_INFORMATION mbi; 11 if( sizeof(mbi) == VirtualQueryEx(hProcess, 0x0, &mbi, sizeof(mbi))) 12 { 13 printf("BaseAddr:0x%X Size:%d State:%d",(UINT)mbi.BaseAddress, mbi.RegionSize, mbi.State); 14 } 15 return 0; 16 }
1 #define UNICODE 2 #include <stdio.h> 3 #include <windows.h> 4 #include <process.h> 5 6 int main() 7 { 8 DWORD hProcessID = GetCurrentProcessId(); 9 HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, hProcessID); 10 MEMORY_BASIC_INFORMATION mbi; 11 12 DWORD dwAddr = 0x0; 13 while( sizeof(mbi) == VirtualQueryEx(hProcess, (LPVOID)dwAddr, &mbi, sizeof(mbi))) 14 { 15 printf("BaseAddr:0x%X Size:%d State:%d ",(UINT)mbi.BaseAddress, mbi.RegionSize, mbi.State); 16 dwAddr += (DWORD)mbi.RegionSize; 17 } 18 return 0; 19 }