forked from TeamTofuShop/segatools
Compare commits
33 Commits
develop
...
2025-08-06
Author | SHA1 | Date | |
---|---|---|---|
43486709a1
|
|||
55a3859891
|
|||
74e3cb2f84
|
|||
3f2cfb6a26
|
|||
80f34fe6f0
|
|||
e74e2a0d47
|
|||
122034f922
|
|||
16dc43cfd8
|
|||
bb0b023ec0
|
|||
d83e7d3c3a
|
|||
ec00a83d6b
|
|||
bb01e131e9
|
|||
ded1375e88 | |||
0006731536
|
|||
ae168cdaf9
|
|||
e974a76fe6
|
|||
e2e4b37e3f | |||
f595af9686
|
|||
03513e7b0c
|
|||
cdb6815c5a
|
|||
d62b64ca5a
|
|||
4644e36ccc
|
|||
dbfc62b5d4
|
|||
24e8bc87a3 | |||
a65b43fe1a | |||
66a53dd2de
|
|||
ae3dd666f4
|
|||
a6126bf290
|
|||
015097972a
|
|||
67eda7458b | |||
b37e1105d0 | |||
9a6c4939c2 | |||
39711a994a |
2
Makefile
2
Makefile
@ -5,6 +5,8 @@ V ?= @
|
|||||||
BUILD_DIR := build
|
BUILD_DIR := build
|
||||||
BUILD_DIR_32 := $(BUILD_DIR)/build32
|
BUILD_DIR_32 := $(BUILD_DIR)/build32
|
||||||
BUILD_DIR_64 := $(BUILD_DIR)/build64
|
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
|
BUILD_DIR_ZIP := $(BUILD_DIR)/zip
|
||||||
|
|
||||||
DOC_DIR := doc
|
DOC_DIR := doc
|
||||||
|
51
Package.mk
51
Package.mk
@ -3,7 +3,7 @@ $(BUILD_DIR_ZIP)/chuni.zip:
|
|||||||
$(V)mkdir -p $(BUILD_DIR_ZIP)/chuni
|
$(V)mkdir -p $(BUILD_DIR_ZIP)/chuni
|
||||||
$(V)mkdir -p $(BUILD_DIR_ZIP)/chuni/DEVICE
|
$(V)mkdir -p $(BUILD_DIR_ZIP)/chuni/DEVICE
|
||||||
$(V)cp $(BUILD_DIR_32)/subprojects/capnhook/inject/inject.exe \
|
$(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/segatools.ini \
|
||||||
$(DIST_DIR)/chuni/launch.bat \
|
$(DIST_DIR)/chuni/launch.bat \
|
||||||
$(BUILD_DIR_ZIP)/chuni
|
$(BUILD_DIR_ZIP)/chuni
|
||||||
@ -18,7 +18,7 @@ $(BUILD_DIR_ZIP)/cxb.zip:
|
|||||||
$(V)mkdir -p $(BUILD_DIR_ZIP)/cxb
|
$(V)mkdir -p $(BUILD_DIR_ZIP)/cxb
|
||||||
$(V)mkdir -p $(BUILD_DIR_ZIP)/cxb/DEVICE
|
$(V)mkdir -p $(BUILD_DIR_ZIP)/cxb/DEVICE
|
||||||
$(V)cp $(BUILD_DIR_32)/subprojects/capnhook/inject/inject.exe \
|
$(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/segatools.ini \
|
||||||
$(DIST_DIR)/cxb/launch.bat \
|
$(DIST_DIR)/cxb/launch.bat \
|
||||||
$(BUILD_DIR_ZIP)/cxb
|
$(BUILD_DIR_ZIP)/cxb
|
||||||
@ -33,7 +33,7 @@ $(BUILD_DIR_ZIP)/diva.zip:
|
|||||||
$(V)mkdir -p $(BUILD_DIR_ZIP)/diva
|
$(V)mkdir -p $(BUILD_DIR_ZIP)/diva
|
||||||
$(V)mkdir -p $(BUILD_DIR_ZIP)/diva/DEVICE
|
$(V)mkdir -p $(BUILD_DIR_ZIP)/diva/DEVICE
|
||||||
$(V)cp $(BUILD_DIR_64)/subprojects/capnhook/inject/inject.exe \
|
$(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/segatools.ini \
|
||||||
$(DIST_DIR)/diva/launch.bat \
|
$(DIST_DIR)/diva/launch.bat \
|
||||||
$(BUILD_DIR_ZIP)/diva
|
$(BUILD_DIR_ZIP)/diva
|
||||||
@ -48,7 +48,7 @@ $(BUILD_DIR_ZIP)/carol.zip:
|
|||||||
$(V)mkdir -p $(BUILD_DIR_ZIP)/carol
|
$(V)mkdir -p $(BUILD_DIR_ZIP)/carol
|
||||||
$(V)mkdir -p $(BUILD_DIR_ZIP)/carol/DEVICE
|
$(V)mkdir -p $(BUILD_DIR_ZIP)/carol/DEVICE
|
||||||
$(V)cp $(BUILD_DIR_32)/subprojects/capnhook/inject/inject.exe \
|
$(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/segatools.ini \
|
||||||
$(DIST_DIR)/carol/launch.bat \
|
$(DIST_DIR)/carol/launch.bat \
|
||||||
$(BUILD_DIR_ZIP)/carol
|
$(BUILD_DIR_ZIP)/carol
|
||||||
@ -63,7 +63,7 @@ $(BUILD_DIR_ZIP)/idz.zip:
|
|||||||
$(V)mkdir -p $(BUILD_DIR_ZIP)/idz
|
$(V)mkdir -p $(BUILD_DIR_ZIP)/idz
|
||||||
$(V)mkdir -p $(BUILD_DIR_ZIP)/idz/DEVICE
|
$(V)mkdir -p $(BUILD_DIR_ZIP)/idz/DEVICE
|
||||||
$(V)cp $(BUILD_DIR_64)/subprojects/capnhook/inject/inject.exe \
|
$(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/segatools.ini \
|
||||||
$(DIST_DIR)/idz/launch.bat \
|
$(DIST_DIR)/idz/launch.bat \
|
||||||
$(BUILD_DIR_ZIP)/idz
|
$(BUILD_DIR_ZIP)/idz
|
||||||
@ -78,7 +78,7 @@ $(BUILD_DIR_ZIP)/fgo.zip:
|
|||||||
$(V)mkdir -p $(BUILD_DIR_ZIP)/fgo
|
$(V)mkdir -p $(BUILD_DIR_ZIP)/fgo
|
||||||
$(V)mkdir -p $(BUILD_DIR_ZIP)/fgo/DEVICE
|
$(V)mkdir -p $(BUILD_DIR_ZIP)/fgo/DEVICE
|
||||||
$(V)cp $(BUILD_DIR_64)/subprojects/capnhook/inject/inject.exe \
|
$(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/segatools.ini \
|
||||||
$(DIST_DIR)/fgo/launch.bat \
|
$(DIST_DIR)/fgo/launch.bat \
|
||||||
$(BUILD_DIR_ZIP)/fgo
|
$(BUILD_DIR_ZIP)/fgo
|
||||||
@ -93,7 +93,7 @@ $(BUILD_DIR_ZIP)/idac.zip:
|
|||||||
$(V)mkdir -p $(BUILD_DIR_ZIP)/idac
|
$(V)mkdir -p $(BUILD_DIR_ZIP)/idac
|
||||||
$(V)mkdir -p $(BUILD_DIR_ZIP)/idac/DEVICE
|
$(V)mkdir -p $(BUILD_DIR_ZIP)/idac/DEVICE
|
||||||
$(V)cp $(BUILD_DIR_64)/subprojects/capnhook/inject/inject.exe \
|
$(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/segatools.ini \
|
||||||
$(DIST_DIR)/idac/config_hook.json \
|
$(DIST_DIR)/idac/config_hook.json \
|
||||||
$(DIST_DIR)/idac/launch.bat \
|
$(DIST_DIR)/idac/launch.bat \
|
||||||
@ -109,7 +109,7 @@ $(BUILD_DIR_ZIP)/swdc.zip:
|
|||||||
$(V)mkdir -p $(BUILD_DIR_ZIP)/swdc
|
$(V)mkdir -p $(BUILD_DIR_ZIP)/swdc
|
||||||
$(V)mkdir -p $(BUILD_DIR_ZIP)/swdc/DEVICE
|
$(V)mkdir -p $(BUILD_DIR_ZIP)/swdc/DEVICE
|
||||||
$(V)cp $(BUILD_DIR_64)/subprojects/capnhook/inject/inject.exe \
|
$(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/segatools.ini \
|
||||||
$(DIST_DIR)/swdc/config_hook.json \
|
$(DIST_DIR)/swdc/config_hook.json \
|
||||||
$(DIST_DIR)/swdc/launch.bat \
|
$(DIST_DIR)/swdc/launch.bat \
|
||||||
@ -125,7 +125,7 @@ $(BUILD_DIR_ZIP)/mercury.zip:
|
|||||||
$(V)mkdir -p $(BUILD_DIR_ZIP)/mercury
|
$(V)mkdir -p $(BUILD_DIR_ZIP)/mercury
|
||||||
$(V)mkdir -p $(BUILD_DIR_ZIP)/mercury/DEVICE
|
$(V)mkdir -p $(BUILD_DIR_ZIP)/mercury/DEVICE
|
||||||
$(V)cp $(BUILD_DIR_64)/subprojects/capnhook/inject/inject.exe \
|
$(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/segatools.ini \
|
||||||
$(DIST_DIR)/mercury/launch.bat \
|
$(DIST_DIR)/mercury/launch.bat \
|
||||||
$(BUILD_DIR_ZIP)/mercury
|
$(BUILD_DIR_ZIP)/mercury
|
||||||
@ -143,9 +143,9 @@ $(BUILD_DIR_ZIP)/chusan.zip:
|
|||||||
$(DIST_DIR)/chusan/config_hook.json \
|
$(DIST_DIR)/chusan/config_hook.json \
|
||||||
$(DIST_DIR)/chusan/launch.bat \
|
$(DIST_DIR)/chusan/launch.bat \
|
||||||
$(BUILD_DIR_ZIP)/chusan
|
$(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
|
$(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
|
$(BUILD_DIR_ZIP)/chusan/chusanhook_x64.dll
|
||||||
$(V)cp $(BUILD_DIR_32)/subprojects/capnhook/inject/inject.exe \
|
$(V)cp $(BUILD_DIR_32)/subprojects/capnhook/inject/inject.exe \
|
||||||
$(BUILD_DIR_ZIP)/chusan/inject_x86.exe
|
$(BUILD_DIR_ZIP)/chusan/inject_x86.exe
|
||||||
@ -162,7 +162,7 @@ $(BUILD_DIR_ZIP)/mu3.zip:
|
|||||||
$(V)mkdir -p $(BUILD_DIR_ZIP)/mu3
|
$(V)mkdir -p $(BUILD_DIR_ZIP)/mu3
|
||||||
$(V)mkdir -p $(BUILD_DIR_ZIP)/mu3/DEVICE
|
$(V)mkdir -p $(BUILD_DIR_ZIP)/mu3/DEVICE
|
||||||
$(V)cp $(BUILD_DIR_64)/subprojects/capnhook/inject/inject.exe \
|
$(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/segatools.ini \
|
||||||
$(DIST_DIR)/mu3/launch.bat \
|
$(DIST_DIR)/mu3/launch.bat \
|
||||||
$(BUILD_DIR_ZIP)/mu3
|
$(BUILD_DIR_ZIP)/mu3
|
||||||
@ -177,7 +177,7 @@ $(BUILD_DIR_ZIP)/mai2.zip:
|
|||||||
$(V)mkdir -p $(BUILD_DIR_ZIP)/mai2
|
$(V)mkdir -p $(BUILD_DIR_ZIP)/mai2
|
||||||
$(V)mkdir -p $(BUILD_DIR_ZIP)/mai2/DEVICE
|
$(V)mkdir -p $(BUILD_DIR_ZIP)/mai2/DEVICE
|
||||||
$(V)cp $(BUILD_DIR_64)/subprojects/capnhook/inject/inject.exe \
|
$(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/segatools.ini \
|
||||||
$(DIST_DIR)/mai2/launch.bat \
|
$(DIST_DIR)/mai2/launch.bat \
|
||||||
$(BUILD_DIR_ZIP)/mai2
|
$(BUILD_DIR_ZIP)/mai2
|
||||||
@ -192,7 +192,7 @@ $(BUILD_DIR_ZIP)/cm.zip:
|
|||||||
$(V)mkdir -p $(BUILD_DIR_ZIP)/cm
|
$(V)mkdir -p $(BUILD_DIR_ZIP)/cm
|
||||||
$(V)mkdir -p $(BUILD_DIR_ZIP)/cm/DEVICE
|
$(V)mkdir -p $(BUILD_DIR_ZIP)/cm/DEVICE
|
||||||
$(V)cp $(BUILD_DIR_64)/subprojects/capnhook/inject/inject.exe \
|
$(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/config_hook.json \
|
||||||
$(DIST_DIR)/cm/segatools.ini \
|
$(DIST_DIR)/cm/segatools.ini \
|
||||||
$(DIST_DIR)/cm/launch.bat \
|
$(DIST_DIR)/cm/launch.bat \
|
||||||
@ -208,7 +208,7 @@ $(BUILD_DIR_ZIP)/tokyo.zip:
|
|||||||
$(V)mkdir -p $(BUILD_DIR_ZIP)/tokyo
|
$(V)mkdir -p $(BUILD_DIR_ZIP)/tokyo
|
||||||
$(V)mkdir -p $(BUILD_DIR_ZIP)/tokyo/DEVICE
|
$(V)mkdir -p $(BUILD_DIR_ZIP)/tokyo/DEVICE
|
||||||
$(V)cp $(BUILD_DIR_64)/subprojects/capnhook/inject/inject.exe \
|
$(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/config_hook.json \
|
||||||
$(DIST_DIR)/tokyo/segatools.ini \
|
$(DIST_DIR)/tokyo/segatools.ini \
|
||||||
$(DIST_DIR)/tokyo/launch.bat \
|
$(DIST_DIR)/tokyo/launch.bat \
|
||||||
@ -226,9 +226,9 @@ $(BUILD_DIR_ZIP)/kemono.zip:
|
|||||||
$(V)cp $(DIST_DIR)/kemono/segatools.ini \
|
$(V)cp $(DIST_DIR)/kemono/segatools.ini \
|
||||||
$(DIST_DIR)/kemono/launch.bat \
|
$(DIST_DIR)/kemono/launch.bat \
|
||||||
$(BUILD_DIR_ZIP)/kemono
|
$(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
|
$(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
|
$(BUILD_DIR_ZIP)/kemono/kemonohook_x64.dll
|
||||||
$(V)cp $(BUILD_DIR_32)/subprojects/capnhook/inject/inject.exe \
|
$(V)cp $(BUILD_DIR_32)/subprojects/capnhook/inject/inject.exe \
|
||||||
$(BUILD_DIR_ZIP)/kemono/inject_x86.exe
|
$(BUILD_DIR_ZIP)/kemono/inject_x86.exe
|
||||||
@ -240,6 +240,22 @@ $(BUILD_DIR_ZIP)/kemono.zip:
|
|||||||
for x in exe dll; do strip $(BUILD_DIR_ZIP)/kemono/*.$$x; done
|
for x in exe dll; do strip $(BUILD_DIR_ZIP)/kemono/*.$$x; done
|
||||||
$(V)cd $(BUILD_DIR_ZIP)/kemono ; zip -r ../kemono.zip *
|
$(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)/doc.zip: \
|
$(BUILD_DIR_ZIP)/doc.zip: \
|
||||||
$(DOC_DIR)/config \
|
$(DOC_DIR)/config \
|
||||||
$(DOC_DIR)/chunihook.md \
|
$(DOC_DIR)/chunihook.md \
|
||||||
@ -265,6 +281,7 @@ $(BUILD_DIR_ZIP)/segatools.zip: \
|
|||||||
$(BUILD_DIR_ZIP)/tokyo.zip \
|
$(BUILD_DIR_ZIP)/tokyo.zip \
|
||||||
$(BUILD_DIR_ZIP)/fgo.zip \
|
$(BUILD_DIR_ZIP)/fgo.zip \
|
||||||
$(BUILD_DIR_ZIP)/kemono.zip \
|
$(BUILD_DIR_ZIP)/kemono.zip \
|
||||||
|
$(BUILD_DIR_ZIP)/apm3.zip \
|
||||||
CHANGELOG.md \
|
CHANGELOG.md \
|
||||||
README.md \
|
README.md \
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
# Segatools
|
# Segatools
|
||||||
|
|
||||||
Version: `2024-09-30`
|
Version: `2025-07-27`
|
||||||
|
|
||||||
Loaders and hardware emulators for SEGA games that run on the Nu and ALLS platforms.
|
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
|
* starting from WACCA
|
||||||
* Kemono Friends
|
* Kemono Friends
|
||||||
* Kemono Friends 3: Planet Tours
|
* 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
|
## End-users
|
||||||
|
|
||||||
|
@ -75,6 +75,15 @@ void aime_config_load(struct aime_config *cfg, const wchar_t *filename)
|
|||||||
cfg->port_no = GetPrivateProfileIntW(L"aime", L"portNo", 0, filename);
|
cfg->port_no = GetPrivateProfileIntW(L"aime", L"portNo", 0, 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);
|
cfg->gen = GetPrivateProfileIntW(L"aime", L"gen", 0, 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)
|
void io4_config_load(struct io4_config *cfg, const wchar_t *filename)
|
@ -5,21 +5,21 @@
|
|||||||
#pragma pack(push, 1)
|
#pragma pack(push, 1)
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
SG_NFC_CMD_GET_FW_VERSION = 0x30,
|
SG_NFC_CMD_GET_FW_VERSION = 0x30,
|
||||||
SG_NFC_CMD_GET_HW_VERSION = 0x32,
|
SG_NFC_CMD_GET_HW_VERSION = 0x32,
|
||||||
SG_NFC_CMD_RADIO_ON = 0x40,
|
SG_NFC_CMD_RADIO_ON = 0x40,
|
||||||
SG_NFC_CMD_RADIO_OFF = 0x41,
|
SG_NFC_CMD_RADIO_OFF = 0x41,
|
||||||
SG_NFC_CMD_POLL = 0x42,
|
SG_NFC_CMD_POLL = 0x42,
|
||||||
SG_NFC_CMD_MIFARE_SELECT_TAG = 0x43,
|
SG_NFC_CMD_MIFARE_SELECT_TAG = 0x43,
|
||||||
SG_NFC_CMD_MIFARE_SET_KEY_AIME = 0x50,
|
SG_NFC_CMD_MIFARE_SET_KEY_AIME = 0x50,
|
||||||
SG_NFC_CMD_MIFARE_AUTHENTICATE_A = 0x51,
|
SG_NFC_CMD_MIFARE_AUTHENTICATE_AIME = 0x51,
|
||||||
SG_NFC_CMD_MIFARE_READ_BLOCK = 0x52,
|
SG_NFC_CMD_MIFARE_READ_BLOCK = 0x52,
|
||||||
SG_NFC_CMD_MIFARE_SET_KEY_BANA = 0x54,
|
SG_NFC_CMD_MIFARE_SET_KEY_BANA = 0x54,
|
||||||
SG_NFC_CMD_MIFARE_AUTHENTICATE_B = 0x55,
|
SG_NFC_CMD_MIFARE_AUTHENTICATE_BANA = 0x55,
|
||||||
SG_NFC_CMD_TO_UPDATE_MODE = 0x60,
|
SG_NFC_CMD_TO_UPDATE_MODE = 0x60,
|
||||||
SG_NFC_CMD_SEND_HEX_DATA = 0x61,
|
SG_NFC_CMD_SEND_HEX_DATA = 0x61,
|
||||||
SG_NFC_CMD_RESET = 0x62,
|
SG_NFC_CMD_RESET = 0x62,
|
||||||
SG_NFC_CMD_FELICA_ENCAP = 0x71,
|
SG_NFC_CMD_FELICA_ENCAP = 0x71,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct sg_nfc_res_get_fw_version {
|
struct sg_nfc_res_get_fw_version {
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
#include <stdbool.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@ -16,6 +17,7 @@
|
|||||||
|
|
||||||
#include "util/dprintf.h"
|
#include "util/dprintf.h"
|
||||||
#include "util/dump.h"
|
#include "util/dump.h"
|
||||||
|
#include "util/slurp.h"
|
||||||
|
|
||||||
static HRESULT sg_nfc_dispatch(
|
static HRESULT sg_nfc_dispatch(
|
||||||
void *ctx,
|
void *ctx,
|
||||||
@ -87,6 +89,8 @@ void sg_nfc_init(
|
|||||||
uint8_t addr,
|
uint8_t addr,
|
||||||
const struct sg_nfc_ops *ops,
|
const struct sg_nfc_ops *ops,
|
||||||
unsigned int gen,
|
unsigned int gen,
|
||||||
|
unsigned int proxy_flag,
|
||||||
|
const wchar_t* authdata_path,
|
||||||
void *ops_ctx)
|
void *ops_ctx)
|
||||||
{
|
{
|
||||||
assert(nfc != NULL);
|
assert(nfc != NULL);
|
||||||
@ -96,6 +100,8 @@ void sg_nfc_init(
|
|||||||
nfc->ops_ctx = ops_ctx;
|
nfc->ops_ctx = ops_ctx;
|
||||||
nfc->addr = addr;
|
nfc->addr = addr;
|
||||||
nfc->gen = gen;
|
nfc->gen = gen;
|
||||||
|
nfc->proxy_flag = proxy_flag;
|
||||||
|
nfc->authdata_path = authdata_path;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef NDEBUG
|
#ifdef NDEBUG
|
||||||
@ -189,8 +195,8 @@ static HRESULT sg_nfc_dispatch(
|
|||||||
&req->felica_encap,
|
&req->felica_encap,
|
||||||
&res->felica_encap);
|
&res->felica_encap);
|
||||||
|
|
||||||
case SG_NFC_CMD_MIFARE_AUTHENTICATE_A:
|
case SG_NFC_CMD_MIFARE_AUTHENTICATE_AIME:
|
||||||
case SG_NFC_CMD_MIFARE_AUTHENTICATE_B:
|
case SG_NFC_CMD_MIFARE_AUTHENTICATE_BANA:
|
||||||
case SG_NFC_CMD_SEND_HEX_DATA:
|
case SG_NFC_CMD_SEND_HEX_DATA:
|
||||||
return sg_nfc_cmd_send_hex_data(nfc, &req->simple, &res->simple);
|
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->type = 0x10;
|
||||||
mifare->id_len = sizeof(mifare->uid);
|
mifare->id_len = sizeof(mifare->uid);
|
||||||
|
// mifare->uid = _byteswap_ulong(0x8FBECBFF);
|
||||||
mifare->uid = _byteswap_ulong(0x01020304);
|
mifare->uid = _byteswap_ulong(0x01020304);
|
||||||
|
|
||||||
/* Initialize MIFARE IC emulator */
|
/* 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);
|
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");
|
sg_nfc_dprintf(nfc, "MIFARE block number out of range\n");
|
||||||
|
|
||||||
return E_FAIL;
|
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;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
@ -23,8 +23,10 @@ struct sg_nfc {
|
|||||||
void *ops_ctx;
|
void *ops_ctx;
|
||||||
uint8_t addr;
|
uint8_t addr;
|
||||||
unsigned int gen;
|
unsigned int gen;
|
||||||
|
unsigned int proxy_flag;
|
||||||
struct felica felica;
|
struct felica felica;
|
||||||
struct mifare mifare;
|
struct mifare mifare;
|
||||||
|
const wchar_t* authdata_path;
|
||||||
};
|
};
|
||||||
|
|
||||||
void sg_nfc_init(
|
void sg_nfc_init(
|
||||||
@ -32,6 +34,8 @@ void sg_nfc_init(
|
|||||||
uint8_t addr,
|
uint8_t addr,
|
||||||
const struct sg_nfc_ops *ops,
|
const struct sg_nfc_ops *ops,
|
||||||
unsigned int gen,
|
unsigned int gen,
|
||||||
|
unsigned int proxy_flag,
|
||||||
|
const wchar_t* authdata_path,
|
||||||
void *ops_ctx);
|
void *ops_ctx);
|
||||||
|
|
||||||
void sg_nfc_transact(
|
void sg_nfc_transact(
|
@ -81,7 +81,7 @@ HRESULT sg_reader_hook_init(
|
|||||||
return E_INVALIDARG;
|
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);
|
sg_led_init(&sg_reader_led, 0x08, &sg_reader_led_ops, gen, NULL);
|
||||||
|
|
||||||
InitializeCriticalSection(&sg_reader_lock);
|
InitializeCriticalSection(&sg_reader_lock);
|
@ -12,6 +12,8 @@ struct aime_config {
|
|||||||
unsigned int port_no;
|
unsigned int port_no;
|
||||||
bool high_baudrate;
|
bool high_baudrate;
|
||||||
unsigned int gen;
|
unsigned int gen;
|
||||||
|
unsigned int proxy_flag;
|
||||||
|
wchar_t authdata_path[MAX_PATH];
|
||||||
};
|
};
|
||||||
|
|
||||||
HRESULT sg_reader_hook_init(
|
HRESULT sg_reader_hook_init(
|
@ -14,6 +14,7 @@ static HCURSOR (*next_SetCursor)(HCURSOR hCursor);
|
|||||||
static BOOL my_SetCursorPos(int x, int y);
|
static BOOL my_SetCursorPos(int x, int y);
|
||||||
static BOOL my_SetPhysicalCursorPos(int x, int y);
|
static BOOL my_SetPhysicalCursorPos(int x, int y);
|
||||||
static int my_ShowCursor(BOOL bShow);
|
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[] = {
|
static const struct hook_symbol cursor_syms[] = {
|
||||||
{
|
{
|
||||||
@ -45,7 +46,7 @@ void cursor_hook_init()
|
|||||||
|
|
||||||
static BOOL my_SetCursorPos(int x, int y)
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -58,7 +59,12 @@ static BOOL my_SetPhysicalCursorPos(int x, int y)
|
|||||||
static int my_ShowCursor(BOOL bShow)
|
static int my_ShowCursor(BOOL bShow)
|
||||||
{
|
{
|
||||||
dprintf("my_ShowCursor Hit!\n");
|
dprintf("my_ShowCursor Hit!\n");
|
||||||
return 0;
|
if (bShow) {
|
||||||
|
cursor_track++;
|
||||||
|
} else {
|
||||||
|
cursor_track--;
|
||||||
|
}
|
||||||
|
return cursor_track;
|
||||||
}
|
}
|
||||||
|
|
||||||
static HCURSOR my_SetCursor(HCURSOR hCursor)
|
static HCURSOR my_SetCursor(HCURSOR hCursor)
|
@ -217,20 +217,24 @@ static void dns_hook_init(void)
|
|||||||
dns_hook_initted = true;
|
dns_hook_initted = true;
|
||||||
InitializeCriticalSection(&dns_hook_lock);
|
InitializeCriticalSection(&dns_hook_lock);
|
||||||
|
|
||||||
|
dns_hook_apply_hooks(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void dns_hook_apply_hooks(HMODULE mod){
|
||||||
hook_table_apply(
|
hook_table_apply(
|
||||||
NULL,
|
mod,
|
||||||
"dnsapi.dll",
|
"dnsapi.dll",
|
||||||
dns_hook_syms_dnsapi,
|
dns_hook_syms_dnsapi,
|
||||||
_countof(dns_hook_syms_dnsapi));
|
_countof(dns_hook_syms_dnsapi));
|
||||||
|
|
||||||
hook_table_apply(
|
hook_table_apply(
|
||||||
NULL,
|
mod,
|
||||||
"ws2_32.dll",
|
"ws2_32.dll",
|
||||||
dns_hook_syms_ws2,
|
dns_hook_syms_ws2,
|
||||||
_countof(dns_hook_syms_ws2));
|
_countof(dns_hook_syms_ws2));
|
||||||
|
|
||||||
hook_table_apply(
|
hook_table_apply(
|
||||||
NULL,
|
mod,
|
||||||
"winhttp.dll",
|
"winhttp.dll",
|
||||||
dns_hook_syms_winhttp,
|
dns_hook_syms_winhttp,
|
||||||
_countof(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
|
// 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);
|
HRESULT dns_hook_push(const wchar_t *from_src, const wchar_t *to_src);
|
||||||
|
|
||||||
|
void dns_hook_apply_hooks(HMODULE mod);
|
@ -11,11 +11,12 @@
|
|||||||
|
|
||||||
#include "hooklib/path.h"
|
#include "hooklib/path.h"
|
||||||
|
|
||||||
|
#include <util/dprintf.h>
|
||||||
|
|
||||||
/* Helpers */
|
/* Helpers */
|
||||||
|
|
||||||
static void path_hook_init(void);
|
static void path_hook_init(void);
|
||||||
static BOOL path_transform_a(char **out, const char *src);
|
static BOOL path_transform_a(char **out, const char *src);
|
||||||
static BOOL path_transform_w(wchar_t **out, const wchar_t *src);
|
|
||||||
|
|
||||||
/* API hooks */
|
/* API hooks */
|
||||||
|
|
||||||
@ -135,6 +136,31 @@ static BOOL WINAPI hook_DeleteFileA(const char *lpFileName);
|
|||||||
|
|
||||||
static BOOL WINAPI hook_DeleteFileW(const wchar_t *lpFileName);
|
static BOOL WINAPI hook_DeleteFileW(const wchar_t *lpFileName);
|
||||||
|
|
||||||
|
static DWORD WINAPI hook_GetPrivateProfileStringA(
|
||||||
|
LPCSTR lpAppName,
|
||||||
|
LPCSTR lpKeyName,
|
||||||
|
LPCSTR lpDefault,
|
||||||
|
LPSTR lpReturnedString,
|
||||||
|
DWORD nSize,
|
||||||
|
LPCSTR lpFileName
|
||||||
|
);
|
||||||
|
|
||||||
|
static DWORD WINAPI hook_GetPrivateProfileStringW(
|
||||||
|
LPCWSTR lpAppName,
|
||||||
|
LPCWSTR lpKeyName,
|
||||||
|
LPCWSTR lpDefault,
|
||||||
|
LPWSTR lpReturnedString,
|
||||||
|
DWORD nSize,
|
||||||
|
LPCWSTR lpFileName
|
||||||
|
);
|
||||||
|
|
||||||
|
static DWORD WINAPI hook_GetPrivateProfileSectionW(
|
||||||
|
LPCWSTR lpAppName,
|
||||||
|
LPWSTR lpReturnedString,
|
||||||
|
DWORD nSize,
|
||||||
|
LPCWSTR lpFileName
|
||||||
|
);
|
||||||
|
|
||||||
/* Link pointers */
|
/* Link pointers */
|
||||||
|
|
||||||
static BOOL (WINAPI *next_CreateDirectoryA)(
|
static BOOL (WINAPI *next_CreateDirectoryA)(
|
||||||
@ -252,6 +278,31 @@ static BOOL (WINAPI *next_DeleteFileA)(const char *lpFileName);
|
|||||||
|
|
||||||
static BOOL (WINAPI *next_DeleteFileW)(const wchar_t *lpFileName);
|
static BOOL (WINAPI *next_DeleteFileW)(const wchar_t *lpFileName);
|
||||||
|
|
||||||
|
static DWORD (WINAPI *next_GetPrivateProfileStringA)(
|
||||||
|
LPCSTR lpAppName,
|
||||||
|
LPCSTR lpKeyName,
|
||||||
|
LPCSTR lpDefault,
|
||||||
|
LPSTR lpReturnedString,
|
||||||
|
DWORD nSize,
|
||||||
|
LPCSTR lpFileName
|
||||||
|
);
|
||||||
|
|
||||||
|
static DWORD (WINAPI *next_GetPrivateProfileStringW)(
|
||||||
|
LPCWSTR lpAppName,
|
||||||
|
LPCWSTR lpKeyName,
|
||||||
|
LPCWSTR lpDefault,
|
||||||
|
LPWSTR lpReturnedString,
|
||||||
|
DWORD nSize,
|
||||||
|
LPCWSTR lpFileName
|
||||||
|
);
|
||||||
|
|
||||||
|
static DWORD (WINAPI *next_GetPrivateProfileSectionW)(
|
||||||
|
LPCWSTR lpAppName,
|
||||||
|
LPWSTR lpReturnedString,
|
||||||
|
DWORD nSize,
|
||||||
|
LPCWSTR lpFileName
|
||||||
|
);
|
||||||
|
|
||||||
/* Hook table */
|
/* Hook table */
|
||||||
|
|
||||||
static const struct hook_symbol path_hook_syms[] = {
|
static const struct hook_symbol path_hook_syms[] = {
|
||||||
@ -355,6 +406,18 @@ static const struct hook_symbol path_hook_syms[] = {
|
|||||||
.name = "DeleteFileW",
|
.name = "DeleteFileW",
|
||||||
.patch = hook_DeleteFileW,
|
.patch = hook_DeleteFileW,
|
||||||
.link = (void **) &next_DeleteFileW,
|
.link = (void **) &next_DeleteFileW,
|
||||||
|
}, {
|
||||||
|
.name = "GetPrivateProfileStringA",
|
||||||
|
.patch = hook_GetPrivateProfileStringA,
|
||||||
|
.link = (void **) &next_GetPrivateProfileStringA,
|
||||||
|
}, {
|
||||||
|
.name = "GetPrivateProfileStringW",
|
||||||
|
.patch = hook_GetPrivateProfileStringW,
|
||||||
|
.link = (void **) &next_GetPrivateProfileStringW,
|
||||||
|
}, {
|
||||||
|
.name = "GetPrivateProfileSectionW",
|
||||||
|
.patch = hook_GetPrivateProfileSectionW,
|
||||||
|
.link = (void **) &next_GetPrivateProfileSectionW,
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -488,7 +551,7 @@ end:
|
|||||||
return ok;
|
return ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
static BOOL path_transform_w(wchar_t **out, const wchar_t *src)
|
BOOL path_transform_w(wchar_t **out, const wchar_t *src)
|
||||||
{
|
{
|
||||||
BOOL ok;
|
BOOL ok;
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
@ -533,6 +596,12 @@ static BOOL path_transform_w(wchar_t **out, const wchar_t *src)
|
|||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if LOG_VFS
|
||||||
|
if (!wcsstr(src, L"AppUser")) {
|
||||||
|
dprintf("Path: %ls -> %ls\n", src, dest);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1027,7 +1096,7 @@ static BOOL WINAPI hook_MoveFileA(
|
|||||||
ok = next_MoveFileA(
|
ok = next_MoveFileA(
|
||||||
oldTrans ? oldTrans : lpExistingFileName,
|
oldTrans ? oldTrans : lpExistingFileName,
|
||||||
newTrans ? newTrans : lpNewFileName);
|
newTrans ? newTrans : lpNewFileName);
|
||||||
|
|
||||||
free(oldTrans);
|
free(oldTrans);
|
||||||
free(newTrans);
|
free(newTrans);
|
||||||
|
|
||||||
@ -1059,7 +1128,7 @@ static BOOL WINAPI hook_MoveFileW(
|
|||||||
ok = next_MoveFileW(
|
ok = next_MoveFileW(
|
||||||
oldTrans ? oldTrans : lpExistingFileName,
|
oldTrans ? oldTrans : lpExistingFileName,
|
||||||
newTrans ? newTrans : lpNewFileName);
|
newTrans ? newTrans : lpNewFileName);
|
||||||
|
|
||||||
free(oldTrans);
|
free(oldTrans);
|
||||||
free(newTrans);
|
free(newTrans);
|
||||||
|
|
||||||
@ -1093,7 +1162,7 @@ static BOOL WINAPI hook_MoveFileExA(
|
|||||||
oldTrans ? oldTrans : lpExistingFileName,
|
oldTrans ? oldTrans : lpExistingFileName,
|
||||||
newTrans ? newTrans : lpNewFileName,
|
newTrans ? newTrans : lpNewFileName,
|
||||||
dwFlags);
|
dwFlags);
|
||||||
|
|
||||||
free(oldTrans);
|
free(oldTrans);
|
||||||
free(newTrans);
|
free(newTrans);
|
||||||
|
|
||||||
@ -1180,7 +1249,7 @@ static BOOL WINAPI hook_ReplaceFileW(
|
|||||||
return ok;
|
return ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
static BOOL WINAPI hook_DeleteFileA(const char *lpFileName)
|
static BOOL WINAPI hook_DeleteFileA(const char *lpFileName)
|
||||||
{
|
{
|
||||||
char *trans;
|
char *trans;
|
||||||
BOOL ok;
|
BOOL ok;
|
||||||
@ -1211,3 +1280,61 @@ static BOOL WINAPI hook_DeleteFileW(const wchar_t *lpFileName)
|
|||||||
|
|
||||||
return ok;
|
return ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static DWORD WINAPI hook_GetPrivateProfileStringA(
|
||||||
|
LPCSTR lpAppName,
|
||||||
|
LPCSTR lpKeyName,
|
||||||
|
LPCSTR lpDefault,
|
||||||
|
LPSTR lpReturnedString,
|
||||||
|
DWORD nSize,
|
||||||
|
LPCSTR lpFileName
|
||||||
|
) {
|
||||||
|
char *trans;
|
||||||
|
BOOL ok;
|
||||||
|
|
||||||
|
ok = path_transform_a(&trans, lpFileName);
|
||||||
|
|
||||||
|
if (!ok) {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return next_GetPrivateProfileStringA(lpAppName, lpKeyName, lpDefault, lpReturnedString, nSize, trans ? trans: lpFileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
static DWORD WINAPI hook_GetPrivateProfileStringW(
|
||||||
|
LPCWSTR lpAppName,
|
||||||
|
LPCWSTR lpKeyName,
|
||||||
|
LPCWSTR lpDefault,
|
||||||
|
LPWSTR lpReturnedString,
|
||||||
|
DWORD nSize,
|
||||||
|
LPCWSTR lpFileName
|
||||||
|
) {
|
||||||
|
wchar_t *trans;
|
||||||
|
BOOL ok;
|
||||||
|
|
||||||
|
ok = path_transform_w(&trans, lpFileName);
|
||||||
|
|
||||||
|
if (!ok) {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return next_GetPrivateProfileStringW(lpAppName, lpKeyName, lpDefault, lpReturnedString, nSize, trans ? trans: lpFileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
static DWORD WINAPI hook_GetPrivateProfileSectionW(
|
||||||
|
LPCWSTR lpAppName,
|
||||||
|
LPWSTR lpReturnedString,
|
||||||
|
DWORD nSize,
|
||||||
|
LPCWSTR lpFileName
|
||||||
|
) {
|
||||||
|
wchar_t *trans;
|
||||||
|
BOOL ok;
|
||||||
|
|
||||||
|
ok = path_transform_w(&trans, lpFileName);
|
||||||
|
|
||||||
|
if (!ok) {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return next_GetPrivateProfileSectionW(lpAppName, lpReturnedString, nSize, trans ? trans: lpFileName);
|
||||||
|
}
|
@ -13,6 +13,7 @@ typedef HRESULT (*path_hook_t)(
|
|||||||
HRESULT path_hook_push(path_hook_t hook);
|
HRESULT path_hook_push(path_hook_t hook);
|
||||||
void path_hook_insert_hooks(HMODULE target);
|
void path_hook_insert_hooks(HMODULE target);
|
||||||
int path_compare_w(const wchar_t *string1, const wchar_t *string2, size_t count);
|
int path_compare_w(const wchar_t *string1, const wchar_t *string2, size_t count);
|
||||||
|
BOOL path_transform_w(wchar_t **out, const wchar_t *src);
|
||||||
|
|
||||||
static inline bool path_is_separator_w(wchar_t c)
|
static inline bool path_is_separator_w(wchar_t c)
|
||||||
{
|
{
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user