Add DMM version.dll proxy hook for CGSS
Signed-off-by: Sean Du <do4suki@gmail.com>
This commit is contained in:
@@ -0,0 +1,85 @@
|
||||
#include "stdinclude.hpp"
|
||||
|
||||
extern "C" {
|
||||
void* GetFileVersionInfoA_Original = nullptr;
|
||||
void* GetFileVersionInfoSizeA_Original = nullptr;
|
||||
void* VerQueryValueA_Original = nullptr;
|
||||
|
||||
BOOL WINAPI GetFileVersionInfoA_EXPORT(LPCSTR lptstrFilename, DWORD dwHandle, DWORD dwLen, LPVOID lpData) {
|
||||
using Fn = BOOL(WINAPI*)(LPCSTR, DWORD, DWORD, LPVOID);
|
||||
if (!GetFileVersionInfoA_Original) {
|
||||
SetLastError(ERROR_PROC_NOT_FOUND);
|
||||
return FALSE;
|
||||
}
|
||||
return reinterpret_cast<Fn>(GetFileVersionInfoA_Original)(lptstrFilename, dwHandle, dwLen, lpData);
|
||||
}
|
||||
|
||||
DWORD WINAPI GetFileVersionInfoSizeA_EXPORT(LPCSTR lptstrFilename, LPDWORD lpdwHandle) {
|
||||
using Fn = DWORD(WINAPI*)(LPCSTR, LPDWORD);
|
||||
if (!GetFileVersionInfoSizeA_Original) {
|
||||
SetLastError(ERROR_PROC_NOT_FOUND);
|
||||
return 0;
|
||||
}
|
||||
return reinterpret_cast<Fn>(GetFileVersionInfoSizeA_Original)(lptstrFilename, lpdwHandle);
|
||||
}
|
||||
|
||||
BOOL WINAPI VerQueryValueA_EXPORT(LPCVOID pBlock, LPCSTR lpSubBlock, LPVOID* lplpBuffer, PUINT puLen) {
|
||||
using Fn = BOOL(WINAPI*)(LPCVOID, LPCSTR, LPVOID*, PUINT);
|
||||
if (!VerQueryValueA_Original) {
|
||||
SetLastError(ERROR_PROC_NOT_FOUND);
|
||||
return FALSE;
|
||||
}
|
||||
return reinterpret_cast<Fn>(VerQueryValueA_Original)(pBlock, lpSubBlock, lplpBuffer, puLen);
|
||||
}
|
||||
}
|
||||
|
||||
void start_hook_thread();
|
||||
|
||||
namespace {
|
||||
constexpr DWORD kProxyInitDelayMs = 1000;
|
||||
HMODULE g_original = nullptr;
|
||||
|
||||
void load_original_version_dll() {
|
||||
if (g_original) {
|
||||
return;
|
||||
}
|
||||
|
||||
char system_dir[MAX_PATH] = {};
|
||||
GetSystemDirectoryA(system_dir, MAX_PATH);
|
||||
char path[MAX_PATH] = {};
|
||||
lstrcpynA(path, system_dir, MAX_PATH);
|
||||
lstrcatA(path, "\\version.dll");
|
||||
|
||||
g_original = LoadLibraryA(path);
|
||||
if (!g_original) {
|
||||
hook_log("[cgss-http-hook] failed to load original version.dll");
|
||||
return;
|
||||
}
|
||||
|
||||
GetFileVersionInfoA_Original = reinterpret_cast<void*>(GetProcAddress(g_original, "GetFileVersionInfoA"));
|
||||
GetFileVersionInfoSizeA_Original = reinterpret_cast<void*>(GetProcAddress(g_original, "GetFileVersionInfoSizeA"));
|
||||
VerQueryValueA_Original = reinterpret_cast<void*>(GetProcAddress(g_original, "VerQueryValueA"));
|
||||
|
||||
if (!GetFileVersionInfoA_Original || !GetFileVersionInfoSizeA_Original || !VerQueryValueA_Original) {
|
||||
hook_log("[cgss-http-hook] failed to resolve version exports");
|
||||
return;
|
||||
}
|
||||
|
||||
hook_log("[cgss-http-hook] version.dll initialized");
|
||||
}
|
||||
|
||||
DWORD WINAPI init_thread(void*) {
|
||||
Sleep(kProxyInitDelayMs);
|
||||
load_original_version_dll();
|
||||
start_hook_thread();
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
BOOL WINAPI DllMain(HINSTANCE module, DWORD reason, LPVOID) {
|
||||
if (reason == DLL_PROCESS_ATTACH) {
|
||||
DisableThreadLibraryCalls(module);
|
||||
CreateThread(nullptr, 0, init_thread, nullptr, 0, nullptr);
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
Reference in New Issue
Block a user