第14章 探索虚拟内存(2)

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

第14章 探索虚拟内存(2)的相关文章

Windows核心编程:第14章 探索虚拟内存

Github https://github.com/gongluck/Windows-Core-Program.git //第14章 探索虚拟内存.cpp: 定义应用程序的入口点. // #include "stdafx.h" #include "第14章 探索虚拟内存.h" int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lp

第14章 探索虚拟内存

14.1 系统信息 (1)获取系统信息GetSystemInfo函数中的SYSTEM_INFO参数 字段 描述 WORD wProcessorArchitecture或 wReserved 联合体.为今后扩展而保留,请勿使用 DWORD dwPageSize 表示CPU页面的大小.在x86和x64机器中,该值为4KB(4096字节),在IA-64机器中,该值为8K字节(8192字节) LPVOID lpMinimumApplicationAddress 给出每个进程可用地址空间中最小的内存地址.

敏捷软件开发:原则、模式与实践——第14章 使用UML

第14章 使用UML 在探索UML的细节之前,我们应该先讲讲何时以及为何使用它.UML的误用和滥用已经对软件项目造成了太多的危害. 14.1 为什么建模 建模就是为了弄清楚某些东西是否可行.当模型比要构建的真实实体便宜很多时,我们就会使用模型来研究设计. 14.1.1 为什么构建软件模型 当我们有一些确定的东西需要测试,并且使用UML要比使用代码测试的代价更低一些是,就使用UML.比如,我有一个关于某个设计的想法.我想知道团队中的其他开发人员是否认为它是一个好的想法,于是,我就在白板上画一幅UM

《TCP/IP详解卷1:协议》第14章 DNS:域名系统---读书笔记

<TCP/IP详解卷1:协议>第14章 DNS:域名系统---读书笔记 1.引言 5.指针查询 DNS中一直难于理解的部分就是指针查询方式,即给定一个IP地址,返回与该地址对应的域名. 当一个组织加入Internet,并获得DNS域名空间的授权,如noao.edu,则它们也获得了对应IP地址的in-addr.arpa域名空间的授权.在noao.edu这个例子中,它的网络号是140.252的B类网络.在DNS树中结点in-addr.arpa的下一级必须是该IP地址的第一字节(例中为140),再下

JavaScript高级程序设计(第三版)学习笔记13、14章

第13章,事件 事件冒泡 IE的事件叫做事件冒泡:由具体到不具体 <!DOCTYPE html> <html> <head> <title>Event Bubbling Example</title> </head> <body> <div id="myDiv">Click Me</div> </body> </html> 如果你单击了<div>

&lt;&lt;精通iOS开发&gt;&gt;第14章例子代码小缺陷的修复

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 首先推荐大家看这本书,整本书逻辑非常清晰,代码如何从无到有,到丰满说的很有条理. 说实话本书到目前为止错误还是极少的,不过人无完人,在第14章前半部分项目的代码中,作者在MasterVC到DetailVC中又直接添加了一个segue,该segue的ID为"masterToDetail",作用是当新建一个tinyPix文档时可以直接跳转到DetailV

第 14 章 迭代器模式【Iterator Pattern】

以下内容出自:<<24种设计模式介绍与6大设计原则>> 周五下午,我正在看技术网站,第六感官发觉有人在身后,扭头一看,我C,老大站在背后,赶忙站起来, “王经理,你找我?” 我说. “哦,在看技术呀.有个事情找你谈一下,你到我办公室来一下.” 老大说. 到老大办公室, “是这样,刚刚我在看季报,我们每个项目的支出费用都很高,项目情况复杂,人员情况也不简单,我看着 也有点糊涂,你看,这是我们现在还在开发或者维护的103 个项目,你能不能先把这些项目信息重新打印一份 给我,咱们好查查到

C++ primer plus读书笔记——第14章 C++中的代码重用

第14章 C++中的代码重用 1. 使用公有继承时,类可以继承接口,可能还有实现(基类的纯虚函数提供接口,但不提供实现).获得接口是is-a关系的组成部分.而使用组合,类可以获得实现,但不能获得接口.不继承接口是has-a关系的组成部分. 2. C++还有另一种实现has-a关系的途径——私有继承.使用私有继承,基类的公有成员和保护成员都将称为派生类的私有成员.这意味着基类方法将不会称为派生类对象公有接口的一部分,但可以在派生类的成员函数中使用它们. 3. 包含将对象作为一个命名的成员对象添加到

14章类型信息之使用类字面常量

14章类型信息-之类型转换前先做检查--之使用类字面常量--类名.class--以及动态instanceof(isInstance方法)----递归计数(计算各个类的个数) 实例代码: 实体类父类: //: typeinfo/pets/Individual.javapackage typeinfo.pets; public class Individual implements Comparable<Individual> {  private static long counter = 0;