This commit is contained in:
Guus Waals 2025-05-29 23:59:05 +08:00
parent 35a220de3f
commit 4a669d86b7
12 changed files with 5901 additions and 655 deletions

View File

@ -1,616 +0,0 @@
// AUTO-GENERATED FILE, MOVE TO 'gh_fix' FOLDER PREVENT OVERWRITING!!!!!
#include <r3/binders/auto.h>
#include <gh_global.h>
extern "C" {
int setupWindow(HINSTANCE instance, undefined4 param_2, int windowedParam); // 00402140 // setupWindow
undefined FUN_00470db0(void); // 00470db0 // FUN_00470db0
undefined r3_checkDisc(void); // 004464f0 // r3_checkDisc
undefined FUN_00503710(void); // 00503710 // FUN_00503710
undefined r3_initAllModules(void); // 00401000 // r3_initAllModules
undefined FUN_00472150(void); // 00472150 // FUN_00472150
undefined r3_wait_for_dvd(char * param_1, char * param_2, undefined4 param_3); // 0043e540 // r3_wait_for_dvd
undefined FUN_004725a0(void); // 004725a0 // FUN_004725a0
int r3_get_gli_width1(void); // 0047baf0 // r3_get_gli_width1
undefined gfx_init2(void); // 00470be0 // gfx_init2
void g_setInitVar0(void); // 00401310 // g_setInitVar0
int r3_get_gli_height1(void); // 0047bb00 // r3_get_gli_height1
undefined FUN_004010b0(void); // 004010b0 // FUN_004010b0
undefined FUN_00401320(void); // 00401320 // FUN_00401320
void r3_noop(void * p_cTxt1, void * p_cTxt2); // 00401100 // r3_noop
undefined FUN_005038e0(void); // 005038e0 // FUN_005038e0
undefined FUN_004fb300(void); // 004fb300 // FUN_004fb300
undefined spawnThread(void); // 004477d0 // spawnThread
undefined r3_engineLoop(void); // 00401220 // r3_engineLoop
// 00401630
int r3_main(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR *cmdline,int showCmd)
{
undefined4 uVar1;
undefined2 uVar2;
undefined2 uVar3;
LPSTR pCVar3;
char *pcVar4;
FILE *pFVar5;
LONG LVar6;
HMODULE hLibModule;
DWORD DVar7;
HANDLE hTargetProcessHandle;
HANDLE hSourceHandle;
HANDLE hSourceProcessHandle;
uint *ppCVar8;
HWND hWnd;
int iVar10;
int iVar11;
int iVar12;
int iVar13;
uint uVar14;
HKEY unaff_ESI;
char *pcVar17;
void *p_cTxt1;
void *p_cTxt2;
undefined4 uStack_85c;
undefined4 uStack_858;
LPSTR lpBuffer;
UINT uiParam;
BYTE uStack_83c [4];
DWORD pHStack_838;
DWORD pvStack_834;
char UStack_830 [16];
char tStack_820 [260];
CHAR aCStack_71c [256];
char acStack_61c [16];
CHAR pathToUbi_ini [228];
char acStack_528 [16];
char acStack_518 [244];
char acStack_424 [16];
CHAR aCStack_414 [244];
char acStack_320 [16];
char acStack_310 [240];
char acStack_220 [256];
char acStack_120 [260];
HINSTANCE instance;
uint *puStack_14;
undefined4 uStack_10;
int iStack_8;
BOOL BVar18;
char cVar1;
undefined4 chars;
DWORD dwOptions;
LPRECT lpRect;
LPHANDLE lpTargetHandle;
undefined4 uVar22;
lpBuffer = pathToUbi_ini;
uiParam = 0x104;
/* Append windows dir / ubi.ini */
uStack_858 = 0x40164d;
GetWindowsDirectoryA(lpBuffer,0x104);
iVar13 = -1;
pcVar4 = acStack_61c;
do {
pcVar17 = pcVar4;
if (iVar13 == 0) break;
iVar13 = iVar13 + -1;
pcVar17 = pcVar4 + 1;
cVar1 = *pcVar4;
pcVar4 = pcVar17;
} while (cVar1 != '\0');
*(undefined4 *)(pcVar17 + -1) = s_UbiSoft_Ubi_ini + Field<0, 4>();
*(undefined4 *)(pcVar17 + 3) = s_UbiSoft_Ubi_ini + Field<4, 4>();
*(undefined4 *)(pcVar17 + 7) = s_UbiSoft_Ubi_ini + Field<8, 4>();
*(undefined4 *)(pcVar17 + 0xb) = s_UbiSoft_Ubi_ini + Field<12, 4>();
pcVar17[0xf] = s_UbiSoft_Ubi_ini[0x10];
pCVar3 = GetCommandLineA();
pcVar4 = pCVar3 + 1;
iVar13 = -(int)pcVar4;
do {
cVar1 = *pcVar4;
pcVar4[(int)(tStack_820 + iVar13)] = cVar1;
pcVar4 = pcVar4 + 1;
} while (cVar1 != '\0');
pcVar4 = strrchr(tStack_820,0x5c);
if (pcVar4 == (char *)0x0) {
/* Read from ubi.ini */
GetPrivateProfileStringA
(lpAppName_005b68f0,s_Directory_005b68f8,s_None,tStack_820,0xff,acStack_61c);
iVar13 = strcmpi(tStack_820,s_None);
}
else {
pcVar4 = strrchr(tStack_820,0x5c);
*pcVar4 = '\0';
iVar13 = chdir(tStack_820);
if (iVar13 != -1) goto LAB_00401765;
/* Read from ubi.ini */
GetPrivateProfileStringA
(lpAppName_005b68f0,s_Directory_005b68f8,s_None,tStack_820,0xff,acStack_61c);
iVar13 = strcmpi(tStack_820,s_None);
}
if (iVar13 != 0) {
chdir(tStack_820);
}
LAB_00401765:
/* strcpy */
iVar13 = 0;
do {
cVar1 = tStack_820[iVar13];
r3_main_data_005d28b6.gameDataDir[iVar13] = cVar1;
iVar13 = iVar13 + 1;
} while (cVar1 != '\0');
strlwr(r3_main_data_005d28b6.gameDataDir);
iVar13 = -1;
pcVar4 = r3_main_data_005d28b6.gameDataDir;
do {
if (iVar13 == 0) break;
iVar13 = iVar13 + -1;
cVar1 = *pcVar4;
pcVar4 = pcVar4 + 1;
} while (cVar1 != '\0');
joined_r0x00401792:
if (iVar13 != -2) {
uVar14 = 0xffffffff;
pcVar4 = r3_main_data_005d28b6.gameDataDir;
do {
if (uVar14 == 0) break;
uVar14 = uVar14 - 1;
cVar1 = *pcVar4;
pcVar4 = pcVar4 + 1;
} while (cVar1 != '\0');
if (r3_main_data_005d28b6.gameDataDir[~uVar14 - 2] != '\\') goto LAB_004017ce;
uVar14 = 0xffffffff;
pcVar4 = r3_main_data_005d28b6.gameDataDir;
do {
if (uVar14 == 0) break;
uVar14 = uVar14 - 1;
cVar1 = *pcVar4;
pcVar4 = pcVar4 + 1;
} while (cVar1 != '\0');
r3_main_data_005d28b6.gameDataDir[~uVar14 - 2] = '\0';
iVar13 = -1;
pcVar4 = r3_main_data_005d28b6.gameDataDir;
do {
if (iVar13 == 0) break;
iVar13 = iVar13 + -1;
cVar1 = *pcVar4;
pcVar4 = pcVar4 + 1;
} while (cVar1 != '\0');
goto joined_r0x00401792;
}
LAB_004017ce:
pFVar5 = fopen(acStack_61c,fopen_mode_r_text);
GetPrivateProfileStringA
(lpAppName_005b68f0,s_Adapter_005b68e4,(LPCSTR)&lpDefault_005cf96c,acStack_310,0xff,
acStack_61c);
if ((pFVar5 == (FILE *)0x0) || (acStack_310[0] == '\0')) {
/* Concat game data dir with r3 setup exe */
iVar13 = 0;
do {
cVar1 = r3_main_data_005d28b6.gameDataDir[iVar13];
acStack_518[iVar13] = cVar1;
iVar13 = iVar13 + 1;
} while (cVar1 != '\0');
iVar13 = -1;
pcVar4 = acStack_518;
do {
pcVar17 = pcVar4;
if (iVar13 == 0) break;
iVar13 = iVar13 + -1;
pcVar17 = pcVar4 + 1;
cVar1 = *pcVar4;
pcVar4 = pcVar17;
} while (cVar1 != '\0');
*(undefined4 *)(pcVar17 + -1) = s__R3_Setup_DX8_exe_005b68d0 + Field<0, 4>();
*(undefined4 *)(pcVar17 + 3) = s__R3_Setup_DX8_exe_005b68d0 + Field<4, 4>();
*(undefined4 *)(pcVar17 + 7) = s__R3_Setup_DX8_exe_005b68d0 + Field<8, 4>();
*(undefined4 *)(pcVar17 + 0xb) = s__R3_Setup_DX8_exe_005b68d0 + Field<12, 4>();
*(undefined2 *)(pcVar17 + 0xf) = s__R3_Setup_DX8_exe_005b68d0 + Field<16, 2>();
pFVar5 = fopen(acStack_518,fopen_mode_r_binary);
if (pFVar5 == (FILE *)0x0) {
MessageBoxA((HWND)0x0,s_Unable_to_find_R3_Setup_DX8_exe__005b6880,s_Rayman_3_Error_005b68bc,
0x10);
return -1;
}
fclose(pFVar5);
spawnl(0,acStack_518,acStack_518,0);
pFVar5 = fopen(acStack_61c,fopen_mode_r_text);
if (pFVar5 == (FILE *)0x0) {
return -1;
}
}
fclose(pFVar5);
/* Open reg key
HKEY_LOCAL_MACHINE\\SOFTWARE\\UBI SOFT\\RAYMAN 3 */
LVar6 = RegOpenKeyExA((HKEY)0x80000002,s_SOFTWARE_UBI_SOFT_RAYMAN_3_005b6864,0,0x20019,
(PHKEY)&stack0xfffff7b8);
if (LVar6 == 0) {
LVar6 = RegQueryValueExA(unaff_ESI,s_CompleteInstall_005b6854,(LPDWORD)0x0,&pvStack_834,
uStack_83c,&pHStack_838);
DAT_007d9cc4 = (uint)(LVar6 == 0);
if (unaff_ESI != (HKEY)0x0) {
RegCloseKey(unaff_ESI);
}
}
else {
DAT_007d9cc4 = 0;
}
GetPrivateProfileStringA
(lpAppName_005b68f0,s_Language_005b6840,s_English_005b684c,aCStack_71c,0xff,acStack_61c)
;
sprintf(g_mutexName_Rayman3,s_percents,lpAppName_005b68f0);
sprintf(g_windowTitle,s_percents,s_windowTitle);
/* Setup localized quiting/restoring strings */
iVar13 = strcmpi(aCStack_71c,s_French_005b6828);
if (iVar13 == 0) {
sprintf(s_windowTitleRestoring,s_Restauration_fmt,s_windowTitle);
chars = s_QUITTER + Field<4, 4>();
pcVar4 = s_ou_appuyez_sur_Echap_pour_quitte_005b67d0;
pcVar17 = s_quitting1;
for (iVar13 = 0xb; uVar22 = s_QUITTER + Field<4, 4>(), iVar13 != 0; iVar13 = iVar13 + -1) {
*(undefined4 *)pcVar17 = *(undefined4 *)pcVar4;
pcVar4 = pcVar4 + 4;
pcVar17 = pcVar17 + 4;
}
s_wndStrQuiting[0] = s_QUITTER[0];
s_wndStrQuiting[1] = s_QUITTER[1];
s_wndStrQuiting[2] = s_QUITTER[2];
s_wndStrQuiting[3] = s_QUITTER[3];
/* Wrong decompilation? */
s_QUITTER[4] = (char)chars;
s_QUITTER[5] = SUB41(chars,1);
s_QUITTER[6] = SUB41(chars,2);
s_QUITTER[7] = SUB41(chars,3);
s_wndStrQuiting[4] = s_QUITTER[4];
s_wndStrQuiting[5] = s_QUITTER[5];
s_wndStrQuiting[6] = s_QUITTER[6];
s_wndStrQuiting[7] = s_QUITTER[7];
s_QUITTER + Field<4, 4>() = uVar22;
sprintf(g_windowTitle,s__s___Pause_005b67c4,s_windowTitle);
pcVar4 = s_Restauration;
pcVar17 = s_wndStrRestoring;
for (iVar13 = 7; iVar13 != 0; iVar13 = iVar13 + -1) {
*(undefined4 *)pcVar17 = *(undefined4 *)pcVar4;
pcVar4 = pcVar4 + 4;
pcVar17 = pcVar17 + 4;
}
}
else {
iVar13 = strcmpi(aCStack_71c,s_Spanish_005b67a0);
if (iVar13 == 0) {
sprintf(s_windowTitleRestoring,s__s___Restablecer_datos____005b6784,s_windowTitle);
uVar2 = s_SALIR_005b675c + Field<4, 2>();
pcVar4 = s_Pulsa_ESC_para_salir_Rayman_3__005b6764;
pcVar17 = s_quitting1;
for (iVar13 = 7; chars = s_SALIR_005b675c + Field<0, 4>(), iVar13 != 0; iVar13 = iVar13 + -1) {
*(undefined4 *)pcVar17 = *(undefined4 *)pcVar4;
pcVar4 = pcVar4 + 4;
pcVar17 = pcVar17 + 4;
}
*(undefined2 *)pcVar17 = *(undefined2 *)pcVar4;
pcVar17[2] = pcVar4[2];
uVar3 = s_SALIR_005b675c + Field<4, 2>();
uVar22 = s_SALIR_005b675c + Field<0, 4>();
s_SALIR_005b675c[0] = (char)chars;
s_SALIR_005b675c[1] = SUB41(chars,1);
s_SALIR_005b675c[2] = SUB41(chars,2);
s_SALIR_005b675c[3] = SUB41(chars,3);
s_wndStrQuiting[0] = s_SALIR_005b675c[0];
s_wndStrQuiting[1] = s_SALIR_005b675c[1];
s_wndStrQuiting[2] = s_SALIR_005b675c[2];
s_wndStrQuiting[3] = s_SALIR_005b675c[3];
s_SALIR_005b675c[4] = (char)uVar2;
s_SALIR_005b675c[5] = SUB21(uVar2,1);
s_wndStrQuiting[4] = s_SALIR_005b675c[4];
s_wndStrQuiting[5] = s_SALIR_005b675c[5];
s_SALIR_005b675c + Field<0, 4>() = uVar22;
s_SALIR_005b675c + Field<4, 2>() = uVar3;
sprintf(g_windowTitle,s__s___Rotura_005b6750,s_windowTitle);
pcVar4 = s_Restablecer_datos____005b6738;
pcVar17 = s_wndStrRestoring;
for (iVar13 = 5; iVar13 != 0; iVar13 = iVar13 + -1) {
*(undefined4 *)pcVar17 = *(undefined4 *)pcVar4;
pcVar4 = pcVar4 + 4;
pcVar17 = pcVar17 + 4;
}
*pcVar17 = *pcVar4;
}
else {
iVar13 = strcmpi(aCStack_71c,s_Italian_005b6730);
if (iVar13 == 0) {
sprintf(s_windowTitleRestoring,s__s___Ripristino_dati____005b6718,s_windowTitle);
uVar2 = s_USCIRE_005b66ec + Field<4, 2>();
pcVar4 = s_Premi_ESC_per_uscire_da_Rayman_3_005b66f4;
pcVar17 = s_quitting1;
for (iVar13 = 8; cVar1 = s_USCIRE_005b66ec[6], iVar13 != 0; iVar13 = iVar13 + -1) {
*(undefined4 *)pcVar17 = *(undefined4 *)pcVar4;
pcVar4 = pcVar4 + 4;
pcVar17 = pcVar17 + 4;
}
s_wndStrQuiting[0] = s_USCIRE_005b66ec[0];
s_wndStrQuiting[1] = s_USCIRE_005b66ec[1];
s_wndStrQuiting[2] = s_USCIRE_005b66ec[2];
s_wndStrQuiting[3] = s_USCIRE_005b66ec[3];
*(undefined2 *)pcVar17 = *(undefined2 *)pcVar4;
uVar3 = s_USCIRE_005b66ec + Field<4, 2>();
s_wndStrQuiting[6] = cVar1;
s_USCIRE_005b66ec[4] = (char)uVar2;
s_USCIRE_005b66ec[5] = SUB21(uVar2,1);
s_wndStrQuiting[4] = s_USCIRE_005b66ec[4];
s_wndStrQuiting[5] = s_USCIRE_005b66ec[5];
s_USCIRE_005b66ec + Field<4, 2>() = uVar3;
sprintf(g_windowTitle,s__s___Pausa_005b66e0,s_windowTitle);
s_wndStrRestoring[0] = s_Ripristino_dati____005b66cc[0];
s_wndStrRestoring[1] = s_Ripristino_dati____005b66cc[1];
s_wndStrRestoring[2] = s_Ripristino_dati____005b66cc[2];
s_wndStrRestoring[3] = s_Ripristino_dati____005b66cc[3];
s_wndStrRestoring[4] = s_Ripristino_dati____005b66cc[4];
s_wndStrRestoring[5] = s_Ripristino_dati____005b66cc[5];
s_wndStrRestoring[6] = s_Ripristino_dati____005b66cc[6];
s_wndStrRestoring[7] = s_Ripristino_dati____005b66cc[7];
s_wndStrRestoring[8] = s_Ripristino_dati____005b66cc[8];
s_wndStrRestoring[9] = s_Ripristino_dati____005b66cc[9];
s_wndStrRestoring[10] = s_Ripristino_dati____005b66cc[10];
s_wndStrRestoring[0xb] = s_Ripristino_dati____005b66cc[0xb];
s_wndStrRestoring + Field<12, 4>() = s_Ripristino_dati____005b66cc + Field<12, 4>();
s_wndStrRestoring + Field<16, 2>() = s_Ripristino_dati____005b66cc + Field<16, 2>();
s_wndStrRestoring[0x12] = s_Ripristino_dati____005b66cc[0x12];
}
else {
iVar13 = strcmpi(aCStack_71c,s_German_005b66c4);
if (iVar13 == 0) {
sprintf(s_windowTitleRestoring,s__s___Daten_Reparatur____005b66ac,s_windowTitle);
chars = s_BEENDIGEN_005b6678 + Field<0, 4>();
pcVar4 = &CHAR_E_005b6684;
pcVar17 = s_quitting1;
for (iVar13 = 9; uVar2 = s_BEENDIGEN_005b6678 + Field<8, 2>(), uVar22 = s_BEENDIGEN_005b6678 + Field<4, 4>(),
iVar13 != 0; iVar13 = iVar13 + -1) {
*(undefined4 *)pcVar17 = *(undefined4 *)pcVar4;
pcVar4 = pcVar4 + 4;
pcVar17 = pcVar17 + 4;
}
*(undefined2 *)pcVar17 = *(undefined2 *)pcVar4;
uVar1 = s_BEENDIGEN_005b6678 + Field<0, 4>();
s_BEENDIGEN_005b6678[0] = (char)chars;
s_BEENDIGEN_005b6678[1] = SUB41(chars,1);
s_BEENDIGEN_005b6678[2] = SUB41(chars,2);
s_BEENDIGEN_005b6678[3] = SUB41(chars,3);
s_wndStrQuiting[0] = s_BEENDIGEN_005b6678[0];
s_wndStrQuiting[1] = s_BEENDIGEN_005b6678[1];
s_wndStrQuiting[2] = s_BEENDIGEN_005b6678[2];
s_wndStrQuiting[3] = s_BEENDIGEN_005b6678[3];
s_BEENDIGEN_005b6678 + Field<0, 4>() = uVar1;
pcVar17[2] = pcVar4[2];
uVar3 = s_BEENDIGEN_005b6678 + Field<8, 2>();
chars = s_BEENDIGEN_005b6678 + Field<4, 4>();
s_BEENDIGEN_005b6678[4] = (char)uVar22;
s_BEENDIGEN_005b6678[5] = SUB41(uVar22,1);
s_BEENDIGEN_005b6678[6] = SUB41(uVar22,2);
s_BEENDIGEN_005b6678[7] = SUB41(uVar22,3);
s_wndStrQuiting[4] = s_BEENDIGEN_005b6678[4];
s_wndStrQuiting[5] = s_BEENDIGEN_005b6678[5];
s_wndStrQuiting[6] = s_BEENDIGEN_005b6678[6];
s_wndStrQuiting[7] = s_BEENDIGEN_005b6678[7];
s_BEENDIGEN_005b6678[8] = (char)uVar2;
s_BEENDIGEN_005b6678[9] = SUB21(uVar2,1);
s_wndStrQuiting[8] = s_BEENDIGEN_005b6678[8];
s_wndStrQuiting[9] = s_BEENDIGEN_005b6678[9];
s_BEENDIGEN_005b6678 + Field<4, 4>() = chars;
s_BEENDIGEN_005b6678 + Field<8, 2>() = uVar3;
sprintf(g_windowTitle,s__s___Pause_005b67c4,s_windowTitle);
s_wndStrRestoring[0] = s_Daten_Reparatur____005b6664[0];
s_wndStrRestoring[1] = s_Daten_Reparatur____005b6664[1];
s_wndStrRestoring[2] = s_Daten_Reparatur____005b6664[2];
s_wndStrRestoring[3] = s_Daten_Reparatur____005b6664[3];
s_wndStrRestoring[4] = s_Daten_Reparatur____005b6664[4];
s_wndStrRestoring[5] = s_Daten_Reparatur____005b6664[5];
s_wndStrRestoring[6] = s_Daten_Reparatur____005b6664[6];
s_wndStrRestoring[7] = s_Daten_Reparatur____005b6664[7];
s_wndStrRestoring[8] = s_Daten_Reparatur____005b6664[8];
s_wndStrRestoring[9] = s_Daten_Reparatur____005b6664[9];
s_wndStrRestoring[10] = s_Daten_Reparatur____005b6664[10];
s_wndStrRestoring[0xb] = s_Daten_Reparatur____005b6664[0xb];
s_wndStrRestoring[0xc] = s_Daten_Reparatur____005b6664[0xc];
s_wndStrRestoring[0xd] = s_Daten_Reparatur____005b6664[0xd];
s_wndStrRestoring[0xe] = s_Daten_Reparatur____005b6664[0xe];
s_wndStrRestoring[0xf] = s_Daten_Reparatur____005b6664[0xf];
s_wndStrRestoring[0x10] = s_Daten_Reparatur____005b6664[0x10];
s_wndStrRestoring[0x11] = s_Daten_Reparatur____005b6664[0x11];
s_wndStrRestoring[0x12] = s_Daten_Reparatur____005b6664[0x12];
}
else {
sprintf(s_windowTitleRestoring,s__s___Restoring_data____005b664c,s_windowTitle);
chars = s_QUIT + Field<0, 4>();
pcVar4 = s_or_press_ESC_to_quit_Rayman_3__005b662c;
pcVar17 = s_quitting1;
for (iVar13 = 7; cVar1 = s_QUIT[4], iVar13 != 0; iVar13 = iVar13 + -1) {
*(undefined4 *)pcVar17 = *(undefined4 *)pcVar4;
pcVar4 = pcVar4 + 4;
pcVar17 = pcVar17 + 4;
}
*(undefined2 *)pcVar17 = *(undefined2 *)pcVar4;
pcVar17[2] = pcVar4[2];
uVar22 = s_QUIT + Field<0, 4>();
s_QUIT[0] = (char)chars;
s_QUIT[1] = SUB41(chars,1);
s_QUIT[2] = SUB41(chars,2);
s_QUIT[3] = SUB41(chars,3);
s_wndStrQuiting[0] = s_QUIT[0];
s_wndStrQuiting[1] = s_QUIT[1];
s_wndStrQuiting[2] = s_QUIT[2];
s_wndStrQuiting[3] = s_QUIT[3];
s_wndStrQuiting[4] = cVar1;
s_QUIT + Field<0, 4>() = uVar22;
sprintf(g_windowTitle,s__s___Pause_005b67c4,s_windowTitle);
s_wndStrRestoring[0] = s_Restoring_data_____005b6610[0];
s_wndStrRestoring[1] = s_Restoring_data_____005b6610[1];
s_wndStrRestoring[2] = s_Restoring_data_____005b6610[2];
s_wndStrRestoring[3] = s_Restoring_data_____005b6610[3];
s_wndStrRestoring[4] = s_Restoring_data_____005b6610[4];
s_wndStrRestoring[5] = s_Restoring_data_____005b6610[5];
s_wndStrRestoring[6] = s_Restoring_data_____005b6610[6];
s_wndStrRestoring[7] = s_Restoring_data_____005b6610[7];
s_wndStrRestoring[8] = s_Restoring_data_____005b6610[8];
s_wndStrRestoring[9] = s_Restoring_data_____005b6610[9];
s_wndStrRestoring[10] = s_Restoring_data_____005b6610[10];
s_wndStrRestoring[0xb] = s_Restoring_data_____005b6610[0xb];
s_wndStrRestoring + Field<12, 4>() = s_Restoring_data_____005b6610 + Field<12, 4>();
s_wndStrRestoring + Field<16, 2>() = s_Restoring_data_____005b6610 + Field<16, 2>();
s_wndStrRestoring[0x12] = s_Restoring_data_____005b6610[0x12];
}
}
}
}
/* Create draw semaphore
Initial count = 1
Maximum count = 1 */
g_drawSemaphore = CreateSemaphoreA((LPSECURITY_ATTRIBUTES)0x0,1,1,s_DRAWSEM_005b6608);
if (iStack_8 != 0) {
return -1;
}
/* Load DirectPlay probably unused */
hLibModule = LoadLibraryA(s_dpnhpast_dll_005b65f8);
if (hLibModule == (HMODULE)0x0) {
iVar13 = strcmpi(aCStack_71c,s_French_005b6828);
if (iVar13 == 0) {
MessageBoxA((HWND)0x0,lpText_005b6598,s_Erreur_Rayman_3_005b65e4,0x10);
return -1;
}
iVar13 = strcmpi(aCStack_71c,s_Spanish_005b67a0);
if (iVar13 == 0) {
MessageBoxA((HWND)0x0,lpText_005b6540,s_Rayman_3_005b6588,0x10);
return -1;
}
iVar13 = strcmpi(aCStack_71c,s_Italian_005b6730);
if (iVar13 == 0) {
MessageBoxA((HWND)0x0,lpText_005b64f0,s_Rayman_3_005b6588,0x10);
return -1;
}
iVar13 = strcmpi(aCStack_71c,s_German_005b66c4);
if (iVar13 != 0) {
MessageBoxA((HWND)0x0,s_Check_your_version_of_DirectX__V_005b6430,s_Rayman_3_Error_005b68bc,
0x10);
return -1;
}
MessageBoxA((HWND)0x0,lpText_005b6478,s_Rayman_3_005b6588,0x10);
return -1;
}
FreeLibrary(hLibModule);
p_cTxt1 = (void *)0x401e2a;
CreateMutexA((LPSECURITY_ATTRIBUTES)0x0,1,g_mutexName_Rayman3);
DVar7 = GetLastError();
if (DVar7 == 0xb7) {
/* Mutex already exists */
return -1;
}
p_cTxt2 = (void *)0x401e5a;
GetWindowsDirectoryA(aCStack_414,0x104);
iVar13 = -1;
/* Append ubi.ini */
pcVar4 = acStack_424;
do {
pcVar17 = pcVar4;
if (iVar13 == 0) break;
iVar13 = iVar13 + -1;
pcVar17 = pcVar4 + 1;
cVar1 = *pcVar4;
pcVar4 = pcVar17;
} while (cVar1 != '\0');
*(undefined4 *)(pcVar17 + -1) = s_UbiSoft_Ubi_ini + Field<0, 4>();
*(undefined4 *)(pcVar17 + 3) = s_UbiSoft_Ubi_ini + Field<4, 4>();
*(undefined4 *)(pcVar17 + 7) = s_UbiSoft_Ubi_ini + Field<8, 4>();
*(undefined4 *)(pcVar17 + 0xb) = s_UbiSoft_Ubi_ini + Field<12, 4>();
pcVar17[0xf] = s_UbiSoft_Ubi_ini[0x10];
/* Read graphics settings */
GetPrivateProfileStringA
(lpAppName_005b68f0,s_Adapter_005b68e4,(LPCSTR)&lpDefault_005cf96c,acStack_320,0xff,
acStack_424);
GetPrivateProfileStringA
(lpAppName_005b68f0,s_Identifier_005b6420,(LPCSTR)&lpDefault_005cf96c,acStack_120,0xff,
acStack_424);
GetPrivateProfileStringA
(lpAppName_005b68f0,s_Gli_Mode_005b6414,(LPCSTR)&lpDefault_005cf96c,acStack_220,0xff,
acStack_424);
/* If they're all set */
if (((acStack_320[0] != '\0') && (acStack_120[0] != '\0')) && (acStack_220[0] != '\0')) {
/* For GLIMode
1 = maximize
0 = windowed */
g_runMaximized = (int)(acStack_220[0] != '0');
r3_checkDisc();
dwOptions = 0;
BVar18 = 0;
lpTargetHandle = (LPHANDLE)&stack0xfffff7ac;
DVar7 = 0x1f03ff;
g_hinstance = instance;
hTargetProcessHandle = GetCurrentProcess();
hSourceHandle = GetCurrentThread();
hSourceProcessHandle = GetCurrentProcess();
DuplicateHandle(hSourceProcessHandle,hSourceHandle,hTargetProcessHandle,lpTargetHandle,DVar7,
BVar18,dwOptions);
/* Copy cmdline */
ppCVar8 = puStack_14;
g_mainThreadHandle = lpBuffer;
do {
uVar14 = *ppCVar8;
*(char *)(((int)g_appCmdLine - (int)puStack_14) + (int)ppCVar8) = (char)uVar14;
ppCVar8 = (uint *)((int)ppCVar8 + 1);
} while ((char)uVar14 != '\0');
/* SEM_FAILCRITICALERRORS */
SetErrorMode(1);
pcVar4 = strstr(puStack_14,s_dashCC);
if (pcVar4 == (char *)0x0) {
r3_initAllModules();
iVar13 = setupWindow(instance,uStack_10,g_runMaximized);
if (iVar13 == 0) {
return -1;
}
g_setInitVar0();
FUN_00401320();
spawnThread();
r3_noop(p_cTxt1,p_cTxt2);
gfx_init2();
lpRect = (LPRECT)&stack0xfffff7c0;
hWnd = GetDesktopWindow();
GetWindowRect(hWnd,lpRect);
BVar18 = 1;
iVar13 = r3_get_gli_height1();
iVar13 = iVar13 + 0x20;
iVar10 = r3_get_gli_width1();
iVar10 = iVar10 + 0xc;
iVar11 = r3_get_gli_height1();
iVar11 = (int)(pvStack_834 - iVar11) / 2;
iVar12 = r3_get_gli_width1();
MoveWindow(g_gameHWND,(int)(pHStack_838 - iVar12) / 2,iVar11,iVar10,iVar13,BVar18);
FUN_004010b0();
SystemParametersInfoA(0x10,0,&stack0xfffff7b0,0);
SystemParametersInfoA(0x11,0,(PVOID)0x0,0);
ShowCursor(0);
uStack_85c = 0;
SystemParametersInfoA(0x61,1,&uStack_85c,0);
g_engineRunning = 1;
r3_engineLoop();
/* cleanup starts here */
FUN_004725a0();
FUN_005038e0();
FUN_00503710();
FUN_004fb300();
FUN_00472150();
FUN_00470db0();
uStack_85c = 0;
SystemParametersInfoA(0x61,0,&uStack_85c,0);
ShowCursor(1);
SystemParametersInfoA(0x11,uiParam,(PVOID)0x0,0);
CloseHandle(lpBuffer);
}
return 0;
}
sprintf(UStack_830,s_Please_run_the__s_setup__005b63f4,s_windowTitle);
sprintf(acStack_528,s__s_not_initialized__005b63e0,s_windowTitle);
r3_wait_for_dvd(UStack_830,acStack_528,0);
/* WARNING: Subroutine does not return */
exit(-1);
}
}

View File

@ -64,7 +64,7 @@ undefined4& g_engineRunning= (undefined4&) GH_MEM(0x0077d0b4);
undefined4& g_drawSemaphore= (undefined4&) GH_MEM(0x0077d0bc);
char(&g_mutexName_Rayman3)[256] = reinterpret_cast<char(&)[256]>(GH_MEM(0x0077d0c0));
char(&g_windowTitle)[256] = reinterpret_cast<char(&)[256]>(GH_MEM(0x0077d1c0));
char(&g_windowTitle)[256] = reinterpret_cast<char(&)[256]>(GH_MEM(0x0077d2c0));
char(&g_windowTitle1)[256] = reinterpret_cast<char(&)[256]>(GH_MEM(0x0077d2c0));
char(&s_windowTitleRestoring)[256] = reinterpret_cast<char(&)[256]>(GH_MEM(0x0077d3c0));
HINSTANCE& g_hinstance= (HINSTANCE&) GH_MEM(0x0077d4c0);
HWND& g_gameHWND= (HWND&) GH_MEM(0x0077d4c4);

View File

@ -69,7 +69,7 @@ extern undefined4& g_engineRunning; // 0077d0b4
extern undefined4& g_drawSemaphore; // 0077d0bc
extern char(&g_mutexName_Rayman3)[256]; // 0077d0c0
extern char(&g_windowTitle)[256]; // 0077d1c0
extern char(&g_windowTitle)[256]; // 0077d2c0
extern char(&g_windowTitle1)[256]; // 0077d2c0
extern char(&s_windowTitleRestoring)[256]; // 0077d3c0
extern HINSTANCE& g_hinstance; // 0077d4c0
extern HWND& g_gameHWND; // 0077d4c4

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,7 @@
#ifndef BD364AE6_AD96_4DEA_9D6B_B237BC1E2C6A
#define BD364AE6_AD96_4DEA_9D6B_B237BC1E2C6A
#include <cstdint>
#include <gh_datasegment.h>
template <size_t addr> inline constexpr void checkMappedMemory() {
@ -8,8 +9,9 @@ template <size_t addr> inline constexpr void checkMappedMemory() {
static_assert(addr < GH_DATA_END, "Address outside upper bound");
}
uint8_t *gh_map_dbg_mem(size_t addr);
void gh_init_dbg_loader();
#define GH_MEM(addr) (checkMappedMemory<addr>(), *memoryMapSafe(addr))
#define GH_MEM(addr) (checkMappedMemory<addr>(), *gh_map_dbg_mem(addr))
#endif /* BD364AE6_AD96_4DEA_9D6B_B237BC1E2C6A */

View File

@ -4,11 +4,13 @@
#define EDBE48FC_B879_4985_9274_B7ACF24AD024
#include "base.h"
#if RE_DBG_INJECTED
#include "dbg_mem.h"
#else
#include "static_mem.h"
#endif
#include <gh_types.h>
#endif /* EDBE48FC_B879_4985_9274_B7ACF24AD024 */

View File

@ -13,7 +13,7 @@ template <typename T, typename... Args>
T gh_stub_impl_cdecl(void *ptr_, Args... args) {
#if RE_DBG_INJECTED
using Callable = __cdecl T (*)(Args...);
static Callable *fn = (Callable *)gh_stub_impl_ptr(ptr_);
static Callable fn = (Callable)gh_stub_impl_ptr(ptr_);
return fn(args...);
#else
throw GHStubException("Function not implemented");
@ -24,7 +24,7 @@ template <typename T, typename... Args>
T gh_stub_impl_stdcall(void *ptr_, Args... args) {
#if RE_DBG_INJECTED
using Callable = __stdcall T (*)(Args...);
static Callable *fn = (Callable *)gh_stub_impl_ptr(ptr_);
static Callable fn = (Callable)gh_stub_impl_ptr(ptr_);
return fn(args...);
#else
throw GHStubException("Function not implemented");

View File

@ -3,20 +3,24 @@ script_dir=$(readlink -f $(dirname "$0"))
tool=$script_dir/../tooling/bin/r3_gh_tool
set -e
shopt -s nullglob
pushd $script_dir
mkdir -p logs
types=(auto ref fix stub)
for type in "${types[@]}"; do
file_list="logs/files_${type}.txt"
rm -f "$file_list"
if [ -d "gh_${type}" ]; then
file_list="logs/files_${type}.txt"
rm -f "$file_list"
any_files=false
for file in "gh_${type}"/*.cxx; do
echo "$file" >>"$file_list"
any_files=true
done
$tool "@$file_list" -v --type=$type --log-file=logs/log-functions-${type}.txt
if [ "$any_files" = true ]; then
$tool "@$file_list" -v --type=$type --log-file=logs/log-functions-${type}.txt
fi
fi
done

View File

@ -1,4 +1,18 @@
GUID
_GUID
CLSID
LPCGUID
LPCGUID
ImageBaseOffset32
pointer32
define__WIN32_WINNT
define_LZERROR_GLOBLOCK
define_LZERROR_READ
define_COM_NO_WINDOWS_H
define__X86_
define_LZERROR_UNKNOWNALG
define___cplusplus
define___STDC_HOSTED__
define_WINVER
define__MSC_VER
define__WIN32_WINNT
define__M_IX86

View File

@ -83,4 +83,5 @@ winsvc.h
winuser.h
winver.h
wtypes.h
dinput.h
dinput.h
lzexpand.h

View File

@ -1,8 +1,6 @@
// Source code is decompiled from a .class file using FernFlower decompiler.
package re3lib;
import ghidra.app.script.GhidraScript;
import ghidra.app.script.ScriptMessage;
import ghidra.program.model.data.*;
import ghidra.program.model.data.Enum;
import ghidra.util.Msg;
@ -13,7 +11,8 @@ import java.io.Writer;
import java.util.*;
public class DataTypeWriter {
public HashSet<String> blacklistedTypes;
public HashSet<String> requiredFunctionTypes;
public HashMap<String, FunctionDefinition> lazyFunctionTypeBlocks;
private static String[] INTEGRAL_TYPES = new String[] { "char", "short", "int", "long", "long long", "__int64",
"float", "double", "long double", "void" };
@ -54,7 +53,6 @@ public class DataTypeWriter {
public DataTypeWriter(DataTypeManager dtm, Writer writer, AnnotationHandler annotator, boolean cppStyleComments)
throws IOException {
this.blacklistedTypes = new HashSet<>();
this.cppStyleComments = false;
this.dtm = dtm;
if (dtm != null) {
@ -68,6 +66,8 @@ public class DataTypeWriter {
this.writer = writer;
this.annotator = annotator;
this.cppStyleComments = cppStyleComments;
this.requiredFunctionTypes = new HashSet<>();
this.lazyFunctionTypeBlocks = new HashMap<>();
}
private String comment(String text) {
@ -118,7 +118,7 @@ public class DataTypeWriter {
for (DataType dataType : dataTypes) {
monitor.checkCancelled();
if (dataType == null || blacklistedTypes.contains(dataType.getDisplayName())) {
if (dataType == null) {
continue;
}
@ -138,7 +138,20 @@ public class DataTypeWriter {
monitor.setProgress((long) cnt);
}
// Step 2: Topological sort and write
// Step 2: Check if we're missing any function type typedefs
for (String funcName : requiredFunctionTypes) {
if (!blocks.containsKey(funcName)) {
FunctionDefinition funcType = lazyFunctionTypeBlocks.get(funcName);
Set<String> dependencies = new HashSet<>();
StringBuilder code = new StringBuilder();
this.writeFunctionDefinitionBlock(funcType, funcName, code, dependencies);
blocks.put(funcName, new Block(funcType, code.toString(), dependencies));
}
}
// Step 3: Topological sort and write
List<Block> sortedBlocks = topologicalSort(blocks);
for (Block block : sortedBlocks) {
writer.write(block.code);
@ -157,9 +170,9 @@ public class DataTypeWriter {
Set<String> dependencies = new HashSet<>();
StringBuilder code = new StringBuilder();
if (dt.getDisplayName().contains("HIE_tduLinkedObject")) {
System.out.println("DEBUG " + dt.getDisplayName());
}
// if (dt.getDisplayName().contains("HIE_tduLinkedObject")) {
// System.out.println("DEBUG " + dt.getDisplayName());
// }
if (dt.equals(DataType.DEFAULT)) {
code.append("typedef unsigned char ").append(DataType.DEFAULT.getName()).append(";");
@ -176,12 +189,16 @@ public class DataTypeWriter {
} else if (dt instanceof Union) {
writeUnionBlock((Union) dt, code, dependencies);
} else if (dt instanceof Enum) {
if(dt.getDisplayName().contains(".conflict"))
return null;
writeEnumBlock((Enum) dt, code, dependencies);
} else if (dt instanceof TypeDef) {
writeTypeDefBlock((TypeDef) dt, code, dependencies);
} else if (dt instanceof BuiltInDataType) {
writeBuiltInBlock((BuiltInDataType) dt, code, dependencies);
} else if (dt instanceof FunctionDefinition) {
// Store these for later, a lot of them are going to be unused
lazyFunctionTypeBlocks.put(dt.getDisplayName(), (FunctionDefinition) dt);
return null;
} else {
code.append(comment("Unable to write datatype. Type unrecognized: " + dt.getClass()));
@ -248,6 +265,9 @@ public class DataTypeWriter {
DataType depType = getImmediateDependencyType(componentDataType);
if (depType != null) {
dependencies.add(depType.getDisplayName());
if(depType instanceof FunctionDefinition) {
requiredFunctionTypes.add(depType.getDisplayName());
}
}
code.append(getTypeDeclaration(fieldName, componentDataType, component.getLength()));
@ -300,7 +320,7 @@ public class DataTypeWriter {
}
}
private void writeFunctionDefinitionBlock(FunctionDefinition funcDef, String name, StringBuilder code,
private boolean writeFunctionDefinitionBlock(FunctionDefinition funcDef, String name, StringBuilder code,
Set<String> dependencies) {
DataType returnType = funcDef.getReturnType();
ParameterDefinition[] params = funcDef.getArguments();
@ -351,20 +371,29 @@ public class DataTypeWriter {
}
code.append(");");
return true;
}
private void writeTypeDefBlock(TypeDef typeDef, StringBuilder code, Set<String> dependencies) {
private boolean writeTypeDefBlock(TypeDef typeDef, StringBuilder code, Set<String> dependencies) {
String typedefName = typeDef.getDisplayName();
DataType dataType = typeDef.getDataType();
String dataTypeName = dataType.getDisplayName();
// Handle function definition typedefs
if (dataType instanceof FunctionDefinition) {
writeFunctionDefinitionBlock((FunctionDefinition) dataType, typedefName, code, dependencies);
return writeFunctionDefinitionBlock((FunctionDefinition) dataType, typedefName, code, dependencies);
} // Could be pointer to function
else if (dataType instanceof Pointer && ((Pointer) dataType).getDataType() instanceof FunctionDefinition) {
writeFunctionDefinitionBlock((FunctionDefinition) ((Pointer) dataType).getDataType(), typedefName, code,
dependencies);
else if (dataType instanceof Pointer) {
Pointer ptr = (Pointer) dataType;
if (ptr.getDataType() instanceof FunctionDefinition) {
return writeFunctionDefinitionBlock((FunctionDefinition) ((Pointer) dataType).getDataType(), typedefName, code,
dependencies);
} else {
// Try to write the typedef as a forward declaration
code.append("typedef ");
code.append(getTypeDeclaration(typedefName, dataType, -1));
code.append(";");
return true;
}
} else {
DataType depType = getImmediateDependencyType(dataType);
if (depType != null && !isBuiltInType(depType)) {
@ -373,6 +402,7 @@ public class DataTypeWriter {
String typedefString = getTypeDeclaration(typedefName, dataType, -1);
code.append("typedef ").append(typedefString).append(";");
return true;
}
}

View File

@ -13,6 +13,7 @@ import ghidra.program.model.data.Composite;
import ghidra.program.model.data.DataType;
import ghidra.program.model.data.Enum;
import ghidra.program.model.data.EnumDataType;
import ghidra.program.model.data.FunctionDefinition;
import ghidra.program.model.data.ProgramBasedDataTypeManager;
import ghidra.program.model.data.Structure;
import ghidra.program.model.data.TypeDef;
@ -86,24 +87,24 @@ public class TypeDumper {
continue;
if (dt instanceof Structure || dt instanceof TypeDef || dt instanceof EnumDataType
|| dt instanceof Union || dt instanceof Enum) {
|| dt instanceof Union || dt instanceof Enum || dt instanceof FunctionDefinition) {
if (dt.getDisplayName().contains("NormalizeFn"))
if (dt.getDisplayName().contains("NormalizeFn") || dt.getDisplayName().contains("_M_IX86"))
script.println("DEBUG " + dt.getDisplayName() + " - " + dt.getClass().getSimpleName());
if (dt.getDisplayName().contains("tdstObjectTypeElement_") ||
dt.getDisplayName().contains("ObjectTypeElementHandle"))
// if (dt.getDisplayName().contains("tdstObjectTypeElement_") ||
// dt.getDisplayName().contains("ObjectTypeElementHandle"))
filteredTypes.add(dt);
filteredTypes.add(dt);
}
// }
}
String s = "";
for (DataType dataType : filteredTypes) {
s += dataType.getDisplayName() + ", ";
}
script.println(s);
// String s = "";
// for (DataType dataType : filteredTypes) {
// s += dataType.getDisplayName() + ", ";
// }
// script.println(s);
try (PrintWriter writer = new PrintWriter(new File(RemanConfig.INSTANCE.outputDir, "gh_types.h"),
"UTF-8")) {
@ -112,7 +113,6 @@ public class TypeDumper {
writer.println("#include <r3/binders/type.h>");
DataTypeWriter dtw = new DataTypeWriter(dtm, writer);
dtw.blacklistedTypes = typeBlacklist;
dtw.write(filteredTypes, script.getMonitor());
Utils.headerGuardPost(writer, "STRUCTS");