Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion AMBuildScript
Original file line number Diff line number Diff line change
Expand Up @@ -280,7 +280,7 @@ class MMSPluginConfig(object):
cxx.cxxincludes += [
os.path.join(context.currentSourcePath),
os.path.join(mms_core_path),
os.path.join(mms_core_path, 'sourcehook'),
os.path.join(self.mms_root, 'third_party', 'khook', 'include'),
]

defines = []
Expand Down
7 changes: 0 additions & 7 deletions AMBuilder
Original file line number Diff line number Diff line change
Expand Up @@ -28,16 +28,10 @@ for sdk_target in MMSPlugin.sdk_targets:
target_folder = 'Debug' if builder.options.debug else 'Release'

if binary.compiler.target.platform == 'linux':
binary.compiler.postlink += [
os.path.join(builder.sourcePath, 'vendor', 'funchook', 'lib', target_folder, 'libfunchook.a'),
os.path.join(builder.sourcePath, 'vendor', 'funchook', 'lib', target_folder, 'libdistorm.a'),
]
binary.sources += ['src/utils/plat_unix.cpp']
elif binary.compiler.target.platform == 'windows':
binary.compiler.postlink += [
os.path.join('psapi.lib'),
os.path.join(builder.sourcePath, 'vendor', 'funchook', 'lib', target_folder, 'funchook.lib'),
os.path.join(builder.sourcePath, 'vendor', 'funchook', 'lib', target_folder, 'distorm.lib'),
os.path.join(sdk['path'], 'lib', 'public', 'win64', 'steam_api64.lib')
]
binary.sources += ['src/utils/plat_win.cpp']
Expand All @@ -50,7 +44,6 @@ for sdk_target in MMSPlugin.sdk_targets:
os.path.join(builder.sourcePath, 'src', 'cs2_sdk'),
os.path.join(builder.sourcePath, 'src', 'utils'),
os.path.join(builder.sourcePath, 'public'),
os.path.join(builder.sourcePath, 'vendor', 'funchook', 'include'),
]

protoc_builder = builder.tools.Protoc(protoc = sdk_target.protoc, sources = [
Expand Down
2 changes: 1 addition & 1 deletion hl2sdk-manifests
345 changes: 149 additions & 196 deletions src/multiaddonmanager.cpp

Large diffs are not rendered by default.

50 changes: 40 additions & 10 deletions src/multiaddonmanager.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@

#include <ISmmPlugin.h>
#include <igameevents.h>
#include <sh_vector.h>
#include "khook.hpp"
#include "utlqueue.h"
#include "utlvector.h"
#include "networksystem/inetworkserializer.h"
Expand All @@ -37,23 +37,38 @@
#define GAMEBIN "/csgo/bin/linuxsteamrt64/"
#endif

class IGameEventSystem;
class INetworkGameServer;
class CNetMessage;
class CHostStateMgr;
class CServerSideClientBase;
class CServerSideClient;
struct CHostStateRequest;

class MultiAddonManager : public ISmmPlugin, public IMetamodListener, public IMultiAddonManager
{
public:
MultiAddonManager();

bool Load(PluginId id, ISmmAPI *ismm, char *error, size_t maxlen, bool late);
bool Unload(char *error, size_t maxlen);
void *OnMetamodQuery(const char *iface, int *ret);
public: //hooks
void Hook_GameServerSteamAPIActivated();
void Hook_StartupServer(const GameSessionConfiguration_t &config, ISource2WorldSession *, const char *);
bool Hook_ClientConnect(CPlayerSlot slot, const char *pszName, uint64 steamID64, const char *pszNetworkID, bool unk1, CBufferString *pRejectReason);
void Hook_ClientDisconnect(CPlayerSlot slot, ENetworkDisconnectionReason reason, const char *pszName, uint64 steamID64, const char *pszNetworkID);
void Hook_ClientActive(CPlayerSlot slot, bool bLoadGame, const char *pszName, uint64 steamID64);
void Hook_GameFrame(bool simulating, bool bFirstTick, bool bLastTick);
void Hook_PostEvent(CSplitScreenSlot nSlot, bool bLocalOnly, int nClientCount, const uint64 *clients,
KHook::Return<void> Hook_GameServerSteamAPIActivated(IServerGameDLL *pThis);
KHook::Return<void> Hook_StartupServer(INetworkServerService *pThis, const GameSessionConfiguration_t &config, ISource2WorldSession *, const char *);
KHook::Return<bool> Hook_ClientConnect(IServerGameClients *pThis, CPlayerSlot slot, const char *pszName, uint64 steamID64, const char *pszNetworkID, bool unk1, CBufferString *pRejectReason);
KHook::Return<void> Hook_ClientDisconnect(IServerGameClients *pThis, CPlayerSlot slot, ENetworkDisconnectionReason reason, const char *pszName, uint64 steamID64, const char *pszNetworkID);
KHook::Return<void> Hook_ClientActive(IServerGameClients *pThis, CPlayerSlot slot, bool bLoadGame, const char *pszName, uint64 steamID64);
KHook::Return<void> Hook_GameFrame(IServerGameDLL *pThis, bool simulating, bool bFirstTick, bool bLastTick);
KHook::Return<void> Hook_PostEvent(IGameEventSystem *pThis, CSplitScreenSlot nSlot, bool bLocalOnly, int nClientCount, const uint64 *clients,
INetworkMessageInternal *pEvent, const CNetMessage *pData, unsigned long nSize, NetChannelBufType_t bufType);
int Hook_LoadEventsFromFile(const char *filename, bool bSearchAll);
bool Hook_CanHLTVClientConnect(int index, const CSteamID &steamID, int *pRejectReason);
KHook::Return<int> Hook_LoadEventsFromFile(IGameEventManager2 *pThis, const char *filename, bool bSearchAll);
KHook::Return<bool> Hook_CanHLTVClientConnect(IServerGameClients *pThis, int index, const CSteamID &steamID, int *pRejectReason);
KHook::Return<bool> Hook_SendNetMessage_ServerSideClient(CServerSideClientBase *pClient, const CNetMessage *pData, NetChannelBufType_t bufType);
KHook::Return<bool> Hook_SendNetMessage_HLTVClient(CServerSideClientBase *pClient, const CNetMessage *pData, NetChannelBufType_t bufType);
KHook::Return<void> Hook_SetPendingHostStateRequest(CHostStateMgr *pMgrDoNotUse, CHostStateRequest *pRequest);
KHook::Return<void> Hook_ReplyConnection(INetworkGameServer *pThis, CServerSideClient *pClient);
KHook::Return<uint64> Hook_ScriptGetAddon();

void ParseCfg();
void BuildAddonPath(const char *pszAddon, char *buf, size_t len, bool bLegacy);
Expand Down Expand Up @@ -98,6 +113,21 @@ class MultiAddonManager : public ISmmPlugin, public IMetamodListener, public IMu
CUtlVector<std::string> m_GlobalClientAddons;

private:
KHook::Virtual<IServerGameDLL, void, bool, bool, bool> m_hookGameFrame;
KHook::Virtual<IServerGameDLL, void> m_hookGameServerSteamAPIActivated;
KHook::Virtual<INetworkServerService, void, const GameSessionConfiguration_t &, ISource2WorldSession *, const char *> m_hookStartupServer;
KHook::Virtual<IServerGameClients, bool, CPlayerSlot, const char *, uint64, const char *, bool, CBufferString *> m_hookClientConnect;
KHook::Virtual<IServerGameClients, bool, int, const CSteamID &, int *> m_hookCanHLTVClientConnect;
KHook::Virtual<IServerGameClients, void, CPlayerSlot, ENetworkDisconnectionReason, const char *, uint64, const char *> m_hookClientDisconnect;
KHook::Virtual<IServerGameClients, void, CPlayerSlot, bool, const char *, uint64> m_hookClientActive;
KHook::Virtual<IGameEventSystem, void, CSplitScreenSlot, bool, int, const uint64 *, INetworkMessageInternal *, const CNetMessage *, unsigned long, NetChannelBufType_t> m_hookPostEventAbstract;
KHook::Virtual<IGameEventManager2, int, const char *, bool> m_hookLoadEventsFromFile;
KHook::Virtual<CServerSideClientBase, bool, const CNetMessage *, NetChannelBufType_t> m_hookSendNetMessage_ServerSideClient;
KHook::Virtual<CServerSideClientBase, bool, const CNetMessage *, NetChannelBufType_t> m_hookSendNetMessage_HLTVClient;
KHook::Function<void, CHostStateMgr *, CHostStateRequest *> m_hookSetPendingHostStateRequest;
KHook::Function<void, INetworkGameServer *, CServerSideClient *> m_hookReplyConnection;
KHook::Function<uint64> m_hookScriptGetAddon;

CUtlVector<PublishedFileId_t> m_ImportantDownloads; // Important addon downloads that will trigger a map reload when finished
CUtlQueue<PublishedFileId_t> m_DownloadQueue; // Queue of all addon downloads to print progress

Expand Down
41 changes: 3 additions & 38 deletions src/utils/module.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
#include "dbg.h"
#include "interface.h"
#include "strtools.h"
#include "khook.hpp"
#include "plat.h"

#include <string>
Expand All @@ -31,13 +32,6 @@
#include <Psapi.h>
#endif

enum SigError
{
SIG_OK,
SIG_NOT_FOUND,
SIG_FOUND_MULTIPLE,
};

// equivalent to FindSignature, but allows for multiple signatures to be found and iterated over
class SignatureIterator
{
Expand Down Expand Up @@ -102,38 +96,9 @@ class CModule
#endif
}

void *FindSignature(const byte *pData, size_t iSigLength, int &error)
void *LookupSignature(const char *pSignature)
{
unsigned char *pMemory;
void *return_addr = nullptr;
error = 0;

pMemory = (byte *)m_base;

for (size_t i = 0; i < m_size; i++)
{
size_t Matches = 0;
while (*(pMemory + i + Matches) == pData[Matches] || pData[Matches] == '\x2A')
{
Matches++;
if (Matches == iSigLength)
{
if (return_addr)
{
error = SIG_FOUND_MULTIPLE;
return return_addr;
}

return_addr = (void *)(pMemory + i);
break;
}
}
}

if (!return_addr)
error = SIG_NOT_FOUND;

return return_addr;
return KHook::LookupSignature(m_base, m_size, pSignature);
}

void *FindInterface(const char *name)
Expand Down
Loading