diff options
-rw-r--r-- | NorthstarDedicatedTest/dedicated.cpp | 19 | ||||
-rw-r--r-- | NorthstarDedicatedTest/dedicatedmaterialsystem.cpp | 121 | ||||
-rw-r--r-- | NorthstarDedicatedTest/dedicatedmaterialsystem.h | 3 | ||||
-rw-r--r-- | NorthstarDedicatedTest/dllmain.cpp | 2 | ||||
-rw-r--r-- | enc_temp_folder/1f2f287a281d83d9f25d929b98193d/dedicatedmaterialsystem.cpp | 186 | ||||
-rw-r--r-- | enc_temp_folder/9532ad42f9bf304d9fb7388cf83b5966/dllmain.cpp | 106 |
6 files changed, 433 insertions, 4 deletions
diff --git a/NorthstarDedicatedTest/dedicated.cpp b/NorthstarDedicatedTest/dedicated.cpp index 1468f9d1..b6db8583 100644 --- a/NorthstarDedicatedTest/dedicated.cpp +++ b/NorthstarDedicatedTest/dedicated.cpp @@ -281,7 +281,7 @@ void InitialiseDedicated(HMODULE engineAddress) // CEngineAPI::Init char* ptr = (char*)engineAddress + 0x1C60CE; TempReadWrite rw(ptr); - + // remove call to something or other that reads video settings *ptr = (char)0x90; *(ptr + 1) = (char)0x90; @@ -289,18 +289,31 @@ void InitialiseDedicated(HMODULE engineAddress) *(ptr + 3) = (char)0x90; *(ptr + 4) = (char)0x90; } - + { // some inputsystem bullshit char* ptr = (char*)engineAddress + 0x1CEE28; TempReadWrite rw(ptr); - + // nop an accessviolation: temp because we still create game window atm *ptr = (char)0x90; *(ptr + 1) = (char)0x90; *(ptr + 2) = (char)0x90; } + { + // no clue what this is + char* ptr = (char*)engineAddress + 0x1CD146; + TempReadWrite rw(ptr); + + // nop a crashing call + *ptr = (char)0x90; + *(ptr + 1) = (char)0x90; + *(ptr + 2) = (char)0x90; + *(ptr + 3) = (char)0x90; + *(ptr + 4) = (char)0x90; + } + //{ // // CEngineAPI::ModInit // char* ptr = (char*)engineAddress + 0x1C67D1; diff --git a/NorthstarDedicatedTest/dedicatedmaterialsystem.cpp b/NorthstarDedicatedTest/dedicatedmaterialsystem.cpp index 531885a7..67e5db94 100644 --- a/NorthstarDedicatedTest/dedicatedmaterialsystem.cpp +++ b/NorthstarDedicatedTest/dedicatedmaterialsystem.cpp @@ -51,6 +51,86 @@ void InitialiseDedicatedMaterialSystem(HMODULE baseAddress) if (DisableDedicatedWindowCreation()) { { + // materialsystem rpak type registrations + char* ptr = (char*)baseAddress + 0x22B5; + TempReadWrite rw(ptr); + + // nop a call that crashes, not needed on dedi + *ptr = 0x90; + *(ptr + 1) = (char)0x90; + *(ptr + 2) = (char)0x90; + *(ptr + 3) = (char)0x90; + *(ptr + 4) = (char)0x90; + } + + // these don't work, they cause game to hang on rpak init, needs reworking + { + // materialsystem rpak type: texture + char* ptr = (char*)baseAddress + 0x2B00; + TempReadWrite rw(ptr); + + // make it return 0 + // mov rax,0 + *ptr = 0x48; + *(ptr + 1) = (char)0xB8; + *(ptr + 2) = (char)0x00; + *(ptr + 3) = (char)0x00; + *(ptr + 4) = (char)0x00; + *(ptr + 5) = (char)0x00; + *(ptr + 6) = (char)0x00; + *(ptr + 7) = (char)0x00; + *(ptr + 8) = (char)0x00; + *(ptr + 9) = (char)0x00; + + // ret + *(ptr + 10) = (char)0xC3; + } + + { + // materialsystem rpak type: material + char* ptr = (char*)baseAddress + 0x50AA0; + TempReadWrite rw(ptr); + + // make it return 0 + // mov rax,0 + *ptr = 0x48; + *(ptr + 1) = (char)0xB8; + *(ptr + 2) = (char)0x00; + *(ptr + 3) = (char)0x00; + *(ptr + 4) = (char)0x00; + *(ptr + 5) = (char)0x00; + *(ptr + 6) = (char)0x00; + *(ptr + 7) = (char)0x00; + *(ptr + 8) = (char)0x00; + *(ptr + 9) = (char)0x00; + + // ret + *(ptr + 10) = (char)0xC3; + } + + { + // materialsystem rpak type: shader + char* ptr = (char*)baseAddress + 0x2850; + TempReadWrite rw(ptr); + + // make it return 0 + // mov rax,0 + *ptr = 0x48; + *(ptr + 1) = (char)0xB8; + *(ptr + 2) = (char)0x00; + *(ptr + 3) = (char)0x00; + *(ptr + 4) = (char)0x00; + *(ptr + 5) = (char)0x00; + *(ptr + 6) = (char)0x00; + *(ptr + 7) = (char)0x00; + *(ptr + 8) = (char)0x00; + *(ptr + 9) = (char)0x00; + + // ret + *(ptr + 10) = (char)0xC3; + } + + { // some renderthread stuff char* ptr = (char*)baseAddress + 0x8C10; TempReadWrite rw(ptr); @@ -60,4 +140,45 @@ void InitialiseDedicatedMaterialSystem(HMODULE baseAddress) *(ptr + 1) = (char)0x90; } } +} + +// rpak pain +struct RpakTypeDefinition +{ + int64_t magic; + char* longName; + + // more fields but they don't really matter for what we use them for +}; + +typedef void*(*RegisterRpakTypeType)(RpakTypeDefinition* rpakStruct, unsigned int a1, unsigned int a2); +RegisterRpakTypeType RegisterRpakType; + +typedef void(*RegisterMaterialSystemRpakTypes)(); + +void* RegisterRpakTypeHook(RpakTypeDefinition* rpakStruct, unsigned int a1, unsigned int a2) +{ + // make sure this prints right + char magicName[5]; + memcpy(magicName, &rpakStruct->magic, 4); + magicName[4] = 0; + + spdlog::info("rpak type {} {} registered {} {}", magicName, rpakStruct->longName, a1, a2); + + // reregister rpak types that aren't registered on a windowless dedi + if (IsDedicated() && DisableDedicatedWindowCreation() && rpakStruct->magic == 0x64636C72) // rlcd, this one is registered last + ((RegisterMaterialSystemRpakTypes)((char*)GetModuleHandleA("materialsystem_dx11.dll") + 0x22A0))(); // slightly hellish call + + return RegisterRpakType(rpakStruct, a1, a2); +} + +void InitialiseDedicatedRtechGame(HMODULE baseAddress) +{ + HookEnabler hook; + ENABLER_CREATEHOOK(hook, (char*)GetModuleHandleA("rtech_game.dll") + 0x7BE0, &RegisterRpakTypeHook, reinterpret_cast<LPVOID*>(&RegisterRpakType)); + + if (!IsDedicated()) + return; + + }
\ No newline at end of file diff --git a/NorthstarDedicatedTest/dedicatedmaterialsystem.h b/NorthstarDedicatedTest/dedicatedmaterialsystem.h index 284444e6..38343d17 100644 --- a/NorthstarDedicatedTest/dedicatedmaterialsystem.h +++ b/NorthstarDedicatedTest/dedicatedmaterialsystem.h @@ -1,2 +1,3 @@ #pragma once -void InitialiseDedicatedMaterialSystem(HMODULE baseAddress);
\ No newline at end of file +void InitialiseDedicatedMaterialSystem(HMODULE baseAddress); +void InitialiseDedicatedRtechGame(HMODULE baseAddress);
\ No newline at end of file diff --git a/NorthstarDedicatedTest/dllmain.cpp b/NorthstarDedicatedTest/dllmain.cpp index bc1bfd77..2ecaf3db 100644 --- a/NorthstarDedicatedTest/dllmain.cpp +++ b/NorthstarDedicatedTest/dllmain.cpp @@ -74,6 +74,8 @@ void InitialiseNorthstar() AddDllLoadCallback("engine.dll", InitialiseDedicated); AddDllLoadCallback("launcher.dll", InitialiseDedicatedOrigin); AddDllLoadCallback("materialsystem_dx11.dll", InitialiseDedicatedMaterialSystem); + // this fucking sucks, but seemingly we somehow load after rtech_game???? unsure how, but because of this we have to apply patches here, not on rtech_game load + AddDllLoadCallback("engine.dll", InitialiseDedicatedRtechGame); } AddDllLoadCallback("engine.dll", InitialiseConVars); diff --git a/enc_temp_folder/1f2f287a281d83d9f25d929b98193d/dedicatedmaterialsystem.cpp b/enc_temp_folder/1f2f287a281d83d9f25d929b98193d/dedicatedmaterialsystem.cpp new file mode 100644 index 00000000..30a55b94 --- /dev/null +++ b/enc_temp_folder/1f2f287a281d83d9f25d929b98193d/dedicatedmaterialsystem.cpp @@ -0,0 +1,186 @@ +#pragma once +#include "pch.h" +#include "dedicated.h" +#include "dedicatedmaterialsystem.h" +#include "hookutils.h" + +void InitialiseDedicatedMaterialSystem(HMODULE baseAddress) +{ + if (!IsDedicated()) + return; + + //while (!IsDebuggerPresent()) + // Sleep(100); + + // not using these for now since they're related to nopping renderthread/gamewindow i.e. very hard + //{ + // // function that launches renderthread + // char* ptr = (char*)baseAddress + 0x87047; + // TempReadWrite rw(ptr); + // + // // make it not launch renderthread + // *ptr = (char)0x90; + // *(ptr + 1) = (char)0x90; + // *(ptr + 2) = (char)0x90; + // *(ptr + 3) = (char)0x90; + // *(ptr + 4) = (char)0x90; + // *(ptr + 5) = (char)0x90; + //} + // + //{ + // // some function that waits on renderthread job + // char* ptr = (char*)baseAddress + 0x87d00; + // TempReadWrite rw(ptr); + // + // // return immediately + // *ptr = (char)0xC3; + //} + + { + // CMaterialSystem::FindMaterial + char* ptr = (char*)baseAddress + 0x5F0F1; + TempReadWrite rw(ptr); + + // make the game always use the error material + *ptr = 0xE9; + *(ptr + 1) = (char)0x34; + *(ptr + 2) = (char)0x03; + *(ptr + 3) = (char)0x00; + } + + if (DisableDedicatedWindowCreation()) + { + { + // materialsystem rpak type registrations + char* ptr = (char*)baseAddress + 0x22B5; + TempReadWrite rw(ptr); + + // nop a call that crashes, not needed on dedi + *ptr = 0x90; + *(ptr + 1) = (char)0x90; + *(ptr + 2) = (char)0x90; + *(ptr + 3) = (char)0x90; + *(ptr + 4) = (char)0x90; + } + + // these don't work, they cause game to hang on loading + { + // materialsystem rpak type: texture + char* ptr = (char*)baseAddress + 0x2B00; + TempReadWrite rw(ptr); + + // make it return 0 + // mov rax,0 + *ptr = 0x48; + *(ptr + 1) = (char)0xB8; + *(ptr + 2) = (char)0x00; + *(ptr + 3) = (char)0x00; + *(ptr + 4) = (char)0x00; + *(ptr + 5) = (char)0x00; + *(ptr + 6) = (char)0x00; + *(ptr + 7) = (char)0x00; + *(ptr + 8) = (char)0x00; + *(ptr + 9) = (char)0x00; + + // ret + *(ptr + 10) = (char)0xC3; + } + + { + // materialsystem rpak type: material + char* ptr = (char*)baseAddress + 0x50AA0; + TempReadWrite rw(ptr); + + // make it return 0 + // mov rax,0 + *ptr = 0x48; + *(ptr + 1) = (char)0xB8; + *(ptr + 2) = (char)0x00; + *(ptr + 3) = (char)0x00; + *(ptr + 4) = (char)0x00; + *(ptr + 5) = (char)0x00; + *(ptr + 6) = (char)0x00; + *(ptr + 7) = (char)0x00; + *(ptr + 8) = (char)0x00; + *(ptr + 9) = (char)0x00; + + // ret + *(ptr + 10) = (char)0xC3; + } + + { + // materialsystem rpak type: shader + char* ptr = (char*)baseAddress + 0x2850; + TempReadWrite rw(ptr); + + // make it return 0 + // mov rax,0 + *ptr = 0x48; + *(ptr + 1) = (char)0xB8; + *(ptr + 2) = (char)0x00; + *(ptr + 3) = (char)0x00; + *(ptr + 4) = (char)0x00; + *(ptr + 5) = (char)0x00; + *(ptr + 6) = (char)0x00; + *(ptr + 7) = (char)0x00; + *(ptr + 8) = (char)0x00; + *(ptr + 9) = (char)0x00; + + // ret + *(ptr + 10) = (char)0xC3; + } + + { + // some renderthread stuff + char* ptr = (char*)baseAddress + 0x8C10; + TempReadWrite rw(ptr); + + // call => nop + *ptr = (char)0x90; + *(ptr + 1) = (char)0x90; + } + } +} + +// rpak pain +struct RpakTypeDefinition +{ + int64_t magic; + char* longName; + + // more fields but they don't really matter for what we use them for +}; + +typedef void*(*RegisterRpakTypeType)(RpakTypeDefinition* rpakStruct, unsigned int a1, unsigned int a2); +RegisterRpakTypeType RegisterRpakType; + +typedef void(*RegisterMaterialSystemRpakTypes)(); + +void* RegisterRpakTypeHook(RpakTypeDefinition* rpakStruct, unsigned int a1, unsigned int a2) +{ + // make sure this prints right + char magicName[5]; + memcpy(magicName, &rpakStruct->magic, 4); + magicName[4] = 0; + + spdlog::info("rpak type {} {} registered {} {}", magicName, rpakStruct->longName, a1, a2); + + // reregister rpak types that aren't registered on a windowless dedi + if (IsDedicated() && DisableDedicatedWindowCreation() && rpakStruct->magic == 0x64636C72) // rlcd, this one is registered last + ((RegisterMaterialSystemRpakTypes)((char*)GetModuleHandleA("materialsystem_dx11.dll") + 0x22A0))(); // slightly hellish call + + return RegisterRpakType(rpakStruct, a1, a2); +} + +void InitialiseDedicatedRtechGame(HMODULE baseAddress) +{ + spdlog::info("InitialiseDedicatedRtechGame"); + + HookEnabler hook; + ENABLER_CREATEHOOK(hook, (char*)GetModuleHandleA("rtech_game.dll") + 0x7BE0, &RegisterRpakTypeHook, reinterpret_cast<LPVOID*>(&RegisterRpakType)); + + if (!IsDedicated()) + return; + + +}
\ No newline at end of file diff --git a/enc_temp_folder/9532ad42f9bf304d9fb7388cf83b5966/dllmain.cpp b/enc_temp_folder/9532ad42f9bf304d9fb7388cf83b5966/dllmain.cpp new file mode 100644 index 00000000..7d347097 --- /dev/null +++ b/enc_temp_folder/9532ad42f9bf304d9fb7388cf83b5966/dllmain.cpp @@ -0,0 +1,106 @@ +#include "pch.h" +#include "hooks.h" +#include "main.h" +#include "squirrel.h" +#include "tier0.h" +#include "dedicated.h" +#include "dedicatedmaterialsystem.h" +#include "sourceconsole.h" +#include "logging.h" +#include "concommand.h" +#include "modmanager.h" +#include "filesystem.h" +#include "serverauthentication.h" +#include "scriptmodmenu.h" +#include "scriptserverbrowser.h" +#include "keyvalues.h" +#include "masterserver.h" +#include "gameutils.h" +#include "chatcommand.h" +#include "modlocalisation.h" +#include "playlist.h" +#include "securitypatches.h" +#include "miscserverscript.h" + +bool initialised = false; + +BOOL APIENTRY DllMain( HMODULE hModule, + DWORD ul_reason_for_call, + LPVOID lpReserved + ) +{ + switch (ul_reason_for_call) + { + case DLL_PROCESS_ATTACH: + case DLL_THREAD_ATTACH: + case DLL_THREAD_DETACH: + case DLL_PROCESS_DETACH: + break; + } + + if (!initialised) + InitialiseNorthstar(); + initialised = true; + + return TRUE; +} + +void WaitForDebugger(HMODULE baseAddress) +{ + // earlier waitfordebugger call than is in vanilla, just so we can debug stuff a little easier + if (CommandLine()->CheckParm("-waitfordebugger")) + { + while (!IsDebuggerPresent()) + Sleep(100); + } +} + +// in the future this will be called from launcher instead of dllmain +void InitialiseNorthstar() +{ + InitialiseLogging(); + + // apply initial hooks + InstallInitialHooks(); + InitialiseInterfaceCreationHooks(); + + AddDllLoadCallback("engine.dll", WaitForDebugger); + AddDllLoadCallback("engine.dll", InitialiseEngineGameUtilFunctions); + AddDllLoadCallback("server.dll", InitialiseServerGameUtilFunctions); + AddDllLoadCallback("engine.dll", InitialiseEngineSpewFuncHooks); + + // dedi patches + { + AddDllLoadCallback("engine.dll", InitialiseDedicated); + AddDllLoadCallback("launcher.dll", InitialiseDedicatedOrigin); + AddDllLoadCallback("materialsystem_dx11.dll", InitialiseDedicatedMaterialSystem); + AddDllLoadCallback("engine.dll", InitialiseDedicatedRtechGame); + } + + AddDllLoadCallback("engine.dll", InitialiseConVars); + AddDllLoadCallback("engine.dll", InitialiseConCommands); + + // client-exclusive patches + { + AddDllLoadCallback("engine.dll", InitialiseClientEngineSecurityPatches); + AddDllLoadCallback("client.dll", InitialiseClientSquirrel); + AddDllLoadCallback("client.dll", InitialiseSourceConsole); + AddDllLoadCallback("engine.dll", InitialiseChatCommands); + AddDllLoadCallback("client.dll", InitialiseScriptModMenu); + AddDllLoadCallback("client.dll", InitialiseScriptServerBrowser); + AddDllLoadCallback("localize.dll", InitialiseModLocalisation); + } + + AddDllLoadCallback("server.dll", InitialiseServerSquirrel); + AddDllLoadCallback("engine.dll", InitialiseServerAuthentication); + AddDllLoadCallback("engine.dll", InitialiseSharedMasterServer); + AddDllLoadCallback("server.dll", InitialiseMiscServerScriptCommand); + + AddDllLoadCallback("engine.dll", InitialisePlaylistHooks); + + AddDllLoadCallback("filesystem_stdio.dll", InitialiseFilesystem); + AddDllLoadCallback("engine.dll", InitialiseKeyValues); + + // mod manager after everything else + AddDllLoadCallback("engine.dll", InitialiseModManager); +}
\ No newline at end of file |