////////////////////////////////////////////////////////// // // CInstallManager::_ShowCopyFailDialog // // // ////////////////////////////////////////////////////////// SString CInstallManager::_ShowCopyFailDialog ( void ) { int iResponse = MessageBoxUTF8 ( NULL, _("Could not update due to file conflicts. Please close other applications and retry"), _("Error")+_E("CL02"), MB_RETRYCANCEL | MB_ICONERROR | MB_TOPMOST ); if ( iResponse == IDRETRY ) return "retry"; return "ok"; }
////////////////////////////////////////////////////////// // // HandleNotUsedMainMenu // // Called when a problem occured before the main menu was used by user // If fullscreen, then maybe change fullscreen mode // ////////////////////////////////////////////////////////// void HandleNotUsedMainMenu ( void ) { AddReportLog( 9310, "Loader - HandleNotUsedMainMenu" ); { // Slighty hacky way of checking in-game settings SString strCoreConfigFilename = CalcMTASAPath( PathJoin( "mta", "config", "coreconfig.xml" ) ); SString strCoreConfig; FileLoad( strCoreConfigFilename, strCoreConfig ); SString strWindowed = strCoreConfig.SplitRight( "<display_windowed>" ).Left( 1 ); SString strFullscreenStyle = strCoreConfig.SplitRight( "<display_fullscreen_style>" ).Left( 1 ); if ( strFullscreenStyle == "1" ) { AddReportLog( 9315, "Loader - HandleNotUsedMainMenu - Already Borderless window" ); } else if ( !strWindowed.empty() && !strFullscreenStyle.empty()) { if ( strWindowed == "0" && strFullscreenStyle == "0" ) // 0=FULLSCREEN_STANDARD { // Inform user SString strMessage = _("Are you having problems running MTA:SA?.\n\nDo you want to change the following setting?"); strMessage += "\n" + _("Fullscreen mode:") + " -> " + _("Borderless window"); HideSplash(); int iResponse = MessageBoxUTF8 ( NULL, strMessage, "MTA: San Andreas", MB_YESNO | MB_ICONQUESTION | MB_TOPMOST ); if ( iResponse == IDYES ) { // Very hacky way of changing in-game settings strCoreConfig = strCoreConfig.Replace( "<display_fullscreen_style>0", "<display_fullscreen_style>1" ); FileSave( strCoreConfigFilename, strCoreConfig ); AddReportLog( 9311, "Loader - HandleNotUsedMainMenu - User change to Borderless window" ); } else AddReportLog( 9313, "Loader - HandleNotUsedMainMenu - User said no" ); } else AddReportLog( 9314, "Loader - HandleNotUsedMainMenu - Mode not fullscreen standard" ); } else { // If no valid settings file yet, do the change without asking strCoreConfig = "<mainconfig><settings><display_fullscreen_style>1</display_fullscreen_style></settings></mainconfig>"; FileSave( strCoreConfigFilename, strCoreConfig ); AddReportLog( 9312, "Loader - HandleNotUsedMainMenu - Set Borderless window" ); } } // Check if Evolve is active for ( auto processId : MyEnumProcesses( true ) ) { SString strFilename = ExtractFilename( GetProcessPathFilename( processId ) ); if ( strFilename.BeginsWithI( "Evolve" ) ) { SString strMessage = _("Are you having problems running MTA:SA?.\n\nTry disabling the following products for GTA and MTA:"); strMessage += "\n\nEvolve"; DisplayErrorMessageBox ( strMessage, _E("CL43"), "not-used-menu-evolve" ); break; } } }
////////////////////////////////////////////////////////// // // HandleIfGTAIsAlreadyRunning // // Check for and maybe stop a running GTA process // ////////////////////////////////////////////////////////// void HandleIfGTAIsAlreadyRunning( void ) { if ( IsGTARunning () ) { if ( MessageBoxUTF8 ( 0, _("An instance of GTA: San Andreas is already running. It needs to be terminated before MTA:SA can be started. Do you want to do that now?"), _("Information")+_E("CL10"), MB_YESNO | MB_ICONQUESTION | MB_TOPMOST ) == IDYES ) { TerminateGTAIfRunning (); if ( IsGTARunning () ) { MessageBoxUTF8 ( 0, _("Unable to terminate GTA: San Andreas. If the problem persists, please restart your computer."), _("Information")+_E("CL11"), MB_OK | MB_ICONERROR | MB_TOPMOST ); return ExitProcess( EXIT_ERROR ); } } else return ExitProcess( EXIT_OK ); } }
////////////////////////////////////////////////////////// // // HandleTrouble // // // ////////////////////////////////////////////////////////// void HandleTrouble ( void ) { if ( CheckAndShowFileOpenFailureMessage () ) return; int iResponse = MessageBoxUTF8 ( NULL, _("Are you having problems running MTA:SA?.\n\nDo you want to revert to an earlier version?"), "MTA: San Andreas"+_E("CL07"), MB_YESNO | MB_ICONQUESTION | MB_TOPMOST ); if ( iResponse == IDYES ) { BrowseToSolution ( "crashing-before-gtagame", TERMINATE_PROCESS ); } }
////////////////////////////////////////////////////////// // // HandleResetSettings // // // ////////////////////////////////////////////////////////// void HandleResetSettings ( void ) { if ( CheckAndShowFileOpenFailureMessage () ) return; CheckAndShowMissingFileMessage(); SString strSaveFilePath = PathJoin ( GetSystemPersonalPath(), "GTA San Andreas User Files" ); SString strSettingsFilename = PathJoin ( strSaveFilePath, "gta_sa.set" ); SString strSettingsFilenameBak = PathJoin ( strSaveFilePath, "gta_sa_old.set" ); if ( FileExists ( strSettingsFilename ) ) { int iResponse = MessageBoxUTF8 ( NULL, _("There seems to be a problem launching MTA:SA.\nResetting GTA settings can sometimes fix this problem.\n\nDo you want to reset GTA settings now?"), "MTA: San Andreas"+_E("CL08"), MB_YESNO | MB_ICONQUESTION | MB_TOPMOST ); if ( iResponse == IDYES ) { FileDelete ( strSettingsFilenameBak ); FileRename ( strSettingsFilename, strSettingsFilenameBak ); FileDelete ( strSettingsFilename ); if ( !FileExists ( strSettingsFilename ) ) { AddReportLog ( 4053, "Deleted gta_sa.set" ); MessageBoxUTF8 ( NULL, _("GTA settings have been reset.\n\nPress OK to continue."), "MTA: San Andreas", MB_OK | MB_ICONINFORMATION | MB_TOPMOST ); } else { AddReportLog ( 5054, SString ( "Delete gta_sa.set failed with '%s'", *strSettingsFilename ) ); MessageBoxUTF8 ( NULL, SString ( _("File could not be deleted: '%s'"), *strSettingsFilename ), "Error"+_E("CL09"), MB_OK | MB_ICONWARNING | MB_TOPMOST ); } } } else { // No settings to delete, or can't find them int iResponse = MessageBoxUTF8 ( NULL, _("Are you having problems running MTA:SA?.\n\nDo you want to see some online help?"), "MTA: San Andreas", MB_YESNO | MB_ICONQUESTION | MB_TOPMOST ); if ( iResponse == IDYES ) { BrowseToSolution ( "crashing-before-gtalaunch", TERMINATE_PROCESS ); } } }
////////////////////////////////////////////////////////// // // 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"; }
////////////////////////////////////////////////////////////////////////////////////////// // // CSettingsSA::SetValidVideoMode // // Set/validate the required video mode // ////////////////////////////////////////////////////////////////////////////////////////// void CSettingsSA::SetValidVideoMode( void ) { bool bValid = false; int iWidth, iHeight, iColorBits, iAdapterIndex; bool bAllowUnsafeResolutions = false; // First, try to get MTA saved info if ( !bValid ) { bValid = g_pCore->GetRequiredDisplayResolution( iWidth, iHeight, iColorBits, iAdapterIndex, bAllowUnsafeResolutions ); } // Otherwise deduce from GTA saved video mode if ( !bValid ) { SetAdapter( 0 ); uint numVidModes = GetNumVideoModes(); if ( VAR_SavedVideoMode > 0 && VAR_SavedVideoMode < numVidModes ) { VideoMode modeInfo; if ( GetVideoModeInfo( &modeInfo, VAR_SavedVideoMode ) ) { iWidth = modeInfo.width; iHeight = modeInfo.height; iColorBits = modeInfo.depth; iAdapterIndex = 0; bValid = true; } } } // Finally use default if ( !bValid ) { bValid = true; iWidth = 800; iHeight = 600; iColorBits = 32; iAdapterIndex = 0; } // Set adapter if ( (uint)iAdapterIndex >= GetNumAdapters() ) iAdapterIndex = 0; SetAdapter( iAdapterIndex ); // Save desktop resolution { m_iDesktopWidth = 800; m_iDesktopHeight = 600; VideoMode currentModeInfo; if ( GetVideoModeInfo( ¤tModeInfo, GetCurrentVideoMode() ) ) { m_iDesktopWidth = currentModeInfo.width; m_iDesktopHeight = currentModeInfo.height; } } // Handle 'unsafe' resolution stuff if ( IsUnsafeResolution( iWidth, iHeight ) ) { if ( bAllowUnsafeResolutions ) { // Confirm that res should be used SString strMessage = _("Are you sure you want to use this screen resolution?" ); strMessage += SString( "\n\n%d x %d", iWidth, iHeight ); if ( MessageBoxUTF8( NULL, strMessage, _("MTA: San Andreas"), MB_YESNO | MB_TOPMOST | MB_ICONQUESTION ) == IDNO ) bAllowUnsafeResolutions = false; } if ( !bAllowUnsafeResolutions ) { // Force down to desktop res if required iWidth = m_iDesktopWidth; iHeight = m_iDesktopHeight; } } // Ensure res is no smaller than 640 x 480 iWidth = Max( 640, iWidth ); iHeight = Max( 480, iHeight ); // Find mode number which best matches required settings uint uiUseVideoMode = FindVideoMode( iWidth, iHeight, iColorBits ); // Set for GTA to use VAR_CurVideoMode = uiUseVideoMode; VAR_SavedVideoMode = uiUseVideoMode; VAR_CurAdapter = iAdapterIndex; }
////////////////////////////////////////////////////////// // // CheckDataFiles // // Basic check for some essential files // ////////////////////////////////////////////////////////// void CheckDataFiles( void ) { const SString strMTASAPath = GetMTASAPath(); const SString strGTAPath = GetGTAPath(); const char* dataFilesFiles [] = { "MTA\\cgui\\images\\background_logo.png" ,"MTA\\cgui\\images\\radarset\\up.png" ,"MTA\\cgui\\images\\busy_spinner.png" ,"MTA\\cgui\\images\\rect_edge.png" ,"MTA\\D3DX9_42.dll" ,"MTA\\D3DCompiler_42.dll" ,"MTA\\bass.dll" ,"MTA\\bass_fx.dll" ,"MTA\\tags.dll" ,"MTA\\sa.dat" ,"MTA\\XInput9_1_0_mta.dll" ,"MTA\\vea.dll"}; for ( uint i = 0 ; i < NUMELMS( dataFilesFiles ) ; i++ ) { if ( !FileExists ( PathJoin( strMTASAPath, dataFilesFiles [ i ] ) ) ) { DisplayErrorMessageBox ( _("Load failed. Please ensure that the latest data files have been installed correctly."), _E("CL16"), "mta-datafiles-missing" ); return ExitProcess( EXIT_ERROR ); } } if ( FileSize ( PathJoin( strMTASAPath, "MTA", "bass.dll" ) ) != 0x0001A440 ) { DisplayErrorMessageBox ( _("Load failed. Please ensure that the latest data files have been installed correctly."), _E("CL17"), "mta-datafiles-missing" ); return ExitProcess( EXIT_ERROR ); } // Check for client file if ( !FileExists ( PathJoin( strMTASAPath, CHECK_DM_CLIENT_NAME ) ) ) { DisplayErrorMessageBox ( SString(_("Load failed. Please ensure that %s is installed correctly."),CHECK_DM_CLIENT_NAME), _E("CL18"), "client-missing" ); return ExitProcess( EXIT_ERROR ); } // Make sure the gta executable exists if ( !FileExists( PathJoin( strGTAPath, MTA_GTAEXE_NAME ) ) ) { DisplayErrorMessageBox ( SString ( _("Load failed. Could not find gta_sa.exe in %s."), strGTAPath.c_str () ), _E("CL20"), "gta_sa-missing" ); return ExitProcess( EXIT_ERROR ); } // Make sure important dll's do not exist in the wrong place const char* dllCheckList[] = { "xmll.dll", "cgui.dll", "netc.dll", "libcurl.dll", "pthread.dll" }; for ( int i = 0 ; i < NUMELMS ( dllCheckList ); i++ ) { if ( FileExists( PathJoin( strGTAPath, dllCheckList[i] ) ) ) { DisplayErrorMessageBox ( SString ( _("Load failed. %s exists in the GTA directory. Please delete before continuing."), dllCheckList[i] ), _E("CL21"), "file-clash" ); return ExitProcess( EXIT_ERROR ); } } // Check main exe has the correct name if ( GetLaunchFilename().CompareI( MTA_EXE_NAME ) == false ) { SString strMessage( _("Main file has an incorrect name (%s)"), *GetLaunchFilename() ); int iResponse = MessageBoxUTF8 ( NULL, strMessage, _("Error")+_E("CL33"), MB_RETRYCANCEL | MB_ICONERROR | MB_TOPMOST ); ReleaseSingleInstanceMutex (); if ( iResponse == IDRETRY ) ShellExecuteNonBlocking( "open", PathJoin ( strMTASAPath, MTA_EXE_NAME ) ); return ExitProcess( EXIT_ERROR ); } // Check for possible virus file changing activities if ( !VerifyEmbeddedSignature( PathJoin( strMTASAPath, MTA_EXE_NAME ) ) ) { SString strMessage( _("Main file is unsigned. Possible virus activity.\n\nSee online help if MTA does not work correctly.") ); #if MTASA_VERSION_BUILD > 0 && defined(MTA_DM_CONNECT_TO_PUBLIC) && !defined(MTA_DEBUG) DisplayErrorMessageBox( strMessage, _E("CL29"), "maybe-virus1" ); #endif } struct { const char* szMd5; const char* szFilename; } integrityCheckList[] = { { "9586E7BE6AE8016932038932D1417241", "bass.dll", }, { "B2E49F0C22C8B7D92D615F942BA19353", "bass_aac.dll", }, { "569C60F8397C34034E685A303B7404C0", "bass_ac3.dll", }, { "0E44BCAC0E940DB2BFB13448E96E4B29", "bass_fx.dll", }, { "50AF8A7D49E83A723ED0F70FB682DCFB", "bassflac.dll", }, { "BEBA64522AA8265751187E38D1FC0653", "bassmidi.dll", }, { "99F4F38007D347CEED482B7C04FDD122", "bassmix.dll", }, { "7B52BE6D702AA590DB57A0E135F81C45", "basswma.dll", }, { "38D7679D3B8B6D7F16A0AA9BF2A60043", "tags.dll", }, { "309D860FC8137E5FE9E7056C33B4B8BE", "vea.dll", }, { "0602F672BA595716E64EC4040E6DE376", "vog.dll", }, { "B37D7DF4A1430DB65AD3EA84801F9EC3", "vvo.dll", }, { "47FF3EE45DE53528F1AFD9F5982DF8C7", "vvof.dll", }, { "ADFB6D7B61E301761C700652B6FE7CCD", "XInput9_1_0_mta.dll", }, }; for ( int i = 0 ; i < NUMELMS ( integrityCheckList ); i++ ) { SString strMd5 = CMD5Hasher::CalculateHexString( PathJoin( strMTASAPath, "mta", integrityCheckList[i].szFilename ) ); if ( !strMd5.CompareI( integrityCheckList[i].szMd5 ) ) { DisplayErrorMessageBox( _("Data files modified. Possible virus activity.\n\nSee online help if MTA does not work correctly."), _E("CL30"), "maybe-virus2" ); break; } } // Check for asi files { bool bFoundInGTADir = !FindFiles( PathJoin( strGTAPath, "*.asi" ), true, false ).empty(); bool bFoundInMTADir = !FindFiles( PathJoin( strMTASAPath, "mta", "*.asi" ), true, false ).empty(); if ( bFoundInGTADir || bFoundInMTADir ) { DisplayErrorMessageBox (_( ".asi files are in the 'MTA:SA' or 'GTA: San Andreas' installation directory.\n\n" "Remove these .asi files if you experience problems with MTA:SA." ), _E("CL28"), "asi-files" ); } } // Warning if d3d9.dll exists in the GTA install directory if ( FileExists( PathJoin ( strGTAPath, "d3d9.dll" ) ) ) { ShowD3dDllDialog ( g_hInstance, PathJoin ( strGTAPath, "d3d9.dll" ) ); HideD3dDllDialog (); } // Remove old log files saved in the wrong place SString strMtaDir = PathJoin( strMTASAPath, "mta" ); if ( strGTAPath.CompareI( strMtaDir ) == false ) { FileDelete( PathJoin( strGTAPath, "CEGUI.log" ) ); FileDelete( PathJoin( strGTAPath, "logfile.txt" ) ); FileDelete( PathJoin( strGTAPath, "shutdown.log" ) ); } }
////////////////////////////////////////////////////////// // // 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 ); } }
IDirect3D9* CDirect3DHook9::API_Direct3DCreate9 ( UINT SDKVersion ) { // Get our self instance. CDirect3DHook9* pThis = CDirect3DHook9::GetSingletonPtr ( ); assert( pThis && "API_Direct3DCreate9: No CDirect3DHook9" ); if ( pThis->m_bDirect3DCreate9Suspended ) return pThis->m_pfnDirect3DCreate9( SDKVersion ); // A little hack to get past the loading time required to decrypt the gta // executable into memory... if ( !CCore::GetSingleton ( ).AreModulesLoaded ( ) ) { CCore::GetSingleton ( ).SetModulesLoaded ( true ); CCore::GetSingleton ( ).CreateNetwork ( ); CCore::GetSingleton ( ).CreateGame ( ); CCore::GetSingleton ( ).CreateMultiplayer ( ); CCore::GetSingleton ( ).CreateXML ( ); CCore::GetSingleton ( ).CreateGUI ( ); } // D3DX_SDK_VERSION checks // August 2009 SDK required for shaders to work properly #if D3DX_SDK_VERSION != 42 WriteDebugEvent( "D3DX_SDK_VERSION incorrect " QUOTE_DEFINE( D3DX_SDK_VERSION ) ); #pragma message( "WARNING: Microsoft DirectX SDK (August 2009) includes missing" ) #ifndef MTA_DEBUG #error "Microsoft DirectX SDK (August 2009) includes missing" #endif #endif if ( !D3DXCheckVersion( D3D_SDK_VERSION, D3DX_SDK_VERSION ) ) { SString strMessage( "D3DXCheckVersion FAILED (D3D_SDK_VERSION: %d D3DX_SDK_VERSION: %d SDKVersion: %d)", D3D_SDK_VERSION, D3DX_SDK_VERSION, SDKVersion ); WriteDebugEvent( strMessage ); AddReportLog( 9640, strMessage ); } else { SString strMessage( "D3DXCheckVersion success (D3D_SDK_VERSION: %d D3DX_SDK_VERSION: %d SDKVersion: %d)", D3D_SDK_VERSION, D3DX_SDK_VERSION, SDKVersion ); WriteDebugEvent( strMessage ); } // Create our interface. WriteDebugEvent ( "Calling Direct3DCreate9" ); IDirect3D9* pDirect3D9 = pThis->m_pfnDirect3DCreate9 ( SDKVersion ); if ( !pDirect3D9 ) { WriteDebugEvent ( "Direct3DCreate9 failed" ); MessageBoxUTF8 ( NULL, _("Could not initialize Direct3D9.\n\n" "Please ensure the DirectX End-User Runtime and\n" "latest Windows Service Packs are installed correctly.") , _("Error")+_E("CC50"), MB_OK | MB_ICONERROR | MB_TOPMOST ); // Could not initialize Direct3D9. Please ensure the DirectX End-User Runtime and latest Windows Service Packs are installed correctly. return NULL; } WriteDebugEvent ( "Direct3DCreate9 succeded" ); GetServerCache (); // Create a proxy device. CProxyDirect3D9* pProxyDirect3D9 = new CProxyDirect3D9 ( pDirect3D9 ); return pProxyDirect3D9; }
void ShowLayoutError ( const SString& strExtraInfo ) { MessageBoxUTF8 ( 0, SString ( _("Multi Theft Auto has not been installed properly, please reinstall. %s"), *strExtraInfo ), _("Error")+_E("CL03"), MB_OK | MB_TOPMOST ); TerminateProcess ( GetCurrentProcess (), 9 ); }