Skip to content

Commit 64a5cec

Browse files
committed
feat: make demoheader unique for every instance
1 parent a9f1cb3 commit 64a5cec

File tree

2 files changed

+31
-0
lines changed

2 files changed

+31
-0
lines changed

src/Modules/EngineDemoRecorder.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
#include <cstdio>
2323
#include <filesystem>
24+
#include <Hook.hpp>
2425

2526
REDECL(EngineDemoRecorder::SetSignonState);
2627
REDECL(EngineDemoRecorder::StartRecording);
@@ -346,6 +347,10 @@ DETOUR_COMMAND(EngineDemoRecorder::record) {
346347
}
347348
}
348349

350+
Memory::Patch *g_StartupDemoFile_headerNamePatch;
351+
Memory::Patch *g_StartupDemoHeader_headerNamePatch;
352+
std::string g_uniqueDemoHeaderName;
353+
349354
bool EngineDemoRecorder::Init() {
350355
auto disconnect = engine->cl->Original(Offsets::Disconnect);
351356
auto demorecorder = Memory::DerefDeref<void *>(disconnect + Offsets::demorecorder);
@@ -355,6 +360,19 @@ bool EngineDemoRecorder::Init() {
355360
this->s_ClientDemoRecorder->Hook(EngineDemoRecorder::StopRecording_Hook, EngineDemoRecorder::StopRecording, Offsets::StopRecording);
356361
if (!sar.game->Is(SourceGame_INFRA | SourceGame_Portal2_2011)) {
357362
this->s_ClientDemoRecorder->Hook(EngineDemoRecorder::RecordCustomData_Hook, EngineDemoRecorder::RecordCustomData, Offsets::RecordCustomData);
363+
364+
uint32_t uniqueId = static_cast<uint32_t>(time(NULL));
365+
g_uniqueDemoHeaderName = Utils::ssprintf("demoheader_%08x.tmp", uniqueId);
366+
367+
auto uniqueDemoHeaderName = g_uniqueDemoHeaderName.c_str();
368+
auto uniqueDemoHeaderNamePtr = (unsigned char *)&uniqueDemoHeaderName;
369+
370+
g_StartupDemoFile_headerNamePatch = new Memory::Patch();
371+
auto StartupDemoFile = Memory::Scan(this->Name(), Offsets::StartupDemoFile);
372+
g_StartupDemoFile_headerNamePatch->Execute(StartupDemoFile + Offsets::StartupDemoFile_HeaderName, uniqueDemoHeaderNamePtr, 4);
373+
g_StartupDemoHeader_headerNamePatch = new Memory::Patch();
374+
auto StartupDemoHeader = Memory::Scan(this->Name(), Offsets::StartupDemoHeader);
375+
g_StartupDemoHeader_headerNamePatch->Execute(StartupDemoHeader + Offsets::StartupDemoHeader_HeaderName, uniqueDemoHeaderNamePtr, 4);
358376
}
359377

360378
this->GetRecordingTick = s_ClientDemoRecorder->Original<_GetRecordingTick>(Offsets::GetRecordingTick);
@@ -371,6 +389,11 @@ bool EngineDemoRecorder::Init() {
371389
return this->hasLoaded = this->s_ClientDemoRecorder;
372390
}
373391
void EngineDemoRecorder::Shutdown() {
392+
g_StartupDemoFile_headerNamePatch->Restore();
393+
SAFE_DELETE(g_StartupDemoFile_headerNamePatch);
394+
g_StartupDemoHeader_headerNamePatch->Restore();
395+
SAFE_DELETE(g_StartupDemoHeader_headerNamePatch);
396+
374397
Interface::Delete(this->s_ClientDemoRecorder);
375398
Command::Unhook("stop", EngineDemoRecorder::stop_callback);
376399
Command::Unhook("record", EngineDemoRecorder::record_callback);

src/Offsets/Portal 2 9568.hpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -468,6 +468,14 @@ OFFSET_DEFAULT(Cmd_ShutdownOff, 3, 11)
468468
OFFSET_DEFAULT(Cmd_ShutdownOff2, 10, 10)
469469

470470

471+
// EngineDemoRecorder
472+
// "demoheader.tmp"
473+
SIGSCAN_DEFAULT(StartupDemoHeader, "56 8B F1 E8 ? ? ? ? 6A 00 6A 00 68 ? ? ? ? 8D", "")
474+
OFFSET_DEFAULT(StartupDemoHeader_HeaderName, 13, 13)
475+
SIGSCAN_DEFAULT(StartupDemoFile, "55 8B EC 81 EC 18 02 00 00 53 8B D9 80", "")
476+
OFFSET_DEFAULT(StartupDemoFile_HeaderName, 212, 212)
477+
478+
471479
// EngineDemoPlayer
472480
SIGSCAN_DEFAULT(InterpolateDemoCommand, "55 8B EC 83 EC 10 56 8B F1 8B 4D 10 57 8B BE B4 05 00 00 83 C1 04 89 75 F4 89 7D F0 E8 ? ? ? ? 8B 4D 14 83 C1 04",
473481
"55 57 56 53 83 EC 10 8B 44 24 24 8B 5C 24 2C 8B 88 B0 05 00 00 8B 44 24 30 8D 70 04 8D 90 9C 00 00 00 89 F0 F3 0F 10 40 04")

0 commit comments

Comments
 (0)