Reverse engineer 'CAppSystemGroup' class

Partially reverse engineered.
This commit is contained in:
Kawe Mazidjatari 2023-04-01 01:07:20 +02:00
parent 5056d8f040
commit 2fdcf2ce2c
2 changed files with 97 additions and 6 deletions

View File

@ -12,16 +12,24 @@
//-----------------------------------------------------------------------------
// Purpose: Initialize plugin system
//-----------------------------------------------------------------------------
void CAppSystemGroup::Destroy(CAppSystemGroup* pModAppSystemGroup)
void CAppSystemGroup::S_Destroy(CAppSystemGroup* pModAppSystemGroup)
{
CAppSystemGroup_Destroy(pModAppSystemGroup);
}
//-----------------------------------------------------------------------------
// Returns the stage at which the app system group ran into an error
//-----------------------------------------------------------------------------
CAppSystemGroup::AppSystemGroupStage_t CAppSystemGroup::GetCurrentStage() const
{
return m_nCurrentStage;
}
void VAppSystemGroup::Attach(void) const
{
DetourAttach(&CAppSystemGroup_Destroy, &CAppSystemGroup::Destroy);
DetourAttach(&CAppSystemGroup_Destroy, &CAppSystemGroup::S_Destroy);
}
void VAppSystemGroup::Detach(void) const
{
DetourDetach(&CAppSystemGroup_Destroy, &CAppSystemGroup::Destroy);
DetourDetach(&CAppSystemGroup_Destroy, &CAppSystemGroup::S_Destroy);
}

View File

@ -1,13 +1,96 @@
#ifndef APPSYSTEMGROUP_H
#define APPSYSTEMGROUP_H
class CAppSystemGroup
#include "public/interface.h"
#include "tier1/utlvector.h"
#include "filesystem/filesystem.h"
//-----------------------------------------------------------------------------
// NOTE: The following methods must be implemented in your application
// although they can be empty implementations if you like...
//-----------------------------------------------------------------------------
abstract_class IAppSystemGroup
{
public:
static void Destroy(CAppSystemGroup* pAppSystemGroup);
virtual ~IAppSystemGroup() {}
// An installed application creation function, you should tell the group
// the DLLs and the singleton interfaces you want to instantiate.
// Return false if there's any problems and the app will abort
virtual bool Create() = 0;
// Allow the application to do some work after AppSystems are connected but
// they are all Initialized.
// Return false if there's any problems and the app will abort
virtual bool PreInit() = 0;
// Allow the application to do some work after AppSystems are initialized but
// before main is run
// Return false if there's any problems and the app will abort
virtual bool PostInit() = 0;
// Main loop implemented by the application
virtual int Main() = 0;
// Allow the application to do some work after all AppSystems are shut down
virtual void PreShutdown() = 0;
// Allow the application to do some work after all AppSystems are shut down
virtual void PostShutdown() = 0;
// Call an installed application destroy function, occurring after all modules
// are unloaded
virtual void Destroy() = 0;
};
//-----------------------------------------------------------------------------
// This class represents a group of app systems that all have the same lifetime
// that need to be connected/initialized, etc. in a well-defined order
//-----------------------------------------------------------------------------
class CAppSystemGroup : public IAppSystemGroup
{
public:
// Used to determine where we exited out from the system
enum AppSystemGroupStage_t
{
CREATION = 0,
DEPENDENCIES,
CONNECTION,
PREINITIALIZATION,
INITIALIZATION,
POSTINITIALIZATION,
RUNNING,
PRESHUTDOWN,
SHUTDOWN,
POSTSHUTDOWN,
DISCONNECTION,
DESTRUCTION,
APPSYSTEM_GROUP_STAGE_COUNT,
NONE, // This means no error
};
// Detour statics.
static void S_Destroy(CAppSystemGroup* pAppSystemGroup);
// Returns the stage at which the app system group ran into an error
AppSystemGroupStage_t GetCurrentStage() const;
private:
struct Module_t
{
void /*CSysModule*/* m_pModule;
CreateInterfaceFn m_Factory;
char* m_pModuleName;
};
protected:
char pad[0xA8];
CUtlVector<Module_t> m_Modules;
CUtlVector<IAppSystem*> m_Systems;
CUtlVector<CreateInterfaceFn> m_NonAppSystemFactories;
char m_Pad[56]; // <-- unknown
AppSystemGroupStage_t m_nCurrentStage;
CFileSystem_Stdio* m_pFileSystem;
};
inline CMemory p_CAppSystemGroup_Destroy;