en essayant d'appeler une fonction de processus en utilisant la convention fastcall de mon programme, mais j'ai eu un plantage à chaque tentative. Ont passé beaucoup de temps là-dessus et ne peut pas résoudre ce ... besoin d'aide s'il vous plaît ... est ici toutes les informations nécessaires et mon essayer:La fonction Fastcall se bloque
L'image montre le contexte d'instruction après un point d'arrêt quand est en cours d'exécution ...
Et voici mon code source du programme de la fonction:
typedef void (__fastcall * MyFoo)(void * client,DWORD trash, DWORD ConstantD, DWORD objBattid, DWORD zeroParam, DWORD thousParam, float fVal,DWORD targetID);
MyFoo launchMe;
DWORD getProcessBaseAdress(DWORD ProcessID);
char *flyffServer = "insanity flyff\0";
HWND neuzWindow = NULL;
DWORD neuzProcessID = NULL;
DWORD neuzRamAdress = NULL;
HANDLE neuzHandle = NULL;
DWORD clientAdr = NULL;
int main(){
neuzWindow = FindWindowA(0,flyffServer);
//--------------------------------------
if(neuzWindow){
GetWindowThreadProcessId(neuzWindow,&neuzProcessID);
if(neuzProcessID){
neuzHandle = OpenProcess(PROCESS_ALL_ACCESS,false,neuzProcessID);
if(neuzHandle){
neuzRamAdress = getProcessBaseAdress(neuzProcessID); // Extracting Neuz's base address
if(neuzRamAdress){
launchMe = (MyFoo)((DWORD)neuzRamAdress + 0x5C400);
clientAdr = (DWORD)neuzRamAdress + 0x8D0DC0;
printf("Instruction: 0x%08X\n",launchMe);
printf("Client ADR: 0x%08X\n",clientAdr);
for(;;Sleep(100)){
//------------ init params ------------
void * client = (void*)clientAdr;
DWORD trashDX = (DWORD)0x0000000B;
DWORD msge = (DWORD)0x0000001D;
DWORD selectedBattID = 0x04D4A929;
DWORD zeroParam = (DWORD) 0x00000000;
DWORD milleParam = 0x00010000;
float speedAtt = 0.07f;
DWORD targetID = 0x0089B964;
printf("0x%08X\n0x%08X\n0x%08X\n0x%08X\n0x%08X\n0x%08X\n%f\n0x%08X\n",
client,
trashDX,
msge,
selectedBattID,
zeroParam,
thousParam,
speedAtt,
targetID
);
launchMe(client,trashDX,msge,selectedBattID,zeroParam,milleParam,speedAtt,targetID); // -> Error
scanf("%d",&trashDX); // for blocking the program
return 0;
}
}
else printf("Unable to access to Neuz's Ram Adress\n");
}
else printf("Unable to obtain neuz's handle\n");
}
else printf("Unable to detect neuz's process ID\n");
}
else printf("Unable to detect neuz's window\n");
return 0;
}
DWORD getProcessBaseAdress(DWORD ProcessID){
HANDLE hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, ProcessID);
MODULEENTRY32 me32;
me32.dwSize = sizeof(MODULEENTRY32);
Module32First(hModuleSnap,&me32);
return (DWORD) me32.modBaseAddr;
}
Merci à l'avance :) ...
Il est impossible de répondre à cette question étant donné les informations présentées (je n'ai pas cliqué sur le lien de l'image vers un site d'hébergement d'images aléatoires). Il n'y a aucun moyen pour nous de savoir, quelle convention d'appel la fonction à l'offset '0x5C400' attend, mais si cela entraîne un * "crash" * il va de soi que ce n'est pas celui que vous avez spécifié. – IInspectable
Si vous vérifiez l'image, vous verrez une image avec cheatengine débobinant le processus pour obtenir l'adresse de l'instruction avec des éléments de pile complets pour vérifier les paramètres, et mes adresses/parameeters ont les mêmes valeurs que celles affichées dans le debbuger. Que devrais-je plus fournisseur de sorte que vous puissiez me répondre? – Mouley
La signature ** true ** de la fonction au décalage «0x5C400». Jusqu'à présent, nous ne voyons que votre meilleure estimation. – IInspectable