forked from Hay1tsme/segatools
Compare commits
29 Commits
2023-12-25
...
2024-04-29
Author | SHA1 | Date | |
---|---|---|---|
25e954fb55 | |||
a8c6ac70e4 | |||
eb1ec0e261
|
|||
482a6e530a | |||
65173e1fa6 | |||
4041844ea9 | |||
47a65e5e51
|
|||
774a639bb7
|
|||
097b74d849
|
|||
2590e749ca
|
|||
9c66488906
|
|||
f570869946
|
|||
629ded4018 | |||
ca36a879cb
|
|||
ae199502e8
|
|||
e40e1dffe3
|
|||
56e971c6a4
|
|||
3e9303e043
|
|||
451a7ec49d
|
|||
dae3018411
|
|||
cadf20040c
|
|||
cc0b6b0953
|
|||
0affc96e3e
|
|||
a8bd98706f | |||
aa2184f947 | |||
d0165b1eb0 | |||
477dad2667
|
|||
63320f8456 | |||
926493290b |
@ -111,6 +111,7 @@ $(BUILD_DIR_ZIP)/swdc.zip:
|
||||
$(V)cp $(BUILD_DIR_64)/subprojects/capnhook/inject/inject.exe \
|
||||
$(BUILD_DIR_64)/swdchook/swdchook.dll \
|
||||
$(DIST_DIR)/swdc/segatools.ini \
|
||||
$(DIST_DIR)/swdc/config_hook.json \
|
||||
$(DIST_DIR)/swdc/start.bat \
|
||||
$(BUILD_DIR_ZIP)/swdc
|
||||
$(V)cp pki/billing.pub \
|
||||
@ -224,6 +225,7 @@ $(BUILD_DIR_ZIP)/segatools.zip: \
|
||||
$(BUILD_DIR_ZIP)/mu3.zip \
|
||||
$(BUILD_DIR_ZIP)/mai2.zip \
|
||||
$(BUILD_DIR_ZIP)/cm.zip \
|
||||
$(BUILD_DIR_ZIP)/fgo.zip \
|
||||
CHANGELOG.md \
|
||||
README.md \
|
||||
|
||||
|
30
README.md
30
README.md
@ -1,33 +1,33 @@
|
||||
# Segatools
|
||||
|
||||
Version: `2023-11-22`
|
||||
Version: `2024-03-13`
|
||||
|
||||
Loaders and hardware emulators for SEGA games that run on the Nu and ALLS platforms.
|
||||
|
||||
## List of supported games
|
||||
|
||||
* Chunithm
|
||||
* [Chunithm (Plus)](doc/chunihook.md)
|
||||
* [Chunithm Air (Plus)](doc/chunihook.md)
|
||||
* [Chunithm Star (Plus)](doc/chunihook.md)
|
||||
* [Chunithm Amazon (Plus)](doc/chunihook.md)
|
||||
* [Chunithm Crystal (Plus)](doc/chunihook.md)
|
||||
* Chunithm SUN
|
||||
* CHUNITHM
|
||||
* up to [CHUNITHM PARADISE LOST](doc/chunihook.md)
|
||||
* starting from CHUNITHM NEW!!
|
||||
* crossbeats REV.
|
||||
* up to crossbeats REV. SUNRISE
|
||||
* Initial D
|
||||
* [Initial D Arcade Stage Zero](doc/idzhook.md)
|
||||
* Initial D THE ARCADE
|
||||
* Hatsune Miku: Project DIVA Arcade
|
||||
* up to Future Tone
|
||||
* SEGA World Drivers Championship
|
||||
* up to SEGA World Drivers Championship 2019
|
||||
* SEGA World Drivers Championship 2019
|
||||
* Fate/Grand Order
|
||||
* Fate/Grand Order Arcade
|
||||
* ONGEKI
|
||||
* up to bright MEMORY
|
||||
* O.N.G.E.K.I.
|
||||
* starting from O.N.G.E.K.I.
|
||||
* maimai DX
|
||||
* up to maimai DX FESTiVAL PLUS
|
||||
* starting from maimai DX
|
||||
* Card Maker
|
||||
* up to Card Maker 1.35
|
||||
* Wacca
|
||||
* up to WACCA Reverse
|
||||
* starting from Card Maker
|
||||
* WACCA
|
||||
* starting from WACCA
|
||||
|
||||
## End-users
|
||||
|
||||
|
@ -68,7 +68,6 @@ static void aime_io_config_read(
|
||||
cfg->felica_path,
|
||||
_countof(cfg->felica_path),
|
||||
filename);
|
||||
dprintf("NFC: felicaPath GetLastError %lx\n", GetLastError());
|
||||
|
||||
cfg->felica_gen = GetPrivateProfileIntW(
|
||||
L"aime",
|
||||
|
@ -8,6 +8,7 @@
|
||||
#include "board/aime-dll.h"
|
||||
#include "board/config.h"
|
||||
#include "board/sg-reader.h"
|
||||
#include "board/vfd.h"
|
||||
|
||||
#include "util/dprintf.h"
|
||||
|
||||
@ -71,7 +72,7 @@ void aime_config_load(struct aime_config *cfg, const wchar_t *filename)
|
||||
|
||||
aime_dll_config_load(&cfg->dll, filename);
|
||||
cfg->enable = GetPrivateProfileIntW(L"aime", L"enable", 1, filename);
|
||||
cfg->high_baudrate = GetPrivateProfileIntW(L"aime", L"highbaud", 1, filename);
|
||||
cfg->high_baudrate = GetPrivateProfileIntW(L"aime", L"highBaud", 1, filename);
|
||||
cfg->gen = GetPrivateProfileIntW(L"aime", L"gen", 0, filename);
|
||||
}
|
||||
|
||||
@ -82,3 +83,11 @@ void io4_config_load(struct io4_config *cfg, const wchar_t *filename)
|
||||
|
||||
cfg->enable = GetPrivateProfileIntW(L"io4", L"enable", 1, filename);
|
||||
}
|
||||
|
||||
void vfd_config_load(struct vfd_config *cfg, const wchar_t *filename)
|
||||
{
|
||||
assert(cfg != NULL);
|
||||
assert(filename != NULL);
|
||||
|
||||
cfg->enable = GetPrivateProfileIntW(L"vfd", L"enable", 1, filename);
|
||||
}
|
||||
|
@ -5,6 +5,8 @@
|
||||
|
||||
#include "board/io4.h"
|
||||
#include "board/sg-reader.h"
|
||||
#include "board/vfd.h"
|
||||
|
||||
void aime_config_load(struct aime_config *cfg, const wchar_t *filename);
|
||||
void io4_config_load(struct io4_config *cfg, const wchar_t *filename);
|
||||
void vfd_config_load(struct vfd_config *cfg, const wchar_t *filename);
|
||||
|
@ -25,6 +25,13 @@ struct sg_res_header {
|
||||
uint8_t payload_len;
|
||||
};
|
||||
|
||||
/* struct to save the version string with its length
|
||||
to fix NUL terminator issues */
|
||||
struct version_info {
|
||||
const char *version;
|
||||
uint8_t length;
|
||||
};
|
||||
|
||||
typedef HRESULT (*sg_dispatch_fn_t)(
|
||||
void *ctx,
|
||||
const void *req,
|
||||
|
@ -27,11 +27,11 @@ static HRESULT sg_led_cmd_set_color(
|
||||
const struct sg_led *led,
|
||||
const struct sg_led_req_set_color *req);
|
||||
|
||||
const char *sg_led_info[] = {
|
||||
"15084\xFF\x10\x00\x12",
|
||||
"000-00000\xFF\x11\x40",
|
||||
static const struct version_info led_version[] = {
|
||||
{"15084\xFF\x10\x00\x12", 9},
|
||||
{"000-00000\xFF\x11\x40", 12},
|
||||
// maybe the same?
|
||||
"000-00000\xFF\x11\x40"
|
||||
{"000-00000\xFF\x11\x40", 12}
|
||||
};
|
||||
|
||||
void sg_led_init(
|
||||
@ -156,10 +156,10 @@ static HRESULT sg_led_cmd_get_info(
|
||||
{
|
||||
sg_led_dprintf(led, "Get info\n");
|
||||
|
||||
unsigned int len = strlen(sg_led_info[led->gen - 1]);
|
||||
const struct version_info *fw = &led_version[led->gen - 1];
|
||||
|
||||
sg_res_init(&res->res, req, len);
|
||||
memcpy(res->payload, sg_led_info[led->gen - 1], len);
|
||||
sg_res_init(&res->res, req, fw->length);
|
||||
memcpy(res->payload, fw->version, fw->length);
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
@ -65,16 +65,16 @@ static HRESULT sg_nfc_cmd_dummy(
|
||||
const struct sg_req_header *req,
|
||||
struct sg_res_header *res);
|
||||
|
||||
static const char *hw_version[] = {
|
||||
"TN32MSEC003S H/W Ver3.0",
|
||||
"837-15286",
|
||||
"837-15396"
|
||||
static const struct version_info hw_version[] = {
|
||||
{"TN32MSEC003S H/W Ver3.0", 23},
|
||||
{"837-15286", 9},
|
||||
{"837-15396", 9}
|
||||
};
|
||||
|
||||
static const char *fw_version[] = {
|
||||
"TN32MSEC003S F/W Ver1.2",
|
||||
"\x94",
|
||||
"\x94"
|
||||
static const struct version_info fw_version[] = {
|
||||
{"TN32MSEC003S F/W Ver1.2", 23},
|
||||
{"\x94", 1},
|
||||
{"\x94", 1}
|
||||
};
|
||||
|
||||
void sg_nfc_init(
|
||||
@ -217,11 +217,11 @@ static HRESULT sg_nfc_cmd_get_fw_version(
|
||||
const struct sg_req_header *req,
|
||||
struct sg_nfc_res_get_fw_version *res)
|
||||
{
|
||||
unsigned int len = strlen(fw_version[nfc->gen - 1]);
|
||||
const struct version_info *fw = &fw_version[nfc->gen - 1];
|
||||
|
||||
/* Dest version is not NUL terminated, this is intentional */
|
||||
sg_res_init(&res->res, req, len);
|
||||
memcpy(res->version, fw_version[nfc->gen - 1], len);
|
||||
sg_res_init(&res->res, req, fw->length);
|
||||
memcpy(res->version, fw->version, fw->length);
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
@ -231,11 +231,11 @@ static HRESULT sg_nfc_cmd_get_hw_version(
|
||||
const struct sg_req_header *req,
|
||||
struct sg_nfc_res_get_hw_version *res)
|
||||
{
|
||||
unsigned int len = strlen(hw_version[nfc->gen - 1]);
|
||||
const struct version_info *hw = &hw_version[nfc->gen - 1];
|
||||
|
||||
/* Dest version is not NUL terminated, this is intentional */
|
||||
sg_res_init(&res->res, req, len);
|
||||
memcpy(res->version, hw_version[nfc->gen - 1], len);
|
||||
sg_res_init(&res->res, req, hw->length);
|
||||
memcpy(res->version, hw->version, hw->length);
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
68
board/vfd.c
68
board/vfd.c
@ -26,15 +26,25 @@ static HRESULT vfd_handle_irp(struct irp *irp);
|
||||
static struct uart vfd_uart;
|
||||
static uint8_t vfd_written[512];
|
||||
static uint8_t vfd_readable[512];
|
||||
UINT codepage;
|
||||
|
||||
HRESULT vfd_hook_init(unsigned int port_no)
|
||||
HRESULT vfd_hook_init(const struct vfd_config *cfg, unsigned int port_no)
|
||||
{
|
||||
assert(cfg != NULL);
|
||||
|
||||
if (!cfg->enable) {
|
||||
return S_FALSE;
|
||||
}
|
||||
|
||||
uart_init(&vfd_uart, port_no);
|
||||
vfd_uart.written.bytes = vfd_written;
|
||||
vfd_uart.written.nbytes = sizeof(vfd_written);
|
||||
vfd_uart.readable.bytes = vfd_readable;
|
||||
vfd_uart.readable.nbytes = sizeof(vfd_readable);
|
||||
|
||||
codepage = GetACP();
|
||||
dprintf("VFD: hook enabled.\n");
|
||||
|
||||
return iohook_push_handler(vfd_handle_irp);
|
||||
}
|
||||
|
||||
@ -54,8 +64,60 @@ static HRESULT vfd_handle_irp(struct irp *irp)
|
||||
return hr;
|
||||
}
|
||||
|
||||
dprintf("VFD TX:\n");
|
||||
dump_iobuf(&vfd_uart.written);
|
||||
uint8_t cmd = 0;
|
||||
uint8_t str_1[512];
|
||||
uint8_t str_2[512];
|
||||
uint8_t str_1_len = 0;
|
||||
uint8_t str_2_len = 0;
|
||||
for (size_t i = 0; i < vfd_uart.written.pos; i++) {
|
||||
if (vfd_uart.written.bytes[i] == 0x1B) {
|
||||
i++;
|
||||
cmd = vfd_uart.written.bytes[i];
|
||||
if (cmd == 0x30) {
|
||||
i += 3;
|
||||
}
|
||||
else if (cmd == 0x50) {
|
||||
i++;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
if (cmd == 0x30) {
|
||||
str_1[str_1_len++] = vfd_uart.written.bytes[i];
|
||||
}
|
||||
else if (cmd == 0x50) {
|
||||
str_2[str_2_len++] = vfd_uart.written.bytes[i];
|
||||
}
|
||||
}
|
||||
|
||||
if (str_1_len) {
|
||||
str_1[str_1_len++] = '\0';
|
||||
if (codepage != 932) {
|
||||
WCHAR buffer[512];
|
||||
MultiByteToWideChar(932, 0, (LPCSTR)str_1, str_1_len, buffer, str_1_len);
|
||||
char str_recode[str_1_len * 3];
|
||||
WideCharToMultiByte(codepage, 0, buffer, str_1_len, str_recode, str_1_len * 3, NULL, NULL);
|
||||
dprintf("VFD: %s\n", str_recode);
|
||||
}
|
||||
else {
|
||||
dprintf("VFD: %s\n", str_1);
|
||||
}
|
||||
}
|
||||
|
||||
if (str_2_len) {
|
||||
str_2[str_2_len++] = '\0';
|
||||
if (codepage != 932) {
|
||||
WCHAR buffer[512];
|
||||
MultiByteToWideChar(932, 0, (LPCSTR)str_2, str_2_len, buffer, str_2_len);
|
||||
char str_recode[str_2_len * 3];
|
||||
WideCharToMultiByte(codepage, 0, buffer, str_2_len, str_recode, str_2_len * 3, NULL, NULL);
|
||||
dprintf("VFD: %s\n", str_recode);
|
||||
} else {
|
||||
dprintf("VFD: %s\n", str_2);
|
||||
}
|
||||
}
|
||||
|
||||
// dprintf("VFD TX:\n");
|
||||
// dump_iobuf(&vfd_uart.written);
|
||||
vfd_uart.written.pos = 0;
|
||||
|
||||
return hr;
|
||||
|
@ -2,4 +2,9 @@
|
||||
|
||||
#include <windows.h>
|
||||
|
||||
HRESULT vfd_hook_init(unsigned int port_no);
|
||||
struct vfd_config {
|
||||
bool enable;
|
||||
};
|
||||
|
||||
|
||||
HRESULT vfd_hook_init(const struct vfd_config *cfg, unsigned int port_no);
|
||||
|
@ -14,7 +14,7 @@ void carol_io_config_load(
|
||||
assert(cfg != NULL);
|
||||
assert(filename != NULL);
|
||||
|
||||
cfg->vk_test = GetPrivateProfileIntW(L"io3", L"test", '1', filename);
|
||||
cfg->vk_service = GetPrivateProfileIntW(L"io3", L"service", '2', filename);
|
||||
cfg->vk_coin = GetPrivateProfileIntW(L"io3", L"coin", '3', filename);
|
||||
cfg->vk_test = GetPrivateProfileIntW(L"io3", L"test", VK_F1, filename);
|
||||
cfg->vk_service = GetPrivateProfileIntW(L"io3", L"service", VK_F2, filename);
|
||||
cfg->vk_coin = GetPrivateProfileIntW(L"io3", L"coin", VK_F3, filename);
|
||||
}
|
||||
|
@ -39,6 +39,19 @@ const struct dll_bind_sym chuni_dll_syms[] = {
|
||||
}
|
||||
};
|
||||
|
||||
/* Helper function to determine upon dll_bind failure whether the required functions were found
|
||||
NOTE: relies on symbols order declared above */
|
||||
static HRESULT has_enough_symbols(uint16_t version, uint8_t count)
|
||||
{
|
||||
if ( version <= 0x0101 && count == 7 )
|
||||
return S_OK;
|
||||
|
||||
if ( version >= 0x0102 && count == 9 )
|
||||
return S_OK;
|
||||
|
||||
return E_FAIL;
|
||||
}
|
||||
|
||||
struct chuni_dll chuni_dll;
|
||||
|
||||
// Copypasta DLL binding and diagnostic message boilerplate.
|
||||
@ -98,16 +111,24 @@ HRESULT chuni_dll_init(const struct chuni_dll_config *cfg, HINSTANCE self)
|
||||
}
|
||||
|
||||
sym = chuni_dll_syms;
|
||||
const struct dll_bind_sym *init_sym = &sym[0];
|
||||
hr = dll_bind(&chuni_dll, src, &sym, _countof(chuni_dll_syms));
|
||||
|
||||
if (FAILED(hr)) {
|
||||
if (src != self) {
|
||||
dprintf("Chunithm IO: Custom IO DLL does not provide function "
|
||||
"\"%s\". Please contact your IO DLL's developer for "
|
||||
"further assistance.\n",
|
||||
sym->sym);
|
||||
// Might still be ok depending on external dll API version
|
||||
int bind_count = sym - init_sym;
|
||||
if ( has_enough_symbols(chuni_dll.api_version, bind_count) == S_OK )
|
||||
{
|
||||
hr = S_OK;
|
||||
} else {
|
||||
dprintf("Chunithm IO: Custom IO DLL does not provide function "
|
||||
"\"%s\". Please contact your IO DLL's developer for "
|
||||
"further assistance.\n",
|
||||
sym->sym);
|
||||
|
||||
goto end;
|
||||
goto end;
|
||||
}
|
||||
} else {
|
||||
dprintf("Internal error: could not reflect \"%s\"\n", sym->sym);
|
||||
}
|
||||
|
@ -56,7 +56,7 @@ void led15093_config_load(struct led15093_config *cfg, const wchar_t *filename)
|
||||
|
||||
cfg->enable = GetPrivateProfileIntW(L"led15093", L"enable", 1, filename);
|
||||
cfg->port_no = 0;
|
||||
cfg->high_baudrate = GetPrivateProfileIntW(L"led15093", L"highBaudrate", 0, filename);
|
||||
cfg->high_baudrate = GetPrivateProfileIntW(L"led15093", L"highBaud", 0, filename);
|
||||
cfg->fw_ver = GetPrivateProfileIntW(L"led15093", L"fwVer", 0x90, filename);
|
||||
cfg->fw_sum = GetPrivateProfileIntW(L"led15093", L"fwSum", 0xadf7, filename);
|
||||
|
||||
|
@ -34,9 +34,9 @@ void chuni_io_config_load(
|
||||
assert(filename != NULL);
|
||||
|
||||
// Technically it's io4 but leave this for compatibility with old configs.
|
||||
cfg->vk_test = GetPrivateProfileIntW(L"io3", L"test", '1', filename);
|
||||
cfg->vk_service = GetPrivateProfileIntW(L"io3", L"service", '2', filename);
|
||||
cfg->vk_coin = GetPrivateProfileIntW(L"io3", L"coin", '3', filename);
|
||||
cfg->vk_test = GetPrivateProfileIntW(L"io3", L"test", VK_F1, filename);
|
||||
cfg->vk_service = GetPrivateProfileIntW(L"io3", L"service", VK_F2, filename);
|
||||
cfg->vk_coin = GetPrivateProfileIntW(L"io3", L"coin", VK_F3, filename);
|
||||
cfg->vk_ir_emu = GetPrivateProfileIntW(L"io3", L"ir", VK_SPACE, filename);
|
||||
|
||||
for (i = 0 ; i < 6 ; i++) {
|
||||
|
@ -96,7 +96,7 @@ void led15093_config_load(struct led15093_config *cfg, const wchar_t *filename)
|
||||
|
||||
cfg->enable = GetPrivateProfileIntW(L"led15093", L"enable", 1, filename);
|
||||
cfg->port_no = 0;
|
||||
cfg->high_baudrate = GetPrivateProfileIntW(L"led15093", L"highBaudrate", 0, filename);
|
||||
cfg->high_baudrate = GetPrivateProfileIntW(L"led15093", L"highBaud", 0, filename);
|
||||
cfg->fw_ver = GetPrivateProfileIntW(L"led15093", L"fwVer", 0x90, filename);
|
||||
cfg->fw_sum = GetPrivateProfileIntW(L"led15093", L"fwSum", 0xadf7, filename);
|
||||
|
||||
@ -160,6 +160,7 @@ void chusan_hook_config_load(
|
||||
dvd_config_load(&cfg->dvd, filename);
|
||||
io4_config_load(&cfg->io4, filename);
|
||||
gfx_config_load(&cfg->gfx, filename);
|
||||
vfd_config_load(&cfg->vfd, filename);
|
||||
chuni_dll_config_load(&cfg->dll, filename);
|
||||
slider_config_load(&cfg->slider, filename);
|
||||
led15093_config_load(&cfg->led15093, filename);
|
||||
|
@ -20,6 +20,7 @@ struct chusan_hook_config {
|
||||
struct dvd_config dvd;
|
||||
struct io4_config io4;
|
||||
struct gfx_config gfx;
|
||||
struct vfd_config vfd;
|
||||
struct chuni_dll_config dll;
|
||||
struct slider_config slider;
|
||||
struct led15093_config led15093;
|
||||
|
@ -122,7 +122,7 @@ static DWORD CALLBACK chusan_pre_startup(void)
|
||||
unsigned int first_port = is_cvt ? 2 : 20;
|
||||
|
||||
if (!is_cvt) {
|
||||
hr = vfd_hook_init(2);
|
||||
hr = vfd_hook_init(&chusan_hook_cfg.vfd, 2);
|
||||
|
||||
if (FAILED(hr)) {
|
||||
goto fail;
|
||||
|
@ -37,6 +37,8 @@ void cm_hook_config_load(
|
||||
aime_config_load(&cfg->aime, filename);
|
||||
dvd_config_load(&cfg->dvd, filename);
|
||||
io4_config_load(&cfg->io4, filename);
|
||||
vfd_config_load(&cfg->vfd, filename);
|
||||
touch_screen_config_load(&cfg->touch, filename);
|
||||
cm_dll_config_load(&cfg->dll, filename);
|
||||
unity_config_load(&cfg->unity, filename);
|
||||
}
|
||||
|
@ -11,13 +11,17 @@
|
||||
|
||||
#include "platform/config.h"
|
||||
|
||||
#include "unityhook/config.h"
|
||||
|
||||
struct cm_hook_config {
|
||||
struct platform_config platform;
|
||||
struct aime_config aime;
|
||||
struct dvd_config dvd;
|
||||
struct io4_config io4;
|
||||
struct vfd_config vfd;
|
||||
struct cm_dll_config dll;
|
||||
struct touch_screen_config touch;
|
||||
struct unity_config unity;
|
||||
};
|
||||
|
||||
void cm_dll_config_load(
|
||||
|
@ -16,10 +16,11 @@
|
||||
#include "cmhook/config.h"
|
||||
#include "cmhook/io4.h"
|
||||
#include "cmhook/cm-dll.h"
|
||||
#include "cmhook/unity.h"
|
||||
|
||||
#include "platform/platform.h"
|
||||
|
||||
#include "unityhook/hook.h"
|
||||
|
||||
#include "util/dprintf.h"
|
||||
|
||||
static HMODULE cm_hook_mod;
|
||||
@ -60,7 +61,7 @@ static DWORD CALLBACK cm_pre_startup(void)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
hr = vfd_hook_init(2);
|
||||
hr = vfd_hook_init(&cm_hook_cfg.vfd, 2);
|
||||
|
||||
if (FAILED(hr)) {
|
||||
goto fail;
|
||||
@ -83,7 +84,7 @@ static DWORD CALLBACK cm_pre_startup(void)
|
||||
There seems to be an issue with other DLL hooks if `LoadLibraryW` is
|
||||
hooked earlier in the `cmhook` initialization. */
|
||||
|
||||
unity_hook_init();
|
||||
unity_hook_init(&cm_hook_cfg.unity, cm_hook_mod);
|
||||
|
||||
/* Initialize debug helpers */
|
||||
|
||||
|
@ -16,6 +16,7 @@ shared_library(
|
||||
hooklib_lib,
|
||||
cmio_lib,
|
||||
platform_lib,
|
||||
unityhook_lib,
|
||||
util_lib,
|
||||
],
|
||||
sources : [
|
||||
@ -26,7 +27,5 @@ shared_library(
|
||||
'io4.h',
|
||||
'cm-dll.c',
|
||||
'cm-dll.h',
|
||||
'unity.h',
|
||||
'unity.c',
|
||||
],
|
||||
)
|
||||
|
@ -1,95 +0,0 @@
|
||||
#include <stdbool.h>
|
||||
|
||||
#include <windows.h>
|
||||
|
||||
#include "hook/table.h"
|
||||
|
||||
#include "hooklib/dll.h"
|
||||
#include "hooklib/path.h"
|
||||
|
||||
#include "util/dprintf.h"
|
||||
|
||||
static void dll_hook_insert_hooks(HMODULE target);
|
||||
|
||||
static HMODULE WINAPI my_LoadLibraryW(const wchar_t *name);
|
||||
static HMODULE (WINAPI *next_LoadLibraryW)(const wchar_t *name);
|
||||
|
||||
static const struct hook_symbol unity_kernel32_syms[] = {
|
||||
{
|
||||
.name = "LoadLibraryW",
|
||||
.patch = my_LoadLibraryW,
|
||||
.link = (void **) &next_LoadLibraryW,
|
||||
},
|
||||
};
|
||||
|
||||
static const wchar_t *target_modules[] = {
|
||||
L"mono.dll",
|
||||
L"cri_ware_unity.dll",
|
||||
};
|
||||
static const size_t target_modules_len = _countof(target_modules);
|
||||
|
||||
void unity_hook_init(void)
|
||||
{
|
||||
dll_hook_insert_hooks(NULL);
|
||||
}
|
||||
|
||||
static void dll_hook_insert_hooks(HMODULE target)
|
||||
{
|
||||
hook_table_apply(
|
||||
target,
|
||||
"kernel32.dll",
|
||||
unity_kernel32_syms,
|
||||
_countof(unity_kernel32_syms));
|
||||
}
|
||||
|
||||
static HMODULE WINAPI my_LoadLibraryW(const wchar_t *name)
|
||||
{
|
||||
const wchar_t *name_end;
|
||||
const wchar_t *target_module;
|
||||
bool already_loaded;
|
||||
HMODULE result;
|
||||
size_t name_len;
|
||||
size_t target_module_len;
|
||||
|
||||
if (name == NULL) {
|
||||
SetLastError(ERROR_INVALID_PARAMETER);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// Check if the module is already loaded
|
||||
already_loaded = GetModuleHandleW(name) != NULL;
|
||||
|
||||
// Must call the next handler so the DLL reference count is incremented
|
||||
result = next_LoadLibraryW(name);
|
||||
|
||||
if (!already_loaded && result != NULL) {
|
||||
name_len = wcslen(name);
|
||||
|
||||
for (size_t i = 0; i < target_modules_len; i++) {
|
||||
target_module = target_modules[i];
|
||||
target_module_len = wcslen(target_module);
|
||||
|
||||
// Check if the newly loaded library is at least the length of
|
||||
// the name of the target module
|
||||
if (name_len < target_module_len) {
|
||||
continue;
|
||||
}
|
||||
|
||||
name_end = &name[name_len - target_module_len];
|
||||
|
||||
// Check if the name of the newly loaded library is one of the
|
||||
// modules the path hooks should be injected into
|
||||
if (_wcsicmp(name_end, target_module) != 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
dprintf("Unity: Loaded %S\n", target_module);
|
||||
|
||||
dll_hook_insert_hooks(result);
|
||||
path_hook_insert_hooks(result);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
@ -1,3 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
void unity_hook_init(void);
|
@ -16,7 +16,7 @@ void cm_io_config_load(
|
||||
assert(cfg != NULL);
|
||||
assert(filename != NULL);
|
||||
|
||||
cfg->vk_test = GetPrivateProfileIntW(L"io4", L"test", '1', filename);
|
||||
cfg->vk_service = GetPrivateProfileIntW(L"io4", L"service", '2', filename);
|
||||
cfg->vk_coin = GetPrivateProfileIntW(L"io4", L"coin", '3', filename);
|
||||
cfg->vk_test = GetPrivateProfileIntW(L"io4", L"test", VK_F1, filename);
|
||||
cfg->vk_service = GetPrivateProfileIntW(L"io4", L"service", VK_F2, filename);
|
||||
cfg->vk_coin = GetPrivateProfileIntW(L"io4", L"coin", VK_F3, filename);
|
||||
}
|
||||
|
@ -23,22 +23,32 @@ void cxb_dll_config_load(
|
||||
struct cxb_dll_config *cfg,
|
||||
const wchar_t *filename)
|
||||
{
|
||||
assert(cfg != NULL);
|
||||
assert(filename != NULL);
|
||||
|
||||
GetPrivateProfileStringW(
|
||||
L"cxbio",
|
||||
L"path",
|
||||
L"",
|
||||
cfg->path,
|
||||
_countof(cfg->path),
|
||||
filename);
|
||||
}
|
||||
|
||||
void revio_config_load(struct revio_config *cfg, const wchar_t *filename)
|
||||
{
|
||||
assert(cfg != NULL);
|
||||
assert(filename != NULL);
|
||||
|
||||
}
|
||||
|
||||
void network_config_load(struct network_config *cfg, const wchar_t *filename)
|
||||
{
|
||||
|
||||
cfg->enable = GetPrivateProfileIntW(L"revio", L"enable", 1, filename);
|
||||
}
|
||||
|
||||
void led_config_load(struct led_config *cfg, const wchar_t *filename)
|
||||
{
|
||||
assert(cfg != NULL);
|
||||
assert(filename != NULL);
|
||||
|
||||
cfg->enable = GetPrivateProfileIntW(L"led", L"enable", 1, filename);
|
||||
}
|
||||
|
||||
void cxb_hook_config_load(
|
||||
@ -56,6 +66,5 @@ void cxb_hook_config_load(
|
||||
gfx_config_load(&cfg->gfx, filename);
|
||||
cxb_dll_config_load(&cfg->dll, filename);
|
||||
revio_config_load(&cfg->revio, filename);
|
||||
network_config_load(&cfg->network, filename);
|
||||
led_config_load(&cfg->led, filename);
|
||||
}
|
@ -10,7 +10,6 @@
|
||||
#include "cxbhook/cxb-dll.h"
|
||||
#include "cxbhook/revio.h"
|
||||
#include "cxbhook/led.h"
|
||||
#include "cxbhook/network.h"
|
||||
|
||||
#include "gfxhook/gfx.h"
|
||||
|
||||
@ -23,7 +22,6 @@ struct cxb_hook_config {
|
||||
struct gfx_config gfx;
|
||||
struct cxb_dll_config dll;
|
||||
struct revio_config revio;
|
||||
struct network_config network;
|
||||
struct led_config led;
|
||||
};
|
||||
|
||||
@ -32,7 +30,6 @@ void cxb_dll_config_load(
|
||||
const wchar_t *filename);
|
||||
|
||||
void revio_config_load(struct revio_config *cfg, const wchar_t *filename);
|
||||
void network_config_load(struct network_config *cfg, const wchar_t *filename);
|
||||
void led_config_load(struct led_config *cfg, const wchar_t *filename);
|
||||
|
||||
void cxb_hook_config_load(
|
||||
|
@ -9,7 +9,6 @@
|
||||
#include "cxbhook/config.h"
|
||||
#include "cxbhook/revio.h"
|
||||
#include "cxbhook/led.h"
|
||||
#include "cxbhook/network.h"
|
||||
|
||||
#include "cxbio/cxbio.h"
|
||||
|
||||
@ -103,12 +102,6 @@ static DWORD CALLBACK cxb_pre_startup(void)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
hr = network_hook_init(&cxb_hook_cfg.network);
|
||||
|
||||
if (FAILED(hr)) {
|
||||
goto fail;
|
||||
}
|
||||
|
||||
hr = led_hook_init(&cxb_hook_cfg.led);
|
||||
|
||||
if (FAILED(hr)) {
|
||||
|
@ -49,7 +49,13 @@ static struct hook_symbol lamp_syms[] = {
|
||||
|
||||
HRESULT led_hook_init(struct led_config *cfg)
|
||||
{
|
||||
dprintf("LED: Init\n");
|
||||
assert(cfg != NULL);
|
||||
|
||||
if (!cfg->enable) {
|
||||
return S_FALSE;
|
||||
}
|
||||
|
||||
dprintf("LED: Hook enabled.\n");
|
||||
return proc_addr_table_push("CommLamp.dll", lamp_syms, _countof(lamp_syms));
|
||||
}
|
||||
|
||||
|
@ -30,7 +30,5 @@ shared_library(
|
||||
'revio.h',
|
||||
'led.c',
|
||||
'led.h',
|
||||
'network.c',
|
||||
'network.h',
|
||||
],
|
||||
)
|
||||
|
@ -1,13 +0,0 @@
|
||||
#include <windows.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include "cxbhook/network.h"
|
||||
|
||||
#include "util/dprintf.h"
|
||||
|
||||
HRESULT network_hook_init(struct network_config *cfg)
|
||||
{
|
||||
dprintf("Network: Init\n");
|
||||
return S_OK;
|
||||
}
|
@ -1,13 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#include <windows.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
|
||||
struct network_config {
|
||||
bool enable;
|
||||
bool disable_ssl;
|
||||
char title_server[PATH_MAX];
|
||||
};
|
||||
|
||||
HRESULT network_hook_init(struct network_config *cfg);
|
@ -82,7 +82,13 @@ static struct hook_symbol revio_syms[] = {
|
||||
|
||||
HRESULT revio_hook_init(struct revio_config *cfg)
|
||||
{
|
||||
dprintf("Revio: Init\n");
|
||||
assert(cfg != NULL);
|
||||
|
||||
if (!cfg->enable) {
|
||||
return S_FALSE;
|
||||
}
|
||||
|
||||
dprintf("Revio: Hook enabled.\n");
|
||||
return proc_addr_table_push("CommIo.dll", revio_syms, _countof(revio_syms));
|
||||
}
|
||||
|
||||
@ -154,7 +160,7 @@ static int my_cCommIo_GetTrigger()
|
||||
|
||||
out &= ~last_triggers;
|
||||
|
||||
dprintf("Revio: GetTrigger %X\n", out);
|
||||
// dprintf("Revio: GetTrigger %X\n", out);
|
||||
last_triggers = out;
|
||||
return out;
|
||||
}
|
||||
@ -188,7 +194,7 @@ static int my_cCommIo_GetRelease()
|
||||
|
||||
out &= ~btns;
|
||||
|
||||
dprintf("Revio: GetRelease %X\n", out);
|
||||
// dprintf("Revio: GetRelease %X\n", out);
|
||||
last_triggers = btns;
|
||||
return out;
|
||||
}
|
||||
|
69
dist/carol/segatools.ini
vendored
69
dist/carol/segatools.ini
vendored
@ -1,23 +1,56 @@
|
||||
; -----------------------------------------------------------------------------
|
||||
; Path settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[vfs]
|
||||
; Insert the path to the game AMFS directory here (contains ICF1 and ICF2)
|
||||
amfs=
|
||||
; Insert the path to the game Option directory here (contains Axxx directories)
|
||||
; Insert the path to the game Option directory here (contains MOV1, PAR0,
|
||||
; PAR1, RES0 and RES1 directories)
|
||||
option=
|
||||
; Create an empty directory somewhere and insert the path here.
|
||||
; This directory may be shared between multiple SEGA games.
|
||||
; NOTE: This has nothing to do with Windows %APPDATA%.
|
||||
appdata=
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Device settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[aime]
|
||||
; Enable Aime card reader assembly emulation. Disable to use a real SEGA Aime
|
||||
; reader.
|
||||
enable=1
|
||||
aimePath=DEVICE\aime.txt
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Network settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[dns]
|
||||
; Insert the hostname or IP address of the server you wish to use here.
|
||||
; Note that 127.0.0.1, localhost etc are specifically rejected.
|
||||
default=127.0.0.1
|
||||
|
||||
[netenv]
|
||||
; Simulate an ideal LAN environment.
|
||||
; Simulate an ideal LAN environment. This may interfere with head-to-head play.
|
||||
; Chunithm is extremely picky about its LAN environment, so leaving this
|
||||
; setting enabled is strongly recommended.
|
||||
enable=1
|
||||
; The final octet of the local host's IP address on the virtualized subnet (so,
|
||||
; if the keychip subnet is `192.168.32.0` and this value is set to `11`, then the
|
||||
; local host's virtualized LAN IP is `192.168.32.11`).
|
||||
addrSuffix=11
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Board settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[gpio]
|
||||
; Emulated Nu DIP switch for Distribution Server setting.
|
||||
;
|
||||
; If multiple machines are present on the same LAN then set this to 1 on
|
||||
; exactly one machine and set this to 0 on all others.
|
||||
dipsw1=1
|
||||
|
||||
[keychip]
|
||||
@ -26,6 +59,10 @@ dipsw1=1
|
||||
; that subnet must start with 192.168.
|
||||
subnet=192.168.126.0
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Misc. hooks settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[gfx]
|
||||
; Force the game to run windowed.
|
||||
windowed=1
|
||||
@ -34,15 +71,31 @@ framed=1
|
||||
; Select the monitor to run the game on. (Fullscreen only, 0 =primary screen)
|
||||
monitor=0
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Custom IO settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[aimeio]
|
||||
; To use a custom card reader IO DLL enter its path here.
|
||||
; Leave empty if you want to use Segatools built-in keyboard input.
|
||||
path=
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Input settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
; Keyboard bindings are specified as hexadecimal (prefixed with 0x) or decimal
|
||||
; (not prefixed with 0x) virtual-key codes, a list of which can be found here:
|
||||
;
|
||||
; https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes
|
||||
;
|
||||
; This is, admittedly, not the most user-friendly configuration method in the
|
||||
; world. An improved solution will be provided later.
|
||||
|
||||
[io3]
|
||||
; Test button virtual-key code. Default is the 1 key.
|
||||
test=0x31
|
||||
; Service button virtual-key code. Default is the 2 key.
|
||||
service=0x32
|
||||
; Keyboard button to increment coin counter. Default is the 3 key.
|
||||
coin=0x33
|
||||
; Test button virtual-key code. Default is the F1 key.
|
||||
test=0x70
|
||||
; Service button virtual-key code. Default is the F2 key.
|
||||
service=0x71
|
||||
; Keyboard button to increment coin counter. Default is the F3 key.
|
||||
coin=0x72
|
||||
|
50
dist/chuni/segatools.ini
vendored
50
dist/chuni/segatools.ini
vendored
@ -1,3 +1,7 @@
|
||||
; -----------------------------------------------------------------------------
|
||||
; Path settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[vfs]
|
||||
; Insert the path to the game AMFS directory here (contains ICF1 and ICF2)
|
||||
amfs=
|
||||
@ -8,6 +12,20 @@ option=
|
||||
; NOTE: This has nothing to do with Windows %APPDATA%.
|
||||
appdata=
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Device settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[aime]
|
||||
; Enable Aime card reader assembly emulation. Disable to use a real SEGA Aime
|
||||
; reader.
|
||||
enable=1
|
||||
aimePath=DEVICE\aime.txt
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Network settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[dns]
|
||||
; Insert the hostname or IP address of the server you wish to use here.
|
||||
; Note that 127.0.0.1, localhost etc are specifically rejected.
|
||||
@ -18,6 +36,14 @@ default=127.0.0.1
|
||||
; Chunithm is extremely picky about its LAN environment, so leaving this
|
||||
; setting enabled is strongly recommended.
|
||||
enable=1
|
||||
; The final octet of the local host's IP address on the virtualized subnet (so,
|
||||
; if the keychip subnet is `192.168.32.0` and this value is set to `11`, then the
|
||||
; local host's virtualized LAN IP is `192.168.32.11`).
|
||||
addrSuffix=11
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Board settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[keychip]
|
||||
; The /24 LAN subnet that the emulated keychip will tell the game to expect.
|
||||
@ -25,6 +51,10 @@ enable=1
|
||||
; that subnet must start with 192.168.
|
||||
subnet=192.168.139.0
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Misc. hooks settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[gfx]
|
||||
; Force the game to run windowed.
|
||||
windowed=1
|
||||
@ -33,6 +63,10 @@ framed=1
|
||||
; Select the monitor to run the game on. (Fullscreen only, 0 =primary screen)
|
||||
monitor=0
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Custom IO settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[aimeio]
|
||||
; To use a custom card reader IO DLL enter its path here.
|
||||
; Leave empty if you want to use Segatools built-in keyboard input.
|
||||
@ -43,6 +77,10 @@ path=
|
||||
; Leave empty if you want to use Segatools built-in keyboard input.
|
||||
path=
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; LED settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[led15093]
|
||||
; Enable emulation of the 15093-06 controlled lights, which handle the air tower
|
||||
; RGBs and the rear LED panel (billboard) on the cabinet.
|
||||
@ -97,12 +135,12 @@ controllerLedOutputSerial=0
|
||||
; world. An improved solution will be provided later.
|
||||
|
||||
[io3]
|
||||
; Test button virtual-key code. Default is the 1 key.
|
||||
test=0x31
|
||||
; Service button virtual-key code. Default is the 2 key.
|
||||
service=0x32
|
||||
; Keyboard button to increment coin counter. Default is the 3 key.
|
||||
coin=0x33
|
||||
; Test button virtual-key code. Default is the F1 key.
|
||||
test=0x70
|
||||
; Service button virtual-key code. Default is the F2 key.
|
||||
service=0x71
|
||||
; Keyboard button to increment coin counter. Default is the F3 key.
|
||||
coin=0x72
|
||||
; Set to 0 for enable separate ir control. Deafult is space key.
|
||||
ir=0x20
|
||||
|
||||
|
62
dist/chusan/segatools.ini
vendored
62
dist/chusan/segatools.ini
vendored
@ -1,3 +1,7 @@
|
||||
; -----------------------------------------------------------------------------
|
||||
; Path settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[vfs]
|
||||
; Insert the path to the game AMFS directory here (contains ICF1 and ICF2)
|
||||
amfs=
|
||||
@ -8,17 +12,26 @@ option=
|
||||
; NOTE: This has nothing to do with Windows %APPDATA%.
|
||||
appdata=
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Device settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[aime]
|
||||
; Enable aime reader emulation.
|
||||
; Enable Aime card reader assembly emulation. Disable to use a real SEGA Aime
|
||||
; reader.
|
||||
enable=1
|
||||
aimePath=DEVICE\aime.txt
|
||||
; Enable high baud rate.
|
||||
;highbaud=1
|
||||
;highBaud=1
|
||||
|
||||
[aimeio]
|
||||
; Uncomment this if you have custom (x64) aime implementation.
|
||||
; Leave empty if you want to use Segatools built-in keyboard input.
|
||||
;path=
|
||||
[vfd]
|
||||
; Enable VFD emulation (currently just stubbed). Disable to use a real VFD
|
||||
; GP1232A02A FUTABA assembly.
|
||||
enable=1
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Network settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[dns]
|
||||
; Insert the hostname or IP address of the server you wish to use here.
|
||||
@ -30,6 +43,14 @@ default=127.0.0.1
|
||||
; Chunithm is extremely picky about its LAN environment, so leaving this
|
||||
; setting enabled is strongly recommended.
|
||||
enable=1
|
||||
; The final octet of the local host's IP address on the virtualized subnet (so,
|
||||
; if the keychip subnet is `192.168.32.0` and this value is set to `11`, then the
|
||||
; local host's virtualized LAN IP is `192.168.32.11`).
|
||||
addrSuffix=11
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Board settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[keychip]
|
||||
; The /24 LAN subnet that the emulated keychip will tell the game to expect.
|
||||
@ -55,6 +76,10 @@ dipsw2=1
|
||||
; the LED 837-15093-06 COM port and the AiMe reder hardware generation as well.
|
||||
dipsw3=1
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Misc. hooks settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[gfx]
|
||||
; Force the game to run windowed.
|
||||
windowed=1
|
||||
@ -63,6 +88,15 @@ framed=0
|
||||
; Select the monitor to run the game on. (Fullscreen only, 0 =primary screen)
|
||||
monitor=0
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Custom IO settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[aimeio]
|
||||
; To use a custom card reader IO DLL (x64) enter its path here.
|
||||
; Leave empty if you want to use Segatools built-in keyboard input.
|
||||
path=
|
||||
|
||||
[chuniio]
|
||||
; Uncomment this if you have custom chuniio implementation comprised of a single 32bit DLL.
|
||||
; (will use chu2to3 engine internally)
|
||||
@ -73,6 +107,10 @@ monitor=0
|
||||
;path32=
|
||||
;path64=
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; LED settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[led15093]
|
||||
; Enable emulation of the 15093-06 controlled lights, which handle the air tower
|
||||
; RGBs and the rear LED panel (billboard) on the cabinet.
|
||||
@ -127,12 +165,12 @@ controllerLedOutputSerial=0
|
||||
; world. An improved solution will be provided later.
|
||||
|
||||
[io3]
|
||||
; Test button virtual-key code. Default is the 1 key.
|
||||
test=0x31
|
||||
; Service button virtual-key code. Default is the 2 key.
|
||||
service=0x32
|
||||
; Keyboard button to increment coin counter. Default is the 3 key.
|
||||
coin=0x33
|
||||
; Test button virtual-key code. Default is the F1 key.
|
||||
test=0x70
|
||||
; Service button virtual-key code. Default is the F2 key.
|
||||
service=0x71
|
||||
; Keyboard button to increment coin counter. Default is the F3 key.
|
||||
coin=0x72
|
||||
; Set to 0 for enable separate ir control. Deafult is space key.
|
||||
ir=0x20
|
||||
|
||||
|
3
dist/chusan/start.bat
vendored
3
dist/chusan/start.bat
vendored
@ -2,8 +2,9 @@
|
||||
|
||||
pushd %~dp0
|
||||
|
||||
start /min inject_x64 -d -k chusanhook_x64.dll amdaemon.exe -c config_common.json config_server.json config_client.json config_cvt.json config_sp.json config_hook.json
|
||||
start "AM Daemon" /min inject_x64 -d -k chusanhook_x64.dll amdaemon.exe -c config_common.json config_server.json config_client.json config_cvt.json config_sp.json config_hook.json
|
||||
inject_x86 -d -k chusanhook_x86.dll chusanApp.exe
|
||||
|
||||
taskkill /f /im amdaemon.exe > nul 2>&1
|
||||
|
||||
echo.
|
||||
|
54
dist/cm/segatools.ini
vendored
54
dist/cm/segatools.ini
vendored
@ -1,3 +1,7 @@
|
||||
; -----------------------------------------------------------------------------
|
||||
; Path settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[vfs]
|
||||
; Insert the path to the game AMFS directory here (contains ICF1 and ICF2)
|
||||
amfs=
|
||||
@ -8,11 +12,25 @@ option=
|
||||
; NOTE: This has nothing to do with Windows %APPDATA%.
|
||||
appdata=
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Device settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[aime]
|
||||
; Enable aime reader emulation.
|
||||
; Enable Aime card reader assembly emulation. Disable to use a real SEGA Aime
|
||||
; reader.
|
||||
enable=1
|
||||
aimePath=DEVICE\aime.txt
|
||||
|
||||
[vfd]
|
||||
; Enable VFD emulation (currently just stubbed). Disable to use a real VFD
|
||||
; GP1232A02A FUTABA assembly.
|
||||
enable=1
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Network settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[dns]
|
||||
; Insert the hostname or IP address of the server you wish to use here.
|
||||
; Note that 127.0.0.1, localhost etc are specifically rejected.
|
||||
@ -24,6 +42,10 @@ default=127.0.0.1
|
||||
; setting enabled is recommended.
|
||||
enable=1
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Board settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[keychip]
|
||||
; The /24 LAN subnet that the emulated keychip will tell the game to expect.
|
||||
; If you disable netenv then you must set this to your LAN's IP subnet, and
|
||||
@ -38,10 +60,28 @@ enable=1
|
||||
; this to 0 on exactly one machine and set this to 1 on all others.
|
||||
dipsw1=0
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Misc. hooks settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[touch]
|
||||
; Enable/Disable WinTouch emulation
|
||||
enable=0
|
||||
|
||||
[unity]
|
||||
; Path to a .NET DLL that should run before the game. Useful for loading
|
||||
; modding frameworks such as BepInEx.
|
||||
targetAssembly=
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Custom IO settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[aimeio]
|
||||
; To use a custom card reader IO DLL enter its path here.
|
||||
; Leave empty if you want to use Segatools built-in keyboard input.
|
||||
path=
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Input settings
|
||||
; -----------------------------------------------------------------------------
|
||||
@ -55,9 +95,9 @@ enable=0
|
||||
; world. An improved solution will be provided later.
|
||||
|
||||
[io4]
|
||||
; Test button virtual-key code. Default is the 1 key.
|
||||
test=0x31
|
||||
; Service button virtual-key code. Default is the 2 key.
|
||||
service=0x32
|
||||
; Keyboard button to increment coin counter. Default is the 3 key.
|
||||
coin=0x33
|
||||
; Test button virtual-key code. Default is the F1 key.
|
||||
test=0x70
|
||||
; Service button virtual-key code. Default is the F2 key.
|
||||
service=0x71
|
||||
; Keyboard button to increment coin counter. Default is the F3 key.
|
||||
coin=0x72
|
||||
|
2
dist/cm/start.bat
vendored
2
dist/cm/start.bat
vendored
@ -2,7 +2,7 @@
|
||||
|
||||
pushd %~dp0
|
||||
|
||||
start /min inject -d -k cmhook.dll amdaemon.exe -c config_common.json config_server.json config_client.json config_hook.json
|
||||
start "AM Daemon" /min inject -d -k cmhook.dll amdaemon.exe -c config_common.json config_server.json config_client.json config_hook.json
|
||||
inject -d -k cmhook.dll CardMaker.exe -screen-fullscreen 0 -popupwindow -screen-width 1080 -screen-height 1920
|
||||
|
||||
taskkill /f /im amdaemon.exe > nul 2>&1
|
||||
|
107
dist/cxb/segatools.ini
vendored
107
dist/cxb/segatools.ini
vendored
@ -1,3 +1,7 @@
|
||||
; -----------------------------------------------------------------------------
|
||||
; Path settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[vfs]
|
||||
; Make sure theses are full paths and not relative or you will have a bad time
|
||||
; Insert the path to the game AMFS directory here (contains ICF1 and ICF2)
|
||||
@ -9,41 +13,55 @@ option=
|
||||
; NOTE: This has nothing to do with Windows %APPDATA%.
|
||||
appdata=
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Device settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[aime]
|
||||
; Aime reader emulation
|
||||
enable=1
|
||||
; CXB is stupid, so we have to make the paths go back two directories. This
|
||||
; will load the file from "resource\DEVICE\aime.txt".
|
||||
aimePath=../DEVICE/aime.txt
|
||||
|
||||
[led]
|
||||
; Emulation for the LED board. Currently it's just dummy responses,
|
||||
; but if somebody wants to make their keyboard or whatever light
|
||||
; up with the game they can
|
||||
enable=1
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Network settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[dns]
|
||||
; Insert the hostname or IP address of the server you wish to use here.
|
||||
; Note that 127.0.0.1, localhost etc are specifically rejected.
|
||||
default=127.0.0.1
|
||||
|
||||
; Set the title server hostname or IP address here, as the title server
|
||||
; is hardcoded in the game.
|
||||
title=https://127.0.0.1:9002
|
||||
|
||||
[netenv]
|
||||
; Simulate an ideal LAN environment. This may interfere with head-to-head play.
|
||||
; Crossbeats is extremely picky about its LAN environment, so leaving this
|
||||
; setting enabled is strongly recommended.
|
||||
enable=1
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Board settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[keychip]
|
||||
; The /24 LAN subnet that the emulated keychip will tell the game to expect.
|
||||
; If you disable netenv then you must set this to your LAN's IP subnet, and
|
||||
; that subnet must start with 192.168.
|
||||
subnet=192.168.100.0
|
||||
subnet=192.168.150.0
|
||||
billingCa=../DEVICE/ca.crt
|
||||
billingPub=../DEVICE/billing.pub
|
||||
billingType=2
|
||||
|
||||
[gfx]
|
||||
; Force the game to run windowed.
|
||||
windowed=1
|
||||
; Add a frame to the game window if running windowed.
|
||||
framed=1
|
||||
; Select the monitor to run the game on. (Fullscreen only, 0 =primary screen)
|
||||
monitor=0
|
||||
|
||||
[aime]
|
||||
; Aime reader emulation
|
||||
; CXB is stupid, so we have to make the paths go back one
|
||||
enable=1
|
||||
aimePath=../DEVICE/aime.txt
|
||||
felicaPath=../DEVICE/felica.txt
|
||||
|
||||
[eeprom]
|
||||
; See above
|
||||
path=../DEVICE/eeprom.bin
|
||||
@ -52,21 +70,54 @@ path=../DEVICE/eeprom.bin
|
||||
; See above
|
||||
path=../DEVICE/sram.bin
|
||||
|
||||
[led]
|
||||
; Emulation for the LED board. Currently it's just dummy responses,
|
||||
; but if somebody wants to make their keyboard or whatever light
|
||||
; up with the game they can
|
||||
enable=1
|
||||
; -----------------------------------------------------------------------------
|
||||
; Misc. hooks settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[gfx]
|
||||
; Force the game to run windowed.
|
||||
windowed=1
|
||||
; Add a frame to the game window if running windowed.
|
||||
framed=1
|
||||
; Select the monitor to run the game on. (Fullscreen only, 0 =primary screen)
|
||||
monitor=0
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Custom IO settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[aimeio]
|
||||
; To use a custom card reader IO DLL enter its path here.
|
||||
; Leave empty if you want to use Segatools built-in keyboard input.
|
||||
path=
|
||||
|
||||
[cxbio]
|
||||
; To use a custom crossbeats REV. DLL enter its path here.
|
||||
; Leave empty if you want to use Segatools built-in keyboard input.
|
||||
path=
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Input settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
; Keyboard bindings are specified as hexadecimal (prefixed with 0x) or decimal
|
||||
; (not prefixed with 0x) virtual-key codes, a list of which can be found here:
|
||||
;
|
||||
; https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes
|
||||
;
|
||||
; This is, admittedly, not the most user-friendly configuration method in the
|
||||
; world. An improved solution will be provided later.
|
||||
|
||||
[revio]
|
||||
; Enable emulation of the rev IO board
|
||||
enabe=1
|
||||
; Test button virtual-key code. Default is the 1 key.
|
||||
test=0x31
|
||||
; Service button virtual-key code. Default is the 2 key.
|
||||
service=0x32
|
||||
; Keyboard button to increment coin counter. Default is the 3 key.
|
||||
coin=0x33
|
||||
enable=1
|
||||
; Test button virtual-key code. Default is the F1 key.
|
||||
test=0x70
|
||||
; Service button virtual-key code. Default is the F2 key.
|
||||
service=0x71
|
||||
; Keyboard button to increment coin counter. Default is the F3 key.
|
||||
coin=0x72
|
||||
|
||||
; Menu up key. Default is up arrow.
|
||||
up=0x26
|
||||
; Menu down key. Default is down arrow.
|
||||
|
62
dist/diva/segatools.ini
vendored
62
dist/diva/segatools.ini
vendored
@ -1,3 +1,7 @@
|
||||
; -----------------------------------------------------------------------------
|
||||
; Path settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[vfs]
|
||||
; Insert the path to the game AMFS directory here (contains ICF1 and ICF2)
|
||||
amfs=
|
||||
@ -8,6 +12,20 @@ option=
|
||||
; NOTE: This has nothing to do with Windows %APPDATA%.
|
||||
appdata=
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Device settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[aime]
|
||||
; Enable Aime card reader assembly emulation. Disable to use a real SEGA Aime
|
||||
; reader.
|
||||
enable=1
|
||||
aimePath=DEVICE\aime.txt
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Network settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[dns]
|
||||
; Insert the hostname or IP address of the server you wish to use here.
|
||||
; Note that 127.0.0.1, localhost etc are specifically rejected.
|
||||
@ -19,14 +37,56 @@ default=127.0.0.1
|
||||
; setting enabled is strongly recommended.
|
||||
enable=1
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Board settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[gpio]
|
||||
; Emulated Nu DIP switch for Distribution Server setting.
|
||||
;
|
||||
; If multiple machines are present on the same LAN then set this to 1 on
|
||||
; exactly one machine and set this to 0 on all others.
|
||||
dipsw1=1
|
||||
|
||||
[keychip]
|
||||
; The /24 LAN subnet that the emulated keychip will tell the game to expect.
|
||||
; If you disable netenv then you must set this to your LAN's IP subnet, and
|
||||
; that subnet must start with 192.168.
|
||||
subnet=192.168.150.0
|
||||
subnet=192.168.78.0
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Custom IO settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[aimeio]
|
||||
; To use a custom card reader IO DLL enter its path here.
|
||||
; Leave empty if you want to use Segatools built-in keyboard input.
|
||||
path=
|
||||
|
||||
[divaio]
|
||||
; To use a custom Project DIVA Arcade IO DLL enter its path here.
|
||||
; Leave empty if you want to use Segatools built-in gamepad/wheel input.
|
||||
path=
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Input settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
; Keyboard bindings are specified as hexadecimal (prefixed with 0x) or decimal
|
||||
; (not prefixed with 0x) virtual-key codes, a list of which can be found here:
|
||||
;
|
||||
; https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes
|
||||
;
|
||||
; This is, admittedly, not the most user-friendly configuration method in the
|
||||
; world. An improved solution will be provided later.
|
||||
|
||||
[io3]
|
||||
; Test button virtual-key code. Default is the F1 key.
|
||||
test=0x70
|
||||
; Service button virtual-key code. Default is the F2 key.
|
||||
service=0x71
|
||||
; Keyboard button to increment coin counter. Default is the F3 key.
|
||||
coin=0x72
|
||||
|
||||
[slider]
|
||||
cell1=0x51
|
||||
|
158
dist/fgo/segatools.ini
vendored
158
dist/fgo/segatools.ini
vendored
@ -1,3 +1,7 @@
|
||||
; -----------------------------------------------------------------------------
|
||||
; Path settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[vfs]
|
||||
; Insert the path to the game AMFS directory here (contains ICF1 and ICF2)
|
||||
amfs=
|
||||
@ -8,49 +12,21 @@ option=
|
||||
; NOTE: This has nothing to do with Windows %APPDATA%.
|
||||
appdata=
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Device settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[aime]
|
||||
; Controls emulation of the Aime card reader assembly.
|
||||
; Enable Aime card reader assembly emulation. Disable to use a real SEGA Aime
|
||||
; reader.
|
||||
enable=1
|
||||
aimePath=DEVICE\aime.txt
|
||||
|
||||
[dns]
|
||||
; Insert the hostname or IP address of the server you wish to use here.
|
||||
; Note that 127.0.0.1, localhost etc are specifically rejected.
|
||||
default=127.0.0.1
|
||||
|
||||
[netenv]
|
||||
; Simulate an ideal LAN environment. This may interfere with head-to-head play.
|
||||
; SEGA games are somewhat picky about their LAN environment, so leaving this
|
||||
; setting enabled is recommended.
|
||||
[vfd]
|
||||
; Enable VFD emulation (currently just stubbed). Disable to use a real VFD
|
||||
; GP1232A02A FUTABA assembly.
|
||||
enable=1
|
||||
|
||||
; The final octet of the local host's IP address on the virtualized subnet (so,
|
||||
; if the keychip subnet is `192.168.32.0` and this value is set to `11`, then the
|
||||
; local host's virtualized LAN IP is `192.168.32.11`).
|
||||
addrSuffix=11
|
||||
|
||||
[keychip]
|
||||
; The /24 LAN subnet that the emulated keychip will tell the game to expect.
|
||||
; If you disable netenv then you must set this to your LAN's IP subnet, and
|
||||
; that subnet must start with 192.168.
|
||||
subnet=192.168.172.0
|
||||
|
||||
[touch]
|
||||
; WinTouch emulation setting.
|
||||
enable=1
|
||||
remap=1
|
||||
cursor=1
|
||||
|
||||
[printer]
|
||||
; Sinfonia CHC-C330 printer emulation setting.
|
||||
enable=1
|
||||
; Change the printer serial number here.
|
||||
serial_no="5A-A123"
|
||||
; Insert the path to the image output directory here.
|
||||
printerOutPath="DEVICE\print"
|
||||
; Rotate all printed images by 180 degrees.
|
||||
rotate180=1
|
||||
|
||||
[deckReader]
|
||||
; 837-15345 RFID deck reader emulation setting.
|
||||
enable=1
|
||||
@ -67,6 +43,78 @@ enable=1
|
||||
; COM port number for the LED board. Has to be the same as the FTDI port.
|
||||
portNo=17
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Network settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[dns]
|
||||
; Insert the hostname or IP address of the server you wish to use here.
|
||||
; Note that 127.0.0.1, localhost etc are specifically rejected.
|
||||
default=127.0.0.1
|
||||
|
||||
[netenv]
|
||||
; Simulate an ideal LAN environment. This may interfere with head-to-head play.
|
||||
; SEGA games are somewhat picky about their LAN environment, so leaving this
|
||||
; setting enabled is recommended.
|
||||
enable=1
|
||||
; The final octet of the local host's IP address on the virtualized subnet (so,
|
||||
; if the keychip subnet is `192.168.32.0` and this value is set to `11`, then the
|
||||
; local host's virtualized LAN IP is `192.168.32.11`).
|
||||
addrSuffix=11
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Board settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[keychip]
|
||||
; The /24 LAN subnet that the emulated keychip will tell the game to expect.
|
||||
; If you disable netenv then you must set this to your LAN's IP subnet, and
|
||||
; that subnet must start with 192.168.
|
||||
subnet=192.168.167.0
|
||||
|
||||
[gpio]
|
||||
; ALLS DIP switches.
|
||||
enable=1
|
||||
|
||||
; Enable freeplay mode. This will disable the coin slot and set the game to
|
||||
; freeplay. Keep in mind that some game modes (e.g. Freedom/Time Modes) will not
|
||||
; allow you to start a game in freeplay mode.
|
||||
freeplay=0
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Misc. hook settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[touch]
|
||||
; WinTouch emulation setting.
|
||||
enable=1
|
||||
remap=1
|
||||
cursor=1
|
||||
|
||||
[printer]
|
||||
; Sinfonia CHC-C330 printer emulation setting.
|
||||
enable=1
|
||||
; Change the printer serial number here.
|
||||
serial_no="5A-A123"
|
||||
; Insert the path to the image output directory here.
|
||||
printerOutPath="DEVICE\print"
|
||||
; Rotate all printed images by 180 degrees.
|
||||
rotate180=1
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Custom IO settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[aimeio]
|
||||
; To use a custom card reader IO DLL enter its path here.
|
||||
; Leave empty if you want to use Segatools built-in keyboard input.
|
||||
path=
|
||||
|
||||
[fgoio]
|
||||
; To use a custom Fate/Grand Order Arcade IO DLL enter its path here.
|
||||
; Leave empty if you want to use Segatools built-in gamepad input.
|
||||
path=
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Input settings
|
||||
; -----------------------------------------------------------------------------
|
||||
@ -81,9 +129,33 @@ portNo=17
|
||||
|
||||
[io4]
|
||||
; Input API selection for JVS input emulator.
|
||||
; Test button virtual-key code. Default is the 1 key.
|
||||
test=0x31
|
||||
; Service button virtual-key code. Default is the 2 key.
|
||||
service=0x32
|
||||
; Keyboard button to increment coin counter. Default is the 3 key.
|
||||
coin=0x33
|
||||
; Test button virtual-key code. Default is the F1 key.
|
||||
test=0x70
|
||||
; Service button virtual-key code. Default is the F2 key.
|
||||
service=0x71
|
||||
; Keyboard button to increment coin counter. Default is the F3 key.
|
||||
coin=0x72
|
||||
|
||||
; .·:'''''''''''''''''''''''''''''''''''''''''''''':·.
|
||||
; : : ______ / \ [] : :
|
||||
; : : | | _____ \ / Coin : :
|
||||
; : : |______| { (0) } /--\ Attack. : :
|
||||
; : : DECK \ / / \ : :
|
||||
; : : | | > < : :
|
||||
; : : | | \ / ___ : :
|
||||
; : : | | \--/ | | : :
|
||||
; : : JOY Noble. | | : :
|
||||
; : : |___| : :
|
||||
; : : AIME. : :
|
||||
; '·:..............................................:·'
|
||||
;
|
||||
; Only XInput is currently supported.
|
||||
|
||||
; XInput bindings
|
||||
;
|
||||
; Left Stick Joystick
|
||||
; Left Stick Click Reset Camera
|
||||
; Left Trigger Dash
|
||||
; Left Shoulder Switch Target
|
||||
; A/B Attack
|
||||
; X/Y Noble Phantasm
|
||||
|
52
dist/idac/segatools.ini
vendored
52
dist/idac/segatools.ini
vendored
@ -1,18 +1,30 @@
|
||||
; -----------------------------------------------------------------------------
|
||||
; Path settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[vfs]
|
||||
; Insert the path to the game AMFS directory here (contains ICF1 and ICF2)
|
||||
amfs=
|
||||
; Insert the path to the game Option directory here (contains OPxx directories)
|
||||
; Insert the path to the game Option directory here (contains MVxx directories)
|
||||
option=
|
||||
; Create an empty directory somewhere and insert the path here.
|
||||
; This directory may be shared between multiple SEGA games.
|
||||
; NOTE: This has nothing to do with Windows %APPDATA%.
|
||||
appdata=
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Device settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[aime]
|
||||
; Controls emulation of the Aime card reader assembly.
|
||||
enable=1
|
||||
aimePath=DEVICE\aime.txt
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Network settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[dns]
|
||||
; Insert the hostname or IP address of the server you wish to use here.
|
||||
; Note that 127.0.0.1, localhost etc are specifically rejected.
|
||||
@ -24,6 +36,10 @@ default=127.0.0.1
|
||||
; setting enabled is recommended.
|
||||
enable=1
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Board settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[keychip]
|
||||
; The /24 LAN subnet that the emulated keychip will tell the game to expect.
|
||||
; If you disable netenv then you must set this to your LAN's IP subnet, and
|
||||
@ -59,13 +75,17 @@ dipsw3=0
|
||||
dipsw4=0
|
||||
dipsw5=0
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Custom IO settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[aimeio]
|
||||
; To use a custom card reader IO DLL enter its path here.
|
||||
; Leave empty if you want to use Segatools built-in keyboard input.
|
||||
path=
|
||||
|
||||
[idacio]
|
||||
; To use a custom Initial D The Arcade IO DLL enter its path here.
|
||||
; To use a custom Initial D THE ARCADE IO DLL enter its path here.
|
||||
; Leave empty if you want to use Segatools built-in gamepad/wheel input.
|
||||
path=
|
||||
|
||||
@ -82,12 +102,12 @@ path=
|
||||
; world. An improved solution will be provided later.
|
||||
|
||||
[io4]
|
||||
; Test button virtual-key code. Default is the 1 key.
|
||||
test=0x31
|
||||
; Service button virtual-key code. Default is the 2 key.
|
||||
service=0x32
|
||||
; Keyboard button to increment coin counter. Default is the 3 key.
|
||||
coin=0x33
|
||||
; Test button virtual-key code. Default is the F1 key.
|
||||
test=0x70
|
||||
; Service button virtual-key code. Default is the F2 key.
|
||||
service=0x71
|
||||
; Keyboard button to increment coin counter. Default is the F3 key.
|
||||
coin=0x72
|
||||
|
||||
; Input API selection for IO4 input emulator.
|
||||
; Set "xinput" to use a gamepad and "dinput" to use a steering wheel.
|
||||
@ -106,6 +126,22 @@ mode=xinput
|
||||
restrict=128
|
||||
|
||||
[xinput]
|
||||
; XInput bindings
|
||||
;
|
||||
; Left Stick Steering
|
||||
; Right Stick (Steering) when "singleStickSteering" is disabled
|
||||
; Left Trigger Brake
|
||||
; Right Trigger Accelerator
|
||||
; Left Stick Click Left (used for Time Up)
|
||||
; Right Stick Click Right (used for Time Up)
|
||||
; Left Shoulder Shift Down
|
||||
; Right Shoulder Shift Up
|
||||
; Start/A Start
|
||||
; Back/B View Change
|
||||
; X Shift Up
|
||||
; Y Shift Down
|
||||
; D-Pad D-Pad
|
||||
|
||||
; Left and right thumbsticks are mapped to left and right dpad buttons.
|
||||
; Press both thumbsticks to trigger "Time Up" and exit the course.
|
||||
; Automatically reset the simulated shifter to Neutral when XInput Start is
|
||||
|
27
dist/idac/start.bat
vendored
27
dist/idac/start.bat
vendored
@ -2,20 +2,6 @@
|
||||
|
||||
pushd %~dp0
|
||||
|
||||
REM set the APP_DIR to the Y drive
|
||||
set APP_DIR=Y:\SDGT
|
||||
|
||||
REM create the APP_DIR if it doesn't exist and redirect it to the TEMP folder
|
||||
if not exist "%APP_DIR%" (
|
||||
subst Y: %TEMP%
|
||||
REM timeout /t 1
|
||||
if not exist "%APP_DIR%" (
|
||||
mkdir "%APP_DIR%"
|
||||
)
|
||||
)
|
||||
|
||||
echo Mounted the Y:\ drive to the %TEMP%\SDGT folder
|
||||
|
||||
set AMDAEMON_CFG=config_common.json ^
|
||||
config_ex.json ^
|
||||
config_jp.json ^
|
||||
@ -39,12 +25,15 @@ config_seat_single_ex.json ^
|
||||
config_seat_single_jp.json ^
|
||||
config_hook.json
|
||||
|
||||
start /min inject -d -k idachook.dll amdaemon.exe -c %AMDAEMON_CFG%
|
||||
inject -d -k idachook.dll ..\WindowsNoEditor\GameProject.exe -culture=en launch=Cabinet ABSLOG="..\..\..\..\..\Userdata\GameProject.log" -Master -UserDir="..\..\..\Userdata" -NotInstalled -UNATTENDED
|
||||
taskkill /f /im amdaemon.exe > nul 2>&1
|
||||
start "AM Daemon" /min inject -d -k idachook.dll amdaemon.exe -c %AMDAEMON_CFG%
|
||||
|
||||
REM unmount the APP_DIR
|
||||
subst Y: /d > nul 2>&1
|
||||
rem JP
|
||||
rem inject -d -k idachook.dll ..\WindowsNoEditor\GameProject\Binaries\Win64\GameProject-Win64-Shipping.exe -culture=ja launch=Cabinet ABSLOG="..\..\..\..\..\Userdata\GameProject.log" -Master -UserDir="..\..\..\Userdata" -NotInstalled -UNATTENDED
|
||||
|
||||
rem EXP
|
||||
inject -d -k idachook.dll ..\WindowsNoEditor\GameProject\Binaries\Win64\GameProject-Win64-Shipping.exe -culture=en launch=Cabinet ABSLOG="..\..\..\..\..\Userdata\GameProject.log" -Master -UserDir="..\..\..\Userdata" -NotInstalled -UNATTENDED
|
||||
|
||||
taskkill /f /im amdaemon.exe > nul 2>&1
|
||||
|
||||
echo.
|
||||
echo Game processes have terminated
|
||||
|
93
dist/idz/segatools.ini
vendored
93
dist/idz/segatools.ini
vendored
@ -1,3 +1,7 @@
|
||||
; -----------------------------------------------------------------------------
|
||||
; Path settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[vfs]
|
||||
; Insert the path to the game AMFS directory here (contains ICF1 and ICF2)
|
||||
amfs=
|
||||
@ -8,6 +12,10 @@ option=
|
||||
; NOTE: This has nothing to do with Windows %APPDATA%.
|
||||
appdata=
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Device settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[aime]
|
||||
; Controls emulation of the Aime card reader assembly.
|
||||
enable=1
|
||||
@ -16,11 +24,36 @@ aimePath=DEVICE\aime.txt
|
||||
felicaGen=0
|
||||
aimeGen=1
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Network settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[dns]
|
||||
; Insert the hostname or IP address of the server you wish to use here.
|
||||
; Note that 127.0.0.1, localhost etc are specifically rejected.
|
||||
default=127.0.0.1
|
||||
|
||||
[netenv]
|
||||
; Simulate an ideal LAN environment. This may interfere with head-to-head play.
|
||||
; SEGA games are somewhat picky about their LAN environment, so leaving this
|
||||
; setting enabled is recommended.
|
||||
enable=1
|
||||
; The final octet of the local host's IP address on the virtualized subnet
|
||||
; (so, if the keychip subnet is 192.168.32.0 and this value is set to 11,
|
||||
; then the local host's virtualized LAN IP is 192.168.32.11).
|
||||
; Needed for in store battle, one needs to set it to 12.
|
||||
;addrSuffix=12
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Board settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[keychip]
|
||||
; The /24 LAN subnet that the emulated keychip will tell the game to expect.
|
||||
; If you disable netenv then you must set this to your LAN's IP subnet, and
|
||||
; that subnet must start with 192.168.
|
||||
subnet=192.168.158.0
|
||||
|
||||
[ds]
|
||||
; Region code on the emulated AMEX board DS EEPROM.
|
||||
; 1: Japan
|
||||
@ -29,23 +62,16 @@ default=127.0.0.1
|
||||
; NOTE: Changing this setting causes a factory reset.
|
||||
region=4
|
||||
|
||||
[netenv]
|
||||
; Simulate an ideal LAN environment. This may interfere with head-to-head play.
|
||||
; SEGA games are somewhat picky about their LAN environment, so leaving this
|
||||
; setting enabled is recommended.
|
||||
enable=1
|
||||
[gpio]
|
||||
; Emulated Nu DIP switch for Distribution Server setting.
|
||||
;
|
||||
; If multiple machines are present on the same LAN then set this to 1 on
|
||||
; exactly one machine and set this to 0 on all others.
|
||||
dipsw1=1
|
||||
|
||||
; The final octet of the local host's IP address on the virtualized subnet
|
||||
; (so, if the keychip subnet is 192.168.32.0 and this value is set to 11,
|
||||
; then the local host's virtualized LAN IP is 192.168.32.11).
|
||||
; Needed for in store battle, one needs to set it to 12.
|
||||
;addrSuffix=12
|
||||
|
||||
[keychip]
|
||||
; The /24 LAN subnet that the emulated keychip will tell the game to expect.
|
||||
; If you disable netenv then you must set this to your LAN's IP subnet, and
|
||||
; that subnet must start with 192.168.
|
||||
subnet=192.168.158.0
|
||||
; -----------------------------------------------------------------------------
|
||||
; Misc. hooks settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[gfx]
|
||||
; Enables the graphics hook. This is required for some Initial D Zero versions
|
||||
@ -58,12 +84,9 @@ framed=1
|
||||
; Select the monitor to run the game on. (Fullscreen only, 0=primary screen)
|
||||
monitor=0
|
||||
|
||||
[gpio]
|
||||
; Emulated Nu DIP switch for Distribution Server setting.
|
||||
;
|
||||
; If multiple machines are present on the same LAN then set this to 1 on
|
||||
; exactly one machine and set this to 0 on all others.
|
||||
dipsw1=1
|
||||
; -----------------------------------------------------------------------------
|
||||
; Custom IO settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[aimeio]
|
||||
; To use a custom card reader IO DLL enter its path here.
|
||||
@ -88,12 +111,12 @@ path=
|
||||
; world. An improved solution will be provided later.
|
||||
|
||||
[io3]
|
||||
; Test button virtual-key code. Default is the 1 key.
|
||||
test=0x31
|
||||
; Service button virtual-key code. Default is the 2 key.
|
||||
service=0x32
|
||||
; Keyboard button to increment coin counter. Default is the 3 key.
|
||||
coin=0x33
|
||||
; Test button virtual-key code. Default is the F1 key.
|
||||
test=0x70
|
||||
; Service button virtual-key code. Default is the F2 key.
|
||||
service=0x71
|
||||
; Keyboard button to increment coin counter. Default is the F3 key.
|
||||
coin=0x72
|
||||
|
||||
; Input API selection for JVS input emulator.
|
||||
; Set "xinput" to use a gamepad and "dinput" to use a steering wheel.
|
||||
@ -112,6 +135,20 @@ mode=xinput
|
||||
restrict=97
|
||||
|
||||
[xinput]
|
||||
; XInput bindings
|
||||
;
|
||||
; Left Stick Steering
|
||||
; Right Stick (Steering) when "singleStickSteering" is disabled
|
||||
; Left Trigger Brake
|
||||
; Right Trigger Accelerator
|
||||
; Left Shoulder Shift Down
|
||||
; Right Shoulder Shift Up
|
||||
; Start/A Start
|
||||
; Back/B View Change
|
||||
; X Shift Up
|
||||
; Y Shift Down
|
||||
; D-Pad D-Pad
|
||||
|
||||
; Automatically reset the simulated shifter to Neutral when XInput Start is
|
||||
; pressed (e.g. when navigating menus between races).
|
||||
autoNeutral=1
|
||||
|
67
dist/mai2/segatools.ini
vendored
67
dist/mai2/segatools.ini
vendored
@ -1,18 +1,36 @@
|
||||
; -----------------------------------------------------------------------------
|
||||
; Path settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[vfs]
|
||||
; Insert the path to the game AMFS directory here (contains ICF1 and ICF2)
|
||||
amfs=
|
||||
; Insert the path to the game Option directory here (contains Axxx, Bxxx directories)
|
||||
; Insert the path to the game Option directory here (contains Axxx directories)
|
||||
option=
|
||||
; Create an empty directory somewhere and insert the path here.
|
||||
; This directory may be shared between multiple SEGA games.
|
||||
; NOTE: This has nothing to do with Windows %APPDATA%.
|
||||
appdata=
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Device settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[aime]
|
||||
; Enable aime reader emulation.
|
||||
; Enable Aime card reader assembly emulation. Disable to use a real SEGA Aime
|
||||
; reader.
|
||||
enable=1
|
||||
aimePath=DEVICE\aime.txt
|
||||
|
||||
[vfd]
|
||||
; Enable VFD emulation (currently just stubbed). Disable to use a real VFD
|
||||
; GP1232A02A FUTABA assembly.
|
||||
enable=1
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Network settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[dns]
|
||||
; Insert the hostname or IP address of the server you wish to use here.
|
||||
; Note that 127.0.0.1, localhost etc are specifically rejected.
|
||||
@ -23,12 +41,20 @@ default=127.0.0.1
|
||||
; SEGA games are somewhat picky about its LAN environment, so leaving this
|
||||
; setting enabled is recommended.
|
||||
enable=1
|
||||
; The final octet of the local host's IP address on the virtualized subnet (so,
|
||||
; if the keychip subnet is `192.168.32.0` and this value is set to `11`, then the
|
||||
; local host's virtualized LAN IP is `192.168.32.11`).
|
||||
addrSuffix=11
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Board settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[keychip]
|
||||
; The /24 LAN subnet that the emulated keychip will tell the game to expect.
|
||||
; If you disable netenv then you must set this to your LAN's IP subnet, and
|
||||
; that subnet must start with 192.168.
|
||||
subnet=192.168.100.0
|
||||
subnet=192.168.172.0
|
||||
|
||||
[gpio]
|
||||
; ALLS DIP switches.
|
||||
@ -43,6 +69,29 @@ freeplay=0
|
||||
; this to 1 on exactly one machine and set this to 0 on all others.
|
||||
dipsw1=1
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Custom IO settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[aimeio]
|
||||
; To use a custom card reader IO DLL enter its path here.
|
||||
; Leave empty if you want to use Segatools built-in keyboard input.
|
||||
path=
|
||||
|
||||
[mai2io]
|
||||
; To use a custom maimai DX IO DLL enter its path here.
|
||||
; Leave empty if you want to use Segatools built-in keyboard input.
|
||||
path=
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Misc. hook settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[unity]
|
||||
; Path to a .NET DLL that should run before the game. Useful for loading
|
||||
; modding frameworks such as BepInEx.
|
||||
targetAssembly=
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Input settings
|
||||
; -----------------------------------------------------------------------------
|
||||
@ -56,12 +105,12 @@ dipsw1=1
|
||||
; world. An improved solution will be provided later.
|
||||
|
||||
[io4]
|
||||
; Test button virtual-key code. Default is the 1 key.
|
||||
test=0x31
|
||||
; Service button virtual-key code. Default is the 2 key.
|
||||
service=0x32
|
||||
; Keyboard button to increment coin counter. Default is the 3 key.
|
||||
coin=0x33
|
||||
; Test button virtual-key code. Default is the F1 key.
|
||||
test=0x70
|
||||
; Service button virtual-key code. Default is the F2 key.
|
||||
service=0x71
|
||||
; Keyboard button to increment coin counter. Default is the F3 key.
|
||||
coin=0x72
|
||||
|
||||
; Key bindings for buttons around screen. The default key map, depicted
|
||||
; in clockwise order, is as follows:
|
||||
|
5
dist/mai2/start.bat
vendored
5
dist/mai2/start.bat
vendored
@ -2,8 +2,9 @@
|
||||
|
||||
pushd %~dp0
|
||||
|
||||
start /min inject -d -k mai2hook.dll amdaemon.exe -f -c config_common.json config_server.json config_client.json
|
||||
inject -d -k mai2hook.dll sinmai -screen-fullscreen 0
|
||||
start "AM Daemon" /min inject -d -k mai2hook.dll amdaemon.exe -f -c config_common.json config_server.json config_client.json
|
||||
inject -d -k mai2hook.dll sinmai -screen-fullscreen 0 -popupwindow -screen-width 2160 -screen-height 1920 -silent-crashes
|
||||
|
||||
taskkill /f /im amdaemon.exe > nul 2>&1
|
||||
|
||||
echo.
|
||||
|
94
dist/mercury/segatools.ini
vendored
94
dist/mercury/segatools.ini
vendored
@ -1,11 +1,35 @@
|
||||
; -----------------------------------------------------------------------------
|
||||
; Path settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[vfs]
|
||||
; Insert the path to the game AMFS directory here (contains ICF1 and ICF2)
|
||||
amfs=amfs
|
||||
amfs=
|
||||
; Insert the path to the game Option directory here (contains Axxx directories)
|
||||
option=
|
||||
; Create an empty directory somewhere and insert the path here.
|
||||
; This directory may be shared between multiple SEGA games.
|
||||
; NOTE: This has nothing to do with Windows %APPDATA%.
|
||||
appdata=appdata
|
||||
option=option
|
||||
appdata=
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Device settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[aime]
|
||||
; Enable Aime card reader assembly emulation. Disable to use a real SEGA Aime
|
||||
; reader.
|
||||
enable=1
|
||||
aimePath=DEVICE\aime.txt
|
||||
|
||||
[vfd]
|
||||
; Enable VFD emulation (currently just stubbed). Disable to use a real VFD
|
||||
; GP1232A02A FUTABA assembly.
|
||||
enable=1
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Network settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[dns]
|
||||
; Insert the hostname or IP address of the server you wish to use here.
|
||||
@ -17,6 +41,14 @@ default=127.0.0.1
|
||||
; SEGA games are somewhat picky about their LAN environment, so leaving this
|
||||
; setting enabled is recommended.
|
||||
enable=1
|
||||
; The final octet of the local host's IP address on the virtualized subnet (so,
|
||||
; if the keychip subnet is `192.168.32.0` and this value is set to `11`, then the
|
||||
; local host's virtualized LAN IP is `192.168.32.11`).
|
||||
addrSuffix=11
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Board settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[keychip]
|
||||
; The /24 LAN subnet that the emulated keychip will tell the game to expect.
|
||||
@ -24,9 +56,6 @@ enable=1
|
||||
; that subnet must start with 192.168.
|
||||
subnet=192.168.174.0
|
||||
|
||||
[gfx]
|
||||
enable=1
|
||||
|
||||
[gpio]
|
||||
; ALLS DIP switches.
|
||||
enable=1
|
||||
@ -40,6 +69,35 @@ freeplay=0
|
||||
; this to 1 on exactly one machine and set this to 0 on all others.
|
||||
dipsw1=1
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Misc. hook settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[gfx]
|
||||
enable=1
|
||||
|
||||
; Hooks related to the touch boards
|
||||
[touch]
|
||||
enable=1
|
||||
|
||||
; Hooks related to the LED board (codenamed Elisabeth)
|
||||
[elisabeth]
|
||||
enable=1
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Custom IO settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[aimeio]
|
||||
; To use a custom card reader IO DLL enter its path here.
|
||||
; Leave empty if you want to use Segatools built-in keyboard input.
|
||||
path=
|
||||
|
||||
[mercuryio]
|
||||
; To use a custom WACCA IO DLL enter its path here.
|
||||
; Leave empty if you want to use Segatools built-in keyboard input.
|
||||
path=
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Input settings
|
||||
; -----------------------------------------------------------------------------
|
||||
@ -53,26 +111,14 @@ dipsw1=1
|
||||
; world. An improved solution will be provided later.
|
||||
|
||||
[io4]
|
||||
; Test button virtual-key code. Default is the 1 key.
|
||||
test=0x31
|
||||
; Service button virtual-key code. Default is the 2 key.
|
||||
service=0x32
|
||||
; Keyboard button to increment coin counter. Default is the 3 key.
|
||||
coin=0x33
|
||||
; Test button virtual-key code. Default is the F1 key.
|
||||
test=0x70
|
||||
; Service button virtual-key code. Default is the F2 key.
|
||||
service=0x71
|
||||
; Keyboard button to increment coin counter. Default is the F3 key.
|
||||
coin=0x72
|
||||
|
||||
; Volume up virtual-key code. Default is the "UP" key.
|
||||
volup=0x26
|
||||
; Volume down virtual-key code. Default is the "DOWN" key.
|
||||
voldown=0x28
|
||||
|
||||
; Hooks related to the touch boards
|
||||
[touch]
|
||||
enable=1
|
||||
|
||||
; Hooks related to the LED board (codenamed Elisabeth)
|
||||
[elisabeth]
|
||||
enable=1
|
||||
|
||||
;[mercuryio]
|
||||
; Use mercuryio.dll
|
||||
;path=mercuryio.dll
|
||||
|
4
dist/mercury/start.bat
vendored
4
dist/mercury/start.bat
vendored
@ -4,10 +4,10 @@ pushd %~dp0
|
||||
taskkill /f /im amdaemon.exe > nul 2>&1
|
||||
|
||||
REM USA
|
||||
REM start inject -d -k mercuryhook.dll amdaemon.exe -f -c config.json config_lan_install_client.json config_lan_install_server.json config_video_clone.json config_video_dual.json config_video_clone_flip.json config_video_dual_flip.json config_region_exp.json config_region_chn.json config_region_usa.json
|
||||
start "AM Daemon" /min inject -d -k mercuryhook.dll amdaemon.exe -f -c config.json config_lan_install_client.json config_lan_install_server.json config_video_clone.json config_video_dual.json config_video_clone_flip.json config_video_dual_flip.json config_region_exp.json config_region_chn.json config_region_usa.json
|
||||
|
||||
REM JP
|
||||
start inject -d -k mercuryhook.dll amdaemon.exe -f -c config.json config_lan_install_client.json config_lan_install_server.json config_video_clone.json config_video_dual.json config_video_clone_flip.json config_video_dual_flip.json config_region_exp.json config_region_chn.json config_region_jpn.json
|
||||
start "AM Daemon" /min inject -d -k mercuryhook.dll amdaemon.exe -f -c config.json config_lan_install_client.json config_lan_install_server.json config_video_clone.json config_video_dual.json config_video_clone_flip.json config_video_dual_flip.json config_region_exp.json config_region_chn.json config_region_jpn.json
|
||||
inject -d -k mercuryhook.dll ../WindowsNoEditor/Mercury/Binaries/Win64/Mercury-Win64-Shipping.exe
|
||||
|
||||
taskkill /f /im amdaemon.exe > nul 2>&1
|
||||
|
92
dist/mu3/segatools.ini
vendored
92
dist/mu3/segatools.ini
vendored
@ -1,3 +1,7 @@
|
||||
; -----------------------------------------------------------------------------
|
||||
; Path settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[vfs]
|
||||
; Insert the path to the game AMFS directory here (contains ICF1 and ICF2)
|
||||
amfs=
|
||||
@ -8,11 +12,25 @@ option=
|
||||
; NOTE: This has nothing to do with Windows %APPDATA%.
|
||||
appdata=
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Device settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[aime]
|
||||
; Controls emulation of the Aime card reader assembly.
|
||||
; Enable Aime card reader assembly emulation. Disable to use a real SEGA Aime
|
||||
; reader.
|
||||
enable=1
|
||||
aimePath=DEVICE\aime.txt
|
||||
|
||||
[vfd]
|
||||
; Enable VFD emulation (currently just stubbed). Disable to use a real VFD
|
||||
; GP1232A02A FUTABA assembly.
|
||||
enable=1
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Network settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[dns]
|
||||
; Insert the hostname or IP address of the server you wish to use here.
|
||||
; Note that 127.0.0.1, localhost etc are specifically rejected.
|
||||
@ -24,6 +42,10 @@ default=127.0.0.1
|
||||
; setting enabled is recommended.
|
||||
enable=1
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Board settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[keychip]
|
||||
; The /24 LAN subnet that the emulated keychip will tell the game to expect.
|
||||
; If you disable netenv then you must set this to your LAN's IP subnet, and
|
||||
@ -43,12 +65,31 @@ freeplay=0
|
||||
; this to 1 on exactly one machine and set this to 0 on all others.
|
||||
dipsw1=1
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Misc. hook settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[gfx]
|
||||
enable=1
|
||||
|
||||
[led15093]
|
||||
; 837-15093-06 LED board emulation setting.
|
||||
enable=1
|
||||
[unity]
|
||||
; Path to a .NET DLL that should run before the game. Useful for loading
|
||||
; modding frameworks such as BepInEx.
|
||||
targetAssembly=
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Custom IO settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[aimeio]
|
||||
; To use a custom card reader IO DLL enter its path here.
|
||||
; Leave empty if you want to use Segatools built-in keyboard input.
|
||||
path=
|
||||
|
||||
[mu3io]
|
||||
; To use a custom O.N.G.E.K.I. IO DLL enter its path here.
|
||||
; Leave empty if you want to use Segatools built-in keyboard/gamepad input.
|
||||
path=
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Input settings
|
||||
@ -63,28 +104,43 @@ enable=1
|
||||
; world. An improved solution will be provided later.
|
||||
|
||||
[io4]
|
||||
; Input API selection for JVS input emulator.
|
||||
; Test button virtual-key code. Default is the 1 key.
|
||||
test=0x31
|
||||
; Service button virtual-key code. Default is the 2 key.
|
||||
service=0x32
|
||||
; Keyboard button to increment coin counter. Default is the 3 key.
|
||||
coin=0x33
|
||||
; Test button virtual-key code. Default is the F1 key.
|
||||
test=0x70
|
||||
; Service button virtual-key code. Default is the F2 key.
|
||||
service=0x71
|
||||
; Keyboard button to increment coin counter. Default is the F3 key.
|
||||
coin=0x72
|
||||
|
||||
; Set "1" to enable mouse lever emulation, "0" to use XInput
|
||||
mouse=1
|
||||
|
||||
; XInput input bindings
|
||||
;
|
||||
; Left Stick Lever
|
||||
; Left Trigger Lever (move to the left)
|
||||
; Right Trigger Lever (move to the right)
|
||||
; Left Left red button
|
||||
; Up Left green button
|
||||
; Right Left blue button
|
||||
; Left Shoulder Left side button
|
||||
; Right Shoulder Right side button
|
||||
; X Right red button
|
||||
; Y Right green button
|
||||
; A Right blue button
|
||||
; Back Left menu button
|
||||
; Start Right menu button
|
||||
|
||||
; Keyboard input bindings
|
||||
left1=0x41 ; A
|
||||
left2=0x53 ; S
|
||||
left3=0x44 ; D
|
||||
left2=0x53 ; S
|
||||
left3=0x44 ; D
|
||||
|
||||
leftSide=0x01 ; Mouse Left
|
||||
rightSide=0x02 ; Mouse Right
|
||||
leftSide=0x01 ; Mouse Left
|
||||
rightSide=0x02 ; Mouse Right
|
||||
|
||||
right1=0x4A ; J
|
||||
right1=0x4B ; K
|
||||
right3=0x4C ; L
|
||||
right3=0x4C ; L
|
||||
|
||||
leftMenu=0x55 ; U
|
||||
rightMenu=0x4F ; O
|
||||
leftMenu=0x55 ; U
|
||||
rightMenu=0x4F ; O
|
||||
|
2
dist/mu3/start.bat
vendored
2
dist/mu3/start.bat
vendored
@ -2,7 +2,7 @@
|
||||
|
||||
pushd %~dp0
|
||||
|
||||
start /min inject -d -k mu3hook.dll amdaemon.exe -f -c config_common.json config_server.json config_client.json
|
||||
start "AM Daemon" /min inject -d -k mu3hook.dll amdaemon.exe -f -c config_common.json config_server.json config_client.json
|
||||
inject -d -k mu3hook.dll mu3 -screen-fullscreen 0 -popupwindow -screen-width 1080 -screen-height 1920
|
||||
taskkill /f /im amdaemon.exe > nul 2>&1
|
||||
|
||||
|
6
dist/swdc/config_hook.json
vendored
Normal file
6
dist/swdc/config_hook.json
vendored
Normal file
@ -0,0 +1,6 @@
|
||||
{
|
||||
"emoney" :
|
||||
{
|
||||
"enable" : false
|
||||
}
|
||||
}
|
84
dist/swdc/segatools.ini
vendored
84
dist/swdc/segatools.ini
vendored
@ -1,18 +1,36 @@
|
||||
; -----------------------------------------------------------------------------
|
||||
; Path settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[vfs]
|
||||
; Insert the path to the game AMFS directory here (contains ICF1 and ICF2)
|
||||
amfs=
|
||||
; Insert the path to the game Option directory here (contains OPxx directories)
|
||||
; Insert the path to the game Option directory here (contains Axxx directories)
|
||||
option=
|
||||
; Create an empty directory somewhere and insert the path here.
|
||||
; This directory may be shared between multiple SEGA games.
|
||||
; NOTE: This has nothing to do with Windows %APPDATA%.
|
||||
appdata=
|
||||
appdata=appdata
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Device settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[aime]
|
||||
; Controls emulation of the Aime card reader assembly.
|
||||
; Enable Aime card reader assembly emulation. Disable to use a real SEGA Aime
|
||||
; reader.
|
||||
enable=1
|
||||
aimePath=DEVICE\aime.txt
|
||||
|
||||
[vfd]
|
||||
; Enable VFD emulation (currently just stubbed). Disable to use a real VFD
|
||||
; GP1232A02A FUTABA assembly.
|
||||
enable=1
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Network settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[dns]
|
||||
; Insert the hostname or IP address of the server you wish to use here.
|
||||
; Note that 127.0.0.1, localhost etc are specifically rejected.
|
||||
@ -23,12 +41,33 @@ default=127.0.0.1
|
||||
; SEGA games are somewhat picky about their LAN environment, so leaving this
|
||||
; setting enabled is recommended.
|
||||
enable=1
|
||||
; The final octet of the local host's IP address on the virtualized subnet (so,
|
||||
; if the keychip subnet is `192.168.32.0` and this value is set to `11`, then the
|
||||
; local host's virtualized LAN IP is `192.168.32.11`).
|
||||
addrSuffix=11
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Board settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[keychip]
|
||||
; The /24 LAN subnet that the emulated keychip will tell the game to expect.
|
||||
; You must set this to your LAN's IP subnet, and that subnet must start with 192.168,
|
||||
; in order to find the MAIN cabinet.
|
||||
subnet=192.168.100.0
|
||||
subnet=192.168.160.0
|
||||
|
||||
[gpio]
|
||||
; ALLS DIP switches.
|
||||
enable=1
|
||||
|
||||
; Enable freeplay mode. This will disable the coin slot and set the game to
|
||||
; freeplay. Keep in mind that some game modes (e.g. Freedom/Time Modes) will not
|
||||
; allow you to start a game in freeplay mode.
|
||||
freeplay=0
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Custom IO settings
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[aimeio]
|
||||
; To use a custom card reader IO DLL enter its path here.
|
||||
@ -40,15 +79,6 @@ path=
|
||||
; Leave empty if you want to use Segatools built-in gamepad/wheel input.
|
||||
path=
|
||||
|
||||
[gpio]
|
||||
; ALLS DIP switches.
|
||||
enable=1
|
||||
|
||||
; Enable freeplay mode. This will disable the coin slot and set the game to
|
||||
; freeplay. Keep in mind that some game modes (e.g. Freedom/Time Modes) will not
|
||||
; allow you to start a game in freeplay mode.
|
||||
freeplay=0
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; Input settings
|
||||
; -----------------------------------------------------------------------------
|
||||
@ -62,12 +92,12 @@ freeplay=0
|
||||
; world. An improved solution will be provided later.
|
||||
|
||||
[io4]
|
||||
; Test button virtual-key code. Default is the 1 key.
|
||||
test=0x31
|
||||
; Service button virtual-key code. Default is the 2 key.
|
||||
service=0x32
|
||||
; Keyboard button to increment coin counter. Default is the 3 key.
|
||||
coin=0x33
|
||||
; Test button virtual-key code. Default is the F1 key.
|
||||
test=0x70
|
||||
; Service button virtual-key code. Default is the F2 key.
|
||||
service=0x71
|
||||
; Keyboard button to increment coin counter. Default is the F3 key.
|
||||
coin=0x72
|
||||
|
||||
; Input API selection for IO4 input emulator.
|
||||
; Set "xinput" to use a gamepad and "dinput" to use a steering wheel.
|
||||
@ -86,6 +116,22 @@ mode=xinput
|
||||
restrict=128
|
||||
|
||||
[xinput]
|
||||
; XInput bindings
|
||||
;
|
||||
; Left Stick Steering
|
||||
; Right Stick (Steering) when "singleStickSteering" is disabled
|
||||
; Left Trigger Brake
|
||||
; Right Trigger Accelerator
|
||||
; Left Shoulder Left Paddle
|
||||
; Right Shoulder Right Paddle
|
||||
; Start Start
|
||||
; Back View Change
|
||||
; A Green (Wheel)
|
||||
; B Red (Wheel)
|
||||
; X Blue (Wheel)
|
||||
; Y Yellow (Wheel)
|
||||
; D-Pad D-Pad
|
||||
|
||||
; Use the left thumbstick for steering instead of both on XInput Controllers.
|
||||
; Not recommended as it will not give you the precision needed for this game.
|
||||
singleStickSteering=1
|
||||
|
36
dist/swdc/start.bat
vendored
36
dist/swdc/start.bat
vendored
@ -2,12 +2,36 @@
|
||||
|
||||
pushd %~dp0
|
||||
|
||||
rem Matching Server
|
||||
start /min ..\..\..\Tools\tdrserver.exe
|
||||
REM start /min inject -d -k swdchook.dll amdaemon.exe -c config.json config_LanClient.json config_MiniCabinet.json config_hook.json
|
||||
start /min inject -d -k swdchook.dll amdaemon.exe -c config.json config_LanServer.json config_MiniCabinet.json
|
||||
REM Valid -launch parameters are "PC", "Cabinet" and "MiniCabinet
|
||||
inject -d -k swdchook.dll ..\Todoroki\Binaries\Win64\Todoroki-Win64-Shipping.exe -launch=MiniCabinet -ABSLOG="..\..\..\..\..\Userdata\Todoroki.log" -UserDir="..\..\..\Userdata" -NotInstalled -UNATTENDED
|
||||
REM Root directory
|
||||
set ROOT_DIR=WindowsNoEditor
|
||||
|
||||
rem Matching Server paths
|
||||
set MATCHING_SERVER_FILE_NAME=tdrserver.exe
|
||||
set MATCHING_SERVER_PATH=..\Tools\%MATCHING_SERVER_FILE_NAME%
|
||||
|
||||
rem AM Daemon paths
|
||||
set DAEMON_DIR=%ROOT_DIR%\AMDaemon
|
||||
set DAEMON_CONFIG_PATH=%DAEMON_DIR%\config.json
|
||||
rem Make sure to use appdata=appdata in segatools.ini
|
||||
set DAEMON_CHECK_LAN_SERVER_PATH=appdata\SDDS\LanServer.dat
|
||||
|
||||
rem Check if LanServer.dat is present
|
||||
if exist "%DAEMON_CHECK_LAN_SERVER_PATH%" (
|
||||
set DAEMON_LAN_CONFIG_PATH=%DAEMON_DIR%\config_LanServer.json
|
||||
|
||||
start "matching_server" /min %MATCHING_SERVER_PATH%
|
||||
) else (
|
||||
set DAEMON_LAN_CONFIG_PATH=%DAEMON_DIR%\config_LanClient.json
|
||||
)
|
||||
|
||||
start "AM Daemon" /min inject -d -k swdchook.dll "%DAEMON_DIR%\amdaemon.exe" -c %DAEMON_CONFIG_PATH% -c %DAEMON_LAN_CONFIG_PATH% config_hook.json
|
||||
|
||||
REM Launch Todoroki
|
||||
set APP_EXE_DIR=WindowsNoEditor\Todoroki\Binaries\Win64
|
||||
set APP_EXE_PATH=%APP_EXE_DIR%\Todoroki-Win64-Shipping.exe
|
||||
|
||||
REM Valid -launch parameters are "Cabinet" or "MiniCabinet"
|
||||
inject -d -k swdchook.dll "%APP_EXE_PATH%" -launch="MiniCabinet" -ABSLOG="..\Userdata\Todoroki.log" -UserDir="..\Userdata" -NotInstalled -UNATTENDED
|
||||
|
||||
taskkill /f /im amdaemon.exe > nul 2>&1
|
||||
taskkill /f /im tdrserver.exe > nul 2>&1
|
||||
|
@ -27,9 +27,9 @@ void diva_io_config_load(
|
||||
assert(cfg != NULL);
|
||||
assert(filename != NULL);
|
||||
|
||||
cfg->vk_test = GetPrivateProfileIntW(L"io3", L"test", '1', filename);
|
||||
cfg->vk_service = GetPrivateProfileIntW(L"io3", L"service", '2', filename);
|
||||
cfg->vk_coin = GetPrivateProfileIntW(L"io3", L"coin", '3', filename);
|
||||
cfg->vk_test = GetPrivateProfileIntW(L"io3", L"test", VK_F1, filename);
|
||||
cfg->vk_service = GetPrivateProfileIntW(L"io3", L"service", VK_F2, filename);
|
||||
cfg->vk_coin = GetPrivateProfileIntW(L"io3", L"coin", VK_F3, filename);
|
||||
|
||||
for (i = 0 ; i < _countof(cfg->vk_buttons) ; i++) {
|
||||
swprintf_s(key, _countof(key), L"key%i", i + 1);
|
||||
|
@ -31,7 +31,7 @@ Default: `1`
|
||||
Enable Aime card reader assembly emulation. Disable to use a real SEGA Aime
|
||||
reader (COM port number varies by game).
|
||||
|
||||
### `highbaud`
|
||||
### `highBaud`
|
||||
|
||||
Default: `1`
|
||||
|
||||
@ -84,6 +84,17 @@ emulates an IC card in its proximity. A variety of different IC cards can be
|
||||
emulated; the exact choice of card that is emulated depends on the presence or
|
||||
absence of the configured card ID files.
|
||||
|
||||
## `[vfd]`
|
||||
|
||||
Controls emulation of the VFD GP1232A02A FUTABA assembly.
|
||||
|
||||
### `enable`
|
||||
|
||||
Default: `1`
|
||||
|
||||
Enable VFD emulation (currently just stubbed). Disable to use a real VFD
|
||||
GP1232A02A FUTABA assembly (COM port number varies by game).
|
||||
|
||||
## `[amvideo]`
|
||||
|
||||
Controls the `amvideo.dll` stub built into Segatools. This is a DLL that is
|
||||
@ -142,6 +153,13 @@ setting. Also, loopback addresses are specifically checked for and rejected by
|
||||
the games themselves; this needs to be a LAN or WAN IP (or a hostname that
|
||||
resolves to one).
|
||||
|
||||
### `title`
|
||||
|
||||
Default: `title`
|
||||
|
||||
Leave it as `title` to use the title server returned by ALL.Net. Rewrites
|
||||
the title server hostname for certain games, such as crossbeats REV.
|
||||
|
||||
### `router`
|
||||
|
||||
Default: Empty string (i.e. use value from `default` setting)
|
||||
@ -377,13 +395,29 @@ Bit values are:
|
||||
- 3: EXP: Export (for Asian markets)
|
||||
- 4: CHS: China (Simplified Chinese?)
|
||||
|
||||
### `billingCa`
|
||||
|
||||
Default: `DEVICE\\ca.crt`
|
||||
|
||||
Set the billing certificate path. This has to match the one used for the
|
||||
SSL billing server. The DER certificate must fit in 1024 bytes so it must be
|
||||
small.
|
||||
|
||||
### `billingPub`
|
||||
|
||||
Default: `DEVICE\\billing.pub`
|
||||
|
||||
Set the actual keychip RSA public key path. This public key has to match the
|
||||
private key `billing.key` of the billing server in order to decrypt/encrypt
|
||||
the billing transactions.
|
||||
|
||||
### `billingType`
|
||||
|
||||
Default: `1`
|
||||
|
||||
Set the billing "type" for the keychip. The type determins what kind of revenue share,
|
||||
if any, the game maker has with SEGA. Some games may be picky and require types other
|
||||
then 1 (ex. Crossbeats requires billing type 2), so this option is provided if this
|
||||
then 1 (ex. crossbeats REV. requires billing type 2), so this option is provided if this
|
||||
is an issue. Billing types are:
|
||||
|
||||
- 0: No billing?
|
||||
@ -396,8 +430,8 @@ is an issue. Billing types are:
|
||||
Default: `0x64`
|
||||
|
||||
An 8-bit bitfield of unclear meaning. The least significant bit indicates a
|
||||
developer dongle, I think? Changing this doesn't seem to have any effect on
|
||||
anything other than Project DIVA.
|
||||
developer dongle. Changing this doesn't seem to have any effect on
|
||||
anything other than SEGA AM2 games.
|
||||
|
||||
Other values observed in the wild:
|
||||
|
||||
|
@ -48,7 +48,7 @@ void led15093_config_load(struct led15093_config *cfg, const wchar_t *filename)
|
||||
|
||||
cfg->enable = GetPrivateProfileIntW(L"led15093", L"enable", 1, filename);
|
||||
cfg->port_no = GetPrivateProfileIntW(L"led15093", L"portNo", 0, filename);
|
||||
cfg->high_baudrate = GetPrivateProfileIntW(L"led15093", L"highBaudrate", 0, filename);
|
||||
cfg->high_baudrate = GetPrivateProfileIntW(L"led15093", L"highBaud", 0, filename);
|
||||
cfg->fw_ver = GetPrivateProfileIntW(L"led15093", L"fwVer", 0xA0, filename);
|
||||
cfg->fw_sum = GetPrivateProfileIntW(L"led15093", L"fwSum", 0xAA53, filename);
|
||||
|
||||
@ -116,6 +116,7 @@ void fgo_hook_config_load(
|
||||
aime_config_load(&cfg->aime, filename);
|
||||
dvd_config_load(&cfg->dvd, filename);
|
||||
io4_config_load(&cfg->io4, filename);
|
||||
vfd_config_load(&cfg->vfd, filename);
|
||||
touch_screen_config_load(&cfg->touch, filename);
|
||||
printer_config_load(&cfg->printer, filename);
|
||||
fgo_deck_config_load(&cfg->deck, filename);
|
||||
|
@ -20,6 +20,7 @@ struct fgo_hook_config {
|
||||
struct aime_config aime;
|
||||
struct dvd_config dvd;
|
||||
struct io4_config io4;
|
||||
struct vfd_config vfd;
|
||||
struct touch_screen_config touch;
|
||||
struct printer_config printer;
|
||||
struct deck_config deck;
|
||||
|
@ -67,7 +67,7 @@ static DWORD CALLBACK fgo_pre_startup(void)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
hr = vfd_hook_init(1);
|
||||
hr = vfd_hook_init(&fgo_hook_cfg.vfd, 1);
|
||||
|
||||
if (FAILED(hr)) {
|
||||
goto fail;
|
||||
|
@ -11,7 +11,7 @@ struct fgo_dll {
|
||||
void (*get_opbtns)(uint8_t *opbtn);
|
||||
void (*get_gamebtns)(uint8_t *gamebtn);
|
||||
void (*get_analogs)(int16_t *stick_x, int16_t *stick_y);
|
||||
HRESULT (*led_init)();
|
||||
HRESULT (*led_init)(void);
|
||||
void (*led_set_leds)(uint8_t board, uint8_t *rgb);
|
||||
};
|
||||
|
||||
|
@ -14,7 +14,7 @@ void fgo_io_config_load(
|
||||
assert(cfg != NULL);
|
||||
assert(filename != NULL);
|
||||
|
||||
cfg->vk_test = GetPrivateProfileIntW(L"io4", L"test", '1', filename);
|
||||
cfg->vk_service = GetPrivateProfileIntW(L"io4", L"service", '2', filename);
|
||||
cfg->vk_coin = GetPrivateProfileIntW(L"io4", L"coin", '3', filename);
|
||||
cfg->vk_test = GetPrivateProfileIntW(L"io4", L"test", VK_F1, filename);
|
||||
cfg->vk_service = GetPrivateProfileIntW(L"io4", L"service", VK_F2, filename);
|
||||
cfg->vk_coin = GetPrivateProfileIntW(L"io4", L"coin", VK_F3, filename);
|
||||
}
|
||||
|
@ -67,11 +67,11 @@ HRESULT fgo_io_poll(void)
|
||||
fgo_gamebtn |= FGO_IO_GAMEBTN_TARGET;
|
||||
}
|
||||
|
||||
if (xb & XINPUT_GAMEPAD_A) {
|
||||
if (xb & XINPUT_GAMEPAD_A || xb & XINPUT_GAMEPAD_B) {
|
||||
fgo_gamebtn |= FGO_IO_GAMEBTN_ATTACK;
|
||||
}
|
||||
|
||||
if (xb & XINPUT_GAMEPAD_Y) {
|
||||
if (xb & XINPUT_GAMEPAD_Y || xb & XINPUT_GAMEPAD_X) {
|
||||
fgo_gamebtn |= FGO_IO_GAMEBTN_NOBLE_PHANTASHM;
|
||||
}
|
||||
|
||||
@ -142,7 +142,6 @@ void fgo_io_get_analogs(int16_t *stick_x, int16_t *stick_y)
|
||||
|
||||
HRESULT fgo_io_led_init(void)
|
||||
{
|
||||
// return 0;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
|
127
hooklib/dns.c
127
hooklib/dns.c
@ -3,6 +3,7 @@
|
||||
#include <windows.h>
|
||||
#include <windns.h>
|
||||
#include <ws2tcpip.h>
|
||||
#include <winhttp.h>
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdbool.h>
|
||||
@ -12,6 +13,8 @@
|
||||
#include "hook/hr.h"
|
||||
#include "hook/table.h"
|
||||
|
||||
#include "util/dprintf.h"
|
||||
|
||||
#include "hooklib/dns.h"
|
||||
|
||||
/* Latest w32headers does not include DnsQueryEx, so we'll have to "polyfill"
|
||||
@ -66,6 +69,18 @@ static int WSAAPI hook_getaddrinfo(
|
||||
const ADDRINFOA *pHints,
|
||||
ADDRINFOA **ppResult);
|
||||
|
||||
static HINTERNET WINAPI hook_WinHttpConnect(
|
||||
HINTERNET hSession,
|
||||
const wchar_t *pwszServerName,
|
||||
INTERNET_PORT nServerPort,
|
||||
DWORD dwReserved);
|
||||
|
||||
static bool WINAPI hook_WinHttpCrackUrl(
|
||||
const wchar_t *pwszUrl,
|
||||
DWORD dwUrlLength,
|
||||
DWORD dwFlags,
|
||||
LPURL_COMPONENTS lpUrlComponents);
|
||||
|
||||
/* Link pointers */
|
||||
|
||||
static DNS_STATUS (WINAPI *next_DnsQuery_A)(
|
||||
@ -95,6 +110,18 @@ static int (WSAAPI *next_getaddrinfo)(
|
||||
const ADDRINFOA *pHints,
|
||||
ADDRINFOA **ppResult);
|
||||
|
||||
static HINTERNET (WINAPI *next_WinHttpConnect)(
|
||||
HINTERNET hSession,
|
||||
const wchar_t *pwszServerName,
|
||||
INTERNET_PORT nServerPort,
|
||||
DWORD dwReserved);
|
||||
|
||||
static bool (WINAPI *next_WinHttpCrackUrl)(
|
||||
const wchar_t *pwszUrl,
|
||||
DWORD dwUrlLength,
|
||||
DWORD dwFlags,
|
||||
LPURL_COMPONENTS lpUrlComponents);
|
||||
|
||||
static const struct hook_symbol dns_hook_syms_dnsapi[] = {
|
||||
{
|
||||
.name = "DnsQuery_A",
|
||||
@ -120,10 +147,24 @@ static const struct hook_symbol dns_hook_syms_ws2[] = {
|
||||
}
|
||||
};
|
||||
|
||||
static const struct hook_symbol dns_hook_syms_winhttp[] = {
|
||||
{
|
||||
.name = "WinHttpConnect",
|
||||
.patch = hook_WinHttpConnect,
|
||||
.link = (void **) &next_WinHttpConnect,
|
||||
}, {
|
||||
.name = "WinHttpCrackUrl",
|
||||
.patch = hook_WinHttpCrackUrl,
|
||||
.link = (void **) &next_WinHttpCrackUrl,
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
static bool dns_hook_initted;
|
||||
static CRITICAL_SECTION dns_hook_lock;
|
||||
static struct dns_hook_entry *dns_hook_entries;
|
||||
static size_t dns_hook_nentries;
|
||||
static char received_title_url[255];
|
||||
|
||||
static void dns_hook_init(void)
|
||||
{
|
||||
@ -145,6 +186,12 @@ static void dns_hook_init(void)
|
||||
"ws2_32.dll",
|
||||
dns_hook_syms_ws2,
|
||||
_countof(dns_hook_syms_ws2));
|
||||
|
||||
hook_table_apply(
|
||||
NULL,
|
||||
"winhttp.dll",
|
||||
dns_hook_syms_winhttp,
|
||||
_countof(dns_hook_syms_winhttp));
|
||||
}
|
||||
|
||||
HRESULT dns_hook_push(const wchar_t *from_src, const wchar_t *to_src)
|
||||
@ -460,3 +507,83 @@ end:
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static HINTERNET WINAPI hook_WinHttpConnect(
|
||||
HINTERNET hSession,
|
||||
const wchar_t *pwszServerName,
|
||||
INTERNET_PORT nServerPort,
|
||||
DWORD dwReserved)
|
||||
{
|
||||
const struct dns_hook_entry *pos;
|
||||
size_t i;
|
||||
|
||||
if (pwszServerName == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
EnterCriticalSection(&dns_hook_lock);
|
||||
|
||||
for (i = 0 ; i < dns_hook_nentries ; i++) {
|
||||
pos = &dns_hook_entries[i];
|
||||
|
||||
if (_wcsicmp(pwszServerName, pos->from) == 0) {
|
||||
if(pos->to == NULL) {
|
||||
LeaveCriticalSection(&dns_hook_lock);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
pwszServerName = pos->to;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
LeaveCriticalSection(&dns_hook_lock);
|
||||
|
||||
return next_WinHttpConnect(hSession, pwszServerName, nServerPort, dwReserved);
|
||||
}
|
||||
|
||||
// Hook to replace CXB title url
|
||||
static bool WINAPI hook_WinHttpCrackUrl(
|
||||
const wchar_t *pwszUrl,
|
||||
DWORD dwUrlLength,
|
||||
DWORD dwFlags,
|
||||
LPURL_COMPONENTS lpUrlComponents)
|
||||
{
|
||||
const struct dns_hook_entry *pos;
|
||||
size_t i;
|
||||
|
||||
EnterCriticalSection(&dns_hook_lock);
|
||||
|
||||
for (i = 0 ; i < dns_hook_nentries ; i++) {
|
||||
pos = &dns_hook_entries[i];
|
||||
|
||||
if (_wcsicmp(pwszUrl, pos->from) == 0) {
|
||||
wchar_t* toAddr = pos->to;
|
||||
wchar_t titleBuffer[255];
|
||||
|
||||
if(wcscmp(toAddr, L"title") == 0) {
|
||||
size_t wstr_c;
|
||||
mbstowcs_s(&wstr_c, titleBuffer, 255, received_title_url, strlen(received_title_url));
|
||||
toAddr = titleBuffer;
|
||||
}
|
||||
|
||||
bool result = next_WinHttpCrackUrl(
|
||||
toAddr,
|
||||
wcslen(toAddr),
|
||||
dwFlags,
|
||||
lpUrlComponents
|
||||
);
|
||||
LeaveCriticalSection(&dns_hook_lock);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
LeaveCriticalSection(&dns_hook_lock);
|
||||
return next_WinHttpCrackUrl(
|
||||
pwszUrl,
|
||||
dwUrlLength,
|
||||
dwFlags,
|
||||
lpUrlComponents
|
||||
);
|
||||
}
|
||||
|
305
hooklib/path.c
305
hooklib/path.c
@ -101,6 +101,40 @@ static BOOL WINAPI hook_PathFileExistsA(LPCSTR pszPath);
|
||||
|
||||
static BOOL WINAPI hook_PathFileExistsW(LPCWSTR pszPath);
|
||||
|
||||
static BOOL WINAPI hook_MoveFileA(
|
||||
const char *lpExistingFileName,
|
||||
const char *lpNewFileName);
|
||||
|
||||
static BOOL WINAPI hook_MoveFileW(
|
||||
const wchar_t *lpExistingFileName,
|
||||
const wchar_t *lpNewFileName);
|
||||
|
||||
static BOOL WINAPI hook_MoveFileExA(
|
||||
const char *lpExistingFileName,
|
||||
const char *lpNewFileName,
|
||||
uint32_t dwFlags);
|
||||
|
||||
|
||||
static BOOL WINAPI hook_ReplaceFileA(
|
||||
const char *lpReplacedFileName,
|
||||
const char *lpReplacementFileName,
|
||||
const char *lpBackupFileName,
|
||||
uint32_t dwReplaceFlags,
|
||||
void *lpExclude,
|
||||
void *lpReserved);
|
||||
|
||||
static BOOL WINAPI hook_ReplaceFileW(
|
||||
const wchar_t *lpReplacedFileName,
|
||||
const wchar_t *lpReplacementFileName,
|
||||
const wchar_t *lpBackupFileName,
|
||||
uint32_t dwReplaceFlags,
|
||||
void *lpExclude,
|
||||
void *lpReserved);
|
||||
|
||||
static BOOL WINAPI hook_DeleteFileA(const char *lpFileName);
|
||||
|
||||
static BOOL WINAPI hook_DeleteFileW(const wchar_t *lpFileName);
|
||||
|
||||
/* Link pointers */
|
||||
|
||||
static BOOL (WINAPI *next_CreateDirectoryA)(
|
||||
@ -185,6 +219,39 @@ static BOOL (WINAPI *next_PathFileExistsA)(LPCSTR pszPath);
|
||||
|
||||
static BOOL (WINAPI *next_PathFileExistsW)(LPCWSTR pszPath);
|
||||
|
||||
static BOOL (WINAPI *next_MoveFileA)(
|
||||
const char *lpExistingFileName,
|
||||
const char *lpNewFileName);
|
||||
|
||||
static BOOL (WINAPI *next_MoveFileW)(
|
||||
const wchar_t *lpExistingFileName,
|
||||
const wchar_t *lpNewFileName);
|
||||
|
||||
static BOOL (WINAPI *next_MoveFileExA)(
|
||||
const char *lpExistingFileName,
|
||||
const char *lpNewFileName,
|
||||
uint32_t dwFlags);
|
||||
|
||||
static BOOL (WINAPI *next_ReplaceFileA)(
|
||||
const char *lpReplacedFileName,
|
||||
const char *lpReplacementFileName,
|
||||
const char *lpBackupFileName,
|
||||
uint32_t dwReplaceFlags,
|
||||
void *lpExclude,
|
||||
void *lpReserved);
|
||||
|
||||
static BOOL (WINAPI *next_ReplaceFileW)(
|
||||
const wchar_t *lpReplacedFileName,
|
||||
const wchar_t *lpReplacementFileName,
|
||||
const wchar_t *lpBackupFileName,
|
||||
uint32_t dwReplaceFlags,
|
||||
void *lpExclude,
|
||||
void *lpReserved);
|
||||
|
||||
static BOOL (WINAPI *next_DeleteFileA)(const char *lpFileName);
|
||||
|
||||
static BOOL (WINAPI *next_DeleteFileW)(const wchar_t *lpFileName);
|
||||
|
||||
/* Hook table */
|
||||
|
||||
static const struct hook_symbol path_hook_syms[] = {
|
||||
@ -260,6 +327,34 @@ static const struct hook_symbol path_hook_syms[] = {
|
||||
.name = "PathFileExistsW",
|
||||
.patch = hook_PathFileExistsW,
|
||||
.link = (void **) &next_PathFileExistsW,
|
||||
}, {
|
||||
.name = "MoveFileA",
|
||||
.patch = hook_MoveFileA,
|
||||
.link = (void **) &next_MoveFileA,
|
||||
}, {
|
||||
.name = "MoveFileW",
|
||||
.patch = hook_MoveFileW,
|
||||
.link = (void **) &next_MoveFileW,
|
||||
}, {
|
||||
.name = "MoveFileExA",
|
||||
.patch = hook_MoveFileExA,
|
||||
.link = (void **) &next_MoveFileExA,
|
||||
}, {
|
||||
.name = "ReplaceFileA",
|
||||
.patch = hook_ReplaceFileA,
|
||||
.link = (void **) &next_ReplaceFileA,
|
||||
}, {
|
||||
.name = "ReplaceFileW",
|
||||
.patch = hook_ReplaceFileW,
|
||||
.link = (void **) &next_ReplaceFileW,
|
||||
}, {
|
||||
.name = "DeleteFileA",
|
||||
.patch = hook_DeleteFileA,
|
||||
.link = (void **) &next_DeleteFileA,
|
||||
}, {
|
||||
.name = "DeleteFileW",
|
||||
.patch = hook_DeleteFileW,
|
||||
.link = (void **) &next_DeleteFileW,
|
||||
}
|
||||
};
|
||||
|
||||
@ -906,3 +1001,213 @@ static BOOL WINAPI hook_PathFileExistsW(LPCWSTR pszPath)
|
||||
|
||||
return ok;
|
||||
}
|
||||
|
||||
static BOOL WINAPI hook_MoveFileA(
|
||||
const char *lpExistingFileName,
|
||||
const char *lpNewFileName)
|
||||
{
|
||||
char *oldTrans;
|
||||
char *newTrans;
|
||||
BOOL ok;
|
||||
|
||||
ok = path_transform_a(&oldTrans, lpExistingFileName);
|
||||
|
||||
if (!ok) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
ok = path_transform_a(&newTrans, lpNewFileName);
|
||||
|
||||
if (!ok) {
|
||||
free(oldTrans);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
ok = next_MoveFileA(
|
||||
oldTrans ? oldTrans : lpExistingFileName,
|
||||
newTrans ? newTrans : lpNewFileName);
|
||||
|
||||
free(oldTrans);
|
||||
free(newTrans);
|
||||
|
||||
return ok;
|
||||
}
|
||||
|
||||
static BOOL WINAPI hook_MoveFileW(
|
||||
const wchar_t *lpExistingFileName,
|
||||
const wchar_t *lpNewFileName)
|
||||
{
|
||||
wchar_t *oldTrans;
|
||||
wchar_t *newTrans;
|
||||
BOOL ok;
|
||||
|
||||
ok = path_transform_w(&oldTrans, lpExistingFileName);
|
||||
|
||||
if (!ok) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
ok = path_transform_w(&newTrans, lpNewFileName);
|
||||
|
||||
if (!ok) {
|
||||
free(oldTrans);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
ok = next_MoveFileW(
|
||||
oldTrans ? oldTrans : lpExistingFileName,
|
||||
newTrans ? newTrans : lpNewFileName);
|
||||
|
||||
free(oldTrans);
|
||||
free(newTrans);
|
||||
|
||||
return ok;
|
||||
}
|
||||
|
||||
static BOOL WINAPI hook_MoveFileExA(
|
||||
const char *lpExistingFileName,
|
||||
const char *lpNewFileName,
|
||||
uint32_t dwFlags)
|
||||
{
|
||||
char *oldTrans;
|
||||
char *newTrans;
|
||||
BOOL ok;
|
||||
|
||||
ok = path_transform_a(&oldTrans, lpExistingFileName);
|
||||
|
||||
if (!ok) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
ok = path_transform_a(&newTrans, lpNewFileName);
|
||||
|
||||
if (!ok) {
|
||||
free(oldTrans);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
ok = next_MoveFileExA(
|
||||
oldTrans ? oldTrans : lpExistingFileName,
|
||||
newTrans ? newTrans : lpNewFileName,
|
||||
dwFlags);
|
||||
|
||||
free(oldTrans);
|
||||
free(newTrans);
|
||||
|
||||
return ok;
|
||||
}
|
||||
|
||||
static BOOL WINAPI hook_ReplaceFileA(
|
||||
const char *lpReplacedFileName,
|
||||
const char *lpReplacementFileName,
|
||||
const char *lpBackupFileName,
|
||||
uint32_t dwReplaceFlags,
|
||||
void *lpExclude,
|
||||
void *lpReserved)
|
||||
{
|
||||
char *oldTrans;
|
||||
char *newTrans;
|
||||
BOOL ok;
|
||||
|
||||
ok = path_transform_a(&oldTrans, lpReplacedFileName);
|
||||
|
||||
if (!ok) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
ok = path_transform_a(&newTrans, lpReplacementFileName);
|
||||
|
||||
if (!ok) {
|
||||
free(oldTrans);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
ok = next_ReplaceFileA(
|
||||
oldTrans ? oldTrans : lpReplacedFileName,
|
||||
newTrans ? newTrans : lpReplacementFileName,
|
||||
lpBackupFileName,
|
||||
dwReplaceFlags,
|
||||
lpExclude,
|
||||
lpReserved);
|
||||
|
||||
free(oldTrans);
|
||||
free(newTrans);
|
||||
|
||||
return ok;
|
||||
}
|
||||
|
||||
static BOOL WINAPI hook_ReplaceFileW(
|
||||
const wchar_t *lpReplacedFileName,
|
||||
const wchar_t *lpReplacementFileName,
|
||||
const wchar_t *lpBackupFileName,
|
||||
uint32_t dwReplaceFlags,
|
||||
void *lpExclude,
|
||||
void *lpReserved)
|
||||
{
|
||||
wchar_t *oldTrans;
|
||||
wchar_t *newTrans;
|
||||
BOOL ok;
|
||||
|
||||
ok = path_transform_w(&oldTrans, lpReplacedFileName);
|
||||
|
||||
if (!ok) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
ok = path_transform_w(&newTrans, lpReplacementFileName);
|
||||
|
||||
if (!ok) {
|
||||
free(oldTrans);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
ok = next_ReplaceFileW(
|
||||
oldTrans ? oldTrans : lpReplacedFileName,
|
||||
newTrans ? newTrans : lpReplacementFileName,
|
||||
lpBackupFileName,
|
||||
dwReplaceFlags,
|
||||
lpExclude,
|
||||
lpReserved);
|
||||
|
||||
free(oldTrans);
|
||||
free(newTrans);
|
||||
|
||||
return ok;
|
||||
}
|
||||
|
||||
static BOOL WINAPI hook_DeleteFileA(const char *lpFileName)
|
||||
{
|
||||
char *trans;
|
||||
BOOL ok;
|
||||
|
||||
ok = path_transform_a(&trans, lpFileName);
|
||||
|
||||
if (!ok) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
ok = next_DeleteFileA(trans ? trans: lpFileName);
|
||||
|
||||
return ok;
|
||||
}
|
||||
|
||||
static BOOL WINAPI hook_DeleteFileW(const wchar_t *lpFileName)
|
||||
{
|
||||
wchar_t *trans;
|
||||
BOOL ok;
|
||||
|
||||
ok = path_transform_w(&trans, lpFileName);
|
||||
|
||||
if (!ok) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
ok = next_DeleteFileW(trans ? trans: lpFileName);
|
||||
|
||||
return ok;
|
||||
}
|
||||
|
@ -12,9 +12,6 @@ const struct dll_bind_sym idac_dll_syms[] = {
|
||||
{
|
||||
.sym = "idac_io_init",
|
||||
.off = offsetof(struct idac_dll, init),
|
||||
}, {
|
||||
.sym = "idac_io_poll",
|
||||
.off = offsetof(struct idac_dll, poll),
|
||||
}, {
|
||||
.sym = "idac_io_get_opbtns",
|
||||
.off = offsetof(struct idac_dll, get_opbtns),
|
||||
|
@ -7,7 +7,6 @@
|
||||
struct idac_dll {
|
||||
uint16_t api_version;
|
||||
HRESULT (*init)(void);
|
||||
HRESULT (*poll)(void);
|
||||
void (*get_opbtns)(uint8_t *opbtn);
|
||||
void (*get_gamebtns)(uint8_t *gamebtn);
|
||||
void (*get_shifter)(uint8_t *gear);
|
||||
|
@ -13,7 +13,6 @@ EXPORTS
|
||||
amDllVideoSetResolution @3
|
||||
idac_io_get_api_version
|
||||
idac_io_init
|
||||
idac_io_poll
|
||||
idac_io_get_opbtns
|
||||
idac_io_get_gamebtns
|
||||
idac_io_get_shifter
|
||||
|
@ -57,7 +57,6 @@ static HRESULT idac_io4_poll(void *ctx, struct io4_state *state)
|
||||
struct idac_io_analog_state analog_state;
|
||||
HRESULT hr;
|
||||
|
||||
assert(idac_dll.poll != NULL);
|
||||
assert(idac_dll.get_opbtns != NULL);
|
||||
assert(idac_dll.get_gamebtns != NULL);
|
||||
assert(idac_dll.get_analogs != NULL);
|
||||
@ -65,13 +64,6 @@ static HRESULT idac_io4_poll(void *ctx, struct io4_state *state)
|
||||
|
||||
memset(state, 0, sizeof(*state));
|
||||
memset(&analog_state, 0, sizeof(analog_state));
|
||||
|
||||
hr = idac_dll.poll();
|
||||
|
||||
if (FAILED(hr)) {
|
||||
return hr;
|
||||
}
|
||||
|
||||
opbtn = 0;
|
||||
gamebtn = 0;
|
||||
gear = 0;
|
||||
|
@ -124,9 +124,9 @@ void idac_io_config_load(struct idac_io_config *cfg, const wchar_t *filename)
|
||||
assert(cfg != NULL);
|
||||
assert(filename != NULL);
|
||||
|
||||
cfg->vk_test = GetPrivateProfileIntW(L"io4", L"test", '1', filename);
|
||||
cfg->vk_service = GetPrivateProfileIntW(L"io4", L"service", '2', filename);
|
||||
cfg->vk_coin = GetPrivateProfileIntW(L"io4", L"coin", '3', filename);
|
||||
cfg->vk_test = GetPrivateProfileIntW(L"io4", L"test", VK_F1, filename);
|
||||
cfg->vk_service = GetPrivateProfileIntW(L"io4", L"service", VK_F2, filename);
|
||||
cfg->vk_coin = GetPrivateProfileIntW(L"io4", L"coin", VK_F3, filename);
|
||||
cfg->restrict_ = GetPrivateProfileIntW(L"io4", L"restrict", 128, filename);
|
||||
|
||||
GetPrivateProfileStringW(
|
||||
|
@ -2,7 +2,6 @@ LIBRARY idacio
|
||||
|
||||
EXPORTS
|
||||
idac_io_init
|
||||
idac_io_poll
|
||||
idac_io_get_opbtns
|
||||
idac_io_get_gamebtns
|
||||
idac_io_get_shifter
|
||||
|
@ -56,13 +56,6 @@ uint16_t idac_io_get_api_version(void);
|
||||
|
||||
HRESULT idac_io_init(void);
|
||||
|
||||
/* Send any queued outputs (of which there are currently none, though this may
|
||||
change in subsequent API versions) and retrieve any new inputs.
|
||||
|
||||
Minimum API version: 0x0100 */
|
||||
|
||||
HRESULT idac_io_poll(void);
|
||||
|
||||
/* Get the state of the cabinet's operator buttons as of the last poll. See
|
||||
IDAC_IO_OPBTN enum above: this contains bit mask definitions for button
|
||||
states returned in *opbtn. All buttons are active-high.
|
||||
@ -93,7 +86,7 @@ void idac_io_get_analogs(struct idac_io_analog_state *out);
|
||||
/* Poll the current position of the six-speed shifter and return it via the
|
||||
gear out parameter. Valid values are 0 for neutral and 1-6 for gears 1-6.
|
||||
|
||||
idzhook internally translates this gear position value into the correct
|
||||
idachook internally translates this gear position value into the correct
|
||||
combination of Gear Left, Gear Right, Gear Up, Gear Down buttons that the
|
||||
game will then interpret as the current position of the gear lever.
|
||||
|
||||
|
@ -52,10 +52,6 @@ HRESULT idac_xi_init(const struct idac_xi_config *cfg, const struct idac_io_back
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
HRESULT idac_io_poll(void) {
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static HRESULT idac_xi_config_apply(const struct idac_xi_config *cfg) {
|
||||
/* Deadzones check */
|
||||
if (cfg->left_stick_deadzone > 32767 || cfg->left_stick_deadzone < 0) {
|
||||
|
@ -121,9 +121,10 @@ void idz_io_config_load(struct idz_io_config *cfg, const wchar_t *filename)
|
||||
assert(cfg != NULL);
|
||||
assert(filename != NULL);
|
||||
|
||||
cfg->vk_test = GetPrivateProfileIntW(L"io3", L"test", '1', filename);
|
||||
cfg->vk_service = GetPrivateProfileIntW(L"io3", L"service", '2', filename);
|
||||
cfg->vk_coin = GetPrivateProfileIntW(L"io3", L"coin", '3', filename);
|
||||
/* Technically it's io4 */
|
||||
cfg->vk_test = GetPrivateProfileIntW(L"io3", L"test", VK_F1, filename);
|
||||
cfg->vk_service = GetPrivateProfileIntW(L"io3", L"service", VK_F2, filename);
|
||||
cfg->vk_coin = GetPrivateProfileIntW(L"io3", L"coin", VK_F3, filename);
|
||||
cfg->restrict_ = GetPrivateProfileIntW(L"io3", L"restrict", 97, filename);
|
||||
|
||||
GetPrivateProfileStringW(
|
||||
|
@ -37,5 +37,7 @@ void mai2_hook_config_load(
|
||||
aime_config_load(&cfg->aime, filename);
|
||||
dvd_config_load(&cfg->dvd, filename);
|
||||
io4_config_load(&cfg->io4, filename);
|
||||
vfd_config_load(&cfg->vfd, filename);
|
||||
mai2_dll_config_load(&cfg->dll, filename);
|
||||
unity_config_load(&cfg->unity, filename);
|
||||
}
|
||||
|
@ -10,12 +10,16 @@
|
||||
|
||||
#include "platform/config.h"
|
||||
|
||||
#include "unityhook/config.h"
|
||||
|
||||
struct mai2_hook_config {
|
||||
struct platform_config platform;
|
||||
struct aime_config aime;
|
||||
struct dvd_config dvd;
|
||||
struct io4_config io4;
|
||||
struct vfd_config vfd;
|
||||
struct mai2_dll_config dll;
|
||||
struct unity_config unity;
|
||||
};
|
||||
|
||||
void mai2_dll_config_load(
|
||||
|
@ -12,10 +12,11 @@
|
||||
#include "mai2hook/config.h"
|
||||
#include "mai2hook/io4.h"
|
||||
#include "mai2hook/mai2-dll.h"
|
||||
#include "mai2hook/unity.h"
|
||||
|
||||
#include "platform/platform.h"
|
||||
|
||||
#include "unityhook/hook.h"
|
||||
|
||||
#include "util/dprintf.h"
|
||||
|
||||
static HMODULE mai2_hook_mod;
|
||||
@ -57,7 +58,7 @@ static DWORD CALLBACK mai2_pre_startup(void)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
hr = vfd_hook_init(2);
|
||||
hr = vfd_hook_init(&mai2_hook_cfg.vfd, 2);
|
||||
|
||||
if (FAILED(hr)) {
|
||||
goto fail;
|
||||
@ -80,7 +81,7 @@ static DWORD CALLBACK mai2_pre_startup(void)
|
||||
There seems to be an issue with other DLL hooks if `LoadLibraryW` is
|
||||
hooked earlier in the `mai2hook` initialization. */
|
||||
|
||||
unity_hook_init();
|
||||
unity_hook_init(&mai2_hook_cfg.unity, mai2_hook_mod);
|
||||
|
||||
/* Initialize debug helpers */
|
||||
|
||||
|
@ -15,6 +15,7 @@ shared_library(
|
||||
hooklib_lib,
|
||||
mai2io_lib,
|
||||
platform_lib,
|
||||
unityhook_lib,
|
||||
util_lib,
|
||||
],
|
||||
sources : [
|
||||
@ -25,7 +26,5 @@ shared_library(
|
||||
'io4.h',
|
||||
'mai2-dll.c',
|
||||
'mai2-dll.h',
|
||||
'unity.h',
|
||||
'unity.c',
|
||||
],
|
||||
)
|
||||
|
@ -1,3 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
void unity_hook_init(void);
|
@ -24,9 +24,9 @@ void mai2_io_config_load(
|
||||
assert(cfg != NULL);
|
||||
assert(filename != NULL);
|
||||
|
||||
cfg->vk_test = GetPrivateProfileIntW(L"io4", L"test", '1', filename);
|
||||
cfg->vk_service = GetPrivateProfileIntW(L"io4", L"service", '2', filename);
|
||||
cfg->vk_coin = GetPrivateProfileIntW(L"io4", L"coin", '3', filename);
|
||||
cfg->vk_test = GetPrivateProfileIntW(L"io4", L"test", VK_F1, filename);
|
||||
cfg->vk_service = GetPrivateProfileIntW(L"io4", L"service", VK_F2, filename);
|
||||
cfg->vk_coin = GetPrivateProfileIntW(L"io4", L"coin", VK_F3, filename);
|
||||
|
||||
for (i = 0 ; i < 9 ; i++) {
|
||||
swprintf_s(key, _countof(key), L"1p_btn%i", i + 1);
|
||||
|
@ -68,6 +68,7 @@ void mercury_hook_config_load(
|
||||
dvd_config_load(&cfg->dvd, filename);
|
||||
io4_config_load(&cfg->io4, filename);
|
||||
gfx_config_load(&cfg->gfx, filename);
|
||||
vfd_config_load(&cfg->vfd, filename);
|
||||
mercury_dll_config_load(&cfg->dll, filename);
|
||||
touch_config_load(&cfg->touch, filename);
|
||||
elisabeth_config_load(&cfg->elisabeth, filename);
|
||||
|
@ -19,6 +19,7 @@ struct mercury_hook_config {
|
||||
struct dvd_config dvd;
|
||||
struct io4_config io4;
|
||||
struct gfx_config gfx;
|
||||
struct vfd_config vfd;
|
||||
struct mercury_dll_config dll;
|
||||
struct touch_config touch;
|
||||
struct elisabeth_config elisabeth;
|
||||
|
@ -64,7 +64,7 @@ static DWORD CALLBACK mercury_pre_startup(void)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
hr = vfd_hook_init(2);
|
||||
hr = vfd_hook_init(&mercury_hook_cfg.vfd, 2);
|
||||
|
||||
if (FAILED(hr)) {
|
||||
goto fail;
|
||||
|
@ -27,11 +27,11 @@ void mercury_io_config_load(
|
||||
assert(cfg != NULL);
|
||||
assert(filename != NULL);
|
||||
|
||||
cfg->vk_test = GetPrivateProfileIntW(L"io4", L"test", 0x2D, filename);
|
||||
cfg->vk_service = GetPrivateProfileIntW(L"io4", L"service", 0x2E, filename);
|
||||
cfg->vk_coin = GetPrivateProfileIntW(L"io4", L"coin", 0x24, filename);
|
||||
cfg->vk_vol_up = GetPrivateProfileIntW(L"io4", L"volup", 0x26, filename);
|
||||
cfg->vk_vol_down = GetPrivateProfileIntW(L"io4", L"voldown", 0x28, filename);
|
||||
cfg->vk_test = GetPrivateProfileIntW(L"io4", L"test", VK_F1, filename);
|
||||
cfg->vk_service = GetPrivateProfileIntW(L"io4", L"service", VK_F2, filename);
|
||||
cfg->vk_coin = GetPrivateProfileIntW(L"io4", L"coin", VK_F3, filename);
|
||||
cfg->vk_vol_up = GetPrivateProfileIntW(L"io4", L"volup", VK_UP, filename);
|
||||
cfg->vk_vol_down = GetPrivateProfileIntW(L"io4", L"voldown", VK_DOWN, filename);
|
||||
|
||||
for (i = 0 ; i < 240 ; i++) {
|
||||
swprintf_s(key, _countof(key), L"cell%i", i + 1);
|
||||
|
@ -42,6 +42,7 @@ shlwapi_lib = cc.find_library('shlwapi')
|
||||
dinput8_lib = cc.find_library('dinput8')
|
||||
dxguid_lib = cc.find_library('dxguid')
|
||||
xinput_lib = cc.find_library('xinput')
|
||||
pathcch_lib = cc.find_library('pathcch')
|
||||
|
||||
inc = include_directories('.')
|
||||
capnhook = subproject('capnhook')
|
||||
@ -55,6 +56,7 @@ subdir('platform')
|
||||
subdir('util')
|
||||
|
||||
subdir('gfxhook')
|
||||
subdir('unityhook')
|
||||
|
||||
subdir('aimeio')
|
||||
subdir('chuniio')
|
||||
|
@ -40,5 +40,7 @@ void mu3_hook_config_load(
|
||||
dvd_config_load(&cfg->dvd, filename);
|
||||
io4_config_load(&cfg->io4, filename);
|
||||
gfx_config_load(&cfg->gfx, filename);
|
||||
vfd_config_load(&cfg->vfd, filename);
|
||||
mu3_dll_config_load(&cfg->dll, filename);
|
||||
unity_config_load(&cfg->unity, filename);
|
||||
}
|
||||
|
@ -13,6 +13,8 @@
|
||||
|
||||
#include "platform/config.h"
|
||||
|
||||
#include "unityhook/config.h"
|
||||
|
||||
struct mu3_hook_config {
|
||||
struct platform_config platform;
|
||||
struct aime_config aime;
|
||||
@ -20,7 +22,9 @@ struct mu3_hook_config {
|
||||
struct io4_config io4;
|
||||
struct gfx_config gfx;
|
||||
// struct led15093_config led15093;
|
||||
struct vfd_config vfd;
|
||||
struct mu3_dll_config dll;
|
||||
struct unity_config unity;
|
||||
};
|
||||
|
||||
void mu3_dll_config_load(
|
||||
|
@ -2,7 +2,6 @@
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "board/io4.h"
|
||||
#include "board/sg-reader.h"
|
||||
#include "board/vfd.h"
|
||||
|
||||
@ -20,10 +19,12 @@
|
||||
#include "mu3hook/config.h"
|
||||
#include "mu3hook/io4.h"
|
||||
#include "mu3hook/mu3-dll.h"
|
||||
#include "mu3hook/unity.h"
|
||||
|
||||
#include "platform/platform.h"
|
||||
|
||||
#include "unityhook/config.h"
|
||||
#include "unityhook/hook.h"
|
||||
|
||||
#include "util/dprintf.h"
|
||||
|
||||
static HMODULE mu3_hook_mod;
|
||||
@ -76,7 +77,7 @@ static DWORD CALLBACK mu3_pre_startup(void)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
hr = vfd_hook_init(2);
|
||||
hr = vfd_hook_init(&mu3_hook_cfg.vfd, 2);
|
||||
|
||||
if (FAILED(hr)) {
|
||||
goto fail;
|
||||
@ -99,7 +100,7 @@ static DWORD CALLBACK mu3_pre_startup(void)
|
||||
There seems to be an issue with other DLL hooks if `LoadLibraryW` is
|
||||
hooked earlier in the `mu3hook` initialization. */
|
||||
|
||||
unity_hook_init();
|
||||
unity_hook_init(&mu3_hook_cfg.unity, mu3_hook_mod);
|
||||
|
||||
/* Initialize debug helpers */
|
||||
|
||||
|
@ -17,6 +17,7 @@ shared_library(
|
||||
hooklib_lib,
|
||||
mu3io_lib,
|
||||
platform_lib,
|
||||
unityhook_lib,
|
||||
util_lib,
|
||||
],
|
||||
sources : [
|
||||
@ -27,7 +28,5 @@ shared_library(
|
||||
'io4.h',
|
||||
'mu3-dll.c',
|
||||
'mu3-dll.h',
|
||||
'unity.h',
|
||||
'unity.c',
|
||||
],
|
||||
)
|
||||
|
@ -1,95 +0,0 @@
|
||||
#include <stdbool.h>
|
||||
|
||||
#include <windows.h>
|
||||
|
||||
#include "hook/table.h"
|
||||
|
||||
#include "hooklib/dll.h"
|
||||
#include "hooklib/path.h"
|
||||
|
||||
#include "util/dprintf.h"
|
||||
|
||||
static void dll_hook_insert_hooks(HMODULE target);
|
||||
|
||||
static HMODULE WINAPI my_LoadLibraryW(const wchar_t *name);
|
||||
static HMODULE (WINAPI *next_LoadLibraryW)(const wchar_t *name);
|
||||
|
||||
static const struct hook_symbol unity_kernel32_syms[] = {
|
||||
{
|
||||
.name = "LoadLibraryW",
|
||||
.patch = my_LoadLibraryW,
|
||||
.link = (void **) &next_LoadLibraryW,
|
||||
},
|
||||
};
|
||||
|
||||
static const wchar_t *target_modules[] = {
|
||||
L"mono.dll",
|
||||
L"cri_ware_unity.dll",
|
||||
};
|
||||
static const size_t target_modules_len = _countof(target_modules);
|
||||
|
||||
void unity_hook_init(void)
|
||||
{
|
||||
dll_hook_insert_hooks(NULL);
|
||||
}
|
||||
|
||||
static void dll_hook_insert_hooks(HMODULE target)
|
||||
{
|
||||
hook_table_apply(
|
||||
target,
|
||||
"kernel32.dll",
|
||||
unity_kernel32_syms,
|
||||
_countof(unity_kernel32_syms));
|
||||
}
|
||||
|
||||
static HMODULE WINAPI my_LoadLibraryW(const wchar_t *name)
|
||||
{
|
||||
const wchar_t *name_end;
|
||||
const wchar_t *target_module;
|
||||
bool already_loaded;
|
||||
HMODULE result;
|
||||
size_t name_len;
|
||||
size_t target_module_len;
|
||||
|
||||
if (name == NULL) {
|
||||
SetLastError(ERROR_INVALID_PARAMETER);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// Check if the module is already loaded
|
||||
already_loaded = GetModuleHandleW(name) != NULL;
|
||||
|
||||
// Must call the next handler so the DLL reference count is incremented
|
||||
result = next_LoadLibraryW(name);
|
||||
|
||||
if (!already_loaded && result != NULL) {
|
||||
name_len = wcslen(name);
|
||||
|
||||
for (size_t i = 0; i < target_modules_len; i++) {
|
||||
target_module = target_modules[i];
|
||||
target_module_len = wcslen(target_module);
|
||||
|
||||
// Check if the newly loaded library is at least the length of
|
||||
// the name of the target module
|
||||
if (name_len < target_module_len) {
|
||||
continue;
|
||||
}
|
||||
|
||||
name_end = &name[name_len - target_module_len];
|
||||
|
||||
// Check if the name of the newly loaded library is one of the
|
||||
// modules the path hooks should be injected into
|
||||
if (_wcsicmp(name_end, target_module) != 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
dprintf("Unity: Loaded %S\n", target_module);
|
||||
|
||||
dll_hook_insert_hooks(result);
|
||||
path_hook_insert_hooks(result);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
@ -1,3 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
void unity_hook_init(void);
|
@ -14,9 +14,9 @@ void mu3_io_config_load(
|
||||
assert(cfg != NULL);
|
||||
assert(filename != NULL);
|
||||
|
||||
cfg->vk_test = GetPrivateProfileIntW(L"io4", L"test", '1', filename);
|
||||
cfg->vk_service = GetPrivateProfileIntW(L"io4", L"service", '2', filename);
|
||||
cfg->vk_coin = GetPrivateProfileIntW(L"io4", L"coin", '3', filename);
|
||||
cfg->vk_test = GetPrivateProfileIntW(L"io4", L"test", VK_F1, filename);
|
||||
cfg->vk_service = GetPrivateProfileIntW(L"io4", L"service", VK_F2, filename);
|
||||
cfg->vk_coin = GetPrivateProfileIntW(L"io4", L"coin", VK_F3, filename);
|
||||
|
||||
cfg->use_mouse = GetPrivateProfileIntW(L"io4", L"mouse", 0, filename);
|
||||
|
||||
|
@ -113,6 +113,14 @@ void dns_config_load(struct dns_config *cfg, const wchar_t *filename)
|
||||
cfg->aimedb,
|
||||
_countof(cfg->aimedb),
|
||||
filename);
|
||||
|
||||
GetPrivateProfileStringW(
|
||||
L"dns",
|
||||
L"title",
|
||||
L"title",
|
||||
cfg->title,
|
||||
_countof(cfg->title),
|
||||
filename);
|
||||
}
|
||||
|
||||
void hwmon_config_load(struct hwmon_config *cfg, const wchar_t *filename)
|
||||
|
@ -82,6 +82,33 @@ HRESULT dns_platform_hook_init(const struct dns_config *cfg)
|
||||
return hr;
|
||||
}
|
||||
|
||||
// crossbeats REV.
|
||||
hr = dns_hook_push(L"https://rev-ent.ac.capcom.jp:443", cfg->title);
|
||||
|
||||
if (FAILED(hr)) {
|
||||
return hr;
|
||||
}
|
||||
|
||||
// AimePay
|
||||
hr = dns_hook_push(L"api-aime.am-all.net", cfg->startup);
|
||||
|
||||
if (FAILED(hr)) {
|
||||
return hr;
|
||||
}
|
||||
|
||||
// E-MONEY
|
||||
hr = dns_hook_push(L"tasms-api-basis.thincacloud.com", cfg->startup);
|
||||
|
||||
if (FAILED(hr)) {
|
||||
return hr;
|
||||
}
|
||||
|
||||
hr = dns_hook_push(L"shop.tfps.thincacloud.com", cfg->startup);
|
||||
|
||||
if (FAILED(hr)) {
|
||||
return hr;
|
||||
}
|
||||
|
||||
// if your ISP resolves bad domains, it will kill the network. These 2
|
||||
// *cannot* resolve
|
||||
|
||||
|
@ -11,6 +11,7 @@ struct dns_config {
|
||||
wchar_t startup[128];
|
||||
wchar_t billing[128];
|
||||
wchar_t aimedb[128];
|
||||
wchar_t title[128];
|
||||
};
|
||||
|
||||
HRESULT dns_platform_hook_init(const struct dns_config *cfg);
|
||||
|
@ -1,5 +1,4 @@
|
||||
#include <windows.h>
|
||||
#include <wincrypt.h>
|
||||
#include <iphlpapi.h>
|
||||
|
||||
#include <stddef.h>
|
||||
@ -372,9 +371,12 @@ static uint32_t WINAPI hook_GetBestRoute(
|
||||
return ERROR_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
dprintf("Netenv: GetBestRoute ip4 %x -> ip4 %x\n",
|
||||
(int) _byteswap_ulong(src_ip),
|
||||
(int) _byteswap_ulong(dest_ip));
|
||||
uint32_t src_addr = _byteswap_ulong(src_ip);
|
||||
uint32_t dest_addr = _byteswap_ulong(dest_ip);
|
||||
|
||||
dprintf("Netenv: GetBestRoute ip4 %u.%u.%u.%u -> ip4 %u.%u.%u.%u\n",
|
||||
(src_addr >> 24) & 0xff, (src_addr >> 16) & 0xff, (src_addr >> 8) & 0xff, src_addr & 0xff,
|
||||
(dest_addr >> 24) & 0xff, (dest_addr >> 16) & 0xff, (dest_addr >> 8) & 0xff, dest_addr & 0xff);
|
||||
|
||||
memset(route, 0, sizeof(*route));
|
||||
|
||||
@ -469,8 +471,10 @@ static uint32_t WINAPI hook_IcmpSendEcho2(
|
||||
return 0;
|
||||
}
|
||||
|
||||
dprintf("Netenv: Virtualized ICMP Ping to ip4 %x\n",
|
||||
(int) _byteswap_ulong(DestinationAddress));
|
||||
uint32_t addr = _byteswap_ulong(DestinationAddress);
|
||||
|
||||
dprintf("Netenv: Virtualized ICMP Ping to ip4 %u.%u.%u.%u\n",
|
||||
(addr >> 24) & 0xff, (addr >> 16) & 0xff, (addr >> 8) & 0xff, addr & 0xff);
|
||||
|
||||
pong = (ICMP_ECHO_REPLY *) ReplyBuffer;
|
||||
memset(pong, 0, sizeof(*pong));
|
||||
|
@ -14,22 +14,22 @@
|
||||
#include "util/str.h"
|
||||
|
||||
enum {
|
||||
NUSEC_IOCTL_PING = 0x22A114,
|
||||
NUSEC_IOCTL_ERASE_TRACE_LOG = 0x22E188,
|
||||
NUSEC_IOCTL_TD_ERASE_USED = 0x22E18C,
|
||||
NUSEC_IOCTL_ADD_PLAY_COUNT = 0x22E154,
|
||||
NUSEC_IOCTL_GET_BILLING_CA_CERT = 0x22E1C4,
|
||||
NUSEC_IOCTL_GET_BILLING_PUBKEY = 0x22E1C8,
|
||||
NUSEC_IOCTL_GET_NEARFULL = 0x22E20C,
|
||||
NUSEC_IOCTL_GET_NVRAM_AVAILABLE = 0x22E19C,
|
||||
NUSEC_IOCTL_GET_NVRAM_GEOMETRY = 0x22E24C,
|
||||
NUSEC_IOCTL_GET_PLAY_COUNT = 0x22E150,
|
||||
NUSEC_IOCTL_GET_PLAY_LIMIT = 0x22E204,
|
||||
NUSEC_IOCTL_GET_TRACE_LOG_DATA = 0x22E194,
|
||||
NUSEC_IOCTL_GET_TRACE_LOG_STATE = 0x22E198,
|
||||
NUSEC_IOCTL_PUT_NEARFULL = 0x22E210,
|
||||
NUSEC_IOCTL_PUT_PLAY_LIMIT = 0x22E208,
|
||||
NUSEC_IOCTL_PUT_TRACE_LOG_DATA = 0x22E190,
|
||||
NUSEC_IOCTL_PING = CTL_CODE(0x22, 0x845, METHOD_BUFFERED, FILE_WRITE_ACCESS),
|
||||
NUSEC_IOCTL_GET_PLAY_COUNT = CTL_CODE(0x22, 0x854, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS),
|
||||
NUSEC_IOCTL_ADD_PLAY_COUNT = CTL_CODE(0x22, 0x855, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS),
|
||||
NUSEC_IOCTL_ERASE_TRACE_LOG = CTL_CODE(0x22, 0x862, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS),
|
||||
NUSEC_IOCTL_TD_ERASE_USED = CTL_CODE(0x22, 0x863, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS),
|
||||
NUSEC_IOCTL_PUT_TRACE_LOG_DATA = CTL_CODE(0x22, 0x864, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS),
|
||||
NUSEC_IOCTL_GET_TRACE_LOG_DATA = CTL_CODE(0x22, 0x865, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS),
|
||||
NUSEC_IOCTL_GET_TRACE_LOG_STATE = CTL_CODE(0x22, 0x866, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS),
|
||||
NUSEC_IOCTL_GET_NVRAM_AVAILABLE = CTL_CODE(0x22, 0x867, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS),
|
||||
NUSEC_IOCTL_GET_BILLING_CA_CERT = CTL_CODE(0x22, 0x871, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS),
|
||||
NUSEC_IOCTL_GET_BILLING_PUBKEY = CTL_CODE(0x22, 0x872, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS),
|
||||
NUSEC_IOCTL_GET_PLAY_LIMIT = CTL_CODE(0x22, 0x881, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS),
|
||||
NUSEC_IOCTL_PUT_PLAY_LIMIT = CTL_CODE(0x22, 0x882, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS),
|
||||
NUSEC_IOCTL_GET_NEARFULL = CTL_CODE(0x22, 0x883, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS),
|
||||
NUSEC_IOCTL_PUT_NEARFULL = CTL_CODE(0x22, 0x884, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS),
|
||||
NUSEC_IOCTL_GET_NVRAM_GEOMETRY = CTL_CODE(0x22, 0x893, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS),
|
||||
};
|
||||
|
||||
struct nusec_log_record {
|
||||
|
@ -277,11 +277,12 @@ static HRESULT vfs_path_hook(const wchar_t *src, wchar_t *dest, size_t *count)
|
||||
const wchar_t *redir;
|
||||
size_t required;
|
||||
size_t redir_len;
|
||||
size_t src_len;
|
||||
|
||||
assert(src != NULL);
|
||||
assert(count != NULL);
|
||||
|
||||
if (src[0] == L'\0' || src[1] != L':' || !path_is_separator_w(src[2])) {
|
||||
if (src[0] == L'\0' || src[1] != L':') {
|
||||
return S_FALSE;
|
||||
}
|
||||
|
||||
@ -304,10 +305,15 @@ static HRESULT vfs_path_hook(const wchar_t *src, wchar_t *dest, size_t *count)
|
||||
return S_FALSE;
|
||||
}
|
||||
|
||||
/* GetFileAttributesW would request the src "E:", so fix the src_len in
|
||||
in order to redirect the drive letter successfully */
|
||||
|
||||
src_len = path_is_separator_w(src[2]) ? 3 : 2;
|
||||
|
||||
/* Cut off <prefix>\, replace with redir path, count NUL terminator */
|
||||
|
||||
redir_len = wcslen(redir);
|
||||
required = wcslen(src) - 3 + redir_len + 1;
|
||||
required = wcslen(src) - src_len + redir_len + 1;
|
||||
|
||||
if (dest != NULL) {
|
||||
if (required > *count) {
|
||||
@ -315,7 +321,7 @@ static HRESULT vfs_path_hook(const wchar_t *src, wchar_t *dest, size_t *count)
|
||||
}
|
||||
|
||||
wcscpy_s(dest, *count, redir);
|
||||
wcscpy_s(dest + redir_len, *count - redir_len, src + 3);
|
||||
wcscpy_s(dest + redir_len, *count - redir_len, src + src_len);
|
||||
}
|
||||
|
||||
*count = required;
|
||||
@ -466,10 +472,10 @@ static HRESULT vfs_path_hook_option(
|
||||
|
||||
static HRESULT vfs_reg_read_amfs(void *bytes, uint32_t *nbytes)
|
||||
{
|
||||
return reg_hook_read_wstr(bytes, nbytes, vfs_config.amfs); // seems to be busted?
|
||||
return reg_hook_read_wstr(bytes, nbytes, L"E:\\");
|
||||
}
|
||||
|
||||
static HRESULT vfs_reg_read_appdata(void *bytes, uint32_t *nbytes)
|
||||
{
|
||||
return reg_hook_read_wstr(bytes, nbytes, vfs_config.appdata);
|
||||
return reg_hook_read_wstr(bytes, nbytes, L"Y:\\");
|
||||
}
|
||||
|
@ -283,7 +283,7 @@ Enable keychip emulation. Disable to use a real keychip.
|
||||
Default: `A69E-01A88888888`
|
||||
|
||||
Keychip serial number. Keychip serials observed in the wild follow this
|
||||
pattern: `A6xE-01Ayyyyyyyy`.
|
||||
pattern: `A\d{2}(E01|X20)[ABCDU]\d{8}`.
|
||||
|
||||
### `gameId`
|
||||
|
||||
|
@ -42,6 +42,7 @@ void swdc_hook_config_load(
|
||||
zinput_config_load(&cfg->zinput, filename);
|
||||
dvd_config_load(&cfg->dvd, filename);
|
||||
io4_config_load(&cfg->io4, filename);
|
||||
vfd_config_load(&cfg->vfd, filename);
|
||||
}
|
||||
|
||||
void zinput_config_load(struct zinput_config *cfg, const wchar_t *filename)
|
||||
|
@ -17,6 +17,7 @@ struct swdc_hook_config {
|
||||
struct aime_config aime;
|
||||
struct dvd_config dvd;
|
||||
struct io4_config io4;
|
||||
struct vfd_config vfd;
|
||||
struct swdc_dll_config dll;
|
||||
struct zinput_config zinput;
|
||||
};
|
||||
|
@ -16,7 +16,6 @@
|
||||
#include "swdchook/config.h"
|
||||
#include "swdchook/swdc-dll.h"
|
||||
#include "swdchook/io4.h"
|
||||
#include "swdchook/zinput.h"
|
||||
|
||||
#include "platform/platform.h"
|
||||
|
||||
@ -39,7 +38,6 @@ static DWORD CALLBACK swdc_pre_startup(void)
|
||||
/* Hook Win32 APIs */
|
||||
|
||||
serial_hook_init();
|
||||
zinput_hook_init(&swdc_hook_cfg.zinput, swdc_hook_mod);
|
||||
dvd_hook_init(&swdc_hook_cfg.dvd, swdc_hook_mod);
|
||||
|
||||
/* Initialize emulation hooks */
|
||||
@ -54,30 +52,34 @@ static DWORD CALLBACK swdc_pre_startup(void)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
hr = swdc_dll_init(&swdc_hook_cfg.dll, swdc_hook_mod);
|
||||
|
||||
if (FAILED(hr)) {
|
||||
goto fail;
|
||||
}
|
||||
|
||||
hr = sg_reader_hook_init(&swdc_hook_cfg.aime, 3, 3, swdc_hook_mod);
|
||||
|
||||
if (FAILED(hr)) {
|
||||
goto fail;
|
||||
}
|
||||
|
||||
hr = vfd_hook_init(4);
|
||||
hr = vfd_hook_init(&swdc_hook_cfg.vfd, 4);
|
||||
|
||||
if (FAILED(hr)) {
|
||||
return hr;
|
||||
}
|
||||
|
||||
hr = swdc_dll_init(&swdc_hook_cfg.dll, swdc_hook_mod);
|
||||
|
||||
if (FAILED(hr)) {
|
||||
goto fail;
|
||||
}
|
||||
|
||||
hr = swdc_io4_hook_init(&swdc_hook_cfg.io4);
|
||||
|
||||
if (FAILED(hr)) {
|
||||
goto fail;
|
||||
}
|
||||
|
||||
/* Hook external DLL APIs */
|
||||
|
||||
zinput_hook_init(&swdc_hook_cfg.zinput);
|
||||
|
||||
/* Initialize debug helpers */
|
||||
|
||||
spike_hook_init(L".\\segatools.ini");
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user