我想读取另一个进程拥有的Win32 ListView中的数据。不幸的是,我的WriteProcessMemory()调用失败,并显示错误“此系统不支持此功能”。当我在我的VirtualAlloc()调用中为基地址指定“NULL”时。但是,如果我通过一些我感到幸运的“魔术”值来抵消该VirtualAlloc()地址,并在沮丧的时刻随机挑选,则该调用在我的系统上运行,但在其他系统上失败。 (见下面的代码)Win32 WriteProcessMemory()魔术补偿值
有人可以建议这个神奇的胶印是为我做的吗?通过试验和错误,我可以找到适用于特定系统的值,但是我无法找到解决此问题的通用解决方案。
感谢, PaulH
#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);
澄清(镉人加入):这是Windows Mobile平台上,大概非x86架构。所以情况可能会有所不同(ARM处理器中是否有单独的地址空间?)。
这似乎很好地工作。我无法相信我对这个话题的所有研究都从未改变过。 非常感谢 – PaulH 2008-11-11 19:20:20