基于Windows Mobile 6的VirtualQueryEx函数实现。

VirtualQueryEx这个函数很有用,可以用于查询目标进程地址空间中内存地址的信息。
但此函数在Win CE 6.0以前是不被支持的(Windows Mobile 6是基于WinCE 5.2的)。

不过也不是没有办法的,WinCE中有一未公开API:PerformCallBack4。函数声明如下:

extern "C" DWORD WINAPI PerformCallBack4(CALLBACKINFO *pcbi, DWORD dw1, DWORD dw2, DWORD dw3);

此函数网上有相关说明,我在此不多说。

接下来是VirtualQueryEx实现代码,参数同MSDN中一样:

typedef  struct  CALLBACKINFO{
    HANDLE m_hDestProcess;
    FARPROC m_pFunction;
    PVOID m_pFirstArgument;
};

extern   " C "  DWORD WINAPI PerformCallBack4(CALLBACKINFO  * pcbi, DWORD dw1, DWORD dw2, DWORD dw3);

DWORD VirtualQueryEx(HANDLE hProcess, LPVOID lpAddress, PMEMORY_BASIC_INFORMATION lpBuffer, SIZE_T dwLength)
{
    DWORD dRetn
= 0 ;
    
static  FARPROC _VirtualQuery = NULL;
    
if ( ! _VirtualQuery)
    {
        
// 获取VirtualQuery函数的址址
        HINSTANCE h_CoreDll = LoadLibrary(TEXT( " Coredll.dll " ));
        
if ( ! h_CoreDll) return  dRetn;
        _VirtualQuery
= GetProcAddress(h_CoreDll,TEXT( " VirtualQuery " ));
        FreeLibrary(h_CoreDll);
    }

    CALLBACKINFO cbi
= {hProcess};
    cbi.m_pFunction
= _VirtualQuery;
    cbi.m_pFirstArgument
= lpAddress;
    
return  PerformCallBack4( & cbi,(DWORD)lpBuffer,(DWORD)dwLength, 0 );
}

 

==补充============================================================

 PerformCallBack4函数的内部分工作原理我不是很清楚,不过从运行结果看它似乎是把代码放到了目标进程的地址空间中去执行的,时间关系也没有深入去研究。

必竟是未公开的API感觉这种方式性能不是很理想,今天换一种“标准”的方式实现:

DWORD VirtualQueryEx(HANDLE hProcess, LPVOID lpAddress, PMEMORY_BASIC_INFORMATION lpBuffer, SIZE_T dwLength)
{
    LPVOID _lpAddress;
        
/* 如果当前线程的AK不是0xFFFFFFFF,并且不加本条语句,也可以正常访问其它进程,不知道为什么?
            为保险起见我还是加上了,还请高手指点!!
*/
    
if (GetCurrentPermissions() != 0xFFFFFFFF )SetProcPermissions( 0xFFFFFFFF );  // 赋于当前线程所有进程访问权限
     if ( ! (_lpAddress = MapPtrToProcess(lpAddress,hProcess))) return   0 ;

    
return  VirtualQuery(_lpAddress,lpBuffer,dwLength);
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值