別のプロセスが所有する Win32 ListView のデータを読み込もうとしています。残念ながら、私の WriteProcessMemory() 呼び出しは、「この関数はこのシステムではサポートされていません」というエラーで失敗します。VirtualAlloc() 呼び出しでベース アドレスに「NULL」を指定した場合。ただし、その VirtualAlloc() アドレスを、幸運にもフラストレーションの瞬間にランダムに選択した「魔法の」値でオフセットすると、呼び出しはシステムで機能しますが、他のシステムでは失敗します。(以下のコードを参照)
この魔法のオフセットが私のために何をしているのか、誰か提案できますか? 試行錯誤により、特定のシステムで機能する値を見つけることができますが、この問題の一般的な解決策は見つかりません。
ありがとう、ポールH
#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 プロセッサには個別のアドレス空間がありますか?)。