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程序】显示虚拟内存映射情况
原文:http://www.cnblogs.com/5iedu/p/4853561.html