VirtualProtectEx功能失败 - 错误487,仅在Windows XP上

时间:2013-06-02 06:40:07

标签: c++ c winapi memory process

请允许我澄清一下,此代码在Windows Vista和Windows 7上100%有效,但是,VirtualProtectEx函数在Windows XP上失败,GetLastError()代码为487 - ERROR_INVALID_ADDRESS。

这是相关的功能:

int HpRemoteHookInstall(__in HANDLE m_hProcess, __in LPVOID m_pvTargetAddress, __in LPVOID m_pvRedirectAddress) {
// Misc checks
if ( m_pvTargetAddress == NULL || m_pvRedirectAddress == NULL )
{
    return -1;
}

DWORD  m_dwOldRights         = NULL;
BYTE   m_btHotPatch[7];

ZeroMemory(m_btHotPatch, sizeof(m_btHotPatch));

    // m_hProcess - remote process
// m_pvTargetAddress - remote base
// Allow write access - code will be restored later on
if ( VirtualProtectEx(m_hProcess, (LPVOID)m_pvTargetAddress, 6, PAGE_EXECUTE_READWRITE, &m_dwOldRights) == FALSE )
{
    DisplayError(); // displays getlasterror function in messagebox
    return -2;
}

我可能做错了什么? 谢谢你的时间。

编辑 - m_pvTargetAddress值在每个操作系统上都是常量(在每次执行时都是相同的),但在三个操作系统之间有所不同

编辑 - 我通过GetThreadContex(远程线程)获取m_pvTargetAddress - >轻描淡写

编辑 - 以下是VirtualQueryEx在调用时返回的值:

Windows XP

  • 0 - 分配基础
  • 0 - 分配保护
  • 2088828928 - 基地址
  • 1 - 保护
  • 983040 - 区域大小
  • 65536 - 州
  • 0 - type

Windows 7

  • 2003959808 - 分配基础
  • 128 - 分配保护
  • 2004025344 - 基地址
  • 32 - 保护
  • 876544 - 区域大小
  • 4096 - 州
  • 16777216 - 输入

Windows Vista

  • 2006122496 - 分配基础
  • 128 - 分配保护
  • 2006536192 - 基地址
  • 32 - 保护
  • 389120 - 区域大小
  • 4096 - 州
  • 16777216 - 输入

1 个答案:

答案 0 :(得分:1)

我建议您打印m_pvTargetAddress值,并检查它是否是目标地址空间中的有效地址,例如:调试器或ProcessExplorer等,或调用VirtualQueryEx以在调用VirtualProtectEx之前查询地址是否有效。要检查的另一件事是按照MSDN的引用:

  

指定区域中的所有页面必须位于相同的保留区域内   调用VirtualAlloc或VirtualAllocEx时分配的区域   功能使用MEM_RESERVE。页面不能跨越相邻的保留   通过单独调用VirtualAlloc或分配的区域   VirtualAllocEx使用MEM_RESERVE。