Initial project setup for dedicated server

* Move shared utils to shared directory
* Partial cleanup of existing codebase
* Add precompiled header for debug configurations
This commit is contained in:
Amos 2021-07-26 03:32:37 -07:00
parent cc4dc948dd
commit d45e6446df
35 changed files with 2015 additions and 182 deletions

View File

@ -7,6 +7,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "r5launcher", "r5launcher\r5
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "r5dev", "r5dev\r5dev.vcxproj", "{28CC6B4F-7A95-4933-ADA9-65E38D48516D}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "r5dedicated", "r5dedicated\r5dedicated.vcxproj", "{71988D92-343C-49AB-B52B-0AE0E83B0401}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64
@ -31,6 +33,14 @@ Global
{28CC6B4F-7A95-4933-ADA9-65E38D48516D}.Release|x64.Build.0 = Release|x64
{28CC6B4F-7A95-4933-ADA9-65E38D48516D}.Release|x86.ActiveCfg = Release|Win32
{28CC6B4F-7A95-4933-ADA9-65E38D48516D}.Release|x86.Build.0 = Release|Win32
{71988D92-343C-49AB-B52B-0AE0E83B0401}.Debug|x64.ActiveCfg = Debug|x64
{71988D92-343C-49AB-B52B-0AE0E83B0401}.Debug|x64.Build.0 = Debug|x64
{71988D92-343C-49AB-B52B-0AE0E83B0401}.Debug|x86.ActiveCfg = Debug|Win32
{71988D92-343C-49AB-B52B-0AE0E83B0401}.Debug|x86.Build.0 = Debug|Win32
{71988D92-343C-49AB-B52B-0AE0E83B0401}.Release|x64.ActiveCfg = Release|x64
{71988D92-343C-49AB-B52B-0AE0E83B0401}.Release|x64.Build.0 = Release|x64
{71988D92-343C-49AB-B52B-0AE0E83B0401}.Release|x86.ActiveCfg = Release|Win32
{71988D92-343C-49AB-B52B-0AE0E83B0401}.Release|x86.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE

46
r5dedicated/cnetchan.cpp Normal file
View File

@ -0,0 +1,46 @@
#include "pch.h"
#include "cnetchan.h"
//-----------------------------------------------------------------------------
// Hook and log the receive datagram
//-----------------------------------------------------------------------------
bool HNET_ReceiveDatagram(int sock, void* inpacket, bool raw)
{
bool result = org_NET_ReceiveDatagram(sock, inpacket, raw);
if (result)
{
int i = NULL;
netpacket_t* pkt = (netpacket_t*)inpacket;
// Log received packet data
HexDump("[+] NET_ReceiveDatagram", 0, &pkt->data[i], pkt->wiresize);
}
return result;
}
//-----------------------------------------------------------------------------
// Hook and log send datagram
//-----------------------------------------------------------------------------
unsigned int HNET_SendDatagram(SOCKET s, const char* buf, int len, int flags)
{
unsigned int result = org_NET_SendDatagram(s, buf, len, flags);
if (result)
{
// Log transmitted packet data
HexDump("[+] NET_SendDatagram", 0, buf, len);
}
return result;
}
///////////////////////////////////////////////////////////////////////////////
void AttachCNetChanHooks()
{
DetourAttach((LPVOID*)&org_NET_ReceiveDatagram, &HNET_ReceiveDatagram);
DetourAttach((LPVOID*)&org_NET_SendDatagram, &HNET_SendDatagram);
}
void DetachCNetChanHooks()
{
DetourDetach((LPVOID*)&org_NET_ReceiveDatagram, &HNET_ReceiveDatagram);
DetourDetach((LPVOID*)&org_NET_SendDatagram, &HNET_SendDatagram);
}

34
r5dedicated/cnetchan.h Normal file
View File

@ -0,0 +1,34 @@
#pragma once
#include "pch.h"
#include "hooks.h"
bool HNET_ReceiveDatagram(int sock, void* inpacket, bool raw);
unsigned int HNET_SendDatagram(SOCKET s, const char* buf, int len, int flags);
void AttachCNetChanHooks();
void DetachCNetChanHooks();
typedef unsigned __int64 QWORD;
struct __declspec(align(8)) netpacket_t
{
DWORD family_maybe;
sockaddr_in sin;
WORD sin_port;
BYTE gap16;
BYTE byte17;
DWORD source;
double received;
unsigned __int8* data;
QWORD label;
BYTE byte38;
QWORD qword40;
QWORD qword48;
BYTE gap50[8];
QWORD qword58;
QWORD qword60;
QWORD qword68;
int less_than_12;
DWORD wiresize;
BYTE gap78[8];
QWORD qword80;
};

View File

@ -0,0 +1,39 @@
#include "pch.h"
#include "concommand.h"
//-----------------------------------------------------------------------------
// Purpose: test each ConCommand query before execution
// Input : *cmd - flag
// Output : true if execution is not permitted, false if permitted
//-----------------------------------------------------------------------------
bool HConCommand_IsFlagSet(int* cmd, int flag)
{
int real_flags = *((cmd + (56 / sizeof(int))));
if (g_bDebugConsole)
{
printf("--------------------------------------------------\n");
printf(" Flaged: %08X\n", real_flags);
}
// Mask off FCVAR_CHEATS and FCVAR_DEVELOPMENTONLY
real_flags &= 0xFFFFBFFD;
if (g_bDebugConsole)
{
printf(" Masked: %08X\n", real_flags);
printf(" Verify: %08X\n", flag);
printf("--------------------------------------------------\n");
}
if (flag & 0x80000) { return true; }
if (!g_bReturnAllFalse) { return (real_flags & flag) != 0; }
else { return false; } // Returning false on all queries may cause problems
}
void AttachConCommandHooks()
{
DetourAttach((LPVOID*)&org_ConCommand_IsFlagSet, &HConCommand_IsFlagSet);
}
void DetachConCommandHooks()
{
DetourDetach((LPVOID*)&org_ConCommand_IsFlagSet, &HConCommand_IsFlagSet);
}

7
r5dedicated/concommand.h Normal file
View File

@ -0,0 +1,7 @@
#pragma once
#include "hooks.h"
bool HConCommand_IsFlagSet(int* cmd, int flag);
void AttachConCommandHooks();
void DetachConCommandHooks();

97
r5dedicated/console.cpp Normal file
View File

@ -0,0 +1,97 @@
#include "pch.h"
#include "hooks.h"
#include "console.h"
#include "iconvar.h"
#include "concommand.h"
//#############################################################################
// INITIALIZATION
//#############################################################################
void SetupConsole()
{
///////////////////////////////////////////////////////////////////////////
// Create the console window
if (AllocConsole() == FALSE)
{
OutputDebugString("Failed to create console window!\n");
return;
}
///////////////////////////////////////////////////////////////////////////
// Set the window title
FILE* sBuildTxt;
CHAR sBuildBuf[1024] = { 0 };
fopen_s(&sBuildTxt, "build.txt", "r");
if (sBuildTxt)
{
while (fgets(sBuildBuf, sizeof(sBuildBuf), sBuildTxt) != NULL)
{
fclose(sBuildTxt);
}
}
SetConsoleTitle(sBuildBuf);
///////////////////////////////////////////////////////////////////////////
// Open input/output streams
FILE* fDummy;
freopen_s(&fDummy, "CONIN$", "r", stdin);
freopen_s(&fDummy, "CONOUT$", "w", stdout);
freopen_s(&fDummy, "CONOUT$", "w", stderr);
///////////////////////////////////////////////////////////////////////////
// Create a worker thread to process console commands
DWORD threadId0;
DWORD __stdcall ProcessConsoleWorker(LPVOID);
HANDLE hThread0 = CreateThread(NULL, 0, ProcessConsoleWorker, NULL, 0, &threadId0);
if (hThread0)
{
printf("THREAD ID: %ld\n\n", threadId0);
CloseHandle(hThread0);
}
}
//#############################################################################
// WORKER THREAD
//#############################################################################
DWORD __stdcall ProcessConsoleWorker(LPVOID)
{
// Loop forever
while (true)
{
std::string sCommand;
///////////////////////////////////////////////////////////////////////
// Get the user input on the debug console
printf(">");
std::getline(std::cin, sCommand);
///////////////////////////////////////////////////////////////////////
// Engine toggles
if (sCommand == "toggle net") { ToggleNetTrace(); continue; }
if (sCommand == "toggle dev") { ToggleDevCommands(); continue; }
if (sCommand == "toggle fal") { g_bReturnAllFalse = !g_bReturnAllFalse; continue; }
///////////////////////////////////////////////////////////////////////
// Debug toggles
if (sCommand == "pattern test") { PrintHAddress(); /*PrintOAddress();*/ continue; }
if (sCommand == "console test") { g_bDebugConsole = !g_bDebugConsole; continue; }
///////////////////////////////////////////////////////////////////////
// Exec toggles
if (sCommand == "1") { org_CommandExecute(NULL, "exec autoexec_dev"); }
if (sCommand == "2") { g_bDebugLoading = !g_bDebugLoading; continue; }
///////////////////////////////////////////////////////////////////////
// Execute the command in the r5 SQVM
org_CommandExecute(NULL, sCommand.c_str());
sCommand.clear();
///////////////////////////////////////////////////////////////////////
// Sleep and loop
Sleep(50);
}
return 0;
}

5
r5dedicated/console.h Normal file
View File

@ -0,0 +1,5 @@
#pragma once
#include "pch.h"
void SetupConsole();
void ToggleDevCommands();

View File

@ -0,0 +1,42 @@
#include "pch.h"
#include "cvengineserver.h"
//-----------------------------------------------------------------------------
// Sets the persistence var in the playerstruct to ready for each client
//-----------------------------------------------------------------------------
bool HPersistence_IsAvailable(__int64 thisptr, int client)
{
static bool isPersistenceVarSet[256];
// TODO: Maybe not hardcode
std::uintptr_t playerStructBase = 0x16073B200;
std::uintptr_t playerStructSize = 0x4A4C0;
std::uintptr_t persistenceVar = 0x5BC;
std::uintptr_t targetPlayerStruct = playerStructBase + client * playerStructSize;
*(char*)(targetPlayerStruct + persistenceVar) = (char)0x5;
if (!isPersistenceVarSet[client])
{
printf("\n");
printf("##################################################\n");
printf("] SETTING PERSISTENCE VAR FOR CLIENT #%d\n", client);
printf("##################################################\n");
printf("\n");
isPersistenceVarSet[client] = true;
}
///////////////////////////////////////////////////////////////////////////
return org_Persistence_IsAvailable(thisptr, client);
}
void AttachCEngineServerHooks()
{
DetourAttach((LPVOID*)&org_Persistence_IsAvailable, &HPersistence_IsAvailable);
}
void DetachCEngineServerHooks()
{
DetourDetach((LPVOID*)&org_Persistence_IsAvailable, &HPersistence_IsAvailable);
}

View File

@ -0,0 +1,8 @@
#pragma once
#include "pch.h"
#include "hooks.h"
bool HPersistence_IsAvailable(__int64 thisptr, int client);
void AttachCEngineServerHooks();
void DetachCEngineServerHooks();

49
r5dedicated/dllmain.cpp Normal file
View File

@ -0,0 +1,49 @@
#include "pch.h"
#include "dllmain.h"
#include "hooks.h"
#include "console.h"
//#############################################################################
// INITIALIZATION
//#############################################################################
void InitializeR5Dedicated()
{
SetupConsole();
InstallHooks();
printf("+-----------------------------------------------------------------------------+\n");
printf("| R5 DEDICATED SERVER --------------------------------------------------- |\n");
printf("+-----------------------------------------------------------------------------+\n");
printf("\n");
}
void TerminateR5Dedicated()
{
FreeConsole();
RemoveHooks();
}
//#############################################################################
// ENTRYPOINT
//#############################################################################
BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReason, LPVOID lpReserved)
{
switch (dwReason)
{
case DLL_PROCESS_ATTACH:
{
InitializeR5Dedicated();
break;
}
case DLL_PROCESS_DETACH:
{
TerminateR5Dedicated();
break;
}
}
return TRUE;
}

5
r5dedicated/dllmain.h Normal file
View File

@ -0,0 +1,5 @@
#pragma once
__declspec(dllexport) void DummyExport()
{
// Required for detours.
}

134
r5dedicated/hooks.cpp Normal file
View File

@ -0,0 +1,134 @@
#include "pch.h"
#include "hooks.h"
#include "iconvar.h"
#include "concommand.h"
#include "cvengineserver.h"
#include "cnetchan.h"
#include "sqvm.h"
#include "msgbox.h"
#include "opcodes.h"
//#################################################################################
// MANAGEMENT
//#################################################################################
void InstallHooks()
{
///////////////////////////////////////////////////////////////////////////////
// Begin the detour transaction, to hook the the process
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
///////////////////////////////////////////////////////////////////////////////
// Hook functions
AttachIConVarHooks();
AttachConCommandHooks();
AttachCEngineServerHooks();
AttachSQVMHooks();
AttachMSGBoxHooks();
///////////////////////////////////////////////////////////////////////////////
// Commit the transaction
if (DetourTransactionCommit() != NO_ERROR)
{
// Failed to hook into the process, terminate
TerminateProcess(GetCurrentProcess(), 0xBAD0C0DE);
}
InstallOpcodes();
}
void RemoveHooks()
{
///////////////////////////////////////////////////////////////////////////////
// Begin the detour transaction, to unhook the the process
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
///////////////////////////////////////////////////////////////////////////////
// Unhook functions
DetachIConVarHooks();
DetachConCommandHooks();
DetachCEngineServerHooks();
DetachSQVMHooks();
DetachMSGBoxHooks();
///////////////////////////////////////////////////////////////////////////////
// Commit the transaction
DetourTransactionCommit();
}
//#################################################################################
// TOGGLES
//#################################################################################
void ToggleDevCommands()
{
static bool bDev = true;
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
if (!bDev)
{
AttachIConVarHooks();
AttachConCommandHooks();
printf("\n");
printf("+--------------------------------------------------------+\n");
printf("|>>>>>>>>>>>>>| DEVONLY COMMANDS ACTIVATED |<<<<<<<<<<<<<|\n");
printf("+--------------------------------------------------------+\n");
printf("\n");
}
else
{
DetachIConVarHooks();
DetachConCommandHooks();
printf("\n");
printf("+--------------------------------------------------------+\n");
printf("|>>>>>>>>>>>>| DEVONLY COMMANDS DEACTIVATED |<<<<<<<<<<<<|\n");
printf("+--------------------------------------------------------+\n");
printf("\n");
}
if (DetourTransactionCommit() != NO_ERROR)
{
TerminateProcess(GetCurrentProcess(), 0xBAD0C0DE);
}
bDev = !bDev;
}
void ToggleNetTrace()
{
static bool bNet = true;
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
if (!bNet)
{
AttachCNetChanHooks();
printf("\n");
printf("+--------------------------------------------------------+\n");
printf("|>>>>>>>>>>>>>| NETCHANNEL TRACE ACTIVATED |<<<<<<<<<<<<<|\n");
printf("+--------------------------------------------------------+\n");
printf("\n");
}
else
{
DetachCNetChanHooks();
printf("\n");
printf("+--------------------------------------------------------+\n");
printf("|>>>>>>>>>>>>| NETCHANNEL TRACE DEACTIVATED |<<<<<<<<<<<<|\n");
printf("+--------------------------------------------------------+\n");
printf("\n");
}
if (DetourTransactionCommit() != NO_ERROR)
{
TerminateProcess(GetCurrentProcess(), 0xBAD0C0DE);
}
bNet = !bNet;
}

89
r5dedicated/hooks.h Normal file
View File

@ -0,0 +1,89 @@
#pragma once
#include "pch.h"
#include "iconvar.h"
#include "concommand.h"
#include "cvengineserver.h"
#include "cnetchan.h"
#include "sqvm.h"
#include "msgbox.h"
// Define the signatures or offsets to be searched and hooked
namespace
{
Module r5_patterns = Module("r5apex.exe"); // Create module class instance.
#pragma region Console
/*0x140202090*/
FUNC_AT_ADDRESS(org_CommandExecute, void(*)(void*, const char*), r5_patterns.PatternSearch("48 89 5C 24 ? 57 48 83 EC 20 48 8D 0D ? ? ? ? 41 8B D8").GetPtr());
/*0x14046FE90*/
FUNC_AT_ADDRESS(org_IConVar_IsFlagSet, bool(*)(int**, int), r5_patterns.PatternSearch("48 8B 41 48 85 50 38").GetPtr());
/*0x14046F490*/
FUNC_AT_ADDRESS(org_ConCommand_IsFlagSet, bool(*)(int*, int), r5_patterns.PatternSearch("85 51 38 0F 95 C0 C3").GetPtr());
#pragma endregion
#pragma region Squirrel
/*0x141057FD0*/
FUNC_AT_ADDRESS(org_SQVM_PrintFunc, void*, r5_patterns.PatternSearch("83 F8 01 48 8D 3D ? ? ? ?").OffsetSelf(0x3).FollowNearCallSelf(0x3, 0x7).GetPtr());
//DWORD64 p_SQVM_LoadScript = FindPattern("r5apex.exe", (const unsigned char*)"\x48\x89\x5C\x24\x10\x48\x89\x74\x24\x18\x48\x89\x7C\x24\x20\x48\x89\x4C\x24\x08\x55\x41\x54\x41\x55\x41\x56\x41\x57\x48\x8D\x6C", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"); // For S0 and S1
/*0x141055630*/
// For anything S2 and above (current S8
FUNC_AT_ADDRESS(org_SQVM_LoadScript, bool(*)(void*, const char*, const char*, int), r5_patterns.PatternSearch("48 8B C4 48 89 48 08 55 41 56 48 8D 68").GetPtr());
/*0x140C957E0*/
FUNC_AT_ADDRESS(org_SQVM_LoadRson, int(*)(const char*), r5_patterns.PatternSearch("4C 8B DC 49 89 5B 08 57 48 81 EC A0 00 00 00 33").GetPtr());
#pragma endregion
#pragma region NetChannel
/*0x1402655F0*/
FUNC_AT_ADDRESS(org_NET_ReceiveDatagram, bool(*)(int, void*, bool), r5_patterns.PatternSearch("48 89 74 24 18 48 89 7C 24 20 55 41 54 41 55 41 56 41 57 48 8D AC 24 50 EB").GetPtr());
/*0x1402662D0*/
FUNC_AT_ADDRESS(org_NET_SendDatagram, int(*)(SOCKET, const char*, int, int), r5_patterns.PatternSearch("48 89 5C 24 08 48 89 6C 24 10 48 89 74 24 18 57 41 56 41 57 48 81 EC ? 05 ? ?").GetPtr());
#pragma endregion
#pragma region CHLClient
/*0x1405C0740*/
FUNC_AT_ADDRESS(org_CHLClient_FrameStageNotify, void(*)(void* rcx, int curStage), r5_patterns.PatternSearch("48 83 EC 28 89 15 ?? ?? ?? ??").GetPtr());
#pragma endregion
#pragma region CVEngineServer
/*0x140315CF0*/
FUNC_AT_ADDRESS(org_Persistence_IsAvailable, bool(*)(__int64, int), r5_patterns.PatternSearch("3B 15 ?? ?? ?? ?? 7D 33").GetPtr());
#pragma endregion
#pragma region Utility
/*0x140295600*/
FUNC_AT_ADDRESS(org_MSG_EngineError, int(*)(char*, va_list), r5_patterns.PatternSearch("48 89 5C 24 08 48 89 74 24 10 57 48 81 EC 30 08 00 00 48 8B DA").GetPtr());
#pragma endregion
inline bool g_bDebugConsole = false;
inline bool g_bReturnAllFalse = false;
inline bool g_bDebugLoading = false;
void PrintHAddress() // Test the sigscan results
{
std::cout << "+--------------------------------------------------------+" << std::endl;
PRINT_ADDRESS("CommandExecute", org_CommandExecute);
PRINT_ADDRESS("IConVar_IsFlagSet", org_IConVar_IsFlagSet);
PRINT_ADDRESS("ConCommand_IsFlagSet", org_ConCommand_IsFlagSet);
PRINT_ADDRESS("SQVM_Print", org_SQVM_PrintFunc);
PRINT_ADDRESS("SQVM_LoadScript", org_SQVM_LoadScript);
PRINT_ADDRESS("SQVM_LoadRson", org_SQVM_LoadRson);
PRINT_ADDRESS("NET_ReceiveDatagram", org_NET_ReceiveDatagram);
PRINT_ADDRESS("NET_SendDatagram ", org_NET_SendDatagram);
PRINT_ADDRESS("CHLClient::FrameStageNotify", org_CHLClient_FrameStageNotify);
PRINT_ADDRESS("CVEngineServer::Persistence_IsAvailable", org_Persistence_IsAvailable);
PRINT_ADDRESS("MSG_EngineError", org_MSG_EngineError);
std::cout << "+--------------------------------------------------------+" << std::endl;
// TODO implement error handling when sigscan fails or result is 0
}
}
void InstallHooks();
void RemoveHooks();
void ToggleDevCommands();
void ToggleNetTrace();

39
r5dedicated/iconvar.cpp Normal file
View File

@ -0,0 +1,39 @@
#include "pch.h"
#include "iconvar.h"
//-----------------------------------------------------------------------------
// Purpose: test each ConVar query before setting the cvar
// Input : **cvar - flag
// Output : true if change is not permitted, false if permitted
//-----------------------------------------------------------------------------
bool HConVar_IsFlagSet(int** cvar, int flag)
{
int real_flags = *(*(cvar + (72 / (sizeof(void*)))) + (56 / sizeof(int)));
if (g_bDebugConsole)
{
printf("--------------------------------------------------\n");
printf(" Flaged: %08X\n", real_flags);
}
// Mask off FCVAR_CHEATS and FCVAR_DEVELOPMENTONLY
real_flags &= 0xFFFFBFFD;
if (g_bDebugConsole)
{
printf(" Masked: %08X\n", real_flags);
printf(" Verify: %08X\n", flag);
printf("--------------------------------------------------\n");
}
if (flag & 0x80000) { return true; }
if (!g_bReturnAllFalse) { return (real_flags & flag) != 0; }
else { return false; } // Returning false on all queries may cause problems
}
void AttachIConVarHooks()
{
DetourAttach((LPVOID*)&org_IConVar_IsFlagSet, &HConVar_IsFlagSet);
}
void DetachIConVarHooks()
{
DetourDetach((LPVOID*)&org_IConVar_IsFlagSet, &HConVar_IsFlagSet);
}

7
r5dedicated/iconvar.h Normal file
View File

@ -0,0 +1,7 @@
#pragma once
#include "hooks.h"
bool HConVar_IsFlagSet(int** cvar, int flag);
void AttachIConVarHooks();
void DetachIConVarHooks();

24
r5dedicated/msgbox.cpp Normal file
View File

@ -0,0 +1,24 @@
#include "pch.h"
#include "hooks.h"
//-----------------------------------------------------------------------------
// Engine Error message box
//-----------------------------------------------------------------------------
int HMSG_EngineError(char* fmt, va_list args)
{
printf("\nENGINE ERROR #####################################\n");
vprintf(fmt, args);
///////////////////////////////////////////////////////////////////////////
return org_MSG_EngineError(fmt, args);
}
void AttachMSGBoxHooks()
{
DetourAttach((LPVOID*)&org_MSG_EngineError, &HMSG_EngineError);
}
void DetachMSGBoxHooks()
{
DetourDetach((LPVOID*)&org_MSG_EngineError, &HMSG_EngineError);
}

7
r5dedicated/msgbox.h Normal file
View File

@ -0,0 +1,7 @@
#pragma once
#include "hooks.h"
int HMSG_EngineError(char* fmt, va_list args);
void AttachMSGBoxHooks();
void DetachMSGBoxHooks();

29
r5dedicated/opcodes.cpp Normal file
View File

@ -0,0 +1,29 @@
#include "pch.h"
#include "opcodes.h"
/*-----------------------------------------------------------------------------
* _opcodes.cpp
*-----------------------------------------------------------------------------*/
void InstallOpcodes() /* .TEXT */
{
//-------------------------------------------------------------------------
// JNZ --> JMP | Prevent OriginSDK from initializing on the client
//Origin_Init.Offset(0x0B).Patch({ 0xE9, 0x63, 0x02, 0x00, 0x00, 0x00 });
//Origin_SetState.Offset(0x0E).Patch({ 0xE9, 0xCB, 0x03, 0x00, 0x00 });
//-------------------------------------------------------------------------
// JNE --> JMP | Allow games to be loaded without the optional texture streaming file
dst002.Offset(0x8E5).Patch({ 0xEB, 0x19 });
//-------------------------------------------------------------------------
// JNE --> JMP | Prevent connect command from crashing by invalid call to UI function
dst004.Offset(0x1D6).Patch({ 0xEB, 0x27 });
//-------------------------------------------------------------------------
// JNE --> JMP | Prevent connect localhost from being executed after listenserver init
//Host_NewGame.Offset(0x637).Patch({ 0xE9, 0xC1, 0x00, 0x00, 0x00});
//-------------------------------------------------------------------------
// JA --> JMP | Disable server-side verification for duplicate accounts on the server
CServer_Auth.Offset(0x284).Patch({ 0x90, 0x90 });
//-------------------------------------------------------------------------
// JA --> JMP | Prevent FairFight anti-cheat from initializing on the server
FairFight_Init.Offset(0x61).Patch({ 0xE9, 0xED, 0x00, 0x00, 0x00, 0x00 });
}

53
r5dedicated/opcodes.h Normal file
View File

@ -0,0 +1,53 @@
#pragma once
void InstallOpcodes();
inline HANDLE GameProcess = GetCurrentProcess();
namespace
{
Module r5_op = Module("r5apex.exe"); // Create module class instance.
#pragma region Origin
/*0x14032EEA0*/
MemoryAddress Origin_Init = r5_op.PatternSearch("48 83 EC 28 80 3D ? ? ? 23 ? 0F 85 ? 02 ?");
/*0x140330290*/
MemoryAddress Origin_SetState = r5_op.PatternSearch("48 81 EC 58 04 ? ? 80 3D ? ? ? ? ? 0F 84");
#pragma endregion
#pragma region Engine
/*0x14043FB90*/
MemoryAddress dst002 = r5_op.PatternSearch("48 89 4C 24 08 56 41 55 48 81 EC 68 03 ? ? 4C");
/*0x14022A4A0*/
MemoryAddress dst004 = r5_op.PatternSearch("48 83 EC 38 0F 29 74 24 20 48 89 5C 24 40 48 8B");
/*0x140238DA0*/
MemoryAddress Host_NewGame = r5_op.PatternSearch("48 8B C4 ? 41 54 41 ? 48 81 EC ? ? ? ? F2");
#pragma endregion
#pragma region NetChannel
/*0x14030D000*/
MemoryAddress CServer_Auth = r5_op.PatternSearch("40 55 57 41 55 41 57 48 8D AC 24 ? ? ? ?");
#pragma endregion
#pragma region FairFight
/*0x140303AE0*/
MemoryAddress FairFight_Init = r5_op.PatternSearch("40 53 48 83 EC 20 8B 81 B0 03 ? ? 48 8B D9 C6");
#pragma endregion
void PrintOAddress() // Test the sigscan results
{
std::cout << "+--------------------------------------------------------+" << std::endl;
PRINT_ADDRESS("Origin_Init", Origin_Init.GetPtr());
PRINT_ADDRESS("Origin_SetState", Origin_SetState.GetPtr());
PRINT_ADDRESS("dst002", dst002.GetPtr());
PRINT_ADDRESS("dst004", dst004.GetPtr());
PRINT_ADDRESS("Host_NewGame", Host_NewGame.GetPtr());
PRINT_ADDRESS("CServer_Auth", CServer_Auth.GetPtr());
PRINT_ADDRESS("FairFight_Init", FairFight_Init.GetPtr());
std::cout << "+--------------------------------------------------------+" << std::endl;
// TODO implement error handling when sigscan fails or result is 0
}
}

1
r5dedicated/pch.cpp Normal file
View File

@ -0,0 +1 @@
#include "pch.h"

39
r5dedicated/pch.h Normal file
View File

@ -0,0 +1,39 @@
#pragma once
#pragma message("Pre-compiling DEDICATED headers.\n")
#define WIN32_LEAN_AND_MEAN // Prevent winsock2 redefinition.
#include <windows.h>
#include <detours.h>
#include <WinSock2.h>
#include <thread>
#include <fstream>
#include <stdio.h>
#include <filesystem>
#include <sstream>
#include <shlobj.h>
#include <objbase.h>
#include <cassert>
#include <iomanip>
#include <iostream>
#include <string>
#include <Psapi.h>
#include <vector>
// Our headers
#include "spdlog.h"
#include "sinks/basic_file_sink.h"
#include "utility.h"
//#include "httplib.h"
//#include "json.hpp"
#include "address.h"
#pragma once
#define FUNC_AT_ADDRESS(name, funcbody, addr) \
using _##name = funcbody; \
_##name name = (funcbody)addr \
#define PRINT_ADDRESS(name, address) std::cout << name << ": " << std::hex << std::uppercase << address << std::endl;

View File

@ -0,0 +1,4 @@
LIBRARY dedicated
EXPORTS
DummyExport @1

View File

@ -0,0 +1,305 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<VCProjectVersion>16.0</VCProjectVersion>
<Keyword>Win32Proj</Keyword>
<ProjectGuid>{71988d92-343c-49ab-b52b-0ae0e83b0401}</ProjectGuid>
<RootNamespace>r5dedicated</RootNamespace>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="Shared">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental>
<TargetName>dedicated</TargetName>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
<TargetName>dedicated</TargetName>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<LinkIncremental>true</LinkIncremental>
<TargetName>dedicated</TargetName>
<IncludePath>$(VC_IncludePath);$(WindowsSDK_IncludePath);$(SolutionDir)external\detours\include;$(SolutionDir)external\spdlog\include;$(SolutionDir)shared\include;$(SolutionDir)r5dedicated;$(IncludePath)</IncludePath>
<LibraryPath>$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64);$(SolutionDir)external\detours\libs;$(LibraryPath)</LibraryPath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental>
<TargetName>dedicated</TargetName>
<IncludePath>$(VC_IncludePath);$(WindowsSDK_IncludePath);$(SolutionDir)external\detours\include;$(SolutionDir)external\spdlog\include;$(SolutionDir)shared\include;$(SolutionDir)r5dedicated;$(IncludePath)</IncludePath>
<LibraryPath>$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64);$(SolutionDir)external\detours\libs;$(LibraryPath)</LibraryPath>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<LanguageStandard>Default</LanguageStandard>
<LanguageStandard_C>Default</LanguageStandard_C>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<LanguageStandard>Default</LanguageStandard>
<LanguageStandard_C>Default</LanguageStandard_C>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<LanguageStandard>stdcpp17</LanguageStandard>
<LanguageStandard_C>stdc17</LanguageStandard_C>
<PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<PrecompiledHeaderOutputFile>$(IntDir)$(TargetName).pch</PrecompiledHeaderOutputFile>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>detours.lib;%(AdditionalDependencies)</AdditionalDependencies>
<ModuleDefinitionFile>r5dedicated.def</ModuleDefinitionFile>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<LanguageStandard>stdcpp17</LanguageStandard>
<LanguageStandard_C>stdc17</LanguageStandard_C>
<InlineFunctionExpansion>Disabled</InlineFunctionExpansion>
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
<EnableFiberSafeOptimizations>false</EnableFiberSafeOptimizations>
<StringPooling>true</StringPooling>
<PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<PrecompiledHeaderOutputFile>$(IntDir)$(TargetName).pch</PrecompiledHeaderOutputFile>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>detours.lib;%(AdditionalDependencies)</AdditionalDependencies>
<ModuleDefinitionFile>r5dedicated.def</ModuleDefinitionFile>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="..\shared\utility.cpp" />
<ClCompile Include="concommand.cpp" />
<ClCompile Include="console.cpp" />
<ClCompile Include="dllmain.cpp" />
<ClCompile Include="hooks.cpp" />
<ClCompile Include="iconvar.cpp" />
<ClCompile Include="msgbox.cpp" />
<ClCompile Include="cnetchan.cpp" />
<ClCompile Include="opcodes.cpp" />
<ClCompile Include="pch.cpp">
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
</ClCompile>
<ClCompile Include="cvengineserver.cpp" />
<ClCompile Include="sqvm.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\external\spdlog\include\async.h" />
<ClInclude Include="..\external\spdlog\include\async_logger-inl.h" />
<ClInclude Include="..\external\spdlog\include\async_logger.h" />
<ClInclude Include="..\external\spdlog\include\cfg\argv.h" />
<ClInclude Include="..\external\spdlog\include\cfg\env.h" />
<ClInclude Include="..\external\spdlog\include\cfg\helpers-inl.h" />
<ClInclude Include="..\external\spdlog\include\cfg\helpers.h" />
<ClInclude Include="..\external\spdlog\include\common-inl.h" />
<ClInclude Include="..\external\spdlog\include\common.h" />
<ClInclude Include="..\external\spdlog\include\details\backtracer-inl.h" />
<ClInclude Include="..\external\spdlog\include\details\backtracer.h" />
<ClInclude Include="..\external\spdlog\include\details\circular_q.h" />
<ClInclude Include="..\external\spdlog\include\details\console_globals.h" />
<ClInclude Include="..\external\spdlog\include\details\file_helper-inl.h" />
<ClInclude Include="..\external\spdlog\include\details\file_helper.h" />
<ClInclude Include="..\external\spdlog\include\details\fmt_helper.h" />
<ClInclude Include="..\external\spdlog\include\details\log_msg-inl.h" />
<ClInclude Include="..\external\spdlog\include\details\log_msg.h" />
<ClInclude Include="..\external\spdlog\include\details\log_msg_buffer-inl.h" />
<ClInclude Include="..\external\spdlog\include\details\log_msg_buffer.h" />
<ClInclude Include="..\external\spdlog\include\details\mpmc_blocking_q.h" />
<ClInclude Include="..\external\spdlog\include\details\null_mutex.h" />
<ClInclude Include="..\external\spdlog\include\details\os-inl.h" />
<ClInclude Include="..\external\spdlog\include\details\os.h" />
<ClInclude Include="..\external\spdlog\include\details\periodic_worker-inl.h" />
<ClInclude Include="..\external\spdlog\include\details\periodic_worker.h" />
<ClInclude Include="..\external\spdlog\include\details\registry-inl.h" />
<ClInclude Include="..\external\spdlog\include\details\registry.h" />
<ClInclude Include="..\external\spdlog\include\details\synchronous_factory.h" />
<ClInclude Include="..\external\spdlog\include\details\tcp_client-windows.h" />
<ClInclude Include="..\external\spdlog\include\details\tcp_client.h" />
<ClInclude Include="..\external\spdlog\include\details\thread_pool-inl.h" />
<ClInclude Include="..\external\spdlog\include\details\thread_pool.h" />
<ClInclude Include="..\external\spdlog\include\details\windows_include.h" />
<ClInclude Include="..\external\spdlog\include\fmt\bin_to_hex.h" />
<ClInclude Include="..\external\spdlog\include\fmt\bundled\args.h" />
<ClInclude Include="..\external\spdlog\include\fmt\bundled\chrono.h" />
<ClInclude Include="..\external\spdlog\include\fmt\bundled\color.h" />
<ClInclude Include="..\external\spdlog\include\fmt\bundled\compile.h" />
<ClInclude Include="..\external\spdlog\include\fmt\bundled\core.h" />
<ClInclude Include="..\external\spdlog\include\fmt\bundled\format-inl.h" />
<ClInclude Include="..\external\spdlog\include\fmt\bundled\format.h" />
<ClInclude Include="..\external\spdlog\include\fmt\bundled\locale.h" />
<ClInclude Include="..\external\spdlog\include\fmt\bundled\os.h" />
<ClInclude Include="..\external\spdlog\include\fmt\bundled\ostream.h" />
<ClInclude Include="..\external\spdlog\include\fmt\bundled\printf.h" />
<ClInclude Include="..\external\spdlog\include\fmt\bundled\ranges.h" />
<ClInclude Include="..\external\spdlog\include\fmt\bundled\xchar.h" />
<ClInclude Include="..\external\spdlog\include\fmt\chrono.h" />
<ClInclude Include="..\external\spdlog\include\fmt\fmt.h" />
<ClInclude Include="..\external\spdlog\include\fmt\ostr.h" />
<ClInclude Include="..\external\spdlog\include\fmt\xchar.h" />
<ClInclude Include="..\external\spdlog\include\formatter.h" />
<ClInclude Include="..\external\spdlog\include\fwd.h" />
<ClInclude Include="..\external\spdlog\include\logger-inl.h" />
<ClInclude Include="..\external\spdlog\include\logger.h" />
<ClInclude Include="..\external\spdlog\include\pattern_formatter-inl.h" />
<ClInclude Include="..\external\spdlog\include\pattern_formatter.h" />
<ClInclude Include="..\external\spdlog\include\sinks\android_sink.h" />
<ClInclude Include="..\external\spdlog\include\sinks\ansicolor_sink-inl.h" />
<ClInclude Include="..\external\spdlog\include\sinks\ansicolor_sink.h" />
<ClInclude Include="..\external\spdlog\include\sinks\base_sink-inl.h" />
<ClInclude Include="..\external\spdlog\include\sinks\base_sink.h" />
<ClInclude Include="..\external\spdlog\include\sinks\basic_file_sink-inl.h" />
<ClInclude Include="..\external\spdlog\include\sinks\basic_file_sink.h" />
<ClInclude Include="..\external\spdlog\include\sinks\daily_file_sink.h" />
<ClInclude Include="..\external\spdlog\include\sinks\dist_sink.h" />
<ClInclude Include="..\external\spdlog\include\sinks\dup_filter_sink.h" />
<ClInclude Include="..\external\spdlog\include\sinks\hourly_file_sink.h" />
<ClInclude Include="..\external\spdlog\include\sinks\mongo_sink.h" />
<ClInclude Include="..\external\spdlog\include\sinks\msvc_sink.h" />
<ClInclude Include="..\external\spdlog\include\sinks\null_sink.h" />
<ClInclude Include="..\external\spdlog\include\sinks\ostream_sink.h" />
<ClInclude Include="..\external\spdlog\include\sinks\qt_sinks.h" />
<ClInclude Include="..\external\spdlog\include\sinks\ringbuffer_sink.h" />
<ClInclude Include="..\external\spdlog\include\sinks\rotating_file_sink-inl.h" />
<ClInclude Include="..\external\spdlog\include\sinks\rotating_file_sink.h" />
<ClInclude Include="..\external\spdlog\include\sinks\sink-inl.h" />
<ClInclude Include="..\external\spdlog\include\sinks\sink.h" />
<ClInclude Include="..\external\spdlog\include\sinks\stdout_color_sinks-inl.h" />
<ClInclude Include="..\external\spdlog\include\sinks\stdout_color_sinks.h" />
<ClInclude Include="..\external\spdlog\include\sinks\stdout_sinks-inl.h" />
<ClInclude Include="..\external\spdlog\include\sinks\stdout_sinks.h" />
<ClInclude Include="..\external\spdlog\include\sinks\syslog_sink.h" />
<ClInclude Include="..\external\spdlog\include\sinks\systemd_sink.h" />
<ClInclude Include="..\external\spdlog\include\sinks\tcp_sink.h" />
<ClInclude Include="..\external\spdlog\include\sinks\wincolor_sink-inl.h" />
<ClInclude Include="..\external\spdlog\include\sinks\wincolor_sink.h" />
<ClInclude Include="..\external\spdlog\include\sinks\win_eventlog_sink.h" />
<ClInclude Include="..\external\spdlog\include\spdlog-inl.h" />
<ClInclude Include="..\external\spdlog\include\spdlog.h" />
<ClInclude Include="..\external\spdlog\include\stopwatch.h" />
<ClInclude Include="..\external\spdlog\include\tweakme.h" />
<ClInclude Include="..\external\spdlog\include\version.h" />
<ClInclude Include="..\shared\include\address.h" />
<ClInclude Include="..\shared\include\httplib.h" />
<ClInclude Include="..\shared\include\json.hpp" />
<ClInclude Include="..\shared\include\utility.h" />
<ClInclude Include="concommand.h" />
<ClInclude Include="console.h" />
<ClInclude Include="dllmain.h" />
<ClInclude Include="hooks.h" />
<ClInclude Include="iconvar.h" />
<ClInclude Include="msgbox.h" />
<ClInclude Include="cnetchan.h" />
<ClInclude Include="opcodes.h" />
<ClInclude Include="pch.h" />
<ClInclude Include="cvengineserver.h" />
<ClInclude Include="sqvm.h" />
</ItemGroup>
<ItemGroup>
<None Include="r5dev.def" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

View File

@ -0,0 +1,438 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="core">
<UniqueIdentifier>{b5a2491a-0f04-4b55-bc24-bbdd9cd6fc2e}</UniqueIdentifier>
</Filter>
<Filter Include="shared">
<UniqueIdentifier>{ef65ed91-551f-4f5d-b2a9-efc26e1af0f6}</UniqueIdentifier>
</Filter>
<Filter Include="hooks">
<UniqueIdentifier>{22b58a18-d1d7-4e3e-b5de-d9338f3177d3}</UniqueIdentifier>
</Filter>
<Filter Include="core\include">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
</Filter>
<Filter Include="shared\include">
<UniqueIdentifier>{a0165b58-06b1-4b6a-b5d1-5d643517ad14}</UniqueIdentifier>
</Filter>
<Filter Include="hooks\iconvar">
<UniqueIdentifier>{06affed3-5a59-4b95-88ca-72d92c91909b}</UniqueIdentifier>
</Filter>
<Filter Include="hooks\concommand">
<UniqueIdentifier>{0742106d-702f-499e-99f1-e43f2a6ae561}</UniqueIdentifier>
</Filter>
<Filter Include="hooks\cvengineserver">
<UniqueIdentifier>{338a4fb7-7519-4628-9206-679d33824965}</UniqueIdentifier>
</Filter>
<Filter Include="hooks\other">
<UniqueIdentifier>{cc424eef-0c7a-4fb0-9d84-30bf8db2e253}</UniqueIdentifier>
</Filter>
<Filter Include="hooks\squirrel">
<UniqueIdentifier>{74afa89f-72af-4e13-aa90-70f7a1957154}</UniqueIdentifier>
</Filter>
<Filter Include="core\resource">
<UniqueIdentifier>{35b40ed1-12bd-4bcf-9c05-5a42a0096619}</UniqueIdentifier>
</Filter>
<Filter Include="hooks\netchannel">
<UniqueIdentifier>{05e6e9a7-801b-49b0-9c5a-21c4868befb7}</UniqueIdentifier>
</Filter>
<Filter Include="shared\libraries">
<UniqueIdentifier>{a7199092-e8a9-49fa-97e1-b2d0ea21001b}</UniqueIdentifier>
</Filter>
<Filter Include="shared\libraries\spdlog">
<UniqueIdentifier>{bd5aef1a-dad8-45a0-85f2-82bc8f86bed8}</UniqueIdentifier>
</Filter>
<Filter Include="shared\libraries\spdlog\include">
<UniqueIdentifier>{c947552e-2623-4672-b3fa-3b50fe819628}</UniqueIdentifier>
</Filter>
<Filter Include="shared\libraries\spdlog\include\cfg">
<UniqueIdentifier>{19dd0a10-5185-4b03-9466-693b86a17dff}</UniqueIdentifier>
</Filter>
<Filter Include="shared\libraries\spdlog\include\details">
<UniqueIdentifier>{cb271201-f518-4dc4-9ab4-5d7f6a54c175}</UniqueIdentifier>
</Filter>
<Filter Include="shared\libraries\spdlog\include\fmt">
<UniqueIdentifier>{12259d0c-172a-4a26-a1d4-5d784f4c3d25}</UniqueIdentifier>
</Filter>
<Filter Include="shared\libraries\spdlog\include\fmt\bundled">
<UniqueIdentifier>{13bdf72b-f7c0-4658-9899-932f31d03da7}</UniqueIdentifier>
</Filter>
<Filter Include="shared\libraries\spdlog\include\sinks">
<UniqueIdentifier>{eaefe9b7-d14d-48b6-878a-53a5ada7454b}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\shared\include\address.h">
<Filter>shared\include</Filter>
</ClInclude>
<ClInclude Include="..\shared\include\httplib.h">
<Filter>shared\include</Filter>
</ClInclude>
<ClInclude Include="..\shared\include\json.hpp">
<Filter>shared\include</Filter>
</ClInclude>
<ClInclude Include="..\shared\include\utility.h">
<Filter>shared\include</Filter>
</ClInclude>
<ClInclude Include="console.h">
<Filter>core\include</Filter>
</ClInclude>
<ClInclude Include="cnetchan.h">
<Filter>hooks\netchannel</Filter>
</ClInclude>
<ClInclude Include="pch.h">
<Filter>core\include</Filter>
</ClInclude>
<ClInclude Include="concommand.h">
<Filter>hooks\concommand</Filter>
</ClInclude>
<ClInclude Include="cvengineserver.h">
<Filter>hooks\cvengineserver</Filter>
</ClInclude>
<ClInclude Include="sqvm.h">
<Filter>hooks\squirrel</Filter>
</ClInclude>
<ClInclude Include="msgbox.h">
<Filter>hooks\other</Filter>
</ClInclude>
<ClInclude Include="hooks.h">
<Filter>hooks</Filter>
</ClInclude>
<ClInclude Include="dllmain.h">
<Filter>core\include</Filter>
</ClInclude>
<ClInclude Include="opcodes.h">
<Filter>hooks\other</Filter>
</ClInclude>
<ClInclude Include="iconvar.h">
<Filter>hooks\iconvar</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\async.h">
<Filter>shared\libraries\spdlog\include</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\async_logger-inl.h">
<Filter>shared\libraries\spdlog\include</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\async_logger.h">
<Filter>shared\libraries\spdlog\include</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\common-inl.h">
<Filter>shared\libraries\spdlog\include</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\common.h">
<Filter>shared\libraries\spdlog\include</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\formatter.h">
<Filter>shared\libraries\spdlog\include</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\fwd.h">
<Filter>shared\libraries\spdlog\include</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\logger-inl.h">
<Filter>shared\libraries\spdlog\include</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\logger.h">
<Filter>shared\libraries\spdlog\include</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\pattern_formatter-inl.h">
<Filter>shared\libraries\spdlog\include</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\pattern_formatter.h">
<Filter>shared\libraries\spdlog\include</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\spdlog-inl.h">
<Filter>shared\libraries\spdlog\include</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\spdlog.h">
<Filter>shared\libraries\spdlog\include</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\stopwatch.h">
<Filter>shared\libraries\spdlog\include</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\tweakme.h">
<Filter>shared\libraries\spdlog\include</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\version.h">
<Filter>shared\libraries\spdlog\include</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\cfg\argv.h">
<Filter>shared\libraries\spdlog\include\cfg</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\cfg\env.h">
<Filter>shared\libraries\spdlog\include\cfg</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\cfg\helpers-inl.h">
<Filter>shared\libraries\spdlog\include\cfg</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\cfg\helpers.h">
<Filter>shared\libraries\spdlog\include\cfg</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\details\backtracer-inl.h">
<Filter>shared\libraries\spdlog\include\details</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\details\backtracer.h">
<Filter>shared\libraries\spdlog\include\details</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\details\circular_q.h">
<Filter>shared\libraries\spdlog\include\details</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\details\console_globals.h">
<Filter>shared\libraries\spdlog\include\details</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\details\file_helper-inl.h">
<Filter>shared\libraries\spdlog\include\details</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\details\file_helper.h">
<Filter>shared\libraries\spdlog\include\details</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\details\fmt_helper.h">
<Filter>shared\libraries\spdlog\include\details</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\details\log_msg-inl.h">
<Filter>shared\libraries\spdlog\include\details</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\details\log_msg.h">
<Filter>shared\libraries\spdlog\include\details</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\details\log_msg_buffer-inl.h">
<Filter>shared\libraries\spdlog\include\details</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\details\log_msg_buffer.h">
<Filter>shared\libraries\spdlog\include\details</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\details\mpmc_blocking_q.h">
<Filter>shared\libraries\spdlog\include\details</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\details\null_mutex.h">
<Filter>shared\libraries\spdlog\include\details</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\details\os-inl.h">
<Filter>shared\libraries\spdlog\include\details</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\details\os.h">
<Filter>shared\libraries\spdlog\include\details</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\details\periodic_worker-inl.h">
<Filter>shared\libraries\spdlog\include\details</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\details\periodic_worker.h">
<Filter>shared\libraries\spdlog\include\details</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\details\registry-inl.h">
<Filter>shared\libraries\spdlog\include\details</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\details\registry.h">
<Filter>shared\libraries\spdlog\include\details</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\details\synchronous_factory.h">
<Filter>shared\libraries\spdlog\include\details</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\details\tcp_client-windows.h">
<Filter>shared\libraries\spdlog\include\details</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\details\tcp_client.h">
<Filter>shared\libraries\spdlog\include\details</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\details\thread_pool-inl.h">
<Filter>shared\libraries\spdlog\include\details</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\details\thread_pool.h">
<Filter>shared\libraries\spdlog\include\details</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\details\windows_include.h">
<Filter>shared\libraries\spdlog\include\details</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\fmt\bin_to_hex.h">
<Filter>shared\libraries\spdlog\include\fmt</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\fmt\chrono.h">
<Filter>shared\libraries\spdlog\include\fmt</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\fmt\fmt.h">
<Filter>shared\libraries\spdlog\include\fmt</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\fmt\ostr.h">
<Filter>shared\libraries\spdlog\include\fmt</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\fmt\xchar.h">
<Filter>shared\libraries\spdlog\include\fmt</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\fmt\bundled\args.h">
<Filter>shared\libraries\spdlog\include\fmt\bundled</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\fmt\bundled\chrono.h">
<Filter>shared\libraries\spdlog\include\fmt\bundled</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\fmt\bundled\color.h">
<Filter>shared\libraries\spdlog\include\fmt\bundled</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\fmt\bundled\compile.h">
<Filter>shared\libraries\spdlog\include\fmt\bundled</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\fmt\bundled\core.h">
<Filter>shared\libraries\spdlog\include\fmt\bundled</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\fmt\bundled\format-inl.h">
<Filter>shared\libraries\spdlog\include\fmt\bundled</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\fmt\bundled\format.h">
<Filter>shared\libraries\spdlog\include\fmt\bundled</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\fmt\bundled\locale.h">
<Filter>shared\libraries\spdlog\include\fmt\bundled</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\fmt\bundled\os.h">
<Filter>shared\libraries\spdlog\include\fmt\bundled</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\fmt\bundled\ostream.h">
<Filter>shared\libraries\spdlog\include\fmt\bundled</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\fmt\bundled\printf.h">
<Filter>shared\libraries\spdlog\include\fmt\bundled</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\fmt\bundled\ranges.h">
<Filter>shared\libraries\spdlog\include\fmt\bundled</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\fmt\bundled\xchar.h">
<Filter>shared\libraries\spdlog\include\fmt\bundled</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\sinks\android_sink.h">
<Filter>shared\libraries\spdlog\include\sinks</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\sinks\ansicolor_sink-inl.h">
<Filter>shared\libraries\spdlog\include\sinks</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\sinks\ansicolor_sink.h">
<Filter>shared\libraries\spdlog\include\sinks</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\sinks\base_sink-inl.h">
<Filter>shared\libraries\spdlog\include\sinks</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\sinks\base_sink.h">
<Filter>shared\libraries\spdlog\include\sinks</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\sinks\basic_file_sink-inl.h">
<Filter>shared\libraries\spdlog\include\sinks</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\sinks\basic_file_sink.h">
<Filter>shared\libraries\spdlog\include\sinks</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\sinks\daily_file_sink.h">
<Filter>shared\libraries\spdlog\include\sinks</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\sinks\dist_sink.h">
<Filter>shared\libraries\spdlog\include\sinks</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\sinks\dup_filter_sink.h">
<Filter>shared\libraries\spdlog\include\sinks</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\sinks\hourly_file_sink.h">
<Filter>shared\libraries\spdlog\include\sinks</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\sinks\mongo_sink.h">
<Filter>shared\libraries\spdlog\include\sinks</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\sinks\msvc_sink.h">
<Filter>shared\libraries\spdlog\include\sinks</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\sinks\null_sink.h">
<Filter>shared\libraries\spdlog\include\sinks</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\sinks\ostream_sink.h">
<Filter>shared\libraries\spdlog\include\sinks</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\sinks\qt_sinks.h">
<Filter>shared\libraries\spdlog\include\sinks</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\sinks\ringbuffer_sink.h">
<Filter>shared\libraries\spdlog\include\sinks</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\sinks\rotating_file_sink-inl.h">
<Filter>shared\libraries\spdlog\include\sinks</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\sinks\rotating_file_sink.h">
<Filter>shared\libraries\spdlog\include\sinks</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\sinks\sink-inl.h">
<Filter>shared\libraries\spdlog\include\sinks</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\sinks\sink.h">
<Filter>shared\libraries\spdlog\include\sinks</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\sinks\stdout_color_sinks-inl.h">
<Filter>shared\libraries\spdlog\include\sinks</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\sinks\stdout_color_sinks.h">
<Filter>shared\libraries\spdlog\include\sinks</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\sinks\stdout_sinks-inl.h">
<Filter>shared\libraries\spdlog\include\sinks</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\sinks\stdout_sinks.h">
<Filter>shared\libraries\spdlog\include\sinks</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\sinks\syslog_sink.h">
<Filter>shared\libraries\spdlog\include\sinks</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\sinks\systemd_sink.h">
<Filter>shared\libraries\spdlog\include\sinks</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\sinks\tcp_sink.h">
<Filter>shared\libraries\spdlog\include\sinks</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\sinks\wincolor_sink-inl.h">
<Filter>shared\libraries\spdlog\include\sinks</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\sinks\wincolor_sink.h">
<Filter>shared\libraries\spdlog\include\sinks</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\sinks\win_eventlog_sink.h">
<Filter>shared\libraries\spdlog\include\sinks</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\shared\utility.cpp">
<Filter>shared</Filter>
</ClCompile>
<ClCompile Include="console.cpp">
<Filter>core</Filter>
</ClCompile>
<ClCompile Include="dllmain.cpp">
<Filter>core</Filter>
</ClCompile>
<ClCompile Include="pch.cpp">
<Filter>core</Filter>
</ClCompile>
<ClCompile Include="hooks.cpp">
<Filter>hooks</Filter>
</ClCompile>
<ClCompile Include="cnetchan.cpp">
<Filter>hooks\netchannel</Filter>
</ClCompile>
<ClCompile Include="concommand.cpp">
<Filter>hooks\concommand</Filter>
</ClCompile>
<ClCompile Include="cvengineserver.cpp">
<Filter>hooks\cvengineserver</Filter>
</ClCompile>
<ClCompile Include="sqvm.cpp">
<Filter>hooks\squirrel</Filter>
</ClCompile>
<ClCompile Include="msgbox.cpp">
<Filter>hooks\other</Filter>
</ClCompile>
<ClCompile Include="opcodes.cpp">
<Filter>hooks\other</Filter>
</ClCompile>
<ClCompile Include="iconvar.cpp">
<Filter>hooks\iconvar</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<None Include="r5dev.def">
<Filter>core\resource</Filter>
</None>
</ItemGroup>
</Project>

100
r5dedicated/sqvm.cpp Normal file
View File

@ -0,0 +1,100 @@
#include "pch.h"
#include "sqvm.h"
//---------------------------------------------------------------------------------
// Print the output of the VM.
// TODO: separate SV CL and UI
//---------------------------------------------------------------------------------
void* HSQVM_PrintFunc(void* sqvm, char* fmt, ...)
{
va_list args;
va_start(args, fmt);
vprintf(fmt, args);
va_end(args);
return NULL;
}
//---------------------------------------------------------------------------------
// Load the include file from the mods directory
//---------------------------------------------------------------------------------
__int64 HSQVM_LoadRson(const char* rson_name)
{
char filepath[MAX_PATH] = { 0 };
sprintf_s(filepath, MAX_PATH, "platform\\%s", rson_name);
// Flip forward slashes in filepath to windows-style backslash
for (int i = 0; i < strlen(filepath); i++)
{
if (filepath[i] == '/')
{
filepath[i] = '\\';
}
}
// Returns the new path if the rson exists on the disk
if (FileExists(filepath) && org_SQVM_LoadRson(rson_name))
{
printf("\n");
printf("##################################################\n");
printf("] '%s'\n", filepath);
printf("##################################################\n");
printf("\n");
return org_SQVM_LoadRson(filepath);
}
printf("\n");
printf("##################################################\n");
printf("] '%s'\n", rson_name);
printf("##################################################\n");
printf("\n");
return org_SQVM_LoadRson(rson_name);
}
//---------------------------------------------------------------------------------
// Load the script file from the mods directory
//---------------------------------------------------------------------------------
bool HSQVM_LoadScript(void* sqvm, const char* script_path, const char* script_name, int flag)
{
char filepath[MAX_PATH] = { 0 };
sprintf_s(filepath, MAX_PATH, "platform\\%s", script_path);
// Flip forward slashes in filepath to windows-style backslash
for (int i = 0; i < strlen(filepath); i++)
{
if (filepath[i] == '/')
{
filepath[i] = '\\';
}
}
if (g_bDebugLoading)
{
printf(" [+] Loading SQVM Script '%s' ...\n", filepath);
}
// Returns true if the script exists on the disk
if (FileExists(filepath) && org_SQVM_LoadScript(sqvm, filepath, script_name, flag))
{
return true;
}
if (g_bDebugLoading)
{
printf(" [!] FAILED. Try SP / VPK for '%s'\n", filepath);
}
///////////////////////////////////////////////////////////////////////////////
return org_SQVM_LoadScript(sqvm, script_path, script_name, flag);
}
void AttachSQVMHooks()
{
DetourAttach((LPVOID*)&org_SQVM_PrintFunc, &HSQVM_PrintFunc);
DetourAttach((LPVOID*)&org_SQVM_LoadRson, &HSQVM_LoadRson);
DetourAttach((LPVOID*)&org_SQVM_LoadScript, &HSQVM_LoadScript);
}
void DetachSQVMHooks()
{
DetourDetach((LPVOID*)&org_SQVM_PrintFunc, &HSQVM_PrintFunc);
DetourDetach((LPVOID*)&org_SQVM_LoadRson, &HSQVM_LoadRson);
DetourDetach((LPVOID*)&org_SQVM_LoadScript, &HSQVM_LoadScript);
}

10
r5dedicated/sqvm.h Normal file
View File

@ -0,0 +1,10 @@
#pragma once
#include "pch.h"
#include "hooks.h"
void* HSQVM_PrintFunc(void* sqvm, char* fmt, ...);
__int64 HSQVM_LoadRson(const char* rson_name);
bool HSQVM_LoadScript(void* sqvm, const char* script_path, const char* script_name, int flag);
void AttachSQVMHooks();
void DetachSQVMHooks();

View File

@ -1,10 +1,10 @@
#pragma once
#pragma message("Pre-compiling headers.\n")
#include "httplib.h"
#define WIN32_LEAN_AND_MEAN // Prevent winsock2 redefinition.
#include <windows.h>
#include <detours.h>
#include <WinSock2.h>
#include <thread>
#include <fstream>
#include <stdio.h>
@ -18,7 +18,6 @@
#include <d3d11.h>
#include <string>
#include <Psapi.h>
#include <sinks/basic_file_sink.h>
#include <vector>
@ -29,7 +28,9 @@
#include "imgui_impl_dx11.h"
#include "imgui_impl_win32.h"
#include "spdlog.h"
#include "sinks/basic_file_sink.h"
#include "utility.h"
#include "httplib.h"
#include "json.hpp"
#include "address.h"

View File

@ -82,12 +82,12 @@
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<LinkIncremental>true</LinkIncremental>
<IncludePath>$(SolutionDir)external\detours\include;$(SolutionDir)external\imgui\include;$(SolutionDir)external\spdlog\include;$(SolutionDir)r5dev\include;$(IncludePath)</IncludePath>
<IncludePath>$(SolutionDir)external\detours\include;$(SolutionDir)external\imgui\include;$(SolutionDir)external\spdlog\include;$(SolutionDir)shared\include;$(SolutionDir)r5dev\include;$(IncludePath)</IncludePath>
<LibraryPath>$(SolutionDir)external\detours\libs;$(LibraryPath)</LibraryPath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental>
<IncludePath>$(SolutionDir)external\detours\include;$(SolutionDir)external\imgui\include;$(SolutionDir)external\spdlog\include;$(SolutionDir)r5dev\include;$(IncludePath)</IncludePath>
<IncludePath>$(SolutionDir)external\detours\include;$(SolutionDir)external\imgui\include;$(SolutionDir)external\spdlog\include;$(SolutionDir)shared\include;$(SolutionDir)r5dev\include;$(IncludePath)</IncludePath>
<LibraryPath>$(SolutionDir)external\detours\libs;$(LibraryPath)</LibraryPath>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
@ -132,9 +132,8 @@
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_DEBUG;R5DEV_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<PrecompiledHeaderFile>
</PrecompiledHeaderFile>
<PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<LanguageStandard_C>stdc17</LanguageStandard_C>
<LanguageStandard>stdcpp17</LanguageStandard>
</ClCompile>
@ -286,15 +285,16 @@
<ClInclude Include="..\external\spdlog\include\stopwatch.h" />
<ClInclude Include="..\external\spdlog\include\tweakme.h" />
<ClInclude Include="..\external\spdlog\include\version.h" />
<ClInclude Include="include\address.h" />
<ClInclude Include="..\shared\include\address.h" />
<ClInclude Include="..\shared\include\httplib.h" />
<ClInclude Include="..\shared\include\json.hpp" />
<ClInclude Include="..\shared\include\utility.h" />
<ClInclude Include="include\console.h" />
<ClInclude Include="include\enums.h" />
<ClInclude Include="include\gameclasses.h" />
<ClInclude Include="include\hooks.h" />
<ClInclude Include="include\httplib.h" />
<ClInclude Include="include\id3dx.h" />
<ClInclude Include="include\input.h" />
<ClInclude Include="include\json.hpp" />
<ClInclude Include="include\opcptc.h" />
<ClInclude Include="include\overlay.h" />
<ClInclude Include="include\patterns.h" />
@ -302,30 +302,37 @@
<ClInclude Include="include\r5dev.h" />
<ClInclude Include="include\serverlisting.h" />
<ClInclude Include="include\structs.h" />
<ClInclude Include="include\utility.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\external\imgui\src\imgui.cpp">
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">NotUsing</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">NotUsing</PrecompiledHeader>
</ClCompile>
<ClCompile Include="..\external\imgui\src\imgui_demo.cpp">
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">NotUsing</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">NotUsing</PrecompiledHeader>
</ClCompile>
<ClCompile Include="..\external\imgui\src\imgui_draw.cpp">
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">NotUsing</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">NotUsing</PrecompiledHeader>
</ClCompile>
<ClCompile Include="..\external\imgui\src\imgui_impl_dx11.cpp">
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">NotUsing</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">NotUsing</PrecompiledHeader>
</ClCompile>
<ClCompile Include="..\external\imgui\src\imgui_impl_win32.cpp">
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">NotUsing</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">NotUsing</PrecompiledHeader>
</ClCompile>
<ClCompile Include="..\external\imgui\src\imgui_tables.cpp">
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">NotUsing</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">NotUsing</PrecompiledHeader>
</ClCompile>
<ClCompile Include="..\external\imgui\src\imgui_widgets.cpp">
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">NotUsing</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">NotUsing</PrecompiledHeader>
</ClCompile>
<ClCompile Include="..\shared\utility.cpp" />
<ClCompile Include="src\console.cpp">
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Use</PrecompiledHeader>
<PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|x64'">pch.h</PrecompiledHeaderFile>
@ -361,6 +368,8 @@
<ClCompile Include="src\pch.cpp">
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
<PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|x64'">pch.h</PrecompiledHeaderFile>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
<PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">pch.h</PrecompiledHeaderFile>
</ClCompile>
<ClCompile Include="src\serverlisting.cpp">
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Use</PrecompiledHeader>

View File

@ -1,6 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Header Files">
<UniqueIdentifier>{a80939e5-3b3c-4873-885e-834e95d68d34}</UniqueIdentifier>
</Filter>
<Filter Include="core">
<UniqueIdentifier>{927ea852-3616-4fc4-8b32-781f65853a6b}</UniqueIdentifier>
</Filter>
<Filter Include="core\include">
<UniqueIdentifier>{b421eb0e-1e3d-4a7a-a8d8-f9b397911702}</UniqueIdentifier>
</Filter>
<Filter Include="shared">
<UniqueIdentifier>{c2ad07a8-ef40-4faa-b86c-19b31bf3209d}</UniqueIdentifier>
</Filter>
<Filter Include="shared\include">
<UniqueIdentifier>{633d6e7a-c709-4d64-a134-b383d43c8c8e}</UniqueIdentifier>
</Filter>
<Filter Include="Source Files">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
@ -9,54 +24,44 @@
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
<Filter Include="External Libraries">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
<Filter Include="shared\libraries">
<UniqueIdentifier>{7cef4f92-94d9-43af-bea5-c6963d68fff2}</UniqueIdentifier>
</Filter>
<Filter Include="Header Files">
<UniqueIdentifier>{a80939e5-3b3c-4873-885e-834e95d68d34}</UniqueIdentifier>
</Filter>
<Filter Include="External Libraries\imgui">
<UniqueIdentifier>{c72b9789-72e9-4657-8a42-8712aaf8690e}</UniqueIdentifier>
</Filter>
<Filter Include="External Libraries\imgui\Header Files">
<UniqueIdentifier>{c18fb898-adc3-4aa8-902c-4777bbc76e5b}</UniqueIdentifier>
</Filter>
<Filter Include="External Libraries\imgui\Source Files">
<UniqueIdentifier>{c3bd7c47-4a04-43da-b79f-b8ef22ba72d4}</UniqueIdentifier>
</Filter>
<Filter Include="External Libraries\detours">
<Filter Include="shared\libraries\detours">
<UniqueIdentifier>{584562a8-0382-488c-909c-67bbb1d1af3c}</UniqueIdentifier>
</Filter>
<Filter Include="External Libraries\detours\Header Files">
<UniqueIdentifier>{3fa7f9a9-dc07-4d42-9172-0944829c010f}</UniqueIdentifier>
<Filter Include="shared\libraries\imgui">
<UniqueIdentifier>{c72b9789-72e9-4657-8a42-8712aaf8690e}</UniqueIdentifier>
</Filter>
<Filter Include="External Libraries\spdlog">
<Filter Include="shared\libraries\spdlog">
<UniqueIdentifier>{757af774-e575-4623-8582-71efb0ae53a4}</UniqueIdentifier>
</Filter>
<Filter Include="External Libraries\spdlog\Header Files">
<Filter Include="shared\libraries\detours\include">
<UniqueIdentifier>{3fa7f9a9-dc07-4d42-9172-0944829c010f}</UniqueIdentifier>
</Filter>
<Filter Include="shared\libraries\imgui\include">
<UniqueIdentifier>{c18fb898-adc3-4aa8-902c-4777bbc76e5b}</UniqueIdentifier>
</Filter>
<Filter Include="shared\libraries\spdlog\include">
<UniqueIdentifier>{7b737633-f8a6-464b-868c-c63854984082}</UniqueIdentifier>
</Filter>
<Filter Include="External Libraries\spdlog\Header Files\cfg">
<Filter Include="shared\libraries\spdlog\include\cfg">
<UniqueIdentifier>{f832e462-9066-45a9-8f58-f865d5c24de3}</UniqueIdentifier>
</Filter>
<Filter Include="External Libraries\spdlog\Header Files\details">
<Filter Include="shared\libraries\spdlog\include\details">
<UniqueIdentifier>{af02cb01-8e1d-49f9-b3da-cff2cf7dc7a1}</UniqueIdentifier>
</Filter>
<Filter Include="External Libraries\spdlog\Header Files\fmt">
<Filter Include="shared\libraries\spdlog\include\fmt">
<UniqueIdentifier>{9d3b7c40-958a-4f6e-9ab6-72c3caea9591}</UniqueIdentifier>
</Filter>
<Filter Include="External Libraries\spdlog\Header Files\sinks">
<UniqueIdentifier>{e38cd6c5-b355-4bb5-bf65-bfd51fef296b}</UniqueIdentifier>
</Filter>
<Filter Include="External Libraries\spdlog\Header Files\fmt\bundled">
<Filter Include="shared\libraries\spdlog\include\fmt\bundled">
<UniqueIdentifier>{6faf53e7-9be1-439f-92f9-16ab96c005b7}</UniqueIdentifier>
</Filter>
<Filter Include="shared\libraries\spdlog\include\sinks">
<UniqueIdentifier>{e38cd6c5-b355-4bb5-bf65-bfd51fef296b}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="src\dllmain.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="src\console.cpp">
<Filter>Source Files</Filter>
</ClCompile>
@ -69,27 +74,6 @@
<ClCompile Include="src\opcptc.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\external\imgui\src\imgui_draw.cpp">
<Filter>External Libraries\imgui\Source Files</Filter>
</ClCompile>
<ClCompile Include="..\external\imgui\src\imgui_impl_dx11.cpp">
<Filter>External Libraries\imgui\Source Files</Filter>
</ClCompile>
<ClCompile Include="..\external\imgui\src\imgui_impl_win32.cpp">
<Filter>External Libraries\imgui\Source Files</Filter>
</ClCompile>
<ClCompile Include="..\external\imgui\src\imgui_tables.cpp">
<Filter>External Libraries\imgui\Source Files</Filter>
</ClCompile>
<ClCompile Include="..\external\imgui\src\imgui_widgets.cpp">
<Filter>External Libraries\imgui\Source Files</Filter>
</ClCompile>
<ClCompile Include="..\external\imgui\src\imgui.cpp">
<Filter>External Libraries\imgui\Source Files</Filter>
</ClCompile>
<ClCompile Include="..\external\imgui\src\imgui_demo.cpp">
<Filter>External Libraries\imgui\Source Files</Filter>
</ClCompile>
<ClCompile Include="src\id3dx.cpp">
<Filter>Source Files</Filter>
</ClCompile>
@ -105,8 +89,35 @@
<ClCompile Include="src\gameclasses.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\shared\utility.cpp">
<Filter>shared</Filter>
</ClCompile>
<ClCompile Include="src\dllmain.cpp">
<Filter>core</Filter>
</ClCompile>
<ClCompile Include="src\pch.cpp">
<Filter>Source Files</Filter>
<Filter>core</Filter>
</ClCompile>
<ClCompile Include="..\external\imgui\src\imgui_widgets.cpp">
<Filter>shared\libraries\imgui</Filter>
</ClCompile>
<ClCompile Include="..\external\imgui\src\imgui.cpp">
<Filter>shared\libraries\imgui</Filter>
</ClCompile>
<ClCompile Include="..\external\imgui\src\imgui_demo.cpp">
<Filter>shared\libraries\imgui</Filter>
</ClCompile>
<ClCompile Include="..\external\imgui\src\imgui_draw.cpp">
<Filter>shared\libraries\imgui</Filter>
</ClCompile>
<ClCompile Include="..\external\imgui\src\imgui_impl_dx11.cpp">
<Filter>shared\libraries\imgui</Filter>
</ClCompile>
<ClCompile Include="..\external\imgui\src\imgui_impl_win32.cpp">
<Filter>shared\libraries\imgui</Filter>
</ClCompile>
<ClCompile Include="..\external\imgui\src\imgui_tables.cpp">
<Filter>shared\libraries\imgui</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
@ -128,41 +139,38 @@
<ClInclude Include="include\structs.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="include\utility.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\external\detours\include\detver.h">
<Filter>External Libraries\detours\Header Files</Filter>
<Filter>shared\libraries\detours\include</Filter>
</ClInclude>
<ClInclude Include="..\external\detours\include\syelog.h">
<Filter>External Libraries\detours\Header Files</Filter>
<Filter>shared\libraries\detours\include</Filter>
</ClInclude>
<ClInclude Include="..\external\detours\include\detours.h">
<Filter>External Libraries\detours\Header Files</Filter>
<Filter>shared\libraries\detours\include</Filter>
</ClInclude>
<ClInclude Include="..\external\imgui\include\imgui_impl_win32.h">
<Filter>External Libraries\imgui\Header Files</Filter>
<Filter>shared\libraries\imgui\include</Filter>
</ClInclude>
<ClInclude Include="..\external\imgui\include\imgui_internal.h">
<Filter>External Libraries\imgui\Header Files</Filter>
<Filter>shared\libraries\imgui\include</Filter>
</ClInclude>
<ClInclude Include="..\external\imgui\include\imstb_rectpack.h">
<Filter>External Libraries\imgui\Header Files</Filter>
<Filter>shared\libraries\imgui\include</Filter>
</ClInclude>
<ClInclude Include="..\external\imgui\include\imstb_textedit.h">
<Filter>External Libraries\imgui\Header Files</Filter>
<Filter>shared\libraries\imgui\include</Filter>
</ClInclude>
<ClInclude Include="..\external\imgui\include\imstb_truetype.h">
<Filter>External Libraries\imgui\Header Files</Filter>
<Filter>shared\libraries\imgui\include</Filter>
</ClInclude>
<ClInclude Include="..\external\imgui\include\imconfig.h">
<Filter>External Libraries\imgui\Header Files</Filter>
<Filter>shared\libraries\imgui\include</Filter>
</ClInclude>
<ClInclude Include="..\external\imgui\include\imgui.h">
<Filter>External Libraries\imgui\Header Files</Filter>
<Filter>shared\libraries\imgui\include</Filter>
</ClInclude>
<ClInclude Include="..\external\imgui\include\imgui_impl_dx11.h">
<Filter>External Libraries\imgui\Header Files</Filter>
<Filter>shared\libraries\imgui\include</Filter>
</ClInclude>
<ClInclude Include="include\id3dx.h">
<Filter>Header Files</Filter>
@ -177,304 +185,307 @@
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\async_logger-inl.h">
<Filter>External Libraries\spdlog\Header Files</Filter>
<Filter>shared\libraries\spdlog\include</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\common.h">
<Filter>External Libraries\spdlog\Header Files</Filter>
<Filter>shared\libraries\spdlog\include</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\common-inl.h">
<Filter>External Libraries\spdlog\Header Files</Filter>
<Filter>shared\libraries\spdlog\include</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\formatter.h">
<Filter>External Libraries\spdlog\Header Files</Filter>
<Filter>shared\libraries\spdlog\include</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\fwd.h">
<Filter>External Libraries\spdlog\Header Files</Filter>
<Filter>shared\libraries\spdlog\include</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\logger.h">
<Filter>External Libraries\spdlog\Header Files</Filter>
<Filter>shared\libraries\spdlog\include</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\logger-inl.h">
<Filter>External Libraries\spdlog\Header Files</Filter>
<Filter>shared\libraries\spdlog\include</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\pattern_formatter.h">
<Filter>External Libraries\spdlog\Header Files</Filter>
<Filter>shared\libraries\spdlog\include</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\pattern_formatter-inl.h">
<Filter>External Libraries\spdlog\Header Files</Filter>
<Filter>shared\libraries\spdlog\include</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\spdlog.h">
<Filter>External Libraries\spdlog\Header Files</Filter>
<Filter>shared\libraries\spdlog\include</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\spdlog-inl.h">
<Filter>External Libraries\spdlog\Header Files</Filter>
<Filter>shared\libraries\spdlog\include</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\stopwatch.h">
<Filter>External Libraries\spdlog\Header Files</Filter>
<Filter>shared\libraries\spdlog\include</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\tweakme.h">
<Filter>External Libraries\spdlog\Header Files</Filter>
<Filter>shared\libraries\spdlog\include</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\version.h">
<Filter>External Libraries\spdlog\Header Files</Filter>
<Filter>shared\libraries\spdlog\include</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\async.h">
<Filter>External Libraries\spdlog\Header Files</Filter>
<Filter>shared\libraries\spdlog\include</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\async_logger.h">
<Filter>External Libraries\spdlog\Header Files</Filter>
<Filter>shared\libraries\spdlog\include</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\cfg\env.h">
<Filter>External Libraries\spdlog\Header Files\cfg</Filter>
<Filter>shared\libraries\spdlog\include\cfg</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\cfg\helpers.h">
<Filter>External Libraries\spdlog\Header Files\cfg</Filter>
<Filter>shared\libraries\spdlog\include\cfg</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\cfg\helpers-inl.h">
<Filter>External Libraries\spdlog\Header Files\cfg</Filter>
<Filter>shared\libraries\spdlog\include\cfg</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\cfg\argv.h">
<Filter>External Libraries\spdlog\Header Files\cfg</Filter>
<Filter>shared\libraries\spdlog\include\cfg</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\details\fmt_helper.h">
<Filter>External Libraries\spdlog\Header Files\details</Filter>
<Filter>shared\libraries\spdlog\include\details</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\details\log_msg.h">
<Filter>External Libraries\spdlog\Header Files\details</Filter>
<Filter>shared\libraries\spdlog\include\details</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\details\log_msg_buffer.h">
<Filter>External Libraries\spdlog\Header Files\details</Filter>
<Filter>shared\libraries\spdlog\include\details</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\details\log_msg_buffer-inl.h">
<Filter>External Libraries\spdlog\Header Files\details</Filter>
<Filter>shared\libraries\spdlog\include\details</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\details\log_msg-inl.h">
<Filter>External Libraries\spdlog\Header Files\details</Filter>
<Filter>shared\libraries\spdlog\include\details</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\details\mpmc_blocking_q.h">
<Filter>External Libraries\spdlog\Header Files\details</Filter>
<Filter>shared\libraries\spdlog\include\details</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\details\null_mutex.h">
<Filter>External Libraries\spdlog\Header Files\details</Filter>
<Filter>shared\libraries\spdlog\include\details</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\details\os.h">
<Filter>External Libraries\spdlog\Header Files\details</Filter>
<Filter>shared\libraries\spdlog\include\details</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\details\os-inl.h">
<Filter>External Libraries\spdlog\Header Files\details</Filter>
<Filter>shared\libraries\spdlog\include\details</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\details\periodic_worker.h">
<Filter>External Libraries\spdlog\Header Files\details</Filter>
<Filter>shared\libraries\spdlog\include\details</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\details\periodic_worker-inl.h">
<Filter>External Libraries\spdlog\Header Files\details</Filter>
<Filter>shared\libraries\spdlog\include\details</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\details\registry.h">
<Filter>External Libraries\spdlog\Header Files\details</Filter>
<Filter>shared\libraries\spdlog\include\details</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\details\registry-inl.h">
<Filter>External Libraries\spdlog\Header Files\details</Filter>
<Filter>shared\libraries\spdlog\include\details</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\details\synchronous_factory.h">
<Filter>External Libraries\spdlog\Header Files\details</Filter>
<Filter>shared\libraries\spdlog\include\details</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\details\tcp_client.h">
<Filter>External Libraries\spdlog\Header Files\details</Filter>
<Filter>shared\libraries\spdlog\include\details</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\details\tcp_client-windows.h">
<Filter>External Libraries\spdlog\Header Files\details</Filter>
<Filter>shared\libraries\spdlog\include\details</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\details\thread_pool.h">
<Filter>External Libraries\spdlog\Header Files\details</Filter>
<Filter>shared\libraries\spdlog\include\details</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\details\thread_pool-inl.h">
<Filter>External Libraries\spdlog\Header Files\details</Filter>
<Filter>shared\libraries\spdlog\include\details</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\details\windows_include.h">
<Filter>External Libraries\spdlog\Header Files\details</Filter>
<Filter>shared\libraries\spdlog\include\details</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\details\backtracer.h">
<Filter>External Libraries\spdlog\Header Files\details</Filter>
<Filter>shared\libraries\spdlog\include\details</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\details\backtracer-inl.h">
<Filter>External Libraries\spdlog\Header Files\details</Filter>
<Filter>shared\libraries\spdlog\include\details</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\details\circular_q.h">
<Filter>External Libraries\spdlog\Header Files\details</Filter>
<Filter>shared\libraries\spdlog\include\details</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\details\console_globals.h">
<Filter>External Libraries\spdlog\Header Files\details</Filter>
<Filter>shared\libraries\spdlog\include\details</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\details\file_helper.h">
<Filter>External Libraries\spdlog\Header Files\details</Filter>
<Filter>shared\libraries\spdlog\include\details</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\details\file_helper-inl.h">
<Filter>External Libraries\spdlog\Header Files\details</Filter>
<Filter>shared\libraries\spdlog\include\details</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\fmt\fmt.h">
<Filter>External Libraries\spdlog\Header Files\fmt</Filter>
<Filter>shared\libraries\spdlog\include\fmt</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\fmt\ostr.h">
<Filter>External Libraries\spdlog\Header Files\fmt</Filter>
<Filter>shared\libraries\spdlog\include\fmt</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\fmt\xchar.h">
<Filter>External Libraries\spdlog\Header Files\fmt</Filter>
<Filter>shared\libraries\spdlog\include\fmt</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\fmt\bin_to_hex.h">
<Filter>External Libraries\spdlog\Header Files\fmt</Filter>
<Filter>shared\libraries\spdlog\include\fmt</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\fmt\chrono.h">
<Filter>External Libraries\spdlog\Header Files\fmt</Filter>
<Filter>shared\libraries\spdlog\include\fmt</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\fmt\bundled\compile.h">
<Filter>External Libraries\spdlog\Header Files\fmt\bundled</Filter>
<Filter>shared\libraries\spdlog\include\fmt\bundled</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\fmt\bundled\core.h">
<Filter>External Libraries\spdlog\Header Files\fmt\bundled</Filter>
<Filter>shared\libraries\spdlog\include\fmt\bundled</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\fmt\bundled\format.h">
<Filter>External Libraries\spdlog\Header Files\fmt\bundled</Filter>
<Filter>shared\libraries\spdlog\include\fmt\bundled</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\fmt\bundled\format-inl.h">
<Filter>External Libraries\spdlog\Header Files\fmt\bundled</Filter>
<Filter>shared\libraries\spdlog\include\fmt\bundled</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\fmt\bundled\locale.h">
<Filter>External Libraries\spdlog\Header Files\fmt\bundled</Filter>
<Filter>shared\libraries\spdlog\include\fmt\bundled</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\fmt\bundled\os.h">
<Filter>External Libraries\spdlog\Header Files\fmt\bundled</Filter>
<Filter>shared\libraries\spdlog\include\fmt\bundled</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\fmt\bundled\ostream.h">
<Filter>External Libraries\spdlog\Header Files\fmt\bundled</Filter>
<Filter>shared\libraries\spdlog\include\fmt\bundled</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\fmt\bundled\printf.h">
<Filter>External Libraries\spdlog\Header Files\fmt\bundled</Filter>
<Filter>shared\libraries\spdlog\include\fmt\bundled</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\fmt\bundled\ranges.h">
<Filter>External Libraries\spdlog\Header Files\fmt\bundled</Filter>
<Filter>shared\libraries\spdlog\include\fmt\bundled</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\fmt\bundled\xchar.h">
<Filter>External Libraries\spdlog\Header Files\fmt\bundled</Filter>
<Filter>shared\libraries\spdlog\include\fmt\bundled</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\fmt\bundled\args.h">
<Filter>External Libraries\spdlog\Header Files\fmt\bundled</Filter>
<Filter>shared\libraries\spdlog\include\fmt\bundled</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\fmt\bundled\chrono.h">
<Filter>External Libraries\spdlog\Header Files\fmt\bundled</Filter>
<Filter>shared\libraries\spdlog\include\fmt\bundled</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\fmt\bundled\color.h">
<Filter>External Libraries\spdlog\Header Files\fmt\bundled</Filter>
<Filter>shared\libraries\spdlog\include\fmt\bundled</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\sinks\ringbuffer_sink.h">
<Filter>External Libraries\spdlog\Header Files\sinks</Filter>
<Filter>shared\libraries\spdlog\include\sinks</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\sinks\rotating_file_sink.h">
<Filter>External Libraries\spdlog\Header Files\sinks</Filter>
<Filter>shared\libraries\spdlog\include\sinks</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\sinks\rotating_file_sink-inl.h">
<Filter>External Libraries\spdlog\Header Files\sinks</Filter>
<Filter>shared\libraries\spdlog\include\sinks</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\sinks\sink.h">
<Filter>External Libraries\spdlog\Header Files\sinks</Filter>
<Filter>shared\libraries\spdlog\include\sinks</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\sinks\sink-inl.h">
<Filter>External Libraries\spdlog\Header Files\sinks</Filter>
<Filter>shared\libraries\spdlog\include\sinks</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\sinks\stdout_color_sinks.h">
<Filter>External Libraries\spdlog\Header Files\sinks</Filter>
<Filter>shared\libraries\spdlog\include\sinks</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\sinks\stdout_color_sinks-inl.h">
<Filter>External Libraries\spdlog\Header Files\sinks</Filter>
<Filter>shared\libraries\spdlog\include\sinks</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\sinks\stdout_sinks.h">
<Filter>External Libraries\spdlog\Header Files\sinks</Filter>
<Filter>shared\libraries\spdlog\include\sinks</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\sinks\stdout_sinks-inl.h">
<Filter>External Libraries\spdlog\Header Files\sinks</Filter>
<Filter>shared\libraries\spdlog\include\sinks</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\sinks\syslog_sink.h">
<Filter>External Libraries\spdlog\Header Files\sinks</Filter>
<Filter>shared\libraries\spdlog\include\sinks</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\sinks\systemd_sink.h">
<Filter>External Libraries\spdlog\Header Files\sinks</Filter>
<Filter>shared\libraries\spdlog\include\sinks</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\sinks\tcp_sink.h">
<Filter>External Libraries\spdlog\Header Files\sinks</Filter>
<Filter>shared\libraries\spdlog\include\sinks</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\sinks\win_eventlog_sink.h">
<Filter>External Libraries\spdlog\Header Files\sinks</Filter>
<Filter>shared\libraries\spdlog\include\sinks</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\sinks\wincolor_sink.h">
<Filter>External Libraries\spdlog\Header Files\sinks</Filter>
<Filter>shared\libraries\spdlog\include\sinks</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\sinks\wincolor_sink-inl.h">
<Filter>External Libraries\spdlog\Header Files\sinks</Filter>
<Filter>shared\libraries\spdlog\include\sinks</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\sinks\android_sink.h">
<Filter>External Libraries\spdlog\Header Files\sinks</Filter>
<Filter>shared\libraries\spdlog\include\sinks</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\sinks\ansicolor_sink.h">
<Filter>External Libraries\spdlog\Header Files\sinks</Filter>
<Filter>shared\libraries\spdlog\include\sinks</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\sinks\ansicolor_sink-inl.h">
<Filter>External Libraries\spdlog\Header Files\sinks</Filter>
<Filter>shared\libraries\spdlog\include\sinks</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\sinks\base_sink.h">
<Filter>External Libraries\spdlog\Header Files\sinks</Filter>
<Filter>shared\libraries\spdlog\include\sinks</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\sinks\base_sink-inl.h">
<Filter>External Libraries\spdlog\Header Files\sinks</Filter>
<Filter>shared\libraries\spdlog\include\sinks</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\sinks\basic_file_sink.h">
<Filter>External Libraries\spdlog\Header Files\sinks</Filter>
<Filter>shared\libraries\spdlog\include\sinks</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\sinks\basic_file_sink-inl.h">
<Filter>External Libraries\spdlog\Header Files\sinks</Filter>
<Filter>shared\libraries\spdlog\include\sinks</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\sinks\daily_file_sink.h">
<Filter>External Libraries\spdlog\Header Files\sinks</Filter>
<Filter>shared\libraries\spdlog\include\sinks</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\sinks\dist_sink.h">
<Filter>External Libraries\spdlog\Header Files\sinks</Filter>
<Filter>shared\libraries\spdlog\include\sinks</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\sinks\dup_filter_sink.h">
<Filter>External Libraries\spdlog\Header Files\sinks</Filter>
<Filter>shared\libraries\spdlog\include\sinks</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\sinks\hourly_file_sink.h">
<Filter>External Libraries\spdlog\Header Files\sinks</Filter>
<Filter>shared\libraries\spdlog\include\sinks</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\sinks\mongo_sink.h">
<Filter>External Libraries\spdlog\Header Files\sinks</Filter>
<Filter>shared\libraries\spdlog\include\sinks</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\sinks\msvc_sink.h">
<Filter>External Libraries\spdlog\Header Files\sinks</Filter>
<Filter>shared\libraries\spdlog\include\sinks</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\sinks\null_sink.h">
<Filter>External Libraries\spdlog\Header Files\sinks</Filter>
<Filter>shared\libraries\spdlog\include\sinks</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\sinks\ostream_sink.h">
<Filter>External Libraries\spdlog\Header Files\sinks</Filter>
<Filter>shared\libraries\spdlog\include\sinks</Filter>
</ClInclude>
<ClInclude Include="..\external\spdlog\include\sinks\qt_sinks.h">
<Filter>External Libraries\spdlog\Header Files\sinks</Filter>
<Filter>shared\libraries\spdlog\include\sinks</Filter>
</ClInclude>
<ClInclude Include="include\gameclasses.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="include\httplib.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="include\serverlisting.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="include\json.hpp">
<Filter>Header Files</Filter>
<ClInclude Include="..\shared\include\address.h">
<Filter>shared\include</Filter>
</ClInclude>
<ClInclude Include="include\address.h">
<Filter>Header Files</Filter>
<ClInclude Include="..\shared\include\json.hpp">
<Filter>shared\include</Filter>
</ClInclude>
<ClInclude Include="..\shared\include\utility.h">
<Filter>shared\include</Filter>
</ClInclude>
<ClInclude Include="..\shared\include\httplib.h">
<Filter>shared\include</Filter>
</ClInclude>
<ClInclude Include="include\pch.h">
<Filter>Header Files</Filter>
<Filter>core\include</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>

View File

@ -155,7 +155,7 @@ int HMSG_EngineError(char* fmt, va_list args)
}
// TODO: turn this into a playerstruct constructor if it ever becomes necessary
bool HCVEngineClient_IsPersistenceDataAvailable(__int64 thisptr, int client)
bool HCVEngineServer_IsPersistenceDataAvailable(__int64 thisptr, int client)
{
static bool isPersistenceVarSet[256];
@ -205,7 +205,7 @@ void InstallENHooks()
///////////////////////////////////////////////////////////////////////////////
// Hook Utility functions
DetourAttach((LPVOID*)&org_MSG_EngineError, &HMSG_EngineError);
DetourAttach((LPVOID*)&org_CVEngineServer_IsPersistenceDataAvailable, &HCVEngineClient_IsPersistenceDataAvailable);
DetourAttach((LPVOID*)&org_CVEngineServer_IsPersistenceDataAvailable, &HCVEngineServer_IsPersistenceDataAvailable);
///////////////////////////////////////////////////////////////////////////////
// Commit the transaction
@ -241,7 +241,7 @@ void RemoveENHooks()
///////////////////////////////////////////////////////////////////////////////
// Unhook Utility functions
DetourDetach((LPVOID*)&org_MSG_EngineError, &HMSG_EngineError);
DetourDetach((LPVOID*)&org_CVEngineServer_IsPersistenceDataAvailable, &HCVEngineClient_IsPersistenceDataAvailable);
DetourDetach((LPVOID*)&org_CVEngineServer_IsPersistenceDataAvailable, &HCVEngineServer_IsPersistenceDataAvailable);
///////////////////////////////////////////////////////////////////////////////
// Commit the transaction

191
shared/utility.cpp Normal file
View File

@ -0,0 +1,191 @@
#include "pch.h"
#include "utility.h"
/*-----------------------------------------------------------------------------
* _utility.cpp
*-----------------------------------------------------------------------------*/
//////////////////////////////////////////////////////////////////////////////
//
BOOL FileExists(LPCTSTR szPath)
{
DWORD dwAttrib = GetFileAttributes(szPath);
return (dwAttrib != INVALID_FILE_ATTRIBUTES &&
!(dwAttrib & FILE_ATTRIBUTE_DIRECTORY));
}
///////////////////////////////////////////////////////////////////////////////
// For getting information about the specified module
MODULEINFO GetModuleInfo(const char* szModule)
{
MODULEINFO modinfo = { 0 };
HMODULE hModule = GetModuleHandle(szModule);
if (hModule == 0)
{
return modinfo;
}
GetModuleInformation(GetCurrentProcess(), hModule, &modinfo, sizeof(MODULEINFO));
return modinfo;
}
///////////////////////////////////////////////////////////////////////////////
// For finding a byte pattern in memory of the game process
std::uint8_t* PatternScan(const char* module, const char* signature)
{
static auto PatternToBytes = [](const char* pattern)
{
char* PatternStart = const_cast<char*>(pattern); // Cast const away and get start of pattern.
char* PatternEnd = PatternStart + std::strlen(pattern); // Get end of pattern.
std::vector<std::int32_t> Bytes = std::vector<std::int32_t>{ }; // Initialize byte vector.
for (char* CurrentByte = PatternStart; CurrentByte < PatternEnd; ++CurrentByte)
{
if (*CurrentByte == '?') // Is current char(byte) a wildcard?
{
++CurrentByte; // Skip 1 character.
if (*CurrentByte == '?') // Is it a double wildcard pattern?
++CurrentByte; // If so skip the next space that will come up so we can reach the next byte.
Bytes.push_back(-1); // Push the byte back as invalid.
}
else
{
// https://stackoverflow.com/a/43860875/12541255
// Here we convert our string to a unsigned long integer. We pass our string then we use 16 as the base because we want it as hexadecimal.
// Afterwards we push the byte into our bytes vector.
Bytes.push_back(std::strtoul(CurrentByte, &CurrentByte, 16));
}
}
return Bytes;
};
const MODULEINFO mInfo = GetModuleInfo(module); // Get module info.
const DWORD64 SizeOfModule = (DWORD64)mInfo.SizeOfImage; // Grab the module size.
std::uint8_t* ScanBytes = reinterpret_cast<std::uint8_t*>(mInfo.lpBaseOfDll); // Get the base of the module.
const std::vector<int> PatternBytes = PatternToBytes(signature); // Convert our pattern to a byte array.
const std::pair BytesInfo = std::make_pair(PatternBytes.size(), PatternBytes.data()); // Get the size and data of our bytes.
for (DWORD i = 0ul; i < SizeOfModule - BytesInfo.first; ++i)
{
bool FoundAddress = true;
for (DWORD j = 0ul; j < BytesInfo.first; ++j)
{
// If either the current byte equals to the byte in our pattern or our current byte in the pattern is a wildcard
// our if clause will be false.
if (ScanBytes[i + j] != BytesInfo.second[j] && BytesInfo.second[j] != -1)
{
FoundAddress = false;
break;
}
}
if (FoundAddress)
{
return &ScanBytes[i];
}
}
return nullptr;
}
///////////////////////////////////////////////////////////////////////////////
//
void DbgPrint(LPCSTR sFormat, ...)
{
CHAR sBuffer[512] = { 0 };
va_list sArgs;
// Get the variable arg pointer
va_start(sArgs, sFormat);
// Format print the string
int length = vsnprintf(sBuffer, sizeof(sBuffer), sFormat, sArgs);
va_end(sArgs);
// Output the string to the debugger
OutputDebugString(sBuffer);
}
///////////////////////////////////////////////////////////////////////////////
// For dumping data from a buffer to a file on the disk
void HexDump(const char* szHeader, int nFunc, const void* pData, int nSize)
{
static std::atomic<int> i, j, k = 0;
static char ascii[17] = { 0 };
static auto logger = spdlog::get("default_logger");
auto pattern = std::make_unique<spdlog::pattern_formatter>("%v", spdlog::pattern_time_type::local, std::string(""));
// Loop until the function returned to the first caller
while (k == 1) { /*Sleep(75);*/ }
k = 1;
ascii[16] = '\0';
// Add new loggers here to replace the placeholder
if (nFunc == 0) { logger = g_spdnetchan_logger; }
// Add timestamp
logger->set_level(spdlog::level::trace);
logger->set_pattern("%v [%H:%M:%S.%f]");
logger->trace("---------------------------------------------------------");
// Disable EOL and create block header
logger->set_formatter(std::move(pattern));
logger->trace("{:s} ---- LEN BYTES: {}\n:\n", szHeader, nSize);
logger->trace("-------- 0 1 2 3 4 5 6 7 8 9 A B C D E F 0123456789ABCDEF\n");
// Output the buffer to the file
for (i = 0; i < nSize; i++)
{
if (i % nSize == 0) { logger->trace(" 0x{:04X} ", i); }
logger->trace("{:02x} ", ((unsigned char*)pData)[i]);
if (((unsigned char*)pData)[i] >= ' ' && ((unsigned char*)pData)[i] <= '~') { ascii[i % 16] = ((unsigned char*)pData)[i]; }
else { ascii[i % 16] = '.'; }
if ((i + 1) % 8 == 0 || i + 1 == nSize)
{
logger->trace(" ");
if ((i + 1) % 16 == 0)
{
if (i + 1 == nSize)
{
logger->trace("{:s}\n", ascii);
logger->trace("---------------------------------------------------------------------------\n");
logger->trace("\n");
}
else
{
i++;
logger->trace("{:s}\n ", ascii);
logger->trace("0x{:04X} ", i--);
}
}
else if (i + 1 == nSize)
{
ascii[(i + 1) % 16] = '\0';
if ((i + 1) % 16 <= 8)
{
logger->trace(" ");
}
for (j = (i + 1) % 16; j < 16; j++)
{
logger->trace(" ");
}
logger->trace("{:s}\n", ascii);
logger->trace("---------------------------------------------------------------------------\n");
logger->trace("\n");
}
}
}
k = 0;
///////////////////////////////////////////////////////////////////////////
}