Я пытаюсь прочитать данные в Win32 ListView, принадлежащие другому процессу. К сожалению, мой вызов WriteProcessMemory() завершился с ошибкой «Эта функция не поддерживается в этой системе». когда я укажу «NULL» для базового адреса в моем вызове VirtualAlloc(). Если, однако, я компенсировал этот адрес VirtualAlloc() некоторым «магическим» значением, которому мне посчастливилось и выбрано наугад в момент разочарования, звонок работает в моей системе, но не работает на других. (см. код ниже)Win32 WriteProcessMemory() значение магического смещения
Может ли кто-нибудь предложить, какое это магическое смещение делает для меня? В результате проб и ошибок я могу найти значения, которые работают на определенных системах, но я не могу найти общее решение этой проблемы.
Спасибо, PaulH
(добавленные Cd-МАН)#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