From 6f14b4a5413de9f9f1c8bdb7b57d08dea958f650 Mon Sep 17 00:00:00 2001 From: icex2 Date: Sun, 28 Jan 2024 21:44:30 +0100 Subject: [PATCH 1/8] chore: Apply code formatting --- src/main/acioemu/icca.c | 2 +- src/main/aciotest/bi2a-iidx.c | 146 +++++++++++++++---------------- src/main/aciotest/main.c | 36 ++++---- src/main/ddrio-async/ddrio.c | 83 ++++++++---------- src/main/geninput/hid-meta-out.c | 7 +- src/main/p3ioemu/emu.c | 22 +++-- 6 files changed, 145 insertions(+), 151 deletions(-) diff --git a/src/main/acioemu/icca.c b/src/main/acioemu/icca.c index 134b14fc..e7713e52 100644 --- a/src/main/acioemu/icca.c +++ b/src/main/acioemu/icca.c @@ -511,7 +511,7 @@ static void ac_io_emu_icca_cipher_set_key( resp.cmd.raw[0] = (reader_key >> 24) & 0xFF; resp.cmd.raw[1] = (reader_key >> 16) & 0xFF; resp.cmd.raw[2] = (reader_key >> 8) & 0xFF; - resp.cmd.raw[3] = (reader_key) &0xFF; + resp.cmd.raw[3] = (reader_key) & 0xFF; // so I looked these constants up, this isn't actually a secure key // generator it's actually Marsaglia's "KISS" algorithm with different diff --git a/src/main/aciotest/bi2a-iidx.c b/src/main/aciotest/bi2a-iidx.c index bd391cf8..01315675 100644 --- a/src/main/aciotest/bi2a-iidx.c +++ b/src/main/aciotest/bi2a-iidx.c @@ -29,81 +29,79 @@ bool aciotest_bi2a_iidx_handler_update( return false; } - - printf( - "|---------------------------------------|\n" - "| R Y G B Neons B G Y R |\n" - "| %d %d %d %d %d %d %d %d %d |\n" - "|---------------------------------------|\n" - "| NOW PLAYING: %c%c%c%c%c%c%c%c%c |\n" - "|---------------------------------------|\n" - "| Effect %d S1 S2 S3 S4 S5 Test %d|\n" - "|StartP1 %d %02d %02d %02d %02d %02d StartP2 %d|\n" - "| VEFX %d Service %d|\n" - "_________________________________________\n" - "| __ __ |\n" - "| / \\ _ / \\ |\n" - "| | %03d| %d %d %d |%d| %d %d %d | %03d| |\n" - "| \\___/ %d %d %d %d |_| %d %d %d %d \\___/ |\n" - "| |\n" - "|---------------------------------------|\n" - "|---------------------------------------|\n", - - pout.SPOTLIGHT2[0].l_state, - pout.SPOTLIGHT2[1].l_state, - pout.SPOTLIGHT2[2].l_state, - pout.SPOTLIGHT2[3].l_state, - pout.NEONLAMP.l_state, - pout.SPOTLIGHT1[0].l_state, - pout.SPOTLIGHT1[1].l_state, - pout.SPOTLIGHT1[2].l_state, - pout.SPOTLIGHT1[3].l_state, - - pout.SEG16[0], - pout.SEG16[1], - pout.SEG16[2], - pout.SEG16[3], - pout.SEG16[4], - pout.SEG16[5], - pout.SEG16[6], - pout.SEG16[7], - pout.SEG16[8], - - pin.PANEL.y_effect, - pin.SYSTEM.v_test, - - pin.PANEL.y_start1, - pin.SLIDER1.s_val, - pin.SLIDER2.s_val, - pin.SLIDER3.s_val, - pin.SLIDER4.s_val, - pin.SLIDER5.s_val, - pin.PANEL.y_start2, - - pin.PANEL.y_vefx, - pin.SYSTEM.v_service, - - pin.TURNTABLE1, - pin.P1SW2.b_val, - pin.P1SW4.b_val, - pin.P1SW6.b_val, - pin.SYSTEM.v_coin, - pin.P2SW2.b_val, - pin.P2SW4.b_val, - pin.P2SW6.b_val, - pin.TURNTABLE2, - - pin.P1SW1.b_val, - pin.P1SW3.b_val, - pin.P1SW5.b_val, - pin.P1SW7.b_val, - pin.P2SW1.b_val, - pin.P2SW3.b_val, - pin.P2SW5.b_val, - pin.P2SW7.b_val - - ); + "|---------------------------------------|\n" + "| R Y G B Neons B G Y R |\n" + "| %d %d %d %d %d %d %d %d %d |\n" + "|---------------------------------------|\n" + "| NOW PLAYING: %c%c%c%c%c%c%c%c%c |\n" + "|---------------------------------------|\n" + "| Effect %d S1 S2 S3 S4 S5 Test %d|\n" + "|StartP1 %d %02d %02d %02d %02d %02d StartP2 %d|\n" + "| VEFX %d Service %d|\n" + "_________________________________________\n" + "| __ __ |\n" + "| / \\ _ / \\ |\n" + "| | %03d| %d %d %d |%d| %d %d %d | %03d| |\n" + "| \\___/ %d %d %d %d |_| %d %d %d %d \\___/ |\n" + "| |\n" + "|---------------------------------------|\n" + "|---------------------------------------|\n", + + pout.SPOTLIGHT2[0].l_state, + pout.SPOTLIGHT2[1].l_state, + pout.SPOTLIGHT2[2].l_state, + pout.SPOTLIGHT2[3].l_state, + pout.NEONLAMP.l_state, + pout.SPOTLIGHT1[0].l_state, + pout.SPOTLIGHT1[1].l_state, + pout.SPOTLIGHT1[2].l_state, + pout.SPOTLIGHT1[3].l_state, + + pout.SEG16[0], + pout.SEG16[1], + pout.SEG16[2], + pout.SEG16[3], + pout.SEG16[4], + pout.SEG16[5], + pout.SEG16[6], + pout.SEG16[7], + pout.SEG16[8], + + pin.PANEL.y_effect, + pin.SYSTEM.v_test, + + pin.PANEL.y_start1, + pin.SLIDER1.s_val, + pin.SLIDER2.s_val, + pin.SLIDER3.s_val, + pin.SLIDER4.s_val, + pin.SLIDER5.s_val, + pin.PANEL.y_start2, + + pin.PANEL.y_vefx, + pin.SYSTEM.v_service, + + pin.TURNTABLE1, + pin.P1SW2.b_val, + pin.P1SW4.b_val, + pin.P1SW6.b_val, + pin.SYSTEM.v_coin, + pin.P2SW2.b_val, + pin.P2SW4.b_val, + pin.P2SW6.b_val, + pin.TURNTABLE2, + + pin.P1SW1.b_val, + pin.P1SW3.b_val, + pin.P1SW5.b_val, + pin.P1SW7.b_val, + pin.P2SW1.b_val, + pin.P2SW3.b_val, + pin.P2SW5.b_val, + pin.P2SW7.b_val + + ); return true; } diff --git a/src/main/aciotest/main.c b/src/main/aciotest/main.c index a0da1391..4a301c41 100644 --- a/src/main/aciotest/main.c +++ b/src/main/aciotest/main.c @@ -1,14 +1,14 @@ #include #include -#include #include +#include #include #include "aciodrv/device.h" -#include "aciotest/bi2a-sdvx.h" #include "aciotest/bi2a-iidx.h" +#include "aciotest/bi2a-sdvx.h" #include "aciotest/handler.h" #include "aciotest/icca.h" #include "aciotest/kfca.h" @@ -58,25 +58,23 @@ static bool aciotest_assign_handler( if (bi2a_mode == 255) { printf( "Unknown BI2A mode specified, please check your command.\n" - "Using bi2a-sdvx mode as default, press ENTER to continue\n" - ); + "Using bi2a-sdvx mode as default, press ENTER to continue\n"); bi2a_mode = 0; getchar(); } - switch (bi2a_mode) - { - case 0: - handler->init = aciotest_bi2a_sdvx_handler_init; - handler->update = aciotest_bi2a_sdvx_handler_update; - break; - case 1: - handler->init = aciotest_bi2a_iidx_handler_init; - handler->update = aciotest_bi2a_iidx_handler_update; - break; - - default: - break; + switch (bi2a_mode) { + case 0: + handler->init = aciotest_bi2a_sdvx_handler_init; + handler->update = aciotest_bi2a_sdvx_handler_update; + break; + case 1: + handler->init = aciotest_bi2a_iidx_handler_init; + handler->update = aciotest_bi2a_iidx_handler_update; + break; + + default: + break; } return true; } @@ -107,9 +105,9 @@ int main(int argc, char **argv) } if (argc == 4) { - if(!strcmp(argv[3],"bi2a-iidx")) { + if (!strcmp(argv[3], "bi2a-iidx")) { bi2a_mode = 1; - } else if(!strcmp(argv[3],"bi2a-sdvx")) { + } else if (!strcmp(argv[3], "bi2a-sdvx")) { bi2a_mode = 0; } } diff --git a/src/main/ddrio-async/ddrio.c b/src/main/ddrio-async/ddrio.c index 9b857fd6..fe81f68e 100644 --- a/src/main/ddrio-async/ddrio.c +++ b/src/main/ddrio-async/ddrio.c @@ -28,7 +28,8 @@ typedef uint32_t (*ddr_io_read_pad_t)(void); typedef void (*ddr_io_set_lights_extio_t)(uint32_t extio_lights); typedef void (*ddr_io_set_lights_p3io_t)(uint32_t p3io_lights); typedef void (*ddr_io_set_lights_hdxs_panel_t)(uint32_t hdxs_lights); -typedef void (*ddr_io_set_lights_hdxs_rgb_t)(uint8_t idx, uint8_t r, uint8_t g, uint8_t b); +typedef void (*ddr_io_set_lights_hdxs_rgb_t)( + uint8_t idx, uint8_t r, uint8_t g, uint8_t b); typedef void (*ddr_io_fini_t)(void); static HMODULE _child_ddr_io_module; @@ -66,10 +67,7 @@ static int _io_thread_proc(void *ctx) uint32_t local_tmp; - atomic_store_explicit( - &_io_thread_proc_running, - true, - memory_order_seq_cst); + atomic_store_explicit(&_io_thread_proc_running, true, memory_order_seq_cst); log_info("IO thread running"); @@ -85,18 +83,16 @@ static int _io_thread_proc(void *ctx) local_tmp = _child_ddr_io_read_pad(); atomic_store_explicit( - &_child_ddr_io_data_pad, - local_tmp, - memory_order_relaxed); + &_child_ddr_io_data_pad, local_tmp, memory_order_relaxed); - // Only update outputs when they change gives this loop a major performance boost - // The write calls on a p3io for the outputs are very expensive (~12 ms) as they - // are executed over the ACIO protocol compared to only the input read - // calls (~4 ms) which have a dedicated IOCTL call/endpoint + // Only update outputs when they change gives this loop a major + // performance boost The write calls on a p3io for the outputs are very + // expensive (~12 ms) as they are executed over the ACIO protocol + // compared to only the input read calls (~4 ms) which have a dedicated + // IOCTL call/endpoint local_tmp = atomic_load_explicit( - &_child_ddr_io_data_extio_lights, - memory_order_relaxed); + &_child_ddr_io_data_extio_lights, memory_order_relaxed); if (local_tmp != prev_child_ddr_io_data_extio_lights) { _child_ddr_io_set_lights_extio(local_tmp); @@ -104,9 +100,8 @@ static int _io_thread_proc(void *ctx) } local_tmp = atomic_load_explicit( - &_child_ddr_io_data_p3io_lights, - memory_order_relaxed); - + &_child_ddr_io_data_p3io_lights, memory_order_relaxed); + if (local_tmp != prev_child_ddr_io_data_p3io_lights) { _child_ddr_io_set_lights_p3io(local_tmp); prev_child_ddr_io_data_p3io_lights = local_tmp; @@ -121,22 +116,23 @@ static int _io_thread_proc(void *ctx) time_end = time_get_counter(); total_time = time_get_elapsed_us(time_end - time_start); - log_info("IO thread performance: total iterations %lld, avg. loop cycle time %f us", - loop_counter, ((double) total_time) / loop_counter); + log_info( + "IO thread performance: total iterations %lld, avg. loop cycle time %f " + "us", + loop_counter, + ((double) total_time) / loop_counter); atomic_store_explicit( - &_io_thread_proc_running, - false, - memory_order_seq_cst); + &_io_thread_proc_running, false, memory_order_seq_cst); log_info("IO thread shut down"); return 0; } -static void* _load_function(HMODULE module, const char* name) +static void *_load_function(HMODULE module, const char *name) { - void* ptr; + void *ptr; ptr = GetProcAddress(module, name); @@ -175,13 +171,19 @@ bool ddr_io_init( return false; } - _child_ddr_io_set_loggers = _load_function(_child_ddr_io_module, "ddr_io_set_loggers"); + _child_ddr_io_set_loggers = + _load_function(_child_ddr_io_module, "ddr_io_set_loggers"); _child_ddr_io_init = _load_function(_child_ddr_io_module, "ddr_io_init"); - _child_ddr_io_read_pad = _load_function(_child_ddr_io_module, "ddr_io_read_pad"); - _child_ddr_io_set_lights_extio = _load_function(_child_ddr_io_module, "ddr_io_set_lights_extio"); - _child_ddr_io_set_lights_p3io = _load_function(_child_ddr_io_module, "ddr_io_set_lights_p3io"); - _child_ddr_io_set_lights_hdxs_panel = _load_function(_child_ddr_io_module, "ddr_io_set_lights_hdxs_panel"); - _child_ddr_io_set_lights_hdxs_rgb = _load_function(_child_ddr_io_module, "ddr_io_set_lights_hdxs_rgb"); + _child_ddr_io_read_pad = + _load_function(_child_ddr_io_module, "ddr_io_read_pad"); + _child_ddr_io_set_lights_extio = + _load_function(_child_ddr_io_module, "ddr_io_set_lights_extio"); + _child_ddr_io_set_lights_p3io = + _load_function(_child_ddr_io_module, "ddr_io_set_lights_p3io"); + _child_ddr_io_set_lights_hdxs_panel = + _load_function(_child_ddr_io_module, "ddr_io_set_lights_hdxs_panel"); + _child_ddr_io_set_lights_hdxs_rgb = + _load_function(_child_ddr_io_module, "ddr_io_set_lights_hdxs_rgb"); _child_ddr_io_fini = _load_function(_child_ddr_io_module, "ddr_io_fini"); _child_ddr_io_set_loggers( @@ -199,10 +201,7 @@ bool ddr_io_init( return false; } - atomic_store_explicit( - &_io_thread_proc_loop, - true, - memory_order_seq_cst); + atomic_store_explicit(&_io_thread_proc_loop, true, memory_order_seq_cst); if (!thread_create(_io_thread_proc, NULL, 16384, 0)) { log_warning("Creating IO thread failed"); @@ -224,17 +223,13 @@ uint32_t ddr_io_read_pad(void) void ddr_io_set_lights_extio(uint32_t extio_lights) { atomic_store_explicit( - &_child_ddr_io_data_extio_lights, - extio_lights, - memory_order_relaxed); + &_child_ddr_io_data_extio_lights, extio_lights, memory_order_relaxed); } void ddr_io_set_lights_p3io(uint32_t p3io_lights) { atomic_store_explicit( - &_child_ddr_io_data_p3io_lights, - p3io_lights, - memory_order_relaxed); + &_child_ddr_io_data_p3io_lights, p3io_lights, memory_order_relaxed); } void ddr_io_set_lights_hdxs_panel(uint32_t lights) @@ -249,14 +244,12 @@ void ddr_io_set_lights_hdxs_rgb(uint8_t idx, uint8_t r, uint8_t g, uint8_t b) void ddr_io_fini(void) { - atomic_store_explicit( - &_io_thread_proc_loop, - false, - memory_order_seq_cst); + atomic_store_explicit(&_io_thread_proc_loop, false, memory_order_seq_cst); log_info("Shutting down IO thread and waiting for it to finish..."); - while (atomic_load_explicit(&_io_thread_proc_running, memory_order_seq_cst)) { + while ( + atomic_load_explicit(&_io_thread_proc_running, memory_order_seq_cst)) { Sleep(1); } diff --git a/src/main/geninput/hid-meta-out.c b/src/main/geninput/hid-meta-out.c index 94402835..4f87602a 100644 --- a/src/main/geninput/hid-meta-out.c +++ b/src/main/geninput/hid-meta-out.c @@ -50,8 +50,9 @@ bool hid_meta_out_init( caps_fail: /** * Still allow the device to be used as input. - * Useful for devices like the Sony DUALSHOCK 4, where it indicates it can receive outputs - * but it errors out when trying to initialize an output report. + * Useful for devices like the Sony DUALSHOCK 4, where it indicates it can + * receive outputs but it errors out when trying to initialize an output + * report. */ return true; } @@ -213,7 +214,7 @@ static bool hid_meta_out_init_arrays(struct hid_meta_out *meta) meta->nreports = 0; free(meta->reports); meta->reports = NULL; - + meta->nlights = 0; meta->nbuttons = 0; // Failed out before allocating memory diff --git a/src/main/p3ioemu/emu.c b/src/main/p3ioemu/emu.c index dbf2c8a5..6486d595 100644 --- a/src/main/p3ioemu/emu.c +++ b/src/main/p3ioemu/emu.c @@ -48,8 +48,8 @@ static void p3io_cmd_get_cab_type_or_dipsw( static void p3io_cmd_get_video_freq( const struct p3io_req_get_video_freq *req, struct p3io_resp_get_video_freq *resp); -static void -p3io_cmd_unknown_2b(const struct p3io_req_unknown_2b *req, struct p3io_resp_unknown_2b *resp); +static void p3io_cmd_unknown_2b( + const struct p3io_req_unknown_2b *req, struct p3io_resp_unknown_2b *resp); static void p3io_cmd_init(const struct p3io_req_init *req, struct p3io_resp_init *resp); static void p3io_cmd_get_coinstock( @@ -57,8 +57,9 @@ static void p3io_cmd_get_coinstock( static void p3io_cmd_set_coin_counter( const struct p3io_req_set_coin_counter *req, struct p3io_resp_set_coin_counter *resp); -static void -p3io_cmd_unknown(const struct p3io_req_unknown_generic *req, struct p3io_resp_unknown_generic *resp); +static void p3io_cmd_unknown( + const struct p3io_req_unknown_generic *req, + struct p3io_resp_unknown_generic *resp); void p3io_emu_init(const struct p3io_ops *ops, void *ctx) { @@ -518,8 +519,8 @@ static void p3io_cmd_get_video_freq( } } -static void -p3io_cmd_unknown_2b(const struct p3io_req_unknown_2b *req, struct p3io_resp_unknown_2b *resp) +static void p3io_cmd_unknown_2b( + const struct p3io_req_unknown_2b *req, struct p3io_resp_unknown_2b *resp) { log_misc("Unknown 2b"); @@ -573,10 +574,13 @@ static void p3io_cmd_set_coin_counter( resp->status = 0; } -static void -p3io_cmd_unknown(const struct p3io_req_unknown_generic *req, struct p3io_resp_unknown_generic *resp) +static void p3io_cmd_unknown( + const struct p3io_req_unknown_generic *req, + struct p3io_resp_unknown_generic *resp) { - log_warning("Unsupported P3IO command, sending default response (might not work/crash though): %02x", + log_warning( + "Unsupported P3IO command, sending default response (might not " + "work/crash though): %02x", req->hdr.cmd); p3io_resp_hdr_init(&resp->hdr, sizeof(*resp), &req->hdr); From 9f8fed6fa96ab0c6b7ece512e192664156a7f1a0 Mon Sep 17 00:00:00 2001 From: icex2 Date: Sun, 28 Jan 2024 21:58:24 +0100 Subject: [PATCH 2/8] feat(util): Add func to check if running as admin user This has been a source of common error in the past. It is known that most, or even all, games run into various issues when not run with elevated privileges. --- src/main/util/proc.c | 48 ++++++++++++++++++++++++++++++++++++++++++++ src/main/util/proc.h | 3 +++ 2 files changed, 51 insertions(+) diff --git a/src/main/util/proc.c b/src/main/util/proc.c index 19cec50d..84731133 100644 --- a/src/main/util/proc.c +++ b/src/main/util/proc.c @@ -1,7 +1,55 @@ +#define LOG_MODULE "util-proc" + #include +#include +#include #include +#include "util/log.h" + +bool proc_is_running_as_admin_user() +{ + SID_IDENTIFIER_AUTHORITY authority = SECURITY_NT_AUTHORITY; + PSID sid; + BOOL res; + BOOL is_admin; + + res = AllocateAndInitializeSid( + &authority, + 2, + SECURITY_BUILTIN_DOMAIN_RID, + DOMAIN_ALIAS_RID_ADMINS, + 0, + 0, + 0, + 0, + 0, + 0, + &sid); + + if (!res) { + log_warning( + "Failed to allocate memory for is admin check: %lX", + GetLastError()); + return false; + } + + is_admin = false; + + res = CheckTokenMembership(NULL, sid, &is_admin); + + if (!res) { + log_warning( + "Failed to check admin group membership: %lX", GetLastError()); + return false; + } + + FreeSid(sid); + + return is_admin; +} + void proc_terminate_current_process(uint32_t exit_code) { HANDLE hnd; diff --git a/src/main/util/proc.h b/src/main/util/proc.h index 3dc69062..be47a40d 100644 --- a/src/main/util/proc.h +++ b/src/main/util/proc.h @@ -1,5 +1,8 @@ #pragma once +#include #include +bool proc_is_running_as_admin_user(); + void proc_terminate_current_process(uint32_t exit_code); \ No newline at end of file From 65170c5d4dde4a88faf1c0cc5393775cb1627aaf Mon Sep 17 00:00:00 2001 From: icex2 Date: Sun, 28 Jan 2024 22:01:33 +0100 Subject: [PATCH 3/8] feat: Add new module to scope avs related "utility" stuff Use this to share helpers or other extensions to the original avs API across modules. Start with including error codes to readable strings to improve velocity on AVS API error analysis. --- Module.mk | 1 + src/main/avs-util/Module.mk | 6 +++ src/main/avs-util/error.c | 99 +++++++++++++++++++++++++++++++++++++ src/main/avs-util/error.h | 8 +++ 4 files changed, 114 insertions(+) create mode 100644 src/main/avs-util/Module.mk create mode 100644 src/main/avs-util/error.c create mode 100644 src/main/avs-util/error.h diff --git a/Module.mk b/Module.mk index 4178a424..fc341be1 100644 --- a/Module.mk +++ b/Module.mk @@ -91,6 +91,7 @@ include src/main/acioemu/Module.mk include src/main/aciomgr/Module.mk include src/main/aciotest/Module.mk include src/main/asio/Module.mk +include src/main/avs-util/Module.mk include src/main/bio2drv/Module.mk include src/main/bio2emu-iidx/Module.mk include src/main/bio2emu/Module.mk diff --git a/src/main/avs-util/Module.mk b/src/main/avs-util/Module.mk new file mode 100644 index 00000000..8db06918 --- /dev/null +++ b/src/main/avs-util/Module.mk @@ -0,0 +1,6 @@ +libs += avs-util + +libs_avs-util := \ + +src_avs-util := \ + error.c \ diff --git a/src/main/avs-util/error.c b/src/main/avs-util/error.c new file mode 100644 index 00000000..ab09c014 --- /dev/null +++ b/src/main/avs-util/error.c @@ -0,0 +1,99 @@ +#include "avs-util/error.h" + +#include "util/defs.h" + +struct avs_util_avs_error_str { + avs_error error; + const char *msg; +}; + +static const char *avs_util_error_unknown = "unknown error"; + +// Source: https://github.com/spicetools/spicetools +static const struct avs_util_avs_error_str AVS_UTIL_ERRORS[] = { + {0x80092000, "invalid type"}, + {0x80092001, "type cannot use as array"}, + {0x80092002, "invalid"}, + {0x80092003, "too large data size"}, + {0x80092004, "too small buffer size"}, + {0x80092005, "passcode 0 is not allowed"}, + {0x80092040, "invalid node name"}, + {0x80092041, "invalid attribute name"}, + {0x80092042, "reserved attribute name"}, + {0x80092043, "cannot find node/attribute"}, + {0x80092080, "cannot allocate node"}, + {0x80092081, "cannot allocate node value"}, + {0x80092082, "cannot allocate mdigest for finger-print"}, + {0x80092083, "cannot allocate nodename"}, + {0x800920C0, "node type differs"}, + {0x800920C1, "node type is VOID"}, + {0x800920C2, "node is array"}, + {0x800920C3, "node is not array"}, + {0x80092100, "node is create-disabled"}, + {0x80092101, "node is read-disabled"}, + {0x80092102, "node is write-disabled"}, + {0x80092103, "flag is already locked"}, + {0x80092104, "passcode differs"}, + {0x80092105, "insert_read() is applied to attribute"}, + {0x80092106, "part_write() is applied to attribute"}, + {0x80092107, "MODE_EXTEND flag differs"}, + {0x80092140, "root node already exists"}, + {0x80092141, "attribute cannot have children"}, + {0x80092142, "node/attribute already exists"}, + {0x80092143, "number of nodes exceeds 65535"}, + {0x80092144, "cannot interpret as number"}, + {0x80092145, "property is empty"}, + {0x80092180, "I/O error"}, + {0x80092181, "unexpected EOF"}, + {0x80092182, "unknown format"}, + {0x800921C0, "broken magic"}, + {0x800921C1, "broken metadata"}, + {0x800921C2, "broken databody"}, + {0x800921C3, "invalid type"}, + {0x800921C4, "too large data size"}, + {0x800921C5, "too long node/attribute name"}, + {0x800921C6, "attribute name is too long"}, + {0x800921C7, "node/attribute already exists"}, + {0x80092200, "invalid encoding"}, + {0x80092201, "invalid XML token"}, + {0x80092202, "XML syntax error"}, + {0x80092203, "start tag / end tag mismatch"}, + {0x80092204, "too large node data (__size mismatch)"}, + {0x80092205, "too deep node tree"}, + {0x80092206, "invalid type"}, + {0x80092207, "invalid size"}, + {0x80092208, "invalid count"}, + {0x80092209, "invalid value"}, + {0x8009220A, "invalid node name"}, + {0x8009220B, "invalid attribute name"}, + {0x8009220C, "reserved attribute name"}, + {0x8009220D, "node/attribute already exists"}, + {0x8009220E, "too many elements in node data"}, + {0x80092240, "JSON syntax error"}, + {0x80092241, "invalid JSON literal"}, + {0x80092242, "invalid JSON number"}, + {0x80092243, "invalid JSON string"}, + {0x80092244, "invalid JSON object name"}, + {0x80092245, "object name already exists"}, + {0x80092246, "too long JSON object name"}, + {0x80092247, "too deep JSON object/array nesting"}, + {0x80092248, "cannot convert JSON array to property"}, + {0x80092249, "cannot convert empty JSON object to property"}, + {0x8009224A, "root node already exists"}, + {0x8009224B, "cannot convert root node to TYPE_ARRAY"}, + {0x8009224C, "name represents reserved attribute"}, + {0x80092280, "finger-print differs"}, + {0x800922C0, "operation is not supported"}}; + +const char *avs_util_error_str(avs_error error) +{ + int i; + + for (i = 0; i < lengthof(AVS_UTIL_ERRORS); i++) { + if (error == AVS_UTIL_ERRORS[i].error) { + return AVS_UTIL_ERRORS[i].msg; + } + } + + return avs_util_error_unknown; +} \ No newline at end of file diff --git a/src/main/avs-util/error.h b/src/main/avs-util/error.h new file mode 100644 index 00000000..35988515 --- /dev/null +++ b/src/main/avs-util/error.h @@ -0,0 +1,8 @@ +#ifndef AVS_UTIL_ERROR_H +#define AVS_UTIL_ERROR_H + +#include "imports/avs.h" + +const char *avs_util_error_str(avs_error error); + +#endif \ No newline at end of file From eaee07be7d56c6deb69bd9eaa31fb9c18243438e Mon Sep 17 00:00:00 2001 From: icex2 Date: Sun, 28 Jan 2024 22:02:45 +0100 Subject: [PATCH 4/8] feat(avs-api): Various improvements * Improve psmap types, taken from a private eamuse server backend which had more complete mappings. * Move psmap terminator to enum * AVS error type: Supports improving expressiveness of the API interface * Add more property node related functions Add more AVS file system related functions These were previously missing and are required for various file system related tasks such as iterating directory trees, reading and writing files through the AVS file system for the upcoming launcher rework. Note that the AVS API broke with some mode flags after version 2.13.06. --- src/imports/avs.h | 121 +++++++++++++++++++++++++++++++++++++++------- 1 file changed, 104 insertions(+), 17 deletions(-) diff --git a/src/imports/avs.h b/src/imports/avs.h index ff48a33e..a2d439ec 100644 --- a/src/imports/avs.h +++ b/src/imports/avs.h @@ -4,6 +4,7 @@ #include #include #include +#include enum property_create_flag { PROPERTY_FLAG_READ = 0x1, @@ -26,18 +27,39 @@ enum property_node_traversal { }; enum property_type { - PROPERTY_TYPE_VOID = 1, - PROPERTY_TYPE_S8 = 2, - PROPERTY_TYPE_U8 = 3, - PROPERTY_TYPE_S16 = 4, - PROPERTY_TYPE_U16 = 5, - PROPERTY_TYPE_S32 = 6, - PROPERTY_TYPE_U32 = 7, - PROPERTY_TYPE_S64 = 8, - PROPERTY_TYPE_U64 = 9, - PROPERTY_TYPE_BIN = 10, - PROPERTY_TYPE_STR = 11, - PROPERTY_TYPE_BOOL = 52 + PROPERTY_TYPE_VOID = 0x01, + PROPERTY_TYPE_S8 = 0x02, + PROPERTY_TYPE_U8 = 0x03, + PROPERTY_TYPE_S16 = 0x04, + PROPERTY_TYPE_U16 = 0x05, + PROPERTY_TYPE_S32 = 0x06, + PROPERTY_TYPE_U32 = 0x07, + PROPERTY_TYPE_S64 = 0x08, + PROPERTY_TYPE_U64 = 0x09, + PROPERTY_TYPE_BIN = 0x0A, + PROPERTY_TYPE_STR = 0x0B, + PROPERTY_TYPE_IP4 = 0x0C, + PROPERTY_TYPE_TIME = 0x0D, + PROPERTY_TYPE_FLOAT = 0x0E, + PROPERTY_TYPE_DOUBLE = 0x0F, + PROPERTY_TYPE_4U8 = 0x25, + PROPERTY_TYPE_ATTR = 0x2E, + PROPERTY_TYPE_BOOL = 0x34, + + // Missing __type attribute + PROPERTY_TYPE_VOID_WITH_ATTRIBUTES = 0x40 | PROPERTY_TYPE_VOID, + PROPERTY_TYPE_ARRAY_S8 = 0x40 | PROPERTY_TYPE_S8, + PROPERTY_TYPE_ARRAY_U8 = 0x40 | PROPERTY_TYPE_U8, + PROPERTY_TYPE_ARRAY_S16 = 0x40 | PROPERTY_TYPE_S16, + PROPERTY_TYPE_ARRAY_U16 = 0x40 | PROPERTY_TYPE_U16, + PROPERTY_TYPE_ARRAY_S32 = 0x40 | PROPERTY_TYPE_S32, + PROPERTY_TYPE_ARRAY_U32 = 0x40 | PROPERTY_TYPE_U32, + PROPERTY_TYPE_ARRAY_S64 = 0x40 | PROPERTY_TYPE_S64, + PROPERTY_TYPE_ARRAY_U64 = 0x40 | PROPERTY_TYPE_U64, + PROPERTY_TYPE_ARRAY_TIME = 0x40 | PROPERTY_TYPE_TIME, + PROPERTY_TYPE_ARRAY_BOOL = 0x40 | PROPERTY_TYPE_BOOL, + + PROPERTY_TYPE_STR_WITH_ATTRIBUTES = 0x40 | PROPERTY_TYPE_STR, }; struct property; @@ -66,6 +88,7 @@ enum psmap_type { PSMAP_TYPE_STR = 10, PSMAP_TYPE_ATTR = 45, PSMAP_TYPE_BOOL = 50, + PSMAP_TYPE_TERMINATOR = 0xFF, }; #define PSMAP_FLAG_HAVE_DEFAULT 0x01 @@ -102,7 +125,7 @@ struct property_psmap { #define PSMAP_END \ { \ - 0xFF, 0, 0, 0, NULL, 0 \ + PSMAP_TYPE_TERMINATOR, 0, 0, 0, NULL, 0 \ } \ } \ ; @@ -160,6 +183,11 @@ void avs_boot( void avs_shutdown(void); +typedef uint32_t avs_desc; +typedef int avs_error; + +#define AVS_IS_ERROR(x) x < 0 + void log_body_fatal(const char *module, const char *fmt, ...); void log_body_info(const char *module, const char *fmt, ...); void log_body_misc(const char *module, const char *fmt, ...); @@ -187,6 +215,7 @@ int property_insert_read( uint32_t context); int property_mem_write(struct property *prop, void *bytes, int nbytes); void *property_desc_to_buffer(struct property *prop); +avs_error property_query_size(struct property *prop); void property_file_write(struct property *prop, const char *path); int property_set_flag(struct property *prop, int flags, int mask); void property_destroy(struct property *prop); @@ -203,8 +232,8 @@ int property_psmap_export( const struct property_psmap *psmap); struct property_node *property_node_clone( - struct property *new_parent, - int unk0, + struct property *parent_prop, + struct property_node *parent_node, struct property_node *src, bool deep); struct property_node *property_node_create( @@ -226,15 +255,73 @@ void property_node_remove(struct property_node *node); enum property_type property_node_type(struct property_node *node); struct property_node *property_node_traversal( struct property_node *node, enum property_node_traversal direction); -void property_node_datasize(struct property_node *node); +int property_node_datasize(struct property_node *node); +avs_error property_node_read(struct property_node *node, enum property_type type, void* data, uint32_t data_size); + +static inline void property_remove(struct property *prop, struct property_node *node, const char *path) +{ + struct property_node *cur = property_search(prop, node, path); + while (cur) { + struct property_node *next = property_node_traversal(node, TRAVERSE_NEXT_SEARCH_RESULT); + property_node_remove(cur); + cur = next; + } +} bool std_getenv(const char *key, char *val, uint32_t nbytes); void std_setenv(const char *key, const char *val); -void* avs_fs_open(const char* path, int mode, int flags); +struct avs_stat { + uint64_t st_atime; + uint64_t st_mtime; + uint64_t st_ctime; + uint32_t unk1; + uint32_t filesize; + struct stat padding; +}; + +#if AVS_VERSION <= 1306 +enum avs_file_mode { + AVS_FILE_READ = 0x00, + AVS_FILE_WRITE = 0x01, + AVS_FILE_READ_WRITE = 0x02, + AVS_FILE_CREATE = 0x10, + AVS_FILE_TRUNCATE = 0x20, + AVS_FILE_EXCLUSIVE = 0x80, +}; +#else +enum avs_file_mode { + AVS_FILE_READ = 0x01, + AVS_FILE_WRITE = 0x02, + AVS_FILE_CREATE = 0x10, + AVS_FILE_TRUNCATE = 0x20, + AVS_FILE_EXCLUSIVE = 0x80, +}; +#endif + +enum avs_file_flag { + AVS_FILE_FLAG_SHARE_READ = 0x124, + AVS_FILE_FLAG_SHARE_WRITE = 0x92, +}; + +enum avs_seek_origin { + AVS_SEEK_SET = 0, + AVS_SEEK_CUR = 1, + AVS_SEEK_END = 2, +}; + +avs_desc avs_fs_open(const char *path, uint16_t mode, int flags); +int avs_fs_close(avs_desc desc); +size_t avs_fs_read(avs_desc desc, char *buf, uint32_t sz); +int avs_fs_lseek(avs_desc desc, long pos, int whence); +int avs_fs_lstat(const char *path, struct avs_stat *st); +int avs_fs_copy(const char *src, const char *dest); int avs_fs_addfs(void *filesys_struct); int avs_fs_mount( const char *mountpoint, const char *fsroot, const char *fstype, void *data); +avs_desc avs_fs_opendir(const char *path); +const char* avs_fs_readdir(avs_desc dir); +void avs_fs_closedir(avs_desc dir); bool avs_is_active(); From 5a8119fbe4161a339ca3161889f9226b89fcc71d Mon Sep 17 00:00:00 2001 From: icex2 Date: Sun, 28 Jan 2024 22:09:24 +0100 Subject: [PATCH 5/8] feat(avs imports): Add lib export definitions of new AVS API functions Add all functions and their respective ordinals (and mangled names for documentation purpose) to all currently used AVS version. --- src/imports/import_32_0_avs.def | 7 +++++++ src/imports/import_32_1002_avs.def | 11 +++++++++++ src/imports/import_32_1101_avs.def | 16 ++++++++++++++++ src/imports/import_32_1304_avs.def | 15 +++++++++++++++ src/imports/import_32_1403_avs.def | 16 ++++++++++++++++ src/imports/import_32_1508_avs.def | 13 +++++++++++++ src/imports/import_32_1601_avs.def | 17 +++++++++++++++++ src/imports/import_32_1603_avs.def | 17 +++++++++++++++++ src/imports/import_32_1700_avs.def | 17 +++++++++++++++++ src/imports/import_32_803_avs.def | 7 +++++++ src/imports/import_64_1508_avs.def | 13 +++++++++++++ src/imports/import_64_1509_avs.def | 13 +++++++++++++ src/imports/import_64_1601_avs.def | 17 +++++++++++++++++ src/imports/import_64_1603_avs.def | 17 +++++++++++++++++ src/imports/import_64_1700_avs.def | 17 +++++++++++++++++ 15 files changed, 213 insertions(+) diff --git a/src/imports/import_32_0_avs.def b/src/imports/import_32_0_avs.def index cb2ea9d1..273e5be8 100644 --- a/src/imports/import_32_0_avs.def +++ b/src/imports/import_32_0_avs.def @@ -2,6 +2,12 @@ LIBRARY libavs-win32 EXPORTS avs_boot + avs_fs_close + avs_fs_copy + avs_fs_lseek + avs_fs_lstat + avs_fs_open + avs_fs_read avs_net_ctrl avs_shutdown avs_thread_create @@ -26,6 +32,7 @@ EXPORTS property_node_clone property_node_create property_node_name + property_node_read property_node_refer property_node_remove property_node_type diff --git a/src/imports/import_32_1002_avs.def b/src/imports/import_32_1002_avs.def index 6d1fd136..e2ff5ae5 100644 --- a/src/imports/import_32_1002_avs.def +++ b/src/imports/import_32_1002_avs.def @@ -2,6 +2,15 @@ LIBRARY libavs-win32 EXPORTS avs_boot + avs_fs_close + avs_fs_copy + avs_fs_lseek + avs_fs_lstat + avs_fs_open + avs_fs_read + avs_fs_opendir + avs_fs_readdir + avs_fs_closedir avs_net_ctrl avs_shutdown avs_thread_create @@ -27,11 +36,13 @@ EXPORTS property_node_create property_node_datasize property_node_name + property_node_read property_node_refer property_node_remove property_node_type property_node_traversal property_node_refdata + property_query_size property_psmap_export property_psmap_import std_getenv diff --git a/src/imports/import_32_1101_avs.def b/src/imports/import_32_1101_avs.def index cfc6f9b5..10c59e4f 100644 --- a/src/imports/import_32_1101_avs.def +++ b/src/imports/import_32_1101_avs.def @@ -2,6 +2,15 @@ LIBRARY libavs-win32 EXPORTS avs_boot @22 NONAME + avs_fs_close @60 NONAME + avs_fs_copy @63 NONAME + avs_fs_lseek @70 NONAME + avs_fs_lstat @71 NONAME + avs_fs_open @75 NONAME + avs_fs_read @77 NONAME + avs_fs_opendir @76 NONAME + avs_fs_readdir @78 NONAME + avs_fs_closedir @61 NONAME avs_net_ctrl @107 NONAME avs_shutdown @140 NONAME avs_thread_create @156 NONAME @@ -19,8 +28,15 @@ EXPORTS property_insert_read @255 NONAME property_node_create @266 NONAME property_node_datasize @267 NONAME + property_node_name @274 NONAME + property_node_read @276 NONAME property_node_refer @278 NONAME property_node_remove @279 NONAME + property_node_type @282 NONAME + property_node_clone @280 NONAME + property_node_traversal @282 NONAME + property_node_refdata @277 NONAME + property_query_size @290 NONAME property_psmap_import @288 NONAME property_psmap_export @287 NONAME property_read_query_memsize @291 NONAME diff --git a/src/imports/import_32_1304_avs.def b/src/imports/import_32_1304_avs.def index 489944a7..f83d5a5f 100644 --- a/src/imports/import_32_1304_avs.def +++ b/src/imports/import_32_1304_avs.def @@ -2,7 +2,15 @@ LIBRARY libavs-win32 EXPORTS avs_boot @237 NONAME + avs_fs_close @276 NONAME + avs_fs_copy @283 NONAME + avs_fs_lseek @16 NONAME + avs_fs_lstat @97 NONAME avs_fs_open @178 NONAME + avs_fs_read @306 NONAME + avs_fs_opendir @216 NONAME + avs_fs_readdir @130 NONAME + avs_fs_closedir @131 NONAME avs_net_ctrl @15 NONAME avs_shutdown @333 NONAME avs_thread_create @183 NONAME @@ -19,8 +27,15 @@ EXPORTS property_insert_read @23 NONAME property_node_create @316 NONAME property_node_datasize @249 NONAME + property_node_name @255 NONAME + property_node_read @2 NONAME property_node_refer @268 NONAME property_node_remove @129 NONAME + property_node_type @329 NONAME + property_node_clone @130 NONAME + property_node_traversal @93 NONAME + property_node_refdata @330 NONAME == XC058ba5000151 + property_query_size @250 NONAME == XC058ba5000101 property_psmap_import @102 NONAME property_psmap_export @110 NONAME property_read_query_memsize @100 NONAME diff --git a/src/imports/import_32_1403_avs.def b/src/imports/import_32_1403_avs.def index 32d68b11..de171c12 100644 --- a/src/imports/import_32_1403_avs.def +++ b/src/imports/import_32_1403_avs.def @@ -2,6 +2,15 @@ LIBRARY libavs-win32 EXPORTS avs_boot @298 NONAME + avs_fs_close @573 NONAME == XC0bbe97000119 + avs_fs_copy @573 NONAME == XC0bbe97000120 + avs_fs_lseek @573 NONAME == + avs_fs_lstat @573 NONAME == XC0bbe9700005f + avs_fs_open @573 NONAME == XC0bbe970000b3 + avs_fs_read @573 NONAME == + avs_fs_opendir @573 NONAME == XC0bbe970000db + avs_fs_readdir @573 NONAME == + avs_fs_closedir @573 NONAME == avs_net_ctrl @100 NONAME avs_shutdown @299 NONAME avs_thread_create @6 NONAME @@ -15,7 +24,14 @@ EXPORTS property_desc_to_buffer @131 NONAME property_destroy @130 NONAME property_insert_read @133 NONAME + property_node_name @573 NONAME == + property_node_read @573 NONAME == property_node_remove @148 NONAME + property_node_type @573 NONAME == + property_node_clone @149 NONAME + property_node_traversal @151 NONAME + property_node_refdata @573 NONAME == + property_query_size @573 NONAME == property_psmap_import @163 NONAME property_psmap_export @164 NONAME property_read_query_memsize @161 NONAME diff --git a/src/imports/import_32_1508_avs.def b/src/imports/import_32_1508_avs.def index 05419ed7..d1625126 100644 --- a/src/imports/import_32_1508_avs.def +++ b/src/imports/import_32_1508_avs.def @@ -5,8 +5,13 @@ EXPORTS avs_fs_close @65 NONAME avs_fs_lseek @59 NONAME avs_fs_lseek64 @60 NONAME + avs_fs_lstat @79 NONAME avs_fs_open @58 NONAME avs_fs_read @61 NONAME + avs_fs_copy @81 NONAME + avs_fs_opendir @72 NONAME == XCd229cc0000f0 + avs_fs_readdir @73 NONAME == XCd229cc0000bb + avs_fs_closedir @74 NONAME == XCd229cc0000b8 avs_net_ctrl @98 NONAME avs_shutdown @286 NONAME avs_thread_create @6 NONAME @@ -22,8 +27,16 @@ EXPORTS property_destroy @128 NONAME property_insert_read @131 NONAME property_node_create @145 NONAME + property_node_name @150 NONAME + property_node_read @154 NONAME == XCd229cc0000f3 property_node_refer @158 NONAME property_node_remove @146 NONAME + property_node_type @151 NONAME == XCd229cc000071 + property_node_clone @147 NONAME + property_node_traversal @149 NONAME + property_node_refdata @148 NONAME == XCd229cc00009f + property_node_datasize @153 NONAME == XCd229cc000083 + property_query_size @142 NONAME == XCd229cc000032 property_psmap_export @162 NONAME property_psmap_import @161 NONAME property_read_query_memsize @159 NONAME diff --git a/src/imports/import_32_1601_avs.def b/src/imports/import_32_1601_avs.def index e260a8c6..74332d48 100644 --- a/src/imports/import_32_1601_avs.def +++ b/src/imports/import_32_1601_avs.def @@ -1,6 +1,15 @@ LIBRARY libavs-win32 EXPORTS + avs_fs_close @65 NONAME + avs_fs_copy @81 NONAME + avs_fs_lseek @59 NONAME + avs_fs_lstat @79 NONAME + avs_fs_open @58 NONAME + avs_fs_read @61 NONAME + avs_fs_opendir @72 NONAME == XCnbrep7000047 + avs_fs_readdir @73 NONAME == XCnbrep7000048 + avs_fs_closedir @74 NONAME == XCnbrep7000049 avs_thread_create @5 NONAME avs_thread_destroy @7 NONAME avs_thread_exit @11 NONAME @@ -12,7 +21,15 @@ EXPORTS property_insert_read @128 NONAME property_search @141 NONAME property_node_create @142 NONAME + property_node_name @147 NONAME == XCnbrep7000092 property_node_remove @143 NONAME + property_node_type @148 NONAME == XCnbrep7000093 + property_node_clone @144 NONAME + property_node_traversal @146 NONAME + property_node_refdata @145 NONAME == XCnbrep7000090 + property_node_datasize @150 NONAME == XCnbrep7000095 + property_node_read @151 NONAME == XCnbrep7000096 + property_query_size @139 NONAME == XCnbrep700008a property_node_refer @155 NONAME property_read_query_memsize @156 NONAME property_psmap_export @159 NONAME diff --git a/src/imports/import_32_1603_avs.def b/src/imports/import_32_1603_avs.def index 98f5fe7a..21f55c1e 100644 --- a/src/imports/import_32_1603_avs.def +++ b/src/imports/import_32_1603_avs.def @@ -1,6 +1,15 @@ LIBRARY libavs-win32 EXPORTS + avs_fs_close @86 NONAME == XCnbrep7000055 + avs_fs_copy @102 NONAME == XCnbrep7000065 + avs_fs_lseek @80 NONAME == XCnbrep700004f + avs_fs_lstat @100 NONAME == XCnbrep7000063 + avs_fs_open @79 NONAME == XCnbrep700004e + avs_fs_read @82 NONAME == XCnbrep7000051 + avs_fs_opendir @93 NONAME == XCnbrep700005c + avs_fs_readdir @94 NONAME == XCnbrep700005d + avs_fs_closedir @95 NONAME == XCnbrep700005e avs_thread_create @5 NONAME avs_thread_destroy @7 NONAME avs_thread_exit @11 NONAME @@ -12,7 +21,15 @@ EXPORTS property_insert_read @149 NONAME property_search @162 NONAME property_node_create @163 NONAME + property_node_name @168 NONAME == XCnbrep70000a7 property_node_remove @164 NONAME + property_node_type @169 NONAME == XCnbrep70000a8 + property_node_clone @165 NONAME + property_node_traversal @167 NONAME + property_node_refdata @166 NONAME == XCnbrep70000a5 + property_node_datasize @171 NONAME == XCnbrep70000aa + property_query_size @160 NONAME == XCnbrep700009f + property_node_read @172 NONAME == XCnbrep70000ab property_node_refer @176 NONAME property_read_query_memsize @177 NONAME property_psmap_import @179 NONAME diff --git a/src/imports/import_32_1700_avs.def b/src/imports/import_32_1700_avs.def index d8944d9b..7dc4eaa8 100644 --- a/src/imports/import_32_1700_avs.def +++ b/src/imports/import_32_1700_avs.def @@ -6,7 +6,16 @@ EXPORTS avs_thread_exit @11 NONAME avs_thread_join @12 NONAME avs_fs_addfs @73 NONAME + avs_fs_close @86 NONAME == XCgsqzn0000055 + avs_fs_copy @102 NONAME == XCgsqzn0000065 + avs_fs_lseek @80 NONAME == XCgsqzn000004f + avs_fs_lstat @100 NONAME == XCgsqzn0000063 avs_fs_mount @76 NONAME + avs_fs_open @79 NONAME == XCgsqzn000004e + avs_fs_read @82 NONAME == XCgsqzn0000051 + avs_fs_opendir @93 NONAME == XCgsqzn000005c + avs_fs_readdir @94 NONAME == XCgsqzn000005d + avs_fs_closedir @95 NONAME == XCgsqzn000005e avs_net_ctrl @119 NONAME property_create @145 NONAME property_destroy @146 NONAME @@ -14,7 +23,15 @@ EXPORTS property_insert_read @149 NONAME property_search @162 NONAME property_node_create @163 NONAME + property_node_name @168 NONAME == XCgsqzn00000a7 property_node_remove @164 NONAME + property_node_type @169 NONAME == XCgsqzn00000a8 + property_node_clone @165 NONAME + property_node_traversal @167 NONAME + property_node_refdata @166 NONAME == XCgsqzn00000a5 + property_node_datasize @171 NONAME == XCgsqzn00000aa + property_node_read @172 NONAME == XCgsqzn00000ab + property_query_size @160 NONAME == XCgsqzn000009f property_node_refer @176 NONAME property_read_query_memsize @177 NONAME property_psmap_import @179 NONAME diff --git a/src/imports/import_32_803_avs.def b/src/imports/import_32_803_avs.def index a7f59b51..37f2b3e6 100644 --- a/src/imports/import_32_803_avs.def +++ b/src/imports/import_32_803_avs.def @@ -2,6 +2,12 @@ LIBRARY libavs-win32 EXPORTS avs_boot + avs_fs_close + avs_fs_copy + avs_fs_lseek + avs_fs_lstat + avs_fs_open + avs_fs_read avs_net_ctrl avs_shutdown avs_thread_create @@ -27,6 +33,7 @@ EXPORTS property_node_create property_node_datasize property_node_name + property_node_read property_node_refer property_node_remove property_node_type diff --git a/src/imports/import_64_1508_avs.def b/src/imports/import_64_1508_avs.def index bc9fbf06..6aeaba1d 100644 --- a/src/imports/import_64_1508_avs.def +++ b/src/imports/import_64_1508_avs.def @@ -3,10 +3,15 @@ LIBRARY libavs-win64 EXPORTS avs_boot @285 NONAME avs_fs_close @65 NONAME + avs_fs_copy @81 NONAME avs_fs_lseek @59 NONAME avs_fs_lseek64 @60 NONAME + avs_fs_lstat @79 NONAME avs_fs_open @58 NONAME avs_fs_read @61 NONAME + avs_fs_opendir @72 NONAME == XCd229cc0000f0 + avs_fs_readdir @73 NONAME == XCd229cc0000bb + avs_fs_closedir @74 NONAME == XCd229cc0000b8 avs_net_ctrl @98 NONAME avs_shutdown @286 NONAME avs_thread_create @6 NONAME @@ -22,8 +27,16 @@ EXPORTS property_destroy @128 NONAME property_insert_read @131 NONAME property_node_create @145 NONAME + property_node_name @150 NONAME + property_node_read @154 NONAME == XCd229cc0000f3 property_node_refer @158 NONAME property_node_remove @146 NONAME + property_node_type @151 NONAME == XCd229cc000071 + property_node_clone @147 NONAME + property_node_traversal @149 NONAME + property_node_refdata @148 NONAME == XCd229cc00009f + property_node_datasize @153 NONAME == XCd229cc000083 + property_query_size @142 NONAME == XCd229cc000032 property_psmap_export @162 NONAME property_psmap_import @161 NONAME property_read_query_memsize @159 NONAME diff --git a/src/imports/import_64_1509_avs.def b/src/imports/import_64_1509_avs.def index ae6110a2..fde35d65 100644 --- a/src/imports/import_64_1509_avs.def +++ b/src/imports/import_64_1509_avs.def @@ -3,10 +3,15 @@ LIBRARY libavs-win64 EXPORTS avs_boot @285 NONAME avs_fs_close @65 NONAME + avs_fs_copy @81 NONAME avs_fs_lseek @59 NONAME avs_fs_lseek64 @60 NONAME + avs_fs_lstat @78 NONAME avs_fs_open @58 NONAME avs_fs_read @61 NONAME + avs_fs_opendir @573 NONAME == + avs_fs_readdir @573 NONAME == + avs_fs_closedir @573 NONAME == avs_net_ctrl @98 NONAME avs_shutdown @286 NONAME avs_thread_create @6 NONAME @@ -22,8 +27,16 @@ EXPORTS property_destroy @128 NONAME property_insert_read @131 NONAME property_node_create @145 NONAME + property_node_name @573 NONAME == + property_node_read @573 NONAME == + property_query_size @573 NONAME == property_node_refer @158 NONAME property_node_remove @146 NONAME + property_node_type @573 NONAME == + property_node_clone @147 NONAME + property_node_traversal @149 NONAME + property_node_refdata @573 NONAME == + property_node_datasize @573 NONAME == property_psmap_export @162 NONAME property_psmap_import @161 NONAME property_read_query_memsize @159 NONAME diff --git a/src/imports/import_64_1601_avs.def b/src/imports/import_64_1601_avs.def index 5bbe4528..418395f7 100644 --- a/src/imports/import_64_1601_avs.def +++ b/src/imports/import_64_1601_avs.def @@ -1,6 +1,15 @@ LIBRARY libavs-win64 EXPORTS + avs_fs_close @65 NONAME + avs_fs_copy @81 NONAME + avs_fs_lseek @59 NONAME + avs_fs_lstat @79 NONAME + avs_fs_open @58 NONAME + avs_fs_read @61 NONAME + avs_fs_opendir @72 NONAME == XCnbrep7000047 + avs_fs_readdir @73 NONAME == XCnbrep7000048 + avs_fs_closedir @74 NONAME == XCnbrep7000049 avs_thread_create @5 NONAME avs_thread_destroy @7 NONAME avs_thread_exit @11 NONAME @@ -12,7 +21,15 @@ EXPORTS property_insert_read @128 NONAME property_search @141 NONAME property_node_create @142 NONAME + property_node_name @147 NONAME == XCnbrep7000092 property_node_remove @143 NONAME + property_node_type @148 NONAME == XCnbrep7000093 + property_node_clone @144 NONAME + property_node_traversal @146 NONAME + property_node_refdata @145 NONAME == XCnbrep7000090 + property_node_datasize @150 NONAME == XCnbrep7000095 + property_node_read @151 NONAME == XCnbrep7000096 + property_query_size @139 NONAME == XCnbrep700008a property_node_refer @155 NONAME property_read_query_memsize @156 NONAME property_psmap_export @159 NONAME diff --git a/src/imports/import_64_1603_avs.def b/src/imports/import_64_1603_avs.def index 0355922f..b106ab1b 100644 --- a/src/imports/import_64_1603_avs.def +++ b/src/imports/import_64_1603_avs.def @@ -1,6 +1,15 @@ LIBRARY libavs-win64 EXPORTS + avs_fs_close @86 NONAME == XCnbrep7000055 + avs_fs_copy @102 NONAME == XCnbrep7000065 + avs_fs_lseek @80 NONAME == XCnbrep700004f + avs_fs_lstat @100 NONAME == XCnbrep7000063 + avs_fs_open @79 NONAME == XCnbrep700004e + avs_fs_read @82 NONAME == XCnbrep7000051 + avs_fs_opendir @93 NONAME == XCnbrep700005c + avs_fs_readdir @94 NONAME == XCnbrep700005d + avs_fs_closedir @95 NONAME == XCnbrep700005e avs_thread_create @5 NONAME avs_thread_destroy @7 NONAME avs_thread_exit @11 NONAME @@ -12,7 +21,15 @@ EXPORTS property_insert_read @149 NONAME property_search @162 NONAME property_node_create @163 NONAME + property_node_name @168 NONAME == XCnbrep70000a7 property_node_remove @164 NONAME + property_node_type @169 NONAME == XCnbrep70000a8 + property_node_clone @165 NONAME + property_node_traversal @167 NONAME + property_node_refdata @166 NONAME == XCnbrep70000a5 + property_node_datasize @171 NONAME == XCnbrep70000aa + property_node_read @172 NONAME == XCnbrep70000ab + property_query_size @160 NONAME == XCnbrep700009f property_node_refer @176 NONAME property_read_query_memsize @177 NONAME property_psmap_import @179 NONAME diff --git a/src/imports/import_64_1700_avs.def b/src/imports/import_64_1700_avs.def index fe8cc6e6..8cddba8a 100644 --- a/src/imports/import_64_1700_avs.def +++ b/src/imports/import_64_1700_avs.def @@ -6,7 +6,16 @@ EXPORTS avs_thread_exit @11 NONAME avs_thread_join @12 NONAME avs_fs_addfs @73 NONAME + avs_fs_close @86 NONAME == XCgsqzn0000055 + avs_fs_copy @102 NONAME == XCgsqzn0000065 + avs_fs_lseek @80 NONAME == XCgsqzn000004f + avs_fs_lstat @100 NONAME == XCgsqzn0000063 avs_fs_mount @76 NONAME + avs_fs_open @79 NONAME == XCgsqzn000004e + avs_fs_read @82 NONAME == XCgsqzn0000051 + avs_fs_opendir @93 NONAME == XCgsqzn000005c + avs_fs_readdir @94 NONAME == XCgsqzn000005d + avs_fs_closedir @95 NONAME == XCgsqzn000005e avs_net_ctrl @119 NONAME property_create @145 NONAME property_destroy @146 NONAME @@ -14,7 +23,15 @@ EXPORTS property_insert_read @149 NONAME property_search @162 NONAME property_node_create @163 NONAME + property_node_name @168 NONAME == XCgsqzn00000a7 property_node_remove @164 NONAME + property_node_type @169 NONAME == XCgsqzn00000a8 + property_node_clone @165 NONAME + property_node_traversal @167 NONAME + property_node_refdata @166 NONAME == XCgsqzn00000a5 + property_node_datasize @171 NONAME == XCgsqzn00000aa + property_node_read @172 NONAME == XCgsqzn00000ab + property_query_size @160 NONAME == XCgsqzn000009f property_node_refer @176 NONAME property_read_query_memsize @177 NONAME property_psmap_import @179 NONAME From eeffd3390bd24d39b3b84c63f8c7a881c5a057b9 Mon Sep 17 00:00:00 2001 From: icex2 Date: Sun, 28 Jan 2024 22:12:17 +0100 Subject: [PATCH 6/8] feat/fix(avs/ddr): Support AVS 2.13.06 This one was missing and is the actual correct version used for ddr-13. 2.13.04 was compatible, thus far, but there isn't any guarantee that they are actually 100% compatible (only konmai knows...). --- Module.mk | 8 ++--- src/imports/import_32_1306_avs-ea3.def | 5 +++ src/imports/import_32_1306_avs.def | 44 ++++++++++++++++++++++++++ 3 files changed, 53 insertions(+), 4 deletions(-) create mode 100644 src/imports/import_32_1306_avs-ea3.def create mode 100644 src/imports/import_32_1306_avs.def diff --git a/Module.mk b/Module.mk index fc341be1..39372927 100644 --- a/Module.mk +++ b/Module.mk @@ -80,7 +80,7 @@ cflags += \ # Each AVS-dependent project should consume the earliest AVS import definition # that is still ABI-compatible with the real build its target links against. -avsvers_32 := 1700 1603 1601 1508 1403 1304 1101 1002 803 0 +avsvers_32 := 1700 1603 1601 1508 1403 1306 1304 1101 1002 803 0 avsvers_64 := 1700 1603 1601 1509 1508 imps += avs avs-ea3 @@ -686,9 +686,9 @@ $(zipdir)/ddr-12.zip: \ $(V)zip -j $@ $^ $(zipdir)/ddr-13.zip: \ - build/bin/avs2_1304-32/launcher.exe \ - build/bin/avs2_1304-32/ddrhook2.dll \ - build/bin/avs2_1304-32/unicorntail.dll \ + build/bin/avs2_1306-32/launcher.exe \ + build/bin/avs2_1306-32/ddrhook2.dll \ + build/bin/avs2_1306-32/unicorntail.dll \ build/bin/indep-32/config.exe \ build/bin/indep-32/ddrio.dll \ build/bin/indep-32/ddrio-mm.dll \ diff --git a/src/imports/import_32_1306_avs-ea3.def b/src/imports/import_32_1306_avs-ea3.def new file mode 100644 index 00000000..2606209e --- /dev/null +++ b/src/imports/import_32_1306_avs-ea3.def @@ -0,0 +1,5 @@ +LIBRARY libavs-win32-ea3 + +EXPORTS + ea3_boot @94 NONAME + ea3_shutdown @97 NONAME diff --git a/src/imports/import_32_1306_avs.def b/src/imports/import_32_1306_avs.def new file mode 100644 index 00000000..f963ec88 --- /dev/null +++ b/src/imports/import_32_1306_avs.def @@ -0,0 +1,44 @@ +LIBRARY libavs-win32 + +EXPORTS + avs_boot @237 NONAME == XC058ba50000f4 + avs_fs_close @276 NONAME == XC058ba500011b + avs_fs_copy @283 NONAME == XC058ba5000122 + avs_fs_lseek @16 NONAME == XC058ba500000f + avs_fs_lstat @97 NONAME == XC058ba5000063 + avs_fs_open @178 NONAME == XC058ba50000b6 + avs_fs_read @306 NONAME == XC058ba5000139 + avs_fs_opendir @216 NONAME == XC058ba50000dd + avs_fs_readdir @130 NONAME == XC058ba5000086 + avs_fs_closedir @131 NONAME == XC058ba5000087 + avs_net_ctrl @15 NONAME == XC058ba500000e + avs_shutdown @333 NONAME == XC058ba5000154 + avs_thread_create @183 NONAME == XC058ba50000bb + avs_thread_destroy @76 NONAME == XC058ba500004e + avs_thread_exit @147 NONAME == XC058ba5000097 + avs_thread_join @92 NONAME == XC058ba500005e + log_body_misc @44 NONAME == XC058ba500002d + log_body_info @339 NONAME == XC058ba500015a + log_body_warning @219 NONAME == XC058ba50000e1 + log_body_fatal @128 NONAME == XC058ba5000084 + property_create @256 NONAME == XC058ba5000107 + property_desc_to_buffer @201 NONAME == XC058ba50000cd + property_destroy @264 NONAME == XC058ba500010f + property_insert_read @23 NONAME == XC058ba5000016 + property_node_create @316 NONAME == XC058ba5000143 + property_node_datasize @249 NONAME == XC058ba5000100 + property_node_name @255 NONAME == XC058ba5000106 + property_node_read @2 NONAME == XC058ba5000001 + property_node_refer @268 NONAME == XC058ba5000113 + property_node_remove @129 NONAME == XC058ba5000085 + property_node_type @329 NONAME == XC058ba5000150 + property_node_clone @252 NONAME == XC058ba5000103 + property_node_traversal @93 NONAME == XC058ba500005f + property_node_refdata @330 NONAME == XC058ba5000151 + property_query_size @250 NONAME == XC058ba5000101 + property_psmap_import @102 NONAME == XC058ba5000068 + property_psmap_export @110 NONAME == XC058ba5000071 + property_read_query_memsize @100 NONAME == XC058ba5000066 + property_search @244 NONAME == XC058ba50000fb + std_getenv @226 NONAME == XC058ba50000e8 + std_setenv @114 NONAME == XC058ba5000075 From cb6197e03eba6773c12c7111816c78dd92f50007 Mon Sep 17 00:00:00 2001 From: icex2 Date: Mon, 29 Jan 2024 22:14:36 +0100 Subject: [PATCH 7/8] fix(dist): Incorrect versioning for ddr distribution packages Apparently forgotten to get updated to reflect the currently supported versions correctly. --- Module.mk | 12 ++++++++---- README.md | 9 ++++++--- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/Module.mk b/Module.mk index 39372927..00290d5f 100644 --- a/Module.mk +++ b/Module.mk @@ -701,7 +701,7 @@ $(zipdir)/ddr-13.zip: \ $(V)echo ... $@ $(V)zip -j $@ $^ -$(zipdir)/ddr-14-to-16.zip: \ +$(zipdir)/ddr-14-to-18.zip: \ build/bin/avs2_1508-32/launcher.exe \ build/bin/avs2_1508-32/ddrhook2.dll \ build/bin/avs2_1508-32/unicorntail.dll \ @@ -710,6 +710,8 @@ $(zipdir)/ddr-14-to-16.zip: \ build/bin/indep-32/eamio.dll \ build/bin/indep-32/geninput.dll \ dist/ddr/config.bat \ + dist/ddr/gamestart-17.bat \ + dist/ddr/gamestart-18.bat \ dist/ddr/gamestart-14.bat \ dist/ddr/gamestart-15.bat \ dist/ddr/gamestart-16.bat \ @@ -717,7 +719,7 @@ $(zipdir)/ddr-14-to-16.zip: \ $(V)echo ... $@ $(V)zip -j $@ $^ -$(zipdir)/ddr-16-x64.zip: \ +$(zipdir)/ddr-16-to-18-x64.zip: \ build/bin/avs2_1603-64/launcher.exe \ build/bin/avs2_1603-64/ddrhook2.dll \ build/bin/avs2_1603-64/unicorntail.dll \ @@ -726,6 +728,8 @@ $(zipdir)/ddr-16-x64.zip: \ build/bin/indep-64/eamio.dll \ build/bin/indep-64/geninput.dll \ dist/ddr/config.bat \ + dist/ddr/gamestart-17.bat \ + dist/ddr/gamestart-18.bat \ dist/ddr/gamestart-16.bat \ | $(zipdir)/ $(V)echo ... $@ @@ -828,8 +832,8 @@ $(BUILDDIR)/bemanitools.zip: \ $(zipdir)/ddr-12.zip \ $(zipdir)/ddr-12-us.zip \ $(zipdir)/ddr-13.zip \ - $(zipdir)/ddr-14-to-16.zip \ - $(zipdir)/ddr-16-x64.zip \ + $(zipdir)/ddr-14-to-18.zip \ + $(zipdir)/ddr-16-to-18-x64.zip \ $(zipdir)/ddr-hwio-x86.zip \ $(zipdir)/ddr-hwio-x64.zip \ $(zipdir)/doc.zip \ diff --git a/README.md b/README.md index 5a089e16..6827f954 100644 --- a/README.md +++ b/README.md @@ -40,9 +40,12 @@ The following games are supported with their corresponding hook-libraries. - Dance Dance Revolution X (`ddr-11.zip`): [ddrhook1](doc/ddrhook/ddrhook1.md) - Dance Dance Revolution X2 (US/EU regions) (`ddr-12-us.zip`): [ddrhook1](doc/ddrhook/ddrhook1.md) - Dance Dance Revolution X2 (JP region) (`ddr-12.zip`): [ddrhook2](doc/ddrhook/ddrhook2.md) - - Dance Dance Revolution 2013 (`ddr-14-to-16.zip`): [ddrhook2](doc/ddrhook/ddrhook2.md) - - Dance Dance Revolution 2014 (`ddr-14-to-16.zip`): [ddrhook2](doc/ddrhook/ddrhook2.md) - - Dance Dance Revolution A (`ddr-14-to-16.zip`): [ddrhook2](doc/ddrhook/ddrhook2.md) + - Dance Dance Revolution X3 vs. 2ndMIX (`ddr-13.zip`): [ddrhook2](doc/ddrhook/ddrhook2.md) + - Dance Dance Revolution 2013 (`ddr-14-to-18.zip`): [ddrhook2](doc/ddrhook/ddrhook2.md) + - Dance Dance Revolution 2014 (`ddr-14-to-18.zip`): [ddrhook2](doc/ddrhook/ddrhook2.md) + - Dance Dance Revolution A (`ddr-14-to-18.zip`): [ddrhook2](doc/ddrhook/ddrhook2.md) + - Dance Dance Revolution A20 (`ddr-14-to-18.zip`): [ddrhook2](doc/ddrhook/ddrhook2.md) + - Dance Dance Revolution A20+ (`ddr-14-to-18.zip`): [ddrhook2](doc/ddrhook/ddrhook2.md) - [Beatmania IIDX](doc/iidxhook/README.md) - Beatmania IIDX 9th Style (`iidx-09-to-12.zip`): [iidxhook1](doc/iidxhook/iidxhook1.md) - Beatmania IIDX 10th Style (`iidx-09-to-12.zip`): [iidxhook1](doc/iidxhook/iidxhook1.md) From 67cacd0a86ecdf762cb083bdfaef1c3f20cdf035 Mon Sep 17 00:00:00 2001 From: icex2 Date: Mon, 29 Jan 2024 22:15:56 +0100 Subject: [PATCH 8/8] fix(doc): Update list of supported ddr versions Apparently also forgotten to reflect currently supported games. --- doc/ddrhook/ddrhook2.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/ddrhook/ddrhook2.md b/doc/ddrhook/ddrhook2.md index 111909a5..c739be15 100644 --- a/doc/ddrhook/ddrhook2.md +++ b/doc/ddrhook/ddrhook2.md @@ -9,6 +9,8 @@ The following games are supported by this hook library: - Dance Dance Revolution 2013 - Dance Dance Revolution 2014 - Dance Dance Revolution A +- Dance Dance Revolution A20 +- Dance Dance Revolution A20+ Note that different builds of the same hook library are required to run the different versions. See different distribution packages, e.g. `ddr-12.zip`, `ddr-13.zip` etc.