Textractor_test/texthook/engine/match.cc

78 lines
2.5 KiB
C++
Raw Normal View History

#include "match.h"
#include "engine.h"
2018-08-23 23:53:23 +08:00
#include "main.h"
2020-03-05 16:51:36 +08:00
#include "defs.h"
#include "native/pchooks.h"
2019-02-28 00:33:17 +08:00
extern const char* HIJACK_ERROR;
uintptr_t processStartAddress, processStopAddress;
namespace Engine
{
WCHAR* processName, // cached
processPath[MAX_PATH]; // cached
char configFileData[1000];
bool UnsafeDetermineEngineType();
// jichi 10/21/2014: Return whether found the game engine
bool DetermineEngineType()
{
// jichi 9/27/2013: disable game engine for debugging use
bool found = false;
2018-09-04 06:43:43 +08:00
#ifndef ITH_DISABLE_ENGINE
__try { found = UnsafeDetermineEngineType(); }
__except (EXCEPTION_EXECUTE_HANDLER) { ConsoleOutput(HIJACK_ERROR); }
2018-09-04 06:43:43 +08:00
#endif // ITH_DISABLE_ENGINE
if (!found) { // jichi 10/2/2013: Only enable it if no game engine is detected
PcHooks::hookOtherPcFunctions();
} //else
// ConsoleOutput("vnreng: found game engine, IGNORE non gui hooks");
return found;
}
DWORD InsertDynamicHook(LPVOID addr, DWORD frame, DWORD stack)
2018-08-26 03:45:25 +08:00
{
return trigger_fun ? !trigger_fun(addr, frame, stack) : 0;
}
2018-08-26 03:45:25 +08:00
void Hijack()
{
static auto _ = []
{
GetModuleFileNameW(nullptr, processPath, MAX_PATH);
processName = wcsrchr(processPath, L'\\') + 1;
2020-03-05 16:51:36 +08:00
wchar_t configFilename[MAX_PATH + std::size(GAME_CONFIG_FILE)];
wcsncpy_s(configFilename, processPath, MAX_PATH - 1);
2020-03-05 16:51:36 +08:00
wcscpy_s(wcsrchr(configFilename, L'\\') + 1, std::size(GAME_CONFIG_FILE), GAME_CONFIG_FILE);
if (AutoHandle<> configFile = CreateFileW(configFilename, GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL))
{
if (ReadFile(configFile, configFileData, sizeof(configFileData) - 1, DUMMY, nullptr)) ConsoleOutput("Textractor: game configuration loaded");
if (strncmp(configFileData, "Engine:", 7) == 0)
{
if (loadedConfig = strchr(configFileData, '\n')) *(char*)loadedConfig++ = 0;
ConsoleOutput("Textractor: Engine = %s", requestedEngine = configFileData + 7);
}
else loadedConfig = configFileData;
}
processStartAddress = processStopAddress = (uintptr_t)GetModuleHandleW(nullptr);
MEMORY_BASIC_INFORMATION info;
do
{
VirtualQuery((void*)processStopAddress, &info, sizeof(info));
processStopAddress = (uintptr_t)info.BaseAddress + info.RegionSize;
} while (info.Protect > PAGE_NOACCESS);
processStopAddress -= info.RegionSize;
spDefault.minAddress = processStartAddress;
spDefault.maxAddress = processStopAddress;
ConsoleOutput("Textractor: hijacking process located from 0x%p to 0x%p", processStartAddress, processStopAddress);
DetermineEngineType();
return NULL;
}();
}
}