From 157c859ad4a5b8e2711e9f9caf1884a958c243db Mon Sep 17 00:00:00 2001 From: superp00t Date: Wed, 27 Nov 2024 06:53:14 -0500 Subject: [PATCH] feat(profile): update --- .../ida/batch/import_data_types.idc | 10 +- .../ida/batch/import_functions.idc | 1 + .../ida/batch/import_symbols.idc | 11 +- .../3.3.5a-windows-386/include/gx/device.h | 10 +- .../symbol/gxdevice/func.sym | 12 +- .../3.3.5a-windows-386/symbol/gxprim/func.sym | 8 +- profile/3.3.5a-windows-386/symbol/main.sym | 19 +- profile/3.3.5a-windows-386/x64dbg/game.dd32 | Bin 95425 -> 95503 bytes profile/3.3.5a-windows-386/x64dbg/types.json | 1635 +++++++++-------- 9 files changed, 946 insertions(+), 760 deletions(-) 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 bc13b18..73d30ff 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 @@ -23,14 +23,19 @@ static import_data_types() { apply_type(0x006160B0, "int32_t __usercall func@(uint32_t** image@, MipBits* mipImages@, uint32_t width@, uint32_t height)"); apply_type(0x00616800, "void __stdcall func(CURSORMODE mode)"); 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)"); apply_type(0x00681F60, "void __stdcall func(float minX, float maxX, float minY, float maxY, float minZ, float maxZ)"); apply_type(0x00682340, "void __stdcall func(EGxPrim primType, uint32_t, uint16_t*)"); apply_type(0x006823A0, "void __stdcall func(EGxPrim primType, uint32_t indexCount, uint16_t* indices)"); + apply_type(0x00682400, "void __stdcall func(uint32_t vertexCount, C3Vector* pos, uint32_t posStride, C3Vector* normal, uint32_t normalStride, CImVector* color, uint32_t colorStride, C2Vector* tex0, uint32_t tex0Stride, C2Vector* tex1, uint32_t tex1Stride)"); + apply_type(0x006828C0, "void __stdcall func(uint32_t vertexCount, C3Vector* pos, uint32_t posStride, C3Vector* normal, uint32_t normalStride, CImVector* color, uint32_t colorStride, uint8_t* bone, uint32_t boneStride, C2Vector* tex0, uint32_t tex0Stride, C2Vector* tex1, uint32_t tex1Stride)"); apply_type(0x00682CB0, "void __thiscall func(CGxDevice* this, int32_t (*windowProc)(void*, uint32_t, uintptr_t, intptr_t), CGxFormat* format)"); apply_type(0x00682CD0, "void __thiscall func(CGxDevice* this, CGxFormat* format)"); apply_type(0x00682CF0, "void __thiscall func(CGxDevice* this)"); apply_type(0x00682D00, "void __thiscall func(CGxDevice* this, uint32_t baseMipLevel)"); apply_type(0x00682D20, "EGxApi __thiscall func(CGxDevice* this)"); + apply_type(0x00682D30, "void __thiscall func(CGxDevice* this)"); apply_type(0x00682D40, "int32_t __thiscall func(CGxDevice* this)"); apply_type(0x00682D70, "CRect* __thiscall func(CGxDevice* this)"); apply_type(0x00682DC0, "int32_t __thiscall func(CGxDevice* this, int32_t a2)"); @@ -56,6 +61,7 @@ static import_data_types() { apply_type(0x006840F0, "int32_t __thiscall func(CGxDevice* this, CGxFormat* format)"); apply_type(0x00684170, "void __thiscall func(CGxDevice* this, float gamma)"); apply_type(0x00684190, "int32_t __thiscall func(CGxDevice* this, CGxGammaRamp* ramp)"); + apply_type(0x00684260, "void __thiscall func(CGxDevice* this, uint32_t* w, uint32_t* h, CImVector** pixels)"); apply_type(0x00684360, "void __thiscall func(CGxDevice* this, CRect* rect)"); apply_type(0x006843B0, "void __thiscall func(CGxDevice* this)"); apply_type(0x006843E0, "void __thiscall func(CGxDevice* this)"); @@ -75,8 +81,8 @@ static import_data_types() { apply_type(0x006853D0, "int32_t __thiscall func(CGxDevice* this, DEVICERESTOREDCALLBACK fn)"); apply_type(0x00685460, "void __thiscall func(CGxDevice* this, TEXTURERECREATIONCALLBACK fn)"); apply_type(0x00685480, "int32_t __thiscall func(CGxDevice* this, TEXTURERECREATIONCALLBACK fn)"); - apply_type(0x00685510, "void __thiscall func(CGxDevice* this, DISPLAYCHANGECALLBACK fn)"); - apply_type(0x00685530, "int32_t __thiscall func(CGxDevice* this, DISPLAYCHANGECALLBACK fn)"); + apply_type(0x00685510, "void __thiscall func(CGxDevice* this, STEREOCHANGEDCALLBACK fn)"); + apply_type(0x00685530, "int32_t __thiscall func(CGxDevice* this, STEREOCHANGEDCALLBACK fn)"); apply_type(0x00685970, "void __thiscall func(CGxDevice* this, EGxRenderState which)"); apply_type(0x006859E0, "void __thiscall func(CGxDevice* this, EGxRenderState which)"); apply_type(0x00685A70, "void __thiscall func(CGxDevice* this)"); 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 72016bd..aeb53a9 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 @@ -39,6 +39,7 @@ static import_functions() { set_func_cmt(0x00684C40, "CGxDevice::Log(CGxCaps const&) const", 0); set_func_cmt(0x006859E0, "CGxDevice::IRsForceUpdate(EGxRenderState)", 0); set_func_cmt(0x00685A70, "CGxDevice::IRsForceUpdate()", 0); + set_func_cmt(0x0069FE10, "UC (invented name)", 0); set_func_cmt(0x006AA350, "UC", 0); set_func_cmt(0x006AA420, "private utility method", 0); set_func_cmt(0x006AB390, "public method", 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 b23675c..3a26732 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 @@ -123,6 +123,7 @@ static import_symbols() { set_name(0x0047FC20, "IEvtInputSetConfirmCloseCallback"); set_name(0x0047FC90, "ConvertPosition"); set_name(0x004800A0, "IEvtInputGetMousePosition"); + set_name(0x00480130, "ProcessInput"); set_name(0x00480410, "IEvtInputProcess"); set_name(0x004804B0, "IEvtQueueDestroy"); set_name(0x004804C0, "IEvtQueueCheckSyncMouseState"); @@ -2105,7 +2106,7 @@ static import_symbols() { set_name(0x00681F60, "GxXformSetViewport"); set_name(0x00682340, "GxDrawLockedElements@2"); set_name(0x006823A0, "GxPrimLockIndexPtr"); - set_name(0x00682400, "GxPrimVertexPtr_FFP"); + set_name(0x00682400, "GxPrimVertexPtr@2"); set_name(0x006828C0, "GxPrimLockVertexPtrs"); set_name(0x00682A00, "GxScenePresent"); set_name(0x00682CB0, "CGxDevice__DeviceCreate_WindowProc_CGxFormat"); @@ -2113,6 +2114,7 @@ static import_symbols() { set_name(0x00682CF0, "CGxDevice__DeviceDestroy"); set_name(0x00682D00, "CGxDevice__DeviceSetBaseMipLevel"); set_name(0x00682D20, "CGxDevice__DeviceApi"); + set_name(0x00682D30, "CGxDevice__DeviceTakeScreenShot"); set_name(0x00682D40, "CGxDevice__IDevIsWindowed"); set_name(0x00682D70, "CGxDevice__DeviceCurWindow"); set_name(0x00682DC0, "CGxDevice__CapsIsWindowVisible"); @@ -2138,10 +2140,11 @@ static import_symbols() { set_name(0x006840F0, "CGxDevice__DeviceSetFormat"); set_name(0x00684170, "CGxDevice__DeviceSetGamma_float"); set_name(0x00684190, "CGxDevice__DeviceSetGamma_CGxGammaRamp"); + set_name(0x00684260, "CGxDevice__DeviceReadScreenShot"); set_name(0x00684360, "CGxDevice__DeviceSetDefWindow"); set_name(0x006843B0, "CGxDevice__NotifyOnDeviceRestored"); set_name(0x006843E0, "CGxDevice__NotifyOnTextureRecreation"); - set_name(0x00684410, "CGxDevice__NotifyOnDisplayChange"); + set_name(0x00684410, "CGxDevice__NotifyOnStereoChanged"); set_name(0x00684440, "CGxDevice__ClipPlaneSet"); set_name(0x006847D0, "CGxDevice__LightSet"); set_name(0x00684850, "CGxDevice__BufStream"); @@ -2157,8 +2160,8 @@ static import_symbols() { set_name(0x006853D0, "CGxDevice__RemoveDeviceRestoredCallback"); set_name(0x00685460, "CGxDevice__AddTextureRecreationCallback"); set_name(0x00685480, "CGxDevice__RemoveTextureRecreationCallback"); - set_name(0x00685510, "CGxDevice__AddDisplayChangeCallback"); - set_name(0x00685530, "CGxDevice__RemoveDisplayChangeCallback"); + set_name(0x00685510, "CGxDevice__AddStereoChangedCallback"); + set_name(0x00685530, "CGxDevice__RemoveStereoChangedCallback"); set_name(0x00685970, "CGxDevice__IRsDirty"); set_name(0x006859E0, "CGxDevice__IRsForceUpdate_EGxRenderState"); set_name(0x00685A70, "CGxDevice__IRsForceUpdate"); diff --git a/profile/3.3.5a-windows-386/include/gx/device.h b/profile/3.3.5a-windows-386/include/gx/device.h index cd6dd44..f6ac61f 100644 --- a/profile/3.3.5a-windows-386/include/gx/device.h +++ b/profile/3.3.5a-windows-386/include/gx/device.h @@ -80,8 +80,8 @@ struct CGxDevice__vtable { void* v_fn_5_NotifyOnDeviceRestored; // void NotifyOnTextureRecreation(); void* v_fn_6_NotifyOnTextureRecreation; - // void NotifyOnDisplayChange(); - void* v_fn_7_NotifyOnDisplayChange; + // void NotifyOnStereoChanged(); + void* v_fn_7_NotifyOnStereoChanged; // void `scalar deleting destructor'(uint32_t __flags) void* v_fn_8_scalar_deleting_destructor; // int32_t DeviceCreate(const CGxFormat& format); @@ -337,7 +337,11 @@ struct CGxDevice { uint32_t unk28E8; TSFixedArray_CGxAppRenderState m_appRenderStates; TSFixedArray_CGxStateBom m_hwRenderStates; - uint32_t unk2904[19]; // 0x2904 (size 0x4C) + uint32_t unk2904[12]; // 0x2904 (size 0x30) + int32_t m_scrShotClick; // 0x2934 + uint32_t m_scrShotWidth; // 0x2938 + uint32_t m_scrShotHeight; // 0x293C + TSGrowableArray_CImVector m_scrShotPixels; // 0x2940 int32_t m_cursorVisible; int32_t m_hardwareCursor; // 0x2954 (size 0x4) uint32_t m_cursorHotspotX; 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 534fc0d..5f971c0 100644 --- a/profile/3.3.5a-windows-386/symbol/gxdevice/func.sym +++ b/profile/3.3.5a-windows-386/symbol/gxdevice/func.sym @@ -10,6 +10,7 @@ CGxDevice__DeviceCurWindow 00682D70 f end=00682D76 type="CRect* __thiscall func( CGxDevice__CapsIsWindowVisible 00682DC0 f end=00682DE7 type="int32_t __thiscall func(CGxDevice* this, int32_t a2)" CGxDevice__CapsHasContext 00682E20 f end=00682E47 type="int32_t __thiscall func(CGxDevice* this, int32_t a2)" CGxDevice__ScenePresent 00682E50 f end=00682E66 type="void __thiscall func(CGxDevice* this)" +CGxDevice__PrimIndexPtr 00682F10 f end=00682F3C type="void __thiscall func(CGxDevice* this, CGxBuf* buf)" CGxDevice__PrimCalcCount 00682F40 f end=00682F66 type="uint32_t __stdcall func(EGxPrim primType, uint32_t indexCount)" CGxDevice__LightEnable 00683080 f end=006830A4 type="void __thiscall func(CGxDevice* this, uint32_t whichLight, int32_t enable)" CGxDevice__NeedsUpdate 006830B0 f end=006830F9 type="int32_t __thiscall func(CGxDevice* this, uint32_t app, uint32_t hw, uint32_t appDisables, uint32_t hwDisables, uint32_t flagPos, int32_t* enable)" @@ -27,12 +28,12 @@ CGxDevice__CursorSetVisible 00683640 f end=00683650 type="void __thiscall func(C CGxDevice__CursorLock 00683650 f end=00683657 type="uint32_t* __thiscall func(CGxDevice* this)" CGxDevice__CursorSetDepth 00683660 f end=00683670 type="void __thiscall func(CGxDevice* this, float depth)" CGxDevice__DeviceSetFormat 006840F0 f end=0068416C type="int32_t __thiscall func(CGxDevice* this, CGxFormat* format)" -CGxDevice__DeviceSetGamma_CGxGammaRamp 00684190 f end=006841AF type="int32_t __thiscall func(CGxDevice* this, CGxGammaRamp* ramp)" CGxDevice__DeviceSetGamma_float 00684170 f end=00684189 type="void __thiscall func(CGxDevice* this, float gamma)" +CGxDevice__DeviceSetGamma_CGxGammaRamp 00684190 f end=006841AF type="int32_t __thiscall func(CGxDevice* this, CGxGammaRamp* ramp)" CGxDevice__DeviceSetDefWindow 00684360 f end=006843B0 type="void __thiscall func(CGxDevice* this, CRect* rect)" CGxDevice__NotifyOnDeviceRestored 006843B0 f end=006843D9 type="void __thiscall func(CGxDevice* this)" CGxDevice__NotifyOnTextureRecreation 006843E0 f end=00684409 type="void __thiscall func(CGxDevice* this)" -CGxDevice__NotifyOnDisplayChange 00684410 f end=00684439 type="void __thiscall func(CGxDevice* this)" +CGxDevice__NotifyOnStereoChanged 00684410 f end=00684439 type="void __thiscall func(CGxDevice* this)" CGxDevice__ClipPlaneSet 00684440 f end=006844B9 type="void __thiscall func(CGxDevice* this, uint32_t a2, C4Plane* plane)" CGxDevice__LightSet 006847D0 f end=00684843 type="void __thiscall func(CGxDevice* this, uint32_t a2, CGxLight* light, C3Vector* pos)" CGxDevice__BufStream 00684850 f end=0068489F type="void __thiscall func(CGxDevice* this, EGxPoolTarget target, uint32_t itemSize, uint32_t itemCount)" @@ -48,8 +49,8 @@ CGxDevice__AddDeviceRestoredCallback 006853B0 f end=006853C6 type="void __thisca CGxDevice__RemoveDeviceRestoredCallback 006853D0 f end=0068545C type="int32_t __thiscall func(CGxDevice* this, DEVICERESTOREDCALLBACK fn)" CGxDevice__AddTextureRecreationCallback 00685460 f end=00685476 type="void __thiscall func(CGxDevice* this, TEXTURERECREATIONCALLBACK fn)" CGxDevice__RemoveTextureRecreationCallback 00685480 f end=0068550C type="int32_t __thiscall func(CGxDevice* this, TEXTURERECREATIONCALLBACK fn)" -CGxDevice__AddDisplayChangeCallback 00685510 f end=00685526 type="void __thiscall func(CGxDevice* this, DISPLAYCHANGECALLBACK fn)" -CGxDevice__RemoveDisplayChangeCallback 00685530 f end=006855BC type="int32_t __thiscall func(CGxDevice* this, DISPLAYCHANGECALLBACK fn)" +CGxDevice__AddStereoChangedCallback 00685510 f end=00685526 type="void __thiscall func(CGxDevice* this, STEREOCHANGEDCALLBACK fn)" +CGxDevice__RemoveStereoChangedCallback 00685530 f end=006855BC type="int32_t __thiscall func(CGxDevice* this, STEREOCHANGEDCALLBACK fn)" CGxDevice__IRsDirty 00685970 f end=006859DB type="void __thiscall func(CGxDevice* this, EGxRenderState which)" CGxDevice__IRsForceUpdate_EGxRenderState 006859E0 f end=00685A65 type="void __thiscall func(CGxDevice* this, EGxRenderState which)" ; CGxDevice::IRsForceUpdate(EGxRenderState) CGxDevice__IRsForceUpdate 00685A70 f end=00685B4E type="void __thiscall func(CGxDevice* this)" ; CGxDevice::IRsForceUpdate() @@ -70,4 +71,5 @@ CGxDevice__NewD3d 00689EF0 f end=00689F14 type="CGxDevice* __stdcall func()" CGxDevice__NewOpenGl 0068BF20 f end=0068BF44 type="CGxDevice* __stdcall func()" CGxDevice__NewD3d9Ex 0068C220 f end=0068C244 type="CGxDevice* __stdcall func()" CGxDevice__ITexWHDStartEnd 006A5EF0 f end=006A5FDF type="void __thiscall func(CGxDevice* this, CGxTex* texId, uint32_t* width, uint32_t* height, uint32_t* baseMip, uint32_t* mipCount)" -CGxDevice__PrimIndexPtr 00682F10 f end=00682F3C type="void __thiscall func(CGxDevice* this, CGxBuf* buf)" \ No newline at end of file +CGxDevice__DeviceTakeScreenShot 00682D30 f end=00682D3B type="void __thiscall func(CGxDevice* this)" +CGxDevice__DeviceReadScreenShot 00684260 f end=0068429E type="void __thiscall func(CGxDevice* this, uint32_t* w, uint32_t* h, CImVector** pixels)" \ No newline at end of file diff --git a/profile/3.3.5a-windows-386/symbol/gxprim/func.sym b/profile/3.3.5a-windows-386/symbol/gxprim/func.sym index 9e50279..eabcebf 100644 --- a/profile/3.3.5a-windows-386/symbol/gxprim/func.sym +++ b/profile/3.3.5a-windows-386/symbol/gxprim/func.sym @@ -1,7 +1,7 @@ -GxPrimIndexPtr 00681AB0 f end=00681AFB -GxPrimVertexPtr 00681B00 f end= type="void __stdcall func(CGxBuf* buf, EGxVertexBufferFormat format)" -GxPrimVertexPtr 00682400 f end=00682781 ; this is one of the functions named 'GxPrimVertexPtr' that uses the fixed-function pipeline -GxPrimLockVertexPtrs 006828C0 f end=006828FE +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)" +GxPrimVertexPtr 00682400 f end=00682781 type="void __stdcall func(uint32_t vertexCount, C3Vector* pos, uint32_t posStride, C3Vector* normal, uint32_t normalStride, CImVector* color, uint32_t colorStride, C2Vector* tex0, uint32_t tex0Stride, C2Vector* tex1, uint32_t tex1Stride)" ; this is one of the functions named 'GxPrimVertexPtr' that uses the fixed-function pipeline +GxPrimLockVertexPtrs 006828C0 f end=006828FE type="void __stdcall func(uint32_t vertexCount, C3Vector* pos, uint32_t posStride, C3Vector* normal, uint32_t normalStride, CImVector* color, uint32_t colorStride, uint8_t* bone, uint32_t boneStride, C2Vector* tex0, uint32_t tex0Stride, C2Vector* tex1, uint32_t tex1Stride)" GxPrimLockIndexPtr 006823A0 f end=006823F8 type="void __stdcall func(EGxPrim primType, uint32_t indexCount, uint16_t* indices)" GxDrawLockedElements 00682340 f end=0068239E type="void __stdcall func(EGxPrim primType, uint32_t, uint16_t*)" GxDrawLockedElements 00681A60 f end=00681AAB type="void __stdcall func()" \ 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 8f4df8e..9fce952 100644 --- a/profile/3.3.5a-windows-386/symbol/main.sym +++ b/profile/3.3.5a-windows-386/symbol/main.sym @@ -119,6 +119,7 @@ IEvtInputSetMouseMode 0047FBB0 f end=0047FC17 IEvtInputSetConfirmCloseCallback 0047FC20 f end=0047FC36 ConvertPosition 0047FC90 f end=0047FDD4 IEvtInputGetMousePosition 004800A0 f end=004800EF +ProcessInput 00480130 f end=0048040C IEvtInputProcess 00480410 f end=004804A8 IEvtQueueDestroy 004804B0 f end=004804BA IEvtQueueCheckSyncMouseState 004804C0 f end=004804E6 @@ -2094,21 +2095,22 @@ GxSceneClear 006813B0 f end=006813CD GxTexUpdate 006813D0 f end=006813EC GxLog 006817E0 f end=006817F5 GxDrawLockedElements 00681A60 f end=00681AAB type="void __stdcall func()" -GxPrimIndexPtr 00681AB0 f end=00681AFB -GxPrimVertexPtr 00681B00 f +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)" CGxTexFlags__CGxTexFlags 00681BE0 f end=00681CAB ; UC GxTexCreate 00681CB0 f end=00681D87 GxXformSetViewport 00681F60 f end=00682124 type="void __stdcall func(float minX, float maxX, float minY, float maxY, float minZ, float maxZ)" GxDrawLockedElements 00682340 f end=0068239E type="void __stdcall func(EGxPrim primType, uint32_t, uint16_t*)" GxPrimLockIndexPtr 006823A0 f end=006823F8 type="void __stdcall func(EGxPrim primType, uint32_t indexCount, uint16_t* indices)" -GxPrimVertexPtr_FFP 00682400 f end=00682781 ; this is one of the functions named 'GxPrimVertexPtr' that uses the fixed-function pipeline -GxPrimLockVertexPtrs 006828C0 f end=006828FE +GxPrimVertexPtr 00682400 f end=00682781 type="void __stdcall func(uint32_t vertexCount, C3Vector* pos, uint32_t posStride, C3Vector* normal, uint32_t normalStride, CImVector* color, uint32_t colorStride, C2Vector* tex0, uint32_t tex0Stride, C2Vector* tex1, uint32_t tex1Stride)" ; this is one of the functions named 'GxPrimVertexPtr' that uses the fixed-function pipeline +GxPrimLockVertexPtrs 006828C0 f end=006828FE type="void __stdcall func(uint32_t vertexCount, C3Vector* pos, uint32_t posStride, C3Vector* normal, uint32_t normalStride, CImVector* color, uint32_t colorStride, uint8_t* bone, uint32_t boneStride, C2Vector* tex0, uint32_t tex0Stride, C2Vector* tex1, uint32_t tex1Stride)" GxScenePresent 00682A00 f end=00682A33 CGxDevice__DeviceCreate_WindowProc_CGxFormat 00682CB0 f end=00682CCB type="void __thiscall func(CGxDevice* this, int32_t (*windowProc)(void*, uint32_t, uintptr_t, intptr_t), CGxFormat* format)" CGxDevice__DeviceCreate_CGxFormat 00682CD0 f end=00682CF0 type="void __thiscall func(CGxDevice* this, CGxFormat* format)" CGxDevice__DeviceDestroy 00682CF0 f end=00682CFB type="void __thiscall func(CGxDevice* this)" CGxDevice__DeviceSetBaseMipLevel 00682D00 f end=00682D10 type="void __thiscall func(CGxDevice* this, uint32_t baseMipLevel)" CGxDevice__DeviceApi 00682D20 f end=00682D27 type="EGxApi __thiscall func(CGxDevice* this)" +CGxDevice__DeviceTakeScreenShot 00682D30 f end=00682D3B type="void __thiscall func(CGxDevice* this)" CGxDevice__IDevIsWindowed 00682D40 f end=00682D48 type="int32_t __thiscall func(CGxDevice* this)" CGxDevice__DeviceCurWindow 00682D70 f end=00682D76 type="CRect* __thiscall func(CGxDevice* this)" CGxDevice__CapsIsWindowVisible 00682DC0 f end=00682DE7 type="int32_t __thiscall func(CGxDevice* this, int32_t a2)" @@ -2134,10 +2136,11 @@ CGxDevice__CursorSetDepth 00683660 f end=00683670 type="void __thiscall func(CGx CGxDevice__DeviceSetFormat 006840F0 f end=0068416C type="int32_t __thiscall func(CGxDevice* this, CGxFormat* format)" CGxDevice__DeviceSetGamma_float 00684170 f end=00684189 type="void __thiscall func(CGxDevice* this, float gamma)" CGxDevice__DeviceSetGamma_CGxGammaRamp 00684190 f end=006841AF type="int32_t __thiscall func(CGxDevice* this, CGxGammaRamp* ramp)" +CGxDevice__DeviceReadScreenShot 00684260 f end=0068429E type="void __thiscall func(CGxDevice* this, uint32_t* w, uint32_t* h, CImVector** pixels)" CGxDevice__DeviceSetDefWindow 00684360 f end=006843B0 type="void __thiscall func(CGxDevice* this, CRect* rect)" CGxDevice__NotifyOnDeviceRestored 006843B0 f end=006843D9 type="void __thiscall func(CGxDevice* this)" CGxDevice__NotifyOnTextureRecreation 006843E0 f end=00684409 type="void __thiscall func(CGxDevice* this)" -CGxDevice__NotifyOnDisplayChange 00684410 f end=00684439 type="void __thiscall func(CGxDevice* this)" +CGxDevice__NotifyOnStereoChanged 00684410 f end=00684439 type="void __thiscall func(CGxDevice* this)" CGxDevice__ClipPlaneSet 00684440 f end=006844B9 type="void __thiscall func(CGxDevice* this, uint32_t a2, C4Plane* plane)" CGxDevice__LightSet 006847D0 f end=00684843 type="void __thiscall func(CGxDevice* this, uint32_t a2, CGxLight* light, C3Vector* pos)" CGxDevice__BufStream 00684850 f end=0068489F type="void __thiscall func(CGxDevice* this, EGxPoolTarget target, uint32_t itemSize, uint32_t itemCount)" @@ -2153,8 +2156,8 @@ CGxDevice__AddDeviceRestoredCallback 006853B0 f end=006853C6 type="void __thisca CGxDevice__RemoveDeviceRestoredCallback 006853D0 f end=0068545C type="int32_t __thiscall func(CGxDevice* this, DEVICERESTOREDCALLBACK fn)" CGxDevice__AddTextureRecreationCallback 00685460 f end=00685476 type="void __thiscall func(CGxDevice* this, TEXTURERECREATIONCALLBACK fn)" CGxDevice__RemoveTextureRecreationCallback 00685480 f end=0068550C type="int32_t __thiscall func(CGxDevice* this, TEXTURERECREATIONCALLBACK fn)" -CGxDevice__AddDisplayChangeCallback 00685510 f end=00685526 type="void __thiscall func(CGxDevice* this, DISPLAYCHANGECALLBACK fn)" -CGxDevice__RemoveDisplayChangeCallback 00685530 f end=006855BC type="int32_t __thiscall func(CGxDevice* this, DISPLAYCHANGECALLBACK fn)" +CGxDevice__AddStereoChangedCallback 00685510 f end=00685526 type="void __thiscall func(CGxDevice* this, STEREOCHANGEDCALLBACK fn)" +CGxDevice__RemoveStereoChangedCallback 00685530 f end=006855BC type="int32_t __thiscall func(CGxDevice* this, STEREOCHANGEDCALLBACK fn)" CGxDevice__IRsDirty 00685970 f end=006859DB type="void __thiscall func(CGxDevice* this, EGxRenderState which)" CGxDevice__IRsForceUpdate_EGxRenderState 006859E0 f end=00685A65 type="void __thiscall func(CGxDevice* this, EGxRenderState which)" ; CGxDevice::IRsForceUpdate(EGxRenderState) CGxDevice__IRsForceUpdate 00685A70 f end=00685B4E type="void __thiscall func(CGxDevice* this)" ; CGxDevice::IRsForceUpdate() @@ -2199,7 +2202,7 @@ CGxDeviceD3d__ICreateD3d 00690680 f end=00690742 CGxDeviceD3d__DeviceCreate_WindowProc_CGxFormat 00690750 f end=00690821 CGxDeviceD3d__ICreateD3dVB 0069FB00 f end=0069FB68 CGxDeviceD3d__CreatePoolAPI 0069FB70 f end=0069FBB8 -CGxDeviceD3d__ICursorClip 0069FE10 f end=0069FE57 +CGxDeviceD3d__ICursorClip 0069FE10 f end=0069FE57 ; UC (invented name) CGxDeviceD3d__ICursorDestroy 006A00C0 f end=006A0102 CGxDeviceD3d__WindowProcD3d 006A0360 f end=006A0834 CGxDeviceD3d9Ex__CGxDeviceD3d9Ex 006A1A90 f end=006A1C24 diff --git a/profile/3.3.5a-windows-386/x64dbg/game.dd32 b/profile/3.3.5a-windows-386/x64dbg/game.dd32 index 5453f18654a0542bfd8e9f9c243d6b8bdbd74279..0c431f38cb3f9baedcc65facfddaa4cc732ba128 100644 GIT binary patch delta 13895 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 delta 13929 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