Skip to content

Commit 7db7c33

Browse files
committed
Fix VTable hooks
1 parent e9825a7 commit 7db7c33

4 files changed

Lines changed: 62 additions & 68 deletions

File tree

src/cs2fixes.cpp

Lines changed: 57 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -113,15 +113,15 @@ KHook::Virtual postEventAbstractHook(&IGameEventSystem::PostEventAbstract, &g_CS
113113
KHook::Virtual startupServerHook(&INetworkServerService::StartupServer, &g_CS2Fixes, nullptr, &CS2Fixes::Hook_StartupServer_Post);
114114
KHook::Virtual checkTransmitHook(&ISource2GameEntities::CheckTransmit, &g_CS2Fixes, nullptr, &CS2Fixes::Hook_CheckTransmit_Post);
115115
KHook::Virtual dispatchConCommandHook(&ICvar::DispatchConCommand, &g_CS2Fixes, &CS2Fixes::Hook_DispatchConCommand, nullptr);
116-
KHook::Virtual loadEventsFromFileHook(&IGameEventManager2::LoadEventsFromFile, &g_CS2Fixes, &CS2Fixes::Hook_LoadEventsFromFile, nullptr);
117-
KHook::Virtual playerEquipUseHook(&g_CS2Fixes, &CS2Fixes::Hook_PlayerEquipUse, nullptr);
118-
KHook::Virtual playerEquipPrecacheHook(&g_CS2Fixes, nullptr, &CS2Fixes::Hook_PlayerEquipPrecache_Post);
119116
KHook::Virtual createWorkshopMapGroupHook(&g_CS2Fixes, &CS2Fixes::Hook_CreateWorkshopMapGroup, nullptr);
120-
KHook::Virtual onTakeDamageAliveHook(&g_CS2Fixes, &CS2Fixes::Hook_OnTakeDamage_Alive, nullptr);
121-
KHook::Virtual checkMovingGroundHook(&g_CS2Fixes, &CS2Fixes::Hook_CheckMovingGround, nullptr);
122-
KHook::Virtual goToIntermissionHook(&g_CS2Fixes, &CS2Fixes::Hook_GoToIntermission, nullptr);
123-
KHook::Virtual physicsTouchShuffleHook(&g_CS2Fixes, nullptr, &CS2Fixes::Hook_PhysicsTouchShuffle_Post);
124-
KHook::Virtual dropWeaponHook(&g_CS2Fixes, nullptr, &CS2Fixes::Hook_DropWeapon_Post);
117+
KHook::Member loadEventsFromFileHook(&g_CS2Fixes, &CS2Fixes::Hook_LoadEventsFromFile, nullptr);
118+
KHook::Member playerEquipUseHook(&g_CS2Fixes, &CS2Fixes::Hook_PlayerEquipUse, nullptr);
119+
KHook::Member playerEquipPrecacheHook(&g_CS2Fixes, nullptr, &CS2Fixes::Hook_PlayerEquipPrecache_Post);
120+
KHook::Member onTakeDamageAliveHook(&g_CS2Fixes, &CS2Fixes::Hook_OnTakeDamage_Alive, nullptr);
121+
KHook::Member checkMovingGroundHook(&g_CS2Fixes, &CS2Fixes::Hook_CheckMovingGround, nullptr);
122+
KHook::Member goToIntermissionHook(&g_CS2Fixes, &CS2Fixes::Hook_GoToIntermission, nullptr);
123+
KHook::Member physicsTouchShuffleHook(&g_CS2Fixes, nullptr, &CS2Fixes::Hook_PhysicsTouchShuffle_Post);
124+
KHook::Member dropWeaponHook(&g_CS2Fixes, nullptr, &CS2Fixes::Hook_DropWeapon_Post);
125125

126126
CS2Fixes g_CS2Fixes;
127127

@@ -135,13 +135,6 @@ CGameConfig* g_GameConfig = nullptr;
135135
ISteamHTTP* g_http = nullptr;
136136
CSteamGameServerAPIContext g_steamAPI;
137137
CCSGameRules* g_pGameRules = nullptr; // Will be null between map end & new map startup, null check if necessary!
138-
IGameEventManager2* g_pCGameEventManagerVTable = nullptr;
139-
CGamePlayerEquip* g_pCGamePlayerEquipVTable = nullptr;
140-
CCSPlayerPawn* g_pCCSPlayerPawnVTable = nullptr;
141-
CCSPlayer_MovementServices* g_pCCSPlayer_MovementServicesVTable = nullptr;
142-
CCSGameRules* g_pCCSGameRulesVTable = nullptr;
143-
CVPhys2World* g_pCVPhys2WorldVTable = nullptr;
144-
CCSPlayer_WeaponServices* g_pCCSPlayer_WeaponServicesVTable = nullptr;
145138

146139
CGameEntitySystem* GameEntitySystem()
147140
{
@@ -233,58 +226,64 @@ bool CS2Fixes::Load(PluginId id, ISmmAPI* ismm, char* error, size_t maxlen, bool
233226
if (!InitGameSystems())
234227
bRequiredInitLoaded = false;
235228

236-
g_pCGameEventManagerVTable = (IGameEventManager2*)modules::server->FindVirtualTable("CGameEventManager");
229+
int offset = g_GameConfig->GetOffset("IGameTypes_CreateWorkshopMapGroup");
237230

238-
if (!g_pCGameEventManagerVTable)
231+
if (offset == -1)
239232
{
240-
Panic("Failed to find CGameEventManager vtable\n");
233+
Panic("Failed to find IGameTypes_CreateWorkshopMapGroup\n");
241234
bRequiredInitLoaded = false;
242235
}
243236

244-
loadEventsFromFileHook.Add(g_pCGameEventManagerVTable);
237+
createWorkshopMapGroupHook.SetIndex(offset);
238+
createWorkshopMapGroupHook.Add(g_pGameTypes);
239+
240+
void** pCGameEventManagerVTable = modules::server->FindVirtualTable("CGameEventManager");
245241

246-
g_pCGamePlayerEquipVTable = (CGamePlayerEquip*)modules::server->FindVirtualTable("CGamePlayerEquip");
247-
if (!g_pCGamePlayerEquipVTable)
242+
if (!pCGameEventManagerVTable)
248243
{
249-
Panic("Failed to find CGamePlayerEquip vtable\n");
244+
Panic("Failed to find CGameEventManager vtable\n");
250245
bRequiredInitLoaded = false;
251246
}
252247

253-
int offset = g_GameConfig->GetOffset("CBaseEntity::Use");
248+
offset = KHook::GetVtableIndex(&IGameEventManager2::LoadEventsFromFile);
254249

255250
if (offset == -1)
256251
{
257-
Panic("Failed to find CBaseEntity::Use\n");
252+
Panic("Failed to find offset for IGameEventManager2::LoadEventsFromFile\n");
258253
bRequiredInitLoaded = false;
259254
}
260255

261-
playerEquipUseHook.SetIndex(offset);
262-
playerEquipUseHook.Add(g_pCGamePlayerEquipVTable);
256+
loadEventsFromFileHook.Configure(pCGameEventManagerVTable[offset]);
263257

264-
offset = g_GameConfig->GetOffset("CBaseEntity::Precache");
265-
if (offset == -1)
258+
void** pCGamePlayerEquipVTable = modules::server->FindVirtualTable("CGamePlayerEquip");
259+
if (!pCGamePlayerEquipVTable)
266260
{
267-
Panic("Failed to find CBaseEntity::Precache\n");
261+
Panic("Failed to find CGamePlayerEquip vtable\n");
268262
bRequiredInitLoaded = false;
269263
}
270264

271-
playerEquipPrecacheHook.SetIndex(offset);
272-
playerEquipPrecacheHook.Add(g_pCGamePlayerEquipVTable);
265+
offset = g_GameConfig->GetOffset("CBaseEntity::Use");
266+
267+
if (offset == -1)
268+
{
269+
Panic("Failed to find CBaseEntity::Use\n");
270+
bRequiredInitLoaded = false;
271+
}
273272

274-
offset = g_GameConfig->GetOffset("IGameTypes_CreateWorkshopMapGroup");
273+
playerEquipUseHook.Configure(pCGamePlayerEquipVTable[offset]);
275274

275+
offset = g_GameConfig->GetOffset("CBaseEntity::Precache");
276276
if (offset == -1)
277277
{
278-
Panic("Failed to find IGameTypes_CreateWorkshopMapGroup\n");
278+
Panic("Failed to find CBaseEntity::Precache\n");
279279
bRequiredInitLoaded = false;
280280
}
281281

282-
createWorkshopMapGroupHook.SetIndex(offset);
283-
createWorkshopMapGroupHook.Add(g_pGameTypes);
282+
playerEquipPrecacheHook.Configure(pCGamePlayerEquipVTable[offset]);
284283

285-
g_pCCSPlayerPawnVTable = (CCSPlayerPawn*)modules::server->FindVirtualTable("CCSPlayerPawn");
284+
void** pCCSPlayerPawnVTable = modules::server->FindVirtualTable("CCSPlayerPawn");
286285

287-
if (!g_pCCSPlayerPawnVTable)
286+
if (!pCCSPlayerPawnVTable)
288287
{
289288
Panic("Failed to find CCSPlayerPawn vtable\n");
290289
bRequiredInitLoaded = false;
@@ -297,12 +296,11 @@ bool CS2Fixes::Load(PluginId id, ISmmAPI* ismm, char* error, size_t maxlen, bool
297296
bRequiredInitLoaded = false;
298297
}
299298

300-
onTakeDamageAliveHook.SetIndex(offset);
301-
onTakeDamageAliveHook.Add(g_pCCSPlayerPawnVTable);
299+
onTakeDamageAliveHook.Configure(pCCSPlayerPawnVTable[offset]);
302300

303-
g_pCCSPlayer_MovementServicesVTable = (CCSPlayer_MovementServices*)modules::server->FindVirtualTable("CCSPlayer_MovementServices");
301+
void** pCCSPlayer_MovementServicesVTable = modules::server->FindVirtualTable("CCSPlayer_MovementServices");
304302

305-
if (!g_pCCSPlayer_MovementServicesVTable)
303+
if (!pCCSPlayer_MovementServicesVTable)
306304
{
307305
Panic("Failed to find CCSPlayer_MovementServices vtable\n");
308306
bRequiredInitLoaded = false;
@@ -315,12 +313,11 @@ bool CS2Fixes::Load(PluginId id, ISmmAPI* ismm, char* error, size_t maxlen, bool
315313
bRequiredInitLoaded = false;
316314
}
317315

318-
checkMovingGroundHook.SetIndex(offset);
319-
checkMovingGroundHook.Add(g_pCCSPlayer_MovementServicesVTable);
316+
checkMovingGroundHook.Configure(pCCSPlayer_MovementServicesVTable[offset]);
320317

321-
g_pCCSGameRulesVTable = (CCSGameRules*)modules::server->FindVirtualTable("CCSGameRules");
318+
void** pCCSGameRulesVTable = modules::server->FindVirtualTable("CCSGameRules");
322319

323-
if (!g_pCCSGameRulesVTable)
320+
if (!pCCSGameRulesVTable)
324321
{
325322
Panic("Failed to find CCSGameRules vtable\n");
326323
bRequiredInitLoaded = false;
@@ -333,12 +330,11 @@ bool CS2Fixes::Load(PluginId id, ISmmAPI* ismm, char* error, size_t maxlen, bool
333330
bRequiredInitLoaded = false;
334331
}
335332

336-
goToIntermissionHook.SetIndex(offset);
337-
goToIntermissionHook.Add(g_pCCSGameRulesVTable);
333+
goToIntermissionHook.Configure(pCCSGameRulesVTable[offset]);
338334

339-
g_pCVPhys2WorldVTable = (CVPhys2World*)modules::vphysics2->FindVirtualTable("CVPhys2World");
335+
void** pCVPhys2WorldVTable = modules::vphysics2->FindVirtualTable("CVPhys2World");
340336

341-
if (!g_pCVPhys2WorldVTable)
337+
if (!pCVPhys2WorldVTable)
342338
{
343339
Panic("Failed to find CVPhys2World vtable\n");
344340
bRequiredInitLoaded = false;
@@ -351,12 +347,11 @@ bool CS2Fixes::Load(PluginId id, ISmmAPI* ismm, char* error, size_t maxlen, bool
351347
bRequiredInitLoaded = false;
352348
}
353349

354-
physicsTouchShuffleHook.SetIndex(offset);
355-
physicsTouchShuffleHook.Add(g_pCVPhys2WorldVTable);
350+
physicsTouchShuffleHook.Configure(pCVPhys2WorldVTable[offset]);
356351

357-
g_pCCSPlayer_WeaponServicesVTable = (CCSPlayer_WeaponServices*)modules::server->FindVirtualTable("CCSPlayer_WeaponServices");
352+
void** pCCSPlayer_WeaponServicesVTable = modules::server->FindVirtualTable("CCSPlayer_WeaponServices");
358353

359-
if (!g_pCCSPlayer_WeaponServicesVTable)
354+
if (!pCCSPlayer_WeaponServicesVTable)
360355
{
361356
Panic("Failed to find CCSPlayer_WeaponServices vtable\n");
362357
bRequiredInitLoaded = false;
@@ -369,8 +364,7 @@ bool CS2Fixes::Load(PluginId id, ISmmAPI* ismm, char* error, size_t maxlen, bool
369364
bRequiredInitLoaded = false;
370365
}
371366

372-
dropWeaponHook.SetIndex(offset);
373-
dropWeaponHook.Add(g_pCCSPlayer_WeaponServicesVTable);
367+
dropWeaponHook.Configure(pCCSPlayer_WeaponServicesVTable[offset]);
374368

375369
if (!bRequiredInitLoaded)
376370
{
@@ -470,15 +464,15 @@ bool CS2Fixes::Unload(char* error, size_t maxlen)
470464
startupServerHook.Remove(g_pNetworkServerService);
471465
checkTransmitHook.Remove(g_pSource2GameEntities);
472466
dispatchConCommandHook.Remove(g_pCVar);
473-
loadEventsFromFileHook.Remove(g_pCGameEventManagerVTable);
474-
playerEquipUseHook.Remove(g_pCGamePlayerEquipVTable);
475-
playerEquipPrecacheHook.Remove(g_pCGamePlayerEquipVTable);
476467
createWorkshopMapGroupHook.Remove(g_pGameTypes);
477-
onTakeDamageAliveHook.Remove(g_pCCSPlayerPawnVTable);
478-
checkMovingGroundHook.Remove(g_pCCSPlayer_MovementServicesVTable);
479-
goToIntermissionHook.Remove(g_pCCSGameRulesVTable);
480-
physicsTouchShuffleHook.Remove(g_pCVPhys2WorldVTable);
481-
dropWeaponHook.Remove(g_pCCSPlayer_WeaponServicesVTable);
468+
loadEventsFromFileHook.~Member();
469+
playerEquipUseHook.~Member();
470+
playerEquipPrecacheHook.~Member();
471+
onTakeDamageAliveHook.~Member();
472+
checkMovingGroundHook.~Member();
473+
goToIntermissionHook.~Member();
474+
physicsTouchShuffleHook.~Member();
475+
dropWeaponHook.~Member();
482476

483477
ConVar_Unregister();
484478

src/utils/module.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ class CModule
170170
#ifdef _WIN32
171171
void InitializeSections();
172172
#endif
173-
void* FindVirtualTable(const std::string& name);
173+
void** FindVirtualTable(const std::string& name);
174174

175175
public:
176176
const char* m_pszModule;

src/utils/plat_unix.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ void Plat_WriteMemory(void* pPatchAddress, uint8_t* pPatch, int iPatchSize)
205205
result = mprotect(align_addr, align_size, old_prot);
206206
}
207207

208-
void* CModule::FindVirtualTable(const std::string& name)
208+
void** CModule::FindVirtualTable(const std::string& name)
209209
{
210210
auto readOnlyData = GetSection(".rodata");
211211
auto readOnlyRelocations = GetSection(".data.rel.ro");
@@ -248,7 +248,7 @@ void* CModule::FindVirtualTable(const std::string& name)
248248

249249
while (void* vtable = sigIt3.FindNext(false))
250250
if (*(int64_t*)((uintptr_t)vtable - 0x8) == 0)
251-
return (void*)((uintptr_t)vtable + 0x8);
251+
return (void**)((uintptr_t)vtable + 0x8);
252252
}
253253

254254
Warning("Failed to find vtable for %s\n", name.c_str());

src/utils/plat_win.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ void CModule::InitializeSections()
4848
}
4949
}
5050

51-
void* CModule::FindVirtualTable(const std::string& name)
51+
void** CModule::FindVirtualTable(const std::string& name)
5252
{
5353
auto runTimeData = GetSection(".data");
5454
auto readOnlyData = GetSection(".rdata");
@@ -98,7 +98,7 @@ void* CModule::FindVirtualTable(const std::string& name)
9898
return nullptr;
9999
}
100100

101-
return (void*)((uintptr_t)vtable + 0x8);
101+
return (void**)((uintptr_t)vtable + 0x8);
102102
}
103103

104104
Warning("Failed to find RTTI Complete Object Locator for %s\n", name.c_str());

0 commit comments

Comments
 (0)