我正在尝试读取另一个进程拥有的 Win32 ListView 中的数据。不幸的是,我的 WriteProcessMemory() 调用失败并出现错误“此系统不支持此函数”。当我在 VirtualAlloc() 调用中为基地址指定“NULL”时。但是,如果我将 VirtualAlloc() 地址偏移了某个“神奇”值,而这些值我很幸运并在沮丧的时刻随机选择,那么该调用在我的系统上有效,但在其他系统上失败。(见下面的代码)
任何人都可以建议这个神奇的抵消对我有什么作用吗?通过反复试验,我可以找到适用于特定系统的值,但我找不到此问题的通用解决方案。
谢谢,保罗
#define MAGIC_OFFSET (DWORD)0x01020000
LVHITTESTINFO hti = { 0 };
hti.pt = clientPoint;
LPVOID lpBuffer = ::VirtualAlloc( NULL, 1, MEM_RESERVE, PAGE_READWRITE );
::VirtualFree( lpBuffer, 0, MEM_RELEASE );
lpBuffer = ::VirtualAlloc( (LPVOID)((DWORD)lpBuffer + MAGIC_OFFSET), sizeof( hti ), MEM_RESERVER, PAGE_READWRITE );
DWORD dwBuffer = (DWORD)lpBuffer + MAGIC_OFFSET - sizeof( hti );
if( !::WriteProcessMemory( hProcess, (LPVOID)dwBuffer, (LPVOID)&hti, sizeof( hti ), NULL ) )
return 0;
if( ListView_HitTest( hWndListView, (LPVOID)dwBuffer ) < 0 )
return 0;
if( !::ReadProcessMemory( hProcess, (LPVOID)dwBuffer, (LPVOID)&hti, sizeof( hti ), NULL ) )
return 0;
::VirtualFree( lpBuffer, 0, MEM_RELEASE );
澄清(由 Cd-MaN 添加):这是在 Windows Mobile 平台上,可能是非 x86 架构。所以情况可能会有所不同(ARM处理器中是否有单独的地址空间?)。