#pragma once
|
|
|
|
#pragma warning( disable : 4267 )
|
|
|
|
#include <Windows.h>
|
|
#include <shellapi.h>
|
|
#include "winapi_util.h"
|
|
#include "assert_util.h"
|
|
#include "crt.h"
|
|
|
|
#define CONFIG_NAME L"doorstop_config"
|
|
#define DEFAULT_TARGET_ASSEMBLY L"Doorstop.dll"
|
|
#define EXE_EXTENSION_LENGTH 4
|
|
|
|
BOOL enabled = FALSE;
|
|
BOOL debug = FALSE;
|
|
BOOL debug_server = FALSE;
|
|
BOOL debug_info = FALSE;
|
|
wchar_t *targetAssembly = NULL;
|
|
|
|
#define STR_EQUAL(str1, str2) (lstrcmpiW(str1, str2) == 0)
|
|
|
|
inline void initConfigFile()
|
|
{
|
|
enabled = TRUE;
|
|
|
|
WIN32_FIND_DATAW findData;
|
|
HANDLE findHandle = FindFirstFileW(L"*_Data", &findData);
|
|
if (findHandle == INVALID_HANDLE_VALUE)
|
|
{
|
|
MessageBoxW(NULL, L"Could not locate game being injected!", L"No files found in current directory matching '*_Data'",
|
|
MB_OK | MB_ICONERROR | MB_SYSTEMMODAL | MB_TOPMOST | MB_SETFOREGROUND);
|
|
|
|
ExitProcess(GetLastError());
|
|
}
|
|
|
|
do
|
|
{
|
|
if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
|
|
{ // must be a directory
|
|
wchar_t* target = memalloc(MAX_PATH * sizeof(wchar_t));
|
|
|
|
const int EXIT_FAILURE = 1;
|
|
ASSERT(target != NULL, L"Address returned by memalloc was NULL!");
|
|
|
|
wmemset(target, 0, MAX_PATH);
|
|
|
|
wmemcpy(target, findData.cFileName, wcslen(findData.cFileName));
|
|
wmemcpy(target + wcslen(target), L"/Managed/IPA.Injector.dll", 26);
|
|
|
|
targetAssembly = target;
|
|
FindClose(findHandle);
|
|
break;
|
|
}
|
|
}
|
|
while (FindNextFileW(findHandle, &findData) != 0);
|
|
|
|
if (targetAssembly == NULL)
|
|
{
|
|
MessageBoxW(NULL, L"Could not locate game being injected!", L"No valid directories matching '*_Data'",
|
|
MB_OK | MB_ICONERROR | MB_SYSTEMMODAL | MB_TOPMOST | MB_SETFOREGROUND);
|
|
|
|
ExitProcess(GetLastError());
|
|
}
|
|
}
|
|
|
|
inline void initCmdArgs()
|
|
{
|
|
wchar_t *args = GetCommandLineW();
|
|
int argc = 0;
|
|
wchar_t **argv = CommandLineToArgvW(args, &argc);
|
|
|
|
#define IS_ARGUMENT(arg_name) STR_EQUAL(arg, arg_name) && i < argc
|
|
|
|
for (int i = 0; i < argc; i++)
|
|
{
|
|
wchar_t *arg = argv[i];
|
|
/*if (IS_ARGUMENT(L"--doorstop-enable"))
|
|
{
|
|
wchar_t *par = argv[++i];
|
|
|
|
if (STR_EQUAL(par, L"true"))
|
|
enabled = TRUE;
|
|
else if (STR_EQUAL(par, L"false"))
|
|
enabled = FALSE;
|
|
}
|
|
else if (IS_ARGUMENT(L"--doorstop-target"))
|
|
{
|
|
if (targetAssembly != NULL)
|
|
memfree(targetAssembly);
|
|
const size_t len = wcslen(argv[i + 1]) + 1;
|
|
targetAssembly = memalloc(sizeof(wchar_t) * len);
|
|
lstrcpynW(targetAssembly, argv[++i], len);
|
|
LOG("Args; Target assembly: %S\n", targetAssembly);
|
|
}
|
|
else */if (IS_ARGUMENT(L"--mono-debug"))
|
|
{
|
|
debug = TRUE;
|
|
debug_info = TRUE;
|
|
LOG("Enabled debugging\n");
|
|
}
|
|
else if (IS_ARGUMENT(L"--debug"))
|
|
{
|
|
debug_info = TRUE;
|
|
LOG("Enabled loading of debug info\n");
|
|
}
|
|
else if (IS_ARGUMENT(L"--server"))
|
|
{
|
|
debug_server = TRUE;
|
|
LOG("Server-mode debugging enabled\n");
|
|
}
|
|
}
|
|
|
|
LocalFree(argv);
|
|
}
|
|
|
|
inline void initEnvVars()
|
|
{
|
|
if (GetEnvironmentVariableW(L"DOORSTOP_DISABLE", NULL, 0) != 0)
|
|
{
|
|
LOG("DOORSTOP_DISABLE is set! Disabling Doorstop!\n");
|
|
enabled = FALSE;
|
|
}
|
|
}
|
|
|
|
inline void loadConfig()
|
|
{
|
|
initConfigFile();
|
|
initCmdArgs();
|
|
initEnvVars();
|
|
}
|
|
|
|
inline void cleanupConfig()
|
|
{
|
|
if (targetAssembly != NULL)
|
|
memfree(targetAssembly);
|
|
}
|