Je ne connais pas du tout la fonction VirtualProtect.
Heureusement il y a l'aide en ligne.
En fait ce que tu veux faire c'est aller écrire dans la mémoire d'un autre process.
Dans ton programme, tu accèdes à la mémoire de ton programme lui même.
Il y avait un erreur qui empêchait d'appeler ta fonction SetHealth, je l'ai corrigée ci-dessous.
J'ai fait des essais non concluants mais mes erreurs portent sur le pointeur 0xB793E0.
Le code retour que j'ai est 6 (pointeur invalide) quand j'appelle la fonction VirtualProtectEx.
Si on ne fait pas le VirtualProtectEx, on a la même erreur mais sur le WriteProcessMemory cette fois ci.
Voici le programme que j'ai fait :
#include <windows.h>
#include <stdio.h>
void SetHealth(float fHealth, DWORD);
int main (void)
{
char Car;
printf("Entres 'v' pour faire le plein de vie et 'q' pour quitter!\n\n");
/* J'ai corriger cette partie car elle ne fonctionnait pas */
Car = getchar();
while(Car != 'q')
{
if(Car == 'v')
{
SetHealth(100, 1824); // L'id de gta_sa.exe est en dur ici, ce ne sera certainement pas la même chez toi
}
Car = getchar ();
}
return 0;
}
void SetHealth(float fHealth, DWORD ProcessId)
{
HANDLE hProcess;
DWORD BytesWritten = 0, OldProtect =0;
printf ("ProcessId = %d", ProcessId);
hProcess = OpenProcess (PROCESS_VM_WRITE+PROCESS_VM_OPERATION, FALSE, ProcessId);
if (hProcess == INVALID_HANDLE_VALUE)
{
printf ("Erreur d'ouverture du process : %d\n", GetLastError ());
return;
}
if (VirtualProtectEx (hProcess, (VOID *)0xB793E0, 4, PAGE_READWRITE, &OldProtect) == 0)
{
printf ("Erreur protection memoire : %d\n", GetLastError ());
CloseHandle (hProcess);
return;
}
if (WriteProcessMemory (hProcess, (VOID *)0xB793E0, &fHealth, 4, &BytesWritten) ==0)
{
printf ("Erreur d'écriture : %d\n", GetLastError ());
}
CloseHandle (hProcess);
}
Pour l'id du processe gta_sa.exe, il existe des fonctions pour le retrouver.
Bon courage.
++
Syg