From fa236379cf5e71e401ec371492bc71ebcec28911 Mon Sep 17 00:00:00 2001 From: Misha Date: Mon, 9 Oct 2023 19:05:47 -0400 Subject: [PATCH] mxdiskstreamcontroller vtable + MxStreamController::vtable0x20 --- LEGO1/mxdiskstreamcontroller.cpp | 47 +++++++++++++++++++++++++++++++- LEGO1/mxdiskstreamcontroller.h | 7 +++++ LEGO1/mxstreamcontroller.cpp | 29 +++++++++++++++++--- LEGO1/mxstreamcontroller.h | 5 ++-- 4 files changed, 81 insertions(+), 7 deletions(-) diff --git a/LEGO1/mxdiskstreamcontroller.cpp b/LEGO1/mxdiskstreamcontroller.cpp index 9e37edc4..37312ace 100644 --- a/LEGO1/mxdiskstreamcontroller.cpp +++ b/LEGO1/mxdiskstreamcontroller.cpp @@ -16,6 +16,51 @@ MxDiskStreamController::~MxDiskStreamController() MxResult MxDiskStreamController::Tickle() { // TODO - return 0; } + +// OFFSET: LEGO1 0x100c7790 +MxResult MxDiskStreamController::Open(const char *p_filename) +{ + return FAILURE; +} + +// OFFSET: LEGO1 0x100c7880 +MxResult MxDiskStreamController::vtable0x18(undefined4 p_unknown, undefined4 p_unknown2) +{ + return SUCCESS; +} + +// OFFSET: LEGO1 0x100c7ff0 STUB +MxResult MxDiskStreamController::vtable0x20(MxDSAction* p_action) +{ + // TODO + return FAILURE; +} + +// OFFSET: LEGO1 0x100c8160 STUB +MxResult MxDiskStreamController::vtable0x24(undefined4 p_unknown) +{ + // TODO + return FAILURE; +} + +// OFFSET: LEGO1 0x100c7ac0 STUB +MxResult MxDiskStreamController::vtable0x28() +{ + // TODO + return FAILURE; +} + +// OFFSET: LEGO1 0x100c7c00 STUB +MxResult MxDiskStreamController::vtable0x30(undefined4 p_unknown) +{ + // TODO + return FAILURE; +} + +// OFFSET: LEGO1 0x100c7960 +MxResult MxDiskStreamController::vtable0x34(undefined4 p_unknown) +{ + return FAILURE; +} diff --git a/LEGO1/mxdiskstreamcontroller.h b/LEGO1/mxdiskstreamcontroller.h index 1f66984c..5457a9b5 100644 --- a/LEGO1/mxdiskstreamcontroller.h +++ b/LEGO1/mxdiskstreamcontroller.h @@ -15,6 +15,13 @@ public: virtual ~MxDiskStreamController() override; virtual MxResult Tickle() override; // vtable+0x8 + virtual MxResult Open(const char *p_filename) override; // vtable+0x14 + virtual MxResult vtable0x18(undefined4 p_unknown, undefined4 p_unknown2) override; //vtable+0x18 + virtual MxResult vtable0x20(MxDSAction* p_action) override; //vtable+0x20 + virtual MxResult vtable0x24(undefined4 p_unknown) override; //vtable+0x24 + virtual MxResult vtable0x28() override; //vtable+0x28 + virtual MxResult vtable0x30(undefined4 p_unknown) override; //vtable+0x30 + virtual MxResult vtable0x34(undefined4 p_unknown); //vtable+0x34 // OFFSET: LEGO1 0x100c7360 inline virtual const char *ClassName() const override // vtable+0x0c diff --git a/LEGO1/mxstreamcontroller.cpp b/LEGO1/mxstreamcontroller.cpp index 36b85ebc..db2d3931 100644 --- a/LEGO1/mxstreamcontroller.cpp +++ b/LEGO1/mxstreamcontroller.cpp @@ -45,11 +45,32 @@ MxResult MxStreamController::vtable0x1C(undefined4 p_unknown, undefined4 p_unkno return FAILURE; } -// OFFSET: LEGO1 0x100c1690 STUB +// OFFSET: LEGO1 0x100c1690 MxResult MxStreamController::vtable0x20(MxDSAction* p_action) { - // TODO STUB - return FAILURE; + MxResult result; + void* buffer; + MxU32 buffer_value; + MxAutoLocker locker(&m_criticalSection); + + MxStreamProvider* provider = m_provider; + MxU32 objectId = p_action->GetObjectId(); + if(objectId < provider->GetLengthInDWords()) + { + buffer = provider->GetBufferForDWords(); + buffer_value = *(MxU32 *)((MxU32)buffer + objectId * 4); + } + + if (buffer_value == NULL) + { + result = FAILURE; + } + else + { + result = vtable0x2c(p_action, buffer_value); + } + + return result; } // OFFSET: LEGO1 0x100c1740 STUB @@ -66,7 +87,7 @@ MxResult MxStreamController::vtable0x28() } // OFFSET: LEGO1 0x100c1c10 STUB -MxResult MxStreamController::vtable0x2c(undefined4 p_unknown1, undefined4 p_unknow2) +MxResult MxStreamController::vtable0x2c(MxDSAction* p_action, MxU32 p_bufferval) { return FAILURE; } diff --git a/LEGO1/mxstreamcontroller.h b/LEGO1/mxstreamcontroller.h index 59490d2c..539af0bd 100644 --- a/LEGO1/mxstreamcontroller.h +++ b/LEGO1/mxstreamcontroller.h @@ -7,6 +7,7 @@ #include "mxcore.h" #include "mxdsobject.h" #include "mxdsaction.h" +#include "mxstreamprovider.h" // VTABLE 0x100dc968 // SIZE 0x64 @@ -36,7 +37,7 @@ public: virtual MxResult vtable0x20(MxDSAction* p_action); //vtable+0x20 virtual MxResult vtable0x24(undefined4 p_unknown); //vtable+0x24 virtual MxResult vtable0x28(); //vtable+0x28 - virtual MxResult vtable0x2c(undefined4 p_unknown1, undefined4 p_unknow2); //vtable+0x2c + virtual MxResult vtable0x2c(MxDSAction* p_action, MxU32 p_bufferval); //vtable+0x2c virtual MxResult vtable0x30(undefined4 p_unknown); //vtable+0x30 MxBool FUN_100c20d0(MxDSObject &p_obj); @@ -45,7 +46,7 @@ public: protected: MxCriticalSection m_criticalSection; MxAtomId atom; - undefined4 m_unk28; // MxStreamProvider* + MxStreamProvider* m_provider; // MxStreamProvider* undefined4 m_unk2c; undefined m_unk30[0x34]; };