Fix GTA data service (#1635)
* fix(gta_data): service now parses unloaded RPF files
This commit is contained in:
@ -13,12 +13,9 @@ namespace rage
|
||||
{
|
||||
}
|
||||
|
||||
fiDeviceImplemented::~fiDeviceImplemented()
|
||||
{
|
||||
}
|
||||
|
||||
fiDevice::~fiDevice()
|
||||
void fiDeviceImplemented::Destroy()
|
||||
{
|
||||
LOG(FATAL) << "pure fiDevice call (" __FUNCTION__ ")";
|
||||
}
|
||||
|
||||
uint64_t fiDeviceImplemented::Open(const char* fileName, bool)
|
||||
@ -256,6 +253,11 @@ namespace rage
|
||||
big::g_pointers->m_gta.m_fipackfile_ctor(this);
|
||||
}
|
||||
|
||||
fiPackfile::~fiPackfile()
|
||||
{
|
||||
big::g_pointers->m_gta.m_fipackfile_dtor(this);
|
||||
}
|
||||
|
||||
bool fiPackfile::OpenPackfile(const char* archive, bool b_true, int type, intptr_t very_false)
|
||||
{
|
||||
return big::g_pointers->m_gta.m_fipackfile_open_archive(this, archive, b_true, type, very_false);
|
||||
@ -266,6 +268,11 @@ namespace rage
|
||||
return big::g_hooking->get_original<big::hooks::fipackfile_mount>()(this, mount_point);
|
||||
}
|
||||
|
||||
void fiPackfile::ClosePackfile()
|
||||
{
|
||||
big::g_pointers->m_gta.m_fipackfile_close_archive(this);
|
||||
}
|
||||
|
||||
void fiDevice::Unmount(const char* rootPath)
|
||||
{
|
||||
big::g_pointers->m_gta.m_fipackfile_unmount(rootPath);
|
||||
|
@ -33,102 +33,57 @@ namespace rage
|
||||
}
|
||||
|
||||
static bool MountGlobal(const char* mountPoint, fiDevice* device, bool allowRoot);
|
||||
|
||||
static void Unmount(const char* rootPath);
|
||||
|
||||
static void Unmount(fiDevice const& device);
|
||||
|
||||
public:
|
||||
virtual ~fiDevice() = 0;
|
||||
|
||||
virtual uint64_t Open(const char* fileName, bool readOnly) = 0;
|
||||
|
||||
virtual uint64_t OpenBulk(const char* fileName, uint64_t* ptr) = 0;
|
||||
|
||||
virtual uint64_t OpenBulkWrap(const char* fileName, uint64_t* ptr, void*) = 0;
|
||||
|
||||
virtual uint64_t CreateLocal(const char* fileName) = 0;
|
||||
|
||||
virtual uint64_t Create(const char* fileName) = 0;
|
||||
|
||||
virtual uint32_t Read(uint64_t handle, void* buffer, uint32_t toRead) = 0;
|
||||
|
||||
virtual void Destroy() = 0;
|
||||
virtual uint64_t Open(const char* fileName, bool readOnly) = 0;
|
||||
virtual uint64_t OpenBulk(const char* fileName, uint64_t* ptr) = 0;
|
||||
virtual uint64_t OpenBulkWrap(const char* fileName, uint64_t* ptr, void*) = 0;
|
||||
virtual uint64_t CreateLocal(const char* fileName) = 0;
|
||||
virtual uint64_t Create(const char* fileName) = 0;
|
||||
virtual uint32_t Read(uint64_t handle, void* buffer, uint32_t toRead) = 0;
|
||||
virtual uint32_t ReadBulk(uint64_t handle, uint64_t ptr, void* buffer, uint32_t toRead) = 0;
|
||||
|
||||
virtual uint32_t WriteBulk(uint64_t, int, int, int, int) = 0;
|
||||
|
||||
virtual uint32_t Write(uint64_t, void*, int) = 0;
|
||||
|
||||
virtual uint32_t Seek(uint64_t handle, int32_t distance, uint32_t method) = 0;
|
||||
|
||||
virtual uint64_t SeekLong(uint64_t handle, int64_t distance, uint32_t method) = 0;
|
||||
|
||||
virtual int32_t Close(uint64_t handle) = 0;
|
||||
|
||||
virtual int32_t CloseBulk(uint64_t handle) = 0;
|
||||
|
||||
virtual int GetFileLength(uint64_t handle) = 0;
|
||||
|
||||
virtual uint64_t GetFileLengthUInt64(uint64_t handle) = 0;
|
||||
|
||||
// dummy!
|
||||
virtual int m_40(int) = 0;
|
||||
|
||||
virtual bool RemoveFile(const char* file) = 0;
|
||||
virtual int RenameFile(const char* from, const char* to) = 0;
|
||||
virtual int CreateDirectory(const char* dir) = 0;
|
||||
|
||||
virtual int RemoveDirectory(const char* dir) = 0;
|
||||
|
||||
virtual void m_xx() = 0;
|
||||
|
||||
virtual uint64_t GetFileLengthLong(const char* fileName) = 0;
|
||||
|
||||
virtual uint64_t GetFileTime(const char* file) = 0;
|
||||
virtual bool SetFileTime(const char* file, FILETIME fileTime) = 0;
|
||||
|
||||
virtual uint64_t FindFirst(const char* path, fiFindData* findData) = 0;
|
||||
virtual bool FindNext(uint64_t handle, fiFindData* findData) = 0;
|
||||
virtual int FindClose(uint64_t handle) = 0;
|
||||
|
||||
virtual rage::fiDevice* GetUnkDevice() = 0;
|
||||
|
||||
virtual void* m_xy(void*, int, void*) = 0;
|
||||
|
||||
virtual bool Truncate(uint64_t handle) = 0;
|
||||
|
||||
virtual uint32_t GetFileAttributes(const char* path) = 0;
|
||||
|
||||
virtual bool m_xz() = 0;
|
||||
|
||||
virtual bool SetFileAttributes(const char* file, uint32_t FileAttributes) = 0;
|
||||
|
||||
virtual int m_yx() = 0;
|
||||
|
||||
// read even if read() returns less than length
|
||||
virtual bool ReadFull(uint64_t handle, void* buffer, uint32_t length) = 0;
|
||||
|
||||
virtual bool WriteFull(uint64_t handle, void* buffer, uint32_t length) = 0;
|
||||
|
||||
virtual int32_t GetResourceVersion(const char* fileName, ResourceFlags* flags) = 0;
|
||||
|
||||
virtual int32_t m_yy() = 0;
|
||||
|
||||
virtual int32_t m_yz(void*) = 0;
|
||||
|
||||
virtual int32_t m_zx(void*) = 0;// return 0x40000000
|
||||
|
||||
virtual bool IsCollection() = 0;
|
||||
|
||||
virtual bool m_addedIn1290() = 0;
|
||||
|
||||
virtual fiDevice* GetCollection() = 0;// return this
|
||||
|
||||
virtual bool m_ax() = 0;
|
||||
|
||||
virtual int32_t GetCollectionId() = 0;
|
||||
|
||||
virtual const char* GetName() = 0;
|
||||
virtual uint32_t WriteBulk(uint64_t, int, int, int, int) = 0;
|
||||
virtual uint32_t Write(uint64_t, void*, int) = 0;
|
||||
virtual uint32_t Seek(uint64_t handle, int32_t distance, uint32_t method) = 0;
|
||||
virtual uint64_t SeekLong(uint64_t handle, int64_t distance, uint32_t method) = 0;
|
||||
virtual int32_t Close(uint64_t handle) = 0;
|
||||
virtual int32_t CloseBulk(uint64_t handle) = 0;
|
||||
virtual int GetFileLength(uint64_t handle) = 0;
|
||||
virtual uint64_t GetFileLengthUInt64(uint64_t handle) = 0;
|
||||
virtual int m_40(int) = 0;
|
||||
virtual bool RemoveFile(const char* file) = 0;
|
||||
virtual int RenameFile(const char* from, const char* to) = 0;
|
||||
virtual int CreateDirectory(const char* dir) = 0;
|
||||
virtual int RemoveDirectory(const char* dir) = 0;
|
||||
virtual void m_xx() = 0;
|
||||
virtual uint64_t GetFileLengthLong(const char* fileName) = 0;
|
||||
virtual uint64_t GetFileTime(const char* file) = 0;
|
||||
virtual bool SetFileTime(const char* file, FILETIME fileTime) = 0;
|
||||
virtual uint64_t FindFirst(const char* path, fiFindData* findData) = 0;
|
||||
virtual bool FindNext(uint64_t handle, fiFindData* findData) = 0;
|
||||
virtual int FindClose(uint64_t handle) = 0;
|
||||
virtual rage::fiDevice* GetUnkDevice() = 0;
|
||||
virtual void* m_xy(void*, int, void*) = 0;
|
||||
virtual bool Truncate(uint64_t handle) = 0;
|
||||
virtual uint32_t GetFileAttributes(const char* path) = 0;
|
||||
virtual bool m_xz() = 0;
|
||||
virtual bool SetFileAttributes(const char* file, uint32_t FileAttributes) = 0;
|
||||
virtual int m_yx() = 0;
|
||||
virtual bool ReadFull(uint64_t handle, void* buffer, uint32_t length) = 0;
|
||||
virtual bool WriteFull(uint64_t handle, void* buffer, uint32_t length) = 0;
|
||||
virtual int32_t GetResourceVersion(const char* fileName, ResourceFlags* flags) = 0;
|
||||
virtual int32_t m_yy() = 0;
|
||||
virtual int32_t m_yz(void*) = 0;
|
||||
virtual int32_t m_zx(void*) = 0;
|
||||
virtual bool IsCollection() = 0;
|
||||
virtual bool m_addedIn1290() = 0;
|
||||
virtual fiDevice* GetCollection() = 0;
|
||||
virtual bool m_ax() = 0;
|
||||
virtual int32_t GetCollectionId() = 0;
|
||||
virtual const char* GetName() = 0;
|
||||
};
|
||||
|
||||
class fiDeviceImplemented : public fiDevice
|
||||
@ -137,144 +92,64 @@ namespace rage
|
||||
fiDeviceImplemented();
|
||||
|
||||
public:
|
||||
virtual ~fiDeviceImplemented();
|
||||
|
||||
virtual void Destroy();
|
||||
virtual uint64_t Open(const char* fileName, bool readOnly);
|
||||
|
||||
virtual uint64_t OpenBulk(const char* fileName, uint64_t* ptr);
|
||||
|
||||
virtual uint64_t OpenBulkWrap(const char* fileName, uint64_t* ptr, void* a3);
|
||||
|
||||
virtual uint64_t CreateLocal(const char* fileName);
|
||||
|
||||
virtual uint64_t Create(const char* fileName);
|
||||
|
||||
virtual uint32_t Read(uint64_t handle, void* buffer, uint32_t toRead);
|
||||
|
||||
virtual uint32_t ReadBulk(uint64_t handle, uint64_t ptr, void* buffer, uint32_t toRead);
|
||||
|
||||
virtual uint32_t WriteBulk(uint64_t, int, int, int, int);
|
||||
|
||||
virtual uint32_t Write(uint64_t, void*, int);
|
||||
|
||||
virtual uint32_t Seek(uint64_t handle, int32_t distance, uint32_t method);
|
||||
|
||||
virtual uint64_t SeekLong(uint64_t handle, int64_t distance, uint32_t method);
|
||||
|
||||
virtual int32_t Close(uint64_t handle);
|
||||
|
||||
virtual int32_t CloseBulk(uint64_t handle);
|
||||
|
||||
virtual int GetFileLength(uint64_t handle);
|
||||
|
||||
virtual uint64_t GetFileLengthUInt64(uint64_t handle);
|
||||
|
||||
// dummy!
|
||||
virtual int m_40(int);
|
||||
|
||||
virtual bool RemoveFile(const char* file);
|
||||
virtual int RenameFile(const char* from, const char* to);
|
||||
virtual int CreateDirectory(const char* dir);
|
||||
|
||||
virtual int RemoveDirectory(const char* dir);
|
||||
|
||||
virtual void m_xx();
|
||||
|
||||
virtual uint64_t GetFileLengthLong(const char* fileName);
|
||||
|
||||
virtual uint64_t GetFileTime(const char* file);
|
||||
virtual bool SetFileTime(const char* file, FILETIME fileTime);
|
||||
|
||||
virtual uint64_t FindFirst(const char* path, fiFindData* findData);
|
||||
virtual bool FindNext(uint64_t handle, fiFindData* findData);
|
||||
virtual int FindClose(uint64_t handle);
|
||||
|
||||
virtual rage::fiDevice* GetUnkDevice();
|
||||
|
||||
virtual void* m_xy(void* a1, int a2, void* a3);
|
||||
|
||||
virtual bool Truncate(uint64_t handle);
|
||||
|
||||
virtual uint32_t GetFileAttributes(const char* path);
|
||||
|
||||
virtual bool m_xz();
|
||||
|
||||
virtual bool SetFileAttributes(const char* file, uint32_t FileAttributes);
|
||||
|
||||
virtual int m_yx();
|
||||
|
||||
// read even if read() returns less than length
|
||||
virtual bool ReadFull(uint64_t handle, void* buffer, uint32_t length);
|
||||
|
||||
virtual bool WriteFull(uint64_t handle, void* buffer, uint32_t length);
|
||||
|
||||
virtual int32_t GetResourceVersion(const char* fileName, ResourceFlags* version);
|
||||
|
||||
virtual int32_t m_yy();
|
||||
|
||||
virtual int32_t m_yz(void*);
|
||||
|
||||
virtual int32_t m_zx(void*);// return 0x40000000
|
||||
|
||||
virtual int32_t m_zx(void*); // return 0x40000000
|
||||
virtual bool IsCollection();
|
||||
|
||||
virtual bool m_addedIn1290();
|
||||
|
||||
virtual fiDevice* GetCollection();// return this
|
||||
|
||||
virtual fiDevice* GetCollection(); // return this
|
||||
virtual bool m_ax();
|
||||
|
||||
virtual int32_t GetCollectionId();
|
||||
|
||||
virtual const char* GetName();
|
||||
};
|
||||
|
||||
class fiDeviceRelative : public fiDeviceImplemented
|
||||
{
|
||||
private:
|
||||
char m_pad[272];
|
||||
|
||||
public:
|
||||
fiDeviceRelative();
|
||||
|
||||
// any RAGE path can be used; including root-relative paths
|
||||
void SetPath(const char* relativeTo, rage::fiDevice* baseDevice, bool allowRoot);
|
||||
|
||||
// compatibility wrapper for NY code
|
||||
inline void SetPath(const char* relativeTo, bool allowRoot)
|
||||
{
|
||||
SetPath(relativeTo, nullptr, allowRoot);
|
||||
}
|
||||
|
||||
// mounts the device in the device stack
|
||||
void Mount(const char* mountPoint);
|
||||
};
|
||||
|
||||
class fiEncryptingDevice : public fiDeviceImplemented
|
||||
{
|
||||
private:
|
||||
void* m_keyState;
|
||||
void* m_0010;
|
||||
char m_buffer[4096];
|
||||
bool m_1018;
|
||||
alignas(int) char m_pad[64];// unsure
|
||||
|
||||
private:
|
||||
void* AllocKeyState(const uint8_t* key);
|
||||
|
||||
public:
|
||||
fiEncryptingDevice(const std::array<uint8_t, 32>& key);
|
||||
|
||||
void FreeKeyState();
|
||||
};
|
||||
|
||||
class fiPackfile : public fiDeviceImplemented
|
||||
{
|
||||
private:
|
||||
char m_pad[368 + (0x650 - 0x590)];
|
||||
char m_pad[368 + (0x650 - 0x590)]{};
|
||||
|
||||
public:
|
||||
fiPackfile();
|
||||
~fiPackfile();
|
||||
|
||||
// any RAGE path can be used; including root-relative paths
|
||||
bool OpenPackfile(const char* archive, bool bTrue, int type, intptr_t veryFalse);
|
||||
|
Reference in New Issue
Block a user