14.4 确定地址空间的状态
14.4.1 查询内存状态API
(1)VirtualQuery(Ex)函数
参数 |
描述 |
HANDLE hProcess |
要查询的另一个进程的句柄。(注意,这个参数只有VirtualQueryEx才有,VirtualQuery只能查本进程的信息) |
LPCVOID pvAddress |
需要查询的虚拟内存地址 |
PMEMORY_BASIC_INFORMATION pmbi |
返回的信息被放入该指针指向的MEMORY_BASIC_INFORMATION结构体。 |
DWORD dwLength |
上述结构体的大小,表示返回时复制到上述结构体中的字节数。 |
(2)MEMORY_BASIC_INFORMATION结构体
字段 |
描述 |
BaseAddress |
这个值是VirtualQuery(Ex)第一个参数向下取整到页面的边界值 |
AllocationBase |
标识出区域的基地址,该区域包含参数pvAddress所指向的地址 |
AllocationProtect |
标识出在最开始预订区域时为该区域指定的保护属性 |
RegionSize |
标识出区域的大小,以字节为单位。区域的起始地址为BaseAddress,区域中所有页面拥有相同的保护属性、状态及类型 |
State |
标识出区域中页面的状态(MEM_FREE、MEM_RESERVE或MEM_COMMIT) 如果为MEM_FREE,则AllocationBase、AllocationProtect、Protect及Type成员都没有意义。 如果为MEM_RESERVE,那么Protect成员没有意义。 |
Protect |
针对所有相邻页面(前提是其保护属性、状态和类型与其中包含 pvAddress参数中所指定地址的页面相同),标识出它们的保护属性(PAGE_*) |
Type |
标识出区域中页面的类型(MEM_IMAGE、MEM_MAPPED或MEM_PRIVATE) |
14.4.2 自定义的VMQuery(Ex)函数——得到更完整的内存信息
(1)BOOL VMQuery(HANDLE hProcess,LPCVOID pvAddress,PVMQUERY pVMQ);
(2)VMQUERY结构体
字段 |
描述 |
备注 |
PVOID pvRgnBaseAddress |
表示虚拟地址空间区域的起始地址,该区域包含了参数pvAddress所指定的地址 |
区 域 信 息 |
DWORD dwRgnProtection |
表示在最开始预订地址空间区域时为该区域指定的保护属性(PAGE_*) |
|
SIZE_T RgnSize |
表示所预订区域的大小,以字节为单位 |
|
DWORD dwRgnStorage |
表示用于区域中各块的物理存储器的类型。它可以是以下任一值:MEM_FREE、MEM_IMAGE、MEM_MAPPED或MEM_PRIVATE |
|
DWORD dwRgnBlocks |
表示区域中块的数量 |
|
DWORD dwRgnGuardBlks |
表示区域中具有PAGE_GUARD保护属性标志的块的数量。通常这个值为0或1。如果为1,说明该区域是为了线程栈而预订的。 |
|
BOOL bRgnIsAStack |
表示该区域是否包含线程栈。该值是通过近似猜测得到的,因为没有任何方法能百分百地肯定一个区域是否包含线程栈 |
|
PVOID pvBlkBaseAddress |
表示块的起始地址,该块包含了参数pvAddress所指示的地址 |
块 信 息 |
DWORD dwBlkProtection |
表示块的保护属性 |
|
SIZE_T BlkSize |
表示块的大小,以字节为单位 |
|
DWORD dwBlkStorage |
表示块的存储器类型。它可以是以下任一值:MEM_FREE、MEM_IMAGE、MEM_RESERVE、MEM_MAPPED或MEM_PRIVATE |
【VMMap程序】显示虚拟内存映射情况
时间: 2024-11-05 04:55:48