Ejemplo n.º 1
0
BOOL WINAPI CreateProcessW_Hook(LPCWSTR lpApplicationName, LPWSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCWSTR lpCurrentDirectory, LPSTARTUPINFOA lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation)
{
	// If this is not a call to start the 'GTAIV.exe' process then just call the original CreateProcessW
	if(wcscmp(lpApplicationName, L"GTAIV.exe"))
		return g_pfnCreateProcessW(lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes, bInheritHandles, dwCreationFlags, lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation);

	// Set the CREATE_SUSPENDED flag in the creation flags
	dwCreationFlags |= CREATE_SUSPENDED;

	// Get the GTA IV install directory from the registry
	char szInstallDirectory[MAX_PATH];
	bool bFoundCustomDirectory = false;

	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. Cannot launch IV: Multiplayer.");
				return FALSE;
			}
		}
	}

	// Get the full path to GTAIV.exe
	String strApplicationPath("%s\\GTAIV.exe", szInstallDirectory);

	// Make sure the GTAIV.exe path is valid
	if(!SharedUtility::Exists(strApplicationPath.Get()))
	{
		ShowMessageBox("Failed to find GTAIV.exe. Cannot launch IV: Multiplayer.");
		return FALSE;
	}

	// If we have a custom directory save it
	if(bFoundCustomDirectory)
		SharedUtility::WriteRegistryString(HKEY_CURRENT_USER, "Software\\IVMP", "gtaivdir", szInstallDirectory, strlen(szInstallDirectory));

	// Convert the install directory to unicode
	wchar_t wszInstallDirectory[MAX_PATH];
	int iInstallDirectoryLength = SharedUtility::AnsiToUnicode(szInstallDirectory, strlen(szInstallDirectory), wszInstallDirectory, sizeof(wszInstallDirectory));
	wszInstallDirectory[iInstallDirectoryLength] = '\0';

	// Convert the application path to unicode
	wchar_t wszApplicationPath[MAX_PATH];
	int iApplicationPathLength = SharedUtility::AnsiToUnicode(strApplicationPath.Get(), strApplicationPath.GetLength(), wszApplicationPath, sizeof(wszApplicationPath));
	wszApplicationPath[iApplicationPathLength] = '\0';

	// Create the process
	BOOL bReturn = g_pfnCreateProcessW(wszApplicationPath, lpCommandLine, lpProcessAttributes, lpThreadAttributes, bInheritHandles, dwCreationFlags, lpEnvironment, wszInstallDirectory, lpStartupInfo, lpProcessInformation);

	if(bReturn)
	{
		// Get the full path of the client dll
		String strLibraryPath(SharedUtility::GetAbsolutePath(CLIENT_CORE_NAME DEBUG_SUFFIX LIBRARY_EXTENSION));

		// Inject Client.dll into GTAIV.exe
		int iReturn = SharedUtility::InjectLibraryIntoProcess(lpProcessInformation->hProcess, strLibraryPath.Get());

		// Did the injection fail?
		if(iReturn > 0)
		{
			// Terminate the process
			TerminateProcess(lpProcessInformation->hProcess, 0);
			String 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 FALSE;
		}

		// Resume the GTAIV.exe thread
		ResumeThread(lpProcessInformation->hThread);
	}

	return bReturn;
}
Ejemplo n.º 2
0
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
	#ifndef _DEBUG
	// Is there a debugger present?
	if ( IsDebuggerPresent () )
	{
		// Exit
		ExitProcess ( -1 );
	}
	#endif

	// Create the gui instance
	pGUI = new CGUI;

#ifndef _DEBUG
	// Create the updater instance
	/*pUpdater = new CUpdate;
	
	// Check for updates
	pUpdater->CheckForUpdates();*/
#endif

	//
	bool bFoundCustomDirectory = false;
	char szInstallDirectory[ MAX_PATH ];

	// Try get the custom directory
	if( !SharedUtility::ReadRegistryString( HKEY_LOCAL_MACHINE, "Software\\Wow6432Node\\Mafia 2 Multiplayer", "GameDir", NULL, szInstallDirectory, sizeof(szInstallDirectory) ) )
	{
		// Ask them to find their own directory
		if( ShowMessageBox( "Failed to find Mafia II install directory. Do you want to select it now?", (MB_ICONEXCLAMATION | MB_YESNO) ) == IDYES )
		{
			// Construct the browse info
			BROWSEINFO browseInfo = {0};
			browseInfo.lpszTitle = "Select your Mafia II directory";
			ITEMIDLIST * pItemIdList = SHBrowseForFolder( &browseInfo );

			// Did they finish looking for a folder?
			if( pItemIdList != NULL )
			{
				// Get the name of the selected folder
				if( SHGetPathFromIDList( pItemIdList, szInstallDirectory ) )
					bFoundCustomDirectory = true;

				// Was any memory used?
				IMalloc * pIMalloc = NULL;
				if( SUCCEEDED( SHGetMalloc( &pIMalloc ) ) )
				{
					// Free the memory
					pIMalloc->Free( pItemIdList );

					// Release the malloc
					pIMalloc->Release();
				}
			}

			// Did they not find the registry?
			if( !bFoundCustomDirectory )
			{
				ShowMessageBox( "Failed to find Mafia II install directory. Can't launch "MOD_NAME"." );
				return 1;
			}
		}
	}

	// Get the launch path string
	String strLaunchPath( "%s\\pc", szInstallDirectory );

	// Get the full path to Mafia2.exe
	String strApplicationPath( "%s\\Mafia2.exe", strLaunchPath.Get() );

	// Does Mafia2.exe not exist?
	if( !SharedUtility::Exists( strApplicationPath.Get() ) )
	{
		ShowMessageBox( "Failed to find Mafia2.exe. Can't launch "MOD_NAME"." );
		return 1;
	}

	// If we have a custom directory, save it!
	if( bFoundCustomDirectory )
		SharedUtility::WriteRegistryString( HKEY_LOCAL_MACHINE, "Software\\Wow6432Node\\Mafia 2 Multiplayer", "GameDir", szInstallDirectory, sizeof(szInstallDirectory) );

	// Get the full path to m2mp.dll
	String strModulePath( "%s\\%s", SharedUtility::GetAppPath(), CORE_MODULE );

	// Does m2mp.dll not exist?
	if( !SharedUtility::Exists( strModulePath.Get() ) )
	{
		ShowMessageBox( "Failed to find "CORE_MODULE". Can't launch "MOD_NAME"." );
		return 1;
	}

	// Terminate Mafia II process if it's already running?
	if( SharedUtility::IsProcessRunning( "Mafia2.exe" ) )
		SharedUtility::_TerminateProcess( "Mafia2.exe" );

	// Create the startup info struct
	STARTUPINFO siStartupInfo;
	PROCESS_INFORMATION piProcessInfo;
	memset( &siStartupInfo, 0, sizeof(siStartupInfo) );
	memset( &piProcessInfo, 0, sizeof(piProcessInfo) );
	siStartupInfo.cb = sizeof(siStartupInfo);

	// Create the Mafia II process
	if( !CreateProcess( strApplicationPath.Get(), NULL, NULL, NULL, TRUE, CREATE_SUSPENDED, NULL, SharedUtility::GetAppPath(), &siStartupInfo, &piProcessInfo ) )
	{
		ShowMessageBox( "Failed to start Mafia2.exe. Can't launch "MOD_NAME"." );
		return 1;
	}

	// Inject m2mp.dll into Mafia2.exe
	int iReturn = SharedUtility::InjectLibraryIntoProcess( piProcessInfo.hProcess, strModulePath.Get() );

	// Did m2mp.dll fail to inject?
	if( iReturn > 0 )
	{
		// Terminate Mafia2.exe
		TerminateProcess( piProcessInfo.hProcess, 0 );

		// Generate the error string
		String strError( "Unknown Error. Can't launch "MOD_NAME"." );

		// Find the cause of the error
		if( iReturn == 1 )
			strError = "Failed to write library path into remote process. Can't launch "MOD_NAME".";
		else if( iReturn == 2 )
			strError = "Failed to create remote thread in remote process. Can't launch "MOD_NAME".";
		else if( iReturn == 2 )
			strError = "Failed to open the remote process. Can't launch "MOD_NAME".";

		// Show the error message
		ShowMessageBox( strError.Get() );
		return 1;
	}

	// Resume Mafia2.exe thread
	ResumeThread( piProcessInfo.hThread );

	return 0;
}
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
0
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    // Get the GTA IV install directory from the registry
    char szInstallDirectory[MAX_PATH];
    bool bFoundCustomDirectory = false;

    // TODO: Steam registry entry support
    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. Cannot launch IV: Multiplayer.");
                return 1;
            }
        }
    }

    // Get the full path to LaunchGTAIV.exe
    CString strApplicationPath("%s\\LaunchGTAIV.exe", szInstallDirectory);

    // Check if LaunchGTAIV.exe exists
    if(!SharedUtility::Exists(strApplicationPath.Get()))
    {
        ShowMessageBox("Failed to find LaunchGTAIV.exe. Cannot launch IV: Multiplayer.");
        return 1;
    }

    // If we have a custom directory save it
    if(bFoundCustomDirectory)
        SharedUtility::WriteRegistryString(HKEY_CURRENT_USER, "Software\\IVMP", "gtaivdir", szInstallDirectory, strlen(szInstallDirectory));

    // 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()))
    {
        ShowMessageBox("Failed to find " CLIENT_CORE_NAME DEBUG_SUFFIX LIBRARY_EXTENSION ". Cannot launch IV: Multiplayer.");
        return 1;
    }

    // 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()))
    {
        ShowMessageBox("Failed to find " CLIENT_LAUNCH_HELPER_NAME DEBUG_SUFFIX LIBRARY_EXTENSION". Cannot launch IV: Multiplayer.");
        return 1;
    }

    // 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"))
            {
                ShowMessageBox("GTAIV.exe could not be terminated. Cannot launch IV: Multiplayer.");
                return 1;
            }
        }
        else
        {
            ShowMessageBox("GTAIV.exe is already running. Cannot launch IV: Multiplayer.");
            return 1;
        }
    }

    // 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"))
                    {
                        ShowMessageBox("LaunchGTAIV.exe could not be terminated. Cannot launch IV: Multiplayer.");
                        return 1;
                    }
                }
            }
        }
        else
        {
            ShowMessageBox("LaunchGTAIV.exe is already running. Cannot launch IV: Multiplayer.");
            return 1;
        }
    }

    // Generate the command line
    CString strCommandLine("%s %s", strApplicationPath.Get(), lpCmdLine);

    // 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;
}
Ejemplo n.º 5
0
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;

	char szProtocolDirectory[MAX_PATH];
	CString strCommand = CString("\"%s\" \"%%1\"",SharedUtility::GetAbsolutePath(MP_START_EXECUTABLE));

	if(strcmp(szProtocolDirectory, strCommand.Get()))
		bRenewProtocol = true;

	// Check if protocol 'ivn' and 'ivnetwork' is avaiable in registry
	if(!SharedUtility::ReadRegistryString(HKEY_CLASSES_ROOT, SHORT_URI_LAUNCH_3, NULL, "", NULL, NULL)
		|| !SharedUtility::ReadRegistryString(HKEY_CLASSES_ROOT, SHORT_URI_LAUNCH_4, NULL, "", NULL, NULL) || bRenewProtocol) {

		SharedUtility::WriteRegistryString(HKEY_CLASSES_ROOT,SHORT_URI_LAUNCH_3,"",CLIENT_CORE_NAME,strlen(CLIENT_CORE_NAME));
		SharedUtility::WriteRegistryString(HKEY_CLASSES_ROOT,SHORT_URI_LAUNCH_4,"",CLIENT_CORE_NAME,strlen(CLIENT_CORE_NAME));

		CString strcommand = CString("\"%s\" \"%%1\"",SharedUtility::GetAbsolutePath(MP_START_EXECUTABLE));

		SharedUtility::WriteRegistryString(HKEY_CLASSES_ROOT,SHORT_URI_LAUNCH_3 ,"Url Protocol","",0);
		SharedUtility::WriteRegistryString(HKEY_CLASSES_ROOT,SHORT_URI_LAUNCH_3"\\shell\\open\\command\\","",CString("%s",strcommand.Get()).GetData(),strcommand.GetLength());
		SharedUtility::WriteRegistryString(HKEY_CLASSES_ROOT,SHORT_URI_LAUNCH_3"\\DefaultIcon","", CString(MP_START_EXECUTABLE" ,1").GetData(),strlen(MP_START_EXECUTABLE" ,1"));

		SharedUtility::WriteRegistryString(HKEY_CLASSES_ROOT,SHORT_URI_LAUNCH_4,"Url Protocol","",0);
		SharedUtility::WriteRegistryString(HKEY_CLASSES_ROOT,SHORT_URI_LAUNCH_4"\\shell\\open\\command\\","",CString("%s",strcommand.Get()).GetData(),strcommand.GetLength());
		SharedUtility::WriteRegistryString(HKEY_CLASSES_ROOT,SHORT_URI_LAUNCH_4"\\DefaultIcon","", CString(MP_START_EXECUTABLE" ,1").GetData(),strlen(MP_START_EXECUTABLE" ,1"));
	}

	if(!SharedUtility::ReadRegistryString(HKEY_LOCAL_MACHINE, DEFAULT_REGISTRY_GAME_DIRECTORY,
		"InstallFolder", NULL, szInstallDirectory, sizeof(szInstallDirectory)) ||
		!SharedUtility::Exists(szInstallDirectory)) {

		if(!SharedUtility::ReadRegistryString(HKEY_CURRENT_USER, REGISTRY_AREA, GAME_DIRECTORY, NULL,
			szInstallDirectory, sizeof(szInstallDirectory)) ||
			!SharedUtility::Exists(szInstallDirectory)) {

			if(ShowMessageBox("Failed to retrieve the install directory from "GAME_DEFAULT_EXECUTABLE"'s registry. Specify your game path now?",
				(MB_ICONEXCLAMATION | MB_OKCANCEL)) == IDOK)  {
				
				BROWSEINFO browseInfo = { 0 };
				browseInfo.lpszTitle = MOD_NAME" - 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 the install directory from registry or browser window. Cannot launch "MOD_NAME".");
				return 1;
			}
		}
	}

	// Create basic directories for extracting files(..)
	SharedUtility::CreateBasicMPDirectories();

	Sleep(500);

	// Get the full path to EFLC.exe
	CString strApplicationPath("%s\\"GAME_DEFAULT_EXECUTABLE, szInstallDirectory);

	// Check if EFLC.exe exists
	if(!SharedUtility::Exists(strApplicationPath.Get()))
		return ShowMessageBox("Failed to find "GAME_DEFAULT_EXECUTABLE". Cannot launch "MOD_NAME".");

	// If we have a custom directory save it
	if(bFoundCustomDirectory)
		SharedUtility::WriteRegistryString(HKEY_CURRENT_USER, REGISTRY_AREA, GAME_DIRECTORY, szInstallDirectory, strlen(szInstallDirectory));

	// 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 "MOD_NAME".");

	// Get the full path of the launch helper
	CString strCore(SharedUtility::GetAbsolutePath(CLIENT_CORE_NAME DEBUG_SUFFIX LIBRARY_EXTENSION));

	// Check if the launch helper exists
	if (!SharedUtility::Exists(strCore.Get()))
		return ShowMessageBox("Failed to find " CLIENT_CORE_NAME DEBUG_SUFFIX LIBRARY_EXTENSION". Cannot launch "MOD_NAME".");

	// Get the full path of the launch helper
	CString strBass(SharedUtility::GetAbsolutePath("bass.dll"));

	// Check if the launch helper exists
	if (!SharedUtility::Exists(strBass.Get()))
		return ShowMessageBox("Failed to find bass.dll. Cannot launch "MOD_NAME".");

	// Check if GTAEFLC is already running
	if (SharedUtility::IsProcessRunning(GAME_DEFAULT_EXECUTABLE))
	{
		if (ShowMessageBox(GAME_DEFAULT_EXECUTABLE" is already running and needs to be terminated before "MOD_NAME" can be started. Do you want to do that now?",
			MB_ICONQUESTION | MB_YESNO) == IDYES)
		{
			if (!SharedUtility::_TerminateProcess(GAME_DEFAULT_EXECUTABLE))
			{
				if (ShowMessageBox("Do you want to start it?",
					MB_ICONQUESTION | MB_YESNO) == IDYES) {
				}
				else
				{
					return ShowMessageBox(GAME_DEFAULT_EXECUTABLE" could not be terminated. Cannot launch "MOD_NAME".");
				}
			}
		}
		else
			return ShowMessageBox(GAME_DEFAULT_EXECUTABLE" is already running. Cannot launch "MOD_NAME".");
	}

	// 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(SHORT_COMMANDLINE_LAUNCH_1);
	int iOffset = 0;
	bool bCommandFound = false;
	CString strNewCommandLine = lpCmdLine;

	// Check for shortcut commandline
	if(sizetCMDFound != std::string::npos) {
		iOffset = 6;
		bCommandFound = true;
	}

	// Check for ivn protocol
	if(!bCommandFound) {
		sizetCMDFound = strServerCheck.find(SHORT_URI_LAUNCH_1); 
		if(sizetCMDFound != std::string::npos) {
			iOffset = 7;
			bCommandFound = true;
		}
	}

	// Check for ivmultiplayer protocol
	if(!bCommandFound) {
		sizetCMDFound = strServerCheck.find(SHORT_URI_LAUNCH_2);
		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 "MOD_NAME" 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:N
			{
				if(!SharedUtility::_TerminateProcess(MP_START_EXECUTABLE))
					return ShowMessageBox(MP_START_EXECUTABLE" could not be terminated. Cannot launch IV:Network.");
			}

		}
	}
	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, szInstallDirectory, &siStartupInfo, &piProcessInfo)) {
		ShowMessageBox("Failed to start "GAME_DEFAULT_EXECUTABLE". Cannot launch "MOD_NAME".");
		return 1;
	}

	// Inject bass.dll into EFLC.exe
	int iReturn = SharedUtility::InjectLibraryIntoProcess(piProcessInfo.hProcess, strBass.Get());

	// Inject IVNetwork.dll into EFLC.exe
	iReturn += SharedUtility::InjectLibraryIntoProcess(piProcessInfo.hProcess, strCore.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 "MOD_NAME".");

		if(iReturn == 1)
			strError = "Failed to write library path into remote process. Cannot launch "MOD_NAME".";
		else if(iReturn == 2)
			strError = "Failed to create remote thread in remote process. Cannot launch "MOD_NAME".";
		else if(iReturn == 3)
			strError = "Failed to open the remote process, Cannot launch "MOD_NAME".";

		ShowMessageBox(strError.Get());
		return 1;
	}

	// Resume the thread
	ResumeThread(piProcessInfo.hThread);
	return 0;
}
Ejemplo n.º 6
0
void CLauncherDialog::OnBnClickedOk()
{
	CString ipAddress;
	CString port;
	CString password;
	CString nick;
	GetDlgItemText(IDC_EDIT1, ipAddress);

	if(ipAddress.IsEmpty())
	{
		MessageBox("No ip address entered.");
		return;
	}

	GetDlgItemText(IDC_EDIT2, port);

	if(port.IsEmpty())
	{
		MessageBox("No port entered.");
		return;
	}

	GetDlgItemText(IDC_EDIT3, password);
	GetDlgItemText(IDC_EDIT4, nick);

	if(nick.IsEmpty())
	{
		MessageBox("No nick entered.");
		return;
	}

	// Get the GTA IV install directory from the registry
	char szInstallDirectory[MAX_PATH];
	bool bFoundCustomDirectory = false;

	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\\NIV", "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. Cannot launch Networked: IV.");
				return;
			}
		}
	}

	// Get the full path to LaunchGTAIV.exe
	String strApplicationPath("%s\\LaunchGTAIV.exe", szInstallDirectory);

	// Check if LaunchGTAIV.exe exists
	if(!SharedUtility::Exists(strApplicationPath.Get()))
	{
		ShowMessageBox("Failed to find LaunchGTAIV.exe. Cannot launch Networked: IV.");
		return;
	}

	// If we have a custom directory save it
	if(bFoundCustomDirectory)
		SharedUtility::WriteRegistryString(HKEY_CURRENT_USER, "Software\\NIV", "gtaivdir", szInstallDirectory, strlen(szInstallDirectory));

	// Format the command line params
	String strParams("\"%s\" -ip %s -port %s -nick %s", strApplicationPath.Get(), ipAddress, port, nick);

	// Do we have a password?
	if(!password.IsEmpty())
	{
		// Append it to the command line params
		strParams += " -password";
		strParams += password;
	}

	// Save the edit box values
	SaveInfo();

	// Get the full path of the client core
	String strClientCore("%s" CLIENT_CORE_NAME DEBUG_SUFFIX ".dll", SharedUtility::GetAppPath());

	// Check if the client core exists
	if(!SharedUtility::Exists(strClientCore.Get()))
	{
		ShowMessageBox("Failed to find " CLIENT_CORE_NAME DEBUG_SUFFIX ".dll. Cannot launch Networked: IV.");
		return;
	}

	// Get the full path of the launch helper
	String strLaunchHelper("%s" CLIENT_LAUNCH_HELPER_NAME DEBUG_SUFFIX ".dll", SharedUtility::GetAppPath());

	// Check if the launch helper exists
	if(!SharedUtility::Exists(strLaunchHelper.Get()))
	{
		ShowMessageBox("Failed to find " CLIENT_LAUNCH_HELPER_NAME DEBUG_SUFFIX ".dll. Cannot launch Networked: IV.");
		return;
	}

	// Check if LaunchGTAIV.exe is already running
	if(IsProcessRunning("LaunchGTAIV.exe"))
	{
		ShowMessageBox("LaunchGTAIV.exe is already running. Cannot launch Networked: IV.");
		return;
	}

	// Check if GTAIV.exe is already running
	if(IsProcessRunning("GTAIV.exe"))
	{
		ShowMessageBox("GTAIV.exe is already running. Cannot launch Networked: IV.");
		return;
	}

	// 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(), strParams.GetData(), NULL, NULL, TRUE, CREATE_SUSPENDED, NULL, 
		SharedUtility::GetAppPath(), &siStartupInfo, &piProcessInfo))
	{
		ShowMessageBox("Failed to start LaunchGTAIV.exe. Cannot launch Networked: IV.");
		return;
	}

	// 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
		String strError("Unknown error. Cannot launch Networked: IV.");

		if(iReturn == 1)
			strError = "Failed to write library path into remote process. Cannot launch Networked: IV.";
		else if(iReturn == 2)
			strError = "Failed to create remote thread in remote process. Cannot launch Networked: IV.";
		else if(iReturn == 3)
			strError = "Failed to open the remote process, Cannot launch Networked: IV.";

		ShowMessageBox(strError.Get());
		return;
	}

	// Resume the LaunchGTAIV.exe thread
	ResumeThread(piProcessInfo.hThread);
}