From 3cd843a2205633de1ee594f24426eaafd1fb2cc6 Mon Sep 17 00:00:00 2001 From: superp00t Date: Sun, 16 Mar 2025 03:25:07 -0400 Subject: [PATCH] feat(profile): add more filesystem API stuff --- .../ida/batch/import_data_types.idc | 40 ++- .../ida/batch/import_functions.idc | 7 + .../ida/batch/import_symbols.idc | 44 +++ .../3.3.5a-windows-386/include/bc/file/info.h | 10 +- .../3.3.5a-windows-386/include/bc/file/mode.h | 20 ++ .../include/bc/file/removedirectory.h | 11 + .../include/bc/file/stream.h | 3 +- profile/3.3.5a-windows-386/include/bc/main.h | 14 + .../3.3.5a-windows-386/include/bc/os/file.h | 12 + .../include/bc/os/file_data.h | 20 ++ .../3.3.5a-windows-386/include/bc/osfile.h | 8 - .../include/bc/systemfile/stacked.h | 25 +- profile/3.3.5a-windows-386/include/main.h | 9 +- profile/3.3.5a-windows-386/symbol/bc/func.sym | 61 +++- .../3.3.5a-windows-386/symbol/bc/label.sym | 6 +- .../3.3.5a-windows-386/symbol/client/func.sym | 6 +- .../symbol/gxformat/func.sym | 1 + profile/3.3.5a-windows-386/symbol/main.sym | 68 +++- profile/3.3.5a-windows-386/x64dbg/game.dd32 | Bin 109513 -> 110972 bytes profile/3.3.5a-windows-386/x64dbg/types.json | 292 +++++++++++------- 20 files changed, 494 insertions(+), 163 deletions(-) create mode 100644 profile/3.3.5a-windows-386/include/bc/file/mode.h create mode 100644 profile/3.3.5a-windows-386/include/bc/file/removedirectory.h create mode 100644 profile/3.3.5a-windows-386/include/bc/main.h create mode 100644 profile/3.3.5a-windows-386/include/bc/os/file.h create mode 100644 profile/3.3.5a-windows-386/include/bc/os/file_data.h delete mode 100644 profile/3.3.5a-windows-386/include/bc/osfile.h create mode 100644 profile/3.3.5a-windows-386/symbol/gxformat/func.sym diff --git a/profile/3.3.5a-windows-386/ida/batch/import_data_types.idc b/profile/3.3.5a-windows-386/ida/batch/import_data_types.idc index fab6265..1fb2ce9 100644 --- a/profile/3.3.5a-windows-386/ida/batch/import_data_types.idc +++ b/profile/3.3.5a-windows-386/ida/batch/import_data_types.idc @@ -6,25 +6,39 @@ static import_data_types() { apply_type(0x00401030, "void __stdcall func(void* ptr)"); apply_type(0x00408070, "void __stdcall func(float* minX, float* maxX, float* minY, float* maxY, float* minZ, float* maxZ)"); apply_type(0x00409670, "void __thiscall func(CGxDevice* this)"); - apply_type(0x004271D0, "bool __stdcall func(char* name, Blizzard__File__Info* info)"); - apply_type(0x00427250, "Blizzard__File__Info* __stdcall func(Blizzard__File__StreamRecord* file)"); + apply_type(0x004271D0, "bool __stdcall func(char* name, Blizzard__File__FileInfo* info)"); + apply_type(0x00427250, "Blizzard__File__FileInfo* __stdcall func(Blizzard__File__StreamRecord* file)"); apply_type(0x004272C0, "bool __stdcall func(Blizzard__File__StreamRecord* file, Blizzard__File__FileInfo* info)"); + apply_type(0x00427560, "bool __stdcall func(char* src, char* dst)"); + apply_type(0x004275B0, "bool __stdcall func(char* src, char* dst, bool overwrite)"); + apply_type(0x00427660, "bool __stdcall func(char* name, void* param, Blizzard__File__ProcessDirCallback callback, bool flag)"); + apply_type(0x00427720, "bool __stdcall func(Blizzard__File__StreamRecord* file, void* data, int64_t offset, uint32_t* count)"); + apply_type(0x00427910, "bool __stdcall func(Blizzard__File__StreamRecord* file, int64_t offset, int32_t whence)"); + apply_type(0x004279B0, "bool __stdcall func(Blizzard__File__StreamRecord* file, void *data, uint32_t* count)"); apply_type(0x00427CC0, "int32_t __stdcall func(Blizzard__File__Filesystem* fs, System_File__Stacked__FileParms* parms)"); apply_type(0x00427D10, "int32_t __stdcall func(Blizzard__File__Filesystem* fs, System_File__Stacked__FileParms* parms)"); + apply_type(0x00428210, "bool __stdcall func(char* name, char* pattern)"); apply_type(0x00428500, "char* __stdcall func(char* str)"); apply_type(0x00428670, "int32_t __stdcall func(char* dst, const char* src, int32_t count)"); + apply_type(0x004286C0, "int32_t __stdcall func(char* dst, char* src, int32_t count)"); apply_type(0x00428940, "int32_t __stdcall func(uint8_t* dst, uint32_t dstmaxchars, const uint16_t* src, uint32_t srcmaxchars, uint32_t* dstchars, uint32_t* srcchars)"); apply_type(0x00428B00, "int32_t __stdcall func(uint16_t* dst, uint32_t dstmaxchars, const uint8_t* src, uint32_t srcmaxchars, uint32_t* dstchars, uint32_t* srcchars)"); apply_type(0x00428F00, "Blizzard__Time__Timestamp __stdcall func(uint64_t fileTime)"); + apply_type(0x0042A9B0, "void __stdcall func(char* src, char* dst, int32_t count)"); + apply_type(0x0042AA00, "void __stdcall func(char* src, char* dst, int32_t count)"); apply_type(0x0042D440, "int32_t __stdcall func(Blizzard__File__Filesystem* fs, System_File__Stacked__FileParms* parms)"); apply_type(0x0042D620, "int32_t __stdcall func(Blizzard__File__Filesystem* fs, System_File__Stacked__FileParms* parms)"); + apply_type(0x0042E4B0, "void __stdcall func(char* dst, int32_t count, char separator)"); apply_type(0x004325C0, "int32_t __stdcall func(Blizzard__File__Filesystem* fs, System_File__Stacked__FileParms* parms)"); + apply_type(0x00433510, "void __stdcall func(char* a1, int32_t a2, char* a3, char* a4)"); apply_type(0x00433590, "void __stdcall func(uint8_t *buffer, uint32_t buffersize, const char *str)"); apply_type(0x00435580, "void __stdcall func(Blizzard__File__StreamRecord* file)"); apply_type(0x004356B0, "int32_t __stdcall func(Blizzard__File__Filesystem* fs, System_File__Stacked__FileParms* parms)"); apply_type(0x00435790, "int32_t __stdcall func(Blizzard__File__Filesystem* fs, System_File__Stacked__FileParms* parms)"); apply_type(0x00435890, "int32_t __stdcall func(Blizzard__File__Filesystem* fs, System_File__Stacked__FileParms* parms)"); apply_type(0x004359C0, "int32_t __stdcall func(Blizzard__File__Filesystem* fs, System_File__Stacked__FileParms* parms)"); + apply_type(0x0044FA10, "bool __stdcall func(Blizzard__File__ProcessDirParms* dirwalkparms)"); + apply_type(0x004549B0, "bool __stdcall func(uint32_t flags, DWORD* sharemode, DWORD* desiredaccess, DWORD* creationdisposition, DWORD* flagsandattributes)"); apply_type(0x00454A50, "int32_t __stdcall func(Blizzard__File__Filesystem* fs, System_File__Stacked__FileParms* parms)"); apply_type(0x00454AC0, "int32_t __stdcall func(Blizzard__File__Filesystem* fs, System_File__Stacked__FileParms* parms)"); apply_type(0x00454AE0, "int32_t __stdcall func(Blizzard__File__Filesystem* fs, System_File__Stacked__FileParms* parms)"); @@ -45,6 +59,26 @@ static import_data_types() { apply_type(0x00455BA0, "int32_t __stdcall func(Blizzard__File__Filesystem* fs, System_File__Stacked__FileParms* parms)"); apply_type(0x00455CA0, "int32_t __stdcall func(Blizzard__File__Filesystem* fs, System_File__Stacked__FileParms* parms)"); apply_type(0x00455D20, "int32_t __stdcall func(Blizzard__File__Filesystem* fs, System_File__Stacked__FileParms* parms)"); + apply_type(0x00461B00, "void __stdcall func(HOSFILE fileHandle)"); + apply_type(0x00461B10, "int32_t __stdcall func(char* path)"); + apply_type(0x00461B30, "int32_t __stdcall func(char* dirName)"); + apply_type(0x00461B50, "int32_t __stdcall func(HOSFILE fileHandle, void* buffer, uint32_t bytesToRead, uint32_t* bytesRead)"); + apply_type(0x00461B90, "int32_t __stdcall func(HOSFILE fileHandle, void* buffer, uint32_t bytesToWrite, uint32_t* bytesWritten)"); + apply_type(0x00461BD0, "void __stdcall func(HOSFILE fileHandle)"); + apply_type(0x00461C00, "uint32_t __stdcall func(char* fileName)"); + apply_type(0x00461C40, "int32_t __stdcall func(char* fileName, uint32_t attributes)"); + apply_type(0x00461C70, "int32_t __stdcall func(char* existingFileName, char* newFileName)"); + apply_type(0x00461CA0, "int32_t __stdcall func(char* existingFileName, char* newFileName, int32_t failIfExists)"); + apply_type(0x00461CE0, "int32_t __stdcall func(char* fileName)"); + apply_type(0x00461D10, "int32_t __stdcall func(char* pathName, int32_t recursive)"); + apply_type(0x00461D40, "int32_t __stdcall func(char* pathName)"); + apply_type(0x00461D70, "int32_t __stdcall func(char* pathName, uint32_t flags)"); + apply_type(0x00461DB0, "int32_t __stdcall func(char* pathName)"); + apply_type(0x00461DE0, "int32_t __stdcall func(uint32_t buffersize, char* buffer)"); + apply_type(0x00461E10, "bool __stdcall func(Blizzard__File__ProcessDirParms* parms)"); + apply_type(0x00461EF0, "Blizzard__File__Mode __stdcall func(uint32_t desiredAcccess, uint8_t shareMode, uint32_t createDisposition)"); + apply_type(0x00461F70, "char* __stdcall func()"); + apply_type(0x00461FA0, "HOSFILE __stdcall func(char* fileName, uint32_t desiredAccess, uint32_t shareMode, uint32_t createDisposition, uint32_t flagsAndAttributes, uint32_t extendedFileType)"); apply_type(0x0047B6F0, "int32_t __stdcall func(CMDOPT)"); apply_type(0x0047B700, "char* __stdcall func(CMDOPT)"); apply_type(0x0047B720, "int32_t __stdcall func()"); @@ -97,6 +131,7 @@ static import_data_types() { apply_type(0x00681790, "void __stdcall func(uint32_t maxFPSBk)"); apply_type(0x006817C0, "void __stdcall func()"); apply_type(0x006817E0, "int __stdcall func(char* format, ...)"); + apply_type(0x00681950, "CGxFormat* __thiscall func(CGxFormat* this)"); apply_type(0x00681A60, "void __stdcall func()"); apply_type(0x00681AB0, "void __stdcall func(uint32_t indexCount, uint16_t* indices)"); apply_type(0x00681B00, "void __stdcall func(CGxBuf* buf, EGxVertexBufferFormat format)"); @@ -473,6 +508,7 @@ static import_data_types() { apply_type(0x009AD000, "void __thiscall func(DayNight__DNGlare* this, char* a1)"); apply_type(0x009E537C, "uint32_t[7]"); apply_type(0x009E5398, "uint8_t[256]"); + apply_type(0x009E5630, "Blizzard__File__FileInfo"); apply_type(0x009E9EC8, "uint32_t[7]"); apply_type(0x00A2DDC0, "CGxDevice__vtable"); apply_type(0x00AB90AC, "Blizzard__File__Filesystem*"); diff --git a/profile/3.3.5a-windows-386/ida/batch/import_functions.idc b/profile/3.3.5a-windows-386/ida/batch/import_functions.idc index 6ee3808..31c85d9 100644 --- a/profile/3.3.5a-windows-386/ida/batch/import_functions.idc +++ b/profile/3.3.5a-windows-386/ida/batch/import_functions.idc @@ -8,10 +8,16 @@ static import_functions() { set_func_cmt(0x004010D0, "CDataStore::IsRead() const", 0); set_func_cmt(0x004010E0, "CDataStore::Reset()", 0); set_func_cmt(0x00401130, "CDataStore::Finalize()", 0); + set_func_cmt(0x00401200, "int __cdecl PatchFiles::qsortpatchfiles(char **, char **)", 0); set_func_cmt(0x004038A0, "CDataStore::~CDataStore()", 0); + set_func_cmt(0x00405A10, "int __cdecl PatchFiles::EnumPatchArchives(OS_FILE_DATA *fileData, PatchOnDemand__Cache *cbParam)", 0); + set_func_cmt(0x00405AB0, "int __thiscall PatchFiles::LoadArchives(PatchFiles *this, const char *localeCode, char a3)", 0); set_func_cmt(0x00427130, "Blizzard::File::Delete(char const*)", 0); set_func_cmt(0x00427500, "Blizzard::File::MakeAbsolutePath(char const*, char*, int, bool)", 0); set_func_cmt(0x00427560, "Blizzard::File::Move(char const*, char const*)", 0); + set_func_cmt(0x00427720, "Blizzard::File::Read(Blizzard::File::StreamRecord*, void*, long long, int*, int)", 0); + set_func_cmt(0x00433510, "Blizzard::String::JoinPath(char*, int, char const*, char const*)", 0); + set_func_cmt(0x0044FA10, "Blizzard::File::RemoveDirectoryAndContents(char const*, bool)::Internal::Callback(Blizzard::File::ProcessDirParms const&)", 0); set_func_cmt(0x0047ADE0, "CDataStore::GetBufferParams(void const**, unsigned int*, unsigned int*)", 0); set_func_cmt(0x0047AE10, "CDataStore::DetachBuffer(void**, unsigned int*, unsigned int*)", 0); set_func_cmt(0x0047AE50, "virtual void __thiscall CDataStore::InternalDestroy(unsigned char * &,unsigned int &,unsigned int &)", 0); @@ -33,6 +39,7 @@ static import_functions() { set_func_cmt(0x0047B480, "CDataStore::GetString(char*, unsigned int)", 0); set_func_cmt(0x0047B560, "CDataStore::GetArray(unsigned char*, unsigned int)", 0); set_func_cmt(0x0047B6B0, "CDataStore::GetDataInSitu(void*&, unsigned int)", 0); + set_func_cmt(0x0047B800, "void __cdecl quicksort(unsigned int, unsigned int, int, int (__cdecl *)(unsigned int, unsigned int, int), int)", 0); set_func_cmt(0x0047F230, "IEvtSchedulerProcess as an independent function appears to be optimized out", 0); set_func_cmt(0x004A2780, "_CBackdropGenerator::LoadXML(linkObject*, CStatus*)", 0); set_func_cmt(0x004A81B0, "FrameScript_GetObjectThis(lua_State*, int)", 0); diff --git a/profile/3.3.5a-windows-386/ida/batch/import_symbols.idc b/profile/3.3.5a-windows-386/ida/batch/import_symbols.idc index 4dd0c20..24c6312 100644 --- a/profile/3.3.5a-windows-386/ida/batch/import_symbols.idc +++ b/profile/3.3.5a-windows-386/ida/batch/import_symbols.idc @@ -8,9 +8,12 @@ static import_symbols() { set_name(0x004010D0, "CDataStore__IsRead"); set_name(0x004010E0, "CDataStore__Reset"); set_name(0x00401130, "CDataStore__Finalize"); + set_name(0x00401200, "PatchFiles__qsortpatchfiles"); set_name(0x00402B20, "SetPaths"); set_name(0x004033B0, "ClientKillTimer"); set_name(0x004038A0, "CDataStore__destructor"); + set_name(0x00405A10, "PatchFiles__EnumPatchArchives"); + set_name(0x00405AB0, "PatchFiles__LoadArchives"); set_name(0x004067F0, "InitializeGlobal"); set_name(0x00406B70, "DestroyGlobal"); set_name(0x00406C70, "CommonMain"); @@ -42,6 +45,7 @@ static import_symbols() { set_name(0x00424F80, "SFile__Open"); set_name(0x004270F0, "Blizzard__File__Close"); set_name(0x00427130, "Blizzard__File__Delete"); + set_name(0x00427170, "Blizzard__File__Exists"); set_name(0x004271D0, "Blizzard__File__GetFileInfo"); set_name(0x00427250, "Blizzard__File__GetFileInfo@2"); set_name(0x004272C0, "Blizzard__File__GetFileInfo@3"); @@ -53,22 +57,40 @@ static import_symbols() { set_name(0x00427560, "Blizzard__File__Move"); set_name(0x004275B0, "Blizzard__File__Copy"); set_name(0x00427600, "Blizzard__File__Open"); + set_name(0x00427660, "Blizzard__File__ProcessDirFast"); set_name(0x004276C0, "Blizzard__File__Read"); + set_name(0x00427720, "Blizzard__File__Read@2"); + set_name(0x00427800, "Blizzard__File__RemoveDirectory"); + set_name(0x00427850, "Blizzard__File__SetAttributes"); + set_name(0x00427910, "Blizzard__File__SetPos"); + set_name(0x00427970, "Blizzard__File__SetWorkingDirectory"); set_name(0x004279B0, "Blizzard__File__Write"); + set_name(0x00427C20, "System_File__ToNativeAttributes"); set_name(0x00427C70, "System_File__FromNativeAttributes"); set_name(0x00427CC0, "System_File__ReadP"); set_name(0x00427D10, "System_File__WriteP"); + set_name(0x004281D0, "Blizzard__File__IsDirectory"); + set_name(0x004281F0, "Blizzard__File__IsFile"); + set_name(0x00428210, "Blizzard__File__SimpleGlob"); set_name(0x00428500, "Blizzard__String__FindFilename"); + set_name(0x00428640, "Blizzard__String__FirstPathSeparator"); set_name(0x00428670, "Blizzard__String__Copy"); + set_name(0x004286C0, "Blizzard__String__Append"); set_name(0x00428940, "Blizzard__Unicode__ConvertUTF16to8"); set_name(0x00428B00, "Blizzard__Unicode__ConvertUTF8to16"); set_name(0x00428F00, "Blizzard__Time__FromFileTime"); + set_name(0x0042A9B0, "Blizzard__String__MakeUnivPath"); + set_name(0x0042AA00, "Blizzard__String__MakeBackslashPath"); set_name(0x0042CEA0, "Blizzard__File__CreateDirectory"); set_name(0x0042CFB0, "HoistAll"); set_name(0x0042D440, "System_File__Stacked__file_init"); set_name(0x0042D620, "System_File__Close"); + set_name(0x0042E420, "Blizzard__String__MakeConsistentPath"); + set_name(0x0042E4B0, "Blizzard__File__ForceTrailingSeparator"); + set_name(0x0042E630, "Blizzard__String__FindPathSeparatorReverse"); set_name(0x0042E670, "Blizzard__String__Format"); set_name(0x004325C0, "System_File__GetRootChars"); + set_name(0x00433510, "Blizzard__String__JoinPath"); set_name(0x00433590, "System_File__FromNativeName"); set_name(0x00433650, "Blizzard__String__QuickNativePath_300__QuickNativePath"); set_name(0x00435580, "System_File__GetFileInfoByFile"); @@ -76,8 +98,11 @@ static import_symbols() { set_name(0x00435790, "System_File__MakeAbsolutePath"); set_name(0x00435890, "System_File__Move"); set_name(0x004359C0, "System_File__Delete"); + set_name(0x0044FA10, "Blizzard__File__RemoveDirectoryAndContents__Internal__Callback"); + set_name(0x004518C0, "Blizzard__File__RemoveDirectoryAndContents"); set_name(0x00454870, "System_File__read_overlapped"); set_name(0x00454910, "System_File__write_overlapped"); + set_name(0x004549B0, "System_File__ToCreateFlags"); set_name(0x00454A50, "System_File__SetWorkingDirectory"); set_name(0x00454AC0, "System_File__Create"); set_name(0x00454AE0, "System_File__GetWorkingDirectory"); @@ -102,11 +127,26 @@ static import_symbols() { set_name(0x00457910, "System_File__write_locked"); set_name(0x00459910, "System_File__detect_io_mode"); set_name(0x00461B00, "OsCloseFile"); + set_name(0x00461B10, "OsFileExists"); + set_name(0x00461B30, "OsDirectoryExists"); set_name(0x00461B50, "OsReadFile"); + set_name(0x00461B90, "OsWriteFile"); set_name(0x00461BD0, "OsGetFileSize"); + set_name(0x00461C00, "OsGetFileAttributes"); + set_name(0x00461C40, "OsSetFileAttributes"); + set_name(0x00461C70, "OsMoveFile"); + set_name(0x00461CA0, "OsCopyFile"); + set_name(0x00461CE0, "OsDeleteFile"); set_name(0x00461D10, "OsCreateDirectory"); + set_name(0x00461D40, "OsRemoveDirectory"); + set_name(0x00461D70, "OsRemoveDirectoryRecurse"); set_name(0x00461DB0, "OsSetCurrentDirectory"); + set_name(0x00461DE0, "OsGetCurrentDirectory"); + set_name(0x00461E10, "OsFileList__Internal__Callback"); + set_name(0x00461EF0, "OsCreateFileMode"); + set_name(0x00461F70, "OsFileGetDownloadFolder"); set_name(0x00461FA0, "OsCreateFile"); + set_name(0x00462000, "OsFileList"); set_name(0x0047ADD0, "nullsub_2"); set_name(0x0047ADE0, "CDataStore__GetBufferParams"); set_name(0x0047AE10, "CDataStore__DetachBuffer"); @@ -133,6 +173,7 @@ static import_symbols() { set_name(0x0047B700, "CmdLineGetString"); set_name(0x0047B720, "CmdLineProcess"); set_name(0x0047B760, "j_nullsub_3"); + set_name(0x0047B800, "quicksort"); set_name(0x0047B9E0, "ConvertUTF16toUTF8"); set_name(0x0047BF30, "HandleClose"); set_name(0x0047BF50, "HandleCreate"); @@ -2204,6 +2245,7 @@ static import_symbols() { set_name(0x00681790, "GxSetMaxFPSBk"); set_name(0x006817C0, "GxLogOpen"); set_name(0x006817E0, "GxLog"); + set_name(0x00681950, "CGxFormat__CGxFormat"); set_name(0x00681A60, "GxDrawLockedElements"); set_name(0x00681AB0, "GxPrimIndexPtr"); set_name(0x00681B00, "GxPrimVertexPtr"); @@ -3015,6 +3057,7 @@ static import_symbols() { set_name(0x009DE1D0, "nullsub_150"); set_name(0x009E537C, "firstByteMark"); set_name(0x009E5398, "bytesFromUTF8"); + set_name(0x009E5630, "s_noinfo"); set_name(0x009E9EC8, "firstByteMark@2"); set_name(0x009F1074, "s_pixelFormatToMipBitsCache"); set_name(0x00A2DDC0, "CGxDevice__vtable"); @@ -3287,6 +3330,7 @@ static import_symbols() { set_name(0x00AF4A28, "g_lightDB"); set_name(0x00B38A5C, "System_File__s_read_init"); set_name(0x00B38A64, "System_File__s_write_init"); + set_name(0x00B38A88, "OsFileGetDownloadFolder__s_downloadfolder"); set_name(0x00B417C8, "s_mainThread"); set_name(0x00B417D0, "s_interactiveCount"); set_name(0x00B41850, "s_messageRecycler"); diff --git a/profile/3.3.5a-windows-386/include/bc/file/info.h b/profile/3.3.5a-windows-386/include/bc/file/info.h index 7e21c7d..0766eb7 100644 --- a/profile/3.3.5a-windows-386/include/bc/file/info.h +++ b/profile/3.3.5a-windows-386/include/bc/file/info.h @@ -11,11 +11,11 @@ struct Blizzard__File__FileInfo { // uint32_t unk08; // uint32_t unk0C; uint64_t size; // 08 - uint32_t attributes; - Blizzard__Time__Timestamp creationTime; - Blizzard__Time__Timestamp lastWriteTime; - Blizzard__Time__Timestamp lastAccessTime; - int32_t exists; + int32_t attributes; + Blizzard__Time__Timestamp createtime; + Blizzard__Time__Timestamp lastwritetime; + Blizzard__Time__Timestamp lastaccesstime; + int32_t filetype; int32_t normal; }; diff --git a/profile/3.3.5a-windows-386/include/bc/file/mode.h b/profile/3.3.5a-windows-386/include/bc/file/mode.h new file mode 100644 index 0000000..e9cbf36 --- /dev/null +++ b/profile/3.3.5a-windows-386/include/bc/file/mode.h @@ -0,0 +1,20 @@ +#ifndef BC_FILE_MODE_H +#define BC_FILE_MODE_H + +DECLARE_ENUM(Blizzard__File__Mode); + +enum Blizzard__File__Mode { + read = 0x0001, + write = 0x0002, + shareread = 0x0004, + sharewrite = 0x0008, + nocache = 0x0040, + temporary = 0x0080, + truncate = 0x0100, + append = 0x0200, + create = 0x0400, + mustnotexist = 0x0800, + mustexist = 0x1000 +}; + +#endif diff --git a/profile/3.3.5a-windows-386/include/bc/file/removedirectory.h b/profile/3.3.5a-windows-386/include/bc/file/removedirectory.h new file mode 100644 index 0000000..552387d --- /dev/null +++ b/profile/3.3.5a-windows-386/include/bc/file/removedirectory.h @@ -0,0 +1,11 @@ +#ifndef BC_FILE_REMOVE_DIRECTORY_H +#define BC_FILE_REMOVE_DIRECTORY_H + +DECLARE_STRUCT(Blizzard__File__RemoveDirectoryAndContents__Internal__RemoveDirectoryAndContentsParms); + +struct Blizzard__File__RemoveDirectoryAndContents__Internal__RemoveDirectoryRecurseData { + bool unk00; + bool unk01; // set normal? +}; + +#endif \ No newline at end of file diff --git a/profile/3.3.5a-windows-386/include/bc/file/stream.h b/profile/3.3.5a-windows-386/include/bc/file/stream.h index 6f5aae7..ca9d97b 100644 --- a/profile/3.3.5a-windows-386/include/bc/file/stream.h +++ b/profile/3.3.5a-windows-386/include/bc/file/stream.h @@ -7,10 +7,11 @@ DECLARE_STRUCT(Blizzard__File__StreamRecord); struct Blizzard__File__StreamRecord { void* filehandle; - uint32_t flags; + int32_t mode; bool haveinfo; uint32_t unk0C; Blizzard__File__FileInfo info; + // GetFileInfo only gets a size if this is null or points to a zero value int32_t* unk48; char* name; // name is a pointer to &filehandle (0x00) + sizeof(StreamRecord) // extra buffer that holds the actual data of name diff --git a/profile/3.3.5a-windows-386/include/bc/main.h b/profile/3.3.5a-windows-386/include/bc/main.h new file mode 100644 index 0000000..e2838a8 --- /dev/null +++ b/profile/3.3.5a-windows-386/include/bc/main.h @@ -0,0 +1,14 @@ +#ifndef BC_MAIN_H +#define BC_MAIN_H + +#include "bc/file/filesystem.h" +#include "bc/file/stream.h" +#include "bc/file/processdir.h" +#include "bc/lock/do_once.h" +#include "bc/string/quicknativepath.h" +#include "bc/systemfile/stacked.h" +#include "bc/os/file.h" +#include "bc/os/file_data.h" +#include "bc/time/timestamp.h" + +#endif \ No newline at end of file diff --git a/profile/3.3.5a-windows-386/include/bc/os/file.h b/profile/3.3.5a-windows-386/include/bc/os/file.h new file mode 100644 index 0000000..916cfbe --- /dev/null +++ b/profile/3.3.5a-windows-386/include/bc/os/file.h @@ -0,0 +1,12 @@ +#ifndef BC_OS_FILE_H +#define BC_OS_FILE_H + +DECLARE_STRUCT(HOSFILE__); + +struct HOSFILE__ { + int32_t unused__; +}; + +typedef HOSFILE__* HOSFILE; + +#endif diff --git a/profile/3.3.5a-windows-386/include/bc/os/file_data.h b/profile/3.3.5a-windows-386/include/bc/os/file_data.h new file mode 100644 index 0000000..de2d882 --- /dev/null +++ b/profile/3.3.5a-windows-386/include/bc/os/file_data.h @@ -0,0 +1,20 @@ +#ifndef BC_OS_FILE_DATA_H +#define BC_OS_FILE_DATA_H + +DECLARE_STRUCT(OS_FILE_DATA); +DECLARE_STRUCT(FileListParms); + +struct OS_FILE_DATA { + uint32_t size; + uint32_t flags; + char fileName[260]; +}; + +struct OsFileList__Internal__FileListParms { + void* callback; + void* param; + uint32_t flags; + char* pattern; +}; + +#endif \ No newline at end of file diff --git a/profile/3.3.5a-windows-386/include/bc/osfile.h b/profile/3.3.5a-windows-386/include/bc/osfile.h deleted file mode 100644 index 06417c3..0000000 --- a/profile/3.3.5a-windows-386/include/bc/osfile.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef BC_OS_FILE_H -#define BC_OS_FILE_H - -#include "common/handle.h" - -DECLARE_HANDLE(HOSFILE); - -#endif diff --git a/profile/3.3.5a-windows-386/include/bc/systemfile/stacked.h b/profile/3.3.5a-windows-386/include/bc/systemfile/stacked.h index 60b0216..1723d64 100644 --- a/profile/3.3.5a-windows-386/include/bc/systemfile/stacked.h +++ b/profile/3.3.5a-windows-386/include/bc/systemfile/stacked.h @@ -5,6 +5,7 @@ #include "bc/file/stream.h" #include "bc/file/info.h" #include "bc/file/processdir.h" +#include "bc/file/mode.h" DECLARE_STRUCT(System_File__Stacked__FileParms); @@ -17,19 +18,31 @@ struct System_File__Stacked__FileParms { char* newname; // 0x8 Blizzard__File__StreamRecord* file; // 0xC Blizzard__File__FileInfo* info; - uint32_t extra[17]; // 0x10 - uint32_t flags; + uint32_t extra; + Blizzard__File__FileInfo noinfo; + uint32_t setinfo; + // something to do with file info + // used by: + // Blizzard::File::GetFileInfo + // set to -1 + uint32_t getinfo; + Blizzard__File__Mode mode; // 0x58 void* data; // uint32_t count; int64_t offset; - uint32_t unk__; + int32_t whence; char* buffer; int32_t buffersize; - bool unkbool1; - bool unkbool2; + bool recurse; + // something to do with MakeAbsolutePath? (normalize? resolve? resolvesymlinks?) + bool canonicalize; void* dirwalkparam; Blizzard__File__ProcessDirCallback dirwalkcallback; - uint32_t extra3[2]; + // set to false by Blizzard::File::ProcessDirFast + bool unk88; + bool overwrite; + bool set_acl; // something that causes a security descriptor to be generated in mkdir() (takeownership? chown? ) + uint32_t unk8C; }; #endif diff --git a/profile/3.3.5a-windows-386/include/main.h b/profile/3.3.5a-windows-386/include/main.h index ede534b..edb58c8 100644 --- a/profile/3.3.5a-windows-386/include/main.h +++ b/profile/3.3.5a-windows-386/include/main.h @@ -13,14 +13,7 @@ #include "async/object.h" #include "async/queue.h" -#include "bc/file/filesystem.h" -#include "bc/file/stream.h" -#include "bc/file/processdir.h" -#include "bc/lock/do_once.h" -#include "bc/string/quicknativepath.h" -#include "bc/systemfile/stacked.h" -#include "bc/osfile.h" -#include "bc/time/timestamp.h" +#include "bc/main.h" #include "camera/camera.h" diff --git a/profile/3.3.5a-windows-386/symbol/bc/func.sym b/profile/3.3.5a-windows-386/symbol/bc/func.sym index e9960bf..6034c60 100644 --- a/profile/3.3.5a-windows-386/symbol/bc/func.sym +++ b/profile/3.3.5a-windows-386/symbol/bc/func.sym @@ -1,34 +1,53 @@ Blizzard__Memory__Allocate 00401010 f end=00401067 type="void* __stdcall func(uint32_t count)" Blizzard__Memory__Free 00401030 f end=0040104B type="void __stdcall func(void* ptr)" ; void operator delete(void*) -Blizzard__File__Close 004270F0 f end=0042712f +Blizzard__File__Close 004270F0 f end=0042712F Blizzard__File__Delete 00427130 f end=0042716F ; Blizzard::File::Delete(char const*) -Blizzard__File__GetFileInfo 004271D0 f end=00427242 type="bool __stdcall func(char* name, Blizzard__File__Info* info)" -Blizzard__File__GetFileInfo 00427250 f end=004272B8 type="Blizzard__File__Info* __stdcall func(Blizzard__File__StreamRecord* file)" +Blizzard__File__Exists 00427170 f end=004271C3 +Blizzard__File__GetFileInfo 004271D0 f end=00427242 type="bool __stdcall func(char* name, Blizzard__File__FileInfo* info)" +Blizzard__File__GetFileInfo 00427250 f end=004272B8 type="Blizzard__File__FileInfo* __stdcall func(Blizzard__File__StreamRecord* file)" Blizzard__File__GetFileInfo 004272C0 f end=00427325 type="bool __stdcall func(Blizzard__File__StreamRecord* file, Blizzard__File__FileInfo* info)" Blizzard__File__GetPos 004273A0 f end=00427406 Blizzard__File__GetRootChars 00427410 f end=00427466 Blizzard__File__GetWorkingDirectory 00427470 f end=004274B5 Blizzard__File__IsAbsolutePath 004274C0 f end=004274FF Blizzard__File__MakeAbsolutePath 00427500 f end=00427551 ; Blizzard::File::MakeAbsolutePath(char const*, char*, int, bool) -Blizzard__File__Move 00427560 f end=004275A8 ; Blizzard::File::Move(char const*, char const*) -Blizzard__File__Copy 004275B0 f end=004275FE +Blizzard__File__Move 00427560 f end=004275A8 type="bool __stdcall func(char* src, char* dst)" ; Blizzard::File::Move(char const*, char const*) +Blizzard__File__Copy 004275B0 f end=004275FE type="bool __stdcall func(char* src, char* dst, bool overwrite)" Blizzard__File__Open 00427600 f end=0042765E +Blizzard__File__ProcessDirFast 00427660 f end=004276BA type="bool __stdcall func(char* name, void* param, Blizzard__File__ProcessDirCallback callback, bool flag)" Blizzard__File__Read 004276C0 f end=0042771F -Blizzard__File__Write 004279B0 f end=00427A12 +Blizzard__File__Read 00427720 f end=0042778B type="bool __stdcall func(Blizzard__File__StreamRecord* file, void* data, int64_t offset, uint32_t* count)" ; Blizzard::File::Read(Blizzard::File::StreamRecord*, void*, long long, int*, int) +Blizzard__File__RemoveDirectory 00427800 f end=00427843 +Blizzard__File__SetAttributes 00427850 f end=004278A2 +Blizzard__File__SetPos 00427910 f end=00427961 type="bool __stdcall func(Blizzard__File__StreamRecord* file, int64_t offset, int32_t whence)" +Blizzard__File__SetWorkingDirectory 00427970 f end=004279AF +Blizzard__File__Write 004279B0 f end=00427A12 type="bool __stdcall func(Blizzard__File__StreamRecord* file, void *data, uint32_t* count)" +System_File__ToNativeAttributes 00427C20 f end=00427C68 System_File__FromNativeAttributes 00427C70 f end=00427CBC System_File__ReadP 00427CC0 f type="int32_t __stdcall func(Blizzard__File__Filesystem* fs, System_File__Stacked__FileParms* parms)" System_File__WriteP 00427D10 f end=00427D5C type="int32_t __stdcall func(Blizzard__File__Filesystem* fs, System_File__Stacked__FileParms* parms)" +Blizzard__File__IsDirectory 004281D0 f end=004281EB +Blizzard__File__IsFile 004281F0 f end=0042820B +Blizzard__File__SimpleGlob 00428210 f end=004282F2 type="bool __stdcall func(char* name, char* pattern)" Blizzard__String__FindFilename 00428500 f end=00428538 type="char* __stdcall func(char* str)" +Blizzard__String__FirstPathSeparator 00428640 f end=00428668 Blizzard__String__Copy 00428670 f end=004286BB type="int32_t __stdcall func(char* dst, const char* src, int32_t count)" +Blizzard__String__Append 004286C0 f end=00428721 type="int32_t __stdcall func(char* dst, char* src, int32_t count)" Blizzard__Unicode__ConvertUTF16to8 00428940 f end=00428AFC type="int32_t __stdcall func(uint8_t* dst, uint32_t dstmaxchars, const uint16_t* src, uint32_t srcmaxchars, uint32_t* dstchars, uint32_t* srcchars)" Blizzard__Unicode__ConvertUTF8to16 00428B00 f end=00428C94 type="int32_t __stdcall func(uint16_t* dst, uint32_t dstmaxchars, const uint8_t* src, uint32_t srcmaxchars, uint32_t* dstchars, uint32_t* srcchars)" Blizzard__Time__FromFileTime 00428F00 f end=00428F56 type="Blizzard__Time__Timestamp __stdcall func(uint64_t fileTime)" +Blizzard__String__MakeUnivPath 0042A9B0 f end=0042A9FB type="void __stdcall func(char* src, char* dst, int32_t count)" +Blizzard__String__MakeBackslashPath 0042AA00 f end=0042AA4B type="void __stdcall func(char* src, char* dst, int32_t count)" Blizzard__File__CreateDirectory 0042CEA0 f end=0042CEE9 HoistAll 0042CFB0 f end=0042D43E System_File__Stacked__file_init 0042D440 f end=0042D4F4 type="int32_t __stdcall func(Blizzard__File__Filesystem* fs, System_File__Stacked__FileParms* parms)" System_File__Close 0042D620 f end=0042D64F type="int32_t __stdcall func(Blizzard__File__Filesystem* fs, System_File__Stacked__FileParms* parms)" +Blizzard__String__MakeConsistentPath 0042E420 f end=0042E4AA +Blizzard__File__ForceTrailingSeparator 0042E4B0 f end=0042E522 type="void __stdcall func(char* dst, int32_t count, char separator)" +Blizzard__String__FindPathSeparatorReverse 0042E630 f end=0042E663 Blizzard__String__Format 0042E670 f end=0042E6A1 System_File__GetRootChars 004325C0 f type="int32_t __stdcall func(Blizzard__File__Filesystem* fs, System_File__Stacked__FileParms* parms)" +Blizzard__String__JoinPath 00433510 f end=0043356B type="void __stdcall func(char* a1, int32_t a2, char* a3, char* a4)" ; Blizzard::String::JoinPath(char*, int, char const*, char const*) System_File__FromNativeName 00433590 f end=00433650 type="void __stdcall func(uint8_t *buffer, uint32_t buffersize, const char *str)" Blizzard__String__QuickNativePath_300__QuickNativePath 00433650 f end=0043375A System_File__GetFileInfoByFile 00435580 f end=004356A2 type="void __stdcall func(Blizzard__File__StreamRecord* file)" @@ -36,8 +55,11 @@ System_File__Exists 004356B0 f end=00435781 type="int32_t __stdcall func(Blizzar System_File__MakeAbsolutePath 00435790 f end=00435889 type="int32_t __stdcall func(Blizzard__File__Filesystem* fs, System_File__Stacked__FileParms* parms)" System_File__Move 00435890 f end=004359B6 type="int32_t __stdcall func(Blizzard__File__Filesystem* fs, System_File__Stacked__FileParms* parms)" System_File__Delete 004359C0 f end=00435A57 type="int32_t __stdcall func(Blizzard__File__Filesystem* fs, System_File__Stacked__FileParms* parms)" +Blizzard__File__RemoveDirectoryAndContents__Internal__Callback 0044FA10 f end=0044FB29 type="bool __stdcall func(Blizzard__File__ProcessDirParms* dirwalkparms)" ; Blizzard::File::RemoveDirectoryAndContents(char const*, bool)::Internal::Callback(Blizzard::File::ProcessDirParms const&) +Blizzard__File__RemoveDirectoryAndContents 004518C0 f end=004519A7 System_File__read_overlapped 00454870 f end=00454904 System_File__write_overlapped 00454910 f end=004549A9 +System_File__ToCreateFlags 004549B0 f end=00454A4E type="bool __stdcall func(uint32_t flags, DWORD* sharemode, DWORD* desiredaccess, DWORD* creationdisposition, DWORD* flagsandattributes)" System_File__SetWorkingDirectory 00454A50 f end=00454AB5 type="int32_t __stdcall func(Blizzard__File__Filesystem* fs, System_File__Stacked__FileParms* parms)" System_File__Create 00454AC0 f end=00454AD3 type="int32_t __stdcall func(Blizzard__File__Filesystem* fs, System_File__Stacked__FileParms* parms)" System_File__GetWorkingDirectory 00454AE0 f end=00454B44 type="int32_t __stdcall func(Blizzard__File__Filesystem* fs, System_File__Stacked__FileParms* parms)" @@ -61,9 +83,24 @@ System_File__Write 00455D20 f end=00455D3E type="int32_t __stdcall func(Blizzard System_File__read_locked 00457820 f end=00457904 System_File__write_locked 00457910 f end=004579f4 System_File__detect_io_mode 00459910 f end=00459998 -OsCloseFile 00461B00 f end=00461B09 -OsReadFile 00461B50 f end=00461B88 -OsGetFileSize 00461BD0 f end=00461BF4 -OsCreateDirectory 00461D10 f end=00461D3F -OsSetCurrentDirectory 00461DB0 f end=00461DD7 -OsCreateFile 00461FA0 f end=00461FFA +OsCloseFile 00461B00 f end=00461B09 type="void __stdcall func(HOSFILE fileHandle)" +OsFileExists 00461B10 f end=00461B27 type="int32_t __stdcall func(char* path)" +OsDirectoryExists 00461B30 f end=00461B47 type="int32_t __stdcall func(char* dirName)" +OsReadFile 00461B50 f end=00461B88 type="int32_t __stdcall func(HOSFILE fileHandle, void* buffer, uint32_t bytesToRead, uint32_t* bytesRead)" +OsWriteFile 00461B90 f end=00461BC8 type="int32_t __stdcall func(HOSFILE fileHandle, void* buffer, uint32_t bytesToWrite, uint32_t* bytesWritten)" +OsGetFileSize 00461BD0 f end=00461BF4 type="void __stdcall func(HOSFILE fileHandle)" +OsGetFileAttributes 00461C00 f end=00461C3A type="uint32_t __stdcall func(char* fileName)" +OsSetFileAttributes 00461C40 f end=00461C6B type="int32_t __stdcall func(char* fileName, uint32_t attributes)" +OsMoveFile 00461C70 f end=00461C9F type="int32_t __stdcall func(char* existingFileName, char* newFileName)" +OsCopyFile 00461CA0 f end=00461CD7 type="int32_t __stdcall func(char* existingFileName, char* newFileName, int32_t failIfExists)" +OsDeleteFile 00461CE0 f end=00461D07 type="int32_t __stdcall func(char* fileName)" +OsCreateDirectory 00461D10 f end=00461D3F type="int32_t __stdcall func(char* pathName, int32_t recursive)" +OsRemoveDirectory 00461D40 f end=00461D67 type="int32_t __stdcall func(char* pathName)" +OsRemoveDirectoryRecurse 00461D70 f end=00461DA2 type="int32_t __stdcall func(char* pathName, uint32_t flags)" +OsSetCurrentDirectory 00461DB0 f end=00461DD7 type="int32_t __stdcall func(char* pathName)" +OsGetCurrentDirectory 00461DE0 f end=00461E0B type="int32_t __stdcall func(uint32_t buffersize, char* buffer)" +OsFileList__Internal__Callback 00461E10 f end=00461EEB type="bool __stdcall func(Blizzard__File__ProcessDirParms* parms)" +OsCreateFileMode 00461EF0 f end=00461F68 type="Blizzard__File__Mode __stdcall func(uint32_t desiredAcccess, uint8_t shareMode, uint32_t createDisposition)" +OsCreateFile 00461FA0 f end=00461FFA type="HOSFILE __stdcall func(char* fileName, uint32_t desiredAccess, uint32_t shareMode, uint32_t createDisposition, uint32_t flagsAndAttributes, uint32_t extendedFileType)" +OsFileList 00462000 f end=0046209C +OsFileGetDownloadFolder 00461F70 f end=00461F91 type="char* __stdcall func()" diff --git a/profile/3.3.5a-windows-386/symbol/bc/label.sym b/profile/3.3.5a-windows-386/symbol/bc/label.sym index fb636ec..0416aa8 100644 --- a/profile/3.3.5a-windows-386/symbol/bc/label.sym +++ b/profile/3.3.5a-windows-386/symbol/bc/label.sym @@ -1,3 +1,6 @@ +firstByteMark 009E537C l type="uint32_t[7]" +bytesFromUTF8 009E5398 l type="uint8_t[256]" +s_noinfo 009E5630 l type="Blizzard__File__FileInfo" System_File__Stacked__s_manager 00AB90AC l type="Blizzard__File__Filesystem*" System_File__read_func 00AB912C l ; type="int32_t (*)(Blizzard__File__Filesystem* fs, System_File__Stacked__FileParms* parms)" System_File__write_func 00AB91B4 l ; type="int32_t (*)(Blizzard__File__Filesystem* fs, System_File__Stacked__FileParms* parms)" @@ -5,5 +8,4 @@ System_File__Stacked__s_nullstack 00AB91C0 l type="Blizzard__File__Filesystem" System_File__Stacked__s_basestack 00AB92C0 l type="Blizzard__File__Filesystem" System_File__s_read_init 00B38A5C l type="Blizzard__Lock__DoOnceData" System_File__s_write_init 00B38A64 l type="Blizzard__Lock__DoOnceData" -firstByteMark 009E537C l type="uint32_t[7]" -bytesFromUTF8 009E5398 l type="uint8_t[256]" \ No newline at end of file +OsFileGetDownloadFolder__s_downloadfolder 00B38A88 l ; OsFileGetDownloadFolder()::s_downloadfolder; diff --git a/profile/3.3.5a-windows-386/symbol/client/func.sym b/profile/3.3.5a-windows-386/symbol/client/func.sym index 7908d27..5288276 100644 --- a/profile/3.3.5a-windows-386/symbol/client/func.sym +++ b/profile/3.3.5a-windows-386/symbol/client/func.sym @@ -5,4 +5,8 @@ DestroyGlobal 00406B70 f end=00406C65 ConvertPosition 0047FC90 f end=0047FDD4 ScrnLayerCreate 004A8BB0 f end=004A8C83 ScrnLayerSetRect 004A8500 f end=004A8522 -ClientKillTimer 004033B0 f end=004033B9 \ No newline at end of file +ClientKillTimer 004033B0 f end=004033B9 +PatchFiles__qsortpatchfiles 00401200 f ; int __cdecl PatchFiles::qsortpatchfiles(char **, char **) +quicksort 0047B800 f ; void __cdecl quicksort(unsigned int, unsigned int, int, int (__cdecl *)(unsigned int, unsigned int, int), int) +PatchFiles__EnumPatchArchives 00405A10 f ; int __cdecl PatchFiles::EnumPatchArchives(OS_FILE_DATA *fileData, PatchOnDemand__Cache *cbParam) +PatchFiles__LoadArchives 00405AB0 f ; int __thiscall PatchFiles::LoadArchives(PatchFiles *this, const char *localeCode, char a3) \ No newline at end of file diff --git a/profile/3.3.5a-windows-386/symbol/gxformat/func.sym b/profile/3.3.5a-windows-386/symbol/gxformat/func.sym new file mode 100644 index 0000000..53e8806 --- /dev/null +++ b/profile/3.3.5a-windows-386/symbol/gxformat/func.sym @@ -0,0 +1 @@ +CGxFormat__CGxFormat 00681950 f type="CGxFormat* __thiscall func(CGxFormat* this)" \ No newline at end of file diff --git a/profile/3.3.5a-windows-386/symbol/main.sym b/profile/3.3.5a-windows-386/symbol/main.sym index 8ebc725..5a55143 100644 --- a/profile/3.3.5a-windows-386/symbol/main.sym +++ b/profile/3.3.5a-windows-386/symbol/main.sym @@ -4,9 +4,12 @@ CDataStore__FetchWrite 00401070 f ; protected: int __thiscall CDataStore::FetchW CDataStore__IsRead 004010D0 f ; CDataStore::IsRead() const CDataStore__Reset 004010E0 f ; CDataStore::Reset() CDataStore__Finalize 00401130 f ; CDataStore::Finalize() +PatchFiles__qsortpatchfiles 00401200 f ; int __cdecl PatchFiles::qsortpatchfiles(char **, char **) SetPaths 00402B20 f end=00402B8B ClientKillTimer 004033B0 f end=004033B9 CDataStore__destructor 004038A0 f ; CDataStore::~CDataStore() +PatchFiles__EnumPatchArchives 00405A10 f ; int __cdecl PatchFiles::EnumPatchArchives(OS_FILE_DATA *fileData, PatchOnDemand__Cache *cbParam) +PatchFiles__LoadArchives 00405AB0 f ; int __thiscall PatchFiles::LoadArchives(PatchFiles *this, const char *localeCode, char a3) InitializeGlobal 004067F0 f end=00406B67 DestroyGlobal 00406B70 f end=00406C65 CommonMain 00406C70 f end=00406D64 @@ -36,35 +39,54 @@ SFile__FileExistsEx 00424B10 f end=00424B41 SFile__OpenEx 00424B50 f end=00424E44 SFile__Load 00424E80 f end=00424F46 SFile__Open 00424F80 f end=00424F98 -Blizzard__File__Close 004270F0 f end=0042712f +Blizzard__File__Close 004270F0 f end=0042712F Blizzard__File__Delete 00427130 f end=0042716F ; Blizzard::File::Delete(char const*) -Blizzard__File__GetFileInfo 004271D0 f end=00427242 type="bool __stdcall func(char* name, Blizzard__File__Info* info)" -Blizzard__File__GetFileInfo 00427250 f end=004272B8 type="Blizzard__File__Info* __stdcall func(Blizzard__File__StreamRecord* file)" +Blizzard__File__Exists 00427170 f end=004271C3 +Blizzard__File__GetFileInfo 004271D0 f end=00427242 type="bool __stdcall func(char* name, Blizzard__File__FileInfo* info)" +Blizzard__File__GetFileInfo 00427250 f end=004272B8 type="Blizzard__File__FileInfo* __stdcall func(Blizzard__File__StreamRecord* file)" Blizzard__File__GetFileInfo 004272C0 f end=00427325 type="bool __stdcall func(Blizzard__File__StreamRecord* file, Blizzard__File__FileInfo* info)" Blizzard__File__GetPos 004273A0 f end=00427406 Blizzard__File__GetRootChars 00427410 f end=00427466 Blizzard__File__GetWorkingDirectory 00427470 f end=004274B5 Blizzard__File__IsAbsolutePath 004274C0 f end=004274FF Blizzard__File__MakeAbsolutePath 00427500 f end=00427551 ; Blizzard::File::MakeAbsolutePath(char const*, char*, int, bool) -Blizzard__File__Move 00427560 f end=004275A8 ; Blizzard::File::Move(char const*, char const*) -Blizzard__File__Copy 004275B0 f end=004275FE +Blizzard__File__Move 00427560 f end=004275A8 type="bool __stdcall func(char* src, char* dst)" ; Blizzard::File::Move(char const*, char const*) +Blizzard__File__Copy 004275B0 f end=004275FE type="bool __stdcall func(char* src, char* dst, bool overwrite)" Blizzard__File__Open 00427600 f end=0042765E +Blizzard__File__ProcessDirFast 00427660 f end=004276BA type="bool __stdcall func(char* name, void* param, Blizzard__File__ProcessDirCallback callback, bool flag)" Blizzard__File__Read 004276C0 f end=0042771F -Blizzard__File__Write 004279B0 f end=00427A12 +Blizzard__File__Read 00427720 f end=0042778B type="bool __stdcall func(Blizzard__File__StreamRecord* file, void* data, int64_t offset, uint32_t* count)" ; Blizzard::File::Read(Blizzard::File::StreamRecord*, void*, long long, int*, int) +Blizzard__File__RemoveDirectory 00427800 f end=00427843 +Blizzard__File__SetAttributes 00427850 f end=004278A2 +Blizzard__File__SetPos 00427910 f end=00427961 type="bool __stdcall func(Blizzard__File__StreamRecord* file, int64_t offset, int32_t whence)" +Blizzard__File__SetWorkingDirectory 00427970 f end=004279AF +Blizzard__File__Write 004279B0 f end=00427A12 type="bool __stdcall func(Blizzard__File__StreamRecord* file, void *data, uint32_t* count)" +System_File__ToNativeAttributes 00427C20 f end=00427C68 System_File__FromNativeAttributes 00427C70 f end=00427CBC System_File__ReadP 00427CC0 f type="int32_t __stdcall func(Blizzard__File__Filesystem* fs, System_File__Stacked__FileParms* parms)" System_File__WriteP 00427D10 f end=00427D5C type="int32_t __stdcall func(Blizzard__File__Filesystem* fs, System_File__Stacked__FileParms* parms)" +Blizzard__File__IsDirectory 004281D0 f end=004281EB +Blizzard__File__IsFile 004281F0 f end=0042820B +Blizzard__File__SimpleGlob 00428210 f end=004282F2 type="bool __stdcall func(char* name, char* pattern)" Blizzard__String__FindFilename 00428500 f end=00428538 type="char* __stdcall func(char* str)" +Blizzard__String__FirstPathSeparator 00428640 f end=00428668 Blizzard__String__Copy 00428670 f end=004286BB type="int32_t __stdcall func(char* dst, const char* src, int32_t count)" +Blizzard__String__Append 004286C0 f end=00428721 type="int32_t __stdcall func(char* dst, char* src, int32_t count)" Blizzard__Unicode__ConvertUTF16to8 00428940 f end=00428AFC type="int32_t __stdcall func(uint8_t* dst, uint32_t dstmaxchars, const uint16_t* src, uint32_t srcmaxchars, uint32_t* dstchars, uint32_t* srcchars)" Blizzard__Unicode__ConvertUTF8to16 00428B00 f end=00428C94 type="int32_t __stdcall func(uint16_t* dst, uint32_t dstmaxchars, const uint8_t* src, uint32_t srcmaxchars, uint32_t* dstchars, uint32_t* srcchars)" Blizzard__Time__FromFileTime 00428F00 f end=00428F56 type="Blizzard__Time__Timestamp __stdcall func(uint64_t fileTime)" +Blizzard__String__MakeUnivPath 0042A9B0 f end=0042A9FB type="void __stdcall func(char* src, char* dst, int32_t count)" +Blizzard__String__MakeBackslashPath 0042AA00 f end=0042AA4B type="void __stdcall func(char* src, char* dst, int32_t count)" Blizzard__File__CreateDirectory 0042CEA0 f end=0042CEE9 HoistAll 0042CFB0 f end=0042D43E System_File__Stacked__file_init 0042D440 f end=0042D4F4 type="int32_t __stdcall func(Blizzard__File__Filesystem* fs, System_File__Stacked__FileParms* parms)" System_File__Close 0042D620 f end=0042D64F type="int32_t __stdcall func(Blizzard__File__Filesystem* fs, System_File__Stacked__FileParms* parms)" +Blizzard__String__MakeConsistentPath 0042E420 f end=0042E4AA +Blizzard__File__ForceTrailingSeparator 0042E4B0 f end=0042E522 type="void __stdcall func(char* dst, int32_t count, char separator)" +Blizzard__String__FindPathSeparatorReverse 0042E630 f end=0042E663 Blizzard__String__Format 0042E670 f end=0042E6A1 System_File__GetRootChars 004325C0 f type="int32_t __stdcall func(Blizzard__File__Filesystem* fs, System_File__Stacked__FileParms* parms)" +Blizzard__String__JoinPath 00433510 f end=0043356B type="void __stdcall func(char* a1, int32_t a2, char* a3, char* a4)" ; Blizzard::String::JoinPath(char*, int, char const*, char const*) System_File__FromNativeName 00433590 f end=00433650 type="void __stdcall func(uint8_t *buffer, uint32_t buffersize, const char *str)" Blizzard__String__QuickNativePath_300__QuickNativePath 00433650 f end=0043375A System_File__GetFileInfoByFile 00435580 f end=004356A2 type="void __stdcall func(Blizzard__File__StreamRecord* file)" @@ -72,8 +94,11 @@ System_File__Exists 004356B0 f end=00435781 type="int32_t __stdcall func(Blizzar System_File__MakeAbsolutePath 00435790 f end=00435889 type="int32_t __stdcall func(Blizzard__File__Filesystem* fs, System_File__Stacked__FileParms* parms)" System_File__Move 00435890 f end=004359B6 type="int32_t __stdcall func(Blizzard__File__Filesystem* fs, System_File__Stacked__FileParms* parms)" System_File__Delete 004359C0 f end=00435A57 type="int32_t __stdcall func(Blizzard__File__Filesystem* fs, System_File__Stacked__FileParms* parms)" +Blizzard__File__RemoveDirectoryAndContents__Internal__Callback 0044FA10 f end=0044FB29 type="bool __stdcall func(Blizzard__File__ProcessDirParms* dirwalkparms)" ; Blizzard::File::RemoveDirectoryAndContents(char const*, bool)::Internal::Callback(Blizzard::File::ProcessDirParms const&) +Blizzard__File__RemoveDirectoryAndContents 004518C0 f end=004519A7 System_File__read_overlapped 00454870 f end=00454904 System_File__write_overlapped 00454910 f end=004549A9 +System_File__ToCreateFlags 004549B0 f end=00454A4E type="bool __stdcall func(uint32_t flags, DWORD* sharemode, DWORD* desiredaccess, DWORD* creationdisposition, DWORD* flagsandattributes)" System_File__SetWorkingDirectory 00454A50 f end=00454AB5 type="int32_t __stdcall func(Blizzard__File__Filesystem* fs, System_File__Stacked__FileParms* parms)" System_File__Create 00454AC0 f end=00454AD3 type="int32_t __stdcall func(Blizzard__File__Filesystem* fs, System_File__Stacked__FileParms* parms)" System_File__GetWorkingDirectory 00454AE0 f end=00454B44 type="int32_t __stdcall func(Blizzard__File__Filesystem* fs, System_File__Stacked__FileParms* parms)" @@ -97,12 +122,27 @@ System_File__Write 00455D20 f end=00455D3E type="int32_t __stdcall func(Blizzard System_File__read_locked 00457820 f end=00457904 System_File__write_locked 00457910 f end=004579f4 System_File__detect_io_mode 00459910 f end=00459998 -OsCloseFile 00461B00 f end=00461B09 -OsReadFile 00461B50 f end=00461B88 -OsGetFileSize 00461BD0 f end=00461BF4 -OsCreateDirectory 00461D10 f end=00461D3F -OsSetCurrentDirectory 00461DB0 f end=00461DD7 -OsCreateFile 00461FA0 f end=00461FFA +OsCloseFile 00461B00 f end=00461B09 type="void __stdcall func(HOSFILE fileHandle)" +OsFileExists 00461B10 f end=00461B27 type="int32_t __stdcall func(char* path)" +OsDirectoryExists 00461B30 f end=00461B47 type="int32_t __stdcall func(char* dirName)" +OsReadFile 00461B50 f end=00461B88 type="int32_t __stdcall func(HOSFILE fileHandle, void* buffer, uint32_t bytesToRead, uint32_t* bytesRead)" +OsWriteFile 00461B90 f end=00461BC8 type="int32_t __stdcall func(HOSFILE fileHandle, void* buffer, uint32_t bytesToWrite, uint32_t* bytesWritten)" +OsGetFileSize 00461BD0 f end=00461BF4 type="void __stdcall func(HOSFILE fileHandle)" +OsGetFileAttributes 00461C00 f end=00461C3A type="uint32_t __stdcall func(char* fileName)" +OsSetFileAttributes 00461C40 f end=00461C6B type="int32_t __stdcall func(char* fileName, uint32_t attributes)" +OsMoveFile 00461C70 f end=00461C9F type="int32_t __stdcall func(char* existingFileName, char* newFileName)" +OsCopyFile 00461CA0 f end=00461CD7 type="int32_t __stdcall func(char* existingFileName, char* newFileName, int32_t failIfExists)" +OsDeleteFile 00461CE0 f end=00461D07 type="int32_t __stdcall func(char* fileName)" +OsCreateDirectory 00461D10 f end=00461D3F type="int32_t __stdcall func(char* pathName, int32_t recursive)" +OsRemoveDirectory 00461D40 f end=00461D67 type="int32_t __stdcall func(char* pathName)" +OsRemoveDirectoryRecurse 00461D70 f end=00461DA2 type="int32_t __stdcall func(char* pathName, uint32_t flags)" +OsSetCurrentDirectory 00461DB0 f end=00461DD7 type="int32_t __stdcall func(char* pathName)" +OsGetCurrentDirectory 00461DE0 f end=00461E0B type="int32_t __stdcall func(uint32_t buffersize, char* buffer)" +OsFileList__Internal__Callback 00461E10 f end=00461EEB type="bool __stdcall func(Blizzard__File__ProcessDirParms* parms)" +OsCreateFileMode 00461EF0 f end=00461F68 type="Blizzard__File__Mode __stdcall func(uint32_t desiredAcccess, uint8_t shareMode, uint32_t createDisposition)" +OsFileGetDownloadFolder 00461F70 f end=00461F91 type="char* __stdcall func()" +OsCreateFile 00461FA0 f end=00461FFA type="HOSFILE __stdcall func(char* fileName, uint32_t desiredAccess, uint32_t shareMode, uint32_t createDisposition, uint32_t flagsAndAttributes, uint32_t extendedFileType)" +OsFileList 00462000 f end=0046209C nullsub_2 0047ADD0 f CDataStore__GetBufferParams 0047ADE0 f ; CDataStore::GetBufferParams(void const**, unsigned int*, unsigned int*) CDataStore__DetachBuffer 0047AE10 f ; CDataStore::DetachBuffer(void**, unsigned int*, unsigned int*) @@ -129,6 +169,7 @@ CmdLineGetBool 0047B6F0 f end=0047B6FE type="int32_t __stdcall func(CMDOPT)" CmdLineGetString 0047B700 f end=0047B71D type="char* __stdcall func(CMDOPT)" CmdLineProcess 0047B720 f end=0047B736 type="int32_t __stdcall func()" j_nullsub_3 0047B760 f +quicksort 0047B800 f ; void __cdecl quicksort(unsigned int, unsigned int, int, int (__cdecl *)(unsigned int, unsigned int, int), int) ConvertUTF16toUTF8 0047B9E0 f end=0047BB9C type="int __stdcall func(char* dst, uint32_t dstMaxChars, uint16_t* src, uint32_t srcMaxChars, uint32_t* dstChars, uint32_t* srcChars)" HandleClose 0047BF30 f end=0047BF46 HandleCreate 0047BF50 f end=0047BF6B @@ -2200,6 +2241,7 @@ GxSetMaxFPS 00681770 f end=0068177D type="void __stdcall func(uint32_t maxFPS)" GxSetMaxFPSBk 00681790 f end=0068179D type="void __stdcall func(uint32_t maxFPSBk)" GxLogOpen 006817C0 f end=006817C5 type="void __stdcall func()" GxLog 006817E0 f end=006817F5 type="int __stdcall func(char* format, ...)" +CGxFormat__CGxFormat 00681950 f type="CGxFormat* __thiscall func(CGxFormat* this)" GxDrawLockedElements 00681A60 f end=00681AAB type="void __stdcall func()" GxPrimIndexPtr 00681AB0 f end=00681AFB type="void __stdcall func(uint32_t indexCount, uint16_t* indices)" GxPrimVertexPtr 00681B00 f end=00681B4B type="void __stdcall func(CGxBuf* buf, EGxVertexBufferFormat format)" @@ -3011,6 +3053,7 @@ nullsub_149 009DE1C0 f nullsub_150 009DE1D0 f firstByteMark 009E537C l type="uint32_t[7]" bytesFromUTF8 009E5398 l type="uint8_t[256]" +s_noinfo 009E5630 l type="Blizzard__File__FileInfo" firstByteMark 009e9ec8 l type="uint32_t[7]" s_pixelFormatToMipBitsCache 009F1074 l CGxDevice__vtable 00A2DDC0 l type="CGxDevice__vtable" @@ -3283,6 +3326,7 @@ g_lightParamsDB 00AF4A04 l type="WowClientDB_LightParamsRec" ; 0x15E g_lightDB 00AF4A28 l type="WowClientDB_LightRec" ; 0x15B System_File__s_read_init 00B38A5C l type="Blizzard__Lock__DoOnceData" System_File__s_write_init 00B38A64 l type="Blizzard__Lock__DoOnceData" +OsFileGetDownloadFolder__s_downloadfolder 00B38A88 l ; OsFileGetDownloadFolder()::s_downloadfolder; s_mainThread 00b417c8 l type="uint32_t" s_interactiveCount 00B417D0 l type="int32_t" s_messageRecycler 00B41850 l type="CDataRecycler" diff --git a/profile/3.3.5a-windows-386/x64dbg/game.dd32 b/profile/3.3.5a-windows-386/x64dbg/game.dd32 index cf0aed8b1324f03277138bdabf5c2d3a993b0cbc..bf4db8f0f6d53af124a5b08f3a47b5828c709f3f 100644 GIT binary patch delta 27707 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 delta 26170 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 diff --git a/profile/3.3.5a-windows-386/x64dbg/types.json b/profile/3.3.5a-windows-386/x64dbg/types.json index 780b919..46664bb 100644 --- a/profile/3.3.5a-windows-386/x64dbg/types.json +++ b/profile/3.3.5a-windows-386/x64dbg/types.json @@ -8,6 +8,10 @@ "type": "int", "name": "BlitFormat" }, + { + "type": "int", + "name": "Blizzard__File__Mode" + }, { "type": "int", "name": "Blizzard__File__Operation" @@ -11421,7 +11425,7 @@ "members": [ { "type": "int32_t", - "name": "unused", + "name": "unused__", "offset": 0 } ] @@ -21210,6 +21214,28 @@ } ] }, + { + "name": "OS_FILE_DATA", + "size": 268, + "members": [ + { + "type": "uint32_t", + "name": "size", + "offset": 0 + }, + { + "type": "uint32_t", + "name": "flags", + "offset": 4 + }, + { + "type": "char", + "name": "fileName", + "arrsize": 260, + "offset": 8 + } + ] + }, { "name": "ObjectEffectGroupRec", "size": 8, @@ -21357,6 +21383,32 @@ } ] }, + { + "name": "OsFileList__Internal__FileListParms", + "size": 16, + "members": [ + { + "type": "void*", + "name": "callback", + "offset": 0 + }, + { + "type": "void*", + "name": "param", + "offset": 4 + }, + { + "type": "uint32_t", + "name": "flags", + "offset": 8 + }, + { + "type": "char*", + "name": "pattern", + "offset": 12 + } + ] + }, { "name": "OverrideSpellDataRec", "size": 48, @@ -29376,104 +29428,6 @@ } ] }, - { - "name": "System_File__Stacked__FileParms", - "size": 144, - "members": [ - { - "type": "uint32_t", - "name": "op", - "offset": 0 - }, - { - "type": "char*", - "name": "name", - "offset": 4 - }, - { - "type": "char*", - "name": "newname", - "offset": 8 - }, - { - "type": "Blizzard__File__StreamRecord*", - "name": "file", - "offset": 12 - }, - { - "type": "Blizzard__File__FileInfo*", - "name": "info", - "offset": 16 - }, - { - "type": "uint32_t", - "name": "extra", - "arrsize": 17, - "offset": 20 - }, - { - "type": "uint32_t", - "name": "flags", - "offset": 88 - }, - { - "type": "void*", - "name": "data", - "offset": 92 - }, - { - "type": "uint32_t", - "name": "count", - "offset": 96 - }, - { - "type": "int64_t", - "name": "offset", - "offset": 104 - }, - { - "type": "uint32_t", - "name": "unk__", - "offset": 112 - }, - { - "type": "char*", - "name": "buffer", - "offset": 116 - }, - { - "type": "int32_t", - "name": "buffersize", - "offset": 120 - }, - { - "type": "bool", - "name": "unkbool1", - "offset": 124 - }, - { - "type": "bool", - "name": "unkbool2", - "offset": 125 - }, - { - "type": "void*", - "name": "dirwalkparam", - "offset": 128 - }, - { - "type": "Blizzard__File__ProcessDirCallback", - "name": "dirwalkcallback", - "offset": 132 - }, - { - "type": "uint32_t", - "name": "extra3", - "arrsize": 2, - "offset": 136 - } - ] - }, { "name": "Blizzard__File__FileInfo", "size": 56, @@ -29494,28 +29448,28 @@ "offset": 8 }, { - "type": "uint32_t", + "type": "int32_t", "name": "attributes", "offset": 16 }, { "type": "Blizzard__Time__Timestamp", - "name": "creationTime", + "name": "createtime", "offset": 24 }, { "type": "Blizzard__Time__Timestamp", - "name": "lastWriteTime", + "name": "lastwritetime", "offset": 32 }, { "type": "Blizzard__Time__Timestamp", - "name": "lastAccessTime", + "name": "lastaccesstime", "offset": 40 }, { "type": "int32_t", - "name": "exists", + "name": "filetype", "offset": 48 }, { @@ -37531,6 +37485,132 @@ } ] }, + { + "name": "System_File__Stacked__FileParms", + "size": 144, + "members": [ + { + "type": "uint32_t", + "name": "op", + "offset": 0 + }, + { + "type": "char*", + "name": "name", + "offset": 4 + }, + { + "type": "char*", + "name": "newname", + "offset": 8 + }, + { + "type": "Blizzard__File__StreamRecord*", + "name": "file", + "offset": 12 + }, + { + "type": "Blizzard__File__FileInfo*", + "name": "info", + "offset": 16 + }, + { + "type": "uint32_t", + "name": "extra", + "offset": 20 + }, + { + "type": "Blizzard__File__FileInfo", + "name": "noinfo", + "offset": 24 + }, + { + "type": "uint32_t", + "name": "setinfo", + "offset": 80 + }, + { + "type": "uint32_t", + "name": "getinfo", + "offset": 84 + }, + { + "type": "Blizzard__File__Mode", + "name": "mode", + "offset": 88 + }, + { + "type": "void*", + "name": "data", + "offset": 92 + }, + { + "type": "uint32_t", + "name": "count", + "offset": 96 + }, + { + "type": "int64_t", + "name": "offset", + "offset": 104 + }, + { + "type": "int32_t", + "name": "whence", + "offset": 112 + }, + { + "type": "char*", + "name": "buffer", + "offset": 116 + }, + { + "type": "int32_t", + "name": "buffersize", + "offset": 120 + }, + { + "type": "bool", + "name": "recurse", + "offset": 124 + }, + { + "type": "bool", + "name": "canonicalize", + "offset": 125 + }, + { + "type": "void*", + "name": "dirwalkparam", + "offset": 128 + }, + { + "type": "Blizzard__File__ProcessDirCallback", + "name": "dirwalkcallback", + "offset": 132 + }, + { + "type": "bool", + "name": "unk88", + "offset": 136 + }, + { + "type": "bool", + "name": "overwrite", + "offset": 137 + }, + { + "type": "bool", + "name": "set_acl", + "offset": 138 + }, + { + "type": "uint32_t", + "name": "unk8C", + "offset": 140 + } + ] + }, { "name": "Blizzard__File__StreamRecord", "size": 80, @@ -37541,8 +37621,8 @@ "offset": 0 }, { - "type": "uint32_t", - "name": "flags", + "type": "int32_t", + "name": "mode", "offset": 4 }, {