From fb82ecfec5893b00f68b72f912c6b3975b5fdb4f Mon Sep 17 00:00:00 2001 From: BobTheBob <32057864+BobTheBob9@users.noreply.github.com> Date: Mon, 6 Sep 2021 00:24:52 +0100 Subject: moving to using unpacked for launcher --- GameInjector/GameInjector.vcxproj | 176 ---------------- GameInjector/GameInjector.vcxproj.filters | 39 ---- GameInjector/MinHook.h | 186 ----------------- GameInjector/MinHook.x64.dll | Bin 15360 -> 0 bytes GameInjector/MinHook.x64.lib | Bin 4048 -> 0 bytes GameInjector/MinHook.x86.dll | Bin 12288 -> 0 bytes GameInjector/MinHook.x86.lib | Bin 4238 -> 0 bytes GameInjector/dllmain.cpp | 194 ------------------ GameInjector/framework.h | 5 - GameInjector/pch.cpp | 5 - GameInjector/pch.h | 15 -- InjectionProxy64/InjectionProxy64.vcxproj | 147 -------------- InjectionProxy64/InjectionProxy64.vcxproj.filters | 22 -- InjectionProxy64/main.cpp | 40 ---- InjectorTest/InjectorTest.vcxproj | 147 -------------- InjectorTest/InjectorTest.vcxproj.filters | 22 -- InjectorTest/main.cpp | 68 ------- LauncherInjector/LauncherInjector.vcxproj | 10 + LauncherInjector/LauncherInjector.vcxproj.filters | 15 ++ LauncherInjector/main.cpp | 236 +++++++++------------- LauncherInjector/ns_icon.ico | Bin 0 -> 4286 bytes LauncherInjector/resource1.h | 16 ++ LauncherInjector/resources.rc | 71 +++++++ R2Northstar.sln | 43 +--- 24 files changed, 207 insertions(+), 1250 deletions(-) delete mode 100644 GameInjector/GameInjector.vcxproj delete mode 100644 GameInjector/GameInjector.vcxproj.filters delete mode 100644 GameInjector/MinHook.h delete mode 100644 GameInjector/MinHook.x64.dll delete mode 100644 GameInjector/MinHook.x64.lib delete mode 100644 GameInjector/MinHook.x86.dll delete mode 100644 GameInjector/MinHook.x86.lib delete mode 100644 GameInjector/dllmain.cpp delete mode 100644 GameInjector/framework.h delete mode 100644 GameInjector/pch.cpp delete mode 100644 GameInjector/pch.h delete mode 100644 InjectionProxy64/InjectionProxy64.vcxproj delete mode 100644 InjectionProxy64/InjectionProxy64.vcxproj.filters delete mode 100644 InjectionProxy64/main.cpp delete mode 100644 InjectorTest/InjectorTest.vcxproj delete mode 100644 InjectorTest/InjectorTest.vcxproj.filters delete mode 100644 InjectorTest/main.cpp create mode 100644 LauncherInjector/ns_icon.ico create mode 100644 LauncherInjector/resource1.h create mode 100644 LauncherInjector/resources.rc diff --git a/GameInjector/GameInjector.vcxproj b/GameInjector/GameInjector.vcxproj deleted file mode 100644 index 37a269df..00000000 --- a/GameInjector/GameInjector.vcxproj +++ /dev/null @@ -1,176 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - 16.0 - Win32Proj - {b3554508-967e-49d2-bf87-586dd95d817c} - GameInjector - 10.0 - - - - DynamicLibrary - true - v142 - Unicode - - - DynamicLibrary - false - v142 - true - Unicode - - - DynamicLibrary - true - v142 - Unicode - - - DynamicLibrary - false - v142 - true - Unicode - - - - - - - - - - - - - - - - - - - - - true - - - false - - - true - - - false - - - - Level3 - true - WIN32;_DEBUG;GAMEINJECTOR_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) - true - Use - pch.h - $(ProjectDir) - stdcpp17 - - - Windows - true - false - $(ProjectDir)MinHook.x86.lib;%(AdditionalDependencies) - - - - - Level3 - true - true - true - WIN32;NDEBUG;GAMEINJECTOR_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) - true - Use - pch.h - $(ProjectDir) - stdcpp17 - - - Windows - true - true - true - false - $(ProjectDir)MinHook.x86.lib;%(AdditionalDependencies) - - - - - Level3 - true - _DEBUG;GAMEINJECTOR_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) - true - Use - pch.h - - - Windows - true - false - - - - - Level3 - true - true - true - NDEBUG;GAMEINJECTOR_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) - true - Use - pch.h - - - Windows - true - true - true - false - - - - - - - - - - - Create - Create - Create - Create - - - - - - \ No newline at end of file diff --git a/GameInjector/GameInjector.vcxproj.filters b/GameInjector/GameInjector.vcxproj.filters deleted file mode 100644 index e70fcdb6..00000000 --- a/GameInjector/GameInjector.vcxproj.filters +++ /dev/null @@ -1,39 +0,0 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - {111f468d-e3a5-4d1a-903d-8911f4cfd715} - - - - - Header Files - - - Header Files - - - Header Files\include - - - - - Source Files - - - Source Files - - - \ No newline at end of file diff --git a/GameInjector/MinHook.h b/GameInjector/MinHook.h deleted file mode 100644 index 15c0a875..00000000 --- a/GameInjector/MinHook.h +++ /dev/null @@ -1,186 +0,0 @@ -/* - * MinHook - The Minimalistic API Hooking Library for x64/x86 - * Copyright (C) 2009-2017 Tsuda Kageyu. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A - * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER - * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#pragma once - -#if !(defined _M_IX86) && !(defined _M_X64) && !(defined __i386__) && !(defined __x86_64__) - #error MinHook supports only x86 and x64 systems. -#endif - -#include - -// MinHook Error Codes. -typedef enum MH_STATUS -{ - // Unknown error. Should not be returned. - MH_UNKNOWN = -1, - - // Successful. - MH_OK = 0, - - // MinHook is already initialized. - MH_ERROR_ALREADY_INITIALIZED, - - // MinHook is not initialized yet, or already uninitialized. - MH_ERROR_NOT_INITIALIZED, - - // The hook for the specified target function is already created. - MH_ERROR_ALREADY_CREATED, - - // The hook for the specified target function is not created yet. - MH_ERROR_NOT_CREATED, - - // The hook for the specified target function is already enabled. - MH_ERROR_ENABLED, - - // The hook for the specified target function is not enabled yet, or already - // disabled. - MH_ERROR_DISABLED, - - // The specified pointer is invalid. It points the address of non-allocated - // and/or non-executable region. - MH_ERROR_NOT_EXECUTABLE, - - // The specified target function cannot be hooked. - MH_ERROR_UNSUPPORTED_FUNCTION, - - // Failed to allocate memory. - MH_ERROR_MEMORY_ALLOC, - - // Failed to change the memory protection. - MH_ERROR_MEMORY_PROTECT, - - // The specified module is not loaded. - MH_ERROR_MODULE_NOT_FOUND, - - // The specified function is not found. - MH_ERROR_FUNCTION_NOT_FOUND -} -MH_STATUS; - -// Can be passed as a parameter to MH_EnableHook, MH_DisableHook, -// MH_QueueEnableHook or MH_QueueDisableHook. -#define MH_ALL_HOOKS NULL - -#ifdef __cplusplus -extern "C" { -#endif - - // Initialize the MinHook library. You must call this function EXACTLY ONCE - // at the beginning of your program. - MH_STATUS WINAPI MH_Initialize(VOID); - - // Uninitialize the MinHook library. You must call this function EXACTLY - // ONCE at the end of your program. - MH_STATUS WINAPI MH_Uninitialize(VOID); - - // Creates a Hook for the specified target function, in disabled state. - // Parameters: - // pTarget [in] A pointer to the target function, which will be - // overridden by the detour function. - // pDetour [in] A pointer to the detour function, which will override - // the target function. - // ppOriginal [out] A pointer to the trampoline function, which will be - // used to call the original target function. - // This parameter can be NULL. - MH_STATUS WINAPI MH_CreateHook(LPVOID pTarget, LPVOID pDetour, LPVOID *ppOriginal); - - // Creates a Hook for the specified API function, in disabled state. - // Parameters: - // pszModule [in] A pointer to the loaded module name which contains the - // target function. - // pszTarget [in] A pointer to the target function name, which will be - // overridden by the detour function. - // pDetour [in] A pointer to the detour function, which will override - // the target function. - // ppOriginal [out] A pointer to the trampoline function, which will be - // used to call the original target function. - // This parameter can be NULL. - MH_STATUS WINAPI MH_CreateHookApi( - LPCWSTR pszModule, LPCSTR pszProcName, LPVOID pDetour, LPVOID *ppOriginal); - - // Creates a Hook for the specified API function, in disabled state. - // Parameters: - // pszModule [in] A pointer to the loaded module name which contains the - // target function. - // pszTarget [in] A pointer to the target function name, which will be - // overridden by the detour function. - // pDetour [in] A pointer to the detour function, which will override - // the target function. - // ppOriginal [out] A pointer to the trampoline function, which will be - // used to call the original target function. - // This parameter can be NULL. - // ppTarget [out] A pointer to the target function, which will be used - // with other functions. - // This parameter can be NULL. - MH_STATUS WINAPI MH_CreateHookApiEx( - LPCWSTR pszModule, LPCSTR pszProcName, LPVOID pDetour, LPVOID *ppOriginal, LPVOID *ppTarget); - - // Removes an already created hook. - // Parameters: - // pTarget [in] A pointer to the target function. - MH_STATUS WINAPI MH_RemoveHook(LPVOID pTarget); - - // Enables an already created hook. - // Parameters: - // pTarget [in] A pointer to the target function. - // If this parameter is MH_ALL_HOOKS, all created hooks are - // enabled in one go. - MH_STATUS WINAPI MH_EnableHook(LPVOID pTarget); - - // Disables an already created hook. - // Parameters: - // pTarget [in] A pointer to the target function. - // If this parameter is MH_ALL_HOOKS, all created hooks are - // disabled in one go. - MH_STATUS WINAPI MH_DisableHook(LPVOID pTarget); - - // Queues to enable an already created hook. - // Parameters: - // pTarget [in] A pointer to the target function. - // If this parameter is MH_ALL_HOOKS, all created hooks are - // queued to be enabled. - MH_STATUS WINAPI MH_QueueEnableHook(LPVOID pTarget); - - // Queues to disable an already created hook. - // Parameters: - // pTarget [in] A pointer to the target function. - // If this parameter is MH_ALL_HOOKS, all created hooks are - // queued to be disabled. - MH_STATUS WINAPI MH_QueueDisableHook(LPVOID pTarget); - - // Applies all queued changes in one go. - MH_STATUS WINAPI MH_ApplyQueued(VOID); - - // Translates the MH_STATUS to its name as a string. - const char * WINAPI MH_StatusToString(MH_STATUS status); - -#ifdef __cplusplus -} -#endif - diff --git a/GameInjector/MinHook.x64.dll b/GameInjector/MinHook.x64.dll deleted file mode 100644 index b4f51c2e..00000000 Binary files a/GameInjector/MinHook.x64.dll and /dev/null differ diff --git a/GameInjector/MinHook.x64.lib b/GameInjector/MinHook.x64.lib deleted file mode 100644 index 909fe682..00000000 Binary files a/GameInjector/MinHook.x64.lib and /dev/null differ diff --git a/GameInjector/MinHook.x86.dll b/GameInjector/MinHook.x86.dll deleted file mode 100644 index d6167c83..00000000 Binary files a/GameInjector/MinHook.x86.dll and /dev/null differ diff --git a/GameInjector/MinHook.x86.lib b/GameInjector/MinHook.x86.lib deleted file mode 100644 index 02f351c2..00000000 Binary files a/GameInjector/MinHook.x86.lib and /dev/null differ diff --git a/GameInjector/dllmain.cpp b/GameInjector/dllmain.cpp deleted file mode 100644 index a6c4e8b7..00000000 --- a/GameInjector/dllmain.cpp +++ /dev/null @@ -1,194 +0,0 @@ -// dllmain.cpp : Defines the entry point for the DLL application. - -#include "pch.h" -#include "MinHook.h" -#include -#include -#include -#include -#include -#include - -#define DLL_NAME L"Northstar.dll" - -class TempReadWrite -{ -private: - DWORD m_origProtection; - void* m_ptr; - -public: - TempReadWrite(void* ptr) - { - m_ptr = ptr; - MEMORY_BASIC_INFORMATION mbi; - VirtualQuery(m_ptr, &mbi, sizeof(mbi)); - VirtualProtect(mbi.BaseAddress, mbi.RegionSize, PAGE_EXECUTE_READWRITE, &mbi.Protect); - m_origProtection = mbi.Protect; - } - - ~TempReadWrite() - { - MEMORY_BASIC_INFORMATION mbi; - VirtualQuery(m_ptr, &mbi, sizeof(mbi)); - VirtualProtect(mbi.BaseAddress, mbi.RegionSize, m_origProtection, &mbi.Protect); - } -}; - -typedef BOOL(WINAPI *CreateProcessWType)( - LPCWSTR lpApplicationName, - LPWSTR lpCommandLine, - LPSECURITY_ATTRIBUTES lpProcessAttributes, - LPSECURITY_ATTRIBUTES lpThreadAttributes, - BOOL bInheritHandles, - DWORD dwCreationFlags, - LPVOID lpEnvironment, - LPCWSTR lpCurrentDirectory, - LPSTARTUPINFOW lpStartupInfo, - LPPROCESS_INFORMATION lpProcessInformation -); -CreateProcessWType CreateProcessWOriginal; - -HMODULE ownHModule; -std::filesystem::path tf2DirPath; - -BOOL WINAPI CreateProcessWHook( - LPCWSTR lpApplicationName, - LPWSTR lpCommandLine, - LPSECURITY_ATTRIBUTES lpProcessAttributes, - LPSECURITY_ATTRIBUTES lpThreadAttributes, - BOOL bInheritHandles, - DWORD dwCreationFlags, - LPVOID lpEnvironment, - LPCWSTR lpCurrentDirectory, - LPSTARTUPINFOW lpStartupInfo, - LPPROCESS_INFORMATION lpProcessInformation -) -{ - bool isTitanfallProcess = false; - - // origin doesn't use lpApplicationName - std::wcout << lpCommandLine << std::endl; - isTitanfallProcess = wcsstr(lpCommandLine, L"Titanfall2\\Titanfall2.exe"); - - // steam will start processes suspended (since we don't actually inject into steam directly this isn't required anymore, but whatever) - bool alreadySuspended = dwCreationFlags & CREATE_SUSPENDED; - - // suspend process on creation so we can hook - if (isTitanfallProcess && !alreadySuspended) - dwCreationFlags |= CREATE_SUSPENDED; - - BOOL ret = CreateProcessWOriginal(lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes, bInheritHandles, dwCreationFlags, lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation); - - if (isTitanfallProcess) - { - std::cout << "Creating titanfall process!" << std::endl; - std::cout << "Handle: " << lpProcessInformation->hProcess << " ID: " << lpProcessInformation->dwProcessId << " Thread: " << lpProcessInformation->hThread << std::endl; - - //while (!IsDebuggerPresent()) Sleep(100); - STARTUPINFO si; - memset(&si, 0, sizeof(si)); - PROCESS_INFORMATION pi; - memset(&pi, 0, sizeof(pi)); - - // check if we're launching EASteamProxy for steam users, or just launching tf2 directly for origin users - // note: atm we fully disable steam integration in origin when we inject, return to this later - if (!wcsstr(lpCommandLine, L"Origin\\EASteamProxy.exe")) - { - std::stringstream argStr; - argStr << lpProcessInformation->dwProcessId; - argStr << " "; - argStr << lpProcessInformation->dwThreadId; - - CreateProcessA((tf2DirPath / "InjectionProxy64.exe").string().c_str(), (LPSTR)(argStr.str().c_str()), 0, 0, false, 0, 0, tf2DirPath.string().c_str(), (LPSTARTUPINFOA)&si, &pi); - WaitForSingleObject(pi.hThread, INFINITE); - } - else - { - // for easteamproxy, we have to inject ourself into it - // todo: atm we fully disable steam integration in origin when we inject, do this properly later - } - - // this doesn't seem to work super well - //if (!alreadySuspended) - ResumeThread(lpProcessInformation->hThread); - - // cleanup - // note: i phyisically cannot get cleanup to work rn, not sure why - MH_DisableHook(&CreateProcessW); - MH_RemoveHook(&CreateProcessW); - MH_Uninitialize(); - - // allow steam integrations to work again - void* ptr = (char*)GetModuleHandleA("OriginClient.dll") + 0x2A83FA; - TempReadWrite rw(ptr); - - *((char*)ptr) = 0x0F; // jmp => je - *((char*)ptr + 1) = 0x84; - *((char*)ptr + 2) = 0xE5; - *((char*)ptr + 3) = 0x01; - *((char*)ptr + 4) = 0x00; - *((char*)ptr + 5) = 0x00; - - // is this undefined behaviour? idk - FreeLibrary(ownHModule); - } - - return ret; -} - -BOOL APIENTRY DllMain(HMODULE hModule, - DWORD ul_reason_for_call, - LPVOID lpReserved - ) -{ - - switch (ul_reason_for_call) - { - case DLL_PROCESS_ATTACH: - case DLL_THREAD_ATTACH: - // DisableThreadLibraryCalls(hModule); // wanted this, but unfortunately tf2 hates me - case DLL_THREAD_DETACH: - case DLL_PROCESS_DETACH: - break; - } - - ownHModule = hModule; - char ownDllPath[MAX_PATH]; - GetModuleFileNameA(hModule, ownDllPath, MAX_PATH); - - tf2DirPath = std::filesystem::path(ownDllPath).parent_path(); - - // hook CreateProcessW - if (MH_Initialize() != MH_OK) - return TRUE; - - MH_CreateHook(&CreateProcessW, &CreateProcessWHook, reinterpret_cast(&CreateProcessWOriginal)); - MH_EnableHook(&CreateProcessW); - - char ownProcessPath[MAX_PATH]; - GetModuleFileNameA(NULL, ownProcessPath, MAX_PATH); - // TEMP: temporarily disable steam stuff because it's a huge pain - // change conditional jump to EASteamProxy stuff in launchStep2 to never hit EASteamProxy launch - - if (!strcmp(ownProcessPath, "Origin.exe")) - { - void* ptr = (char*)LoadLibraryA("OriginClient.dll") + 0x2A83FA; - TempReadWrite rw(ptr); - - *((char*)ptr) = 0xE9; // je => jmp - *((char*)ptr + 1) = 0xE6; - *((char*)ptr + 2) = 0x01; - *((char*)ptr + 3) = 0x00; - *((char*)ptr + 4) = 0x00; - } - else if (!strcmp(ownProcessPath, "EADesktop.exe")) - { - // idk not doing this rn - MessageBoxA(NULL, "EADesktop not currently supported", "", MB_OK); - } - - - return TRUE; -} - diff --git a/GameInjector/framework.h b/GameInjector/framework.h deleted file mode 100644 index 54b83e94..00000000 --- a/GameInjector/framework.h +++ /dev/null @@ -1,5 +0,0 @@ -#pragma once - -#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers -// Windows Header Files -#include diff --git a/GameInjector/pch.cpp b/GameInjector/pch.cpp deleted file mode 100644 index 64b7eef6..00000000 --- a/GameInjector/pch.cpp +++ /dev/null @@ -1,5 +0,0 @@ -// pch.cpp: source file corresponding to the pre-compiled header - -#include "pch.h" - -// When you are using pre-compiled headers, this source file is necessary for compilation to succeed. diff --git a/GameInjector/pch.h b/GameInjector/pch.h deleted file mode 100644 index 1fd0adab..00000000 --- a/GameInjector/pch.h +++ /dev/null @@ -1,15 +0,0 @@ -// pch.h: This is a precompiled header file. -// Files listed below are compiled only once, improving build performance for future builds. -// This also affects IntelliSense performance, including code completion and many code browsing features. -// However, files listed here are ALL re-compiled if any one of them is updated between builds. -// Do not add files here that you will be updating frequently as this negates the performance advantage. - -#ifndef PCH_H -#define PCH_H - -#define _CRT_SECURE_NO_WARNINGS - -// add headers that you want to pre-compile here -#include "framework.h" - -#endif //PCH_H diff --git a/InjectionProxy64/InjectionProxy64.vcxproj b/InjectionProxy64/InjectionProxy64.vcxproj deleted file mode 100644 index 39e7df5a..00000000 --- a/InjectionProxy64/InjectionProxy64.vcxproj +++ /dev/null @@ -1,147 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - 16.0 - Win32Proj - {a8ce6730-a6c7-441d-8c65-8a39ee5a01a2} - InjectionProxy64 - 10.0 - - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - - - - - - - - - - - - - - - - - - - true - - - false - - - true - - - false - - - - Level3 - true - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - - - Console - true - - - - - Level3 - true - true - true - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - - - Console - true - true - true - - - - - Level3 - true - _DEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - - - Console - true - - - - - Level3 - true - true - true - NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - - - Console - true - true - true - - - - - - - - - \ No newline at end of file diff --git a/InjectionProxy64/InjectionProxy64.vcxproj.filters b/InjectionProxy64/InjectionProxy64.vcxproj.filters deleted file mode 100644 index ce0c35cc..00000000 --- a/InjectionProxy64/InjectionProxy64.vcxproj.filters +++ /dev/null @@ -1,22 +0,0 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - - - Source Files - - - \ No newline at end of file diff --git a/InjectionProxy64/main.cpp b/InjectionProxy64/main.cpp deleted file mode 100644 index f338f910..00000000 --- a/InjectionProxy64/main.cpp +++ /dev/null @@ -1,40 +0,0 @@ -#include -#include - -#define DLL_NAME L"Northstar.dll" - -int main(int argc, char** argv) -{ - // this a proxy process used for injecting into titanfall, since launchers are 32bit you can't inject from those into 64bit titanfall - // dont bother to do any error checking here, just assume it's getting called right - DWORD pid = std::stoi(argv[0]); - DWORD threadId = std::stoi(argv[1]); - - HANDLE process = OpenProcess(PROCESS_ALL_ACCESS, false, pid); - HANDLE thread = OpenThread(THREAD_ALL_ACCESS, false, threadId); - - HMODULE hKernel32 = GetModuleHandleW(L"kernel32.dll"); - LPTHREAD_START_ROUTINE pLoadLibraryW = (LPTHREAD_START_ROUTINE)GetProcAddress(hKernel32, "LoadLibraryW"); - - SIZE_T dwLength = (wcslen(DLL_NAME) + 1) * 2; - LPVOID lpLibName = VirtualAllocEx(process, NULL, dwLength, MEM_COMMIT, PAGE_READWRITE); - - SIZE_T written = 0; - WriteProcessMemory(process, lpLibName, DLL_NAME, dwLength, &written); - - HANDLE hThread = CreateRemoteThread(process, NULL, NULL, pLoadLibraryW, lpLibName, NULL, NULL); - - WaitForSingleObject(hThread, INFINITE); - - // TODO: need to call initialisenorthstar in the new process - // (this does not currently work!!! ) - //LPTHREAD_START_ROUTINE pInitNorthstar = (LPTHREAD_START_ROUTINE)GetProcAddress((HMODULE)lpLibName, "InitialiseNorthstar"); - //HANDLE hInitThread = CreateRemoteThread(processInfo.hProcess, NULL, NULL, pInitNorthstar, NULL, NULL, NULL); - //WaitForSingleObject(hInitThread, INFINITE); - //CloseHandle(hInitThread); - - ResumeThread(thread); - CloseHandle(hThread); - - VirtualFreeEx(process, lpLibName, dwLength, MEM_RELEASE); -} \ No newline at end of file diff --git a/InjectorTest/InjectorTest.vcxproj b/InjectorTest/InjectorTest.vcxproj deleted file mode 100644 index f2e52e25..00000000 --- a/InjectorTest/InjectorTest.vcxproj +++ /dev/null @@ -1,147 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - 16.0 - Win32Proj - {3c3fc37c-d4b9-4413-aadf-c52fd2f428e6} - InjectorTest - 10.0 - - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - - - - - - - - - - - - - - - - - - - true - - - false - - - true - - - false - - - - Level3 - true - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - - - Console - true - - - - - Level3 - true - true - true - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - - - Console - true - true - true - - - - - Level3 - true - _DEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - - - Console - true - - - - - Level3 - true - true - true - NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - - - Console - true - true - true - - - - - - - - - \ No newline at end of file diff --git a/InjectorTest/InjectorTest.vcxproj.filters b/InjectorTest/InjectorTest.vcxproj.filters deleted file mode 100644 index ce0c35cc..00000000 --- a/InjectorTest/InjectorTest.vcxproj.filters +++ /dev/null @@ -1,22 +0,0 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - - - Source Files - - - \ No newline at end of file diff --git a/InjectorTest/main.cpp b/InjectorTest/main.cpp deleted file mode 100644 index 09a92314..00000000 --- a/InjectorTest/main.cpp +++ /dev/null @@ -1,68 +0,0 @@ -#include - -#define PROC_NAME L"Titanfall2-unpacked.exe" -#define DLL_NAME L"Northstar.dll" - -int main() { - STARTUPINFO startupInfo; - PROCESS_INFORMATION processInfo; - - memset(&startupInfo, 0, sizeof(startupInfo)); - memset(&processInfo, 0, sizeof(processInfo)); - - CreateProcessW(PROC_NAME, (LPWSTR)L"-multiple -novid", NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &startupInfo, &processInfo); - - HMODULE hKernel32 = GetModuleHandleW(L"kernel32.dll"); - LPTHREAD_START_ROUTINE pLoadLibraryW = - (LPTHREAD_START_ROUTINE)GetProcAddress(hKernel32, "LoadLibraryW"); - - SIZE_T dwLength = (wcslen(DLL_NAME) + 1) * 2; - LPVOID lpLibName = VirtualAllocEx(processInfo.hProcess, NULL, dwLength, MEM_COMMIT, PAGE_READWRITE); - - SIZE_T written = 0; - WriteProcessMemory(processInfo.hProcess, lpLibName, DLL_NAME, dwLength, &written); - - HANDLE hThread = CreateRemoteThread(processInfo.hProcess, NULL, NULL, pLoadLibraryW, lpLibName, NULL, NULL); - WaitForSingleObject(hThread, INFINITE); - CloseHandle(hThread); - - // TODO: need to call initialisenorthstar in the new process - // also rewrite injector to be clean lol - // (this does not currently work!!! ) - //LPTHREAD_START_ROUTINE pInitNorthstar = (LPTHREAD_START_ROUTINE)GetProcAddress((HMODULE)lpLibName, "InitialiseNorthstar"); - //HANDLE hInitThread = CreateRemoteThread(processInfo.hProcess, NULL, NULL, pInitNorthstar, NULL, NULL, NULL); - //WaitForSingleObject(hInitThread, INFINITE); - //CloseHandle(hInitThread); - - ResumeThread(processInfo.hThread); - - VirtualFreeEx(processInfo.hProcess, lpLibName, dwLength, MEM_RELEASE); - - CloseHandle(processInfo.hProcess); - CloseHandle(processInfo.hThread); - - return 0; -} - -/* -#define DEFAULT_PROCESS_NAME = L"Titanfall2.exe" - -int main(int argc, char** argv) -{ - STARTUPINFO startupInfo; - PROCESS_INFORMATION processInfo; - - memset(&startupInfo, 0, sizeof(startupInfo)); - memset(&processInfo, 0, sizeof(processInfo)); - - LPCWSTR processName; - if (argc > 0) - { - processName = *argv; - } - else - processName = DEFAULT_PROCESS_NAME; - - CreateProcessW() -} -*/ \ No newline at end of file diff --git a/LauncherInjector/LauncherInjector.vcxproj b/LauncherInjector/LauncherInjector.vcxproj index 620303b1..07d45e75 100644 --- a/LauncherInjector/LauncherInjector.vcxproj +++ b/LauncherInjector/LauncherInjector.vcxproj @@ -24,6 +24,7 @@ {0ea82cb0-53fe-4d4c-96df-47fa970513d0} LauncherInjector 10.0 + NorthstarLauncher @@ -147,6 +148,15 @@ + + + + + + + + + diff --git a/LauncherInjector/LauncherInjector.vcxproj.filters b/LauncherInjector/LauncherInjector.vcxproj.filters index ce0c35cc..87e25fa8 100644 --- a/LauncherInjector/LauncherInjector.vcxproj.filters +++ b/LauncherInjector/LauncherInjector.vcxproj.filters @@ -19,4 +19,19 @@ Source Files + + + Header Files + + + + + Resource Files + + + + + Resource Files + + \ No newline at end of file diff --git a/LauncherInjector/main.cpp b/LauncherInjector/main.cpp index 86c50804..c335390b 100644 --- a/LauncherInjector/main.cpp +++ b/LauncherInjector/main.cpp @@ -8,155 +8,103 @@ namespace fs = std::filesystem; DWORD GetProcessByName(std::wstring processName) { - HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); - - PROCESSENTRY32 processSnapshotEntry = { 0 }; - processSnapshotEntry.dwSize = sizeof(PROCESSENTRY32); - - if (snapshot == INVALID_HANDLE_VALUE) - return 0; - - if (!Process32First(snapshot, &processSnapshotEntry)) - return 0; - - while (Process32Next(snapshot, &processSnapshotEntry)) - { - if (!wcscmp(processSnapshotEntry.szExeFile, processName.c_str())) - { - CloseHandle(snapshot); - return processSnapshotEntry.th32ProcessID; - } - } - - CloseHandle(snapshot); - return 0; -} - -void InjectInjectorIntoProcess(DWORD pid) -{ - HANDLE procHandle = OpenProcess(PROCESS_ALL_ACCESS, false, pid); - - std::wstring path = (fs::current_path() / "GameInjector.dll").wstring(); - size_t length = (path.length() + 1) * 2; - LPVOID lpLibName = VirtualAllocEx(procHandle, NULL, length, MEM_COMMIT, PAGE_EXECUTE_READWRITE); - WriteProcessMemory(procHandle, lpLibName, path.c_str(), length, 0); - - // load minhook, since origin's loadlibrary won't load it from the tf directly by default - std::wstring minhookPath = (fs::current_path() / "MinHook.x86.dll").wstring(); - size_t minhookLength = (minhookPath.length() + 1) * 2; - LPVOID lpMinhookLibName = VirtualAllocEx(procHandle, NULL, minhookLength, MEM_COMMIT, PAGE_EXECUTE_READWRITE); - WriteProcessMemory(procHandle, lpMinhookLibName, minhookPath.c_str(), minhookLength, 0); + HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); - HMODULE hKernel32 = GetModuleHandleW(L"kernel32.dll"); - LPTHREAD_START_ROUTINE pLoadLibraryW = (LPTHREAD_START_ROUTINE)GetProcAddress(hKernel32, "LoadLibraryW"); - HANDLE thread = CreateRemoteThread(procHandle, NULL, 0, pLoadLibraryW, lpMinhookLibName, 0, 0); - WaitForSingleObject(thread, INFINITE); + PROCESSENTRY32 processSnapshotEntry = { 0 }; + processSnapshotEntry.dwSize = sizeof(PROCESSENTRY32); - thread = CreateRemoteThread(procHandle, NULL, 0, pLoadLibraryW, lpLibName, 0, 0); - WaitForSingleObject(thread, INFINITE); + if (snapshot == INVALID_HANDLE_VALUE) + return 0; - DWORD dwExitCode; - GetExitCodeThread(thread, &dwExitCode); - std::cout << dwExitCode << std::endl; + if (!Process32First(snapshot, &processSnapshotEntry)) + return 0; - CloseHandle(procHandle); + while (Process32Next(snapshot, &processSnapshotEntry)) + { + if (!wcscmp(processSnapshotEntry.szExeFile, processName.c_str())) + { + CloseHandle(snapshot); + return processSnapshotEntry.th32ProcessID; + } + } - std::cout << pid << std::endl; + CloseHandle(snapshot); + return 0; } -void CreateAndHookUnpackedTitanfallProcess() -{ - PROCESS_INFORMATION tfPi; - memset(&tfPi, 0, sizeof(tfPi)); - STARTUPINFO si; - memset(&si, 0, sizeof(si)); - CreateProcessA("Titanfall2-unpacked.exe", (LPSTR)"", NULL, NULL, false, CREATE_SUSPENDED, NULL, NULL, (LPSTARTUPINFOA)&si, &tfPi); - - PROCESS_INFORMATION pi; - memset(&pi, 0, sizeof(pi)); - memset(&si, 0, sizeof(si)); - - std::stringstream argStream; - argStream << tfPi.dwProcessId; - argStream << " "; - argStream << tfPi.dwThreadId; - - CreateProcessA("InjectionProxy64.exe", (LPSTR)(argStream.str().c_str()), NULL, NULL, false, 0, NULL, NULL, (LPSTARTUPINFOA)&si, &pi); - WaitForSingleObject(pi.hThread, INFINITE); - - CloseHandle(pi.hThread); - CloseHandle(tfPi.hThread); -} - -int main() -{ - //AllocConsole(); - - // check if we're in the titanfall directory - if (!fs::exists("Titanfall2.exe") && !fs::exists("Titanfall2-unpacked.exe")) - { - MessageBox(NULL, L"Titanfall2.exe not found! Please launch from your titanfall 2 directory!", L"", MB_OK); - return 1; - } - - // check for steam dll and unpacked exe - bool unpacked = fs::exists("Titanfall2-unpacked.exe"); - //bool steamBuild = !unpacked && fs::exists("steam_api64.dll"); // dont actually need to check for this - - // unpacked origin - if (unpacked) - { - // check origin process - DWORD origin = GetProcessByName(L"Origin.exe"); - - if (!origin) - { - // unpacked exe will crash if origin isn't open on launch, so launch it - // get origin path from registry, code here is reversed from OriginSDK.dll - HKEY key; - if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\WOW6432Node\\Origin", 0, KEY_READ, &key) != ERROR_SUCCESS) - return 1; - - char originPath[520]; - DWORD originPathLength = 520; - if (RegQueryValueExA(key, "ClientPath", 0, 0, (LPBYTE)&originPath, &originPathLength) != ERROR_SUCCESS) - return 1; - - PROCESS_INFORMATION pi; - memset(&pi, 0, sizeof(pi)); - STARTUPINFO si; - memset(&si, 0, sizeof(si)); - CreateProcessA(originPath, (LPSTR)"", NULL, NULL, false, CREATE_DEFAULT_ERROR_MODE | CREATE_NEW_PROCESS_GROUP, NULL, NULL, (LPSTARTUPINFOA)&si, &pi); - - // bit of a hack, but wait 12.5s to give origin a sec to init - // would be nice if we could do this dynamically, but idk how rn - Sleep(12500); - } - - CreateAndHookUnpackedTitanfallProcess(); - } - // packed - else - { - // create a titanfall process, this will cause origin to start launching the game - // if we're on steam, origin will launch the steam release here, too - // we can't hook the titanfall process here unfortunately, since the titanfall process we create here dies when origin stuff starts - - PROCESS_INFORMATION pi; - memset(&pi, 0, sizeof(pi)); - STARTUPINFO si; - memset(&si, 0, sizeof(si)); - CreateProcessA("Titanfall2.exe", (LPSTR)"", NULL, NULL, false, 0, NULL, NULL, (LPSTARTUPINFOA)&si, &pi); - - // hook launcher - DWORD launcherPID; - // dont actually need to check for steam, origin launches game no matter what - //if (steamBuild) - // while (!(launcherPID = GetProcessByName(L"EASteamProxy.exe"))) Sleep(50); - //else - while (!(launcherPID = GetProcessByName(L"Origin.exe"))) Sleep(50); - - // injector should clean itself up after its job is done - InjectInjectorIntoProcess(launcherPID); - } +#define PROCESS_NAME L"Titanfall2-unpacked.exe" +#define DLL_NAME L"Northstar.dll" + +int main() { + if (!fs::exists(PROCESS_NAME)) + { + MessageBoxA(0, "Titanfall2-unpacked.exe not found! Please launch from your titanfall 2 directory and ensure you have Northstar installed correctly!", "", MB_OK); + return 1; + } + + if (!fs::exists(DLL_NAME)) + { + MessageBoxA(0, "Northstar.dll not found! Please launch from your titanfall 2 directory and ensure you have Northstar installed correctly!", "", MB_OK); + return 1; + } + + if (!GetProcessByName(L"Origin.exe")) + { + // unpacked exe will crash if origin isn't open on launch, so launch it + // get origin path from registry, code here is reversed from OriginSDK.dll + HKEY key; + if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\WOW6432Node\\Origin", 0, KEY_READ, &key) != ERROR_SUCCESS) + { + MessageBoxA(0, "Error: failed reading origin path!", "", MB_OK); + return 1; + } + + char originPath[520]; + DWORD originPathLength = 520; + if (RegQueryValueExA(key, "ClientPath", 0, 0, (LPBYTE)&originPath, &originPathLength) != ERROR_SUCCESS) + { + MessageBoxA(0, "Error: failed reading origin path!", "", MB_OK); + return 1; + } + + PROCESS_INFORMATION pi; + memset(&pi, 0, sizeof(pi)); + STARTUPINFO si; + memset(&si, 0, sizeof(si)); + CreateProcessA(originPath, (LPSTR)"", NULL, NULL, false, CREATE_DEFAULT_ERROR_MODE | CREATE_NEW_PROCESS_GROUP, NULL, NULL, (LPSTARTUPINFOA)&si, &pi); + + // wait for origin to be ready, this process is created when origin is ready enough to launch game without any errors + while (!GetProcessByName(L"OriginClientService.exe")) + Sleep(200); + } + + STARTUPINFO startupInfo; + PROCESS_INFORMATION processInfo; + + memset(&startupInfo, 0, sizeof(startupInfo)); + memset(&processInfo, 0, sizeof(processInfo)); + + CreateProcessW(PROCESS_NAME, (LPWSTR)L"-multiple -novid", NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &startupInfo, &processInfo); + + HMODULE hKernel32 = GetModuleHandleW(L"kernel32.dll"); + LPTHREAD_START_ROUTINE pLoadLibraryW = (LPTHREAD_START_ROUTINE)GetProcAddress(hKernel32, "LoadLibraryW"); + + SIZE_T dwLength = (wcslen(DLL_NAME) + 1) * 2; + LPVOID lpLibName = VirtualAllocEx(processInfo.hProcess, NULL, dwLength, MEM_COMMIT, PAGE_READWRITE); + + SIZE_T written = 0; + WriteProcessMemory(processInfo.hProcess, lpLibName, DLL_NAME, dwLength, &written); + + HANDLE hThread = CreateRemoteThread(processInfo.hProcess, NULL, NULL, pLoadLibraryW, lpLibName, NULL, NULL); + WaitForSingleObject(hThread, INFINITE); + CloseHandle(hThread); + + ResumeThread(processInfo.hThread); + + VirtualFreeEx(processInfo.hProcess, lpLibName, dwLength, MEM_RELEASE); + + CloseHandle(processInfo.hProcess); + CloseHandle(processInfo.hThread); + + return 0; } \ No newline at end of file diff --git a/LauncherInjector/ns_icon.ico b/LauncherInjector/ns_icon.ico new file mode 100644 index 00000000..eb78efef Binary files /dev/null and b/LauncherInjector/ns_icon.ico differ diff --git a/LauncherInjector/resource1.h b/LauncherInjector/resource1.h new file mode 100644 index 00000000..60157c4b --- /dev/null +++ b/LauncherInjector/resource1.h @@ -0,0 +1,16 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by resources.rc +// +#define IDI_ICON1 101 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 102 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/LauncherInjector/resources.rc b/LauncherInjector/resources.rc new file mode 100644 index 00000000..a51894c4 --- /dev/null +++ b/LauncherInjector/resources.rc @@ -0,0 +1,71 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource1.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (United Kingdom) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENG) +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_UK +#pragma code_page(1252) + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource1.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_ICON1 ICON "ns_icon.ico" + +#endif // English (United Kingdom) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/R2Northstar.sln b/R2Northstar.sln index b613b518..9c13592d 100644 --- a/R2Northstar.sln +++ b/R2Northstar.sln @@ -5,15 +5,7 @@ VisualStudioVersion = 16.0.30621.155 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Northstar", "NorthstarDedicatedTest\NorthstarDedicatedTest.vcxproj", "{CFAD2623-064F-453C-8196-79EE10292E32}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "InjectorTest", "InjectorTest\InjectorTest.vcxproj", "{3C3FC37C-D4B9-4413-AADF-C52FD2F428E6}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Injector", "Injector", "{DEFD24BD-9918-4DC1-BAD5-3F3A49E467E9}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "LauncherInjector", "LauncherInjector\LauncherInjector.vcxproj", "{0EA82CB0-53FE-4D4C-96DF-47FA970513D0}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "GameInjector", "GameInjector\GameInjector.vcxproj", "{B3554508-967E-49D2-BF87-586DD95D817C}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "InjectionProxy64", "InjectionProxy64\InjectionProxy64.vcxproj", "{A8CE6730-A6C7-441D-8C65-8A39EE5A01A2}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "NorthstarLauncher", "LauncherInjector\LauncherInjector.vcxproj", "{0EA82CB0-53FE-4D4C-96DF-47FA970513D0}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -30,47 +22,18 @@ Global {CFAD2623-064F-453C-8196-79EE10292E32}.Release|x64.Build.0 = Release|x64 {CFAD2623-064F-453C-8196-79EE10292E32}.Release|x86.ActiveCfg = Release|Win32 {CFAD2623-064F-453C-8196-79EE10292E32}.Release|x86.Build.0 = Release|Win32 - {3C3FC37C-D4B9-4413-AADF-C52FD2F428E6}.Debug|x64.ActiveCfg = Debug|x64 - {3C3FC37C-D4B9-4413-AADF-C52FD2F428E6}.Debug|x64.Build.0 = Debug|x64 - {3C3FC37C-D4B9-4413-AADF-C52FD2F428E6}.Debug|x86.ActiveCfg = Debug|Win32 - {3C3FC37C-D4B9-4413-AADF-C52FD2F428E6}.Debug|x86.Build.0 = Debug|Win32 - {3C3FC37C-D4B9-4413-AADF-C52FD2F428E6}.Release|x64.ActiveCfg = Release|x64 - {3C3FC37C-D4B9-4413-AADF-C52FD2F428E6}.Release|x86.ActiveCfg = Release|Win32 - {3C3FC37C-D4B9-4413-AADF-C52FD2F428E6}.Release|x86.Build.0 = Release|Win32 - {0EA82CB0-53FE-4D4C-96DF-47FA970513D0}.Debug|x64.ActiveCfg = Debug|Win32 - {0EA82CB0-53FE-4D4C-96DF-47FA970513D0}.Debug|x64.Build.0 = Debug|Win32 + {0EA82CB0-53FE-4D4C-96DF-47FA970513D0}.Debug|x64.ActiveCfg = Debug|x64 + {0EA82CB0-53FE-4D4C-96DF-47FA970513D0}.Debug|x64.Build.0 = Debug|x64 {0EA82CB0-53FE-4D4C-96DF-47FA970513D0}.Debug|x86.ActiveCfg = Debug|Win32 {0EA82CB0-53FE-4D4C-96DF-47FA970513D0}.Debug|x86.Build.0 = Debug|Win32 {0EA82CB0-53FE-4D4C-96DF-47FA970513D0}.Release|x64.ActiveCfg = Release|Win32 {0EA82CB0-53FE-4D4C-96DF-47FA970513D0}.Release|x64.Build.0 = Release|Win32 {0EA82CB0-53FE-4D4C-96DF-47FA970513D0}.Release|x86.ActiveCfg = Release|Win32 {0EA82CB0-53FE-4D4C-96DF-47FA970513D0}.Release|x86.Build.0 = Release|Win32 - {B3554508-967E-49D2-BF87-586DD95D817C}.Debug|x64.ActiveCfg = Debug|Win32 - {B3554508-967E-49D2-BF87-586DD95D817C}.Debug|x64.Build.0 = Debug|Win32 - {B3554508-967E-49D2-BF87-586DD95D817C}.Debug|x86.ActiveCfg = Debug|Win32 - {B3554508-967E-49D2-BF87-586DD95D817C}.Debug|x86.Build.0 = Debug|Win32 - {B3554508-967E-49D2-BF87-586DD95D817C}.Release|x64.ActiveCfg = Release|Win32 - {B3554508-967E-49D2-BF87-586DD95D817C}.Release|x64.Build.0 = Release|Win32 - {B3554508-967E-49D2-BF87-586DD95D817C}.Release|x86.ActiveCfg = Release|Win32 - {B3554508-967E-49D2-BF87-586DD95D817C}.Release|x86.Build.0 = Release|Win32 - {A8CE6730-A6C7-441D-8C65-8A39EE5A01A2}.Debug|x64.ActiveCfg = Debug|x64 - {A8CE6730-A6C7-441D-8C65-8A39EE5A01A2}.Debug|x64.Build.0 = Debug|x64 - {A8CE6730-A6C7-441D-8C65-8A39EE5A01A2}.Debug|x86.ActiveCfg = Debug|Win32 - {A8CE6730-A6C7-441D-8C65-8A39EE5A01A2}.Debug|x86.Build.0 = Debug|Win32 - {A8CE6730-A6C7-441D-8C65-8A39EE5A01A2}.Release|x64.ActiveCfg = Release|x64 - {A8CE6730-A6C7-441D-8C65-8A39EE5A01A2}.Release|x64.Build.0 = Release|x64 - {A8CE6730-A6C7-441D-8C65-8A39EE5A01A2}.Release|x86.ActiveCfg = Release|Win32 - {A8CE6730-A6C7-441D-8C65-8A39EE5A01A2}.Release|x86.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {3C3FC37C-D4B9-4413-AADF-C52FD2F428E6} = {DEFD24BD-9918-4DC1-BAD5-3F3A49E467E9} - {0EA82CB0-53FE-4D4C-96DF-47FA970513D0} = {DEFD24BD-9918-4DC1-BAD5-3F3A49E467E9} - {B3554508-967E-49D2-BF87-586DD95D817C} = {DEFD24BD-9918-4DC1-BAD5-3F3A49E467E9} - {A8CE6730-A6C7-441D-8C65-8A39EE5A01A2} = {DEFD24BD-9918-4DC1-BAD5-3F3A49E467E9} - EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {E617E95C-9157-454C-84C5-8EEC2B5D1032} EndGlobalSection -- cgit v1.2.3