From 966629794be47925b45b67c11f7de9171ab8024d Mon Sep 17 00:00:00 2001 From: superp00t Date: Sat, 5 Apr 2025 17:42:55 -0400 Subject: [PATCH] feat(profile): add more symbols for CGxDevice::Log, CGxDevice::VLog --- .../ida/batch/import_data_types.idc | 2 ++ .../ida/batch/import_symbols.idc | 2 ++ .../symbol/gxdevice/func.sym | 1 + .../symbol/gxdevice/label.sym | 1 + profile/3.3.5a-windows-386/symbol/main.sym | 2 ++ profile/3.3.5a-windows-386/x64dbg/game.dd32 | Bin 117493 -> 117535 bytes 6 files changed, 8 insertions(+) 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 eab69c9..0b7a510 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 @@ -194,6 +194,7 @@ static import_data_types() { apply_type(0x00684970, "int32_t __thiscall func(CGxDevice* this, CGxShader** shaders, EGxShTarget target, char* a4, char* a5, int32_t permutations)"); apply_type(0x00684AD0, "void __thiscall func(CGxDevice* this, CGxFormat* format)"); apply_type(0x00684B50, "void __thiscall func(CGxDevice* this, uint32_t x, uint32_t y)"); + apply_type(0x00684BA0, "void __stdcall func(char* format, va_list args)"); apply_type(0x00684C20, "void __stdcall func(char* format, ...)"); apply_type(0x00684C40, "void __stdcall func(CGxCaps* caps)"); apply_type(0x00684D10, "void __stdcall func(CGxFormat* format)"); @@ -820,6 +821,7 @@ static import_data_types() { apply_type(0x00C5DF74, "uint32_t"); apply_type(0x00C5DF7C, "uint32_t"); apply_type(0x00C5DF88, "CGxDevice*"); + apply_type(0x00C5FFF4, "uint32_t"); apply_type(0x00C5FFF8, "HSLOG"); apply_type(0x00CA1690, "float"); apply_type(0x00CA1694, "int32_t"); 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 34018a9..b1deebc 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 @@ -2394,6 +2394,7 @@ static import_symbols() { set_name(0x00684970, "CGxDevice__IShaderLoad"); set_name(0x00684AD0, "CGxDevice__ICursorCreate"); set_name(0x00684B50, "CGxDevice__CursorUnlock"); + set_name(0x00684BA0, "CGxDevice__VLog"); set_name(0x00684C20, "CGxDevice__Log"); set_name(0x00684C40, "CGxDevice__Log@2"); set_name(0x00684D10, "CGxDevice__Log@3"); @@ -3537,6 +3538,7 @@ static import_symbols() { set_name(0x00C5DF88, "g_theGxDevicePtr"); set_name(0x00C5DFDC, "CGxDevice__s_uiVertexShader"); set_name(0x00C5DFE0, "CGxDevice__s_shadowConstants"); + set_name(0x00C5FFF4, "CGxDevice__m_logBytes"); set_name(0x00C5FFF8, "CGxDevice__m_log"); set_name(0x00C5FFFC, "CGxDevice__s_uiPixelShader"); set_name(0x00C60760, "isIdent"); diff --git a/profile/3.3.5a-windows-386/symbol/gxdevice/func.sym b/profile/3.3.5a-windows-386/symbol/gxdevice/func.sym index 4a51060..31f9389 100644 --- a/profile/3.3.5a-windows-386/symbol/gxdevice/func.sym +++ b/profile/3.3.5a-windows-386/symbol/gxdevice/func.sym @@ -54,6 +54,7 @@ CGxDevice__CursorUnlock 00684B50 f end=00684B99 type="void __thiscall func(CGxDe CGxDevice__Log 00684C20 f end=00684C3E type="void __stdcall func(char* format, ...)" CGxDevice__Log 00684C40 f end=00684D07 type="void __stdcall func(CGxCaps* caps)" ; CGxDevice::Log(CGxCaps const&) const CGxDevice__Log 00684D10 f end=00684D6C type="void __stdcall func(CGxFormat* format)" +CGxDevice__VLog 00684BA0 f end=00684C15 type="void __stdcall func(char* format, va_list args)" CGxDevice__DeviceOverride 00684FE0 f end=00685036 type="void __thiscall func(CGxDevice* this, EGxOverride override, uint32_t value)" CGxDevice__AddDeviceRestoredCallback 006853B0 f end=006853C6 type="void __thiscall func(CGxDevice* this, DEVICERESTOREDCALLBACK fn)" CGxDevice__RemoveDeviceRestoredCallback 006853D0 f end=0068545C type="int32_t __thiscall func(CGxDevice* this, DEVICERESTOREDCALLBACK fn)" diff --git a/profile/3.3.5a-windows-386/symbol/gxdevice/label.sym b/profile/3.3.5a-windows-386/symbol/gxdevice/label.sym index 2943aa8..f840057 100644 --- a/profile/3.3.5a-windows-386/symbol/gxdevice/label.sym +++ b/profile/3.3.5a-windows-386/symbol/gxdevice/label.sym @@ -3,4 +3,5 @@ CGxDevice__vtable 00A2DDC0 l type="CGxDevice__vtable" CGxDevice__s_shadowConstants 00C5DFE0 l CGxDevice__s_uiVertexShader 00C5DFDC l CGxDevice__s_uiPixelShader 00C5FFFC l +CGxDevice__m_logBytes 00C5FFF4 l type="uint32_t" CGxDevice__m_log 00C5FFF8 l type="HSLOG" \ 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 6037a5e..d59a379 100644 --- a/profile/3.3.5a-windows-386/symbol/main.sym +++ b/profile/3.3.5a-windows-386/symbol/main.sym @@ -2390,6 +2390,7 @@ CGxDevice__ITexMarkAsUpdated 00684900 f end=0068492D type="void __thiscall func( CGxDevice__IShaderLoad 00684970 f end=00684AC8 type="int32_t __thiscall func(CGxDevice* this, CGxShader** shaders, EGxShTarget target, char* a4, char* a5, int32_t permutations)" CGxDevice__ICursorCreate 00684AD0 f end=00684B4A type="void __thiscall func(CGxDevice* this, CGxFormat* format)" CGxDevice__CursorUnlock 00684B50 f end=00684B99 type="void __thiscall func(CGxDevice* this, uint32_t x, uint32_t y)" +CGxDevice__VLog 00684BA0 f end=00684C15 type="void __stdcall func(char* format, va_list args)" CGxDevice__Log 00684C20 f end=00684C3E type="void __stdcall func(char* format, ...)" CGxDevice__Log 00684C40 f end=00684D07 type="void __stdcall func(CGxCaps* caps)" ; CGxDevice::Log(CGxCaps const&) const CGxDevice__Log 00684D10 f end=00684D6C type="void __stdcall func(CGxFormat* format)" @@ -3533,6 +3534,7 @@ s_maxFPS 00C5DF7C l type="uint32_t" g_theGxDevicePtr 00C5DF88 l type="CGxDevice*" CGxDevice__s_uiVertexShader 00C5DFDC l CGxDevice__s_shadowConstants 00C5DFE0 l +CGxDevice__m_logBytes 00C5FFF4 l type="uint32_t" CGxDevice__m_log 00C5FFF8 l type="HSLOG" CGxDevice__s_uiPixelShader 00C5FFFC l isIdent 00C60760 l diff --git a/profile/3.3.5a-windows-386/x64dbg/game.dd32 b/profile/3.3.5a-windows-386/x64dbg/game.dd32 index c69a23930c33910b9f244952b42008a88275c45e..f0fb48a53dc020933bbe22f038cd8d7ddf8e88dc 100644 GIT binary patch delta 9105 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 delta 9073 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 G|Nj85u#%tv