ReadProcessMemory en un proceso de 64 bits siempre devuelve el Error 299

Tengo algunos problemas con ReadProcessMemory. Mi código es de 64 bits. Puedo leer la memoria de cualquier proceso de 32 bits, pero ReadProcessMemory siempre falla con el código de error 299 (lectura parcial) que devuelve 0 bytes de lectura.

Mi investigación y la mayoría de las respuestas se relacionaron con los privilegios, pero tengo el token de depuración habilitado y funcionando como administrador. La dirección en la que leí el ImageBase en el encabezado opcional de PE

¡Intenté verificar el estado de la página usando VirtualQueryEx y obtuve acceso denegado!

Nota: El código se ejecuta perfectamente en cualquier proceso de 32 bits.

¿Alguna idea de qué puede estar causando esto?

HANDLE hProcess;
DWORD pid;
EnableDebugPriv();
pid=GetProcessByName("winmine.exe"); //32 bit apps work
//pid=GetProcessByName("notepad.exe"); //64 bit apps dont
hProcess = OpenProcess(PROCESS_ALL_ACCESS ,0, pid);
if(!hProcess)
{
    printf("failed to acquire handle , Error %d \n" , GetLastError());
    return FAILED;
}


//DEBUGGING
//DWORD address =   0x100000000; //64 notepad
DWORD address =  0x1000000; // 32 bit minsweeper
DWORD oldProtect=0;
printf("DEBUG pid %d - last err :%d \n" , GetProcessId(hProcess) , GetLastError() );
if(VirtualProtectEx(hProcess , (LPVOID)address,4096 /*pagesize for test*/ , PAGE_EXECUTE_READWRITE , &oldProtect))
{
    cout <<"vp done \n";
}
else cout << " vp err :" << GetLastError() << endl;
PMEMORY_BASIC_INFORMATION pmbi = new MEMORY_BASIC_INFORMATION;
if(VirtualQueryEx(hProcess,(LPVOID)address,pmbi,sizeof(MEMORY_BASIC_INFORMATION)))
{
    cout << "protection :" << pmbi->AllocationProtect << endl;
}
char value = 0;
SIZE_T * pbytes = new SIZE_T ;
ReadProcessMemory(hProcess,(LPCVOID)address ,&value,sizeof(value),pbytes);
cout << value << endl;
printf("Read status : %d ; bytes read %d  \n",GetLastError() , *pbytes );
CloseHandle(hProcess);

Respuestas a la pregunta(2)

Su respuesta a la pregunta