我想讀取另一個進程擁有的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