From a34014876a87013a15ae467b7891a13e019bed90 Mon Sep 17 00:00:00 2001 From: "[ ]" <[ ]> Date: Mon, 26 May 2025 20:26:00 +0900 Subject: [PATCH] feat: Add `avs_fs_umount()` > only added for avs 2.17.3.0 > change `avs_fs_mount()` return type to avs_file_t (should be avs_handle_t to begin with) > related to #1 --- avs/core.cpp | 4 ++++ avs/core.h | 6 +++++- hooks/avshook.cpp | 2 +- hooks/bmsbhook.cpp | 10 ++++++---- 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/avs/core.cpp b/avs/core.cpp index 32d000b..73bff10 100644 --- a/avs/core.cpp +++ b/avs/core.cpp @@ -38,6 +38,7 @@ namespace avs { AVS_FS_CLOSE_T avs_fs_close {}; AVS_FS_DUMP_MOUNTPOINT_T avs_fs_dump_mountpoint {}; AVS_FS_MOUNT_T avs_fs_mount {}; + AVS_FS_UMOUNT_T avs_fs_umount {}; AVS_FS_COPY_T avs_fs_copy {}; AVS_FS_FSTAT_T avs_fs_fstat {}; AVS_FS_LSTAT_T avs_fs_lstat {}; @@ -1015,6 +1016,7 @@ namespace avs { .avs_fs_close = "XCgsqzn0000055", .avs_fs_dump_mountpoint = "XCgsqzn0000068", .avs_fs_mount = "XCgsqzn000004b", + .avs_fs_umount = "XCgsqzn000004d", .avs_fs_fstat = "XCgsqzn0000062", .avs_fs_lstat = "XCgsqzn0000063", .avs_fs_lseek = "XCgsqzn000004f", @@ -1583,6 +1585,8 @@ namespace avs { DLL_INSTANCE, IMPORTS[ver].avs_fs_dump_mountpoint); avs_fs_mount = libutils::try_proc( DLL_INSTANCE, IMPORTS[ver].avs_fs_mount); + avs_fs_umount = libutils::try_proc( + DLL_INSTANCE, IMPORTS[ver].avs_fs_umount); avs_fs_lstat = libutils::try_proc( DLL_INSTANCE, IMPORTS[ver].avs_fs_lstat); diff --git a/avs/core.h b/avs/core.h index 50644fa..779f25d 100644 --- a/avs/core.h +++ b/avs/core.h @@ -337,6 +337,7 @@ namespace avs { const char *avs_fs_close = "?"; const char *avs_fs_dump_mountpoint = "?"; const char *avs_fs_mount = "?"; + const char *avs_fs_umount = "?"; const char *avs_fs_fstat = "?"; const char *avs_fs_lstat = "?"; const char *avs_fs_lseek = "?"; @@ -512,9 +513,12 @@ namespace avs { typedef int (*AVS_FS_DUMP_MOUNTPOINT_T)(void); extern AVS_FS_DUMP_MOUNTPOINT_T avs_fs_dump_mountpoint; - typedef int (*AVS_FS_MOUNT_T)(const char *mountpoint, const char *fsroot, const char *fstype, void *data); + typedef avs_file_t (*AVS_FS_MOUNT_T)(const char *mountpoint, const char *fsroot, const char *fstype, void *data); extern AVS_FS_MOUNT_T avs_fs_mount; + typedef void (*AVS_FS_UMOUNT_T)(avs_file_t mount); + extern AVS_FS_UMOUNT_T avs_fs_umount; + typedef int (*AVS_FS_COPY_T)(const char *sname, const char *dname); extern AVS_FS_COPY_T avs_fs_copy; diff --git a/hooks/avshook.cpp b/hooks/avshook.cpp index 0fc1cdc..ad6342a 100644 --- a/hooks/avshook.cpp +++ b/hooks/avshook.cpp @@ -171,7 +171,7 @@ static avs::core::avs_file_t avs_fs_opendir(const char *path) { return value; } -static int avs_fs_mount(const char *mountpoint, const char *fsroot, const char *fstype, void *data) { +static avs::core::avs_file_t avs_fs_mount(const char *mountpoint, const char *fsroot, const char *fstype, void *data) { // avs redirection breaks ongaku paradise if (mountpoint == nullptr || fsroot == nullptr || diff --git a/hooks/bmsbhook.cpp b/hooks/bmsbhook.cpp index 1d9a869..0024852 100644 --- a/hooks/bmsbhook.cpp +++ b/hooks/bmsbhook.cpp @@ -34,7 +34,7 @@ int on_avs_fs_lstat(const char *path, struct avs::core::avs_stat *stat) } static avs::core::AVS_FS_MOUNT_T avs_fs_mount_; -int on_avs_fs_mount(const char *mountpoint, const char *fsroot, const char *fstype, void *data) +avs::core::avs_file_t on_avs_fs_mount(const char *mountpoint, const char *fsroot, const char *fstype, void *data) { if (strstr(fsroot, "29095")) { @@ -614,7 +614,8 @@ soundbank::~soundbank() } if (mnt_ != E_NOT_FOUND) { - //_TODO: "XCgsqzn000004d(uint32_t)" avs_fs_umount(mnt_) + log_info("hooks::bmsb", "{}::Bank[CACHE]::Purge mount(0x{:08x})", this->id, mnt_); + avs::core::avs_fs_umount(mnt_); } } @@ -628,7 +629,7 @@ soundbank *soundbank::get_bank(int id) soundbank *bank = new_instance(id); snprintf(bank->avspath, AVSPATHMAX, "data/sound/%05d", id); if (has_format(bank->avspath, ".ifs")) - map_ifs(bank->avspath); + bank->mnt_ = map_ifs(bank->avspath); snprintf(bank->avspath + strlen(bank->avspath), 7, "/%05d", id); if (!(has_format(bank->avspath, ".s3p") || has_format(bank->avspath, ".2dx"))) { @@ -837,11 +838,12 @@ void run_tests() char avspath[AVSPATHMAX] = "data/sound/29095"; soundbank::has_format(avspath, ".ifs"); - soundbank::map_ifs(avspath); + avs::core::avs_file_t mnt = soundbank::map_ifs(avspath); strcat(avspath, "/29095"); soundbank::has_format(avspath, ".s3p"); soundbank::has_format(avspath, ".2dx"); soundbank::has_format(avspath, "_pre.2dx"); + avs::core::avs_fs_umount(mnt); return;