2021-12-25 22:36:38 +01:00
|
|
|
#pragma once
|
2022-08-13 11:24:55 +02:00
|
|
|
#include "public/ifilesystem.h"
|
2022-06-12 12:14:31 +02:00
|
|
|
|
2022-08-13 11:24:55 +02:00
|
|
|
class CBaseFileSystem : public IFileSystem
|
2021-12-25 22:36:38 +01:00
|
|
|
{
|
2022-04-09 00:59:42 +02:00
|
|
|
public:
|
2022-08-13 11:24:55 +02:00
|
|
|
//--------------------------------------------------------
|
|
|
|
// Purpose: Static methods used for hooking.
|
|
|
|
//--------------------------------------------------------
|
2022-04-09 00:59:42 +02:00
|
|
|
static void Warning(CBaseFileSystem* pFileSystem, FileWarningLevel_t level, const char* fmt, ...);
|
2022-11-08 01:11:14 +01:00
|
|
|
static bool VCheckDisk(const char* pszFilePath);
|
2022-11-06 12:21:21 +01:00
|
|
|
static FileHandle_t VReadFromVPK(CBaseFileSystem* pFileSystem, FileHandle_t pResults, char* pszFilePath);
|
2023-05-20 14:04:33 +02:00
|
|
|
static bool VReadFromCache(CBaseFileSystem* pFileSystem, char* pszFilePath, FileSystemCache* pCache);
|
2023-05-22 12:32:49 +02:00
|
|
|
static void VAddMapPackFile(CBaseFileSystem* pFileSystem, const char* pPath, const char* pPathID, SearchPathAdd_t addType);
|
2022-11-06 12:21:21 +01:00
|
|
|
static VPKData_t* VMountVPKFile(CBaseFileSystem* pFileSystem, const char* pszVpkPath);
|
|
|
|
static const char* VUnmountVPKFile(CBaseFileSystem* pFileSystem, const char* pszVpkPath);
|
2022-08-13 11:24:55 +02:00
|
|
|
|
2023-05-29 21:41:17 +02:00
|
|
|
CUtlString ReadString(FileHandle_t pFile);
|
2022-11-23 12:18:33 +01:00
|
|
|
|
2022-08-13 11:24:55 +02:00
|
|
|
protected:
|
|
|
|
//----------------------------------------------------------------------------
|
|
|
|
// Purpose: Functions implementing basic file system behavior.
|
|
|
|
//----------------------------------------------------------------------------
|
|
|
|
virtual FILE* FS_fopen(const char* filename, const char* options, unsigned flags, int64* size) = 0;
|
|
|
|
virtual void FS_setbufsize(FILE* fp, unsigned nBytes) = 0;
|
|
|
|
virtual void FS_fclose(FILE* fp) = 0;
|
|
|
|
virtual void FS_fseek(FILE* fp, int64 pos, int seekType) = 0;
|
|
|
|
virtual long FS_ftell(FILE* fp) = 0;
|
|
|
|
virtual int FS_feof(FILE* fp) = 0;
|
|
|
|
virtual size_t FS_fread(void* dest, size_t destSize, size_t size, FILE* fp) = 0;
|
|
|
|
virtual size_t FS_fwrite(const void* src, size_t size, FILE* fp) = 0;
|
|
|
|
virtual bool FS_setmode(FILE* fp, FileMode_t mode) = 0;
|
|
|
|
virtual size_t FS_vfprintf(FILE* fp, const char* fmt, va_list list) = 0;
|
|
|
|
virtual int FS_ferror(FILE* fp) = 0;
|
|
|
|
virtual int FS_fflush(FILE* fp) = 0;
|
|
|
|
virtual char* FS_fgets(char* dest, int destSize, FILE* fp) = 0;
|
|
|
|
virtual int FS_stat(const char* path, struct _stat* buf, bool* pbLoadedFromSteamCache = NULL) = 0;
|
|
|
|
virtual int FS_chmod(const char* path, int pmode) = 0;
|
|
|
|
virtual HANDLE FS_FindFirstFile(const char* findname, WIN32_FIND_DATA* dat) = 0;
|
|
|
|
virtual bool FS_FindNextFile(HANDLE handle, WIN32_FIND_DATA* dat) = 0;
|
|
|
|
virtual bool FS_FindClose(HANDLE handle) = 0;
|
|
|
|
virtual int FS_GetSectorSize(FILE*) = 0;
|
2021-12-25 22:36:38 +01:00
|
|
|
};
|
|
|
|
|
2022-04-09 01:14:22 +02:00
|
|
|
/* ==== CBASEFILESYSTEM ================================================================================================================================================= */
|
2022-04-18 03:35:08 +02:00
|
|
|
inline CMemory p_CBaseFileSystem_Warning;
|
2023-07-02 23:01:29 +02:00
|
|
|
inline void(*v_CBaseFileSystem_Warning)(CBaseFileSystem* pFileSystem, FileWarningLevel_t level, const char* fmt, ...);
|
2022-01-19 19:02:18 +01:00
|
|
|
|
2022-04-18 03:35:08 +02:00
|
|
|
inline CMemory p_CBaseFileSystem_LoadFromVPK;
|
2023-07-02 23:01:29 +02:00
|
|
|
inline FileHandle_t(*v_CBaseFileSystem_LoadFromVPK)(CBaseFileSystem* pFileSystem, FileHandle_t pResults, const char* pszAssetName);
|
2022-01-19 19:02:18 +01:00
|
|
|
|
2022-04-18 03:35:08 +02:00
|
|
|
inline CMemory p_CBaseFileSystem_LoadFromCache;
|
2023-07-02 23:01:29 +02:00
|
|
|
inline bool(*v_CBaseFileSystem_LoadFromCache)(CBaseFileSystem* pFileSystem, const char* pszAssetName, FileSystemCache* pCache);
|
2022-11-06 12:21:21 +01:00
|
|
|
|
2023-05-22 12:32:49 +02:00
|
|
|
inline CMemory p_CBaseFileSystem_AddMapPackFile;
|
2023-07-02 23:01:29 +02:00
|
|
|
inline void(*v_CBaseFileSystem_AddMapPackFile)(CBaseFileSystem* pFileSystem, const char* pPath, const char* pPathID, SearchPathAdd_t addType);
|
2023-05-22 12:32:49 +02:00
|
|
|
|
2022-11-06 12:21:21 +01:00
|
|
|
inline CMemory p_CBaseFileSystem_MountVPKFile;
|
2023-07-02 23:01:29 +02:00
|
|
|
inline VPKData_t*(*v_CBaseFileSystem_MountVPKFile)(CBaseFileSystem* pFileSystem, const char* pszVpkPath);
|
2022-11-06 12:21:21 +01:00
|
|
|
|
|
|
|
inline CMemory p_CBaseFileSystem_UnmountVPKFile;
|
2023-07-03 00:02:08 +02:00
|
|
|
inline const char* (*v_CBaseFileSystem_UnmountVPKFile)(CBaseFileSystem* pFileSystem, const char* pszVpkPath);
|
2022-11-06 12:21:21 +01:00
|
|
|
|
|
|
|
inline CMemory p_CBaseFileSystem_GetMountedVPKHandle;
|
2023-07-02 23:01:29 +02:00
|
|
|
inline int(*v_CBaseFileSystem_GetMountedVPKHandle)(CBaseFileSystem* pFileSystem, const char* pszVpkPath);
|
2022-04-09 00:59:42 +02:00
|
|
|
|
2022-05-27 22:38:49 +02:00
|
|
|
extern CBaseFileSystem* g_pFileSystem;
|
2021-12-25 22:36:38 +01:00
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
2022-05-13 14:53:25 +02:00
|
|
|
class VBaseFileSystem : public IDetour
|
2021-12-25 22:36:38 +01:00
|
|
|
{
|
2022-04-11 01:44:30 +02:00
|
|
|
virtual void GetAdr(void) const
|
2021-12-25 22:36:38 +01:00
|
|
|
{
|
2023-01-25 02:26:52 +01:00
|
|
|
LogFunAdr("CBaseFileSystem::Warning", p_CBaseFileSystem_Warning.GetPtr());
|
|
|
|
LogFunAdr("CBaseFileSystem::LoadFromVPK", p_CBaseFileSystem_LoadFromVPK.GetPtr());
|
|
|
|
LogFunAdr("CBaseFileSystem::LoadFromCache", p_CBaseFileSystem_LoadFromCache.GetPtr());
|
2023-05-22 12:32:49 +02:00
|
|
|
LogFunAdr("CBaseFileSystem::AddMapPackFile", p_CBaseFileSystem_AddMapPackFile.GetPtr());
|
2023-01-25 02:26:52 +01:00
|
|
|
LogFunAdr("CBaseFileSystem::MountVPKFile", p_CBaseFileSystem_MountVPKFile.GetPtr());
|
|
|
|
LogFunAdr("CBaseFileSystem::UnmountVPKFile", p_CBaseFileSystem_UnmountVPKFile.GetPtr());
|
|
|
|
LogFunAdr("CBaseFileSystem::GetMountedVPKHandle", p_CBaseFileSystem_GetMountedVPKHandle.GetPtr());
|
|
|
|
LogVarAdr("g_pFileSystem", reinterpret_cast<uintptr_t>(g_pFileSystem));
|
2021-12-25 22:36:38 +01:00
|
|
|
}
|
2022-04-18 03:35:08 +02:00
|
|
|
virtual void GetFun(void) const
|
|
|
|
{
|
2022-12-01 22:44:55 +01:00
|
|
|
p_CBaseFileSystem_Warning = g_GameDll.FindPatternSIMD("4C 89 4C 24 20 C3 CC CC CC CC CC CC CC CC CC CC 48");
|
|
|
|
p_CBaseFileSystem_LoadFromVPK = g_GameDll.FindPatternSIMD("48 89 5C 24 ?? 57 48 81 EC ?? ?? ?? ?? 49 8B C0 4C 8D 8C 24 ?? ?? ?? ??");
|
|
|
|
p_CBaseFileSystem_LoadFromCache = g_GameDll.FindPatternSIMD("40 53 48 81 EC ?? ?? ?? ?? 80 3D ?? ?? ?? ?? ?? 49 8B D8");
|
2023-05-22 12:32:49 +02:00
|
|
|
p_CBaseFileSystem_AddMapPackFile = g_GameDll.FindPatternSIMD("4C 89 44 24 ?? 48 89 54 24 ?? 55 ?? 41 54 41 55 48 8D AC 24 ?? ?? ?? ??");
|
2022-12-01 22:44:55 +01:00
|
|
|
p_CBaseFileSystem_MountVPKFile = g_GameDll.FindPatternSIMD("48 89 5C 24 ?? 48 89 6C 24 ?? 57 48 81 EC ?? ?? ?? ?? 48 8B F9 4C 8D 05 ?? ?? ?? ??");
|
|
|
|
p_CBaseFileSystem_UnmountVPKFile = g_GameDll.FindPatternSIMD("48 89 5C 24 ?? 57 48 83 EC 20 48 8B DA 48 8B F9 48 8B CB 48 8D 15 ?? ?? ?? ?? E8 ?? ?? ?? ?? 48 85 C0");
|
|
|
|
p_CBaseFileSystem_GetMountedVPKHandle = g_GameDll.FindPatternSIMD("48 89 74 24 ?? 57 48 81 EC ?? ?? ?? ?? 48 8B F9 4C 8D 05 ?? ?? ?? ??");
|
2022-04-18 03:35:08 +02:00
|
|
|
|
2022-11-06 12:21:21 +01:00
|
|
|
v_CBaseFileSystem_Warning = p_CBaseFileSystem_Warning.RCast<void(*)(CBaseFileSystem*, FileWarningLevel_t, const char*, ...)>(); /*4C 89 4C 24 20 C3 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? 48*/
|
|
|
|
v_CBaseFileSystem_LoadFromVPK = p_CBaseFileSystem_LoadFromVPK.RCast<FileHandle_t(*)(CBaseFileSystem*, FileHandle_t, const char*)>(); /*48 89 5C 24 ?? 57 48 81 EC ?? ?? ?? ?? 49 8B C0 4C 8D 8C 24 ?? ?? ?? ??*/
|
2023-05-20 14:04:33 +02:00
|
|
|
v_CBaseFileSystem_LoadFromCache = p_CBaseFileSystem_LoadFromCache.RCast<bool(*)(CBaseFileSystem*, const char*, FileSystemCache*)>(); /*40 53 48 81 EC ?? ?? ?? ?? 80 3D ?? ?? ?? ?? ?? 49 8B D8*/
|
2023-05-22 12:32:49 +02:00
|
|
|
v_CBaseFileSystem_AddMapPackFile = p_CBaseFileSystem_AddMapPackFile.RCast<void (*)(CBaseFileSystem*, const char*, const char*, SearchPathAdd_t)>();
|
2022-11-06 12:21:21 +01:00
|
|
|
v_CBaseFileSystem_MountVPKFile = p_CBaseFileSystem_MountVPKFile.RCast<VPKData_t*(*)(CBaseFileSystem*, const char*)>(); /*48 89 5C 24 ?? 48 89 6C 24 ?? 57 48 81 EC ?? ?? ?? ?? 48 8B F9 4C 8D 05 ?? ?? ?? ??*/
|
|
|
|
v_CBaseFileSystem_UnmountVPKFile = p_CBaseFileSystem_UnmountVPKFile.RCast<const char*(*)(CBaseFileSystem*, const char*)>(); /*48 89 5C 24 ?? 57 48 83 EC 20 48 8B DA 48 8B F9 48 8B CB 48 8D 15 ?? ?? ?? ?? E8 ?? ?? ?? ?? 48 85 C0*/
|
|
|
|
v_CBaseFileSystem_GetMountedVPKHandle = p_CBaseFileSystem_GetMountedVPKHandle.RCast<int (*)(CBaseFileSystem*, const char*)>(); /*48 89 74 24 ?? 57 48 81 EC ?? ?? ?? ?? 48 8B F9 4C 8D 05 ?? ?? ?? ??*/
|
2022-04-18 03:35:08 +02:00
|
|
|
}
|
|
|
|
virtual void GetVar(void) const
|
|
|
|
{
|
2022-12-01 22:44:55 +01:00
|
|
|
g_pFileSystem = g_GameDll.FindPatternSIMD("48 8D 05 ?? ?? ?? ?? 48 89 05 ?? ?? ?? ?? 48 8D 0D ?? ?? ?? ?? 48 8D 05 ?? ?? ?? ?? 48 89 05 ?? ?? ?? ?? E9 ?? ?? ?? ??")
|
|
|
|
.FindPattern("48 89", CMemory::Direction::DOWN, 512, 2).ResolveRelativeAddressSelf(0x3, 0x7).RCast<CBaseFileSystem*>();
|
2022-04-18 03:35:08 +02:00
|
|
|
}
|
2022-04-11 01:44:30 +02:00
|
|
|
virtual void GetCon(void) const { }
|
2023-01-25 02:26:52 +01:00
|
|
|
virtual void Attach(void) const;
|
|
|
|
virtual void Detach(void) const;
|
2021-12-25 22:36:38 +01:00
|
|
|
};
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|