请输入您要查询的百科知识:

 

词条 VirtualQueryEx
释义

VirtualQueryEx

函数功能描述:查询地址空间中内存地址的信息。

函数原型:

DWORD VirtualQueryEx( HANDLE hProcess, LPCVOID lpAddress, PMEMORY_BASIC_INFORMATION lpBuffer, DWORD dwLength );

参数:

hProcess 进程句柄。

LpAddress 查询内存的地址。

LpBuffer 指向MEMORY_BASIC_INFORMATION结构的指针,用于接收内存信息。

DwLength MEMORY_BASIC_INFORMATION结构的大小。

返回值:

函数写入lpBuffer的字节数,如果不等于sizeof(MEMORY_BASIC_INFORMATION)表示失败。

备注:

MEMORY_BASIC_INFORMATION在WinNT.h中定义如下:

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 只允许执行代码,对该区域试图进行读写操作将引发访问违规。

PAGE_EXECUTE_READ 允许执行和读取。

PAGE_EXECUTE_READWRITE 允许读写和执行代码。

PAGE_EXECUTE_WRITECOPY 对于该地址空间的区域,不管执行什么操作,都不会引发访问违

规。如果试图在该页面上的内存中进行写入操作,就会将它自己

的私有页面(受页文件的支持)拷贝赋予该进程。

PAGE_GUARD 在页面上写入一个字节时使应用程序收到一个通知(通过一个异

常条件)。该标志有一些非常巧妙的用法。Windows 2000在创建

线程堆栈时使用该标志。

PAGE_NOACCESS 禁止一切访问。

PAGE_NOCACHE 停用已提交页面的高速缓存。一般情况下最好不要使用该标志,

因为它主要是供需要处理内存缓冲区的硬件设备驱动程序的开发

人员使用的。

RegionSize 用于指明内存块从基地址即BaseAddress开始的所有页面的大

小(以字节为计量单位)这些页面与含有用LpAddress参数设

定的地址的页面拥有相同的保护属性、状态和类型。

State 用于指明所有相邻页面的状态。

MEM_COMMIT 指明已分配物理内存或者系统页文件。

MEM_FREE 空闲状态。该区域的虚拟地址不受任何内存的支持。该地址空间没

有被保留。改状态下AllocationBase、AllocationProtect、Protect

和Type等成员均未定义。

MEM_RESERVE 指明页面被保留,但是没有分配任何物理内存。该状态下Protect成

员未定。

Protect 用于指明所有相邻页面(内存块)的保护属性。这些页面与含有

拥有相同的保属性、状态和类型。意义同AllocationProtect。

Type 用于指明支持所有相邻页面的物理存储器的类型(MEM_IMAGE,

MEM_MAPPED或MEM_PRIVATE)。这些相邻页面拥有相同的保护属

性、状态和类型。如果是Windows 98,那么这个成员将总是

MEM_PRIVATE 。

MEM_IMAGE 指明该区域的虚拟地址原先受内存映射的映像文件(如.exe或DLL

文件)的支持,但也许不再受映像文件的支持。例如,当写入模块

映像中的全局变量时,“写入时拷贝”的机制将由页文件来支持特

定的页面,而不是受原始映像文件的支持。

MEM_MAPPED 该区域的虚拟地址原先是受内存映射的数据文件的支持,但也许不

再受数据文件的支持。例如,数据文件可以使用“写入时拷贝”的

保护属性来映射。对文件的任何写入操作都将导致页文件而不是原

始数据支持特定的页面。

MEM_PRIVATE 指明该内存区域是私有的。不被其他进程共享。

示例代码:

#include "stdafx.h"

#include <windows.h>

#include <TCHAR.H>

BOOL ShowProcMemInfo(DWORD dwPID);

int _tmain(int argc, char* argv[])

{

ShowProcMemInfo( GetCurrentProcessId() );

return 0;

}

// 显示一个进程的内存状态 dwPID为进程ID

BOOL ShowProcMemInfo(DWORD dwPID)

{

HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,

FALSE,

dwPID);

if(hProcess == NULL)

return FALSE;

MEMORY_BASIC_INFORMATION mbi;

PBYTE pAddress = NULL;

TCHAR szInfo[200] = _T("BaseAddr Size Type State Protect \");

_tprintf(szInfo);

while(TRUE)

{

if(VirtualQueryEx(hProcess, pAddress, &mbi, sizeof(mbi)) != sizeof(mbi))

{

break;

}

if((mbi.AllocationBase != mbi.BaseAddress) && (mbi.State != MEM_FREE))

{

_stprintf(szInfo, _T(" %08X %8dK "),

mbi.BaseAddress,

mbi.RegionSize>>10);

}

else

{

_stprintf(szInfo, _T("%08X %8dK "),

mbi.BaseAddress,

mbi.RegionSize>>10);

}

LPCTSTR pStr = _T("");

switch(mbi.Type)

{

case MEM_IMAGE: pStr = _T("MEM_IMAGE "); break;

case MEM_MAPPED: pStr = _T("MEM_MAPPED "); break;

case MEM_PRIVATE: pStr = _T("MEM_PRIVATE"); break;

default: pStr = _T("-----------"); break;

}

_tcscat(szInfo, pStr);

_tcscat(szInfo, _T(" "));

switch(mbi.State)

{

case MEM_COMMIT: pStr = _T("MEM_COMMIT "); break;

case MEM_RESERVE: pStr = _T("MEM_RESERVE"); break;

case MEM_FREE: pStr = _T("MEM_FREE "); break;

default: pStr = _T("-----------"); break;

}

_tcscat(szInfo, pStr);

_tcscat(szInfo, _T(" "));

switch(mbi.AllocationProtect)

{

case PAGE_READONLY: pStr = _T("PAGE_READONLY "); break;

case PAGE_READWRITE: pStr = _T("PAGE_READWRITE "); break;

case PAGE_WRITECOPY: pStr = _T("PAGE_WRITECOPY "); break;

case PAGE_EXECUTE: pStr = _T("PAGE_EXECUTE "); break;

case PAGE_EXECUTE_READ: pStr = _T("PAGE_EXECUTE_READ "); break;

case PAGE_EXECUTE_READWRITE: pStr = _T("PAGE_EXECUTE_READWRITE"); break;

case PAGE_EXECUTE_WRITECOPY: pStr = _T("PAGE_EXECUTE_WRITECOPY"); break;

case PAGE_GUARD: pStr = _T("PAGE_GUARD "); break;

case PAGE_NOACCESS: pStr = _T("PAGE_NOACCESS "); break;

case PAGE_NOCACHE: pStr = _T("PAGE_NOCACHE "); break;

default: pStr = _T("----------------------"); break;

}

_tcscat(szInfo, pStr);

_tcscat(szInfo, _T("\"));

_tprintf(szInfo);

pAddress = ((PBYTE)mbi.BaseAddress + mbi.RegionSize);

}

CloseHandle(hProcess);

return TRUE;

}

随便看

 

百科全书收录4421916条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。

 

Copyright © 2004-2023 Cnenc.net All Rights Reserved
更新时间:2024/12/23 10:33:21