aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NorthstarDedicatedTest/dedicated.cpp19
-rw-r--r--NorthstarDedicatedTest/dedicatedmaterialsystem.cpp121
-rw-r--r--NorthstarDedicatedTest/dedicatedmaterialsystem.h3
-rw-r--r--NorthstarDedicatedTest/dllmain.cpp2
-rw-r--r--enc_temp_folder/1f2f287a281d83d9f25d929b98193d/dedicatedmaterialsystem.cpp186
-rw-r--r--enc_temp_folder/9532ad42f9bf304d9fb7388cf83b5966/dllmain.cpp106
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