void CCore::GetLoadedModule(DWORD dwProcessId) { HMODULE hMods[1024]; HANDLE hProcess; DWORD cbNeeded; unsigned int i; hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, dwProcessId ); if (NULL == hProcess) return; if( EnumProcessModules(hProcess, hMods, sizeof(hMods), &cbNeeded)) { for ( i = 0; i < (cbNeeded / sizeof(HMODULE)); i++ ) { TCHAR szModName[MAX_PATH]; if ( GetModuleFileNameExA(hProcess, hMods[i], szModName, sizeof(szModName) / sizeof(TCHAR))) { CString strModule; std::string strModulee; strModulee.append(szModName); std::size_t found = strModulee.find("SYSTEM32",10); std::size_t found2 = strModulee.find("system32",10); std::size_t found3 = strModulee.find("AppPatch",10); std::size_t found4 = strModulee.find("WinSxS", 10); if(found != std::string::npos || found2 != std::string::npos || found3 != std::string::npos || found4 != std::string::npos) {/**/} else { strModule.AppendF("--> IVModules: %s", szModName); CLogFile::Printf(" %s (0x%08X)",strModule.Get(), hMods[i] ); } } } } CloseHandle(hProcess); return; }
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { // Get the GTA IV install directory from the registry char szInstallDirectory[MAX_PATH]; bool bFoundCustomDirectory = false, bRenewProtocol = false; std::string strReNewEntries = lpCmdLine; if(SharedUtility::ReadRegistryString(HKEY_CURRENT_USER, "Software\\IVMP", "gtaivdir", NULL, szInstallDirectory, sizeof(szInstallDirectory)) || !SharedUtility::Exists(szInstallDirectory)) { char szProtocolDirectory[MAX_PATH]; CString strCommand = CString("\"%s\" \"%%1\"",SharedUtility::GetAbsolutePath("Client.Launcher.exe")); if(strcmp(szProtocolDirectory, strCommand.Get())) bRenewProtocol = true; } // Check if protocol 'ivmp' and 'ivmultiplayer' is avaiable in registry if(!SharedUtility::ReadRegistryString(HKEY_CLASSES_ROOT, "ivmp", NULL, "", NULL, NULL) || !SharedUtility::ReadRegistryString(HKEY_CLASSES_ROOT, "ivmultiplayer", NULL, "", NULL, NULL) || bRenewProtocol) { // Update SharedUtility::WriteRegistryString(HKEY_CLASSES_ROOT,"ivmp","","IVMultiplayer",strlen("IVMultiplayer")); SharedUtility::WriteRegistryString(HKEY_CLASSES_ROOT,"ivmultiplayer","","IVMultiplayer",strlen("IVMultiplayer")); CString strcommand = CString("\"%s\" \"%%1\"",SharedUtility::GetAbsolutePath("Client.Launcher.exe")); SharedUtility::WriteRegistryString(HKEY_CLASSES_ROOT,"ivmp","Url Protocol","",0); SharedUtility::WriteRegistryString(HKEY_CLASSES_ROOT,"ivmp\\shell\\open\\command\\","",strcommand.GetData(),strcommand.GetLength()); SharedUtility::WriteRegistryString(HKEY_CLASSES_ROOT,"ivmp\\DefaultIcon","", CString("Client.Launcher.exe,1").GetData(),strlen("Client.Launcher.exe,1")); SharedUtility::WriteRegistryString(HKEY_CLASSES_ROOT,"ivmultiplayer","Url Protocol","",0); SharedUtility::WriteRegistryString(HKEY_CLASSES_ROOT,"ivmultiplayer\\shell\\open\\command\\","",strcommand.GetData(),strcommand.GetLength()); SharedUtility::WriteRegistryString(HKEY_CLASSES_ROOT,"ivmultiplayer\\DefaultIcon","", CString("Client.Launcher.exe,1").GetData(),strlen("Client.Launcher.exe,1")); } // TODO: Steam registry entry support(or the client should just pick the directory via data browser) if(!SharedUtility::ReadRegistryString(HKEY_LOCAL_MACHINE, "Software\\Rockstar Games\\Grand Theft Auto IV", "InstallFolder", NULL, szInstallDirectory, sizeof(szInstallDirectory)) || !SharedUtility::Exists(szInstallDirectory)) { if(!SharedUtility::ReadRegistryString(HKEY_CURRENT_USER, "Software\\IVMP", "gtaivdir", NULL, szInstallDirectory, sizeof(szInstallDirectory)) || !SharedUtility::Exists(szInstallDirectory)) { if(ShowMessageBox("Failed to retrieve GTA IV install directory from registry. Specify your GTA IV path now?", (MB_ICONEXCLAMATION | MB_OKCANCEL)) == IDOK) { // Taken from http://vcfaq.mvps.org/sdk/20.htm BROWSEINFO browseInfo = { 0 }; browseInfo.lpszTitle = "Pick a Directory"; ITEMIDLIST * pItemIdList = SHBrowseForFolder(&browseInfo); if(pItemIdList != NULL) { // Get the name of the selected folder if(SHGetPathFromIDList(pItemIdList, szInstallDirectory)) bFoundCustomDirectory = true; // Free any memory used IMalloc * pIMalloc = 0; if(SUCCEEDED(SHGetMalloc(&pIMalloc))) { pIMalloc->Free(pItemIdList); pIMalloc->Release(); } } } if(!bFoundCustomDirectory) { ShowMessageBox("Failed to retrieve GTA IV install directory from registry or browser window. Cannot launch IV: Multiplayer."); return 1; } } } // Check if we have the 'multiplayer' directory, if not: create it. char szExecutablePath[MAX_PATH]; sprintf_s(szExecutablePath,SharedUtility::GetAbsolutePath("").Get(),sizeof(MAX_PATH)); CString strMultiplayerPath = szExecutablePath; strMultiplayerPath.AppendF ("multiplayer"); SharedUtility::CreateDirectoryA(strMultiplayerPath.Get()); strMultiplayerPath = szExecutablePath; strMultiplayerPath.AppendF ("multiplayer\\common"); SharedUtility::CreateDirectoryA(strMultiplayerPath.Get()); SharedUtility::CreateDirectoryA(strMultiplayerPath.Get()); strMultiplayerPath = szExecutablePath; strMultiplayerPath.AppendF ("multiplayer\\pc"); SharedUtility::CreateDirectoryA(strMultiplayerPath.Get()); SharedUtility::CreateDirectoryA(strMultiplayerPath.Get()); strMultiplayerPath = szExecutablePath; strMultiplayerPath.AppendF ("multiplayer\\pc\\data"); SharedUtility::CreateDirectoryA(strMultiplayerPath.Get()); strMultiplayerPath = szExecutablePath; strMultiplayerPath.AppendF ("multiplayer\\common\\data"); SharedUtility::CreateDirectoryA(strMultiplayerPath.Get()); strMultiplayerPath = szExecutablePath; strMultiplayerPath.AppendF ("multiplayer\\common\\data\\effects"); SharedUtility::CreateDirectoryA(strMultiplayerPath.Get()); strMultiplayerPath = szExecutablePath; strMultiplayerPath.AppendF ("multiplayer\\pc\\textures"); SharedUtility::CreateDirectoryA(strMultiplayerPath.Get()); strMultiplayerPath = szExecutablePath; strMultiplayerPath.AppendF ("multiplayer\\pc\\data\\eflc"); SharedUtility::CreateDirectoryA(strMultiplayerPath.Get()); Sleep(500); // Check for eflc dir char szEFLCDirectory[MAX_PATH]; bool bFoundCustomEFLCDirectory = false; char szUsingEFLC[MAX_PATH]; bool bUsingEFLC; if(SharedUtility::ReadRegistryString(HKEY_CURRENT_USER, "Software\\IVMP", "usingeflc", "1", szUsingEFLC, sizeof(szUsingEFLC))) { SharedUtility::WriteRegistryString(HKEY_CURRENT_USER, "Software\\IVMP", "usingeflc", "1", 1); bUsingEFLC = true; } else bUsingEFLC = 0; if(!bUsingEFLC) { if(ShowMessageBox("Do you want to use EFCL import map function?", MB_ICONQUESTION | MB_YESNO ) == IDYES) { bUsingEFLC = true; SharedUtility::WriteRegistryString(HKEY_CURRENT_USER, "Software\\IVMP", "usingeflc", "1", 1); } } if(bUsingEFLC) { if(!SharedUtility::ReadRegistryString(HKEY_CURRENT_USER, "Software\\IVMP", "eflcdir", NULL, szEFLCDirectory, sizeof(szEFLCDirectory)) || !SharedUtility::Exists(szEFLCDirectory)) { if(SharedUtility::ReadRegistryString(HKEY_LOCAL_MACHINE, "Software\\Rockstar Games\\EFLC", "InstallFolder", NULL, szEFLCDirectory, sizeof(szEFLCDirectory)) || SharedUtility::Exists(szEFLCDirectory)) { bFoundCustomEFLCDirectory = true; } if(!SharedUtility::ReadRegistryString(HKEY_LOCAL_MACHINE, "Software\\Rockstar Games\\EFLC", "InstallFolder", NULL, szEFLCDirectory, sizeof(szEFLCDirectory)) || !SharedUtility::Exists(szEFLCDirectory)) { if(ShowMessageBox("Failed to retrieve GTA IV: EFLC install directory from registry. Specify your GTA IV: EFLC path now? If you do not have EFLC installed, just click No.", (MB_ICONEXCLAMATION | MB_OKCANCEL)) == IDOK) { // Taken from http://vcfaq.mvps.org/sdk/20.htm BROWSEINFO browseInfo = { 0 }; browseInfo.lpszTitle = "Pick a Directory"; ITEMIDLIST * pItemIdList = SHBrowseForFolder(&browseInfo); if(pItemIdList != NULL) { // Get the name of the selected folder if(SHGetPathFromIDList(pItemIdList, szEFLCDirectory)) { bFoundCustomEFLCDirectory = true; SharedUtility::WriteRegistryString(HKEY_CURRENT_USER, "Software\\IVMP", "usingeflc", "1", 1); } // Free any memory used IMalloc * pIMalloc = 0; if(SUCCEEDED(SHGetMalloc(&pIMalloc))) { pIMalloc->Free(pItemIdList); pIMalloc->Release(); } } } if (!bFoundCustomEFLCDirectory) SharedUtility::WriteRegistryString(HKEY_CURRENT_USER, "Software\\IVMP", "usingeflc", "0", 1); } } } if(bUsingEFLC) { CGameFiles::CheckFiles(); PROCESS_INFORMATION ProcessInfo = PROCESS_INFORMATION(); STARTUPINFO StartupInfo; ZeroMemory(&StartupInfo, sizeof(StartupInfo)); StartupInfo.cb = sizeof StartupInfo; char * szPath = new char[MAX_PATH]; sprintf(szPath,CString("%s",SharedUtility::GetAbsolutePath("\\IVGameReady.exe").Get()).Get()); CreateProcess(szPath, NULL,NULL,NULL, FALSE, NULL, NULL, NULL, &StartupInfo, &ProcessInfo); WaitForSingleObject(ProcessInfo.hProcess, INFINITE); } // Get the full path to LaunchGTAIV.exe CString strApplicationPath("%s\\LaunchGTAIV.exe", szInstallDirectory); // Check if LaunchGTAIV.exe exists if(!SharedUtility::Exists(strApplicationPath.Get())) return ShowMessageBox("Failed to find LaunchGTAIV.exe. Cannot launch IV: Multiplayer."); // If we have a custom directory save it if(bFoundCustomDirectory) SharedUtility::WriteRegistryString(HKEY_CURRENT_USER, "Software\\IVMP", "gtaivdir", szInstallDirectory, strlen(szInstallDirectory)); if(bFoundCustomEFLCDirectory) SharedUtility::WriteRegistryString(HKEY_CURRENT_USER, "Software\\IVMP", "eflcdir", szEFLCDirectory, strlen(szEFLCDirectory)); // Get the full path of the client core CString strClientCore(SharedUtility::GetAbsolutePath(CLIENT_CORE_NAME DEBUG_SUFFIX LIBRARY_EXTENSION)); // Check if the client core exists if(!SharedUtility::Exists(strClientCore.Get())) return ShowMessageBox("Failed to find " CLIENT_CORE_NAME DEBUG_SUFFIX LIBRARY_EXTENSION ". Cannot launch IV: Multiplayer."); // Get the full path of the launch helper CString strLaunchHelper(SharedUtility::GetAbsolutePath(CLIENT_LAUNCH_HELPER_NAME DEBUG_SUFFIX LIBRARY_EXTENSION)); // Check if the launch helper exists if(!SharedUtility::Exists(strLaunchHelper.Get())) return ShowMessageBox("Failed to find " CLIENT_LAUNCH_HELPER_NAME DEBUG_SUFFIX LIBRARY_EXTENSION". Cannot launch IV: Multiplayer."); // Check if GTAIV is already running if(SharedUtility::IsProcessRunning("GTAIV.exe")) { if(ShowMessageBox("GTAIV is already running and needs to be terminated before IV: Multiplayer can be started. Do you want to do that now?", MB_ICONQUESTION | MB_YESNO ) == IDYES) { if(!SharedUtility::_TerminateProcess("GTAIV.exe")) return ShowMessageBox("GTAIV.exe could not be terminated. Cannot launch IV: Multiplayer."); } else return ShowMessageBox("GTAIV.exe is already running. Cannot launch IV: Multiplayer."); } // Check if LaunchGTAIV.exe is already running if(SharedUtility::IsProcessRunning("LaunchGTAIV.exe")) { if(ShowMessageBox("LaunchGTAIV is already running and needs to be terminated before IV: Multiplayer can be started. Do you want to do that now?", MB_ICONQUESTION | MB_YESNO ) == IDYES) { if(!SharedUtility::_TerminateProcess("LaunchGTAIV.exe")) { // Wait until we've successfully terminated the process Sleep(3000); if(SharedUtility::IsProcessRunning("LaunchGTAIV.exe")) { if(!SharedUtility::_TerminateProcess("LaunchGTAIV.exe")) return ShowMessageBox("LaunchGTAIV.exe could not be terminated. Cannot launch IV: Multiplayer."); } } } else return ShowMessageBox("LaunchGTAIV.exe is already running. Cannot launch IV: Multiplayer."); } // TODO ADD WINDOW COMMANDLINE SUPPORT! // Check if we have an server connect command CString strServer, strPort; std::string strServerCheck = CString(lpCmdLine); std::size_t sizetCMDFound = strServerCheck.find("-ivmp");// -[1]i[2]v[3]m[4]p[5]*space*[6]***.***.***.*** int iOffset = 0; bool bCommandFound = false; CString strNewCommandLine = lpCmdLine; // Check for shortcut commandline if(sizetCMDFound != std::string::npos) { iOffset = 6; bCommandFound = true; } // Check for ivmp protocol if(!bCommandFound) { sizetCMDFound = strServerCheck.find("ivmp://"); // i[1]v[2]m[3]p[4]:[5]/[6]/[7]***.***.*** if(sizetCMDFound != std::string::npos) { iOffset = 7; bCommandFound = true; } } // Check for ivmultiplayer protocol if(!bCommandFound) { sizetCMDFound = strServerCheck.find("ivmultiplayer://");// i[1]v[2]m[3]u[4]l[5]t[6]i[7]p[8]l[9]a[10]y[11]e[12]r[13]:[14]/[15]/[16]***.***.*** if(sizetCMDFound != std::string::npos) { iOffset = 16; bCommandFound = true; } } // Open default clientsettings CSettings::Open(SharedUtility::GetAbsolutePath(CLIENT_SETTINGS_FILE), true, true, true); // If we have found an direct connect force if(bCommandFound) { std::string strServerInst = strServerCheck.substr(sizetCMDFound+iOffset,strServerCheck.length()); std::size_t sizetCMDFound_2 = strServerInst.find(":"); // Have we an : in our instruction if(sizetCMDFound_2 != std::string::npos) { // Grab our connect data strServer = CString("%s",strServerInst.substr(0,sizetCMDFound_2).c_str()); strPort = CString("%s",strServerInst.substr(sizetCMDFound_2+1,strServerInst.length()).c_str()); // Parse the command line CSettings::ParseCommandLine(GetCommandLine()); // Write connect data to settings xml CVAR_SET_STRING("currentconnect_server",strServer.Get()); CVAR_SET_INTEGER("currentconnect_port",strPort.ToInteger()); // Generate new commandline strNewCommandLine = CString("%s -directconnect", lpCmdLine); } else // Something is wrong with our URI { if(ShowMessageBox("Something is wrong with your server direct-connect URI, do you want to start IV:MP without direct-connect?", MB_ICONQUESTION | MB_YESNO ) == IDYES) { // Set default server direct connect values CVAR_SET_STRING("currentconnect_server","0.0.0.0"); CVAR_SET_INTEGER("currentconnect_port",9999); strNewCommandLine = lpCmdLine; } else // Terminate IV:MP { if(!SharedUtility::_TerminateProcess("Client.Launcher.exe")) return ShowMessageBox("LaunchGTAIV.exe could not be terminated. Cannot launch IV: Multiplayer."); } } } else { CSettings::ParseCommandLine(GetCommandLine()); // If we haven't found a server connect command, delte the old instructions( if the client had crashed before ) CVAR_SET_STRING("currentconnect_server","0.0.0.0"); CVAR_SET_INTEGER("currentconnect_port",9999); } // Close settings... CSettings::Close(); // Generate the command line CString strCommandLine("%s %s", strApplicationPath.Get(), strNewCommandLine.Get()); // Start LaunchGTAIV.exe STARTUPINFO siStartupInfo; PROCESS_INFORMATION piProcessInfo; memset(&siStartupInfo, 0, sizeof(siStartupInfo)); memset(&piProcessInfo, 0, sizeof(piProcessInfo)); siStartupInfo.cb = sizeof(siStartupInfo); if(!CreateProcess(strApplicationPath.Get(), (char *)strCommandLine.Get(), NULL, NULL, TRUE, CREATE_SUSPENDED, NULL, SharedUtility::GetAppPath(), &siStartupInfo, &piProcessInfo)) { ShowMessageBox("Failed to start LaunchGTAIV.exe. Cannot launch IV: Multiplayer."); return 1; } // Inject LauncherLibrary.dll into LaunchGTAIV.exe int iReturn = SharedUtility::InjectLibraryIntoProcess(piProcessInfo.hProcess, strLaunchHelper.Get()); // Did the injection fail? if(iReturn > 0) { // Terminate the process TerminateProcess(piProcessInfo.hProcess, 0); // Show the error message CString strError("Unknown error. Cannot launch IV: Multiplayer."); if(iReturn == 1) strError = "Failed to write library path into remote process. Cannot launch IV: Multiplayer."; else if(iReturn == 2) strError = "Failed to create remote thread in remote process. Cannot launch IV: Multiplayer."; else if(iReturn == 3) strError = "Failed to open the remote process, Cannot launch IV: Multiplayer."; ShowMessageBox(strError.Get()); return 1; } // Resume the LaunchGTAIV.exe thread ResumeThread(piProcessInfo.hThread); return 0; }
void CCore::OnDeviceRender(IDirect3DDevice9 * pDevice) { // Has the device been lost? if(g_bDeviceLost || !m_pGraphics) return; // Render our chat instance if (m_pChat) m_pChat->Render(); // Render our gui instance if (m_pGUI) m_pGUI->Render(); #ifdef _DEBUG char szNetworkStats[10000]; memset(szNetworkStats, 0, sizeof(szNetworkStats)); RakNet::StatisticsToString(m_pNetworkManager->GetRakPeer()->GetStatistics(RakNet::UNASSIGNED_SYSTEM_ADDRESS), szNetworkStats, 2); m_pGraphics->DrawText(26.0f, 500.0f, D3DCOLOR_ARGB(255, 255, 255, 255), 1.0f, DT_NOCLIP, true, szNetworkStats); #endif // Print our IVNetwork "Identifier" in the left upper corner unsigned short usPing = m_pNetworkManager != NULL ? (m_pNetworkManager->IsConnected() ? (g_pCore->GetGame()->GetLocalPlayer() ? g_pCore->GetGame()->GetLocalPlayer()->GetPing() : -1) : -1) : -1; CString strConnection; int iConnectTime = GetGameLoadInitializeTime() != 0 ? (int)((timeGetTime() - GetGameLoadInitializeTime()) / 1000) : 0; CString strSeconds; if (iConnectTime > 0) { strSeconds.AppendF(" | Running since "); int iSeconds = iConnectTime % 60; int iMinutes = (iConnectTime / 60) % 60; int iHours = (iConnectTime / 60 / 60) % 24; int iDays = (iConnectTime / 60 / 60 / 24); if(iDays > 0) { if(iDays > 9) strSeconds.AppendF("%d Days, ", iDays); else strSeconds.AppendF("%d Day%s, ", iDays, iDays > 1 ? "s" : ""); } if(iHours > 0) { if(iHours > 9) strSeconds.AppendF("%d Hours, ",iHours); else strSeconds.AppendF("0%d Hour%s, ",iHours, iHours > 1 ? "s" : ""); } if(iMinutes > 0) { if(iMinutes > 9) strSeconds.AppendF("%d Minutes, ",iMinutes); else strSeconds.AppendF("0%d Minute%s, ",iMinutes, iMinutes > 1 ? "s" : ""); } if (iSeconds > 9) strSeconds.AppendF("%d Seconds", iSeconds); else strSeconds.AppendF("0%d Second%s", iSeconds, iSeconds > 1 ? "s" : ""); } #ifdef _DEBUG if(GetGame()->GetLocalPlayer()) CDevelopment::DrawPedTasks(GetGame()->GetLocalPlayer()->GetPlayerPed()); #endif // Simulate temporary loading symbol m_byteLoadingStyle++; CString strLoadingInformation; if(m_byteLoadingStyle >= 0 && m_byteLoadingStyle < 10) strLoadingInformation = CString(MOD_NAME " " VERSION_IDENTIFIER " - Loading.. Hold on .").Get(); else if(m_byteLoadingStyle >= 10 && m_byteLoadingStyle < 20) strLoadingInformation = CString(MOD_NAME " " VERSION_IDENTIFIER " - Loading.. Hold on ..").Get(); else if(m_byteLoadingStyle >= 20 && m_byteLoadingStyle < 30) strLoadingInformation = CString(MOD_NAME " " VERSION_IDENTIFIER " - Loading.. Hold on ...").Get(); else if(m_byteLoadingStyle >= 30 && m_byteLoadingStyle < 40) strLoadingInformation = CString(MOD_NAME " " VERSION_IDENTIFIER " - Loading.. Hold on ....").Get(); else if (m_byteLoadingStyle >= 40 && m_byteLoadingStyle < 50) { strLoadingInformation = CString(MOD_NAME " " VERSION_IDENTIFIER " - Loading.. Hold on .....").Get(); if (m_byteLoadingStyle == 49) m_byteLoadingStyle = 0; } CString strInformation = usPing == 0xFFFF ? CString("%s%s", MOD_NAME " " VERSION_IDENTIFIER, strSeconds.Get()) : CString("%s%s | Ping %hu", MOD_NAME " " VERSION_IDENTIFIER, strSeconds.Get(), usPing); if(!g_pCore->GetGame()->GetLocalPlayer()) m_pGraphics->DrawText(60.0f, 5.0f, D3DCOLOR_ARGB(255, 0, 195, 255), 1.0f, DT_NOCLIP, true, strLoadingInformation.Get()); else m_pGraphics->DrawText(60.0f, 5.0f, D3DCOLOR_ARGB(255, 0, 195, 255), 1.0f, DT_NOCLIP, true, strInformation.Get()); strSeconds.Clear(); strLoadingInformation.Clear(); strInformation.Clear(); // Before rendering FPS-Counter instance, update FPS display m_pGraphics->DrawText(5.0f, 5.0f, D3DCOLOR_ARGB((unsigned char)255, 255, 255, 255), 1.0f, DT_NOCLIP, true, CString("FPS: %d", m_pFPSCounter->GetFPS()).Get()); // Check if our snap shot write failed if(CSnapShot::IsDone()) { if(CSnapShot::HasSucceeded()) m_pChat->Print(CString("Screen shot written (%s).", CSnapShot::GetWriteName().Get())); else m_pChat->Print(CString("Screen shot write failed (%s).", CSnapShot::GetError().Get())); CSnapShot::Reset(); } // Render our Name Tags if (m_pTags && !g_pCore->GetMainMenu()->IsMainMenuVisible() && !CIVScript::IsScreenFadedOut()) m_pTags->Draw(); }