title: Win32 WriteProcessMemory() magical offset value
body: <p>I'm trying to read the data in a Win32 ListView owned by another process. Unfortunately, my WriteProcessMemory() call fails with the error "This function is not supported on this system." when I specify "NULL" for the base address in my VirtualAlloc() call. If, however, I offset that VirtualAlloc() address by some "magic" value that I got lucky with and picked at random during a moment of frustration, the call works on my system, but fails on other ones. (see the code below)</p>
  
  <p>Can anybody suggest what this magical offset is doing for me? By trial and error, I can find values that work on specific systems, but I can't find a general solution to this problem.</p>
  
  <p>Thanks,
  PaulH</p>
  
  <pre><code>#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)&amp;hti, sizeof( hti ), NULL ) )
      return 0;
  
  if( ListView_HitTest( hWndListView, (LPVOID)dwBuffer ) &lt; 0 )
      return 0;
  
  if( !::ReadProcessMemory( hProcess, (LPVOID)dwBuffer, (LPVOID)&amp;hti, sizeof( hti ), NULL ) )
      return 0;
  
  ::VirtualFree( lpBuffer, 0, MEM_RELEASE );
  </code></pre>
  
  <p>Clarification (added by Cd-MaN): this is on a Windows Mobile platform, probably non-x86 architecture. So the situation may be different (are there separate address spaces in ARM processors?).</p>