ReadProcessMemory da resultados diferentes w7/XP

Iniciado por Nork, 5 Julio 2010, 02:01 AM

0 Miembros y 1 Visitante están viendo este tema.

Nork

Hola, tengo una duda que la verdad me resulta un poco curiosa. El tema es este:

En mi aplicación(C++) tengo el siguiente código:

Código (cpp) [Seleccionar]
int x = ReadProcessMemory(....);
int y = ReadProcessMemory(....);
int div = (x*100)/y;


Lo compilo (junto con el resto del código. Pongo éste porque se que es donde luego me falla) con VSC++ BETA y, bajo mi entorno w7 x64, me funciona bien. El tema es que cuando ejecuto el mismo exe en mi windows XP x86 el proceso se bloquea y queda colgado... he debugeado un poco y el error es en la parte de código de antes ya que las variables x e y cogen valores que nada tendrían que ser y causan problemas.

Después de ésto me he descargado en el windows xp el VSC++ Express y he puesto ese trozo de código para ver si era cuestión de tamaños de variables y que al leer no leyese lo mismo en x64 que en x86 (cosa que no le hubiera encontrado sentido), pero no, el caso es que el mismo código compilado con el express en windows XP leía correctamente de la memoria...

¿Alguna idea de que puede ser? :S

Gracias de antemano.
C' Est La Vie


Nork

#2
Código (cpp) [Seleccionar]

void CAPCyborgDlg::OnTimer(UINT_PTR nIDEvent)
{
               CJugador j;
short max = 0;
max = j.consultar_vidaMax();
short actual = 0;
actual = j.consultar_vida();
short div = 0;
div = (actual*100)/max;

               CDialog::OnTimer(nIDEvent);
}


Las llamadas a consultar_vidaMax y consultar_vida:

Código (cpp) [Seleccionar]
short CJugador::consultar_vida() {
short vida;
ReadProcessMemory(h_proc, (void*)Jugador_vida, &vida, 2, 0);
return vida;
}

short CJugador::consultar_vidaMax() {
short vida;
ReadProcessMemory(h_proc, (void*)Jugador_vidaMax, &vida, 2, 0);
return vida;
}



P.D: He compilado solamente el código que he puesto arriba por separado y en w7 me funciona bien y en windows XP me da valores aleatorios y erróneos  :-\
C' Est La Vie

Littlehorse

De donde proviene el handle del proceso? es un proceso propio o no lo es?
Intenta reproducir el error pero esta vez llamando a GetLastError luego de las llamadas a ReadProcessMemory para ver cual puede ser el error.
Siempre que tengas un argumento de conteo como el cuarto de ReadProcessMemory, intenta usar operadores como sizeof.

Saludos

An expert is a man who has made all the mistakes which can be made, in a very narrow field.

Nork

Cita de: Littlehorse en  5 Julio 2010, 03:19 AM
Intenta reproducir el error pero esta vez llamando a GetLastError luego de las llamadas a ReadProcessMemory para ver cual puede ser el error.

Gracias!! El GetLastError en w7 me devolvía un 0 OK pero el mismo exe en XP me devolvía un 6, es decir, el handle era erróneo. Al final cambié los permisos para abrir el proceso y se arregló!

Código (cpp) [Seleccionar]
h_proc = OpenProcess(PROCESS_ALL_ACCESS, false, pid);

por

Código (cpp) [Seleccionar]
h_proc = OpenProcess(PROCESS_VM_READ, false, pid);
C' Est La Vie