forked from Hay1tsme/segatools
Compare commits
96 Commits
2024-12-23
...
feature/ek
Author | SHA1 | Date | |
---|---|---|---|
6fa47f2c7f | |||
acedf0f372 | |||
6848a7a6c6 | |||
3195dbc282 | |||
67d0513273 | |||
a21fad184f | |||
fc22a29c56 | |||
e6e1171a5f | |||
84362a2839 | |||
7f017a0da9 | |||
f33fe0f2ae | |||
7dd1cd4a62 | |||
d264ae0b37 | |||
2950061d08 | |||
69a7f70388 | |||
1b09a57c0d | |||
d6143ebb5f | |||
136da4a2b8 | |||
04416715ef | |||
a6915a95f8 | |||
0f87e7510e | |||
05f68962cd | |||
bbfbe71852 | |||
619285c412 | |||
dc631215b1 | |||
3327548ca6 | |||
0480a7e767
|
|||
57d23726e8 | |||
837b0663aa | |||
873ae0a30a | |||
da0fc56500 | |||
fdd9c2fbc8
|
|||
bb47e4f1b5 | |||
d9210b52e1 | |||
4788e54398 | |||
e090f472af | |||
19c1a8e469 | |||
eb96660fdf | |||
83a9a49429 | |||
d423058cbd | |||
9703a0938a | |||
ec1a232103 | |||
55a3859891
|
|||
3f2cfb6a26
|
|||
e74e2a0d47
|
|||
122034f922
|
|||
bb0b023ec0
|
|||
bb01e131e9
|
|||
ded1375e88 | |||
c2af0a0df5 | |||
918d6368a5 | |||
0006731536
|
|||
ae168cdaf9
|
|||
e974a76fe6
|
|||
e2e4b37e3f | |||
f595af9686
|
|||
03513e7b0c
|
|||
d20bea1e16 | |||
cdb6815c5a
|
|||
dfab6bdb54 | |||
4644e36ccc
|
|||
dbfc62b5d4
|
|||
24e8bc87a3 | |||
a65b43fe1a | |||
66a53dd2de
|
|||
ae3dd666f4
|
|||
a6126bf290
|
|||
015097972a
|
|||
67eda7458b | |||
b37e1105d0 | |||
9a6c4939c2 | |||
39711a994a | |||
61f95c3f2e | |||
f8504b46b5 | |||
70c3e2fe0f | |||
9b1f07e41b | |||
369fe28687 | |||
3371f3f437 | |||
a57542c2d2
|
|||
27116a7a41
|
|||
e850346b79
|
|||
4d0ef54279
|
|||
b8af67377c
|
|||
4cb76dd1ee
|
|||
efe01d92a6 | |||
004a2f6dcd | |||
2313113fd0 | |||
bf3ff76f0c | |||
9c0ca7d66c | |||
a1611afffc | |||
1d63ab24d3 | |||
2f54183636 | |||
402bf0f247 | |||
4c20deb60a | |||
96ee1afc2f | |||
0c28765bdd |
4
.gitignore
vendored
4
.gitignore
vendored
@ -18,6 +18,10 @@ build/
|
||||
|
||||
# External dependencies
|
||||
subprojects/capnhook
|
||||
subprojects/cwinwebsocket
|
||||
|
||||
# For enabling debug logging on local builds
|
||||
MesonLocalOptions.mk
|
||||
|
||||
# Some meson cache thing
|
||||
.meson-subproject-wrap-hash.txt
|
||||
|
2
Makefile
2
Makefile
@ -5,6 +5,8 @@ V ?= @
|
||||
BUILD_DIR := build
|
||||
BUILD_DIR_32 := $(BUILD_DIR)/build32
|
||||
BUILD_DIR_64 := $(BUILD_DIR)/build64
|
||||
BUILD_DIR_GAMES_32 := $(BUILD_DIR_32)/games
|
||||
BUILD_DIR_GAMES_64 := $(BUILD_DIR_64)/games
|
||||
BUILD_DIR_ZIP := $(BUILD_DIR)/zip
|
||||
|
||||
DOC_DIR := doc
|
||||
|
128
Package.mk
128
Package.mk
@ -3,9 +3,9 @@ $(BUILD_DIR_ZIP)/chuni.zip:
|
||||
$(V)mkdir -p $(BUILD_DIR_ZIP)/chuni
|
||||
$(V)mkdir -p $(BUILD_DIR_ZIP)/chuni/DEVICE
|
||||
$(V)cp $(BUILD_DIR_32)/subprojects/capnhook/inject/inject.exe \
|
||||
$(BUILD_DIR_32)/chunihook/chunihook.dll \
|
||||
$(BUILD_DIR_GAMES_32)/chunihook/chunihook.dll \
|
||||
$(DIST_DIR)/chuni/segatools.ini \
|
||||
$(DIST_DIR)/chuni/start.bat \
|
||||
$(DIST_DIR)/chuni/launch.bat \
|
||||
$(BUILD_DIR_ZIP)/chuni
|
||||
$(V)cp pki/billing.pub \
|
||||
pki/ca.crt \
|
||||
@ -18,9 +18,9 @@ $(BUILD_DIR_ZIP)/cxb.zip:
|
||||
$(V)mkdir -p $(BUILD_DIR_ZIP)/cxb
|
||||
$(V)mkdir -p $(BUILD_DIR_ZIP)/cxb/DEVICE
|
||||
$(V)cp $(BUILD_DIR_32)/subprojects/capnhook/inject/inject.exe \
|
||||
$(BUILD_DIR_32)/cxbhook/cxbhook.dll \
|
||||
$(BUILD_DIR_GAMES_32)/cxbhook/cxbhook.dll \
|
||||
$(DIST_DIR)/cxb/segatools.ini \
|
||||
$(DIST_DIR)/cxb/start.bat \
|
||||
$(DIST_DIR)/cxb/launch.bat \
|
||||
$(BUILD_DIR_ZIP)/cxb
|
||||
$(V)cp pki/billing.pub \
|
||||
pki/ca.crt \
|
||||
@ -33,9 +33,9 @@ $(BUILD_DIR_ZIP)/diva.zip:
|
||||
$(V)mkdir -p $(BUILD_DIR_ZIP)/diva
|
||||
$(V)mkdir -p $(BUILD_DIR_ZIP)/diva/DEVICE
|
||||
$(V)cp $(BUILD_DIR_64)/subprojects/capnhook/inject/inject.exe \
|
||||
$(BUILD_DIR_64)/divahook/divahook.dll \
|
||||
$(BUILD_DIR_GAMES_64)/divahook/divahook.dll \
|
||||
$(DIST_DIR)/diva/segatools.ini \
|
||||
$(DIST_DIR)/diva/start.bat \
|
||||
$(DIST_DIR)/diva/launch.bat \
|
||||
$(BUILD_DIR_ZIP)/diva
|
||||
$(V)cp pki/billing.pub \
|
||||
pki/ca.crt \
|
||||
@ -48,9 +48,9 @@ $(BUILD_DIR_ZIP)/carol.zip:
|
||||
$(V)mkdir -p $(BUILD_DIR_ZIP)/carol
|
||||
$(V)mkdir -p $(BUILD_DIR_ZIP)/carol/DEVICE
|
||||
$(V)cp $(BUILD_DIR_32)/subprojects/capnhook/inject/inject.exe \
|
||||
$(BUILD_DIR_32)/carolhook/carolhook.dll \
|
||||
$(BUILD_DIR_GAMES_32)/carolhook/carolhook.dll \
|
||||
$(DIST_DIR)/carol/segatools.ini \
|
||||
$(DIST_DIR)/carol/start.bat \
|
||||
$(DIST_DIR)/carol/launch.bat \
|
||||
$(BUILD_DIR_ZIP)/carol
|
||||
$(V)cp pki/billing.pub \
|
||||
pki/ca.crt \
|
||||
@ -63,9 +63,9 @@ $(BUILD_DIR_ZIP)/idz.zip:
|
||||
$(V)mkdir -p $(BUILD_DIR_ZIP)/idz
|
||||
$(V)mkdir -p $(BUILD_DIR_ZIP)/idz/DEVICE
|
||||
$(V)cp $(BUILD_DIR_64)/subprojects/capnhook/inject/inject.exe \
|
||||
$(BUILD_DIR_64)/idzhook/idzhook.dll \
|
||||
$(BUILD_DIR_GAMES_64)/idzhook/idzhook.dll \
|
||||
$(DIST_DIR)/idz/segatools.ini \
|
||||
$(DIST_DIR)/idz/start.bat \
|
||||
$(DIST_DIR)/idz/launch.bat \
|
||||
$(BUILD_DIR_ZIP)/idz
|
||||
$(V)cp pki/billing.pub \
|
||||
pki/ca.crt \
|
||||
@ -78,9 +78,9 @@ $(BUILD_DIR_ZIP)/fgo.zip:
|
||||
$(V)mkdir -p $(BUILD_DIR_ZIP)/fgo
|
||||
$(V)mkdir -p $(BUILD_DIR_ZIP)/fgo/DEVICE
|
||||
$(V)cp $(BUILD_DIR_64)/subprojects/capnhook/inject/inject.exe \
|
||||
$(BUILD_DIR_64)/fgohook/fgohook.dll \
|
||||
$(BUILD_DIR_GAMES_64)/fgohook/fgohook.dll \
|
||||
$(DIST_DIR)/fgo/segatools.ini \
|
||||
$(DIST_DIR)/fgo/start.bat \
|
||||
$(DIST_DIR)/fgo/launch.bat \
|
||||
$(BUILD_DIR_ZIP)/fgo
|
||||
$(V)cp pki/billing.pub \
|
||||
pki/ca.crt \
|
||||
@ -93,10 +93,10 @@ $(BUILD_DIR_ZIP)/idac.zip:
|
||||
$(V)mkdir -p $(BUILD_DIR_ZIP)/idac
|
||||
$(V)mkdir -p $(BUILD_DIR_ZIP)/idac/DEVICE
|
||||
$(V)cp $(BUILD_DIR_64)/subprojects/capnhook/inject/inject.exe \
|
||||
$(BUILD_DIR_64)/idachook/idachook.dll \
|
||||
$(BUILD_DIR_GAMES_64)/idachook/idachook.dll \
|
||||
$(DIST_DIR)/idac/segatools.ini \
|
||||
$(DIST_DIR)/idac/config_hook.json \
|
||||
$(DIST_DIR)/idac/start.bat \
|
||||
$(DIST_DIR)/idac/launch.bat \
|
||||
$(BUILD_DIR_ZIP)/idac
|
||||
$(V)cp pki/billing.pub \
|
||||
pki/ca.crt \
|
||||
@ -109,10 +109,10 @@ $(BUILD_DIR_ZIP)/swdc.zip:
|
||||
$(V)mkdir -p $(BUILD_DIR_ZIP)/swdc
|
||||
$(V)mkdir -p $(BUILD_DIR_ZIP)/swdc/DEVICE
|
||||
$(V)cp $(BUILD_DIR_64)/subprojects/capnhook/inject/inject.exe \
|
||||
$(BUILD_DIR_64)/swdchook/swdchook.dll \
|
||||
$(BUILD_DIR_GAMES_64)/swdchook/swdchook.dll \
|
||||
$(DIST_DIR)/swdc/segatools.ini \
|
||||
$(DIST_DIR)/swdc/config_hook.json \
|
||||
$(DIST_DIR)/swdc/start.bat \
|
||||
$(DIST_DIR)/swdc/launch.bat \
|
||||
$(BUILD_DIR_ZIP)/swdc
|
||||
$(V)cp pki/billing.pub \
|
||||
pki/ca.crt \
|
||||
@ -125,9 +125,9 @@ $(BUILD_DIR_ZIP)/mercury.zip:
|
||||
$(V)mkdir -p $(BUILD_DIR_ZIP)/mercury
|
||||
$(V)mkdir -p $(BUILD_DIR_ZIP)/mercury/DEVICE
|
||||
$(V)cp $(BUILD_DIR_64)/subprojects/capnhook/inject/inject.exe \
|
||||
$(BUILD_DIR_64)/mercuryhook/mercuryhook.dll \
|
||||
$(BUILD_DIR_GAMES_64)/mercuryhook/mercuryhook.dll \
|
||||
$(DIST_DIR)/mercury/segatools.ini \
|
||||
$(DIST_DIR)/mercury/start.bat \
|
||||
$(DIST_DIR)/mercury/launch.bat \
|
||||
$(BUILD_DIR_ZIP)/mercury
|
||||
$(V)cp pki/billing.pub \
|
||||
pki/ca.crt \
|
||||
@ -141,11 +141,11 @@ $(BUILD_DIR_ZIP)/chusan.zip:
|
||||
$(V)mkdir -p $(BUILD_DIR_ZIP)/chusan/DEVICE
|
||||
$(V)cp $(DIST_DIR)/chusan/segatools.ini \
|
||||
$(DIST_DIR)/chusan/config_hook.json \
|
||||
$(DIST_DIR)/chusan/start.bat \
|
||||
$(DIST_DIR)/chusan/launch.bat \
|
||||
$(BUILD_DIR_ZIP)/chusan
|
||||
$(V)cp $(BUILD_DIR_32)/chusanhook/chusanhook.dll \
|
||||
$(V)cp $(BUILD_DIR_GAMES_32)/chusanhook/chusanhook.dll \
|
||||
$(BUILD_DIR_ZIP)/chusan/chusanhook_x86.dll
|
||||
$(V)cp $(BUILD_DIR_64)/chusanhook/chusanhook.dll \
|
||||
$(V)cp $(BUILD_DIR_GAMES_64)/chusanhook/chusanhook.dll \
|
||||
$(BUILD_DIR_ZIP)/chusan/chusanhook_x64.dll
|
||||
$(V)cp $(BUILD_DIR_32)/subprojects/capnhook/inject/inject.exe \
|
||||
$(BUILD_DIR_ZIP)/chusan/inject_x86.exe
|
||||
@ -162,9 +162,9 @@ $(BUILD_DIR_ZIP)/mu3.zip:
|
||||
$(V)mkdir -p $(BUILD_DIR_ZIP)/mu3
|
||||
$(V)mkdir -p $(BUILD_DIR_ZIP)/mu3/DEVICE
|
||||
$(V)cp $(BUILD_DIR_64)/subprojects/capnhook/inject/inject.exe \
|
||||
$(BUILD_DIR_64)/mu3hook/mu3hook.dll \
|
||||
$(BUILD_DIR_GAMES_64)/mu3hook/mu3hook.dll \
|
||||
$(DIST_DIR)/mu3/segatools.ini \
|
||||
$(DIST_DIR)/mu3/start.bat \
|
||||
$(DIST_DIR)/mu3/launch.bat \
|
||||
$(BUILD_DIR_ZIP)/mu3
|
||||
$(V)cp pki/billing.pub \
|
||||
pki/ca.crt \
|
||||
@ -177,9 +177,9 @@ $(BUILD_DIR_ZIP)/mai2.zip:
|
||||
$(V)mkdir -p $(BUILD_DIR_ZIP)/mai2
|
||||
$(V)mkdir -p $(BUILD_DIR_ZIP)/mai2/DEVICE
|
||||
$(V)cp $(BUILD_DIR_64)/subprojects/capnhook/inject/inject.exe \
|
||||
$(BUILD_DIR_64)/mai2hook/mai2hook.dll \
|
||||
$(BUILD_DIR_GAMES_64)/mai2hook/mai2hook.dll \
|
||||
$(DIST_DIR)/mai2/segatools.ini \
|
||||
$(DIST_DIR)/mai2/start.bat \
|
||||
$(DIST_DIR)/mai2/launch.bat \
|
||||
$(BUILD_DIR_ZIP)/mai2
|
||||
$(V)cp pki/billing.pub \
|
||||
pki/ca.crt \
|
||||
@ -192,10 +192,10 @@ $(BUILD_DIR_ZIP)/cm.zip:
|
||||
$(V)mkdir -p $(BUILD_DIR_ZIP)/cm
|
||||
$(V)mkdir -p $(BUILD_DIR_ZIP)/cm/DEVICE
|
||||
$(V)cp $(BUILD_DIR_64)/subprojects/capnhook/inject/inject.exe \
|
||||
$(BUILD_DIR_64)/cmhook/cmhook.dll \
|
||||
$(BUILD_DIR_GAMES_64)/cmhook/cmhook.dll \
|
||||
$(DIST_DIR)/cm/config_hook.json \
|
||||
$(DIST_DIR)/cm/segatools.ini \
|
||||
$(DIST_DIR)/cm/start.bat \
|
||||
$(DIST_DIR)/cm/launch.bat \
|
||||
$(BUILD_DIR_ZIP)/cm
|
||||
$(V)cp pki/billing.pub \
|
||||
pki/ca.crt \
|
||||
@ -208,10 +208,10 @@ $(BUILD_DIR_ZIP)/tokyo.zip:
|
||||
$(V)mkdir -p $(BUILD_DIR_ZIP)/tokyo
|
||||
$(V)mkdir -p $(BUILD_DIR_ZIP)/tokyo/DEVICE
|
||||
$(V)cp $(BUILD_DIR_64)/subprojects/capnhook/inject/inject.exe \
|
||||
$(BUILD_DIR_64)/tokyohook/tokyohook.dll \
|
||||
$(BUILD_DIR_GAMES_64)/tokyohook/tokyohook.dll \
|
||||
$(DIST_DIR)/tokyo/config_hook.json \
|
||||
$(DIST_DIR)/tokyo/segatools.ini \
|
||||
$(DIST_DIR)/tokyo/start.bat \
|
||||
$(DIST_DIR)/tokyo/launch.bat \
|
||||
$(BUILD_DIR_ZIP)/tokyo
|
||||
$(V)cp pki/billing.pub \
|
||||
pki/ca.crt \
|
||||
@ -224,11 +224,11 @@ $(BUILD_DIR_ZIP)/kemono.zip:
|
||||
$(V)mkdir -p $(BUILD_DIR_ZIP)/kemono
|
||||
$(V)mkdir -p $(BUILD_DIR_ZIP)/kemono/DEVICE
|
||||
$(V)cp $(DIST_DIR)/kemono/segatools.ini \
|
||||
$(DIST_DIR)/kemono/start.bat \
|
||||
$(DIST_DIR)/kemono/launch.bat \
|
||||
$(BUILD_DIR_ZIP)/kemono
|
||||
$(V)cp $(BUILD_DIR_32)/kemonohook/kemonohook.dll \
|
||||
$(V)cp $(BUILD_DIR_GAMES_32)/kemonohook/kemonohook.dll \
|
||||
$(BUILD_DIR_ZIP)/kemono/kemonohook_x86.dll
|
||||
$(V)cp $(BUILD_DIR_64)/kemonohook/kemonohook.dll \
|
||||
$(V)cp $(BUILD_DIR_GAMES_64)/kemonohook/kemonohook.dll \
|
||||
$(BUILD_DIR_ZIP)/kemono/kemonohook_x64.dll
|
||||
$(V)cp $(BUILD_DIR_32)/subprojects/capnhook/inject/inject.exe \
|
||||
$(BUILD_DIR_ZIP)/kemono/inject_x86.exe
|
||||
@ -240,6 +240,68 @@ $(BUILD_DIR_ZIP)/kemono.zip:
|
||||
for x in exe dll; do strip $(BUILD_DIR_ZIP)/kemono/*.$$x; done
|
||||
$(V)cd $(BUILD_DIR_ZIP)/kemono ; zip -r ../kemono.zip *
|
||||
|
||||
$(BUILD_DIR_ZIP)/apm3.zip:
|
||||
$(V)echo ... $@
|
||||
$(V)mkdir -p $(BUILD_DIR_ZIP)/apm3
|
||||
$(V)mkdir -p $(BUILD_DIR_ZIP)/apm3/DEVICE
|
||||
$(V)cp $(BUILD_DIR_64)/subprojects/capnhook/inject/inject.exe \
|
||||
$(BUILD_DIR_GAMES_64)/apm3hook/apm3hook.dll \
|
||||
$(DIST_DIR)/apm3/segatools.ini \
|
||||
$(DIST_DIR)/apm3/launch.bat \
|
||||
$(DIST_DIR)/apm3/config_hook.json \
|
||||
$(BUILD_DIR_ZIP)/apm3
|
||||
$(V)cp pki/billing.pub \
|
||||
pki/ca.crt \
|
||||
$(BUILD_DIR_ZIP)/apm3/DEVICE
|
||||
$(V)strip $(BUILD_DIR_ZIP)/apm3/*.{exe,dll}
|
||||
$(V)cd $(BUILD_DIR_ZIP)/apm3 ; zip -r ../apm3.zip *
|
||||
|
||||
$(BUILD_DIR_ZIP)/ekt.zip:
|
||||
$(V)echo ... $@
|
||||
$(V)mkdir -p $(BUILD_DIR_ZIP)/ekt
|
||||
$(V)mkdir -p $(BUILD_DIR_ZIP)/ekt/DEVICE
|
||||
$(V)cp $(BUILD_DIR_64)/subprojects/capnhook/inject/inject.exe \
|
||||
$(BUILD_DIR_GAMES_64)/ekthook/ekthook.dll \
|
||||
$(DIST_DIR)/ekt/segatools_terminal.ini \
|
||||
$(DIST_DIR)/ekt/segatools_satellite.ini \
|
||||
$(DIST_DIR)/ekt/launch_terminal.bat \
|
||||
$(DIST_DIR)/ekt/launch_satellite.bat \
|
||||
$(DIST_DIR)/ekt/card_player.html \
|
||||
$(DIST_DIR)/ekt/config_hook.json \
|
||||
$(BUILD_DIR_ZIP)/ekt
|
||||
$(V)cp pki/billing.pub \
|
||||
pki/ca.crt \
|
||||
$(BUILD_DIR_ZIP)/ekt/DEVICE
|
||||
$(V)strip $(BUILD_DIR_ZIP)/ekt/*.{exe,dll}
|
||||
$(V)cd $(BUILD_DIR_ZIP)/ekt ; zip -r ../ekt.zip *
|
||||
|
||||
$(BUILD_DIR_ZIP)/sekito.zip:
|
||||
$(V)echo ... $@
|
||||
$(V)mkdir -p $(BUILD_DIR_ZIP)/sekito
|
||||
$(V)mkdir -p $(BUILD_DIR_ZIP)/sekito/DEVICE
|
||||
$(V)cp $(DIST_DIR)/sekito/segatools_terminal.ini \
|
||||
$(DIST_DIR)/sekito/segatools_satellite.ini \
|
||||
$(DIST_DIR)/sekito/launch_terminal.bat \
|
||||
$(DIST_DIR)/sekito/launch_satellite.bat \
|
||||
$(DIST_DIR)/sekito/card_player.html \
|
||||
$(DIST_DIR)/sekito/config_hook.json \
|
||||
$(BUILD_DIR_ZIP)/sekito
|
||||
$(V)cp pki/billing.pub \
|
||||
pki/ca.crt \
|
||||
$(BUILD_DIR_ZIP)/sekito/DEVICE
|
||||
$(V)cp $(BUILD_DIR_32)/subprojects/capnhook/inject/inject.exe \
|
||||
$(BUILD_DIR_ZIP)/sekito/inject_x86.exe
|
||||
$(V)cp $(BUILD_DIR_64)/subprojects/capnhook/inject/inject.exe \
|
||||
$(BUILD_DIR_ZIP)/sekito/inject_x64.exe
|
||||
$(V)cp $(BUILD_DIR_32)/subprojects/capnhook/inject/inject.exe \
|
||||
$(BUILD_DIR_ZIP)/sekito/inject_x86.exe
|
||||
$(V)cp $(BUILD_DIR_GAMES_32)/sekitohook/sekitohook.dll \
|
||||
$(BUILD_DIR_ZIP)/sekito/sekitohook_x86.dll
|
||||
$(V)cp $(BUILD_DIR_GAMES_64)/sekitohook/sekitohook.dll \
|
||||
$(BUILD_DIR_ZIP)/sekito/sekitohook_x64.dll
|
||||
$(V)strip $(BUILD_DIR_ZIP)/sekito/*.{exe,dll}
|
||||
$(V)cd $(BUILD_DIR_ZIP)/sekito ; zip -r ../sekito.zip *
|
||||
|
||||
$(BUILD_DIR_ZIP)/doc.zip: \
|
||||
$(DOC_DIR)/config \
|
||||
$(DOC_DIR)/chunihook.md \
|
||||
@ -265,6 +327,8 @@ $(BUILD_DIR_ZIP)/segatools.zip: \
|
||||
$(BUILD_DIR_ZIP)/tokyo.zip \
|
||||
$(BUILD_DIR_ZIP)/fgo.zip \
|
||||
$(BUILD_DIR_ZIP)/kemono.zip \
|
||||
$(BUILD_DIR_ZIP)/apm3.zip \
|
||||
$(BUILD_DIR_ZIP)/ekt.zip \
|
||||
CHANGELOG.md \
|
||||
README.md \
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
# Segatools
|
||||
|
||||
Version: `2024-09-30`
|
||||
Version: `2025-07-27`
|
||||
|
||||
Loaders and hardware emulators for SEGA games that run on the Nu and ALLS platforms.
|
||||
|
||||
@ -32,6 +32,8 @@ Loaders and hardware emulators for SEGA games that run on the Nu and ALLS platfo
|
||||
* starting from WACCA
|
||||
* Kemono Friends
|
||||
* Kemono Friends 3: Planet Tours
|
||||
* ALL.Net P-ras MULTI Version 3
|
||||
* starting from ALL.Net P-ras MULTI Version 3 1.01
|
||||
|
||||
## End-users
|
||||
|
||||
|
@ -1,5 +1,4 @@
|
||||
#include <windows.h>
|
||||
#include <ntstatus.h>
|
||||
#include <winioctl.h>
|
||||
|
||||
#include <assert.h>
|
@ -74,7 +74,16 @@ void aime_config_load(struct aime_config *cfg, const wchar_t *filename)
|
||||
cfg->enable = GetPrivateProfileIntW(L"aime", L"enable", 1, filename);
|
||||
cfg->port_no = GetPrivateProfileIntW(L"aime", L"portNo", 0, filename);
|
||||
cfg->high_baudrate = GetPrivateProfileIntW(L"aime", L"highBaud", 1, filename);
|
||||
cfg->gen = GetPrivateProfileIntW(L"aime", L"gen", 0, filename);
|
||||
cfg->gen = GetPrivateProfileIntW(L"aime", L"gen", 3, filename);
|
||||
cfg->proxy_flag = GetPrivateProfileIntW(L"aime", L"proxyFlag", 2, filename);
|
||||
|
||||
GetPrivateProfileStringW(
|
||||
L"aime",
|
||||
L"authdataPath",
|
||||
L"DEVICE\\authdata.bin",
|
||||
cfg->authdata_path,
|
||||
_countof(cfg->authdata_path),
|
||||
filename);
|
||||
}
|
||||
|
||||
void io4_config_load(struct io4_config *cfg, const wchar_t *filename)
|
@ -103,19 +103,30 @@ HRESULT led15070_hook_init(
|
||||
io_led_set_fet_output_t _led_set_fet_output,
|
||||
io_led_dc_update_t _led_dc_update,
|
||||
io_led_gs_update_t _led_gs_update,
|
||||
unsigned int first_port,
|
||||
unsigned int num_boards)
|
||||
unsigned int port_no[2])
|
||||
{
|
||||
unsigned int num_boards = 0;
|
||||
|
||||
assert(cfg != NULL);
|
||||
assert(_led_init != NULL);
|
||||
|
||||
if (!cfg->enable) {
|
||||
return S_FALSE;
|
||||
}
|
||||
|
||||
if (cfg->port_no != 0) {
|
||||
first_port = cfg->port_no;
|
||||
for (int i = 0; i < led15070_nboards; i++)
|
||||
{
|
||||
if (cfg->port_no[i] != 0) {
|
||||
port_no[i] = cfg->port_no[i];
|
||||
}
|
||||
|
||||
if (port_no[i] != 0) {
|
||||
num_boards++;
|
||||
}
|
||||
}
|
||||
|
||||
assert(num_boards != 0);
|
||||
|
||||
led_init = _led_init;
|
||||
led_set_fet_output = _led_set_fet_output;
|
||||
led_dc_update = _led_dc_update;
|
||||
@ -131,10 +142,7 @@ HRESULT led15070_hook_init(
|
||||
|
||||
InitializeCriticalSection(&v->lock);
|
||||
|
||||
// TODO: IMPROVE!
|
||||
first_port = i == 1 ? first_port + 2 : first_port;
|
||||
|
||||
uart_init(&v->boarduart, first_port);
|
||||
uart_init(&v->boarduart, port_no[i]);
|
||||
v->boarduart.baud.BaudRate = 115200;
|
||||
v->boarduart.written.bytes = v->written_bytes;
|
||||
v->boarduart.written.nbytes = sizeof(v->written_bytes);
|
||||
@ -238,7 +246,7 @@ static HRESULT led15070_handle_irp_locked(int board, struct irp *irp)
|
||||
}
|
||||
|
||||
for (;;) {
|
||||
#if 0
|
||||
#if defined(LOG_LED15070)
|
||||
dprintf("TX Buffer:\n");
|
||||
dump_iobuf(&boarduart->written);
|
||||
#endif
|
||||
@ -257,7 +265,7 @@ static HRESULT led15070_handle_irp_locked(int board, struct irp *irp)
|
||||
return hr;
|
||||
}
|
||||
|
||||
#if 0
|
||||
#if defined(LOG_LED15070)
|
||||
dprintf("Deframe Buffer:\n");
|
||||
dump_iobuf(&req_iobuf);
|
||||
#endif
|
||||
@ -385,7 +393,9 @@ static HRESULT led15070_req_reset(int board, const struct led15070_req_any *req)
|
||||
|
||||
static HRESULT led15070_req_set_input(int board, const struct led15070_req_any *req)
|
||||
{
|
||||
#if defined(LOG_LED15070)
|
||||
dprintf("LED 15070: Set input (board %u)\n", board);
|
||||
#endif
|
||||
|
||||
if (!led15070_per_board_vars[board].enable_response)
|
||||
return S_OK;
|
||||
@ -408,9 +418,10 @@ static HRESULT led15070_req_set_input(int board, const struct led15070_req_any *
|
||||
static HRESULT led15070_req_set_normal_12bit(int board, const struct led15070_req_any *req)
|
||||
{
|
||||
uint8_t idx = req->payload[0];
|
||||
|
||||
#if defined(LOG_LED15070)
|
||||
dprintf("LED 15070: Set LED - Normal 12bit (board %u, index %u)\n",
|
||||
board, idx);
|
||||
#endif
|
||||
|
||||
// TODO: Data for this command. Seen with Carol
|
||||
|
||||
@ -435,9 +446,10 @@ static HRESULT led15070_req_set_normal_12bit(int board, const struct led15070_re
|
||||
static HRESULT led15070_req_set_normal_8bit(int board, const struct led15070_req_any *req)
|
||||
{
|
||||
uint8_t idx = req->payload[0];
|
||||
|
||||
// dprintf("LED 15070: Set LED - Normal 8bit (board %u, index %u)\n",
|
||||
// board, idx);
|
||||
#if defined(LOG_LED15070)
|
||||
dprintf("LED 15070: Set LED - Normal 8bit (board %u, index %u)\n",
|
||||
board, idx);
|
||||
#endif
|
||||
|
||||
led15070_per_board_vars[board].gs[idx][0] = req->payload[1]; // R
|
||||
led15070_per_board_vars[board].gs[idx][1] = req->payload[2]; // G
|
||||
@ -468,8 +480,10 @@ static HRESULT led15070_req_set_multi_flash_8bit(int board, const struct led1507
|
||||
uint8_t idx_skip = req->payload[2];
|
||||
|
||||
// TODO: useful?
|
||||
// dprintf("LED 15070: Set LED - Multi flash 8bit (board %u, start %u, end %u, skip %u)\n",
|
||||
// board, idx_start, idx_end, idx_skip);
|
||||
#if defined(LOG_LED15070)
|
||||
dprintf("LED 15070: Set LED - Multi flash 8bit (board %u, start %u, end %u, skip %u)\n",
|
||||
board, idx_start, idx_end, idx_skip);
|
||||
#endif
|
||||
|
||||
if (idx_skip > 0 && idx_skip <= (idx_end - idx_start + 1)) {
|
||||
idx_start += idx_skip;
|
||||
@ -508,9 +522,10 @@ static HRESULT led15070_req_set_multi_fade_8bit(int board, const struct led15070
|
||||
uint8_t idx_start = req->payload[0];
|
||||
uint8_t idx_end = req->payload[1];
|
||||
uint8_t idx_skip = req->payload[2];
|
||||
|
||||
// dprintf("LED 15070: Set LED - Multi fade 8bit (board %u, start %u, end %u, skip %u)\n",
|
||||
// board, idx_start, idx_end, idx_skip);
|
||||
#if defined(LOG_LED15070)
|
||||
dprintf("LED 15070: Set LED - Multi fade 8bit (board %u, start %u, end %u, skip %u)\n",
|
||||
board, idx_start, idx_end, idx_skip);
|
||||
#endif
|
||||
|
||||
if (idx_skip > 0 && idx_skip <= (idx_end - idx_start + 1)) {
|
||||
idx_start += idx_skip;
|
||||
@ -545,7 +560,9 @@ static HRESULT led15070_req_set_multi_fade_8bit(int board, const struct led15070
|
||||
|
||||
static HRESULT led15070_req_set_palette_7_normal_led(int board, const struct led15070_req_any *req)
|
||||
{
|
||||
#if defined(LOG_LED15070)
|
||||
dprintf("LED 15070: Set palette - 7 Normal LED (board %u)\n", board);
|
||||
#endif
|
||||
|
||||
if (!led15070_per_board_vars[board].enable_response)
|
||||
return S_OK;
|
||||
@ -567,7 +584,9 @@ static HRESULT led15070_req_set_palette_7_normal_led(int board, const struct led
|
||||
|
||||
static HRESULT led15070_req_set_palette_6_flash_led(int board, const struct led15070_req_any *req)
|
||||
{
|
||||
#if defined(LOG_LED15070)
|
||||
dprintf("LED 15070: Set palette - 6 Flash LED (board %u)\n", board);
|
||||
#endif
|
||||
|
||||
if (!led15070_per_board_vars[board].enable_response)
|
||||
return S_OK;
|
||||
@ -589,7 +608,9 @@ static HRESULT led15070_req_set_palette_6_flash_led(int board, const struct led1
|
||||
|
||||
static HRESULT led15070_req_set_15dc_out(int board, const struct led15070_req_any *req)
|
||||
{
|
||||
#if defined(LOG_LED15070)
|
||||
dprintf("LED 15070: Set 15DC out (board %u)\n", board);
|
||||
#endif
|
||||
|
||||
if (!led15070_per_board_vars[board].enable_response)
|
||||
return S_OK;
|
||||
@ -611,7 +632,9 @@ static HRESULT led15070_req_set_15dc_out(int board, const struct led15070_req_an
|
||||
|
||||
static HRESULT led15070_req_set_15gs_out(int board, const struct led15070_req_any *req)
|
||||
{
|
||||
#if defined(LOG_LED15070)
|
||||
dprintf("LED 15070: Set 15GS out (board %u)\n", board);
|
||||
#endif
|
||||
|
||||
if (!led15070_per_board_vars[board].enable_response)
|
||||
return S_OK;
|
||||
@ -633,7 +656,9 @@ static HRESULT led15070_req_set_15gs_out(int board, const struct led15070_req_an
|
||||
|
||||
static HRESULT led15070_req_set_psc_max(int board, const struct led15070_req_any *req)
|
||||
{
|
||||
#if defined(LOG_LED15070)
|
||||
dprintf("LED 15070: Set PSC max (board %u)\n", board);
|
||||
#endif
|
||||
|
||||
if (!led15070_per_board_vars[board].enable_response)
|
||||
return S_OK;
|
||||
@ -655,14 +680,16 @@ static HRESULT led15070_req_set_psc_max(int board, const struct led15070_req_any
|
||||
|
||||
static HRESULT led15070_req_set_fet_output(int board, const struct led15070_req_any *req)
|
||||
{
|
||||
#if defined(LOG_LED15070)
|
||||
dprintf("LED 15070: Set FET output (board %u)\n", board);
|
||||
#endif
|
||||
|
||||
led15070_per_board_vars[board].fet[0] = req->payload[0]; // R or FET0 intensity
|
||||
led15070_per_board_vars[board].fet[1] = req->payload[1]; // G or FET1 intensity
|
||||
led15070_per_board_vars[board].fet[2] = req->payload[2]; // B or FET2 intensity
|
||||
|
||||
if (led_set_fet_output)
|
||||
led_set_fet_output((const uint8_t*)led15070_per_board_vars[board].fet);
|
||||
led_set_fet_output(board, (const uint8_t*)led15070_per_board_vars[board].fet);
|
||||
|
||||
if (!led15070_per_board_vars[board].enable_response)
|
||||
return S_OK;
|
||||
@ -685,8 +712,9 @@ static HRESULT led15070_req_set_fet_output(int board, const struct led15070_req_
|
||||
static HRESULT led15070_req_set_gs_palette(int board, const struct led15070_req_any *req)
|
||||
{
|
||||
uint8_t idx = req->payload[0];
|
||||
|
||||
#if defined(LOG_LED15070)
|
||||
dprintf("LED 15070: Set GS palette (board %u, index %u)\n", board, idx);
|
||||
#endif
|
||||
|
||||
led15070_per_board_vars[board].gs_palette[idx][0] = req->payload[1]; // R
|
||||
led15070_per_board_vars[board].gs_palette[idx][1] = req->payload[2]; // G
|
||||
@ -712,10 +740,12 @@ static HRESULT led15070_req_set_gs_palette(int board, const struct led15070_req_
|
||||
|
||||
static HRESULT led15070_req_dc_update(int board, const struct led15070_req_any *req)
|
||||
{
|
||||
// dprintf("LED 15070: DC update (board %u)\n", board);
|
||||
#if defined(LOG_LED15070)
|
||||
dprintf("LED 15070: DC update (board %u)\n", board);
|
||||
#endif
|
||||
|
||||
if (led_dc_update)
|
||||
led_dc_update((const uint8_t*)led15070_per_board_vars[board].dc);
|
||||
led_dc_update(board, (const uint8_t*)led15070_per_board_vars[board].dc);
|
||||
|
||||
if (!led15070_per_board_vars[board].enable_response)
|
||||
return S_OK;
|
||||
@ -737,10 +767,12 @@ static HRESULT led15070_req_dc_update(int board, const struct led15070_req_any *
|
||||
|
||||
static HRESULT led15070_req_gs_update(int board, const struct led15070_req_any *req)
|
||||
{
|
||||
// dprintf("LED 15070: GS update (board %u)\n", board);
|
||||
#if defined(LOG_LED15070)
|
||||
dprintf("LED 15070: GS update (board %u)\n", board);
|
||||
#endif
|
||||
|
||||
if (led_gs_update)
|
||||
led_gs_update((const uint8_t*)led15070_per_board_vars[board].gs);
|
||||
led_gs_update(board, (const uint8_t*)led15070_per_board_vars[board].gs);
|
||||
|
||||
if (!led15070_per_board_vars[board].enable_response)
|
||||
return S_OK;
|
||||
@ -762,7 +794,9 @@ static HRESULT led15070_req_gs_update(int board, const struct led15070_req_any *
|
||||
|
||||
static HRESULT led15070_req_rotate(int board, const struct led15070_req_any *req)
|
||||
{
|
||||
#if defined(LOG_LED15070)
|
||||
dprintf("LED 15070: Rotate (board %u)\n", board);
|
||||
#endif
|
||||
|
||||
if (!led15070_per_board_vars[board].enable_response)
|
||||
return S_OK;
|
||||
@ -787,9 +821,10 @@ static HRESULT led15070_req_set_dc_data(int board, const struct led15070_req_any
|
||||
uint8_t idx_start = req->payload[0];
|
||||
uint8_t idx_end = req->payload[1];
|
||||
uint8_t idx_skip = req->payload[2];
|
||||
|
||||
// dprintf("LED 15070: Set DC data (board %u, start %u, end %u, skip %u)\n",
|
||||
// board, idx_start, idx_end, idx_skip);
|
||||
#if defined(LOG_LED15070)
|
||||
dprintf("LED 15070: Set DC data (board %u, start %u, end %u, skip %u)\n",
|
||||
board, idx_start, idx_end, idx_skip);
|
||||
#endif
|
||||
|
||||
if (idx_skip > 0 && idx_skip <= (idx_end - idx_start + 1)) {
|
||||
idx_start += idx_skip;
|
||||
@ -829,9 +864,10 @@ static HRESULT led15070_req_eeprom_write(int board, const struct led15070_req_an
|
||||
|
||||
uint8_t addr = req->payload[0];
|
||||
uint8_t data = req->payload[1];
|
||||
|
||||
#if defined(LOG_LED15070)
|
||||
dprintf("LED 15070: EEPROM write (board %u, address %02x, data %02x)\n",
|
||||
board, addr, data);
|
||||
#endif
|
||||
|
||||
if (addr > 0x07) {
|
||||
dprintf("LED 15070: Error -- Invalid EEPROM write address %02x\n",
|
||||
@ -919,8 +955,9 @@ static HRESULT led15070_req_eeprom_read(int board, const struct led15070_req_any
|
||||
|
||||
uint8_t addr = req->payload[0];
|
||||
uint8_t data = 0;
|
||||
|
||||
#if defined(LOG_LED15070)
|
||||
dprintf("LED 15070: EEPROM read (board %u, address %02x)\n", board, addr);
|
||||
#endif
|
||||
|
||||
if (addr > 0x07) {
|
||||
dprintf("LED 15070: Error -- Invalid EEPROM read address %02x\n",
|
||||
@ -1002,7 +1039,9 @@ static HRESULT led15070_req_eeprom_read(int board, const struct led15070_req_any
|
||||
|
||||
static HRESULT led15070_req_ack_on(int board, const struct led15070_req_any *req)
|
||||
{
|
||||
#if defined(LOG_LED15070)
|
||||
dprintf("LED 15070: Acknowledge commands ON (board %u)\n", board);
|
||||
#endif
|
||||
|
||||
led15070_per_board_vars[board].enable_response = true;
|
||||
|
||||
@ -1023,7 +1062,9 @@ static HRESULT led15070_req_ack_on(int board, const struct led15070_req_any *req
|
||||
|
||||
static HRESULT led15070_req_ack_off(int board, const struct led15070_req_any *req)
|
||||
{
|
||||
#if defined(LOG_LED15070)
|
||||
dprintf("LED 15070: Acknowledge commands OFF (board %u)\n", board);
|
||||
#endif
|
||||
|
||||
led15070_per_board_vars[board].enable_response = false;
|
||||
|
||||
@ -1044,7 +1085,9 @@ static HRESULT led15070_req_ack_off(int board, const struct led15070_req_any *re
|
||||
|
||||
static HRESULT led15070_req_board_info(int board)
|
||||
{
|
||||
#if defined(LOG_LED15070)
|
||||
dprintf("LED 15070: Get board info (board %u)\n", board);
|
||||
#endif
|
||||
|
||||
struct led15070_resp_board_info resp;
|
||||
|
||||
@ -1067,7 +1110,9 @@ static HRESULT led15070_req_board_info(int board)
|
||||
|
||||
static HRESULT led15070_req_board_status(int board)
|
||||
{
|
||||
#if defined(LOG_LED15070)
|
||||
dprintf("LED 15070: Get board status (board %u)\n", board);
|
||||
#endif
|
||||
|
||||
struct led15070_resp_any resp;
|
||||
|
||||
@ -1091,7 +1136,9 @@ static HRESULT led15070_req_board_status(int board)
|
||||
|
||||
static HRESULT led15070_req_fw_sum(int board)
|
||||
{
|
||||
#if defined(LOG_LED15070)
|
||||
dprintf("LED 15070: Get firmware checksum (board %u)\n", board);
|
||||
#endif
|
||||
|
||||
struct led15070_resp_any resp;
|
||||
|
||||
@ -1113,7 +1160,9 @@ static HRESULT led15070_req_fw_sum(int board)
|
||||
|
||||
static HRESULT led15070_req_protocol_ver(int board)
|
||||
{
|
||||
#if defined(LOG_LED15070)
|
||||
dprintf("LED 15070: Get protocol version (board %u)\n", board);
|
||||
#endif
|
||||
|
||||
struct led15070_resp_any resp;
|
||||
|
||||
@ -1187,7 +1236,7 @@ static HRESULT led15070_eeprom_open(int board, wchar_t *path, HANDLE *handle)
|
||||
HRESULT hr;
|
||||
BOOL ok;
|
||||
|
||||
#if 0
|
||||
#if defined(LOG_LED15070)
|
||||
dprintf("LED 15070: Opening EEPROM file '%S' handle (board %u)\n", path, board);
|
||||
#endif
|
||||
|
||||
@ -1233,7 +1282,7 @@ static HRESULT led15070_eeprom_close(int board, wchar_t *path, HANDLE *handle)
|
||||
HRESULT hr;
|
||||
BOOL ok;
|
||||
|
||||
#if 0
|
||||
#if defined(LOG_LED15070)
|
||||
dprintf("LED 15070: Closing EEPROM file '%S' handle (board %u)\n", path, board);
|
||||
#endif
|
||||
|
@ -7,7 +7,7 @@
|
||||
|
||||
struct led15070_config {
|
||||
bool enable;
|
||||
unsigned int port_no;
|
||||
unsigned int port_no[2];
|
||||
char board_number[8];
|
||||
uint8_t fw_ver;
|
||||
uint16_t fw_sum;
|
||||
@ -15,9 +15,9 @@ struct led15070_config {
|
||||
};
|
||||
|
||||
typedef HRESULT (*io_led_init_t)(void);
|
||||
typedef void (*io_led_set_fet_output_t)(const uint8_t *rgb);
|
||||
typedef void (*io_led_dc_update_t)(const uint8_t *rgb);
|
||||
typedef void (*io_led_gs_update_t)(const uint8_t *rgb);
|
||||
typedef void (*io_led_set_fet_output_t)(uint8_t board, const uint8_t *rgb);
|
||||
typedef void (*io_led_dc_update_t)(uint8_t board, const uint8_t *rgb);
|
||||
typedef void (*io_led_gs_update_t)(uint8_t board, const uint8_t *rgb);
|
||||
|
||||
HRESULT led15070_hook_init(
|
||||
const struct led15070_config *cfg,
|
||||
@ -25,5 +25,4 @@ HRESULT led15070_hook_init(
|
||||
io_led_set_fet_output_t _led_set_fet_output,
|
||||
io_led_dc_update_t _led_dc_update,
|
||||
io_led_gs_update_t _led_gs_update,
|
||||
unsigned int first_port,
|
||||
unsigned int num_boards);
|
||||
unsigned int port_no[2]);
|
@ -107,9 +107,13 @@ static uint8_t led15093_host_adr = 1;
|
||||
static io_led_init_t led_init;
|
||||
static io_led_set_leds_t set_leds;
|
||||
|
||||
HRESULT led15093_hook_init(const struct led15093_config *cfg, io_led_init_t _led_init,
|
||||
io_led_set_leds_t _set_leds, unsigned int first_port, unsigned int num_boards, uint8_t board_adr, uint8_t host_adr)
|
||||
HRESULT led15093_hook_init(
|
||||
const struct led15093_config *cfg,
|
||||
io_led_init_t _led_init,
|
||||
io_led_set_leds_t _set_leds,
|
||||
unsigned int port_no[2])
|
||||
{
|
||||
unsigned int num_boards = 0;
|
||||
|
||||
assert(cfg != NULL);
|
||||
assert(_led_init != NULL);
|
||||
@ -119,14 +123,24 @@ HRESULT led15093_hook_init(const struct led15093_config *cfg, io_led_init_t _led
|
||||
return S_FALSE;
|
||||
}
|
||||
|
||||
if (cfg->port_no != 0) {
|
||||
first_port = cfg->port_no;
|
||||
for (int i = 0; i < led15093_nboards; i++)
|
||||
{
|
||||
if (cfg->port_no[i] != 0) {
|
||||
port_no[i] = cfg->port_no[i];
|
||||
}
|
||||
|
||||
if (port_no[i] != 0) {
|
||||
num_boards++;
|
||||
}
|
||||
}
|
||||
|
||||
assert(num_boards != 0);
|
||||
|
||||
led15093_board_adr = num_boards;
|
||||
led15093_host_adr = num_boards == 2 ? 1 : 2;
|
||||
|
||||
led_init = _led_init;
|
||||
set_leds = _set_leds;
|
||||
led15093_board_adr = board_adr;
|
||||
led15093_host_adr = host_adr;
|
||||
|
||||
memcpy(led15093_board_num, cfg->board_number, sizeof(led15093_board_num));
|
||||
memcpy(led15093_chip_num, cfg->chip_number, sizeof(led15093_chip_num));
|
||||
@ -140,7 +154,7 @@ HRESULT led15093_hook_init(const struct led15093_config *cfg, io_led_init_t _led
|
||||
|
||||
InitializeCriticalSection(&vb->lock);
|
||||
|
||||
uart_init(&vb->boarduart, first_port + i);
|
||||
uart_init(&vb->boarduart, port_no[i]);
|
||||
if (cfg->high_baudrate) {
|
||||
vb->boarduart.baud.BaudRate = 460800;
|
||||
} else {
|
||||
@ -209,7 +223,6 @@ static HRESULT led15093_handle_irp_locked(int board, struct irp *irp)
|
||||
_led15093_per_board_vars *v = &led15093_per_board_vars[board];
|
||||
struct uart *boarduart = &led15093_per_board_vars[board].boarduart;
|
||||
|
||||
/*
|
||||
if (irp->op == IRP_OP_OPEN) {
|
||||
// Unfortunately the LED board UART gets opened and closed repeatedly
|
||||
|
||||
@ -236,30 +249,6 @@ static HRESULT led15093_handle_irp_locked(int board, struct irp *irp)
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
if (irp->op == IRP_OP_OPEN) {
|
||||
dprintf("LED 15093: Starting backend DLL\n");
|
||||
// int res = led_init();
|
||||
hr = led_init();
|
||||
|
||||
/*
|
||||
if (res != 0) {
|
||||
dprintf("LED 15093: Backend error, LED board disconnected: "
|
||||
"%d\n",
|
||||
res);
|
||||
|
||||
return E_FAIL;
|
||||
}
|
||||
*/
|
||||
if (FAILED(hr)) {
|
||||
dprintf("LED 15093: Backend error, LED board disconnected: "
|
||||
"%x\n",
|
||||
(int) hr);
|
||||
|
||||
return hr;
|
||||
}
|
||||
}
|
||||
|
||||
hr = uart_handle_irp(boarduart, irp);
|
||||
|
||||
@ -688,16 +677,6 @@ static HRESULT led15093_req_set_imm_led(int board, const struct led15093_req_set
|
||||
return E_INVALIDARG;
|
||||
}
|
||||
|
||||
/*
|
||||
if (board == 0) {
|
||||
dprintf("board %d: red: %d, green: %d, blue: %d\n", board, req->data[0x96], req->data[0x97], req->data[0x98]);
|
||||
}
|
||||
else if (board == 1)
|
||||
{
|
||||
dprintf("board %d: red: %d, green: %d, blue: %d\n", board, req->data[0xb4], req->data[0xb5], req->data[0xb6]);
|
||||
}
|
||||
*/
|
||||
|
||||
// Return the current LED data, remove const qualifier
|
||||
set_leds(board, (uint8_t *) req->data);
|
||||
|
@ -8,7 +8,7 @@
|
||||
struct led15093_config {
|
||||
bool enable;
|
||||
bool high_baudrate;
|
||||
unsigned int port_no;
|
||||
unsigned int port_no[2];
|
||||
char board_number[8];
|
||||
char chip_number[5];
|
||||
char boot_chip_number[5];
|
||||
@ -20,5 +20,5 @@ typedef HRESULT (*io_led_init_t)(void);
|
||||
typedef void (*io_led_set_leds_t)(uint8_t board, uint8_t *rgb);
|
||||
|
||||
HRESULT led15093_hook_init(const struct led15093_config *cfg, io_led_init_t _led_init,
|
||||
io_led_set_leds_t _set_leds, unsigned int first_port, unsigned int num_boards, uint8_t board_adr, uint8_t host_adr);
|
||||
io_led_set_leds_t _set_leds, unsigned int port_no[2]);
|
||||
|
@ -5,21 +5,21 @@
|
||||
#pragma pack(push, 1)
|
||||
|
||||
enum {
|
||||
SG_NFC_CMD_GET_FW_VERSION = 0x30,
|
||||
SG_NFC_CMD_GET_HW_VERSION = 0x32,
|
||||
SG_NFC_CMD_RADIO_ON = 0x40,
|
||||
SG_NFC_CMD_RADIO_OFF = 0x41,
|
||||
SG_NFC_CMD_POLL = 0x42,
|
||||
SG_NFC_CMD_MIFARE_SELECT_TAG = 0x43,
|
||||
SG_NFC_CMD_MIFARE_SET_KEY_AIME = 0x50,
|
||||
SG_NFC_CMD_MIFARE_AUTHENTICATE_A = 0x51,
|
||||
SG_NFC_CMD_MIFARE_READ_BLOCK = 0x52,
|
||||
SG_NFC_CMD_MIFARE_SET_KEY_BANA = 0x54,
|
||||
SG_NFC_CMD_MIFARE_AUTHENTICATE_B = 0x55,
|
||||
SG_NFC_CMD_TO_UPDATE_MODE = 0x60,
|
||||
SG_NFC_CMD_SEND_HEX_DATA = 0x61,
|
||||
SG_NFC_CMD_RESET = 0x62,
|
||||
SG_NFC_CMD_FELICA_ENCAP = 0x71,
|
||||
SG_NFC_CMD_GET_FW_VERSION = 0x30,
|
||||
SG_NFC_CMD_GET_HW_VERSION = 0x32,
|
||||
SG_NFC_CMD_RADIO_ON = 0x40,
|
||||
SG_NFC_CMD_RADIO_OFF = 0x41,
|
||||
SG_NFC_CMD_POLL = 0x42,
|
||||
SG_NFC_CMD_MIFARE_SELECT_TAG = 0x43,
|
||||
SG_NFC_CMD_MIFARE_SET_KEY_AIME = 0x50,
|
||||
SG_NFC_CMD_MIFARE_AUTHENTICATE_AIME = 0x51,
|
||||
SG_NFC_CMD_MIFARE_READ_BLOCK = 0x52,
|
||||
SG_NFC_CMD_MIFARE_SET_KEY_BANA = 0x54,
|
||||
SG_NFC_CMD_MIFARE_AUTHENTICATE_BANA = 0x55,
|
||||
SG_NFC_CMD_TO_UPDATE_MODE = 0x60,
|
||||
SG_NFC_CMD_SEND_HEX_DATA = 0x61,
|
||||
SG_NFC_CMD_RESET = 0x62,
|
||||
SG_NFC_CMD_FELICA_ENCAP = 0x71,
|
||||
};
|
||||
|
||||
struct sg_nfc_res_get_fw_version {
|
@ -2,6 +2,7 @@
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdbool.h>
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
@ -16,6 +17,7 @@
|
||||
|
||||
#include "util/dprintf.h"
|
||||
#include "util/dump.h"
|
||||
#include "util/slurp.h"
|
||||
|
||||
static HRESULT sg_nfc_dispatch(
|
||||
void *ctx,
|
||||
@ -87,6 +89,8 @@ void sg_nfc_init(
|
||||
uint8_t addr,
|
||||
const struct sg_nfc_ops *ops,
|
||||
unsigned int gen,
|
||||
unsigned int proxy_flag,
|
||||
const wchar_t* authdata_path,
|
||||
void *ops_ctx)
|
||||
{
|
||||
assert(nfc != NULL);
|
||||
@ -96,6 +100,8 @@ void sg_nfc_init(
|
||||
nfc->ops_ctx = ops_ctx;
|
||||
nfc->addr = addr;
|
||||
nfc->gen = gen;
|
||||
nfc->proxy_flag = proxy_flag;
|
||||
nfc->authdata_path = authdata_path;
|
||||
}
|
||||
|
||||
#ifdef NDEBUG
|
||||
@ -189,8 +195,8 @@ static HRESULT sg_nfc_dispatch(
|
||||
&req->felica_encap,
|
||||
&res->felica_encap);
|
||||
|
||||
case SG_NFC_CMD_MIFARE_AUTHENTICATE_A:
|
||||
case SG_NFC_CMD_MIFARE_AUTHENTICATE_B:
|
||||
case SG_NFC_CMD_MIFARE_AUTHENTICATE_AIME:
|
||||
case SG_NFC_CMD_MIFARE_AUTHENTICATE_BANA:
|
||||
case SG_NFC_CMD_SEND_HEX_DATA:
|
||||
return sg_nfc_cmd_send_hex_data(nfc, &req->simple, &res->simple);
|
||||
|
||||
@ -315,6 +321,7 @@ static HRESULT sg_nfc_poll_aime(
|
||||
|
||||
mifare->type = 0x10;
|
||||
mifare->id_len = sizeof(mifare->uid);
|
||||
// mifare->uid = _byteswap_ulong(0x8FBECBFF);
|
||||
mifare->uid = _byteswap_ulong(0x01020304);
|
||||
|
||||
/* Initialize MIFARE IC emulator */
|
||||
@ -382,18 +389,62 @@ static HRESULT sg_nfc_cmd_mifare_read_block(
|
||||
|
||||
sg_nfc_dprintf(nfc, "Read uid %08x block %i\n", uid, req->payload.block_no);
|
||||
|
||||
if (req->payload.block_no > 3) {
|
||||
if (req->payload.block_no > 14) {
|
||||
sg_nfc_dprintf(nfc, "MIFARE block number out of range\n");
|
||||
|
||||
return E_FAIL;
|
||||
} else if (req->payload.block_no >= 5){ // emoney auth encrypted
|
||||
|
||||
sg_res_init(&res->res, &req->req, sizeof(res->block));
|
||||
|
||||
char* auth;
|
||||
long size = wslurp(nfc->authdata_path, &auth, false);
|
||||
if (size < 0){
|
||||
sg_nfc_dprintf(nfc, "Failed to read %ls: %lx!\n", nfc->authdata_path, GetLastError());
|
||||
return E_FAIL;
|
||||
}
|
||||
|
||||
int offset = 0;
|
||||
if (req->payload.block_no == 6){
|
||||
offset = 16;
|
||||
} else if (req->payload.block_no == 8){
|
||||
offset = 32;
|
||||
} else if (req->payload.block_no == 9){
|
||||
offset = 48;
|
||||
} else if (req->payload.block_no == 10){
|
||||
offset = 64;
|
||||
} else if (req->payload.block_no == 12){
|
||||
offset = 82;
|
||||
} else if (req->payload.block_no == 13){
|
||||
offset = 98;
|
||||
} else if (req->payload.block_no == 14){
|
||||
offset = 114;
|
||||
}
|
||||
|
||||
for (int i = 0; i < 16 && offset + i < size; i++){
|
||||
res->block[i] = auth[offset + i];
|
||||
}
|
||||
|
||||
free(auth);
|
||||
|
||||
} else if (req->payload.block_no == 4){ // emoney auth plain
|
||||
|
||||
sg_res_init(&res->res, &req->req, sizeof(res->block));
|
||||
|
||||
res->block[0] = 0x54; // header
|
||||
res->block[1] = 0x43;
|
||||
res->block[2] = nfc->proxy_flag; // 2 or 3 depending on game (useProxy in env.json)
|
||||
res->block[3] = 0x01; // unknown flag
|
||||
|
||||
} else { // read all other blocks normally
|
||||
|
||||
sg_res_init(&res->res, &req->req, sizeof(res->block));
|
||||
|
||||
memcpy( res->block,
|
||||
nfc->mifare.sectors[0].blocks[req->payload.block_no].bytes,
|
||||
sizeof(res->block));
|
||||
}
|
||||
|
||||
sg_res_init(&res->res, &req->req, sizeof(res->block));
|
||||
|
||||
memcpy( res->block,
|
||||
nfc->mifare.sectors[0].blocks[req->payload.block_no].bytes,
|
||||
sizeof(res->block));
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
@ -23,8 +23,10 @@ struct sg_nfc {
|
||||
void *ops_ctx;
|
||||
uint8_t addr;
|
||||
unsigned int gen;
|
||||
unsigned int proxy_flag;
|
||||
struct felica felica;
|
||||
struct mifare mifare;
|
||||
const wchar_t* authdata_path;
|
||||
};
|
||||
|
||||
void sg_nfc_init(
|
||||
@ -32,6 +34,8 @@ void sg_nfc_init(
|
||||
uint8_t addr,
|
||||
const struct sg_nfc_ops *ops,
|
||||
unsigned int gen,
|
||||
unsigned int proxy_flag,
|
||||
const wchar_t* authdata_path,
|
||||
void *ops_ctx);
|
||||
|
||||
void sg_nfc_transact(
|
@ -81,7 +81,7 @@ HRESULT sg_reader_hook_init(
|
||||
return E_INVALIDARG;
|
||||
}
|
||||
|
||||
sg_nfc_init(&sg_reader_nfc, 0x00, &sg_reader_nfc_ops, gen, NULL);
|
||||
sg_nfc_init(&sg_reader_nfc, 0x00, &sg_reader_nfc_ops, gen, cfg->proxy_flag, cfg->authdata_path, NULL);
|
||||
sg_led_init(&sg_reader_led, 0x08, &sg_reader_led_ops, gen, NULL);
|
||||
|
||||
InitializeCriticalSection(&sg_reader_lock);
|
@ -12,6 +12,8 @@ struct aime_config {
|
||||
unsigned int port_no;
|
||||
bool high_baudrate;
|
||||
unsigned int gen;
|
||||
unsigned int proxy_flag;
|
||||
wchar_t authdata_path[MAX_PATH];
|
||||
};
|
||||
|
||||
HRESULT sg_reader_hook_init(
|
@ -14,4 +14,5 @@ void gfx_config_load(struct gfx_config *cfg, const wchar_t *filename)
|
||||
cfg->windowed = GetPrivateProfileIntW(L"gfx", L"windowed", 0, filename);
|
||||
cfg->framed = GetPrivateProfileIntW(L"gfx", L"framed", 1, filename);
|
||||
cfg->monitor = GetPrivateProfileIntW(L"gfx", L"monitor", 0, filename);
|
||||
cfg->dpiAware = GetPrivateProfileIntW(L"gfx", L"dpiAware", 1, filename);
|
||||
}
|
@ -67,6 +67,14 @@ void gfx_hook_init(const struct gfx_config *cfg)
|
||||
return;
|
||||
}
|
||||
|
||||
if (cfg->dpiAware) {
|
||||
if (SetProcessDPIAware()) {
|
||||
dprintf("Gfx: Game process set to DPI aware.\n");
|
||||
} else {
|
||||
dprintf("Gfx: Failed to set process DPI aware\n");
|
||||
}
|
||||
}
|
||||
|
||||
memcpy(&gfx_config, cfg, sizeof(*cfg));
|
||||
hook_table_apply(NULL, "user32.dll", gfx_hooks, _countof(gfx_hooks));
|
||||
}
|
@ -7,6 +7,7 @@ struct gfx_config {
|
||||
bool windowed;
|
||||
bool framed;
|
||||
int monitor;
|
||||
bool dpiAware;
|
||||
};
|
||||
|
||||
void gfx_hook_init(const struct gfx_config *cfg);
|
246
common/hooklib/config.c
Normal file
246
common/hooklib/config.c
Normal file
@ -0,0 +1,246 @@
|
||||
#include <windows.h>
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdlib.h>
|
||||
#include <stddef.h>
|
||||
|
||||
#include "hooklib/config.h"
|
||||
#include "hooklib/dvd.h"
|
||||
#include "hooklib/y3.h"
|
||||
#include "hooklib/y3-dll.h"
|
||||
|
||||
void dvd_config_load(struct dvd_config *cfg, const wchar_t *filename)
|
||||
{
|
||||
assert(cfg != NULL);
|
||||
assert(filename != NULL);
|
||||
|
||||
cfg->enable = GetPrivateProfileIntW(L"dvd", L"enable", 1, filename);
|
||||
}
|
||||
|
||||
void touch_screen_config_load(struct touch_screen_config *cfg, const wchar_t *filename)
|
||||
{
|
||||
assert(cfg != NULL);
|
||||
assert(filename != NULL);
|
||||
|
||||
cfg->enable = GetPrivateProfileIntW(L"touch", L"enable", 1, filename);
|
||||
cfg->remap = GetPrivateProfileIntW(L"touch", L"remap", 1, filename);
|
||||
cfg->cursor = GetPrivateProfileIntW(L"touch", L"cursor", 1, filename);
|
||||
}
|
||||
|
||||
void printer_chc_config_load(struct printer_chc_config *cfg, const wchar_t *filename)
|
||||
{
|
||||
assert(cfg != NULL);
|
||||
assert(filename != NULL);
|
||||
|
||||
wchar_t tmpstr[16];
|
||||
|
||||
cfg->enable = GetPrivateProfileIntW(L"printer", L"enable", 0, filename);
|
||||
cfg->rotate_180 = GetPrivateProfileIntW(L"printer", L"rotate180", 0, filename);
|
||||
|
||||
GetPrivateProfileStringW(
|
||||
L"printer",
|
||||
L"serial_no",
|
||||
L"5A-A123",
|
||||
tmpstr,
|
||||
_countof(tmpstr),
|
||||
filename);
|
||||
|
||||
size_t n = wcstombs(cfg->serial_no, tmpstr, sizeof(cfg->serial_no));
|
||||
for (int i = n; i < sizeof(cfg->serial_no); i++)
|
||||
{
|
||||
cfg->serial_no[i] = '\0';
|
||||
}
|
||||
|
||||
GetPrivateProfileStringW(
|
||||
L"printer",
|
||||
L"mainFwPath",
|
||||
L"DEVICE\\printer_main_fw.bin",
|
||||
cfg->main_fw_path,
|
||||
_countof(cfg->main_fw_path),
|
||||
filename);
|
||||
|
||||
GetPrivateProfileStringW(
|
||||
L"printer",
|
||||
L"dspFwPath",
|
||||
L"DEVICE\\printer_dsp_fw.bin",
|
||||
cfg->dsp_fw_path,
|
||||
_countof(cfg->dsp_fw_path),
|
||||
filename);
|
||||
|
||||
GetPrivateProfileStringW(
|
||||
L"printer",
|
||||
L"paramFwPath",
|
||||
L"DEVICE\\printer_param_fw.bin",
|
||||
cfg->param_fw_path,
|
||||
_countof(cfg->param_fw_path),
|
||||
filename);
|
||||
|
||||
GetPrivateProfileStringW(
|
||||
L"printer",
|
||||
L"printerOutPath",
|
||||
L"DEVICE\\print",
|
||||
cfg->printer_out_path,
|
||||
_countof(cfg->printer_out_path),
|
||||
filename);
|
||||
|
||||
cfg->wait_time = GetPrivateProfileIntW(L"printer", L"waitTime", 0, filename);
|
||||
}
|
||||
|
||||
void printer_cx_config_load(struct printer_cx_config *cfg, const wchar_t *filename){
|
||||
assert(cfg != NULL);
|
||||
assert(filename != NULL);
|
||||
|
||||
char filenameA[MAX_PATH];
|
||||
|
||||
size_t n = wcstombs(filenameA, filename, MAX_PATH);
|
||||
for (int i = n; i < MAX_PATH; i++)
|
||||
{
|
||||
filenameA[i] = '\0';
|
||||
}
|
||||
|
||||
cfg->enable = GetPrivateProfileIntW(L"printer", L"enable", 1, filename);
|
||||
|
||||
GetPrivateProfileStringA(
|
||||
"printer",
|
||||
"firmwareVersion",
|
||||
"V04-03B",
|
||||
cfg->printer_firm_version,
|
||||
_countof(cfg->printer_firm_version),
|
||||
filenameA);
|
||||
|
||||
GetPrivateProfileStringA(
|
||||
"printer",
|
||||
"configVersion",
|
||||
"V01-75",
|
||||
cfg->printer_config_version,
|
||||
_countof(cfg->printer_config_version),
|
||||
filenameA);
|
||||
|
||||
GetPrivateProfileStringA(
|
||||
"printer",
|
||||
"tableVersion",
|
||||
"V01-E0",
|
||||
cfg->printer_table_version,
|
||||
_countof(cfg->printer_table_version),
|
||||
filenameA);
|
||||
|
||||
GetPrivateProfileStringA(
|
||||
"printer",
|
||||
"cameraVersion",
|
||||
"00.19",
|
||||
cfg->printer_camera_version,
|
||||
_countof(cfg->printer_camera_version),
|
||||
filenameA);
|
||||
|
||||
GetPrivateProfileStringW(
|
||||
L"printer",
|
||||
L"printerOutPath",
|
||||
L"DEVICE\\print",
|
||||
cfg->printer_out_path,
|
||||
_countof(cfg->printer_out_path),
|
||||
filename);
|
||||
|
||||
GetPrivateProfileStringW(
|
||||
L"printer",
|
||||
L"printerDataPath",
|
||||
L"DEVICE\\cx7000_data.bin",
|
||||
cfg->printer_data_path,
|
||||
_countof(cfg->printer_data_path),
|
||||
filename);
|
||||
|
||||
}
|
||||
|
||||
void y3_dll_config_load(
|
||||
struct y3_dll_config *cfg,
|
||||
const wchar_t *filename)
|
||||
{
|
||||
assert(cfg != NULL);
|
||||
assert(filename != NULL);
|
||||
|
||||
GetPrivateProfileStringW(
|
||||
L"y3io",
|
||||
L"path",
|
||||
L"",
|
||||
cfg->path,
|
||||
_countof(cfg->path),
|
||||
filename);
|
||||
}
|
||||
|
||||
void y3_config_load(
|
||||
struct y3_config *cfg,
|
||||
const wchar_t *filename)
|
||||
{
|
||||
assert(cfg != NULL);
|
||||
assert(filename != NULL);
|
||||
|
||||
wchar_t tmpstr[5];
|
||||
|
||||
memset(cfg->firm_name_field, ' ', sizeof(cfg->firm_name_field) - 1);
|
||||
cfg->firm_name_field[sizeof(cfg->firm_name_field) - 1] = '\0';
|
||||
|
||||
memset(cfg->firm_name_printer, ' ', sizeof(cfg->firm_name_printer) - 1);
|
||||
cfg->firm_name_printer[sizeof(cfg->firm_name_printer) - 1] = '\0';
|
||||
|
||||
memset(cfg->target_code_field, ' ', sizeof(cfg->target_code_field) - 1);
|
||||
cfg->target_code_field[sizeof(cfg->target_code_field) - 1] = '\0';
|
||||
|
||||
memset(cfg->target_code_printer, ' ', sizeof(cfg->target_code_printer) - 1);
|
||||
cfg->target_code_printer[sizeof(cfg->target_code_printer) - 1] = '\0';
|
||||
|
||||
cfg->enable = GetPrivateProfileIntW(L"flatPanelReader", L"enable", 1, filename);
|
||||
cfg->port_field = GetPrivateProfileIntW(L"flatPanelReader", L"port_field", 10, filename);
|
||||
cfg->port_printer = GetPrivateProfileIntW(L"flatPanelReader", L"port_printer", 11, filename);
|
||||
|
||||
cfg->dll_version = (float)GetPrivateProfileIntW(
|
||||
L"flatPanelReader",
|
||||
L"dllVersion",
|
||||
1,
|
||||
filename);
|
||||
|
||||
cfg->firm_version = (float)GetPrivateProfileIntW(
|
||||
L"flatPanelReader",
|
||||
L"firmVersion",
|
||||
1,
|
||||
filename);
|
||||
|
||||
GetPrivateProfileStringW(
|
||||
L"flatPanelReader",
|
||||
L"firmNameField",
|
||||
L"SFPR",
|
||||
tmpstr,
|
||||
_countof(tmpstr),
|
||||
filename);
|
||||
|
||||
wcstombs(cfg->firm_name_field, tmpstr, sizeof(cfg->firm_name_field) - 1);
|
||||
|
||||
GetPrivateProfileStringW(
|
||||
L"flatPanelReader",
|
||||
L"firmNamePrinter",
|
||||
L"SPRT",
|
||||
tmpstr,
|
||||
_countof(tmpstr),
|
||||
filename);
|
||||
|
||||
wcstombs(cfg->firm_name_printer, tmpstr, sizeof(cfg->firm_name_printer) - 1);
|
||||
|
||||
GetPrivateProfileStringW(
|
||||
L"flatPanelReader",
|
||||
L"targetCodeField",
|
||||
L"SFR0",
|
||||
tmpstr,
|
||||
_countof(tmpstr),
|
||||
filename);
|
||||
|
||||
wcstombs(cfg->target_code_field, tmpstr, sizeof(cfg->target_code_field) - 1);
|
||||
|
||||
GetPrivateProfileStringW(
|
||||
L"flatPanelReader",
|
||||
L"targetCodePrinter",
|
||||
L"SPT0",
|
||||
tmpstr,
|
||||
_countof(tmpstr),
|
||||
filename);
|
||||
|
||||
wcstombs(cfg->target_code_printer, tmpstr, sizeof(cfg->target_code_printer) - 1);
|
||||
}
|
32
common/hooklib/config.h
Normal file
32
common/hooklib/config.h
Normal file
@ -0,0 +1,32 @@
|
||||
#pragma once
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
#include "hooklib/dvd.h"
|
||||
#include "hooklib/touch.h"
|
||||
#include "hooklib/printer_chc.h"
|
||||
#include "hooklib/printer_cx.h"
|
||||
|
||||
struct y3_config {
|
||||
bool enable;
|
||||
|
||||
float dll_version;
|
||||
float firm_version;
|
||||
char firm_name_field[5];
|
||||
char firm_name_printer[5];
|
||||
char target_code_field[5];
|
||||
char target_code_printer[5];
|
||||
uint8_t port_field;
|
||||
uint8_t port_printer;
|
||||
};
|
||||
|
||||
struct y3_dll_config {
|
||||
wchar_t path[MAX_PATH];
|
||||
};
|
||||
|
||||
void dvd_config_load(struct dvd_config *cfg, const wchar_t *filename);
|
||||
void touch_screen_config_load(struct touch_screen_config *cfg, const wchar_t *filename);
|
||||
void printer_chc_config_load(struct printer_chc_config *cfg, const wchar_t *filename);
|
||||
void printer_cx_config_load(struct printer_cx_config *cfg, const wchar_t *filename);
|
||||
void y3_config_load(struct y3_config *cfg, const wchar_t *filename);
|
||||
void y3_dll_config_load(struct y3_dll_config *cfg, const wchar_t *filename);
|
@ -14,6 +14,7 @@ static HCURSOR (*next_SetCursor)(HCURSOR hCursor);
|
||||
static BOOL my_SetCursorPos(int x, int y);
|
||||
static BOOL my_SetPhysicalCursorPos(int x, int y);
|
||||
static int my_ShowCursor(BOOL bShow);
|
||||
static int cursor_track = -1; // If no mouse is connected, this starts as -1
|
||||
|
||||
static const struct hook_symbol cursor_syms[] = {
|
||||
{
|
||||
@ -45,7 +46,7 @@ void cursor_hook_init()
|
||||
|
||||
static BOOL my_SetCursorPos(int x, int y)
|
||||
{
|
||||
dprintf("my_SetCursorPos Hit! x %d y %d\n", x, y);
|
||||
// dprintf("my_SetCursorPos Hit! x %d y %d\n", x, y);
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -58,7 +59,12 @@ static BOOL my_SetPhysicalCursorPos(int x, int y)
|
||||
static int my_ShowCursor(BOOL bShow)
|
||||
{
|
||||
dprintf("my_ShowCursor Hit!\n");
|
||||
return 0;
|
||||
if (bShow) {
|
||||
cursor_track++;
|
||||
} else {
|
||||
cursor_track--;
|
||||
}
|
||||
return cursor_track;
|
||||
}
|
||||
|
||||
static HCURSOR my_SetCursor(HCURSOR hCursor)
|
@ -217,20 +217,24 @@ static void dns_hook_init(void)
|
||||
dns_hook_initted = true;
|
||||
InitializeCriticalSection(&dns_hook_lock);
|
||||
|
||||
dns_hook_apply_hooks(NULL);
|
||||
}
|
||||
|
||||
void dns_hook_apply_hooks(HMODULE mod){
|
||||
hook_table_apply(
|
||||
NULL,
|
||||
mod,
|
||||
"dnsapi.dll",
|
||||
dns_hook_syms_dnsapi,
|
||||
_countof(dns_hook_syms_dnsapi));
|
||||
|
||||
hook_table_apply(
|
||||
NULL,
|
||||
mod,
|
||||
"ws2_32.dll",
|
||||
dns_hook_syms_ws2,
|
||||
_countof(dns_hook_syms_ws2));
|
||||
|
||||
hook_table_apply(
|
||||
NULL,
|
||||
mod,
|
||||
"winhttp.dll",
|
||||
dns_hook_syms_winhttp,
|
||||
_countof(dns_hook_syms_winhttp));
|
@ -8,3 +8,4 @@ void port_hook_init(unsigned short _startup_port, unsigned short _billing_port,
|
||||
// if to_src is NULL, all lookups for from_src will fail
|
||||
HRESULT dns_hook_push(const wchar_t *from_src, const wchar_t *to_src);
|
||||
|
||||
void dns_hook_apply_hooks(HMODULE mod);
|
212
common/hooklib/imageutil.c
Normal file
212
common/hooklib/imageutil.c
Normal file
@ -0,0 +1,212 @@
|
||||
#include <windows.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "imageutil.h"
|
||||
|
||||
// copy pasted from https://dev.s-ul.net/domeori/c310emu
|
||||
#define BITMAPHEADERSIZE 0x36
|
||||
|
||||
int ConvertDataToBitmap(
|
||||
DWORD dwBitCount,
|
||||
DWORD dwWidth, DWORD dwHeight,
|
||||
PBYTE pbInput, DWORD cbInput,
|
||||
PBYTE pbOutput, DWORD cbOutput,
|
||||
PDWORD pcbResult,
|
||||
bool pFlip) {
|
||||
if (!pbInput || !pbOutput || dwBitCount < 8) return -3;
|
||||
|
||||
if (cbInput < (dwWidth * dwHeight * dwBitCount / 8)) return -3;
|
||||
|
||||
PBYTE pBuffer = malloc(cbInput);
|
||||
if (!pBuffer) return -2;
|
||||
|
||||
BYTE dwColors = (BYTE)(dwBitCount / 8);
|
||||
if (!dwColors) {
|
||||
free(pBuffer);
|
||||
return -1;
|
||||
}
|
||||
|
||||
UINT16 cbColors;
|
||||
RGBQUAD pbColors[256];
|
||||
|
||||
switch (dwBitCount) {
|
||||
case 1:
|
||||
cbColors = 1;
|
||||
break;
|
||||
case 2:
|
||||
cbColors = 4;
|
||||
break;
|
||||
case 4:
|
||||
cbColors = 16;
|
||||
break;
|
||||
case 8:
|
||||
cbColors = 256;
|
||||
break;
|
||||
default:
|
||||
cbColors = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
if (cbColors) {
|
||||
BYTE dwStep = (BYTE)(256 / cbColors);
|
||||
|
||||
for (UINT16 i = 0; i < cbColors; ++i) {
|
||||
pbColors[i].rgbRed = dwStep * i;
|
||||
pbColors[i].rgbGreen = dwStep * i;
|
||||
pbColors[i].rgbBlue = dwStep * i;
|
||||
pbColors[i].rgbReserved = 0;
|
||||
}
|
||||
}
|
||||
|
||||
DWORD dwTable = cbColors * sizeof(RGBQUAD);
|
||||
DWORD dwOffset = BITMAPHEADERSIZE + dwTable;
|
||||
|
||||
// calculate the padded row size, again
|
||||
DWORD dwLineSize = (dwWidth * dwBitCount / 8 + 3) & ~3;
|
||||
|
||||
BITMAPFILEHEADER bFile = {0};
|
||||
BITMAPINFOHEADER bInfo = {0};
|
||||
|
||||
bFile.bfType = 0x4D42; // MAGIC
|
||||
bFile.bfSize = dwOffset + cbInput;
|
||||
bFile.bfOffBits = dwOffset;
|
||||
|
||||
bInfo.biSize = sizeof(BITMAPINFOHEADER);
|
||||
bInfo.biWidth = dwWidth;
|
||||
bInfo.biHeight = dwHeight;
|
||||
bInfo.biPlanes = 1;
|
||||
bInfo.biBitCount = (WORD)dwBitCount;
|
||||
bInfo.biCompression = BI_RGB;
|
||||
bInfo.biSizeImage = cbInput;
|
||||
|
||||
if (cbOutput < bFile.bfSize) {
|
||||
free(pBuffer);
|
||||
return -1;
|
||||
}
|
||||
|
||||
// Flip the image (if necessary) and add padding to each row
|
||||
if (pFlip) {
|
||||
for (size_t i = 0; i < dwHeight; i++) {
|
||||
for (size_t j = 0; j < dwWidth; j++) {
|
||||
for (size_t k = 0; k < dwColors; k++) {
|
||||
// Calculate the position in the padded buffer
|
||||
// Make sure to also flip the colors from RGB to BRG
|
||||
size_t x = (dwHeight - i - 1) * dwLineSize + (dwWidth - j - 1) * dwColors + (dwColors - k - 1);
|
||||
size_t y = (dwHeight - i - 1) * dwWidth * dwColors + j * dwColors + k;
|
||||
*(pBuffer + x) = *(pbInput + y);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (size_t i = 0; i < dwHeight; i++) {
|
||||
for (size_t j = 0; j < dwWidth; j++) {
|
||||
for (size_t k = 0; k < dwColors; k++) {
|
||||
// Calculate the position in the padded buffer
|
||||
size_t x = i * dwLineSize + j * dwColors + (dwColors - k - 1);
|
||||
size_t y = (dwHeight - i - 1) * dwWidth * dwColors + j * dwColors + k;
|
||||
*(pBuffer + x) = *(pbInput + y);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
memcpy(pbOutput, &bFile, sizeof(BITMAPFILEHEADER));
|
||||
memcpy(pbOutput + sizeof(BITMAPFILEHEADER), &bInfo, sizeof(BITMAPINFOHEADER));
|
||||
if (cbColors) memcpy(pbOutput + BITMAPHEADERSIZE, pbColors, dwTable);
|
||||
memcpy(pbOutput + dwOffset, pBuffer, cbInput);
|
||||
|
||||
*pcbResult = bFile.bfSize;
|
||||
|
||||
free(pBuffer);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int WriteDataToBitmapFile(
|
||||
LPCWSTR lpFilePath, DWORD dwBitCount,
|
||||
DWORD dwWidth, DWORD dwHeight,
|
||||
PBYTE pbInput, DWORD cbInput,
|
||||
PBYTE pbMetadata, DWORD cbMetadata,
|
||||
bool pFlip) {
|
||||
if (!lpFilePath || !pbInput) return -3;
|
||||
|
||||
HANDLE hFile;
|
||||
DWORD dwBytesWritten;
|
||||
|
||||
hFile = CreateFileW(
|
||||
lpFilePath,
|
||||
GENERIC_WRITE,
|
||||
FILE_SHARE_READ,
|
||||
NULL,
|
||||
CREATE_ALWAYS,
|
||||
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH,
|
||||
NULL);
|
||||
if (hFile == INVALID_HANDLE_VALUE) return -1;
|
||||
|
||||
// calculate the padded row size and padded image size
|
||||
DWORD dwLineSize = (dwWidth * dwBitCount / 8 + 3) & ~3;
|
||||
DWORD dwImageSize = dwLineSize * dwHeight;
|
||||
|
||||
DWORD cbResult;
|
||||
DWORD cbBuffer = dwImageSize + 0x500;
|
||||
PBYTE pbBuffer = calloc(cbBuffer, 1);
|
||||
if (!pbBuffer) return -2;
|
||||
|
||||
if (ConvertDataToBitmap(dwBitCount, dwWidth, dwHeight, pbInput, dwImageSize, pbBuffer, cbBuffer, &cbResult, pFlip) < 0) {
|
||||
cbResult = -1;
|
||||
goto WriteDataToBitmapFile_End;
|
||||
}
|
||||
|
||||
WriteFile(hFile, pbBuffer, cbResult, &dwBytesWritten, NULL);
|
||||
|
||||
if (pbMetadata)
|
||||
WriteFile(hFile, pbMetadata, cbMetadata, &dwBytesWritten, NULL);
|
||||
|
||||
CloseHandle(hFile);
|
||||
|
||||
cbResult = dwBytesWritten;
|
||||
|
||||
WriteDataToBitmapFile_End:
|
||||
free(pbBuffer);
|
||||
return cbResult;
|
||||
}
|
||||
|
||||
int WriteArrayToFile(LPCSTR lpOutputFilePath, LPVOID lpDataTemp, DWORD nDataSize, BOOL isAppend) {
|
||||
#ifdef NDEBUG
|
||||
|
||||
return nDataSize;
|
||||
|
||||
#else
|
||||
|
||||
HANDLE hFile;
|
||||
DWORD dwBytesWritten;
|
||||
DWORD dwDesiredAccess;
|
||||
DWORD dwCreationDisposition;
|
||||
|
||||
if (isAppend) {
|
||||
dwDesiredAccess = FILE_APPEND_DATA;
|
||||
dwCreationDisposition = OPEN_ALWAYS;
|
||||
} else {
|
||||
dwDesiredAccess = GENERIC_WRITE;
|
||||
dwCreationDisposition = CREATE_ALWAYS;
|
||||
}
|
||||
|
||||
hFile = CreateFileA(
|
||||
lpOutputFilePath,
|
||||
dwDesiredAccess,
|
||||
FILE_SHARE_READ,
|
||||
NULL,
|
||||
dwCreationDisposition,
|
||||
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH,
|
||||
NULL);
|
||||
if (hFile == INVALID_HANDLE_VALUE) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
WriteFile(hFile, lpDataTemp, nDataSize, &dwBytesWritten, NULL);
|
||||
CloseHandle(hFile);
|
||||
|
||||
return dwBytesWritten;
|
||||
|
||||
#endif
|
||||
}
|
21
common/hooklib/imageutil.h
Normal file
21
common/hooklib/imageutil.h
Normal file
@ -0,0 +1,21 @@
|
||||
#pragma once
|
||||
|
||||
#include <windows.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
int ConvertDataToBitmap(
|
||||
DWORD dwBitCount,
|
||||
DWORD dwWidth, DWORD dwHeight,
|
||||
PBYTE pbInput, DWORD cbInput,
|
||||
PBYTE pbOutput, DWORD cbOutput,
|
||||
PDWORD pcbResult,
|
||||
bool pFlip);
|
||||
|
||||
int WriteDataToBitmapFile(
|
||||
LPCWSTR lpFilePath, DWORD dwBitCount,
|
||||
DWORD dwWidth, DWORD dwHeight,
|
||||
PBYTE pbInput, DWORD cbInput,
|
||||
PBYTE pbMetadata, DWORD cbMetadata,
|
||||
bool pFlip);
|
||||
|
||||
int WriteArrayToFile(LPCSTR lpOutputFilePath, LPVOID lpDataTemp, DWORD nDataSize, BOOL isAppend);
|
@ -4,6 +4,7 @@ hooklib_lib = static_library(
|
||||
implicit_include_directories : false,
|
||||
dependencies : [
|
||||
capnhook.get_variable('hook_dep'),
|
||||
ws2_32_lib
|
||||
],
|
||||
sources : [
|
||||
'cursor.c',
|
||||
@ -20,6 +21,8 @@ hooklib_lib = static_library(
|
||||
'dvd.h',
|
||||
'fdshark.c',
|
||||
'fdshark.h',
|
||||
'imageutil.c',
|
||||
'imageutil.h',
|
||||
'path.c',
|
||||
'path.h',
|
||||
'reg.c',
|
||||
@ -30,7 +33,13 @@ hooklib_lib = static_library(
|
||||
'spike.h',
|
||||
'touch.c',
|
||||
'touch.h',
|
||||
'printer.c',
|
||||
'printer.h',
|
||||
'printer_chc.c',
|
||||
'printer_chc.h',
|
||||
'printer_cx.c',
|
||||
'printer_cx.h',
|
||||
'y3.c',
|
||||
'y3.h',
|
||||
'y3-dll.c',
|
||||
'y3-dll.h',
|
||||
],
|
||||
)
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user