try to increase compatibility with varying systems
This commit is contained in:
parent
02bd700547
commit
0ba9eb4078
|
@ -21,10 +21,8 @@ using namespace std;
|
||||||
void* base; // Module base
|
void* base; // Module base
|
||||||
vector <DLL*> modDLLs; // Every mod we've loaded
|
vector <DLL*> modDLLs; // Every mod we've loaded
|
||||||
HMODULE hSelf; // A handle to ourself, to prevent being unloaded
|
HMODULE hSelf; // A handle to ourself, to prevent being unloaded
|
||||||
void* initterm_e; // A pointer to a function which is run extremely soon after starting, or after being unpacked
|
void** initterm_eReference; // A pointer-pointer to a function which is run extremely soon after starting, or after being unpacked
|
||||||
const size_t BYTES_TO_MOVE = 14; // The size of a far jump
|
void* initterm_e; // A pointer to that function
|
||||||
char initterm_e_remember[BYTES_TO_MOVE]; // We'll use this to store the code we overwrite in initterm_e, so we can put it back later.
|
|
||||||
|
|
||||||
|
|
||||||
#include "callbacks/ChatHandler.h"
|
#include "callbacks/ChatHandler.h"
|
||||||
#include "callbacks/P2PRequestHandler.h"
|
#include "callbacks/P2PRequestHandler.h"
|
||||||
|
@ -123,9 +121,6 @@ void no_optimize ASMStartMods() {
|
||||||
// Initialize mods and callbacks
|
// Initialize mods and callbacks
|
||||||
"call [StartMods_ptr] \n"
|
"call [StartMods_ptr] \n"
|
||||||
|
|
||||||
// We can put initterm_e back how we found it.
|
|
||||||
"call [CopyInitializationBack_ptr] \n"
|
|
||||||
|
|
||||||
RESTORE_STACK
|
RESTORE_STACK
|
||||||
POP_ALL
|
POP_ALL
|
||||||
|
|
||||||
|
@ -135,38 +130,31 @@ void no_optimize ASMStartMods() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void PatchFreeImage(){
|
void PatchFreeImage(){
|
||||||
// Thanks to frognik for showing off this method!
|
// Patch FreeImage, because Windows 8 and higher do not work properly with it.
|
||||||
DWORD oldProtect;
|
DWORD oldProtect;
|
||||||
void* patchaddr = (void*)GetModuleHandleA("FreeImage.dll") + 0x1E8C12;
|
void* patchaddr = (void*)GetModuleHandleA("FreeImage.dll") + 0x1E8C4E;
|
||||||
VirtualProtect((LPVOID)patchaddr, 8, PAGE_EXECUTE_READWRITE, &oldProtect);
|
VirtualProtect((LPVOID)patchaddr, 9, PAGE_EXECUTE_READWRITE, &oldProtect);
|
||||||
*(uint64_t*)patchaddr = 0x909090000000A8E9;
|
memset(patchaddr, 0x90, 9);
|
||||||
|
VirtualProtect((LPVOID)patchaddr, 9, oldProtect, &oldProtect);
|
||||||
|
|
||||||
|
patchaddr += 0x14;
|
||||||
|
VirtualProtect((LPVOID)patchaddr, 14, PAGE_EXECUTE_READWRITE, &oldProtect);
|
||||||
|
memset(patchaddr, 0x90, 14);
|
||||||
|
VirtualProtect((LPVOID)patchaddr, 14, oldProtect, &oldProtect);
|
||||||
}
|
}
|
||||||
|
|
||||||
void InitializationPatch() {
|
void PatchInitterm_ePtr() {
|
||||||
// Get pointer to initterm_e
|
// Get ** to initterm_e
|
||||||
initterm_e = *(void**)(base + 0x42CBD8);
|
initterm_eReference = (void**)(base + 0x42CBD8);
|
||||||
|
|
||||||
// Store old code, we'll copy it back once we regain control.
|
initterm_e = *initterm_eReference;
|
||||||
memcpy(initterm_e_remember, initterm_e, BYTES_TO_MOVE);
|
|
||||||
|
|
||||||
// Write a jump to our code
|
DWORD oldProtect;
|
||||||
WriteFarJMP(initterm_e, (void*)&ASMStartMods);
|
VirtualProtect((LPVOID)initterm_eReference, 8, PAGE_EXECUTE_READWRITE, &oldProtect);
|
||||||
|
*initterm_eReference = (void*)&ASMStartMods;
|
||||||
|
VirtualProtect((LPVOID)initterm_eReference, 8, oldProtect, &oldProtect);
|
||||||
}
|
}
|
||||||
|
|
||||||
// This restores initterm_e to how it was before we hijacked it.
|
|
||||||
void CopyInitializationBack() {
|
|
||||||
DWORD dwOldProtection;
|
|
||||||
VirtualProtect(initterm_e, BYTES_TO_MOVE, PAGE_EXECUTE_READWRITE, &dwOldProtection);
|
|
||||||
|
|
||||||
memcpy(initterm_e, initterm_e_remember, BYTES_TO_MOVE);
|
|
||||||
|
|
||||||
VirtualProtect(initterm_e, BYTES_TO_MOVE, dwOldProtection, &dwOldProtection);
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
void* CopyInitializationBack_ptr = (void*)&CopyInitializationBack;
|
|
||||||
|
|
||||||
|
|
||||||
void Popup(const char* title, const char* msg ) {
|
void Popup(const char* title, const char* msg ) {
|
||||||
MessageBoxA(0, msg, title, MB_OK | MB_ICONINFORMATION);
|
MessageBoxA(0, msg, title, MB_OK | MB_ICONINFORMATION);
|
||||||
}
|
}
|
||||||
|
@ -202,6 +190,7 @@ extern "C" __declspec(dllexport) BOOL APIENTRY DllMain(HINSTANCE hinstDLL, DWORD
|
||||||
switch (fdwReason) {
|
switch (fdwReason) {
|
||||||
case DLL_PROCESS_ATTACH:
|
case DLL_PROCESS_ATTACH:
|
||||||
|
|
||||||
|
|
||||||
already_initialized_mtx.lock();
|
already_initialized_mtx.lock();
|
||||||
if (already_initialized) {
|
if (already_initialized) {
|
||||||
already_initialized_mtx.unlock();
|
already_initialized_mtx.unlock();
|
||||||
|
@ -236,7 +225,7 @@ extern "C" __declspec(dllexport) BOOL APIENTRY DllMain(HINSTANCE hinstDLL, DWORD
|
||||||
uint32_t checksum = crc32_file(cubePath);
|
uint32_t checksum = crc32_file(cubePath);
|
||||||
if (checksum == CUBE_PACKED_CRC || checksum == CUBE_UNPACKED_CRC) {
|
if (checksum == CUBE_PACKED_CRC || checksum == CUBE_UNPACKED_CRC) {
|
||||||
// Patch some code to run StartMods. This method makes it work with AND without SteamStub.
|
// Patch some code to run StartMods. This method makes it work with AND without SteamStub.
|
||||||
InitializationPatch();
|
PatchInitterm_ePtr();
|
||||||
} else {
|
} else {
|
||||||
sprintf(msg, "%s does not seem to be version %s. CRC %08X", cubePath, CUBE_VERSION, checksum);
|
sprintf(msg, "%s does not seem to be version %s. CRC %08X", cubePath, CUBE_VERSION, checksum);
|
||||||
Popup("Error", msg);
|
Popup("Error", msg);
|
||||||
|
|
Loading…
Reference in New Issue