函数简介:

获取指定窗口,指定地址的内存属性.

函数原型:

string VirtualQueryEx(hwnd,addr,pmbi)

参数定义:

hwnd 整形数: 窗口句柄或者进程ID.  默认是窗口句柄. 如果要指定为进程ID,需要调用SetMemoryHwndAsProcessId.

addr 长整形数: 需要查询的地址

pmbi 整形数: 这是一个地址,指向的内容是MEMORY_BASIC_INFORMATION32或者MEMORY_BASIC_INFORMATION64.
              
取决于要查询的进程是32位还是64. 这个地址可以为0,忽略这个参数.
              
下面是这2个结构体在vc下的定义:

typedef struct _MEMORY_BASIC_INFORMATION32 {

    DWORD BaseAddress;

    DWORD AllocationBase;

    DWORD AllocationProtect;

    DWORD RegionSize;

    DWORD State;

    DWORD Protect;

    DWORD Type;

} MEMORY_BASIC_INFORMATION32, *PMEMORY_BASIC_INFORMATION32;

typedef struct DECLSPEC_ALIGN(16) _MEMORY_BASIC_INFORMATION64 {

    ULONGLONG BaseAddress;

    ULONGLONG AllocationBase;

    DWORD     AllocationProtect;

    DWORD     __alignment1;

    ULONGLONG RegionSize;

    DWORD     State;

    DWORD     Protect;

    DWORD     Type;

    DWORD     __alignment2;

} MEMORY_BASIC_INFORMATION64, *PMEMORY_BASIC_INFORMATION64;

返回值:

字符串:
查询的结果以字符串形式.  内容是"BaseAddress,AllocationBase,AllocationProtect,RegionSize,State,Protect,Type"
数值都是10进制表达.

示例:

这里我们给一个VC的例子. 其它语言都差不多.
MEMORY_BASIC_INFORMATION32 mbi = {0};
dm->VirtualQueryEx(hwnd,0x400000,&mbi);
if (mbi.
BaseAddress)
{
    //
做一些你需要的操作
}


:如果正常方式无法修改内存的读写属性,可以尝试配合DmGuard中的memory护盾,突破部分窗口内存保护。