// AUTO-GENERATED FILE, MOVE TO 'gh_fix' FOLDER PREVENT OVERWRITING!!!!! #include #include "../gh_global.h" extern undefined r3_initEngine(void); // 00401220 // r3_initEngine extern undefined r3_module0_init(void); // 00401000 // r3_module0_init extern uint32_t r3_containsCmdLine( uint *param_1, char *param_2); // 004028e0 // r3_containsCmdLine extern undefined FUN_004010b0(void); // 004010b0 // FUN_004010b0 extern undefined FUN_004464f0(void); // 004464f0 // FUN_004464f0 extern undefined FUN_00503710(void); // 00503710 // FUN_00503710 extern undefined r3_setupWindow( HINSTANCE hInstance, undefined4 param_2, undefined4 param_3); // 00402140 // r3_setupWindow extern undefined FUN_00401320(void); // 00401320 // FUN_00401320 extern undefined spawnThread(void); // 004477d0 // spawnThread extern undefined FUN_005038e0(void); // 005038e0 // FUN_005038e0 extern undefined FUN_004fb300(void); // 004fb300 // FUN_004fb300 extern void g_setInitVar0(void); // 00401310 // g_setInitVar0 extern void r3_noop(void *p_cTxt1, void *p_cTxt2); // 00401100 // r3_noop extern undefined r3_checkDisc(void); // 004464f0 // r3_checkDisc extern undefined gfx_init2(void); // 00470be0 // gfx_init2 extern undefined4 __cdecl r3_get_gli_width( void); // 0047baf0 // r3_get_gli_width extern undefined FUN_00472150(void); // 00472150 // FUN_00472150 extern undefined FUN_00470db0(void); // 00470db0 // FUN_00470db0 extern int __cdecl r3_get_gli_height(void); // 0047bb00 // r3_get_gli_height extern undefined FUN_0043e540(undefined4 param_1, undefined4 param_2, undefined4 param_3); // 0043e540 // FUN_0043e540 extern undefined FUN_004725a0(void); // 004725a0 // FUN_004725a0 // 00401630 int r3_main(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR *cmdline, int showCmd) { char cVar1; undefined4 uVar2; undefined4 uVar3; undefined4 uVar4; undefined2 uVar5; undefined2 uVar6; LPSTR pCVar7; char *pcVar8; FILE *file; LONG LVar9; HMODULE hLibModule; DWORD DVar10; HANDLE hTargetProcessHandle; HANDLE hSourceHandle; HANDLE hSourceProcessHandle; LPSTR *ppCVar11; uint32_t hasCCarg; HWND hWnd; int iVar12; int iVar13; int iVar14; int iVar15; uint uVar16; void *unaff_ESI; undefined4 *puVar17; void *unaff_EDI; undefined4 *puVar18; char *pcVar19; HANDLE *lpTargetHandle; BOOL BVar20; DWORD dwOptions; tagRECT *lpRect; undefined4 uStack_83c; HKEY pHStack_838; HANDLE pvStack_834; UINT UStack_830; BYTE aBStack_82c[4]; DWORD DStack_828; DWORD DStack_824; tagRECT tStack_820; char acStack_810[260]; CHAR languageStr[256]; CHAR pathToUbi_ini[260]; char acStack_508[260]; CHAR windowsDir[260]; char acStack_300[256]; char acStack_200[256]; char acStack_100[256]; /* Append windows dir / ubi.ini */ GetWindowsDirectoryA(pathToUbi_ini, 0x104); iVar15 = -1; pcVar8 = pathToUbi_ini; do { pcVar19 = pcVar8; if (iVar15 == 0) break; iVar15 = iVar15 + -1; pcVar19 = pcVar8 + 1; cVar1 = *pcVar8; pcVar8 = pcVar19; } while (cVar1 != '\0'); *(undefined4 *)(pcVar19 + -1) = s_UbiSoft_Ubi_ini + Field<0, 4>(); *(undefined4 *)(pcVar19 + 3) = s_UbiSoft_Ubi_ini + Field<4, 4>(); *(undefined4 *)(pcVar19 + 7) = s_UbiSoft_Ubi_ini + Field<8, 4>(); *(undefined4 *)(pcVar19 + 0xb) = s_UbiSoft_Ubi_ini + Field<12, 4>(); pcVar19[0xf] = s_UbiSoft_Ubi_ini[0x10]; pCVar7 = GetCommandLineA(); pcVar8 = pCVar7 + 1; iVar15 = -(int)pcVar8; do { cVar1 = *pcVar8; pcVar8[(int)(acStack_810 + iVar15)] = cVar1; pcVar8 = pcVar8 + 1; } while (cVar1 != '\0'); pcVar8 = strrchr(acStack_810, 0x5c); if (pcVar8 == (char *)0x0) { /* Read from ubi.ini */ GetPrivateProfileStringA(lpAppName_005b68f0, s_Directory_005b68f8, s_None, acStack_810, 0xff, pathToUbi_ini); iVar15 = strcmpi(acStack_810, s_None); } else { pcVar8 = strrchr(acStack_810, 0x5c); *pcVar8 = '\0'; iVar15 = chdir(acStack_810); if (iVar15 != -1) goto LAB_00401765; /* Read from ubi.ini */ GetPrivateProfileStringA(lpAppName_005b68f0, s_Directory_005b68f8, s_None, acStack_810, 0xff, pathToUbi_ini); iVar15 = strcmpi(acStack_810, s_None); } if (iVar15 != 0) { chdir(acStack_810); } LAB_00401765: /* strcpy */ iVar15 = 0; do { cVar1 = acStack_810[iVar15]; r3_main_data_005d28b6.gameDataDir[iVar15] = cVar1; iVar15 = iVar15 + 1; } while (cVar1 != '\0'); strlwr(r3_main_data_005d28b6.gameDataDir); iVar15 = -1; pcVar8 = r3_main_data_005d28b6.gameDataDir; do { if (iVar15 == 0) break; iVar15 = iVar15 + -1; cVar1 = *pcVar8; pcVar8 = pcVar8 + 1; } while (cVar1 != '\0'); joined_r0x00401792: if (iVar15 != -2) { uVar16 = 0xffffffff; pcVar8 = r3_main_data_005d28b6.gameDataDir; do { if (uVar16 == 0) break; uVar16 = uVar16 - 1; cVar1 = *pcVar8; pcVar8 = pcVar8 + 1; } while (cVar1 != '\0'); if (r3_main_data_005d28b6.gameDataDir[~uVar16 - 2] != '\\') goto LAB_004017ce; uVar16 = 0xffffffff; pcVar8 = r3_main_data_005d28b6.gameDataDir; do { if (uVar16 == 0) break; uVar16 = uVar16 - 1; cVar1 = *pcVar8; pcVar8 = pcVar8 + 1; } while (cVar1 != '\0'); r3_main_data_005d28b6.gameDataDir[~uVar16 - 2] = '\0'; iVar15 = -1; pcVar8 = r3_main_data_005d28b6.gameDataDir; do { if (iVar15 == 0) break; iVar15 = iVar15 + -1; cVar1 = *pcVar8; pcVar8 = pcVar8 + 1; } while (cVar1 != '\0'); goto joined_r0x00401792; } LAB_004017ce: file = fopen(pathToUbi_ini, fopen_mode_r_text); GetPrivateProfileStringA(lpAppName_005b68f0, s_Adapter_005b68e4, (LPCSTR)&lpDefault_005cf96c, acStack_300, 0xff, pathToUbi_ini); if ((file == (FILE *)0x0) || (acStack_300[0] == '\0')) { /* Concat game data dir with r3 setup exe */ iVar15 = 0; do { cVar1 = r3_main_data_005d28b6.gameDataDir[iVar15]; acStack_508[iVar15] = cVar1; iVar15 = iVar15 + 1; } while (cVar1 != '\0'); iVar15 = -1; pcVar8 = acStack_508; do { pcVar19 = pcVar8; if (iVar15 == 0) break; iVar15 = iVar15 + -1; pcVar19 = pcVar8 + 1; cVar1 = *pcVar8; pcVar8 = pcVar19; } while (cVar1 != '\0'); *(undefined4 *)(pcVar19 + -1) = s__R3_Setup_DX8_exe_005b68d0 + Field<0, 4>(); *(undefined4 *)(pcVar19 + 3) = s__R3_Setup_DX8_exe_005b68d0 + Field<4, 4>(); *(undefined4 *)(pcVar19 + 7) = s__R3_Setup_DX8_exe_005b68d0 + Field<8, 4>(); *(undefined4 *)(pcVar19 + 0xb) = s__R3_Setup_DX8_exe_005b68d0 + Field<12, 4>(); *(undefined2 *)(pcVar19 + 0xf) = 0; auto &q = (s__R3_Setup_DX8_exe_005b68d0 + Field<16, 2>()); file = fopen(acStack_508, fopen_mode_r_binary); if (file == (FILE *)0x0) { MessageBoxA((HWND)0x0, s_Unable_to_find_R3_Setup_DX8_exe__005b6880, s_Rayman_3_Error_005b68bc, 0x10); return -1; } fclose(file); spawnl(0, acStack_508, acStack_508, 0); file = fopen(pathToUbi_ini, fopen_mode_r_text); if (file == (FILE *)0x0) { return -1; } } fclose(file); /* Open reg key HKEY_LOCAL_MACHINE\\SOFTWARE\\UBI SOFT\\RAYMAN 3 */ LVar9 = RegOpenKeyExA((HKEY)0x80000002, s_SOFTWARE_UBI_SOFT_RAYMAN_3_005b6864, 0, 0x20019, &pHStack_838); if (LVar9 == 0) { LVar9 = RegQueryValueExA(pHStack_838, s_CompleteInstall_005b6854, (LPDWORD)0x0, &DStack_824, aBStack_82c, &DStack_828); DAT_007d9cc4 = (uint)(LVar9 == 0); if (pHStack_838 != (HKEY)0x0) { RegCloseKey(pHStack_838); } } else { DAT_007d9cc4 = 0; } GetPrivateProfileStringA(lpAppName_005b68f0, s_Language_005b6840, s_English_005b684c, languageStr, 0xff, pathToUbi_ini); sprintf(g_mutexName_Rayman3, s_percents, lpAppName_005b68f0); sprintf(g_windowTitle, s_percents, s_windowTitle); /* Setup localized quiting/restoring strings */ sprintf(s_windowTitleRestoring, s__s___Restoring_data____005b664c, s_windowTitle); uVar2 = s_QUIT + Field<0, 4>(); puVar17 = (undefined4 *)s_or_press_ESC_to_quit_Rayman_3__005b662c; puVar18 = (undefined4 *)&DAT_007825c0; for (iVar15 = 7; cVar1 = s_QUIT[4], iVar15 != 0; iVar15 = iVar15 + -1) { *puVar18 = *puVar17; puVar17 = puVar17 + 1; puVar18 = puVar18 + 1; } *(undefined2 *)puVar18 = *(undefined2 *)puVar17; *(undefined *)((int)puVar18 + 2) = *(undefined *)((int)puVar17 + 2); strcpy(s_wndStrQuiting, s_QUIT); sprintf(lpString_0077d2c0, s__s___Pause_005b67c4, s_windowTitle); strcpy(s_wndStrRestoring, s_Restoring_data_____005b6610); /* Create draw semaphore Initial count = 1 Maximum count = 1 */ g_drawSemaphore = CreateSemaphoreA((LPSECURITY_ATTRIBUTES)0x0, 1, 1, s_DRAWSEM_005b6608); if (hPrevInstance != (HINSTANCE)0x0) { return -1; } /* Load DirectPlay probably unused */ hLibModule = LoadLibraryA(s_dpnhpast_dll_005b65f8); if (hLibModule == (HMODULE)0x0) { iVar15 = strcmpi(languageStr, s_French_005b6828); if (iVar15 == 0) { MessageBoxA((HWND)0x0, lpText_005b6598, s_Erreur_Rayman_3_005b65e4, 0x10); return -1; } iVar15 = strcmpi(languageStr, s_Spanish_005b67a0); if (iVar15 == 0) { MessageBoxA((HWND)0x0, lpText_005b6540, s_Rayman_3_005b6588, 0x10); return -1; } iVar15 = strcmpi(languageStr, s_Italian_005b6730); if (iVar15 == 0) { MessageBoxA((HWND)0x0, lpText_005b64f0, s_Rayman_3_005b6588, 0x10); return -1; } iVar15 = strcmpi(languageStr, s_German_005b66c4); if (iVar15 != 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); CreateMutexA((LPSECURITY_ATTRIBUTES)0x0, 1, g_mutexName_Rayman3); DVar10 = GetLastError(); if (DVar10 == 0xb7) { /* Mutex already exists */ return -1; } GetWindowsDirectoryA(windowsDir, 0x104); iVar15 = -1; /* Append ubi.ini */ pcVar8 = windowsDir; do { pcVar19 = pcVar8; if (iVar15 == 0) break; iVar15 = iVar15 + -1; pcVar19 = pcVar8 + 1; cVar1 = *pcVar8; pcVar8 = pcVar19; } while (cVar1 != '\0'); *(undefined4 *)(pcVar19 + -1) = s_UbiSoft_Ubi_ini + Field<0, 4>(); *(undefined4 *)(pcVar19 + 3) = s_UbiSoft_Ubi_ini + Field<4, 4>(); *(undefined4 *)(pcVar19 + 7) = s_UbiSoft_Ubi_ini + Field<8, 4>(); *(undefined4 *)(pcVar19 + 0xb) = s_UbiSoft_Ubi_ini + Field<12, 4>(); pcVar19[0xf] = s_UbiSoft_Ubi_ini[0x10]; /* Read graphics settings */ GetPrivateProfileStringA(lpAppName_005b68f0, s_Adapter_005b68e4, (LPCSTR)&lpDefault_005cf96c, acStack_300, 0xff, windowsDir); GetPrivateProfileStringA(lpAppName_005b68f0, s_Identifier_005b6420, (LPCSTR)&lpDefault_005cf96c, acStack_100, 0xff, windowsDir); GetPrivateProfileStringA(lpAppName_005b68f0, s_Gli_Mode_005b6414, (LPCSTR)&lpDefault_005cf96c, acStack_200, 0xff, windowsDir); /* If they're all set */ if (((acStack_300[0] != '\0') && (acStack_100[0] != '\0')) && (acStack_200[0] != '\0')) { /* always true */ hasGLIMode = (uint)(acStack_200[0] != '0'); // r3_checkDisc(); dwOptions = 0; BVar20 = 0; lpTargetHandle = &pvStack_834; DVar10 = 0x1f03ff; g_hinstance = hInstance; hTargetProcessHandle = GetCurrentProcess(); hSourceHandle = GetCurrentThread(); hSourceProcessHandle = GetCurrentProcess(); DuplicateHandle(hSourceProcessHandle, hSourceHandle, hTargetProcessHandle, lpTargetHandle, DVar10, BVar20, dwOptions); g_mainThreadHandle = pvStack_834; /* Copy cmdline */ ppCVar11 = cmdline; do { cVar1 = *(char *)ppCVar11; *(char *)(((int)g_appCmdLine - (int)cmdline) + (int)ppCVar11) = cVar1; ppCVar11 = (LPSTR *)((int)ppCVar11 + 1); } while (cVar1 != '\0'); SetErrorMode(1); hasCCarg = r3_containsCmdLine((uint *)cmdline, s_dashCC); if (hasCCarg == 0) { r3_module0_init(); iVar15 = r3_setupWindow(hInstance, showCmd, hasGLIMode); if (iVar15 == 0) { return -1; } g_setInitVar0(); FUN_00401320(); spawnThread(); r3_noop(unaff_EDI, unaff_ESI); gfx_init2(); lpRect = &tStack_820; hWnd = GetDesktopWindow(); GetWindowRect(hWnd, lpRect); BVar20 = 1; iVar15 = r3_get_gli_height(); iVar15 = iVar15 + 0x20; iVar12 = r3_get_gli_width(); iVar12 = iVar12 + 0xc; iVar13 = r3_get_gli_height(); iVar13 = (tStack_820.bottom - iVar13) / 2; iVar14 = r3_get_gli_width(); MoveWindow(g_gameHWND, (tStack_820.right - iVar14) / 2, iVar13, iVar12, iVar15, BVar20); FUN_004010b0(); SystemParametersInfoA(0x10, 0, &UStack_830, 0); SystemParametersInfoA(0x11, 0, (PVOID)0x0, 0); ShowCursor(0); uStack_83c = 0; SystemParametersInfoA(0x61, 1, &uStack_83c, 0); g_engineRunning = 1; r3_initEngine(); FUN_004725a0(); FUN_005038e0(); FUN_00503710(); FUN_004fb300(); FUN_00472150(); FUN_00470db0(); uStack_83c = 0; SystemParametersInfoA(0x61, 0, &uStack_83c, 0); ShowCursor(1); SystemParametersInfoA(0x11, UStack_830, (PVOID)0x0, 0); CloseHandle(pvStack_834); } return 0; } // Please run the setup sprintf(acStack_810, s_Please_run_the__s_setup__005b63f4, s_windowTitle); sprintf(acStack_508, s__s_not_initialized__005b63e0, s_windowTitle); // FUN_0043e540(acStack_810, acStack_508, 0); MessageBoxA(g_gameHWND, acStack_810, acStack_508, 0 | 0x10000); exit(1); }