From 42c9d0269595730c4375fabcba9e7165374fc6f5 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/3] [EXPERIMENT/MSS] attempt func 0x00467810 and 0x004799A0 --- cmake/openshc-sources.txt | 2 + src/OpenSHC/Audio/mss/FakeDigDriver.hpp | 24 ------ src/OpenSHC/Audio/mss/FakeSample.hpp | 24 ------ src/OpenSHC/Audio/mss/FakeStream.hpp | 24 ------ src/OpenSHC/Audio/mss/HDIGDRIVER.hpp | 21 ----- src/OpenSHC/Audio/mss/HSAMPLE.hpp | 21 ----- src/OpenSHC/Audio/mss/HSTREAM.hpp | 21 ----- src/OpenSHC/Audio/mss/SoundSystem.func.hpp | 2 +- src/OpenSHC/Audio/mss/SoundSystem.hpp | 7 +- .../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 +++++-------------- 14 files changed, 116 insertions(+), 202 deletions(-) delete mode 100644 src/OpenSHC/Audio/mss/FakeDigDriver.hpp delete mode 100644 src/OpenSHC/Audio/mss/FakeSample.hpp delete mode 100644 src/OpenSHC/Audio/mss/FakeStream.hpp delete mode 100644 src/OpenSHC/Audio/mss/HDIGDRIVER.hpp delete mode 100644 src/OpenSHC/Audio/mss/HSAMPLE.hpp delete mode 100644 src/OpenSHC/Audio/mss/HSTREAM.hpp 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 e69de29..d57a14b 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/FakeDigDriver.hpp b/src/OpenSHC/Audio/mss/FakeDigDriver.hpp deleted file mode 100644 index 3d1cd80..0000000 --- a/src/OpenSHC/Audio/mss/FakeDigDriver.hpp +++ /dev/null @@ -1,24 +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/Audio/mss/FakeDigDriver.hpp' -*/ - -#pragma once - -namespace OpenSHC { -namespace Audio { - namespace mss { - -#pragma pack(push, 1) - // SIZE: 0x00000000 - typedef struct FakeDigDriver { - - } FakeDigDriver; -#pragma pack(pop) - - } // namespace mss -} // namespace Audio -} // namespace OpenSHC diff --git a/src/OpenSHC/Audio/mss/FakeSample.hpp b/src/OpenSHC/Audio/mss/FakeSample.hpp deleted file mode 100644 index deb8307..0000000 --- a/src/OpenSHC/Audio/mss/FakeSample.hpp +++ /dev/null @@ -1,24 +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/Audio/mss/FakeSample.hpp' -*/ - -#pragma once - -namespace OpenSHC { -namespace Audio { - namespace mss { - -#pragma pack(push, 1) - // SIZE: 0x00000000 - typedef struct FakeSample { - - } FakeSample; -#pragma pack(pop) - - } // namespace mss -} // namespace Audio -} // namespace OpenSHC diff --git a/src/OpenSHC/Audio/mss/FakeStream.hpp b/src/OpenSHC/Audio/mss/FakeStream.hpp deleted file mode 100644 index ddeaa85..0000000 --- a/src/OpenSHC/Audio/mss/FakeStream.hpp +++ /dev/null @@ -1,24 +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/Audio/mss/FakeStream.hpp' -*/ - -#pragma once - -namespace OpenSHC { -namespace Audio { - namespace mss { - -#pragma pack(push, 1) - // SIZE: 0x00000000 - typedef struct FakeStream { - - } FakeStream; -#pragma pack(pop) - - } // namespace mss -} // namespace Audio -} // namespace OpenSHC diff --git a/src/OpenSHC/Audio/mss/HDIGDRIVER.hpp b/src/OpenSHC/Audio/mss/HDIGDRIVER.hpp deleted file mode 100644 index 425f749..0000000 --- a/src/OpenSHC/Audio/mss/HDIGDRIVER.hpp +++ /dev/null @@ -1,21 +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/Audio/mss/HDIGDRIVER.hpp' -*/ - -#pragma once - -#include "OpenSHC/Audio/mss/FakeDigDriver.hpp" -namespace OpenSHC { -namespace Audio { - namespace mss { - - using OpenSHC::Audio::mss::FakeDigDriver; - - typedef FakeDigDriver* HDIGDRIVER; - } // namespace mss -} // namespace Audio -} // namespace OpenSHC diff --git a/src/OpenSHC/Audio/mss/HSAMPLE.hpp b/src/OpenSHC/Audio/mss/HSAMPLE.hpp deleted file mode 100644 index 211d054..0000000 --- a/src/OpenSHC/Audio/mss/HSAMPLE.hpp +++ /dev/null @@ -1,21 +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/Audio/mss/HSAMPLE.hpp' -*/ - -#pragma once - -#include "OpenSHC/Audio/mss/FakeSample.hpp" -namespace OpenSHC { -namespace Audio { - namespace mss { - - using OpenSHC::Audio::mss::FakeSample; - - typedef FakeSample* HSAMPLE; - } // namespace mss -} // namespace Audio -} // namespace OpenSHC diff --git a/src/OpenSHC/Audio/mss/HSTREAM.hpp b/src/OpenSHC/Audio/mss/HSTREAM.hpp deleted file mode 100644 index 4bcf87b..0000000 --- a/src/OpenSHC/Audio/mss/HSTREAM.hpp +++ /dev/null @@ -1,21 +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/Audio/mss/HSTREAM.hpp' -*/ - -#pragma once - -#include "OpenSHC/Audio/mss/FakeStream.hpp" -namespace OpenSHC { -namespace Audio { - namespace mss { - - using OpenSHC::Audio::mss::FakeStream; - - typedef FakeStream* HSTREAM; - } // namespace mss -} // namespace Audio -} // namespace OpenSHC diff --git a/src/OpenSHC/Audio/mss/SoundSystem.func.hpp b/src/OpenSHC/Audio/mss/SoundSystem.func.hpp index 98370bc..8eafdb2 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.hpp b/src/OpenSHC/Audio/mss/SoundSystem.hpp index 094aeef..4476580 100644 --- a/src/OpenSHC/Audio/mss/SoundSystem.hpp +++ b/src/OpenSHC/Audio/mss/SoundSystem.hpp @@ -8,9 +8,7 @@ #pragma once -#include "OpenSHC/Audio/mss/HDIGDRIVER.hpp" -#include "OpenSHC/Audio/mss/HSAMPLE.hpp" -#include "OpenSHC/Audio/mss/HSTREAM.hpp" +#include "Mss32.h" #include "OpenSHC/Audio/mss/UnkSoundFlagsAndLoopCount.hpp" #include "OpenSHC/Audio/mss/_enums/SHC_SoundStreamInt.hpp" #include "OpenSHC/DE/SHCDE/eMusicIDsInt.hpp" @@ -21,9 +19,6 @@ namespace OpenSHC { namespace Audio { namespace mss { - using OpenSHC::Audio::mss::HDIGDRIVER; - using OpenSHC::Audio::mss::HSAMPLE; - using OpenSHC::Audio::mss::HSTREAM; using OpenSHC::Audio::mss::UnkSoundFlagsAndLoopCount; using OpenSHC::Audio::mss::_enums::SHC_SoundStreamInt; using OpenSHC::DE::SHCDE::eMusicIDsInt; diff --git a/src/OpenSHC/Audio/mss/SoundSystem/endSoundStream.cpp b/src/OpenSHC/Audio/mss/SoundSystem/endSoundStream.cpp new file mode 100644 index 0000000..700e366 --- /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 0000000..1f6958b --- /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 0000000..b938028 --- /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 bac4186..458e0b4 100644 --- a/src/precomp/addresses-SHC-3BB0A8C1.hpp +++ b/src/precomp/addresses-SHC-3BB0A8C1.hpp @@ -98103,6 +98103,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 f1a6853..e9317a1 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% | DONE SHC_3BB0A8C1_0x00467830 | 0.0% | Pending 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 | 0.0% | Pending SHC_3BB0A8C1_0x00479AB0 | 0.0% | Pending SHC_3BB0A8C1_0x00479AF0 | 0.0% | Pending @@ -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 288cd8698c7c69fa9a83745c25433e318a0f06c3 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/3] [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 | 138 +++++------ src/OpenSHC/OS.hpp | 50 ++-- src/OpenSHC/OS/OS.cpp | 227 ++++++++++++++++++ .../WindowsHelper/Enums/FilePtrMoveMethod.hpp | 6 +- 7 files changed, 340 insertions(+), 110 deletions(-) create mode 100644 src/OpenSHC/OS/OS.cpp diff --git a/cmake/openshc-sources.txt b/cmake/openshc-sources.txt index d57a14b..e52de3f 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 700e366..88c9927 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 1f6958b..6ed1df1 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 2eaae3f..c0a51e8 100644 --- a/src/OpenSHC/OS.func.hpp +++ b/src/OpenSHC/OS.func.hpp @@ -24,9 +24,9 @@ namespace OS_Func { using OpenSHC::WindowsHelper::Enums::FilePtrMoveMethodInt; 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) @@ -36,45 +36,48 @@ namespace OS_Func { int(__cdecl*)(double _X), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x0057ECF1, &OpenSHC::OS::__isnan) __isnan; - MACRO_FUNCTION_RESOLVER( - int(__cdecl*)(float10 param), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x0057ED20, &OpenSHC::OS::__ftol2) - __ftol2; + // MACRO_FUNCTION_RESOLVER( + // int(__cdecl*)(float10 param), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x0057ED20, &OpenSHC::OS::__ftol2) + //__ftol2; - MACRO_FUNCTION_RESOLVER(void(__cdecl*)(float10 param_1), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x0057EE10, - &OpenSHC::OS::math_atan_FUN_0057ee10) - math_atan_FUN_0057ee10; + // MACRO_FUNCTION_RESOLVER(void(__cdecl*)(float10 param_1), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x0057EE10, + // &OpenSHC::OS::math_atan_FUN_0057ee10) + // math_atan_FUN_0057ee10; - MACRO_FUNCTION_RESOLVER(float10(__cdecl*)(float10 floatIn, uint eaxIn, int param_3, int param_4), REIMPLEMENTED_CRT, - Address::SHC_3BB0A8C1_0x0057EE68, &OpenSHC::OS::math_atan_FUN_0057ee68) - math_atan_FUN_0057ee68; + // MACRO_FUNCTION_RESOLVER(float10(__cdecl*)(float10 floatIn, uint eaxIn, int param_3, int param_4), + // REIMPLEMENTED_CRT, + // Address::SHC_3BB0A8C1_0x0057EE68, &OpenSHC::OS::math_atan_FUN_0057ee68) + // math_atan_FUN_0057ee68; - MACRO_FUNCTION_RESOLVER(float10(__cdecl*)(float10 param_1), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x0057EEF0, - &OpenSHC::OS::math_sqrt_FUN_0057eef0) - math_sqrt_FUN_0057eef0; + // MACRO_FUNCTION_RESOLVER(float10(__cdecl*)(float10 param_1), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x0057EEF0, + // &OpenSHC::OS::math_sqrt_FUN_0057eef0) + // math_sqrt_FUN_0057eef0; - MACRO_FUNCTION_RESOLVER(float10(__cdecl*)(int param_1, uint param_2, float10 param_3), REIMPLEMENTED_CRT, - Address::SHC_3BB0A8C1_0x0057EF0D, &OpenSHC::OS::math_sqrt_FUN_0057ef0d) - math_sqrt_FUN_0057ef0d; + // MACRO_FUNCTION_RESOLVER(float10(__cdecl*)(int param_1, uint param_2, float10 param_3), REIMPLEMENTED_CRT, + // Address::SHC_3BB0A8C1_0x0057EF0D, &OpenSHC::OS::math_sqrt_FUN_0057ef0d) + // math_sqrt_FUN_0057ef0d; - MACRO_FUNCTION_RESOLVER(void(__cdecl*)(float10 param_1), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x0057EFF0, - &OpenSHC::OS::math_tan_1_FUN_0057eff0) - math_tan_1_FUN_0057eff0; + // MACRO_FUNCTION_RESOLVER(void(__cdecl*)(float10 param_1), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x0057EFF0, + // &OpenSHC::OS::math_tan_1_FUN_0057eff0) + // math_tan_1_FUN_0057eff0; - MACRO_FUNCTION_RESOLVER(float10(__cdecl*)(int param_1, int param_2), REIMPLEMENTED_CRT, - Address::SHC_3BB0A8C1_0x0057F048, &OpenSHC::OS::math_FUN_0057f048) - math_FUN_0057f048; + // MACRO_FUNCTION_RESOLVER(float10(__cdecl*)(int param_1, int param_2), REIMPLEMENTED_CRT, + // Address::SHC_3BB0A8C1_0x0057F048, &OpenSHC::OS::math_FUN_0057f048) + // math_FUN_0057f048; - MACRO_FUNCTION_RESOLVER(float10(__fastcall*)(float10 param_1), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x0057F120, - &OpenSHC::OS::math_cos) - math_cos; + // MACRO_FUNCTION_RESOLVER(float10(__fastcall*)(float10 param_1), REIMPLEMENTED_CRT, + // Address::SHC_3BB0A8C1_0x0057F120, + // &OpenSHC::OS::math_cos) + // math_cos; - MACRO_FUNCTION_RESOLVER(float10(__fastcall*)(float10 param_1), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x0057F250, - &OpenSHC::OS::math_sin) - math_sin; + // MACRO_FUNCTION_RESOLVER(float10(__fastcall*)(float10 param_1), REIMPLEMENTED_CRT, + // Address::SHC_3BB0A8C1_0x0057F250, + // &OpenSHC::OS::math_sin) + // math_sin; - MACRO_FUNCTION_RESOLVER(tm*(__cdecl*)(__time32_t * _Time), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x0057F5FE, - &OpenSHC::OS::__localtime64) - __localtime64; + MACRO_FUNCTION_RESOLVER( + tm*(__cdecl*)(time_t* _Time), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x0057F5FE, &OpenSHC::OS::_localtime) + _localtime; MACRO_FUNCTION_RESOLVER(__time64_t(__cdecl*)(__time64_t* _Time), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x0057F622, &OpenSHC::OS::__time64) @@ -84,7 +87,7 @@ namespace OS_Func { Address::SHC_3BB0A8C1_0x0057F660, &OpenSHC::OS::_memset) _memset; - MACRO_FUNCTION_RESOLVER(int(__cdecl*)(char* _Dest, char* _Format), REIMPLEMENTED_CRT, + MACRO_FUNCTION_RESOLVER(int(__cdecl*)(char* _Dest, char* _Format, ...), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x0057F6DA, &OpenSHC::OS::_sprintf) _sprintf; @@ -100,9 +103,9 @@ namespace OS_Func { void(__cdecl*)(void* _Memory), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x0057FA74, &OpenSHC::OS::_free) _free; - MACRO_FUNCTION_RESOLVER( - int(__cdecl*)(int _C), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x0057FC19, &OpenSHC::OS::_tolower) - _tolower; + // MACRO_FUNCTION_RESOLVER( + // int(__cdecl*)(int _C), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x0057FC19, &OpenSHC::OS::_tolower) + //_tolower; MACRO_FUNCTION_RESOLVER( int(__cdecl*)(FILE* _File), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x0057FCB2, &OpenSHC::OS::_fclose) @@ -148,17 +151,17 @@ 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) _memcpy_s; - MACRO_FUNCTION_RESOLVER( - void(__cdecl*)(void* _Memory), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x00580E9C, &OpenSHC::OS::_free) - _free; + // MACRO_FUNCTION_RESOLVER( + // void(__cdecl*)(void* _Memory), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x00580E9C, &OpenSHC::OS::_free) + //_free; MACRO_FUNCTION_RESOLVER(int(__cdecl*)(int fileDescriptor), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x00580F38, &OpenSHC::OS::_ucrt_close) @@ -187,27 +190,28 @@ namespace OS_Func { Address::SHC_3BB0A8C1_0x00582050, &OpenSHC::OS::_memcpy) _memcpy; - MACRO_FUNCTION_RESOLVER( - int(__cdecl*)(int _C), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x005824CD, &OpenSHC::OS::_toupper) - _toupper; + // MACRO_FUNCTION_RESOLVER( + // int(__cdecl*)(int _C), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x005824CD, &OpenSHC::OS::_toupper) + //_toupper; MACRO_FUNCTION_RESOLVER(int(__cdecl*)(int fileDescriptor, long lDistanceToMove, FilePtrMoveMethodInt moveMethod), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x0058277E, &OpenSHC::OS::_ucrt_lseek) _ucrt_lseek; - MACRO_FUNCTION_RESOLVER(longlong(__stdcall*)(long dividend_lowOrder, long dividend_highOrder, long divisor_lowOrder, - long divisor_highOrder), - REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x00582C30, &OpenSHC::OS::__alldiv) - __alldiv; + // MACRO_FUNCTION_RESOLVER(longlong(__stdcall*)(long dividend_lowOrder, long dividend_highOrder, long + // divisor_lowOrder, + // long divisor_highOrder), + // REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x00582C30, &OpenSHC::OS::__alldiv) + //__alldiv; - MACRO_FUNCTION_RESOLVER(ulonglong(__stdcall*)(ulong factor1_lowOrder, ulong factor1_highOrder, - ulong factor2_lowOrder, ulong factor2_highOrder), - REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x00582CE0, &OpenSHC::OS::__allmul) - __allmul; + // MACRO_FUNCTION_RESOLVER(ulonglong(__stdcall*)(ulong factor1_lowOrder, ulong factor1_highOrder, + // ulong factor2_lowOrder, ulong factor2_highOrder), + // REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x00582CE0, &OpenSHC::OS::__allmul) + //__allmul; - MACRO_FUNCTION_RESOLVER( - undefined4(__stdcall*)(), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x005834A0, &OpenSHC::OS::__alloca_probe) - __alloca_probe; + // MACRO_FUNCTION_RESOLVER( + // undefined4(__stdcall*)(), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x005834A0, &OpenSHC::OS::__alloca_probe) + //__alloca_probe; MACRO_FUNCTION_RESOLVER(int(__cdecl*)(char* _Str1, char* _Str2, size_t _MaxCount), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x005835BB, &OpenSHC::OS::__strnicmp) @@ -217,18 +221,18 @@ namespace OS_Func { void(__cdecl*)(int _Code), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x00583D55, &OpenSHC::OS::_exit) _exit; - MACRO_FUNCTION_RESOLVER(uint(__cdecl*)(undefined4 param_1, uint param_2), REIMPLEMENTED_CRT, - Address::SHC_3BB0A8C1_0x00588628, &OpenSHC::OS::math_FUN_00588628) - math_FUN_00588628; + // MACRO_FUNCTION_RESOLVER(uint(__cdecl*)(undefined4 param_1, uint param_2), REIMPLEMENTED_CRT, + // Address::SHC_3BB0A8C1_0x00588628, &OpenSHC::OS::math_FUN_00588628) + // math_FUN_00588628; - MACRO_FUNCTION_RESOLVER(float10(__fastcall*)(float10 param_1, char* param_2, int param_3, undefined4 param_4, - undefined4 param_5, undefined4 param_6, undefined4 param_7), - REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x0058864B, &OpenSHC::OS::math_FUN_0058864b) - math_FUN_0058864b; + // MACRO_FUNCTION_RESOLVER(float10(__fastcall*)(float10 param_1, char* param_2, int param_3, undefined4 param_4, + // undefined4 param_5, undefined4 param_6, undefined4 param_7), + // REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x0058864B, &OpenSHC::OS::math_FUN_0058864b) + // math_FUN_0058864b; - MACRO_FUNCTION_RESOLVER( - float10(__fastcall*)(), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x005887AE, &OpenSHC::OS::math_FUN_005887ae) - math_FUN_005887ae; + // MACRO_FUNCTION_RESOLVER( + // float10(__fastcall*)(), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x005887AE, &OpenSHC::OS::math_FUN_005887ae) + // math_FUN_005887ae; } // namespace OS_Func } // namespace OpenSHC diff --git a/src/OpenSHC/OS.hpp b/src/OpenSHC/OS.hpp index 8eab3f5..566a31b 100644 --- a/src/OpenSHC/OS.hpp +++ b/src/OpenSHC/OS.hpp @@ -23,37 +23,37 @@ namespace OS { using OpenSHC::WindowsHelper::Enums::FilePtrMoveMethodInt; 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); int __cdecl __isnan(double _X); - int __cdecl __ftol2(float10 param); + // int __cdecl __ftol2(float10 param); - void __cdecl math_atan_FUN_0057ee10(float10 param_1); + // void __cdecl math_atan_FUN_0057ee10(float10 param_1); - float10 __cdecl math_atan_FUN_0057ee68(float10 floatIn, uint eaxIn, int param_3, int param_4); + // float10 __cdecl math_atan_FUN_0057ee68(float10 floatIn, uint eaxIn, int param_3, int param_4); - float10 __cdecl math_sqrt_FUN_0057eef0(float10 param_1); + // float10 __cdecl math_sqrt_FUN_0057eef0(float10 param_1); - float10 __cdecl math_sqrt_FUN_0057ef0d(int param_1, uint param_2, float10 param_3); + // float10 __cdecl math_sqrt_FUN_0057ef0d(int param_1, uint param_2, float10 param_3); - void __cdecl math_tan_1_FUN_0057eff0(float10 param_1); + // void __cdecl math_tan_1_FUN_0057eff0(float10 param_1); - float10 __cdecl math_FUN_0057f048(int param_1, int param_2); + // float10 __cdecl math_FUN_0057f048(int param_1, int param_2); - float10 __fastcall math_cos(float10 param_1); + // float10 __fastcall math_cos(float10 param_1); - float10 __fastcall math_sin(float10 param_1); + // float10 __fastcall math_sin(float10 param_1); - tm* __cdecl __localtime64(__time32_t* _Time); + tm* __cdecl _localtime(time_t* _Time); __time64_t __cdecl __time64(__time64_t* _Time); void* __cdecl _memset(void* _Dst, int _Val, size_t _Size); - int __cdecl _sprintf(char* _Dest, char* _Format); + int __cdecl _sprintf(char* _Dest, char* _Format, ...); int __cdecl __stricmp(char* _Str1, char* _Str2); @@ -61,7 +61,7 @@ namespace OS { void __cdecl _free(void* _Memory); - int __cdecl _tolower(int _C); + // int __cdecl _tolower(int _C); int __cdecl _fclose(FILE* _File); @@ -85,11 +85,11 @@ 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); - void __cdecl _free(void* _Memory); + // void __cdecl _free(void* _Memory); int __cdecl _ucrt_close(int fileDescriptor); @@ -105,28 +105,28 @@ namespace OS { void* __cdecl _memcpy(void* _Dst, void* _Src, size_t _Size); - int __cdecl _toupper(int _C); + // int __cdecl _toupper(int _C); int __cdecl _ucrt_lseek(int fileDescriptor, long lDistanceToMove, FilePtrMoveMethodInt moveMethod); - longlong __stdcall __alldiv( - long dividend_lowOrder, long dividend_highOrder, long divisor_lowOrder, long divisor_highOrder); + // longlong __stdcall __alldiv( + // long dividend_lowOrder, long dividend_highOrder, long divisor_lowOrder, long divisor_highOrder); - ulonglong __stdcall __allmul( - ulong factor1_lowOrder, ulong factor1_highOrder, ulong factor2_lowOrder, ulong factor2_highOrder); + // ulonglong __stdcall __allmul( + // ulong factor1_lowOrder, ulong factor1_highOrder, ulong factor2_lowOrder, ulong factor2_highOrder); - undefined4 __stdcall __alloca_probe(); + // undefined4 __stdcall __alloca_probe(); int __cdecl __strnicmp(char* _Str1, char* _Str2, size_t _MaxCount); void __cdecl _exit(int _Code); - uint __cdecl math_FUN_00588628(undefined4 param_1, uint param_2); + // uint __cdecl math_FUN_00588628(undefined4 param_1, uint param_2); - float10 __fastcall math_FUN_0058864b(float10 param_1, char* param_2, int param_3, undefined4 param_4, - undefined4 param_5, undefined4 param_6, undefined4 param_7); + // float10 __fastcall math_FUN_0058864b(float10 param_1, char* param_2, int param_3, undefined4 param_4, + // undefined4 param_5, undefined4 param_6, undefined4 param_7); - float10 __fastcall math_FUN_005887ae(); + // float10 __fastcall math_FUN_005887ae(); } // namespace OS } // namespace OpenSHC diff --git a/src/OpenSHC/OS/OS.cpp b/src/OpenSHC/OS/OS.cpp new file mode 100644 index 0000000..a2efcb7 --- /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(); diff --git a/src/OpenSHC/WindowsHelper/Enums/FilePtrMoveMethod.hpp b/src/OpenSHC/WindowsHelper/Enums/FilePtrMoveMethod.hpp index e49ef3b..0aaf0fb 100644 --- a/src/OpenSHC/WindowsHelper/Enums/FilePtrMoveMethod.hpp +++ b/src/OpenSHC/WindowsHelper/Enums/FilePtrMoveMethod.hpp @@ -13,9 +13,9 @@ namespace WindowsHelper { namespace Enums { typedef enum FilePtrMoveMethod { - FILE_BEGIN = 0, // 0x00000000 - FILE_CURRENT = 1, // 0x00000001 - FILE_END = 2 // 0x00000002 + FILE_ENUM_BEGIN = 0, // 0x00000000 + FILE_ENUM_CURRENT = 1, // 0x00000001 + FILE_ENUM_END = 2 // 0x00000002 } FilePtrMoveMethod; From f26d08c4fa61ed7d74eabcaabc547fdb82f373e3 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/3] [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 | 38 +-- src/OpenSHC/OS.hpp | 6 +- src/OpenSHC/OS/OS.cpp | 281 +++++++----------- status/addresses-SHC-3BB0A8C1.txt | 1 + 8 files changed, 166 insertions(+), 261 deletions(-) diff --git a/cmake/openshc-sources.txt b/cmake/openshc-sources.txt index e52de3f..e69de29 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 88e1f6a..cfb77d9 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 88c9927..965bdf2 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 6ed1df1..2288312 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 3345191..1524ce0 100644 --- a/src/OpenSHC/OS.func.hpp +++ b/src/OpenSHC/OS.func.hpp @@ -12,7 +12,6 @@ #include "OpenSHC/WindowsHelper/Enums/BOOLEnum.hpp" #include "OpenSHC/WindowsHelper/Enums/OpenFlagInt.hpp" #include "crtdefs.h" -#include "fileapi.h" #include "guiddef.h" #include "mbstring.h" #include "time.h" @@ -23,14 +22,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; @@ -154,20 +157,6 @@ namespace OS_Func { REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x0058277E, &OpenSHC::OS::_ucrt_lseek) _ucrt_lseek; - MACRO_FUNCTION_RESOLVER(longlong(__stdcall*)(long dividend_lowOrder, long dividend_highOrder, long divisor_lowOrder, - long divisor_highOrder), - REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x00582C30, &OpenSHC::OS::__alldiv) - __alldiv; - - MACRO_FUNCTION_RESOLVER(ulonglong(__stdcall*)(ulong factor1_lowOrder, ulong factor1_highOrder, - ulong factor2_lowOrder, ulong factor2_highOrder), - REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x00582CE0, &OpenSHC::OS::__allmul) - __allmul; - - // MACRO_FUNCTION_RESOLVER( - // undefined4(__stdcall*)(), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x005834A0, &OpenSHC::OS::__alloca_probe) - //__alloca_probe; - MACRO_FUNCTION_RESOLVER(int(__cdecl*)(char* _Str1, char* _Str2, size_t _MaxCount), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x005835BB, &OpenSHC::OS::__strnicmp) __strnicmp; @@ -176,18 +165,5 @@ namespace OS_Func { void(__cdecl*)(int _Code), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x00583D55, &OpenSHC::OS::_exit) _exit; - MACRO_FUNCTION_RESOLVER(uint(__cdecl*)(undefined4 param_1, uint param_2), REIMPLEMENTED_CRT, - Address::SHC_3BB0A8C1_0x00588628, &OpenSHC::OS::math_FUN_00588628) - math_FUN_00588628; - - MACRO_FUNCTION_RESOLVER(float10(__fastcall*)(float10 param_1, char* param_2, int param_3, undefined4 param_4, - undefined4 param_5, undefined4 param_6, undefined4 param_7), - REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x0058864B, &OpenSHC::OS::math_FUN_0058864b) - math_FUN_0058864b; - - MACRO_FUNCTION_RESOLVER( - float10(__fastcall*)(), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x005887AE, &OpenSHC::OS::math_FUN_005887ae) - math_FUN_005887ae; - } // namespace OS_Func } // namespace OpenSHC diff --git a/src/OpenSHC/OS.hpp b/src/OpenSHC/OS.hpp index 516d2fa..40d6080 100644 --- a/src/OpenSHC/OS.hpp +++ b/src/OpenSHC/OS.hpp @@ -11,7 +11,6 @@ #include "OpenSHC/WindowsHelper/Enums/BOOLEnum.hpp" #include "OpenSHC/WindowsHelper/Enums/OpenFlagInt.hpp" #include "crtdefs.h" -#include "fileapi.h" #include "guiddef.h" #include "mbstring.h" #include "time.h" @@ -22,9 +21,10 @@ 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); + int __cdecl __isnan(double _X); tm* __cdecl _localtime(time_t* _Time); @@ -89,8 +89,6 @@ namespace OS { int __cdecl _ucrt_lseek(int fileDescriptor, long lDistanceToMove, DWORD moveMethod); - // undefined4 __stdcall __alloca_probe(); - int __cdecl __strnicmp(char* _Str1, char* _Str2, size_t _MaxCount); void __cdecl _exit(int _Code); diff --git a/src/OpenSHC/OS/OS.cpp b/src/OpenSHC/OS/OS.cpp index a2efcb7..02755fb 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 e9317a1..ca283dd 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