From 61819f15732768e62e3b0020c54705bdc933fcea Mon Sep 17 00:00:00 2001 From: TheRedDaemon <66257843+TheRedDaemon@users.noreply.github.com> Date: Sun, 3 May 2026 22:39:12 +0200 Subject: [PATCH 1/6] [EXPERIMENT/MSS] attempt func 0x00467810 and 0x004799A0 --- cmake/openshc-sources.txt | 2 + src/OpenSHC/Audio/mss/SoundSystem.func.hpp | 2 +- .../Audio/mss/SoundSystem/endSoundStream.cpp | 64 +++++++++++++++ .../mss/SoundSystem/stopMusicPlayback.cpp | 12 +++ src/OpenSHC/Globals/DAT_00df3844.hpp | 14 ++++ src/precomp/addresses-SHC-3BB0A8C1.hpp | 3 +- status/addresses-SHC-3BB0A8C1.txt | 79 +++++-------------- 7 files changed, 115 insertions(+), 61 deletions(-) create mode 100644 src/OpenSHC/Audio/mss/SoundSystem/endSoundStream.cpp create mode 100644 src/OpenSHC/Audio/mss/SoundSystem/stopMusicPlayback.cpp create mode 100644 src/OpenSHC/Globals/DAT_00df3844.hpp diff --git a/cmake/openshc-sources.txt b/cmake/openshc-sources.txt index e69de29b..d57a14b3 100644 --- a/cmake/openshc-sources.txt +++ b/cmake/openshc-sources.txt @@ -0,0 +1,2 @@ +src/OpenSHC/Audio/mss/SoundSystem/stopMusicPlayback.cpp +src/OpenSHC/Audio/mss/SoundSystem/endSoundStream.cpp diff --git a/src/OpenSHC/Audio/mss/SoundSystem.func.hpp b/src/OpenSHC/Audio/mss/SoundSystem.func.hpp index 9ddf9d50..88e1f6a2 100644 --- a/src/OpenSHC/Audio/mss/SoundSystem.func.hpp +++ b/src/OpenSHC/Audio/mss/SoundSystem.func.hpp @@ -29,7 +29,7 @@ namespace Audio { void (SoundSystem::*)(), false, Address::SHC_3BB0A8C1_0x00467830, &SoundSystem::endSoundStreamsUnk) endSoundStreamsUnk; - MACRO_FUNCTION_RESOLVER(void (SoundSystem::*)(SHC_SoundStreamInt), false, Address::SHC_3BB0A8C1_0x004799A0, + MACRO_FUNCTION_RESOLVER(void (SoundSystem::*)(SHC_SoundStreamInt), true, Address::SHC_3BB0A8C1_0x004799A0, &SoundSystem::endSoundStream) endSoundStream; diff --git a/src/OpenSHC/Audio/mss/SoundSystem/endSoundStream.cpp b/src/OpenSHC/Audio/mss/SoundSystem/endSoundStream.cpp new file mode 100644 index 00000000..700e3664 --- /dev/null +++ b/src/OpenSHC/Audio/mss/SoundSystem/endSoundStream.cpp @@ -0,0 +1,64 @@ +#include "OpenSHC/Audio/mss/SoundSystem.hpp" + +#include "OpenSHC/Audio/mss/_enums/AILStatus.hpp" +#include "OpenSHC/Audio/mss/_enums/SHC_SoundStream.hpp" + +#include "Mss32.h" + +#include + +#include "OpenSHC/Globals/DAT_00df3844.hpp" + +// TODO: +// - DAT_00df3844 did not exist before and is therefore wrongly sorted into the status file +// - the mss types need to use the mss32 header, not the Ghidra exported one (how to handle this?) +// - "_close" is treaded like an OFFSET function and reduces the score of reccmp +// - "UnkSoundFlagsAndLoopCount" plays not nice with any number-like operation, the more likely thing therefore are +// either a union, which allows to access the different parts separately, but this would likely compile to WORD +// operations, or a bitfield, maybe like this: +// int loopCount : 16; +// int reserved : 13; +// int unknownFlag1 : 1; +// int unknownFlag2 : 1; +// int uninterruptable : 1; // ? +// In a test in the current file it compiled to "& 0x80000000" properly when using the specific field, but no idea if +// this works for multifield checks or assigns + +// FUNCTION: STRONGHOLDCRUSADER 0x004799A0 +void OpenSHC::Audio::mss::SoundSystem::endSoundStream(SHC_SoundStreamInt sndStreamIndex) +{ + if (!this->waveOutOpenUnk_0x8) { + return; + } + + if (sndStreamIndex == _enums::SND_STR_MUSIC) { + this->streamActiveUnk_0x20[0] = 0; + *DAT_00df3844::ptr = 1; + if (this->musicSampleFileHandleUnk_0x174 != -1) { + AIL_end_sample(this->musicSampleUnk_0x170); + _close(this->musicSampleFileHandleUnk_0x174); + } + if (this->musicFileHandle_0x178 != -1) { + _close(this->musicFileHandle_0x178); + } + this->musicFileHandle_0x178 = -1; + this->musicSampleFileHandleUnk_0x174 = -1; + this->mbr_0x188 = 1; + *DAT_00df3844::ptr = 0; + this->sec_Section1055_0x3274 = 0; + return; + } + + if (!this->streamActiveUnk_0x20[sndStreamIndex]) { + return; + } + + // flag seems to indicate an "uninterruptable" stream; if it is set, a playing stream can not be ended + if ((*reinterpret_cast(&this->streamFlagsUnkAndLoopCount_0x34[sndStreamIndex]) & 0x80000000) + && (AIL_stream_status(this->stream_0xc[sndStreamIndex]) == SMP_PLAYING)) { + return; + } + AIL_close_stream(this->stream_0xc[sndStreamIndex]); + this->streamActiveUnk_0x20[sndStreamIndex] = 0; + this->stream_0xc[sndStreamIndex] = 0x0; +} diff --git a/src/OpenSHC/Audio/mss/SoundSystem/stopMusicPlayback.cpp b/src/OpenSHC/Audio/mss/SoundSystem/stopMusicPlayback.cpp new file mode 100644 index 00000000..1f6958b4 --- /dev/null +++ b/src/OpenSHC/Audio/mss/SoundSystem/stopMusicPlayback.cpp @@ -0,0 +1,12 @@ +#include "OpenSHC/Audio/mss/SoundSystem.hpp" + +#include "OpenSHC/Audio/mss/SoundSystem.func.hpp" +#include "OpenSHC/Audio/mss/_enums/SHC_SoundStream.hpp" + +// FUNCTION: STRONGHOLDCRUSADER 0x00467810 +void OpenSHC::Audio::mss::SoundSystem::stopMusicPlayback() +{ + MACRO_CALL_MEMBER(OpenSHC::Audio::mss::SoundSystem_Func::endSoundStream, this)(_enums::SND_STR_MUSIC); + this->mbr_0x154 = 0; + this->sec_Section1055_0x3274 = 0; +} diff --git a/src/OpenSHC/Globals/DAT_00df3844.hpp b/src/OpenSHC/Globals/DAT_00df3844.hpp new file mode 100644 index 00000000..b9380285 --- /dev/null +++ b/src/OpenSHC/Globals/DAT_00df3844.hpp @@ -0,0 +1,14 @@ +/** + THIS FILE IS AUTO GENERATED + Communicate changes to the dev team (e.g. via a Pull Request). + Changes get lost otherwise. + + path: 'OpenSHC/Globals/DAT_00df3844.hpp' +*/ + +#pragma once + +namespace OpenSHC { + +MACRO_STRUCT_RESOLVER(undefined4, false, Address::SHC_3BB0A8C1_0x00df3844) DAT_00df3844; +} // namespace OpenSHC diff --git a/src/precomp/addresses-SHC-3BB0A8C1.hpp b/src/precomp/addresses-SHC-3BB0A8C1.hpp index c4676df2..734afd39 100644 --- a/src/precomp/addresses-SHC-3BB0A8C1.hpp +++ b/src/precomp/addresses-SHC-3BB0A8C1.hpp @@ -98109,6 +98109,7 @@ enum { // location: // type: /byte[1708] SHC_3BB0A8C1_0x02490954 = 0x02490954, - + // type: /undefined4 + SHC_3BB0A8C1_0x00df3844 = 0x00df3844, }; } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 569b551d..69556e9b 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -9831,7 +9831,7 @@ SHC_3BB0A8C1_0x00467780 | 0.0% | Pending SHC_3BB0A8C1_0x00467790 | 0.0% | Pending SHC_3BB0A8C1_0x004677A0 | 0.0% | Pending SHC_3BB0A8C1_0x004677E0 | 0.0% | Pending -SHC_3BB0A8C1_0x00467810 | 0.0% | Pending +SHC_3BB0A8C1_0x00467810 | 100.0% | Reimplemented SHC_3BB0A8C1_0x00467830 | 100.0% | Reimplemented SHC_3BB0A8C1_0x00467850 | 0.0% | Pending SHC_3BB0A8C1_0x00467890 | 0.0% | Pending @@ -10880,7 +10880,7 @@ SHC_3BB0A8C1_0x00479369 | 0.0% | Pending SHC_3BB0A8C1_0x00479400 | 0.0% | Pending SHC_3BB0A8C1_0x00479540 | 0.0% | Pending SHC_3BB0A8C1_0x00479790 | 0.0% | Pending -SHC_3BB0A8C1_0x004799A0 | 0.0% | Pending +SHC_3BB0A8C1_0x004799A0 | 96.36% | "_close" is seen as unknown offset call by reccmp SHC_3BB0A8C1_0x00479A60 | 100.0% | Reimplemented SHC_3BB0A8C1_0x00479AB0 | 100.0% | Reimplemented SHC_3BB0A8C1_0x00479AF0 | 100.0% | Reimplemented @@ -34649,9 +34649,19 @@ SHC_3BB0A8C1_0x0059E80C | 0.0% | Pending SHC_3BB0A8C1_0x0059E818 | 0.0% | Pending SHC_3BB0A8C1_0x0059E81C | 0.0% | Pending SHC_3BB0A8C1_0x0059E830 | 0.0% | Pending +SHC_3BB0A8C1_0x0059E840 | 0.0% | Pending +SHC_3BB0A8C1_0x0059E848 | 0.0% | Pending +SHC_3BB0A8C1_0x0059E850 | 0.0% | Pending +SHC_3BB0A8C1_0x0059E858 | 0.0% | Pending +SHC_3BB0A8C1_0x0059E860 | 0.0% | Pending SHC_3BB0A8C1_0x0059E868 | 0.0% | Pending +SHC_3BB0A8C1_0x0059E870 | 0.0% | Pending +SHC_3BB0A8C1_0x0059E878 | 0.0% | Pending +SHC_3BB0A8C1_0x0059E880 | 0.0% | Pending +SHC_3BB0A8C1_0x0059E888 | 0.0% | Pending +SHC_3BB0A8C1_0x0059E890 | 0.0% | Pending SHC_3BB0A8C1_0x0059E898 | 0.0% | Pending -SHC_3BB0A8C1_0x0059E89F | 0.0% | Pending +SHC_3BB0A8C1_0x0059E8A0 | 0.0% | Pending SHC_3BB0A8C1_0x0059E8B8 | 0.0% | Pending SHC_3BB0A8C1_0x0059E8D0 | 0.0% | Pending SHC_3BB0A8C1_0x0059E8E4 | 0.0% | Pending @@ -37892,6 +37902,7 @@ SHC_3BB0A8C1_0x005ACE38 | 0.0% | Pending SHC_3BB0A8C1_0x005ACE40 | 0.0% | Pending SHC_3BB0A8C1_0x005ACE48 | 0.0% | Pending SHC_3BB0A8C1_0x005ACE50 | 0.0% | Pending +SHC_3BB0A8C1_0x005ACE5A | 0.0% | Pending SHC_3BB0A8C1_0x005AE4A0 | 0.0% | Pending SHC_3BB0A8C1_0x005AE4A8 | 0.0% | Pending SHC_3BB0A8C1_0x005AE4B0 | 0.0% | Pending @@ -39969,76 +39980,23 @@ SHC_3BB0A8C1_0x005B3F68 | 0.0% | Pending SHC_3BB0A8C1_0x005B3F88 | 0.0% | Pending SHC_3BB0A8C1_0x005B3FA8 | 0.0% | Pending SHC_3BB0A8C1_0x005B3FC8 | 0.0% | Pending +SHC_3BB0A8C1_0x005B41AC | 0.0% | Pending +SHC_3BB0A8C1_0x005B41B0 | 0.0% | Pending +SHC_3BB0A8C1_0x005B41D0 | 0.0% | Pending SHC_3BB0A8C1_0x005B41D4 | 0.0% | Pending -SHC_3BB0A8C1_0x005B41D8 | 0.0% | Pending -SHC_3BB0A8C1_0x005B41DC | 0.0% | Pending -SHC_3BB0A8C1_0x005B41E0 | 0.0% | Pending -SHC_3BB0A8C1_0x005B41E4 | 0.0% | Pending SHC_3BB0A8C1_0x005B41E8 | 0.0% | Pending -SHC_3BB0A8C1_0x005B41EC | 0.0% | Pending -SHC_3BB0A8C1_0x005B41F0 | 0.0% | Pending -SHC_3BB0A8C1_0x005B41F4 | 0.0% | Pending -SHC_3BB0A8C1_0x005B41F8 | 0.0% | Pending SHC_3BB0A8C1_0x005B41FC | 0.0% | Pending -SHC_3BB0A8C1_0x005B4200 | 0.0% | Pending -SHC_3BB0A8C1_0x005B4204 | 0.0% | Pending -SHC_3BB0A8C1_0x005B4208 | 0.0% | Pending -SHC_3BB0A8C1_0x005B420C | 0.0% | Pending SHC_3BB0A8C1_0x005B4210 | 0.0% | Pending -SHC_3BB0A8C1_0x005B4214 | 0.0% | Pending -SHC_3BB0A8C1_0x005B4218 | 0.0% | Pending -SHC_3BB0A8C1_0x005B421C | 0.0% | Pending -SHC_3BB0A8C1_0x005B4220 | 0.0% | Pending SHC_3BB0A8C1_0x005B4224 | 0.0% | Pending -SHC_3BB0A8C1_0x005B4228 | 0.0% | Pending -SHC_3BB0A8C1_0x005B422C | 0.0% | Pending -SHC_3BB0A8C1_0x005B4230 | 0.0% | Pending -SHC_3BB0A8C1_0x005B4234 | 0.0% | Pending SHC_3BB0A8C1_0x005B4238 | 0.0% | Pending -SHC_3BB0A8C1_0x005B423C | 0.0% | Pending -SHC_3BB0A8C1_0x005B4240 | 0.0% | Pending -SHC_3BB0A8C1_0x005B4244 | 0.0% | Pending -SHC_3BB0A8C1_0x005B4248 | 0.0% | Pending SHC_3BB0A8C1_0x005B424C | 0.0% | Pending -SHC_3BB0A8C1_0x005B4250 | 0.0% | Pending -SHC_3BB0A8C1_0x005B4254 | 0.0% | Pending -SHC_3BB0A8C1_0x005B4258 | 0.0% | Pending -SHC_3BB0A8C1_0x005B425C | 0.0% | Pending SHC_3BB0A8C1_0x005B4260 | 0.0% | Pending -SHC_3BB0A8C1_0x005B4264 | 0.0% | Pending -SHC_3BB0A8C1_0x005B4268 | 0.0% | Pending -SHC_3BB0A8C1_0x005B426C | 0.0% | Pending -SHC_3BB0A8C1_0x005B4270 | 0.0% | Pending SHC_3BB0A8C1_0x005B4274 | 0.0% | Pending -SHC_3BB0A8C1_0x005B4278 | 0.0% | Pending -SHC_3BB0A8C1_0x005B427C | 0.0% | Pending -SHC_3BB0A8C1_0x005B4280 | 0.0% | Pending -SHC_3BB0A8C1_0x005B4284 | 0.0% | Pending SHC_3BB0A8C1_0x005B4288 | 0.0% | Pending -SHC_3BB0A8C1_0x005B428C | 0.0% | Pending -SHC_3BB0A8C1_0x005B4290 | 0.0% | Pending -SHC_3BB0A8C1_0x005B4294 | 0.0% | Pending -SHC_3BB0A8C1_0x005B4298 | 0.0% | Pending SHC_3BB0A8C1_0x005B429C | 0.0% | Pending -SHC_3BB0A8C1_0x005B42A0 | 0.0% | Pending -SHC_3BB0A8C1_0x005B42A4 | 0.0% | Pending -SHC_3BB0A8C1_0x005B42A8 | 0.0% | Pending -SHC_3BB0A8C1_0x005B42AC | 0.0% | Pending SHC_3BB0A8C1_0x005B42B0 | 0.0% | Pending -SHC_3BB0A8C1_0x005B42B4 | 0.0% | Pending -SHC_3BB0A8C1_0x005B42B8 | 0.0% | Pending -SHC_3BB0A8C1_0x005B42BC | 0.0% | Pending -SHC_3BB0A8C1_0x005B42C0 | 0.0% | Pending SHC_3BB0A8C1_0x005B42C4 | 0.0% | Pending -SHC_3BB0A8C1_0x005B42C8 | 0.0% | Pending -SHC_3BB0A8C1_0x005B42CC | 0.0% | Pending -SHC_3BB0A8C1_0x005B42D0 | 0.0% | Pending -SHC_3BB0A8C1_0x005B42D4 | 0.0% | Pending SHC_3BB0A8C1_0x005B42D8 | 0.0% | Pending -SHC_3BB0A8C1_0x005B42DC | 0.0% | Pending -SHC_3BB0A8C1_0x005B42E0 | 0.0% | Pending -SHC_3BB0A8C1_0x005B42E4 | 0.0% | Pending -SHC_3BB0A8C1_0x005B42E8 | 0.0% | Pending SHC_3BB0A8C1_0x005B4300 | 0.0% | Pending SHC_3BB0A8C1_0x005B4304 | 0.0% | Pending SHC_3BB0A8C1_0x005B4308 | 0.0% | Pending @@ -41921,6 +41879,8 @@ SHC_3BB0A8C1_0x00ED311C | 0.0% | Pending SHC_3BB0A8C1_0x00ED3120 | 0.0% | Pending SHC_3BB0A8C1_0x00ED3124 | 0.0% | Pending SHC_3BB0A8C1_0x00ED3128 | 0.0% | Pending +SHC_3BB0A8C1_0x00ED3138 | 0.0% | Pending +SHC_3BB0A8C1_0x00ED313C | 0.0% | Pending SHC_3BB0A8C1_0x00ED3144 | 0.0% | Pending SHC_3BB0A8C1_0x00ED3148 | 0.0% | Pending SHC_3BB0A8C1_0x00ED314C | 0.0% | Pending @@ -42982,3 +42942,4 @@ SHC_3BB0A8C1_0x02490916 | 0.0% | Pending SHC_3BB0A8C1_0x02490930 | 0.0% | Pending SHC_3BB0A8C1_0x02490936 | 0.0% | Pending SHC_3BB0A8C1_0x02490954 | 0.0% | Pending +SHC_3BB0A8C1_0x00df3844 | 0.0% | Pending From 87c8ff93f2050e75384ea7aa62297c130ff1465b Mon Sep 17 00:00:00 2001 From: TheRedDaemon <66257843+TheRedDaemon@users.noreply.github.com> Date: Sun, 10 May 2026 00:26:19 +0200 Subject: [PATCH 2/6] [EXPERIMENT/OS] attempt proxing OS CRT calls --- cmake/openshc-sources.txt | 1 + .../Audio/mss/SoundSystem/endSoundStream.cpp | 18 +- .../mss/SoundSystem/stopMusicPlayback.cpp | 10 +- src/OpenSHC/OS.func.hpp | 12 +- src/OpenSHC/OS.hpp | 4 +- src/OpenSHC/OS/OS.cpp | 227 ++++++++++++++++++ 6 files changed, 249 insertions(+), 23 deletions(-) create mode 100644 src/OpenSHC/OS/OS.cpp diff --git a/cmake/openshc-sources.txt b/cmake/openshc-sources.txt index d57a14b3..e52de3f5 100644 --- a/cmake/openshc-sources.txt +++ b/cmake/openshc-sources.txt @@ -1,2 +1,3 @@ src/OpenSHC/Audio/mss/SoundSystem/stopMusicPlayback.cpp src/OpenSHC/Audio/mss/SoundSystem/endSoundStream.cpp +src/OpenSHC/OS/OS.cpp diff --git a/src/OpenSHC/Audio/mss/SoundSystem/endSoundStream.cpp b/src/OpenSHC/Audio/mss/SoundSystem/endSoundStream.cpp index 700e3664..88c9927c 100644 --- a/src/OpenSHC/Audio/mss/SoundSystem/endSoundStream.cpp +++ b/src/OpenSHC/Audio/mss/SoundSystem/endSoundStream.cpp @@ -1,11 +1,9 @@ -#include "OpenSHC/Audio/mss/SoundSystem.hpp" +#include "OpenSHC/Audio/MSS/SoundSystem.hpp" -#include "OpenSHC/Audio/mss/_enums/AILStatus.hpp" -#include "OpenSHC/Audio/mss/_enums/SHC_SoundStream.hpp" +#include "OpenSHC/Audio/MSS/enums/AILStatus.hpp" +#include "OpenSHC/Audio/MSS/enums/SHC_SoundStream.hpp" -#include "Mss32.h" - -#include +#include "OpenSHC/OS.func.hpp" #include "OpenSHC/Globals/DAT_00df3844.hpp" @@ -25,21 +23,21 @@ // this works for multifield checks or assigns // FUNCTION: STRONGHOLDCRUSADER 0x004799A0 -void OpenSHC::Audio::mss::SoundSystem::endSoundStream(SHC_SoundStreamInt sndStreamIndex) +void OpenSHC::Audio::MSS::SoundSystem::endSoundStream(SHC_SoundStreamInt sndStreamIndex) { if (!this->waveOutOpenUnk_0x8) { return; } - if (sndStreamIndex == _enums::SND_STR_MUSIC) { + if (sndStreamIndex == enums::SND_STR_MUSIC) { this->streamActiveUnk_0x20[0] = 0; *DAT_00df3844::ptr = 1; if (this->musicSampleFileHandleUnk_0x174 != -1) { AIL_end_sample(this->musicSampleUnk_0x170); - _close(this->musicSampleFileHandleUnk_0x174); + MACRO_CALL(OS_Func::_ucrt_close)(this->musicSampleFileHandleUnk_0x174); } if (this->musicFileHandle_0x178 != -1) { - _close(this->musicFileHandle_0x178); + MACRO_CALL(OS_Func::_ucrt_close)(this->musicFileHandle_0x178); } this->musicFileHandle_0x178 = -1; this->musicSampleFileHandleUnk_0x174 = -1; diff --git a/src/OpenSHC/Audio/mss/SoundSystem/stopMusicPlayback.cpp b/src/OpenSHC/Audio/mss/SoundSystem/stopMusicPlayback.cpp index 1f6958b4..6ed1df13 100644 --- a/src/OpenSHC/Audio/mss/SoundSystem/stopMusicPlayback.cpp +++ b/src/OpenSHC/Audio/mss/SoundSystem/stopMusicPlayback.cpp @@ -1,12 +1,12 @@ -#include "OpenSHC/Audio/mss/SoundSystem.hpp" +#include "OpenSHC/Audio/MSS/SoundSystem.hpp" -#include "OpenSHC/Audio/mss/SoundSystem.func.hpp" -#include "OpenSHC/Audio/mss/_enums/SHC_SoundStream.hpp" +#include "OpenSHC/Audio/MSS/SoundSystem.func.hpp" +#include "OpenSHC/Audio/MSS/enums/SHC_SoundStream.hpp" // FUNCTION: STRONGHOLDCRUSADER 0x00467810 -void OpenSHC::Audio::mss::SoundSystem::stopMusicPlayback() +void OpenSHC::Audio::MSS::SoundSystem::stopMusicPlayback() { - MACRO_CALL_MEMBER(OpenSHC::Audio::mss::SoundSystem_Func::endSoundStream, this)(_enums::SND_STR_MUSIC); + MACRO_CALL_MEMBER(OpenSHC::Audio::MSS::SoundSystem_Func::endSoundStream, this)(enums::SND_STR_MUSIC); this->mbr_0x154 = 0; this->sec_Section1055_0x3274 = 0; } diff --git a/src/OpenSHC/OS.func.hpp b/src/OpenSHC/OS.func.hpp index 3d2f87ef..1006ded6 100644 --- a/src/OpenSHC/OS.func.hpp +++ b/src/OpenSHC/OS.func.hpp @@ -24,9 +24,9 @@ namespace OS_Func { using OpenSHC::WindowsHelper::Enums::BOOLEnum; using OpenSHC::WindowsHelper::Enums::OpenFlagInt; - MACRO_FUNCTION_RESOLVER(int*(__stdcall*)(void* param_1, uint param_2), REIMPLEMENTED_CRT, - Address::SHC_3BB0A8C1_0x004791B0, &OpenSHC::OS::basic_ofstream_write) - basic_ofstream_write; + // MACRO_FUNCTION_RESOLVER(int*(__stdcall*)(void* param_1, uint param_2), REIMPLEMENTED_CRT, + // Address::SHC_3BB0A8C1_0x004791B0, &OpenSHC::OS::basic_ofstream_write) + // basic_ofstream_write; MACRO_FUNCTION_RESOLVER(BOOLEnum(__cdecl*)(GUID* param_1, GUID* param_2), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x0047C5D0, &OpenSHC::OS::isEqualGUID) @@ -108,9 +108,9 @@ namespace OS_Func { Address::SHC_3BB0A8C1_0x00580B69, &OpenSHC::OS::__wcsicmp) __wcsicmp; - MACRO_FUNCTION_RESOLVER( - void(__cdecl*)(void* _Memory), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x00580DC1, &OpenSHC::OS::_free) - _free; + // MACRO_FUNCTION_RESOLVER( + // void(__cdecl*)(void* _Memory), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x00580DC1, &OpenSHC::OS::_free) + //_free; MACRO_FUNCTION_RESOLVER(errno_t(__cdecl*)(void* _Dst, rsize_t _DstSize, void* _Src, rsize_t _MaxCount), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x00580DC6, &OpenSHC::OS::_memcpy_s) diff --git a/src/OpenSHC/OS.hpp b/src/OpenSHC/OS.hpp index 1cb5919b..60711210 100644 --- a/src/OpenSHC/OS.hpp +++ b/src/OpenSHC/OS.hpp @@ -23,7 +23,7 @@ namespace OS { using OpenSHC::WindowsHelper::Enums::BOOLEnum; using OpenSHC::WindowsHelper::Enums::OpenFlagInt; - int* __stdcall basic_ofstream_write(void* param_1, uint param_2); + // int* __stdcall basic_ofstream_write(void* param_1, uint param_2); BOOLEnum __cdecl isEqualGUID(GUID* param_1, GUID* param_2); @@ -65,7 +65,7 @@ namespace OS { int __cdecl __wcsicmp(wchar_t* _Str1, wchar_t* _Str2); - void __cdecl _free(void* _Memory); + // void __cdecl _free(void* _Memory); errno_t __cdecl _memcpy_s(void* _Dst, rsize_t _DstSize, void* _Src, rsize_t _MaxCount); diff --git a/src/OpenSHC/OS/OS.cpp b/src/OpenSHC/OS/OS.cpp new file mode 100644 index 00000000..a2efcb74 --- /dev/null +++ b/src/OpenSHC/OS/OS.cpp @@ -0,0 +1,227 @@ +// disable deprecation warnings, since we use the old calls on purpose +#pragma warning(disable : 4996) + +#include "OpenSHC/OS.hpp" + +#include "float.h" +#include "io.h" + +// NOTE: Activating them in DLL mode currently results in heap corruption + +// this one is hard to pin down, maybe an STL this-function, or a special buffer? +// STUB: STRONGHOLDCRUSADER 0x004791B0 +// int* __stdcall basic_ofstream_write(void* param_1, uint param_2) {TODO} + +// STUB: STRONGHOLDCRUSADER 0x0047C5D0 +OpenSHC::OS::BOOLEnum OpenSHC::OS::isEqualGUID(GUID* param_1, GUID* param_2) +{ + return static_cast(IsEqualGUID(*param_1, *param_2)); +} + +// STUB: STRONGHOLDCRUSADER 0x0057ECF1 +int OpenSHC::OS::__isnan(double _X) { return _isnan(_X); } + +// STUB: STRONGHOLDCRUSADER 0x0057ED20 +// Used implicitly when converting floating-point → integer on x86 +// int __cdecl __ftol2(float10 param); + +// Used implicitly by CRT math pipeline (atan) +// STUB: STRONGHOLDCRUSADER 0x0057EE10 +// void __cdecl math_atan_FUN_0057ee10(float10 param_1); + +// Used implicitly by CRT math pipeline (atan variant) +// STUB: STRONGHOLDCRUSADER 0x0057EE68 +// float10 __cdecl math_atan_FUN_0057ee68(float10 floatIn, uint eaxIn, int param_3, int param_4); + +// Used implicitly by CRT math pipeline (sqrt) +// STUB: STRONGHOLDCRUSADER 0x0057EEF0 +// float10 __cdecl math_sqrt_FUN_0057eef0(float10 param_1); + +// Used implicitly by CRT math pipeline (sqrt variant) +// STUB: STRONGHOLDCRUSADER 0x0057EF0D +// float10 __cdecl math_sqrt_FUN_0057ef0d(int param_1, uint param_2, float10 param_3); + +// Used implicitly by CRT math pipeline (tan) +// STUB: STRONGHOLDCRUSADER 0x0057EFF0 +// void __cdecl math_tan_1_FUN_0057eff0(float10 param_1); + +// Used implicitly by CRT math ? +// STUB: STRONGHOLDCRUSADER 0x0057F048 +// float10 __cdecl math_FUN_0057f048(int param_1, int param_2); + +// Possibly compiler-generated or CRT math thunk for cosine (sin/cos pipeline variant) +// STUB: STRONGHOLDCRUSADER 0x0057F120 +// float10 __fastcall math_cos(float10 param_1); + +// Possibly compiler-generated or CRT math thunk for sine (sin/cos pipeline variant) +// STUB: STRONGHOLDCRUSADER 0x0057F250 +// float10 __fastcall math_sin(float10 param_1); + +// Very likely just default function call, using time64_t and localtime64 behind +// STUB: STRONGHOLDCRUSADER 0x0057F5FE +tm* OpenSHC::OS::_localtime(time_t* _Time) { return localtime(_Time); } + +// STUB: STRONGHOLDCRUSADER 0x0057F622 +__time64_t OpenSHC::OS::__time64(__time64_t* _Time) { return _time64(_Time); } + +// STUB: STRONGHOLDCRUSADER 0x0057F660 +void* OpenSHC::OS::_memset(void* _Dst, int _Val, size_t _Size) { return memset(_Dst, _Val, _Size); } + +// MACRO_FUNCTION_RESOLVER does not support variadic functions +// STUB: STRONGHOLDCRUSADER 0x0057F6DA +int OpenSHC::OS::_sprintf(char* _Dest, char* _Format, ...) +{ + // needed for proxy + va_list args; + va_start(args, _Format); + int result = vsprintf(_Dest, _Format, args); + va_end(args); + return result; +} + +// STUB: STRONGHOLDCRUSADER 0x0057F8EE +int OpenSHC::OS::__stricmp(char* _Str1, char* _Str2) { return _stricmp(_Str1, _Str2); } + +// STUB: STRONGHOLDCRUSADER 0x0057FA62 +int OpenSHC::OS::_atexit(void* param_1) { return atexit(reinterpret_cast(param_1)); } + +// STUB: STRONGHOLDCRUSADER 0x0057FA74 +// This seems to be the games main free function +void __cdecl OpenSHC::OS::_free(void* _Memory) { free(_Memory); } + +// Used implicitly in character conversion pipeline (_tolower). Save if global locale never set. +// STUB: STRONGHOLDCRUSADER 0x0057FC19 +// int __cdecl _tolower(int _C); + +// STUB: STRONGHOLDCRUSADER 0x0057FCB2 +int OpenSHC::OS::_fclose(FILE* _File) { return fclose(_File); } + +// STUB: STRONGHOLDCRUSADER 0x0057FFCA +void OpenSHC::OS::_fread(void* dstBuffer, size_t elSize, size_t count, FILE* file) +{ + fread(dstBuffer, elSize, count, file); +} + +// STUB: STRONGHOLDCRUSADER 0x00580034 +void* OpenSHC::OS::_malloc(size_t _Size) { return malloc(_Size); } + +// STUB: STRONGHOLDCRUSADER 0x0058028F +long OpenSHC::OS::_ftell(FILE* _File) { return ftell(_File); } + +// STUB: STRONGHOLDCRUSADER 0x00580384 +int __cdecl OpenSHC::OS::_fseek(FILE* _File, long _Offset, OpenSHC::OS::FilePtrMoveMethodInt _Origin) +{ + return fseek(_File, _Offset, _Origin); +} + +// STUB: STRONGHOLDCRUSADER 0x005804CD +FILE* OpenSHC::OS::_fopen(char* _Filename, char* _Mode) { return fopen(_Filename, _Mode); } + +// STUB: STRONGHOLDCRUSADER 0x00580577 +int OpenSHC::OS::__vswprintf(wchar_t* _Dest, wchar_t* _Format, va_list _Args) +{ + return _vswprintf(_Dest, _Format, _Args); +} + +// STUB: STRONGHOLDCRUSADER 0x00580735 +wint_t OpenSHC::OS::_fgetwc(FILE* _File) { return fgetwc(_File); } + +// STUB: STRONGHOLDCRUSADER 0x0058099B +size_t OpenSHC::OS::_fwrite(void* _Str, size_t _Size, size_t _Count, FILE* _File) +{ + return fwrite(_Str, _Size, _Count, _File); +} + +// STUB: STRONGHOLDCRUSADER 0x00580A1D +wchar_t* OpenSHC::OS::_wcsncpy(wchar_t* _Dest, wchar_t* _Source, size_t _Count) +{ + return wcsncpy(_Dest, _Source, _Count); +} + +// STUB: STRONGHOLDCRUSADER 0x00580B69 +int OpenSHC::OS::__wcsicmp(wchar_t* _Str1, wchar_t* _Str2) { return _wcsicmp(_Str1, _Str2); } + +// Only jumps to _free +// STUB: STRONGHOLDCRUSADER 0x00580DC1 +// void __cdecl OpenSHC::OS::_free(void* _Memory) { free(_Memory); } + +// STUB: STRONGHOLDCRUSADER 0x00580DC6 +errno_t OpenSHC::OS::_memcpy_s(void* _Dst, rsize_t _DstSize, void* _Src, rsize_t _MaxCount) +{ + return memcpy_s(_Dst, _DstSize, _Src, _MaxCount); +} + +// Only jumps to _free +// STUB: STRONGHOLDCRUSADER 0x00580E9C +// void __cdecl OpenSHC::OS::_free(void* _Memory) { free(_Memory); } + +// STUB: STRONGHOLDCRUSADER 0x00580F38 +int OpenSHC::OS::_ucrt_close(int fileDescriptor) { return _close(fileDescriptor); } + +// STUB: STRONGHOLDCRUSADER 0x005815C6 +int OpenSHC::OS::_ucrt_read(int fileDescriptor, void* destination, size_t size) +{ + return _read(fileDescriptor, destination, size); +} + +// STUB: STRONGHOLDCRUSADER 0x005816C3 +int OpenSHC::OS::_ucrt_open(char* _Filename, OpenFlagInt _OpenFlag, int _PMode) +{ + return _open(_Filename, _OpenFlag, _PMode); +} + +// STUB: STRONGHOLDCRUSADER 0x005816FB +int OpenSHC::OS::_rand() { return rand(); } + +// STUB: STRONGHOLDCRUSADER 0x005818EB +char* OpenSHC::OS::__strlwr(char* string) { return _strlwr(string); } + +// STUB: STRONGHOLDCRUSADER 0x00581F6F +undefined4 OpenSHC::OS::_ucrt_write(int fileDescriptor, void* src, uint size) +{ + return _write(fileDescriptor, src, size); +} + +// STUB: STRONGHOLDCRUSADER 0x00582050 +void* OpenSHC::OS::_memcpy(void* _Dst, void* _Src, size_t _Size) { return memcpy(_Dst, _Src, _Size); } + +// Used implicitly in character conversion pipeline (_toupper) Save if global locale never set. +// STUB: STRONGHOLDCRUSADER 0x005824CD +// int __cdecl _toupper(int _C); + +// STUB: STRONGHOLDCRUSADER 0x0058277E +int OpenSHC::OS::_ucrt_lseek(int fileDescriptor, long lDistanceToMove, FilePtrMoveMethodInt moveMethod) +{ + return _lseek(fileDescriptor, lDistanceToMove, moveMethod); +} + +// Compiler-emitted ABI helper (__alldiv) +// STUB: STRONGHOLDCRUSADER 0x00582C30 +// longlong __stdcall __alldiv(long, long, long, long); + +// Compiler-emitted ABI helper (__allmul) +// STUB: STRONGHOLDCRUSADER 0x00582CE0 +// ulonglong __stdcall __allmul(ulong, ulong, ulong, ulong); + +// Compiler-emitted stack probe helper (__alloca_probe) +// STUB: STRONGHOLDCRUSADER 0x005834A0 +// undefined4 __stdcall __alloca_probe(); + +// STUB: STRONGHOLDCRUSADER 0x005835BB +int OpenSHC::OS::__strnicmp(char* _Str1, char* _Str2, size_t _MaxCount) { return _strnicmp(_Str1, _Str2, _MaxCount); } + +// STUB: STRONGHOLDCRUSADER 0x00583D55 +void OpenSHC::OS::_exit(int _Code) { exit(_Code); } + +// Unknown math function? +// STUB: STRONGHOLDCRUSADER 0x00588628 +// uint OpenSHC::OS::math_FUN_00588628(undefined4 param_1, uint param_2) { TODO }; + +// Likely some internal math call? +// STUB: STRONGHOLDCRUSADER 0x00588628 +// float10 __fastcall OpenSHC::OS::math_FUN_0058864b(float10 param_1, char* param_2, int param_3, undefined4 param_4, +// undefined4 param_5, undefined4 param_6, undefined4 param_7); + +// Likely some internal math call? +// STUB: STRONGHOLDCRUSADER 0x00588628 +// float10 __fastcall math_FUN_005887ae(); From 5126ccd379beaaa7ba3764048bec101d404ba4a3 Mon Sep 17 00:00:00 2001 From: TheRedDaemon <66257843+TheRedDaemon@users.noreply.github.com> Date: Wed, 13 May 2026 22:41:56 +0200 Subject: [PATCH 3/6] [EXPERIMENTAL/MSS] rework file for current main --- cmake/openshc-sources.txt | 3 - src/OpenSHC/Audio/mss/SoundSystem.func.hpp | 2 +- .../Audio/mss/SoundSystem/endSoundStream.cpp | 76 ++--- .../mss/SoundSystem/stopMusicPlayback.cpp | 20 +- src/OpenSHC/OS.func.hpp | 10 +- src/OpenSHC/OS.hpp | 2 +- src/OpenSHC/OS/OS.cpp | 281 +++++++----------- status/addresses-SHC-3BB0A8C1.txt | 1 + 8 files changed, 165 insertions(+), 230 deletions(-) diff --git a/cmake/openshc-sources.txt b/cmake/openshc-sources.txt index e52de3f5..e69de29b 100644 --- a/cmake/openshc-sources.txt +++ b/cmake/openshc-sources.txt @@ -1,3 +0,0 @@ -src/OpenSHC/Audio/mss/SoundSystem/stopMusicPlayback.cpp -src/OpenSHC/Audio/mss/SoundSystem/endSoundStream.cpp -src/OpenSHC/OS/OS.cpp diff --git a/src/OpenSHC/Audio/mss/SoundSystem.func.hpp b/src/OpenSHC/Audio/mss/SoundSystem.func.hpp index 88e1f6a2..cfb77d93 100644 --- a/src/OpenSHC/Audio/mss/SoundSystem.func.hpp +++ b/src/OpenSHC/Audio/mss/SoundSystem.func.hpp @@ -22,7 +22,7 @@ namespace Audio { meth_0x424700; MACRO_FUNCTION_RESOLVER( - void (SoundSystem::*)(), false, Address::SHC_3BB0A8C1_0x00467810, &SoundSystem::stopMusicPlayback) + void (SoundSystem::*)(), true, Address::SHC_3BB0A8C1_0x00467810, &SoundSystem::stopMusicPlayback) stopMusicPlayback; MACRO_FUNCTION_RESOLVER( diff --git a/src/OpenSHC/Audio/mss/SoundSystem/endSoundStream.cpp b/src/OpenSHC/Audio/mss/SoundSystem/endSoundStream.cpp index 88c9927c..965bdf26 100644 --- a/src/OpenSHC/Audio/mss/SoundSystem/endSoundStream.cpp +++ b/src/OpenSHC/Audio/mss/SoundSystem/endSoundStream.cpp @@ -9,8 +9,6 @@ // TODO: // - DAT_00df3844 did not exist before and is therefore wrongly sorted into the status file -// - the mss types need to use the mss32 header, not the Ghidra exported one (how to handle this?) -// - "_close" is treaded like an OFFSET function and reduces the score of reccmp // - "UnkSoundFlagsAndLoopCount" plays not nice with any number-like operation, the more likely thing therefore are // either a union, which allows to access the different parts separately, but this would likely compile to WORD // operations, or a bitfield, maybe like this: @@ -22,41 +20,49 @@ // In a test in the current file it compiled to "& 0x80000000" properly when using the specific field, but no idea if // this works for multifield checks or assigns -// FUNCTION: STRONGHOLDCRUSADER 0x004799A0 -void OpenSHC::Audio::MSS::SoundSystem::endSoundStream(SHC_SoundStreamInt sndStreamIndex) -{ - if (!this->waveOutOpenUnk_0x8) { - return; - } +namespace OpenSHC { +namespace Audio { + namespace MSS { - if (sndStreamIndex == enums::SND_STR_MUSIC) { - this->streamActiveUnk_0x20[0] = 0; - *DAT_00df3844::ptr = 1; - if (this->musicSampleFileHandleUnk_0x174 != -1) { - AIL_end_sample(this->musicSampleUnk_0x170); - MACRO_CALL(OS_Func::_ucrt_close)(this->musicSampleFileHandleUnk_0x174); - } - if (this->musicFileHandle_0x178 != -1) { - MACRO_CALL(OS_Func::_ucrt_close)(this->musicFileHandle_0x178); - } - this->musicFileHandle_0x178 = -1; - this->musicSampleFileHandleUnk_0x174 = -1; - this->mbr_0x188 = 1; - *DAT_00df3844::ptr = 0; - this->sec_Section1055_0x3274 = 0; - return; - } + // FUNCTION: STRONGHOLDCRUSADER 0x004799A0 + void SoundSystem::endSoundStream(SHC_SoundStreamInt sndStreamIndex) + { + if (!this->waveOutOpenUnk_0x8) { + return; + } - if (!this->streamActiveUnk_0x20[sndStreamIndex]) { - return; - } + if (sndStreamIndex == enums::SND_STR_MUSIC) { + this->streamActiveUnk_0x20[0] = 0; + *DAT_00df3844::ptr = 1; + if (this->musicSampleFileHandleUnk_0x174 != -1) { + AIL_end_sample(this->musicSampleUnk_0x170); + MACRO_CALL(OS_Func::_ucrt_close)(this->musicSampleFileHandleUnk_0x174); + } + if (this->musicFileHandle_0x178 != -1) { + MACRO_CALL(OS_Func::_ucrt_close)(this->musicFileHandle_0x178); + } + this->musicFileHandle_0x178 = -1; + this->musicSampleFileHandleUnk_0x174 = -1; + this->mbr_0x188 = 1; + *DAT_00df3844::ptr = 0; + this->sec_Section1055_0x3274 = 0; + return; + } + + if (!this->streamActiveUnk_0x20[sndStreamIndex]) { + return; + } + + // flag seems to indicate an "uninterruptable" stream; if it is set, a playing stream can not be ended + if ((*reinterpret_cast(&this->streamFlagsUnkAndLoopCount_0x34[sndStreamIndex]) & 0x80000000) + && (AIL_stream_status(this->stream_0xc[sndStreamIndex]) == SMP_PLAYING)) { + return; + } + AIL_close_stream(this->stream_0xc[sndStreamIndex]); + this->streamActiveUnk_0x20[sndStreamIndex] = 0; + this->stream_0xc[sndStreamIndex] = 0x0; + } - // flag seems to indicate an "uninterruptable" stream; if it is set, a playing stream can not be ended - if ((*reinterpret_cast(&this->streamFlagsUnkAndLoopCount_0x34[sndStreamIndex]) & 0x80000000) - && (AIL_stream_status(this->stream_0xc[sndStreamIndex]) == SMP_PLAYING)) { - return; } - AIL_close_stream(this->stream_0xc[sndStreamIndex]); - this->streamActiveUnk_0x20[sndStreamIndex] = 0; - this->stream_0xc[sndStreamIndex] = 0x0; +} } diff --git a/src/OpenSHC/Audio/mss/SoundSystem/stopMusicPlayback.cpp b/src/OpenSHC/Audio/mss/SoundSystem/stopMusicPlayback.cpp index 6ed1df13..22883124 100644 --- a/src/OpenSHC/Audio/mss/SoundSystem/stopMusicPlayback.cpp +++ b/src/OpenSHC/Audio/mss/SoundSystem/stopMusicPlayback.cpp @@ -3,10 +3,18 @@ #include "OpenSHC/Audio/MSS/SoundSystem.func.hpp" #include "OpenSHC/Audio/MSS/enums/SHC_SoundStream.hpp" -// FUNCTION: STRONGHOLDCRUSADER 0x00467810 -void OpenSHC::Audio::MSS::SoundSystem::stopMusicPlayback() -{ - MACRO_CALL_MEMBER(OpenSHC::Audio::MSS::SoundSystem_Func::endSoundStream, this)(enums::SND_STR_MUSIC); - this->mbr_0x154 = 0; - this->sec_Section1055_0x3274 = 0; +namespace OpenSHC { +namespace Audio { + namespace MSS { + + // FUNCTION: STRONGHOLDCRUSADER 0x00467810 + void SoundSystem::stopMusicPlayback() + { + MACRO_CALL_MEMBER(OpenSHC::Audio::MSS::SoundSystem_Func::endSoundStream, this)(enums::SND_STR_MUSIC); + this->mbr_0x154 = 0; + this->sec_Section1055_0x3274 = 0; + } + + } +} } diff --git a/src/OpenSHC/OS.func.hpp b/src/OpenSHC/OS.func.hpp index 1006ded6..ae095c6a 100644 --- a/src/OpenSHC/OS.func.hpp +++ b/src/OpenSHC/OS.func.hpp @@ -24,14 +24,18 @@ namespace OS_Func { using OpenSHC::WindowsHelper::Enums::BOOLEnum; using OpenSHC::WindowsHelper::Enums::OpenFlagInt; - // MACRO_FUNCTION_RESOLVER(int*(__stdcall*)(void* param_1, uint param_2), REIMPLEMENTED_CRT, - // Address::SHC_3BB0A8C1_0x004791B0, &OpenSHC::OS::basic_ofstream_write) - // basic_ofstream_write; + MACRO_FUNCTION_RESOLVER(int*(__stdcall*)(void* param_1, uint param_2), REIMPLEMENTED_CRT, + Address::SHC_3BB0A8C1_0x004791B0, &OpenSHC::OS::basic_ofstream_write) + basic_ofstream_write; MACRO_FUNCTION_RESOLVER(BOOLEnum(__cdecl*)(GUID* param_1, GUID* param_2), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x0047C5D0, &OpenSHC::OS::isEqualGUID) isEqualGUID; + MACRO_FUNCTION_RESOLVER( + int(__cdecl*)(double _X), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x0057ECF1, &OpenSHC::OS::__isnan) + __isnan; + MACRO_FUNCTION_RESOLVER( tm*(__cdecl*)(time_t* _Time), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x0057F5FE, &OpenSHC::OS::_localtime) _localtime; diff --git a/src/OpenSHC/OS.hpp b/src/OpenSHC/OS.hpp index 60711210..2c628c0d 100644 --- a/src/OpenSHC/OS.hpp +++ b/src/OpenSHC/OS.hpp @@ -23,7 +23,7 @@ namespace OS { using OpenSHC::WindowsHelper::Enums::BOOLEnum; using OpenSHC::WindowsHelper::Enums::OpenFlagInt; - // int* __stdcall basic_ofstream_write(void* param_1, uint param_2); + int* __stdcall basic_ofstream_write(void* param_1, uint param_2); BOOLEnum __cdecl isEqualGUID(GUID* param_1, GUID* param_2); diff --git a/src/OpenSHC/OS/OS.cpp b/src/OpenSHC/OS/OS.cpp index a2efcb74..02755fb3 100644 --- a/src/OpenSHC/OS/OS.cpp +++ b/src/OpenSHC/OS/OS.cpp @@ -8,220 +8,139 @@ // NOTE: Activating them in DLL mode currently results in heap corruption -// this one is hard to pin down, maybe an STL this-function, or a special buffer? -// STUB: STRONGHOLDCRUSADER 0x004791B0 -// int* __stdcall basic_ofstream_write(void* param_1, uint param_2) {TODO} - -// STUB: STRONGHOLDCRUSADER 0x0047C5D0 -OpenSHC::OS::BOOLEnum OpenSHC::OS::isEqualGUID(GUID* param_1, GUID* param_2) -{ - return static_cast(IsEqualGUID(*param_1, *param_2)); -} +namespace OpenSHC { +namespace OS { -// STUB: STRONGHOLDCRUSADER 0x0057ECF1 -int OpenSHC::OS::__isnan(double _X) { return _isnan(_X); } - -// STUB: STRONGHOLDCRUSADER 0x0057ED20 -// Used implicitly when converting floating-point → integer on x86 -// int __cdecl __ftol2(float10 param); - -// Used implicitly by CRT math pipeline (atan) -// STUB: STRONGHOLDCRUSADER 0x0057EE10 -// void __cdecl math_atan_FUN_0057ee10(float10 param_1); - -// Used implicitly by CRT math pipeline (atan variant) -// STUB: STRONGHOLDCRUSADER 0x0057EE68 -// float10 __cdecl math_atan_FUN_0057ee68(float10 floatIn, uint eaxIn, int param_3, int param_4); - -// Used implicitly by CRT math pipeline (sqrt) -// STUB: STRONGHOLDCRUSADER 0x0057EEF0 -// float10 __cdecl math_sqrt_FUN_0057eef0(float10 param_1); - -// Used implicitly by CRT math pipeline (sqrt variant) -// STUB: STRONGHOLDCRUSADER 0x0057EF0D -// float10 __cdecl math_sqrt_FUN_0057ef0d(int param_1, uint param_2, float10 param_3); - -// Used implicitly by CRT math pipeline (tan) -// STUB: STRONGHOLDCRUSADER 0x0057EFF0 -// void __cdecl math_tan_1_FUN_0057eff0(float10 param_1); - -// Used implicitly by CRT math ? -// STUB: STRONGHOLDCRUSADER 0x0057F048 -// float10 __cdecl math_FUN_0057f048(int param_1, int param_2); - -// Possibly compiler-generated or CRT math thunk for cosine (sin/cos pipeline variant) -// STUB: STRONGHOLDCRUSADER 0x0057F120 -// float10 __fastcall math_cos(float10 param_1); - -// Possibly compiler-generated or CRT math thunk for sine (sin/cos pipeline variant) -// STUB: STRONGHOLDCRUSADER 0x0057F250 -// float10 __fastcall math_sin(float10 param_1); - -// Very likely just default function call, using time64_t and localtime64 behind -// STUB: STRONGHOLDCRUSADER 0x0057F5FE -tm* OpenSHC::OS::_localtime(time_t* _Time) { return localtime(_Time); } - -// STUB: STRONGHOLDCRUSADER 0x0057F622 -__time64_t OpenSHC::OS::__time64(__time64_t* _Time) { return _time64(_Time); } - -// STUB: STRONGHOLDCRUSADER 0x0057F660 -void* OpenSHC::OS::_memset(void* _Dst, int _Val, size_t _Size) { return memset(_Dst, _Val, _Size); } - -// MACRO_FUNCTION_RESOLVER does not support variadic functions -// STUB: STRONGHOLDCRUSADER 0x0057F6DA -int OpenSHC::OS::_sprintf(char* _Dest, char* _Format, ...) -{ - // needed for proxy - va_list args; - va_start(args, _Format); - int result = vsprintf(_Dest, _Format, args); - va_end(args); - return result; -} + // STUB: STRONGHOLDCRUSADER 0x0047C5D0 + BOOLEnum isEqualGUID(GUID* param_1, GUID* param_2) + { + return static_cast(IsEqualGUID(*param_1, *param_2)); + } -// STUB: STRONGHOLDCRUSADER 0x0057F8EE -int OpenSHC::OS::__stricmp(char* _Str1, char* _Str2) { return _stricmp(_Str1, _Str2); } + // STUB: STRONGHOLDCRUSADER 0x0057ECF1 + int __isnan(double _X) { return _isnan(_X); } -// STUB: STRONGHOLDCRUSADER 0x0057FA62 -int OpenSHC::OS::_atexit(void* param_1) { return atexit(reinterpret_cast(param_1)); } + // Very likely just default function call, using time64_t and localtime64 behind + // STUB: STRONGHOLDCRUSADER 0x0057F5FE + tm* _localtime(time_t* _Time) { return localtime(_Time); } -// STUB: STRONGHOLDCRUSADER 0x0057FA74 -// This seems to be the games main free function -void __cdecl OpenSHC::OS::_free(void* _Memory) { free(_Memory); } + // STUB: STRONGHOLDCRUSADER 0x0057F622 + __time64_t __time64(__time64_t* _Time) { return _time64(_Time); } -// Used implicitly in character conversion pipeline (_tolower). Save if global locale never set. -// STUB: STRONGHOLDCRUSADER 0x0057FC19 -// int __cdecl _tolower(int _C); + // STUB: STRONGHOLDCRUSADER 0x0057F660 + void* _memset(void* _Dst, int _Val, size_t _Size) { return memset(_Dst, _Val, _Size); } -// STUB: STRONGHOLDCRUSADER 0x0057FCB2 -int OpenSHC::OS::_fclose(FILE* _File) { return fclose(_File); } + // STUB: STRONGHOLDCRUSADER 0x0057F6DA + int _sprintf(char* _Dest, char* _Format, ...) + { + // needed for proxy + va_list args; + va_start(args, _Format); + int result = vsprintf(_Dest, _Format, args); + va_end(args); + return result; + } -// STUB: STRONGHOLDCRUSADER 0x0057FFCA -void OpenSHC::OS::_fread(void* dstBuffer, size_t elSize, size_t count, FILE* file) -{ - fread(dstBuffer, elSize, count, file); -} + // STUB: STRONGHOLDCRUSADER 0x0057F8EE + int __stricmp(char* _Str1, char* _Str2) { return _stricmp(_Str1, _Str2); } -// STUB: STRONGHOLDCRUSADER 0x00580034 -void* OpenSHC::OS::_malloc(size_t _Size) { return malloc(_Size); } + // STUB: STRONGHOLDCRUSADER 0x0057FA62 + int _atexit(void* param_1) { return atexit(reinterpret_cast(param_1)); } -// STUB: STRONGHOLDCRUSADER 0x0058028F -long OpenSHC::OS::_ftell(FILE* _File) { return ftell(_File); } + // This seems to be the games main free function + // STUB: STRONGHOLDCRUSADER 0x0057FA74 + void __cdecl _free(void* _Memory) { free(_Memory); } -// STUB: STRONGHOLDCRUSADER 0x00580384 -int __cdecl OpenSHC::OS::_fseek(FILE* _File, long _Offset, OpenSHC::OS::FilePtrMoveMethodInt _Origin) -{ - return fseek(_File, _Offset, _Origin); -} + // Used implicitly in character conversion pipeline (_tolower). Save if global locale never set. + // STUB: STRONGHOLDCRUSADER 0x0057FC19 + // int __cdecl _tolower(int _C); -// STUB: STRONGHOLDCRUSADER 0x005804CD -FILE* OpenSHC::OS::_fopen(char* _Filename, char* _Mode) { return fopen(_Filename, _Mode); } + // STUB: STRONGHOLDCRUSADER 0x0057FCB2 + int _fclose(FILE* _File) { return fclose(_File); } -// STUB: STRONGHOLDCRUSADER 0x00580577 -int OpenSHC::OS::__vswprintf(wchar_t* _Dest, wchar_t* _Format, va_list _Args) -{ - return _vswprintf(_Dest, _Format, _Args); -} + // STUB: STRONGHOLDCRUSADER 0x0057FFCA + void _fread(void* dstBuffer, size_t elSize, size_t count, FILE* file) { fread(dstBuffer, elSize, count, file); } -// STUB: STRONGHOLDCRUSADER 0x00580735 -wint_t OpenSHC::OS::_fgetwc(FILE* _File) { return fgetwc(_File); } + // STUB: STRONGHOLDCRUSADER 0x00580034 + void* _malloc(size_t _Size) { return malloc(_Size); } -// STUB: STRONGHOLDCRUSADER 0x0058099B -size_t OpenSHC::OS::_fwrite(void* _Str, size_t _Size, size_t _Count, FILE* _File) -{ - return fwrite(_Str, _Size, _Count, _File); -} + // STUB: STRONGHOLDCRUSADER 0x0058028F + long _ftell(FILE* _File) { return ftell(_File); } -// STUB: STRONGHOLDCRUSADER 0x00580A1D -wchar_t* OpenSHC::OS::_wcsncpy(wchar_t* _Dest, wchar_t* _Source, size_t _Count) -{ - return wcsncpy(_Dest, _Source, _Count); -} + // STUB: STRONGHOLDCRUSADER 0x00580384 + int __cdecl _fseek(FILE* _File, long _Offset, DWORD _Origin) { return fseek(_File, _Offset, _Origin); } -// STUB: STRONGHOLDCRUSADER 0x00580B69 -int OpenSHC::OS::__wcsicmp(wchar_t* _Str1, wchar_t* _Str2) { return _wcsicmp(_Str1, _Str2); } + // STUB: STRONGHOLDCRUSADER 0x005804CD + FILE* _fopen(char* _Filename, char* _Mode) { return fopen(_Filename, _Mode); } -// Only jumps to _free -// STUB: STRONGHOLDCRUSADER 0x00580DC1 -// void __cdecl OpenSHC::OS::_free(void* _Memory) { free(_Memory); } + // STUB: STRONGHOLDCRUSADER 0x00580577 + int __vswprintf(wchar_t* _Dest, wchar_t* _Format, va_list _Args) { return _vswprintf(_Dest, _Format, _Args); } -// STUB: STRONGHOLDCRUSADER 0x00580DC6 -errno_t OpenSHC::OS::_memcpy_s(void* _Dst, rsize_t _DstSize, void* _Src, rsize_t _MaxCount) -{ - return memcpy_s(_Dst, _DstSize, _Src, _MaxCount); -} + // STUB: STRONGHOLDCRUSADER 0x00580735 + wint_t _fgetwc(FILE* _File) { return fgetwc(_File); } -// Only jumps to _free -// STUB: STRONGHOLDCRUSADER 0x00580E9C -// void __cdecl OpenSHC::OS::_free(void* _Memory) { free(_Memory); } + // STUB: STRONGHOLDCRUSADER 0x0058099B + size_t _fwrite(void* _Str, size_t _Size, size_t _Count, FILE* _File) { return fwrite(_Str, _Size, _Count, _File); } -// STUB: STRONGHOLDCRUSADER 0x00580F38 -int OpenSHC::OS::_ucrt_close(int fileDescriptor) { return _close(fileDescriptor); } + // STUB: STRONGHOLDCRUSADER 0x00580A1D + wchar_t* _wcsncpy(wchar_t* _Dest, wchar_t* _Source, size_t _Count) { return wcsncpy(_Dest, _Source, _Count); } -// STUB: STRONGHOLDCRUSADER 0x005815C6 -int OpenSHC::OS::_ucrt_read(int fileDescriptor, void* destination, size_t size) -{ - return _read(fileDescriptor, destination, size); -} + // STUB: STRONGHOLDCRUSADER 0x00580B69 + int __wcsicmp(wchar_t* _Str1, wchar_t* _Str2) { return _wcsicmp(_Str1, _Str2); } -// STUB: STRONGHOLDCRUSADER 0x005816C3 -int OpenSHC::OS::_ucrt_open(char* _Filename, OpenFlagInt _OpenFlag, int _PMode) -{ - return _open(_Filename, _OpenFlag, _PMode); -} + // Only jumps to _free + // STUB: STRONGHOLDCRUSADER 0x00580DC1 + // void __cdecl _free(void* _Memory) { free(_Memory); } -// STUB: STRONGHOLDCRUSADER 0x005816FB -int OpenSHC::OS::_rand() { return rand(); } + // STUB: STRONGHOLDCRUSADER 0x00580DC6 + errno_t _memcpy_s(void* _Dst, rsize_t _DstSize, void* _Src, rsize_t _MaxCount) + { + return memcpy_s(_Dst, _DstSize, _Src, _MaxCount); + } -// STUB: STRONGHOLDCRUSADER 0x005818EB -char* OpenSHC::OS::__strlwr(char* string) { return _strlwr(string); } + // Only jumps to _free + // STUB: STRONGHOLDCRUSADER 0x00580E9C + // void __cdecl _free(void* _Memory) { free(_Memory); } -// STUB: STRONGHOLDCRUSADER 0x00581F6F -undefined4 OpenSHC::OS::_ucrt_write(int fileDescriptor, void* src, uint size) -{ - return _write(fileDescriptor, src, size); -} + // STUB: STRONGHOLDCRUSADER 0x00580F38 + int _ucrt_close(int fileDescriptor) { return _close(fileDescriptor); } -// STUB: STRONGHOLDCRUSADER 0x00582050 -void* OpenSHC::OS::_memcpy(void* _Dst, void* _Src, size_t _Size) { return memcpy(_Dst, _Src, _Size); } + // STUB: STRONGHOLDCRUSADER 0x005815C6 + int _ucrt_read(int fileDescriptor, void* destination, size_t size) + { + return _read(fileDescriptor, destination, size); + } -// Used implicitly in character conversion pipeline (_toupper) Save if global locale never set. -// STUB: STRONGHOLDCRUSADER 0x005824CD -// int __cdecl _toupper(int _C); + // STUB: STRONGHOLDCRUSADER 0x005816C3 + int _ucrt_open(char* _Filename, OpenFlagInt _OpenFlag, int _PMode) { return _open(_Filename, _OpenFlag, _PMode); } -// STUB: STRONGHOLDCRUSADER 0x0058277E -int OpenSHC::OS::_ucrt_lseek(int fileDescriptor, long lDistanceToMove, FilePtrMoveMethodInt moveMethod) -{ - return _lseek(fileDescriptor, lDistanceToMove, moveMethod); -} + // STUB: STRONGHOLDCRUSADER 0x005816FB + int _rand() { return rand(); } -// Compiler-emitted ABI helper (__alldiv) -// STUB: STRONGHOLDCRUSADER 0x00582C30 -// longlong __stdcall __alldiv(long, long, long, long); + // STUB: STRONGHOLDCRUSADER 0x005818EB + char* __strlwr(char* string) { return _strlwr(string); } -// Compiler-emitted ABI helper (__allmul) -// STUB: STRONGHOLDCRUSADER 0x00582CE0 -// ulonglong __stdcall __allmul(ulong, ulong, ulong, ulong); + // STUB: STRONGHOLDCRUSADER 0x00581F6F + undefined4 _ucrt_write(int fileDescriptor, void* src, uint size) { return _write(fileDescriptor, src, size); } -// Compiler-emitted stack probe helper (__alloca_probe) -// STUB: STRONGHOLDCRUSADER 0x005834A0 -// undefined4 __stdcall __alloca_probe(); + // STUB: STRONGHOLDCRUSADER 0x00582050 + void* _memcpy(void* _Dst, void* _Src, size_t _Size) { return memcpy(_Dst, _Src, _Size); } -// STUB: STRONGHOLDCRUSADER 0x005835BB -int OpenSHC::OS::__strnicmp(char* _Str1, char* _Str2, size_t _MaxCount) { return _strnicmp(_Str1, _Str2, _MaxCount); } + // Used implicitly in character conversion pipeline (_toupper) Save if global locale never set. + // STUB: STRONGHOLDCRUSADER 0x005824CD + // int __cdecl _toupper(int _C); -// STUB: STRONGHOLDCRUSADER 0x00583D55 -void OpenSHC::OS::_exit(int _Code) { exit(_Code); } + // STUB: STRONGHOLDCRUSADER 0x0058277E + int _ucrt_lseek(int fileDescriptor, long lDistanceToMove, DWORD moveMethod) + { + return _lseek(fileDescriptor, lDistanceToMove, moveMethod); + } -// Unknown math function? -// STUB: STRONGHOLDCRUSADER 0x00588628 -// uint OpenSHC::OS::math_FUN_00588628(undefined4 param_1, uint param_2) { TODO }; + // STUB: STRONGHOLDCRUSADER 0x005835BB + int __strnicmp(char* _Str1, char* _Str2, size_t _MaxCount) { return _strnicmp(_Str1, _Str2, _MaxCount); } -// Likely some internal math call? -// STUB: STRONGHOLDCRUSADER 0x00588628 -// float10 __fastcall OpenSHC::OS::math_FUN_0058864b(float10 param_1, char* param_2, int param_3, undefined4 param_4, -// undefined4 param_5, undefined4 param_6, undefined4 param_7); + // STUB: STRONGHOLDCRUSADER 0x00583D55 + void _exit(int _Code) { exit(_Code); } -// Likely some internal math call? -// STUB: STRONGHOLDCRUSADER 0x00588628 -// float10 __fastcall math_FUN_005887ae(); +} +} diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 69556e9b..33b67f3b 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -41879,6 +41879,7 @@ SHC_3BB0A8C1_0x00ED311C | 0.0% | Pending SHC_3BB0A8C1_0x00ED3120 | 0.0% | Pending SHC_3BB0A8C1_0x00ED3124 | 0.0% | Pending SHC_3BB0A8C1_0x00ED3128 | 0.0% | Pending +SHC_3BB0A8C1_0x00ED312C | 0.0% | Pending SHC_3BB0A8C1_0x00ED3138 | 0.0% | Pending SHC_3BB0A8C1_0x00ED313C | 0.0% | Pending SHC_3BB0A8C1_0x00ED3144 | 0.0% | Pending From 920fdfeba3af2f72d7462fe0b6f54ca4cee54a67 Mon Sep 17 00:00:00 2001 From: TheRedDaemon <66257843+TheRedDaemon@users.noreply.github.com> Date: Thu, 14 May 2026 22:59:35 +0200 Subject: [PATCH 4/6] [EXPERIMENT/MSS] clean OS func --- .../Audio/mss/SoundSystem/endSoundStream.cpp | 1 - src/OpenSHC/OS/OS.cpp | 17 ++++++----------- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/src/OpenSHC/Audio/mss/SoundSystem/endSoundStream.cpp b/src/OpenSHC/Audio/mss/SoundSystem/endSoundStream.cpp index 965bdf26..2bcb7f83 100644 --- a/src/OpenSHC/Audio/mss/SoundSystem/endSoundStream.cpp +++ b/src/OpenSHC/Audio/mss/SoundSystem/endSoundStream.cpp @@ -7,7 +7,6 @@ #include "OpenSHC/Globals/DAT_00df3844.hpp" -// TODO: // - DAT_00df3844 did not exist before and is therefore wrongly sorted into the status file // - "UnkSoundFlagsAndLoopCount" plays not nice with any number-like operation, the more likely thing therefore are // either a union, which allows to access the different parts separately, but this would likely compile to WORD diff --git a/src/OpenSHC/OS/OS.cpp b/src/OpenSHC/OS/OS.cpp index 02755fb3..4a9359a3 100644 --- a/src/OpenSHC/OS/OS.cpp +++ b/src/OpenSHC/OS/OS.cpp @@ -17,9 +17,6 @@ namespace OS { return static_cast(IsEqualGUID(*param_1, *param_2)); } - // STUB: STRONGHOLDCRUSADER 0x0057ECF1 - int __isnan(double _X) { return _isnan(_X); } - // Very likely just default function call, using time64_t and localtime64 behind // STUB: STRONGHOLDCRUSADER 0x0057F5FE tm* _localtime(time_t* _Time) { return localtime(_Time); } @@ -49,11 +46,10 @@ namespace OS { // This seems to be the games main free function // STUB: STRONGHOLDCRUSADER 0x0057FA74 - void __cdecl _free(void* _Memory) { free(_Memory); } + void __cdecl _free_base(void* _Memory) { free(_Memory); } - // Used implicitly in character conversion pipeline (_tolower). Save if global locale never set. // STUB: STRONGHOLDCRUSADER 0x0057FC19 - // int __cdecl _tolower(int _C); + int __cdecl __tolower(int _C) { return tolower(_C); }; // STUB: STRONGHOLDCRUSADER 0x0057FCB2 int _fclose(FILE* _File) { return fclose(_File); } @@ -88,9 +84,9 @@ namespace OS { // STUB: STRONGHOLDCRUSADER 0x00580B69 int __wcsicmp(wchar_t* _Str1, wchar_t* _Str2) { return _wcsicmp(_Str1, _Str2); } - // Only jumps to _free + // Only jumps to _free in game version // STUB: STRONGHOLDCRUSADER 0x00580DC1 - // void __cdecl _free(void* _Memory) { free(_Memory); } + void __cdecl _free(void* _Memory) { free(_Memory); } // STUB: STRONGHOLDCRUSADER 0x00580DC6 errno_t _memcpy_s(void* _Dst, rsize_t _DstSize, void* _Src, rsize_t _MaxCount) @@ -100,7 +96,7 @@ namespace OS { // Only jumps to _free // STUB: STRONGHOLDCRUSADER 0x00580E9C - // void __cdecl _free(void* _Memory) { free(_Memory); } + void __cdecl _free_cpp(void* _Memory) { free(_Memory); } // STUB: STRONGHOLDCRUSADER 0x00580F38 int _ucrt_close(int fileDescriptor) { return _close(fileDescriptor); } @@ -126,9 +122,8 @@ namespace OS { // STUB: STRONGHOLDCRUSADER 0x00582050 void* _memcpy(void* _Dst, void* _Src, size_t _Size) { return memcpy(_Dst, _Src, _Size); } - // Used implicitly in character conversion pipeline (_toupper) Save if global locale never set. // STUB: STRONGHOLDCRUSADER 0x005824CD - // int __cdecl _toupper(int _C); + int __cdecl __toupper(int _C) { return toupper(_C); } // STUB: STRONGHOLDCRUSADER 0x0058277E int _ucrt_lseek(int fileDescriptor, long lDistanceToMove, DWORD moveMethod) From 432f45b086be5ed214618000a9317718649d74d6 Mon Sep 17 00:00:00 2001 From: TheRedDaemon <66257843+TheRedDaemon@users.noreply.github.com> Date: Thu, 14 May 2026 23:12:11 +0200 Subject: [PATCH 5/6] [EXPERIMENTAL/MSS] clean sound functions and test effects --- src/OpenSHC/Audio/mss/SoundSystem.func.hpp | 4 ++-- .../Audio/mss/SoundSystem/endSoundStream.cpp | 12 +++++------- src/OpenSHC/Globals/DAT_00df3844.hpp | 14 -------------- src/precomp/addresses-SHC-3BB0A8C1.hpp | 3 +-- status/addresses-SHC-3BB0A8C1.txt | 3 +-- 5 files changed, 9 insertions(+), 27 deletions(-) delete mode 100644 src/OpenSHC/Globals/DAT_00df3844.hpp diff --git a/src/OpenSHC/Audio/mss/SoundSystem.func.hpp b/src/OpenSHC/Audio/mss/SoundSystem.func.hpp index cfb77d93..9ddf9d50 100644 --- a/src/OpenSHC/Audio/mss/SoundSystem.func.hpp +++ b/src/OpenSHC/Audio/mss/SoundSystem.func.hpp @@ -22,14 +22,14 @@ namespace Audio { meth_0x424700; MACRO_FUNCTION_RESOLVER( - void (SoundSystem::*)(), true, Address::SHC_3BB0A8C1_0x00467810, &SoundSystem::stopMusicPlayback) + void (SoundSystem::*)(), false, Address::SHC_3BB0A8C1_0x00467810, &SoundSystem::stopMusicPlayback) stopMusicPlayback; MACRO_FUNCTION_RESOLVER( void (SoundSystem::*)(), false, Address::SHC_3BB0A8C1_0x00467830, &SoundSystem::endSoundStreamsUnk) endSoundStreamsUnk; - MACRO_FUNCTION_RESOLVER(void (SoundSystem::*)(SHC_SoundStreamInt), true, Address::SHC_3BB0A8C1_0x004799A0, + MACRO_FUNCTION_RESOLVER(void (SoundSystem::*)(SHC_SoundStreamInt), false, Address::SHC_3BB0A8C1_0x004799A0, &SoundSystem::endSoundStream) endSoundStream; diff --git a/src/OpenSHC/Audio/mss/SoundSystem/endSoundStream.cpp b/src/OpenSHC/Audio/mss/SoundSystem/endSoundStream.cpp index 2bcb7f83..eb5e3209 100644 --- a/src/OpenSHC/Audio/mss/SoundSystem/endSoundStream.cpp +++ b/src/OpenSHC/Audio/mss/SoundSystem/endSoundStream.cpp @@ -5,12 +5,10 @@ #include "OpenSHC/OS.func.hpp" -#include "OpenSHC/Globals/DAT_00df3844.hpp" +#include "OpenSHC/Globals/DAT_SoundEffectsHelperData1.hpp" -// - DAT_00df3844 did not exist before and is therefore wrongly sorted into the status file -// - "UnkSoundFlagsAndLoopCount" plays not nice with any number-like operation, the more likely thing therefore are -// either a union, which allows to access the different parts separately, but this would likely compile to WORD -// operations, or a bitfield, maybe like this: +// NOTE: +// "UnkSoundFlagsAndLoopCount" might be a bitfield, maybe like this: // int loopCount : 16; // int reserved : 13; // int unknownFlag1 : 1; @@ -32,7 +30,7 @@ namespace Audio { if (sndStreamIndex == enums::SND_STR_MUSIC) { this->streamActiveUnk_0x20[0] = 0; - *DAT_00df3844::ptr = 1; + DAT_SoundEffectsHelperData1::ptr->field14_0x54 = true; if (this->musicSampleFileHandleUnk_0x174 != -1) { AIL_end_sample(this->musicSampleUnk_0x170); MACRO_CALL(OS_Func::_ucrt_close)(this->musicSampleFileHandleUnk_0x174); @@ -43,7 +41,7 @@ namespace Audio { this->musicFileHandle_0x178 = -1; this->musicSampleFileHandleUnk_0x174 = -1; this->mbr_0x188 = 1; - *DAT_00df3844::ptr = 0; + DAT_SoundEffectsHelperData1::ptr->field14_0x54 = false; this->sec_Section1055_0x3274 = 0; return; } diff --git a/src/OpenSHC/Globals/DAT_00df3844.hpp b/src/OpenSHC/Globals/DAT_00df3844.hpp deleted file mode 100644 index b9380285..00000000 --- a/src/OpenSHC/Globals/DAT_00df3844.hpp +++ /dev/null @@ -1,14 +0,0 @@ -/** - THIS FILE IS AUTO GENERATED - Communicate changes to the dev team (e.g. via a Pull Request). - Changes get lost otherwise. - - path: 'OpenSHC/Globals/DAT_00df3844.hpp' -*/ - -#pragma once - -namespace OpenSHC { - -MACRO_STRUCT_RESOLVER(undefined4, false, Address::SHC_3BB0A8C1_0x00df3844) DAT_00df3844; -} // namespace OpenSHC diff --git a/src/precomp/addresses-SHC-3BB0A8C1.hpp b/src/precomp/addresses-SHC-3BB0A8C1.hpp index 734afd39..c4676df2 100644 --- a/src/precomp/addresses-SHC-3BB0A8C1.hpp +++ b/src/precomp/addresses-SHC-3BB0A8C1.hpp @@ -98109,7 +98109,6 @@ enum { // location: // type: /byte[1708] SHC_3BB0A8C1_0x02490954 = 0x02490954, - // type: /undefined4 - SHC_3BB0A8C1_0x00df3844 = 0x00df3844, + }; } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 33b67f3b..027e9b33 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -10880,7 +10880,7 @@ SHC_3BB0A8C1_0x00479369 | 0.0% | Pending SHC_3BB0A8C1_0x00479400 | 0.0% | Pending SHC_3BB0A8C1_0x00479540 | 0.0% | Pending SHC_3BB0A8C1_0x00479790 | 0.0% | Pending -SHC_3BB0A8C1_0x004799A0 | 96.36% | "_close" is seen as unknown offset call by reccmp +SHC_3BB0A8C1_0x004799A0 | 100.0% | Reimplemented SHC_3BB0A8C1_0x00479A60 | 100.0% | Reimplemented SHC_3BB0A8C1_0x00479AB0 | 100.0% | Reimplemented SHC_3BB0A8C1_0x00479AF0 | 100.0% | Reimplemented @@ -42943,4 +42943,3 @@ SHC_3BB0A8C1_0x02490916 | 0.0% | Pending SHC_3BB0A8C1_0x02490930 | 0.0% | Pending SHC_3BB0A8C1_0x02490936 | 0.0% | Pending SHC_3BB0A8C1_0x02490954 | 0.0% | Pending -SHC_3BB0A8C1_0x00df3844 | 0.0% | Pending From 189878e5e6eebf224f23b83d6f19fa09ba53f788 Mon Sep 17 00:00:00 2001 From: TheRedDaemon <66257843+TheRedDaemon@users.noreply.github.com> Date: Sat, 13 Jun 2026 15:00:35 +0200 Subject: [PATCH 6/6] [EXPERIMENT/MSS] clean functions 0x00467810 and 0x004799A0 --- .../Audio/mss/SoundSystem/endSoundStream.cpp | 20 +++---------------- .../mss/SoundSystem/stopMusicPlayback.cpp | 6 +----- src/OpenSHC/OS.func.hpp | 10 +++------- src/OpenSHC/OS.hpp | 2 +- src/OpenSHC/OS/OS.cpp | 2 +- 5 files changed, 9 insertions(+), 31 deletions(-) diff --git a/src/OpenSHC/Audio/mss/SoundSystem/endSoundStream.cpp b/src/OpenSHC/Audio/mss/SoundSystem/endSoundStream.cpp index eb5e3209..149e9949 100644 --- a/src/OpenSHC/Audio/mss/SoundSystem/endSoundStream.cpp +++ b/src/OpenSHC/Audio/mss/SoundSystem/endSoundStream.cpp @@ -1,22 +1,9 @@ -#include "OpenSHC/Audio/MSS/SoundSystem.hpp" - -#include "OpenSHC/Audio/MSS/enums/AILStatus.hpp" -#include "OpenSHC/Audio/MSS/enums/SHC_SoundStream.hpp" +#include "../SoundSystem.func.hpp" #include "OpenSHC/OS.func.hpp" #include "OpenSHC/Globals/DAT_SoundEffectsHelperData1.hpp" -// NOTE: -// "UnkSoundFlagsAndLoopCount" might be a bitfield, maybe like this: -// int loopCount : 16; -// int reserved : 13; -// int unknownFlag1 : 1; -// int unknownFlag2 : 1; -// int uninterruptable : 1; // ? -// In a test in the current file it compiled to "& 0x80000000" properly when using the specific field, but no idea if -// this works for multifield checks or assigns - namespace OpenSHC { namespace Audio { namespace MSS { @@ -50,9 +37,8 @@ namespace Audio { return; } - // flag seems to indicate an "uninterruptable" stream; if it is set, a playing stream can not be ended - if ((*reinterpret_cast(&this->streamFlagsUnkAndLoopCount_0x34[sndStreamIndex]) & 0x80000000) - && (AIL_stream_status(this->stream_0xc[sndStreamIndex]) == SMP_PLAYING)) { + if (this->streamFlagsUnkAndLoopCount_0x34[sndStreamIndex].uninterruptable + && AIL_stream_status(this->stream_0xc[sndStreamIndex]) == SMP_PLAYING) { return; } AIL_close_stream(this->stream_0xc[sndStreamIndex]); diff --git a/src/OpenSHC/Audio/mss/SoundSystem/stopMusicPlayback.cpp b/src/OpenSHC/Audio/mss/SoundSystem/stopMusicPlayback.cpp index 22883124..1453c3be 100644 --- a/src/OpenSHC/Audio/mss/SoundSystem/stopMusicPlayback.cpp +++ b/src/OpenSHC/Audio/mss/SoundSystem/stopMusicPlayback.cpp @@ -1,8 +1,4 @@ -#include "OpenSHC/Audio/MSS/SoundSystem.hpp" - -#include "OpenSHC/Audio/MSS/SoundSystem.func.hpp" -#include "OpenSHC/Audio/MSS/enums/SHC_SoundStream.hpp" - +#include "../SoundSystem.func.hpp" namespace OpenSHC { namespace Audio { namespace MSS { diff --git a/src/OpenSHC/OS.func.hpp b/src/OpenSHC/OS.func.hpp index ae095c6a..3d2f87ef 100644 --- a/src/OpenSHC/OS.func.hpp +++ b/src/OpenSHC/OS.func.hpp @@ -32,10 +32,6 @@ namespace OS_Func { Address::SHC_3BB0A8C1_0x0047C5D0, &OpenSHC::OS::isEqualGUID) isEqualGUID; - MACRO_FUNCTION_RESOLVER( - int(__cdecl*)(double _X), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x0057ECF1, &OpenSHC::OS::__isnan) - __isnan; - MACRO_FUNCTION_RESOLVER( tm*(__cdecl*)(time_t* _Time), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x0057F5FE, &OpenSHC::OS::_localtime) _localtime; @@ -112,9 +108,9 @@ namespace OS_Func { Address::SHC_3BB0A8C1_0x00580B69, &OpenSHC::OS::__wcsicmp) __wcsicmp; - // MACRO_FUNCTION_RESOLVER( - // void(__cdecl*)(void* _Memory), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x00580DC1, &OpenSHC::OS::_free) - //_free; + MACRO_FUNCTION_RESOLVER( + void(__cdecl*)(void* _Memory), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x00580DC1, &OpenSHC::OS::_free) + _free; MACRO_FUNCTION_RESOLVER(errno_t(__cdecl*)(void* _Dst, rsize_t _DstSize, void* _Src, rsize_t _MaxCount), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x00580DC6, &OpenSHC::OS::_memcpy_s) diff --git a/src/OpenSHC/OS.hpp b/src/OpenSHC/OS.hpp index 2c628c0d..1cb5919b 100644 --- a/src/OpenSHC/OS.hpp +++ b/src/OpenSHC/OS.hpp @@ -65,7 +65,7 @@ namespace OS { int __cdecl __wcsicmp(wchar_t* _Str1, wchar_t* _Str2); - // void __cdecl _free(void* _Memory); + void __cdecl _free(void* _Memory); errno_t __cdecl _memcpy_s(void* _Dst, rsize_t _DstSize, void* _Src, rsize_t _MaxCount); diff --git a/src/OpenSHC/OS/OS.cpp b/src/OpenSHC/OS/OS.cpp index 4a9359a3..c53874d4 100644 --- a/src/OpenSHC/OS/OS.cpp +++ b/src/OpenSHC/OS/OS.cpp @@ -1,7 +1,7 @@ // disable deprecation warnings, since we use the old calls on purpose #pragma warning(disable : 4996) -#include "OpenSHC/OS.hpp" +#include "../OS.func.hpp" #include "float.h" #include "io.h"