You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

137 lines
3.1 KiB

#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);
}