////////////////////////////////////////////////////////// // // CInstallManager::_MaybeSwitchToTempExe // // // ////////////////////////////////////////////////////////// SString CInstallManager::_MaybeSwitchToTempExe ( void ) { // If a new "Multi Theft Auto.exe" exists, let that complete the install if ( m_pSequencer->GetVariable ( INSTALL_LOCATION ) == "far" ) { ReleaseSingleInstanceMutex (); if ( ShellExecuteNonBlocking ( "open", GetLauncherPathFilename (), GetSequencerSnapshot () ) ) ExitProcess ( 0 ); // All done here CreateSingleInstanceMutex (); return "fail"; } return "ok"; }
////////////////////////////////////////////////////////// // // CInstallManager::_ChangeToAdmin // // // Save the state of the sequencer and launch process as admin // ////////////////////////////////////////////////////////// SString CInstallManager::_ChangeToAdmin ( void ) { if ( !IsUserAdmin () ) { MessageBoxUTF8( NULL, SString ( _("MTA:SA needs Administrator access for the following task:\n\n '%s'\n\nPlease confirm in the next window."), *m_strAdminReason ), "Multi Theft Auto: San Andreas", MB_OK | MB_TOPMOST ); SetIsBlockingUserProcess (); ReleaseSingleInstanceMutex (); if ( ShellExecuteBlocking ( "runas", GetLauncherPathFilename (), GetSequencerSnapshot () ) ) { // Will return here once admin process has finished CreateSingleInstanceMutex (); UpdateSettingsForReportLog (); RestoreSequencerFromSnapshot ( ReceiveStringFromAdminProcess () ); ClearIsBlockingUserProcess (); return "ok"; // This will appear as the result for _ChangeFromAdmin } CreateSingleInstanceMutex (); ClearIsBlockingUserProcess (); MessageBoxUTF8( NULL, SString ( _("MTA:SA could not complete the following task:\n\n '%s'\n"), *m_strAdminReason ), "Multi Theft Auto: San Andreas"+_E("CL01"), MB_OK | MB_TOPMOST ); } return "fail"; }
////////////////////////////////////////////////////////// // // CInstallManager::_SwitchBackFromTempExe // // // ////////////////////////////////////////////////////////// SString CInstallManager::_SwitchBackFromTempExe ( void ) { // If currently running temp install exe, switch back if ( m_pSequencer->GetVariable ( INSTALL_LOCATION ) == "far" ) { m_pSequencer->SetVariable ( INSTALL_LOCATION, "near" ); ReleaseSingleInstanceMutex (); if ( ShellExecuteNonBlocking ( "open", GetLauncherPathFilename (), GetSequencerSnapshot () ) ) ExitProcess ( 0 ); // All done here CreateSingleInstanceMutex (); return "fail"; } return "ok"; }
////////////////////////////////////////////////////////// // // PreLaunchWatchDogs // // // ////////////////////////////////////////////////////////// void PreLaunchWatchDogs ( void ) { assert ( !CreateSingleInstanceMutex () ); // // "L0" is opened before the launch sequence and is closed if MTA shutsdown with no error // "L1" is opened before the launch sequence and is closed if GTA is succesfully started // "CR1" is a counter which is incremented if GTA was not started and MTA shutsdown with an error // // "L2" is opened before the launch sequence and is closed if the GTA loading screen is shown // "CR2" is a counter which is incremented at startup, if the previous run didn't make it to the loading screen // // "L3" is opened before the launch sequence and is closed if the GTA loading screen is shown, or a startup problem is handled elsewhere // // Check for unclean stop on previous run #ifndef MTA_DEBUG if ( WatchDogIsSectionOpen ( "L0" ) ) WatchDogSetUncleanStop ( true ); // Flag to maybe do things differently if MTA exit code on last run was not 0 else #endif WatchDogSetUncleanStop ( false ); SString strCrashFlagFilename = CalcMTASAPath( "mta\\core.log.flag" ); if ( FileExists( strCrashFlagFilename ) ) { FileDelete( strCrashFlagFilename ); WatchDogSetLastRunCrash( true ); // Flag to maybe do things differently if MTA crashed last run } else WatchDogSetLastRunCrash( false ); // Reset counter if gta game was run last time if ( !WatchDogIsSectionOpen ( "L1" ) ) WatchDogClearCounter ( "CR1" ); // If crashed 3 times in a row before starting the game, do something if ( WatchDogGetCounter ( "CR1" ) >= 3 ) { WatchDogReset (); HandleTrouble (); } // Check for possible gta_sa.set problems if ( WatchDogIsSectionOpen ( "L2" ) ) { WatchDogIncCounter ( "CR2" ); // Did not reach loading screen last time WatchDogCompletedSection ( "L2" ); } else WatchDogClearCounter ( "CR2" ); // If didn't reach loading screen 5 times in a row, do something if ( WatchDogGetCounter ( "CR2" ) >= 5 ) { WatchDogClearCounter ( "CR2" ); HandleResetSettings (); } // Clear down freeze on quit detection WatchDogCompletedSection( "Q0" ); WatchDogBeginSection ( "L0" ); // Gets closed if MTA exits with a return code of 0 WatchDogBeginSection ( "L1" ); // Gets closed when online game has started SetApplicationSetting ( "diagnostics", "gta-fopen-fail", "" ); SetApplicationSetting ( "diagnostics", "last-crash-reason", "" ); SetApplicationSetting ( "diagnostics", "gta-fopen-last", "" ); }
////////////////////////////////////////////////////////// // // HandleDuplicateLaunching // // Handle duplicate launching, or running from mtasa:// URI ? // ////////////////////////////////////////////////////////// void HandleDuplicateLaunching( void ) { LPSTR lpCmdLine = GetCommandLine(); int iRecheckTimeLimit = 2000; while ( ! CreateSingleInstanceMutex () ) { if ( strcmp ( lpCmdLine, "" ) != 0 ) { HWND hwMTAWindow = FindWindow( NULL, "MTA: San Andreas" ); #ifdef MTA_DEBUG if( hwMTAWindow == NULL ) hwMTAWindow = FindWindow( NULL, "MTA: San Andreas [DEBUG]" ); #endif if( hwMTAWindow != NULL ) { LPWSTR szCommandLine = GetCommandLineW (); int numArgs; LPWSTR* aCommandLineArgs = CommandLineToArgvW ( szCommandLine, &numArgs ); for ( int i = 0; i < numArgs; ++i ) { if ( StrCmpW ( aCommandLineArgs[i], L"-c" ) == 0 && numArgs > i ) { WString wideConnectInfo = aCommandLineArgs[i + 1]; SString strConnectInfo = ToUTF8 ( wideConnectInfo ); COPYDATASTRUCT cdStruct; cdStruct.cbData = strConnectInfo.length () + 1; cdStruct.lpData = const_cast<char *> ( strConnectInfo.c_str () ); cdStruct.dwData = URI_CONNECT; SendMessage( hwMTAWindow, WM_COPYDATA, NULL, (LPARAM)&cdStruct ); break; } } } else { if ( iRecheckTimeLimit > 0 ) { // Sleep a little bit and check the mutex again Sleep ( 500 ); iRecheckTimeLimit -= 500; continue; } SString strMessage; strMessage += _( "Trouble restarting MTA:SA\n\n" "If the problem persists, open Task Manager and\n" "stop the 'gta_sa.exe' and 'Multi Theft Auto.exe' processes\n\n\n" "Try to launch MTA:SA again?" ); if ( MessageBoxUTF8( 0, strMessage, _("Error")+_E("CL04"), MB_ICONWARNING | MB_YESNO | MB_TOPMOST ) == IDYES ) // Trouble restarting MTA:SA { TerminateGTAIfRunning (); TerminateOtherMTAIfRunning (); ShellExecuteNonBlocking( "open", PathJoin ( GetMTASAPath (), MTA_EXE_NAME ), lpCmdLine ); } return ExitProcess( EXIT_ERROR ); } } else { if ( !IsGTARunning () && !IsOtherMTARunning () ) { MessageBoxUTF8 ( 0, _("Another instance of MTA is already running.\n\nIf this problem persists, please restart your computer"), _("Error")+_E("CL05"), MB_ICONERROR | MB_TOPMOST ); } else if ( MessageBoxUTF8( 0, _("Another instance of MTA is already running.\n\nDo you want to terminate it?"), _("Error")+_E("CL06"), MB_ICONQUESTION | MB_YESNO | MB_TOPMOST ) == IDYES ) { TerminateGTAIfRunning (); TerminateOtherMTAIfRunning (); ShellExecuteNonBlocking( "open", PathJoin ( GetMTASAPath (), MTA_EXE_NAME ), lpCmdLine ); } } return ExitProcess( EXIT_ERROR ); } }