示例#1
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;
}
示例#2
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;
}
示例#3
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);
}