forked from TeamTofuShop/segatools
Compare commits
87 Commits
feature/ff
...
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 | |||
61f95c3f2e | |||
70c3e2fe0f | |||
369fe28687 | |||
3371f3f437 | |||
a57542c2d2
|
|||
27116a7a41
|
|||
e850346b79
|
|||
4d0ef54279
|
|||
b8af67377c
|
|||
4cb76dd1ee
|
|||
efe01d92a6 | |||
004a2f6dcd | |||
a1611afffc | |||
1d63ab24d3 | |||
2f54183636 | |||
402bf0f247 | |||
4c20deb60a | |||
96ee1afc2f | |||
0c28765bdd | |||
96bf8cab81
|
|||
a3120181be
|
|||
80d4902cfc
|
|||
b4f5cdbe59 | |||
25431a9db1 | |||
a705ae8748 | |||
b52455339f | |||
ff21223f06 | |||
047733d122 | |||
21bb965382 | |||
11556a1332 | |||
d8202e1df4 | |||
2d3d6fc2bb | |||
6d8ffb46ef | |||
2069b1ea85 | |||
c80f903cf8 | |||
ceb2b63e8b | |||
83840e0a87 | |||
e50d6d8ebc | |||
e1a47cf365 | |||
8aef1cfa79 | |||
8fc24503c8
|
|||
ebf0f0b428 | |||
892eb2b859
|
|||
b80b9fbc19 | |||
cef3406691 | |||
97d2d6b9bc | |||
f39b9ce3a0 | |||
243bb778d1 | |||
66317a0054
|
|||
8c24e04900 | |||
3bb9404a38 | |||
6819963f06 | |||
36849bd09a
|
|||
4fa9abffe8 |
4
.clang-format
Normal file
4
.clang-format
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
---
|
||||||
|
BasedOnStyle: Google
|
||||||
|
IndentWidth: 4
|
||||||
|
---
|
3
.gitignore
vendored
3
.gitignore
vendored
@ -21,3 +21,6 @@ subprojects/capnhook
|
|||||||
|
|
||||||
# For enabling debug logging on local builds
|
# For enabling debug logging on local builds
|
||||||
MesonLocalOptions.mk
|
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 := 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
|
||||||
|
81
Package.mk
81
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
|
||||||
$(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/start.bat \
|
$(DIST_DIR)/chuni/launch.bat \
|
||||||
$(BUILD_DIR_ZIP)/chuni
|
$(BUILD_DIR_ZIP)/chuni
|
||||||
$(V)cp pki/billing.pub \
|
$(V)cp pki/billing.pub \
|
||||||
pki/ca.crt \
|
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
|
||||||
$(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/start.bat \
|
$(DIST_DIR)/cxb/launch.bat \
|
||||||
$(BUILD_DIR_ZIP)/cxb
|
$(BUILD_DIR_ZIP)/cxb
|
||||||
$(V)cp pki/billing.pub \
|
$(V)cp pki/billing.pub \
|
||||||
pki/ca.crt \
|
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
|
||||||
$(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/start.bat \
|
$(DIST_DIR)/diva/launch.bat \
|
||||||
$(BUILD_DIR_ZIP)/diva
|
$(BUILD_DIR_ZIP)/diva
|
||||||
$(V)cp pki/billing.pub \
|
$(V)cp pki/billing.pub \
|
||||||
pki/ca.crt \
|
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
|
||||||
$(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/start.bat \
|
$(DIST_DIR)/carol/launch.bat \
|
||||||
$(BUILD_DIR_ZIP)/carol
|
$(BUILD_DIR_ZIP)/carol
|
||||||
$(V)cp pki/billing.pub \
|
$(V)cp pki/billing.pub \
|
||||||
pki/ca.crt \
|
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
|
||||||
$(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/start.bat \
|
$(DIST_DIR)/idz/launch.bat \
|
||||||
$(BUILD_DIR_ZIP)/idz
|
$(BUILD_DIR_ZIP)/idz
|
||||||
$(V)cp pki/billing.pub \
|
$(V)cp pki/billing.pub \
|
||||||
pki/ca.crt \
|
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
|
||||||
$(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/start.bat \
|
$(DIST_DIR)/fgo/launch.bat \
|
||||||
$(BUILD_DIR_ZIP)/fgo
|
$(BUILD_DIR_ZIP)/fgo
|
||||||
$(V)cp pki/billing.pub \
|
$(V)cp pki/billing.pub \
|
||||||
pki/ca.crt \
|
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
|
||||||
$(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/start.bat \
|
$(DIST_DIR)/idac/launch.bat \
|
||||||
$(BUILD_DIR_ZIP)/idac
|
$(BUILD_DIR_ZIP)/idac
|
||||||
$(V)cp pki/billing.pub \
|
$(V)cp pki/billing.pub \
|
||||||
pki/ca.crt \
|
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
|
||||||
$(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/start.bat \
|
$(DIST_DIR)/swdc/launch.bat \
|
||||||
$(BUILD_DIR_ZIP)/swdc
|
$(BUILD_DIR_ZIP)/swdc
|
||||||
$(V)cp pki/billing.pub \
|
$(V)cp pki/billing.pub \
|
||||||
pki/ca.crt \
|
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
|
||||||
$(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/start.bat \
|
$(DIST_DIR)/mercury/launch.bat \
|
||||||
$(BUILD_DIR_ZIP)/mercury
|
$(BUILD_DIR_ZIP)/mercury
|
||||||
$(V)cp pki/billing.pub \
|
$(V)cp pki/billing.pub \
|
||||||
pki/ca.crt \
|
pki/ca.crt \
|
||||||
@ -141,11 +141,11 @@ $(BUILD_DIR_ZIP)/chusan.zip:
|
|||||||
$(V)mkdir -p $(BUILD_DIR_ZIP)/chusan/DEVICE
|
$(V)mkdir -p $(BUILD_DIR_ZIP)/chusan/DEVICE
|
||||||
$(V)cp $(DIST_DIR)/chusan/segatools.ini \
|
$(V)cp $(DIST_DIR)/chusan/segatools.ini \
|
||||||
$(DIST_DIR)/chusan/config_hook.json \
|
$(DIST_DIR)/chusan/config_hook.json \
|
||||||
$(DIST_DIR)/chusan/start.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,9 +162,9 @@ $(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/start.bat \
|
$(DIST_DIR)/mu3/launch.bat \
|
||||||
$(BUILD_DIR_ZIP)/mu3
|
$(BUILD_DIR_ZIP)/mu3
|
||||||
$(V)cp pki/billing.pub \
|
$(V)cp pki/billing.pub \
|
||||||
pki/ca.crt \
|
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
|
||||||
$(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/start.bat \
|
$(DIST_DIR)/mai2/launch.bat \
|
||||||
$(BUILD_DIR_ZIP)/mai2
|
$(BUILD_DIR_ZIP)/mai2
|
||||||
$(V)cp pki/billing.pub \
|
$(V)cp pki/billing.pub \
|
||||||
pki/ca.crt \
|
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
|
||||||
$(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/start.bat \
|
$(DIST_DIR)/cm/launch.bat \
|
||||||
$(BUILD_DIR_ZIP)/cm
|
$(BUILD_DIR_ZIP)/cm
|
||||||
$(V)cp pki/billing.pub \
|
$(V)cp pki/billing.pub \
|
||||||
pki/ca.crt \
|
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
|
||||||
$(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/start.bat \
|
$(DIST_DIR)/tokyo/launch.bat \
|
||||||
$(BUILD_DIR_ZIP)/tokyo
|
$(BUILD_DIR_ZIP)/tokyo
|
||||||
$(V)cp pki/billing.pub \
|
$(V)cp pki/billing.pub \
|
||||||
pki/ca.crt \
|
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
|
||||||
$(V)mkdir -p $(BUILD_DIR_ZIP)/kemono/DEVICE
|
$(V)mkdir -p $(BUILD_DIR_ZIP)/kemono/DEVICE
|
||||||
$(V)cp $(DIST_DIR)/kemono/segatools.ini \
|
$(V)cp $(DIST_DIR)/kemono/segatools.ini \
|
||||||
$(DIST_DIR)/kemono/start.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-08-20`
|
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
|
||||||
|
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
|
|
||||||
#include "util/crc.h"
|
#include "util/crc.h"
|
||||||
#include "util/dprintf.h"
|
#include "util/dprintf.h"
|
||||||
|
#include "util/env.h"
|
||||||
|
|
||||||
struct aime_io_config {
|
struct aime_io_config {
|
||||||
wchar_t aime_path[MAX_PATH];
|
wchar_t aime_path[MAX_PATH];
|
||||||
@ -222,7 +223,7 @@ uint16_t aime_io_get_api_version(void)
|
|||||||
|
|
||||||
HRESULT aime_io_init(void)
|
HRESULT aime_io_init(void)
|
||||||
{
|
{
|
||||||
aime_io_config_read(&aime_io_cfg, L".\\segatools.ini");
|
aime_io_config_read(&aime_io_cfg, get_config_path());
|
||||||
|
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
@ -3,7 +3,6 @@ aimeio_lib = static_library(
|
|||||||
name_prefix : '',
|
name_prefix : '',
|
||||||
include_directories: inc,
|
include_directories: inc,
|
||||||
implicit_include_directories : false,
|
implicit_include_directories : false,
|
||||||
c_pch : '../precompiled.h',
|
|
||||||
link_with : [
|
link_with : [
|
||||||
util_lib,
|
util_lib,
|
||||||
],
|
],
|
@ -1,10 +1,11 @@
|
|||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <devioctl.h>
|
#include <devioctl.h>
|
||||||
#include <ntdddisk.h>
|
#include <winioctl.h>
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "amex/ds.h"
|
#include "amex/ds.h"
|
||||||
@ -19,13 +20,11 @@
|
|||||||
#include "util/dprintf.h"
|
#include "util/dprintf.h"
|
||||||
#include "util/str.h"
|
#include "util/str.h"
|
||||||
|
|
||||||
#pragma pack(push, 1)
|
#define DS_IOCTL_GET_ABI_VERSION CTL_CODE(0x8000, 0x800, METHOD_BUFFERED, FILE_READ_ACCESS)
|
||||||
|
#define DS_IOCTL_SETUP CTL_CODE(0x8000, 0x801, METHOD_BUFFERED, FILE_READ_ACCESS)
|
||||||
|
#define DS_IOCTL_READ_SECTOR CTL_CODE(0x8000, 0x804, METHOD_BUFFERED, FILE_READ_ACCESS)
|
||||||
|
|
||||||
enum {
|
#pragma pack(push, 1)
|
||||||
DS_IOCTL_GET_ABI_VERSION = 0x80006000,
|
|
||||||
DS_IOCTL_SETUP = 0x80006004,
|
|
||||||
DS_IOCTL_READ_SECTOR = 0x80006010,
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ds_eeprom {
|
struct ds_eeprom {
|
||||||
uint32_t crc32;
|
uint32_t crc32;
|
@ -6,7 +6,7 @@
|
|||||||
#include <winnt.h>
|
#include <winnt.h>
|
||||||
#endif
|
#endif
|
||||||
#include <devioctl.h>
|
#include <devioctl.h>
|
||||||
#include <ntdddisk.h>
|
#include <winioctl.h>
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
@ -20,9 +20,7 @@
|
|||||||
#include "util/dprintf.h"
|
#include "util/dprintf.h"
|
||||||
#include "util/str.h"
|
#include "util/str.h"
|
||||||
|
|
||||||
enum {
|
#define EEPROM_IOCTL_GET_ABI_VERSION CTL_CODE(0x8000, 0x800, METHOD_BUFFERED, FILE_READ_ACCESS)
|
||||||
EEPROM_IOCTL_GET_ABI_VERSION = 0x80006000,
|
|
||||||
};
|
|
||||||
|
|
||||||
static HRESULT eeprom_handle_irp(struct irp *irp);
|
static HRESULT eeprom_handle_irp(struct irp *irp);
|
||||||
static HRESULT eeprom_handle_open(struct irp *irp);
|
static HRESULT eeprom_handle_open(struct irp *irp);
|
@ -1,5 +1,5 @@
|
|||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <ntstatus.h>
|
#include <winioctl.h>
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@ -13,12 +13,10 @@
|
|||||||
#include "util/dprintf.h"
|
#include "util/dprintf.h"
|
||||||
#include "util/str.h"
|
#include "util/str.h"
|
||||||
|
|
||||||
enum {
|
#define GPIO_IOCTL_SET_LEDS CTL_CODE(0x8000, 0x801, METHOD_BUFFERED, FILE_WRITE_ACCESS)
|
||||||
GPIO_IOCTL_SET_LEDS = 0x8000A004,
|
#define GPIO_IOCTL_GET_PSW CTL_CODE(0x8000, 0x802, METHOD_BUFFERED, FILE_READ_ACCESS)
|
||||||
GPIO_IOCTL_GET_PSW = 0x80006008,
|
#define GPIO_IOCTL_GET_DIPSW CTL_CODE(0x8000, 0x803, METHOD_BUFFERED, FILE_READ_ACCESS)
|
||||||
GPIO_IOCTL_GET_DIPSW = 0x8000600C,
|
#define GPIO_IOCTL_DESCRIBE CTL_CODE(0x8000, 0x805, METHOD_BUFFERED, FILE_READ_ACCESS)
|
||||||
GPIO_IOCTL_DESCRIBE = 0x80006014,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
GPIO_TYPE_NONE = 0,
|
GPIO_TYPE_NONE = 0,
|
@ -4,6 +4,7 @@
|
|||||||
#include <winternl.h>
|
#include <winternl.h>
|
||||||
|
|
||||||
#include <ntstatus.h>
|
#include <ntstatus.h>
|
||||||
|
#include <winioctl.h>
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
@ -21,11 +22,9 @@
|
|||||||
#include "util/dump.h"
|
#include "util/dump.h"
|
||||||
#include "util/str.h"
|
#include "util/str.h"
|
||||||
|
|
||||||
enum {
|
#define JVS_IOCTL_HELLO CTL_CODE(0x8000, 0x801, METHOD_BUFFERED, FILE_READ_ACCESS)
|
||||||
JVS_IOCTL_HELLO = 0x80006004,
|
#define JVS_IOCTL_TRANSACT CTL_CODE(0x8000, 0x802, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
|
||||||
JVS_IOCTL_SENSE = 0x8000600C,
|
#define JVS_IOCTL_SENSE CTL_CODE(0x8000, 0x803, METHOD_BUFFERED, FILE_READ_ACCESS)
|
||||||
JVS_IOCTL_TRANSACT = 0x8000E008,
|
|
||||||
};
|
|
||||||
|
|
||||||
static HRESULT jvs_handle_irp(struct irp *irp);
|
static HRESULT jvs_handle_irp(struct irp *irp);
|
||||||
static HRESULT jvs_handle_open(struct irp *irp);
|
static HRESULT jvs_handle_open(struct irp *irp);
|
@ -2,7 +2,6 @@ amex_lib = static_library(
|
|||||||
'amex',
|
'amex',
|
||||||
include_directories : inc,
|
include_directories : inc,
|
||||||
implicit_include_directories : false,
|
implicit_include_directories : false,
|
||||||
c_pch : '../precompiled.h',
|
|
||||||
dependencies : [
|
dependencies : [
|
||||||
capnhook.get_variable('hook_dep'),
|
capnhook.get_variable('hook_dep'),
|
||||||
],
|
],
|
@ -6,7 +6,7 @@
|
|||||||
#include <winnt.h>
|
#include <winnt.h>
|
||||||
#endif
|
#endif
|
||||||
#include <devioctl.h>
|
#include <devioctl.h>
|
||||||
#include <ntdddisk.h>
|
#include <winioctl.h>
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
@ -20,9 +20,7 @@
|
|||||||
#include "util/dprintf.h"
|
#include "util/dprintf.h"
|
||||||
#include "util/str.h"
|
#include "util/str.h"
|
||||||
|
|
||||||
enum {
|
#define SRAM_IOCTL_GET_ABI_VERSION CTL_CODE(0x8000, 0x800, METHOD_BUFFERED, FILE_READ_ACCESS)
|
||||||
SRAM_IOCTL_GET_ABI_VERSION = 0x80006000,
|
|
||||||
};
|
|
||||||
|
|
||||||
static HRESULT sram_handle_irp(struct irp *irp);
|
static HRESULT sram_handle_irp(struct irp *irp);
|
||||||
static HRESULT sram_handle_open(struct irp *irp);
|
static HRESULT sram_handle_open(struct irp *irp);
|
@ -1,6 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
#include "aimeio/aimeio.h"
|
#include "aimeio/aimeio.h"
|
||||||
|
|
@ -72,8 +72,18 @@ void aime_config_load(struct aime_config *cfg, const wchar_t *filename)
|
|||||||
|
|
||||||
aime_dll_config_load(&cfg->dll, filename);
|
aime_dll_config_load(&cfg->dll, filename);
|
||||||
cfg->enable = GetPrivateProfileIntW(L"aime", L"enable", 1, 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->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)
|
||||||
@ -90,7 +100,7 @@ void vfd_config_load(struct vfd_config *cfg, const wchar_t *filename)
|
|||||||
assert(filename != NULL);
|
assert(filename != NULL);
|
||||||
|
|
||||||
cfg->enable = GetPrivateProfileIntW(L"vfd", L"enable", 1, filename);
|
cfg->enable = GetPrivateProfileIntW(L"vfd", L"enable", 1, filename);
|
||||||
cfg->port = GetPrivateProfileIntW(L"vfd", L"portNo", 0, filename);
|
cfg->port_no = GetPrivateProfileIntW(L"vfd", L"portNo", 0, filename);
|
||||||
cfg->utf_conversion = GetPrivateProfileIntW(L"vfd", L"utfConversion", 0, filename);
|
cfg->utf_conversion = GetPrivateProfileIntW(L"vfd", L"utfConversion", 0, filename);
|
||||||
}
|
}
|
||||||
|
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
struct ffb_config {
|
struct ffb_config {
|
||||||
bool enable;
|
bool enable;
|
@ -16,6 +16,7 @@
|
|||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include "board/io3.h"
|
#include "board/io3.h"
|
||||||
|
|
@ -7,6 +7,7 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include "board/config.h"
|
#include "board/config.h"
|
||||||
#include "board/guid.h"
|
#include "board/guid.h"
|
@ -3,6 +3,7 @@
|
|||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
#define IO4_REPORT_OUT_PAYLOAD_LEN 62
|
#define IO4_REPORT_OUT_PAYLOAD_LEN 62
|
||||||
|
|
@ -13,6 +13,7 @@
|
|||||||
#include <process.h>
|
#include <process.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
@ -102,19 +103,30 @@ HRESULT led15070_hook_init(
|
|||||||
io_led_set_fet_output_t _led_set_fet_output,
|
io_led_set_fet_output_t _led_set_fet_output,
|
||||||
io_led_dc_update_t _led_dc_update,
|
io_led_dc_update_t _led_dc_update,
|
||||||
io_led_gs_update_t _led_gs_update,
|
io_led_gs_update_t _led_gs_update,
|
||||||
unsigned int first_port,
|
unsigned int port_no[2])
|
||||||
unsigned int num_boards)
|
|
||||||
{
|
{
|
||||||
|
unsigned int num_boards = 0;
|
||||||
|
|
||||||
assert(cfg != NULL);
|
assert(cfg != NULL);
|
||||||
|
assert(_led_init != NULL);
|
||||||
|
|
||||||
if (!cfg->enable) {
|
if (!cfg->enable) {
|
||||||
return S_FALSE;
|
return S_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cfg->port_no != 0) {
|
for (int i = 0; i < led15070_nboards; i++)
|
||||||
first_port = cfg->port_no;
|
{
|
||||||
|
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_init = _led_init;
|
||||||
led_set_fet_output = _led_set_fet_output;
|
led_set_fet_output = _led_set_fet_output;
|
||||||
led_dc_update = _led_dc_update;
|
led_dc_update = _led_dc_update;
|
||||||
@ -130,10 +142,7 @@ HRESULT led15070_hook_init(
|
|||||||
|
|
||||||
InitializeCriticalSection(&v->lock);
|
InitializeCriticalSection(&v->lock);
|
||||||
|
|
||||||
// TODO: IMPROVE!
|
uart_init(&v->boarduart, port_no[i]);
|
||||||
first_port = i == 1 ? first_port + 2 : first_port;
|
|
||||||
|
|
||||||
uart_init(&v->boarduart, first_port);
|
|
||||||
v->boarduart.baud.BaudRate = 115200;
|
v->boarduart.baud.BaudRate = 115200;
|
||||||
v->boarduart.written.bytes = v->written_bytes;
|
v->boarduart.written.bytes = v->written_bytes;
|
||||||
v->boarduart.written.nbytes = sizeof(v->written_bytes);
|
v->boarduart.written.nbytes = sizeof(v->written_bytes);
|
||||||
@ -237,12 +246,12 @@ static HRESULT led15070_handle_irp_locked(int board, struct irp *irp)
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
#if 0
|
#if defined(LOG_LED15070)
|
||||||
dprintf("TX Buffer:\n");
|
dprintf("TX Buffer:\n");
|
||||||
dump_iobuf(&boarduart->written);
|
dump_iobuf(&boarduart->written);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
req_iobuf.bytes = (byte*)&req;
|
req_iobuf.bytes = (uint8_t*)&req;
|
||||||
req_iobuf.nbytes = sizeof(req.hdr) + sizeof(req.cmd) + sizeof(req.payload);
|
req_iobuf.nbytes = sizeof(req.hdr) + sizeof(req.cmd) + sizeof(req.payload);
|
||||||
req_iobuf.pos = 0;
|
req_iobuf.pos = 0;
|
||||||
|
|
||||||
@ -256,7 +265,7 @@ static HRESULT led15070_handle_irp_locked(int board, struct irp *irp)
|
|||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
#if defined(LOG_LED15070)
|
||||||
dprintf("Deframe Buffer:\n");
|
dprintf("Deframe Buffer:\n");
|
||||||
dump_iobuf(&req_iobuf);
|
dump_iobuf(&req_iobuf);
|
||||||
#endif
|
#endif
|
||||||
@ -384,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)
|
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);
|
dprintf("LED 15070: Set input (board %u)\n", board);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (!led15070_per_board_vars[board].enable_response)
|
if (!led15070_per_board_vars[board].enable_response)
|
||||||
return S_OK;
|
return S_OK;
|
||||||
@ -407,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)
|
static HRESULT led15070_req_set_normal_12bit(int board, const struct led15070_req_any *req)
|
||||||
{
|
{
|
||||||
uint8_t idx = req->payload[0];
|
uint8_t idx = req->payload[0];
|
||||||
|
#if defined(LOG_LED15070)
|
||||||
dprintf("LED 15070: Set LED - Normal 12bit (board %u, index %u)\n",
|
dprintf("LED 15070: Set LED - Normal 12bit (board %u, index %u)\n",
|
||||||
board, idx);
|
board, idx);
|
||||||
|
#endif
|
||||||
|
|
||||||
// TODO: Data for this command. Seen with Carol
|
// TODO: Data for this command. Seen with Carol
|
||||||
|
|
||||||
@ -434,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)
|
static HRESULT led15070_req_set_normal_8bit(int board, const struct led15070_req_any *req)
|
||||||
{
|
{
|
||||||
uint8_t idx = req->payload[0];
|
uint8_t idx = req->payload[0];
|
||||||
|
#if defined(LOG_LED15070)
|
||||||
// dprintf("LED 15070: Set LED - Normal 8bit (board %u, index %u)\n",
|
dprintf("LED 15070: Set LED - Normal 8bit (board %u, index %u)\n",
|
||||||
// board, idx);
|
board, idx);
|
||||||
|
#endif
|
||||||
|
|
||||||
led15070_per_board_vars[board].gs[idx][0] = req->payload[1]; // R
|
led15070_per_board_vars[board].gs[idx][0] = req->payload[1]; // R
|
||||||
led15070_per_board_vars[board].gs[idx][1] = req->payload[2]; // G
|
led15070_per_board_vars[board].gs[idx][1] = req->payload[2]; // G
|
||||||
@ -467,8 +480,10 @@ static HRESULT led15070_req_set_multi_flash_8bit(int board, const struct led1507
|
|||||||
uint8_t idx_skip = req->payload[2];
|
uint8_t idx_skip = req->payload[2];
|
||||||
|
|
||||||
// TODO: useful?
|
// TODO: useful?
|
||||||
// dprintf("LED 15070: Set LED - Multi flash 8bit (board %u, start %u, end %u, skip %u)\n",
|
#if defined(LOG_LED15070)
|
||||||
// board, idx_start, idx_end, idx_skip);
|
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)) {
|
if (idx_skip > 0 && idx_skip <= (idx_end - idx_start + 1)) {
|
||||||
idx_start += idx_skip;
|
idx_start += idx_skip;
|
||||||
@ -507,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_start = req->payload[0];
|
||||||
uint8_t idx_end = req->payload[1];
|
uint8_t idx_end = req->payload[1];
|
||||||
uint8_t idx_skip = req->payload[2];
|
uint8_t idx_skip = req->payload[2];
|
||||||
|
#if defined(LOG_LED15070)
|
||||||
// dprintf("LED 15070: Set LED - Multi fade 8bit (board %u, start %u, end %u, skip %u)\n",
|
dprintf("LED 15070: Set LED - Multi fade 8bit (board %u, start %u, end %u, skip %u)\n",
|
||||||
// board, idx_start, idx_end, idx_skip);
|
board, idx_start, idx_end, idx_skip);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (idx_skip > 0 && idx_skip <= (idx_end - idx_start + 1)) {
|
if (idx_skip > 0 && idx_skip <= (idx_end - idx_start + 1)) {
|
||||||
idx_start += idx_skip;
|
idx_start += idx_skip;
|
||||||
@ -544,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)
|
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);
|
dprintf("LED 15070: Set palette - 7 Normal LED (board %u)\n", board);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (!led15070_per_board_vars[board].enable_response)
|
if (!led15070_per_board_vars[board].enable_response)
|
||||||
return S_OK;
|
return S_OK;
|
||||||
@ -566,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)
|
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);
|
dprintf("LED 15070: Set palette - 6 Flash LED (board %u)\n", board);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (!led15070_per_board_vars[board].enable_response)
|
if (!led15070_per_board_vars[board].enable_response)
|
||||||
return S_OK;
|
return S_OK;
|
||||||
@ -588,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)
|
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);
|
dprintf("LED 15070: Set 15DC out (board %u)\n", board);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (!led15070_per_board_vars[board].enable_response)
|
if (!led15070_per_board_vars[board].enable_response)
|
||||||
return S_OK;
|
return S_OK;
|
||||||
@ -610,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)
|
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);
|
dprintf("LED 15070: Set 15GS out (board %u)\n", board);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (!led15070_per_board_vars[board].enable_response)
|
if (!led15070_per_board_vars[board].enable_response)
|
||||||
return S_OK;
|
return S_OK;
|
||||||
@ -632,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)
|
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);
|
dprintf("LED 15070: Set PSC max (board %u)\n", board);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (!led15070_per_board_vars[board].enable_response)
|
if (!led15070_per_board_vars[board].enable_response)
|
||||||
return S_OK;
|
return S_OK;
|
||||||
@ -654,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)
|
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);
|
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[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[1] = req->payload[1]; // G or FET1 intensity
|
||||||
led15070_per_board_vars[board].fet[2] = req->payload[2]; // B or FET2 intensity
|
led15070_per_board_vars[board].fet[2] = req->payload[2]; // B or FET2 intensity
|
||||||
|
|
||||||
if (led_set_fet_output)
|
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)
|
if (!led15070_per_board_vars[board].enable_response)
|
||||||
return S_OK;
|
return S_OK;
|
||||||
@ -684,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)
|
static HRESULT led15070_req_set_gs_palette(int board, const struct led15070_req_any *req)
|
||||||
{
|
{
|
||||||
uint8_t idx = req->payload[0];
|
uint8_t idx = req->payload[0];
|
||||||
|
#if defined(LOG_LED15070)
|
||||||
dprintf("LED 15070: Set GS palette (board %u, index %u)\n", board, idx);
|
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][0] = req->payload[1]; // R
|
||||||
led15070_per_board_vars[board].gs_palette[idx][1] = req->payload[2]; // G
|
led15070_per_board_vars[board].gs_palette[idx][1] = req->payload[2]; // G
|
||||||
@ -711,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)
|
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)
|
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)
|
if (!led15070_per_board_vars[board].enable_response)
|
||||||
return S_OK;
|
return S_OK;
|
||||||
@ -736,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)
|
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)
|
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)
|
if (!led15070_per_board_vars[board].enable_response)
|
||||||
return S_OK;
|
return S_OK;
|
||||||
@ -761,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)
|
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);
|
dprintf("LED 15070: Rotate (board %u)\n", board);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (!led15070_per_board_vars[board].enable_response)
|
if (!led15070_per_board_vars[board].enable_response)
|
||||||
return S_OK;
|
return S_OK;
|
||||||
@ -786,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_start = req->payload[0];
|
||||||
uint8_t idx_end = req->payload[1];
|
uint8_t idx_end = req->payload[1];
|
||||||
uint8_t idx_skip = req->payload[2];
|
uint8_t idx_skip = req->payload[2];
|
||||||
|
#if defined(LOG_LED15070)
|
||||||
// dprintf("LED 15070: Set DC data (board %u, start %u, end %u, skip %u)\n",
|
dprintf("LED 15070: Set DC data (board %u, start %u, end %u, skip %u)\n",
|
||||||
// board, idx_start, idx_end, idx_skip);
|
board, idx_start, idx_end, idx_skip);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (idx_skip > 0 && idx_skip <= (idx_end - idx_start + 1)) {
|
if (idx_skip > 0 && idx_skip <= (idx_end - idx_start + 1)) {
|
||||||
idx_start += idx_skip;
|
idx_start += idx_skip;
|
||||||
@ -828,9 +864,10 @@ static HRESULT led15070_req_eeprom_write(int board, const struct led15070_req_an
|
|||||||
|
|
||||||
uint8_t addr = req->payload[0];
|
uint8_t addr = req->payload[0];
|
||||||
uint8_t data = req->payload[1];
|
uint8_t data = req->payload[1];
|
||||||
|
#if defined(LOG_LED15070)
|
||||||
dprintf("LED 15070: EEPROM write (board %u, address %02x, data %02x)\n",
|
dprintf("LED 15070: EEPROM write (board %u, address %02x, data %02x)\n",
|
||||||
board, addr, data);
|
board, addr, data);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (addr > 0x07) {
|
if (addr > 0x07) {
|
||||||
dprintf("LED 15070: Error -- Invalid EEPROM write address %02x\n",
|
dprintf("LED 15070: Error -- Invalid EEPROM write address %02x\n",
|
||||||
@ -918,8 +955,9 @@ static HRESULT led15070_req_eeprom_read(int board, const struct led15070_req_any
|
|||||||
|
|
||||||
uint8_t addr = req->payload[0];
|
uint8_t addr = req->payload[0];
|
||||||
uint8_t data = 0;
|
uint8_t data = 0;
|
||||||
|
#if defined(LOG_LED15070)
|
||||||
dprintf("LED 15070: EEPROM read (board %u, address %02x)\n", board, addr);
|
dprintf("LED 15070: EEPROM read (board %u, address %02x)\n", board, addr);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (addr > 0x07) {
|
if (addr > 0x07) {
|
||||||
dprintf("LED 15070: Error -- Invalid EEPROM read address %02x\n",
|
dprintf("LED 15070: Error -- Invalid EEPROM read address %02x\n",
|
||||||
@ -1001,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)
|
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);
|
dprintf("LED 15070: Acknowledge commands ON (board %u)\n", board);
|
||||||
|
#endif
|
||||||
|
|
||||||
led15070_per_board_vars[board].enable_response = true;
|
led15070_per_board_vars[board].enable_response = true;
|
||||||
|
|
||||||
@ -1022,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)
|
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);
|
dprintf("LED 15070: Acknowledge commands OFF (board %u)\n", board);
|
||||||
|
#endif
|
||||||
|
|
||||||
led15070_per_board_vars[board].enable_response = false;
|
led15070_per_board_vars[board].enable_response = false;
|
||||||
|
|
||||||
@ -1043,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)
|
static HRESULT led15070_req_board_info(int board)
|
||||||
{
|
{
|
||||||
|
#if defined(LOG_LED15070)
|
||||||
dprintf("LED 15070: Get board info (board %u)\n", board);
|
dprintf("LED 15070: Get board info (board %u)\n", board);
|
||||||
|
#endif
|
||||||
|
|
||||||
struct led15070_resp_board_info resp;
|
struct led15070_resp_board_info resp;
|
||||||
|
|
||||||
@ -1066,7 +1110,9 @@ static HRESULT led15070_req_board_info(int board)
|
|||||||
|
|
||||||
static HRESULT led15070_req_board_status(int board)
|
static HRESULT led15070_req_board_status(int board)
|
||||||
{
|
{
|
||||||
|
#if defined(LOG_LED15070)
|
||||||
dprintf("LED 15070: Get board status (board %u)\n", board);
|
dprintf("LED 15070: Get board status (board %u)\n", board);
|
||||||
|
#endif
|
||||||
|
|
||||||
struct led15070_resp_any resp;
|
struct led15070_resp_any resp;
|
||||||
|
|
||||||
@ -1090,7 +1136,9 @@ static HRESULT led15070_req_board_status(int board)
|
|||||||
|
|
||||||
static HRESULT led15070_req_fw_sum(int board)
|
static HRESULT led15070_req_fw_sum(int board)
|
||||||
{
|
{
|
||||||
|
#if defined(LOG_LED15070)
|
||||||
dprintf("LED 15070: Get firmware checksum (board %u)\n", board);
|
dprintf("LED 15070: Get firmware checksum (board %u)\n", board);
|
||||||
|
#endif
|
||||||
|
|
||||||
struct led15070_resp_any resp;
|
struct led15070_resp_any resp;
|
||||||
|
|
||||||
@ -1112,7 +1160,9 @@ static HRESULT led15070_req_fw_sum(int board)
|
|||||||
|
|
||||||
static HRESULT led15070_req_protocol_ver(int board)
|
static HRESULT led15070_req_protocol_ver(int board)
|
||||||
{
|
{
|
||||||
|
#if defined(LOG_LED15070)
|
||||||
dprintf("LED 15070: Get protocol version (board %u)\n", board);
|
dprintf("LED 15070: Get protocol version (board %u)\n", board);
|
||||||
|
#endif
|
||||||
|
|
||||||
struct led15070_resp_any resp;
|
struct led15070_resp_any resp;
|
||||||
|
|
||||||
@ -1186,7 +1236,7 @@ static HRESULT led15070_eeprom_open(int board, wchar_t *path, HANDLE *handle)
|
|||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
BOOL ok;
|
BOOL ok;
|
||||||
|
|
||||||
#if 0
|
#if defined(LOG_LED15070)
|
||||||
dprintf("LED 15070: Opening EEPROM file '%S' handle (board %u)\n", path, board);
|
dprintf("LED 15070: Opening EEPROM file '%S' handle (board %u)\n", path, board);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -1232,7 +1282,7 @@ static HRESULT led15070_eeprom_close(int board, wchar_t *path, HANDLE *handle)
|
|||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
BOOL ok;
|
BOOL ok;
|
||||||
|
|
||||||
#if 0
|
#if defined(LOG_LED15070)
|
||||||
dprintf("LED 15070: Closing EEPROM file '%S' handle (board %u)\n", path, board);
|
dprintf("LED 15070: Closing EEPROM file '%S' handle (board %u)\n", path, board);
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
struct led15070_config {
|
struct led15070_config {
|
||||||
bool enable;
|
bool enable;
|
||||||
unsigned int port_no;
|
unsigned int port_no[2];
|
||||||
char board_number[8];
|
char board_number[8];
|
||||||
uint8_t fw_ver;
|
uint8_t fw_ver;
|
||||||
uint16_t fw_sum;
|
uint16_t fw_sum;
|
||||||
@ -15,9 +15,9 @@ struct led15070_config {
|
|||||||
};
|
};
|
||||||
|
|
||||||
typedef HRESULT (*io_led_init_t)(void);
|
typedef HRESULT (*io_led_init_t)(void);
|
||||||
typedef void (*io_led_set_fet_output_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)(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)(const uint8_t *rgb);
|
typedef void (*io_led_gs_update_t)(uint8_t board, const uint8_t *rgb);
|
||||||
|
|
||||||
HRESULT led15070_hook_init(
|
HRESULT led15070_hook_init(
|
||||||
const struct led15070_config *cfg,
|
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_set_fet_output_t _led_set_fet_output,
|
||||||
io_led_dc_update_t _led_dc_update,
|
io_led_dc_update_t _led_dc_update,
|
||||||
io_led_gs_update_t _led_gs_update,
|
io_led_gs_update_t _led_gs_update,
|
||||||
unsigned int first_port,
|
unsigned int port_no[2]);
|
||||||
unsigned int num_boards);
|
|
@ -88,7 +88,7 @@ struct led15093_req_reset {
|
|||||||
struct led15093_req_set_timeout {
|
struct led15093_req_set_timeout {
|
||||||
struct led15093_req_hdr hdr;
|
struct led15093_req_hdr hdr;
|
||||||
uint8_t cmd;
|
uint8_t cmd;
|
||||||
uint8_t count;
|
uint16_t count;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct led15093_req_set_disable_response {
|
struct led15093_req_set_disable_response {
|
@ -20,6 +20,7 @@
|
|||||||
#include <process.h>
|
#include <process.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "board/led15093-cmd.h"
|
#include "board/led15093-cmd.h"
|
||||||
@ -106,9 +107,13 @@ static uint8_t led15093_host_adr = 1;
|
|||||||
static io_led_init_t led_init;
|
static io_led_init_t led_init;
|
||||||
static io_led_set_leds_t set_leds;
|
static io_led_set_leds_t set_leds;
|
||||||
|
|
||||||
HRESULT led15093_hook_init(const struct led15093_config *cfg, io_led_init_t _led_init,
|
HRESULT led15093_hook_init(
|
||||||
io_led_set_leds_t _set_leds, unsigned int first_port, unsigned int num_boards, uint8_t board_adr, uint8_t host_adr)
|
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(cfg != NULL);
|
||||||
assert(_led_init != NULL);
|
assert(_led_init != NULL);
|
||||||
@ -118,14 +123,24 @@ HRESULT led15093_hook_init(const struct led15093_config *cfg, io_led_init_t _led
|
|||||||
return S_FALSE;
|
return S_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cfg->port_no != 0) {
|
for (int i = 0; i < led15093_nboards; i++)
|
||||||
first_port = cfg->port_no;
|
{
|
||||||
|
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;
|
led_init = _led_init;
|
||||||
set_leds = _set_leds;
|
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_board_num, cfg->board_number, sizeof(led15093_board_num));
|
||||||
memcpy(led15093_chip_num, cfg->chip_number, sizeof(led15093_chip_num));
|
memcpy(led15093_chip_num, cfg->chip_number, sizeof(led15093_chip_num));
|
||||||
@ -139,7 +154,7 @@ HRESULT led15093_hook_init(const struct led15093_config *cfg, io_led_init_t _led
|
|||||||
|
|
||||||
InitializeCriticalSection(&vb->lock);
|
InitializeCriticalSection(&vb->lock);
|
||||||
|
|
||||||
uart_init(&vb->boarduart, first_port + i);
|
uart_init(&vb->boarduart, port_no[i]);
|
||||||
if (cfg->high_baudrate) {
|
if (cfg->high_baudrate) {
|
||||||
vb->boarduart.baud.BaudRate = 460800;
|
vb->boarduart.baud.BaudRate = 460800;
|
||||||
} else {
|
} else {
|
||||||
@ -208,7 +223,6 @@ static HRESULT led15093_handle_irp_locked(int board, struct irp *irp)
|
|||||||
_led15093_per_board_vars *v = &led15093_per_board_vars[board];
|
_led15093_per_board_vars *v = &led15093_per_board_vars[board];
|
||||||
struct uart *boarduart = &led15093_per_board_vars[board].boarduart;
|
struct uart *boarduart = &led15093_per_board_vars[board].boarduart;
|
||||||
|
|
||||||
/*
|
|
||||||
if (irp->op == IRP_OP_OPEN) {
|
if (irp->op == IRP_OP_OPEN) {
|
||||||
// Unfortunately the LED board UART gets opened and closed repeatedly
|
// Unfortunately the LED board UART gets opened and closed repeatedly
|
||||||
|
|
||||||
@ -235,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);
|
hr = uart_handle_irp(boarduart, irp);
|
||||||
|
|
||||||
@ -272,7 +262,7 @@ static HRESULT led15093_handle_irp_locked(int board, struct irp *irp)
|
|||||||
dump_iobuf(&boarduart->written);
|
dump_iobuf(&boarduart->written);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
req_iobuf.bytes = (byte*)&req;
|
req_iobuf.bytes = (uint8_t*)&req;
|
||||||
req_iobuf.nbytes = sizeof(req.hdr) + sizeof(req.payload);
|
req_iobuf.nbytes = sizeof(req.hdr) + sizeof(req.payload);
|
||||||
req_iobuf.pos = 0;
|
req_iobuf.pos = 0;
|
||||||
|
|
||||||
@ -687,16 +677,6 @@ static HRESULT led15093_req_set_imm_led(int board, const struct led15093_req_set
|
|||||||
return E_INVALIDARG;
|
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
|
// Return the current LED data, remove const qualifier
|
||||||
set_leds(board, (uint8_t *) req->data);
|
set_leds(board, (uint8_t *) req->data);
|
||||||
|
|
@ -8,7 +8,7 @@
|
|||||||
struct led15093_config {
|
struct led15093_config {
|
||||||
bool enable;
|
bool enable;
|
||||||
bool high_baudrate;
|
bool high_baudrate;
|
||||||
unsigned int port_no;
|
unsigned int port_no[2];
|
||||||
char board_number[8];
|
char board_number[8];
|
||||||
char chip_number[5];
|
char chip_number[5];
|
||||||
char boot_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);
|
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,
|
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]);
|
||||||
|
|
@ -2,7 +2,6 @@ board_lib = static_library(
|
|||||||
'board',
|
'board',
|
||||||
include_directories : inc,
|
include_directories : inc,
|
||||||
implicit_include_directories : false,
|
implicit_include_directories : false,
|
||||||
c_pch : '../precompiled.h',
|
|
||||||
dependencies : [
|
dependencies : [
|
||||||
capnhook.get_variable('hook_dep'),
|
capnhook.get_variable('hook_dep'),
|
||||||
],
|
],
|
@ -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 */
|
||||||
@ -354,13 +361,13 @@ static HRESULT sg_nfc_poll_felica(
|
|||||||
felica->type = 0x20;
|
felica->type = 0x20;
|
||||||
felica->id_len = sizeof(felica->IDm) + sizeof(felica->PMm);
|
felica->id_len = sizeof(felica->IDm) + sizeof(felica->PMm);
|
||||||
felica->IDm = _byteswap_uint64(IDm);
|
felica->IDm = _byteswap_uint64(IDm);
|
||||||
felica->PMm = _byteswap_uint64(felica_get_generic_PMm());
|
felica->PMm = _byteswap_uint64(felica_get_amusement_ic_PMm());
|
||||||
|
|
||||||
/* Initialize FeliCa IC emulator */
|
/* Initialize FeliCa IC emulator */
|
||||||
|
|
||||||
nfc->felica.IDm = IDm;
|
nfc->felica.IDm = IDm;
|
||||||
nfc->felica.PMm = felica_get_generic_PMm();
|
nfc->felica.PMm = felica_get_amusement_ic_PMm();
|
||||||
nfc->felica.system_code = 0x0000;
|
nfc->felica.system_code = 0x88b4;
|
||||||
|
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
@ -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(
|
@ -47,7 +47,7 @@ static struct sg_led sg_reader_led;
|
|||||||
|
|
||||||
HRESULT sg_reader_hook_init(
|
HRESULT sg_reader_hook_init(
|
||||||
const struct aime_config *cfg,
|
const struct aime_config *cfg,
|
||||||
unsigned int port_no,
|
unsigned int default_port_no,
|
||||||
unsigned int gen,
|
unsigned int gen,
|
||||||
HINSTANCE self)
|
HINSTANCE self)
|
||||||
{
|
{
|
||||||
@ -66,6 +66,11 @@ HRESULT sg_reader_hook_init(
|
|||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned int port_no = cfg->port_no;
|
||||||
|
if (port_no == 0){
|
||||||
|
port_no = default_port_no;
|
||||||
|
}
|
||||||
|
|
||||||
if (cfg->gen != 0) {
|
if (cfg->gen != 0) {
|
||||||
gen = cfg->gen;
|
gen = cfg->gen;
|
||||||
}
|
}
|
||||||
@ -76,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);
|
||||||
@ -85,6 +90,7 @@ HRESULT sg_reader_hook_init(
|
|||||||
sg_reader_uart.baud.BaudRate = 38400;
|
sg_reader_uart.baud.BaudRate = 38400;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dprintf("NFC Assembly: enabling (port=%d)\n", port_no);
|
||||||
uart_init(&sg_reader_uart, port_no);
|
uart_init(&sg_reader_uart, port_no);
|
||||||
sg_reader_uart.written.bytes = sg_reader_written_bytes;
|
sg_reader_uart.written.bytes = sg_reader_written_bytes;
|
||||||
sg_reader_uart.written.nbytes = sizeof(sg_reader_written_bytes);
|
sg_reader_uart.written.nbytes = sizeof(sg_reader_written_bytes);
|
@ -9,12 +9,15 @@
|
|||||||
struct aime_config {
|
struct aime_config {
|
||||||
struct aime_dll_config dll;
|
struct aime_dll_config dll;
|
||||||
bool enable;
|
bool enable;
|
||||||
|
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(
|
||||||
const struct aime_config *cfg,
|
const struct aime_config *cfg,
|
||||||
unsigned int port_no,
|
unsigned int default_port_no,
|
||||||
unsigned int gen,
|
unsigned int gen,
|
||||||
HINSTANCE self);
|
HINSTANCE self);
|
@ -8,6 +8,7 @@
|
|||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include "board/config.h"
|
#include "board/config.h"
|
||||||
#include "board/vfd.h"
|
#include "board/vfd.h"
|
||||||
@ -50,7 +51,7 @@ HRESULT vfd_handle_create_char2(struct const_iobuf* reader, struct iobuf* writer
|
|||||||
|
|
||||||
static bool utf_enabled;
|
static bool utf_enabled;
|
||||||
|
|
||||||
HRESULT vfd_hook_init(struct vfd_config *cfg, int default_port)
|
HRESULT vfd_hook_init(struct vfd_config *cfg, unsigned int default_port_no)
|
||||||
{
|
{
|
||||||
if (!cfg->enable){
|
if (!cfg->enable){
|
||||||
return S_FALSE;
|
return S_FALSE;
|
||||||
@ -58,13 +59,13 @@ HRESULT vfd_hook_init(struct vfd_config *cfg, int default_port)
|
|||||||
|
|
||||||
utf_enabled = cfg->utf_conversion;
|
utf_enabled = cfg->utf_conversion;
|
||||||
|
|
||||||
int port = cfg->port;
|
unsigned int port_no = cfg->port_no;
|
||||||
if (port == 0){
|
if (port_no == 0){
|
||||||
port = default_port;
|
port_no = default_port_no;
|
||||||
}
|
}
|
||||||
|
|
||||||
dprintf("VFD: enabling (port=%d)\n", port);
|
dprintf("VFD: enabling (port=%d)\n", port_no);
|
||||||
uart_init(&vfd_uart, port);
|
uart_init(&vfd_uart, port_no);
|
||||||
vfd_uart.written.bytes = vfd_written;
|
vfd_uart.written.bytes = vfd_written;
|
||||||
vfd_uart.written.nbytes = sizeof(vfd_written);
|
vfd_uart.written.nbytes = sizeof(vfd_written);
|
||||||
vfd_uart.readable.bytes = vfd_readable;
|
vfd_uart.readable.bytes = vfd_readable;
|
@ -4,10 +4,10 @@
|
|||||||
|
|
||||||
struct vfd_config {
|
struct vfd_config {
|
||||||
bool enable;
|
bool enable;
|
||||||
int port;
|
unsigned int port_no;
|
||||||
bool utf_conversion;
|
bool utf_conversion;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
HRESULT vfd_hook_init(struct vfd_config *cfg, int default_port);
|
HRESULT vfd_hook_init(struct vfd_config *cfg, unsigned int default_port_no);
|
||||||
|
|
@ -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->windowed = GetPrivateProfileIntW(L"gfx", L"windowed", 0, filename);
|
||||||
cfg->framed = GetPrivateProfileIntW(L"gfx", L"framed", 1, filename);
|
cfg->framed = GetPrivateProfileIntW(L"gfx", L"framed", 1, filename);
|
||||||
cfg->monitor = GetPrivateProfileIntW(L"gfx", L"monitor", 0, filename);
|
cfg->monitor = GetPrivateProfileIntW(L"gfx", L"monitor", 0, filename);
|
||||||
|
cfg->dpiAware = GetPrivateProfileIntW(L"gfx", L"dpiAware", 1, filename);
|
||||||
}
|
}
|
147
common/gfxhook/gfx.c
Normal file
147
common/gfxhook/gfx.c
Normal file
@ -0,0 +1,147 @@
|
|||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "gfxhook/gfx.h"
|
||||||
|
|
||||||
|
#include "hook/table.h"
|
||||||
|
|
||||||
|
#include "util/dprintf.h"
|
||||||
|
|
||||||
|
/* Hook functions */
|
||||||
|
|
||||||
|
static BOOL WINAPI hook_ShowWindow(HWND hWnd, int nCmdShow);
|
||||||
|
static HWND WINAPI hook_CreateWindowExA(
|
||||||
|
DWORD dwExStyle,
|
||||||
|
LPCSTR lpClassName,
|
||||||
|
LPCSTR lpWindowName,
|
||||||
|
DWORD dwStyle,
|
||||||
|
int X,
|
||||||
|
int Y,
|
||||||
|
int nWidth,
|
||||||
|
int nHeight,
|
||||||
|
HWND hWndParent,
|
||||||
|
HMENU hMenu,
|
||||||
|
HINSTANCE hInstance,
|
||||||
|
LPVOID lpParam
|
||||||
|
);
|
||||||
|
|
||||||
|
/* Link pointers */
|
||||||
|
|
||||||
|
static BOOL (WINAPI *next_ShowWindow)(HWND hWnd, int nCmdShow);
|
||||||
|
static HWND (WINAPI *next_CreateWindowExA)(
|
||||||
|
DWORD dwExStyle,
|
||||||
|
LPCSTR lpClassName,
|
||||||
|
LPCSTR lpWindowName,
|
||||||
|
DWORD dwStyle,
|
||||||
|
int X,
|
||||||
|
int Y,
|
||||||
|
int nWidth,
|
||||||
|
int nHeight,
|
||||||
|
HWND hWndParent,
|
||||||
|
HMENU hMenu,
|
||||||
|
HINSTANCE hInstance,
|
||||||
|
LPVOID lpParam
|
||||||
|
);
|
||||||
|
|
||||||
|
static struct gfx_config gfx_config;
|
||||||
|
|
||||||
|
static const struct hook_symbol gfx_hooks[] = {
|
||||||
|
{
|
||||||
|
.name = "ShowWindow",
|
||||||
|
.patch = hook_ShowWindow,
|
||||||
|
.link = (void **) &next_ShowWindow,
|
||||||
|
}, {
|
||||||
|
.name = "CreateWindowExA",
|
||||||
|
.patch = hook_CreateWindowExA,
|
||||||
|
.link = (void **) &next_CreateWindowExA,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
void gfx_hook_init(const struct gfx_config *cfg)
|
||||||
|
{
|
||||||
|
assert(cfg != NULL);
|
||||||
|
|
||||||
|
if (!cfg->enable) {
|
||||||
|
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));
|
||||||
|
}
|
||||||
|
|
||||||
|
static BOOL WINAPI hook_ShowWindow(HWND hWnd, int nCmdShow)
|
||||||
|
{
|
||||||
|
dprintf("Gfx: ShowWindow hook hit\n");
|
||||||
|
|
||||||
|
if (!gfx_config.framed && nCmdShow == SW_RESTORE) {
|
||||||
|
nCmdShow = SW_SHOW;
|
||||||
|
}
|
||||||
|
|
||||||
|
return next_ShowWindow(hWnd, nCmdShow);
|
||||||
|
}
|
||||||
|
|
||||||
|
static HWND WINAPI hook_CreateWindowExA(
|
||||||
|
DWORD dwExStyle,
|
||||||
|
LPCSTR lpClassName,
|
||||||
|
LPCSTR lpWindowName,
|
||||||
|
DWORD dwStyle,
|
||||||
|
int X,
|
||||||
|
int Y,
|
||||||
|
int nWidth,
|
||||||
|
int nHeight,
|
||||||
|
HWND hWndParent,
|
||||||
|
HMENU hMenu,
|
||||||
|
HINSTANCE hInstance,
|
||||||
|
LPVOID lpParam
|
||||||
|
)
|
||||||
|
{
|
||||||
|
RECT rect;
|
||||||
|
|
||||||
|
dprintf("Gfx: CreateWindowExA hook hit\n");
|
||||||
|
|
||||||
|
if (gfx_config.windowed)
|
||||||
|
{
|
||||||
|
if (gfx_config.framed)
|
||||||
|
dwStyle |= WS_BORDER | WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU;
|
||||||
|
else
|
||||||
|
dwStyle = WS_POPUP;
|
||||||
|
|
||||||
|
rect.left = ((X == CW_USEDEFAULT) ? 0 : X);
|
||||||
|
rect.top = ((Y == CW_USEDEFAULT) ? 0 : Y);
|
||||||
|
rect.right = rect.left + nWidth;
|
||||||
|
rect.bottom = rect.top + nHeight;
|
||||||
|
|
||||||
|
// Don't care if it's ok or not, since we are creating window and we can't just return a NULL
|
||||||
|
AdjustWindowRect(&rect, dwStyle, !!hMenu);
|
||||||
|
|
||||||
|
X = ((X == CW_USEDEFAULT) ? X : rect.left);
|
||||||
|
Y = ((Y == CW_USEDEFAULT) ? Y : rect.top);
|
||||||
|
nWidth = rect.right - rect.left;
|
||||||
|
nHeight = rect.bottom - rect.top;
|
||||||
|
}
|
||||||
|
|
||||||
|
return next_CreateWindowExA(
|
||||||
|
dwExStyle,
|
||||||
|
lpClassName,
|
||||||
|
lpWindowName,
|
||||||
|
dwStyle,
|
||||||
|
X,
|
||||||
|
Y,
|
||||||
|
nWidth,
|
||||||
|
nHeight,
|
||||||
|
hWndParent,
|
||||||
|
hMenu,
|
||||||
|
hInstance,
|
||||||
|
lpParam
|
||||||
|
);
|
||||||
|
}
|
@ -7,6 +7,7 @@ struct gfx_config {
|
|||||||
bool windowed;
|
bool windowed;
|
||||||
bool framed;
|
bool framed;
|
||||||
int monitor;
|
int monitor;
|
||||||
|
bool dpiAware;
|
||||||
};
|
};
|
||||||
|
|
||||||
void gfx_hook_init(const struct gfx_config *cfg);
|
void gfx_hook_init(const struct gfx_config *cfg);
|
77
common/gfxhook/gl.c
Normal file
77
common/gfxhook/gl.c
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "gfxhook/gfx.h"
|
||||||
|
#include "gfxhook/gl.h"
|
||||||
|
|
||||||
|
#include "hook/table.h"
|
||||||
|
|
||||||
|
#include "hooklib/dll.h"
|
||||||
|
|
||||||
|
#include "util/dprintf.h"
|
||||||
|
|
||||||
|
/* Hook functions */
|
||||||
|
|
||||||
|
static void WINAPI hook_glutFullScreen(void);
|
||||||
|
static void WINAPI hook_glutInitDisplayMode(unsigned int mode);
|
||||||
|
|
||||||
|
/* Link pointers */
|
||||||
|
|
||||||
|
static void (WINAPI *next_glutFullScreen)(void);
|
||||||
|
static void (WINAPI *next_glutInitDisplayMode)(unsigned int mode);
|
||||||
|
|
||||||
|
static struct gfx_config gfx_config;
|
||||||
|
|
||||||
|
static const struct hook_symbol glut_hooks[] = {
|
||||||
|
{
|
||||||
|
.name = "glutFullScreen",
|
||||||
|
.patch = hook_glutFullScreen,
|
||||||
|
.link = (void **) &next_glutFullScreen,
|
||||||
|
}, {
|
||||||
|
.name = "glutInitDisplayMode",
|
||||||
|
.patch = hook_glutInitDisplayMode,
|
||||||
|
.link = (void **) &next_glutInitDisplayMode,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
void gfx_gl_hook_init(const struct gfx_config *cfg, HINSTANCE self)
|
||||||
|
{
|
||||||
|
assert(cfg != NULL);
|
||||||
|
|
||||||
|
if (!cfg->enable) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(&gfx_config, cfg, sizeof(*cfg));
|
||||||
|
hook_table_apply(NULL, "glut32.dll", glut_hooks, _countof(glut_hooks));
|
||||||
|
|
||||||
|
if (self != NULL) {
|
||||||
|
dll_hook_push(self, L"glut32.dll");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void WINAPI hook_glutFullScreen(void)
|
||||||
|
{
|
||||||
|
dprintf("Gfx: glutFullScreen hook hit\n");
|
||||||
|
|
||||||
|
if (gfx_config.windowed) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
next_glutFullScreen();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void WINAPI hook_glutInitDisplayMode(unsigned int mode)
|
||||||
|
{
|
||||||
|
dprintf("Gfx: glutInitDisplayMode hook hit\n");
|
||||||
|
|
||||||
|
// GLUT adds a frame when going windowed
|
||||||
|
if (gfx_config.windowed && !gfx_config.framed) {
|
||||||
|
// GLUT_BORDERLESS
|
||||||
|
mode |= 0x0800;
|
||||||
|
}
|
||||||
|
|
||||||
|
next_glutInitDisplayMode(mode);
|
||||||
|
}
|
3
common/gfxhook/gl.h
Normal file
3
common/gfxhook/gl.h
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
void gfx_gl_hook_init(const struct gfx_config *cfg, HINSTANCE self);
|
@ -2,7 +2,6 @@ gfxhook_lib = static_library(
|
|||||||
'gfxhook',
|
'gfxhook',
|
||||||
include_directories : inc,
|
include_directories : inc,
|
||||||
implicit_include_directories : false,
|
implicit_include_directories : false,
|
||||||
c_pch : '../precompiled.h',
|
|
||||||
dependencies : [
|
dependencies : [
|
||||||
capnhook.get_variable('hook_dep'),
|
capnhook.get_variable('hook_dep'),
|
||||||
dxguid_lib,
|
dxguid_lib,
|
||||||
@ -22,6 +21,8 @@ gfxhook_lib = static_library(
|
|||||||
'dxgi.h',
|
'dxgi.h',
|
||||||
'gfx.c',
|
'gfx.c',
|
||||||
'gfx.h',
|
'gfx.h',
|
||||||
|
'gl.c',
|
||||||
|
'gl.h',
|
||||||
'util.c',
|
'util.c',
|
||||||
'util.h',
|
'util.h',
|
||||||
],
|
],
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
#include <stdlib.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
#include "hooklib/config.h"
|
#include "hooklib/config.h"
|
||||||
@ -80,4 +81,6 @@ void printer_config_load(struct printer_config *cfg, const wchar_t *filename)
|
|||||||
cfg->printer_out_path,
|
cfg->printer_out_path,
|
||||||
_countof(cfg->printer_out_path),
|
_countof(cfg->printer_out_path),
|
||||||
filename);
|
filename);
|
||||||
|
|
||||||
|
cfg->wait_time = GetPrivateProfileIntW(L"printer", L"waitTime", 0, filename);
|
||||||
}
|
}
|
@ -3,6 +3,7 @@
|
|||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "hook/table.h"
|
#include "hook/table.h"
|
@ -3,6 +3,7 @@
|
|||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "hook/table.h"
|
#include "hook/table.h"
|
||||||
@ -13,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[] = {
|
||||||
{
|
{
|
||||||
@ -44,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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -57,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)
|
@ -8,12 +8,14 @@
|
|||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "hook/hr.h"
|
#include "hook/hr.h"
|
||||||
#include "hook/table.h"
|
#include "hook/table.h"
|
||||||
|
|
||||||
#include "util/dprintf.h"
|
#include "util/dprintf.h"
|
||||||
|
#include "util/get_function_ordinal.h"
|
||||||
|
|
||||||
#include "hooklib/dns.h"
|
#include "hooklib/dns.h"
|
||||||
|
|
||||||
@ -81,6 +83,17 @@ static bool WINAPI hook_WinHttpCrackUrl(
|
|||||||
DWORD dwFlags,
|
DWORD dwFlags,
|
||||||
LPURL_COMPONENTS lpUrlComponents);
|
LPURL_COMPONENTS lpUrlComponents);
|
||||||
|
|
||||||
|
static DWORD WINAPI hook_send(
|
||||||
|
SOCKET s,
|
||||||
|
const char* buf,
|
||||||
|
int len,
|
||||||
|
int flags);
|
||||||
|
|
||||||
|
static int WINAPI hook_connect(
|
||||||
|
SOCKET s,
|
||||||
|
const struct sockaddr *name,
|
||||||
|
int namelen);
|
||||||
|
|
||||||
/* Link pointers */
|
/* Link pointers */
|
||||||
|
|
||||||
static DNS_STATUS (WINAPI *next_DnsQuery_A)(
|
static DNS_STATUS (WINAPI *next_DnsQuery_A)(
|
||||||
@ -122,6 +135,17 @@ static bool (WINAPI *next_WinHttpCrackUrl)(
|
|||||||
DWORD dwFlags,
|
DWORD dwFlags,
|
||||||
LPURL_COMPONENTS lpUrlComponents);
|
LPURL_COMPONENTS lpUrlComponents);
|
||||||
|
|
||||||
|
static DWORD (WINAPI *next_send)(
|
||||||
|
SOCKET s,
|
||||||
|
const char* buf,
|
||||||
|
int len,
|
||||||
|
int flags);
|
||||||
|
|
||||||
|
static int (__stdcall *next_connect)(
|
||||||
|
SOCKET s,
|
||||||
|
const struct sockaddr *name,
|
||||||
|
int namelen);
|
||||||
|
|
||||||
static const struct hook_symbol dns_hook_syms_dnsapi[] = {
|
static const struct hook_symbol dns_hook_syms_dnsapi[] = {
|
||||||
{
|
{
|
||||||
.name = "DnsQuery_A",
|
.name = "DnsQuery_A",
|
||||||
@ -144,7 +168,7 @@ static const struct hook_symbol dns_hook_syms_ws2[] = {
|
|||||||
.ordinal = 176,
|
.ordinal = 176,
|
||||||
.patch = hook_getaddrinfo,
|
.patch = hook_getaddrinfo,
|
||||||
.link = (void **) &next_getaddrinfo,
|
.link = (void **) &next_getaddrinfo,
|
||||||
}
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct hook_symbol dns_hook_syms_winhttp[] = {
|
static const struct hook_symbol dns_hook_syms_winhttp[] = {
|
||||||
@ -157,7 +181,22 @@ static const struct hook_symbol dns_hook_syms_winhttp[] = {
|
|||||||
.patch = hook_WinHttpCrackUrl,
|
.patch = hook_WinHttpCrackUrl,
|
||||||
.link = (void **) &next_WinHttpCrackUrl,
|
.link = (void **) &next_WinHttpCrackUrl,
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct hook_symbol http_hook_syms_ws2[] = {
|
||||||
|
{
|
||||||
|
.name = "send",
|
||||||
|
.patch = hook_send,
|
||||||
|
.link = (void **) &next_send
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct hook_symbol port_hook_syms_ws2[] = {
|
||||||
|
{
|
||||||
|
.name = "connect",
|
||||||
|
.patch = hook_connect,
|
||||||
|
.link = (void **) &next_connect
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
static bool dns_hook_initted;
|
static bool dns_hook_initted;
|
||||||
@ -165,6 +204,9 @@ static CRITICAL_SECTION dns_hook_lock;
|
|||||||
static struct dns_hook_entry *dns_hook_entries;
|
static struct dns_hook_entry *dns_hook_entries;
|
||||||
static size_t dns_hook_nentries;
|
static size_t dns_hook_nentries;
|
||||||
static char received_title_url[255];
|
static char received_title_url[255];
|
||||||
|
static unsigned short startup_port;
|
||||||
|
static unsigned short billing_port;
|
||||||
|
static unsigned short aimedb_port;
|
||||||
|
|
||||||
static void dns_hook_init(void)
|
static void dns_hook_init(void)
|
||||||
{
|
{
|
||||||
@ -175,25 +217,56 @@ 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));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void http_hook_init(){
|
||||||
|
for (size_t i = 0; i < _countof(http_hook_syms_ws2); ++i) {
|
||||||
|
http_hook_syms_ws2[i].ordinal = get_function_ordinal("ws2_32.dll", http_hook_syms_ws2[i].name);
|
||||||
|
}
|
||||||
|
|
||||||
|
hook_table_apply(
|
||||||
|
NULL,
|
||||||
|
"ws2_32.dll",
|
||||||
|
http_hook_syms_ws2,
|
||||||
|
_countof(http_hook_syms_ws2));
|
||||||
|
}
|
||||||
|
|
||||||
|
void port_hook_init(unsigned short _startup_port, unsigned short _billing_port, unsigned short _aimedb_port){
|
||||||
|
startup_port = _startup_port;
|
||||||
|
billing_port = _billing_port;
|
||||||
|
aimedb_port = _aimedb_port;
|
||||||
|
for (size_t i = 0; i < _countof(port_hook_syms_ws2); ++i) {
|
||||||
|
port_hook_syms_ws2[i].ordinal = get_function_ordinal("ws2_32.dll", port_hook_syms_ws2[i].name);
|
||||||
|
}
|
||||||
|
|
||||||
|
hook_table_apply(
|
||||||
|
NULL,
|
||||||
|
"ws2_32.dll",
|
||||||
|
port_hook_syms_ws2,
|
||||||
|
_countof(port_hook_syms_ws2));
|
||||||
|
}
|
||||||
|
|
||||||
// This function match domain and subdomains like *.naominet.jp.
|
// This function match domain and subdomains like *.naominet.jp.
|
||||||
bool match_domain(const wchar_t* target, const wchar_t* pattern) {
|
bool match_domain(const wchar_t* target, const wchar_t* pattern) {
|
||||||
if (_wcsicmp(pattern, target) == 0) {
|
if (_wcsicmp(pattern, target) == 0) {
|
||||||
@ -249,7 +322,7 @@ HRESULT dns_hook_push(const wchar_t *from_src, const wchar_t *to_src)
|
|||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(to_src != NULL) {
|
if (to_src != NULL) {
|
||||||
to = _wcsdup(to_src);
|
to = _wcsdup(to_src);
|
||||||
|
|
||||||
if (to == NULL) {
|
if (to == NULL) {
|
||||||
@ -329,7 +402,7 @@ static DNS_STATUS WINAPI hook_DnsQuery_A(
|
|||||||
pos = &dns_hook_entries[i];
|
pos = &dns_hook_entries[i];
|
||||||
|
|
||||||
if (match_domain(wstr, pos->from)) {
|
if (match_domain(wstr, pos->from)) {
|
||||||
if(pos->to == NULL) {
|
if (pos->to == NULL) {
|
||||||
LeaveCriticalSection(&dns_hook_lock);
|
LeaveCriticalSection(&dns_hook_lock);
|
||||||
hr = HRESULT_FROM_WIN32(DNS_ERROR_RCODE_NAME_ERROR);
|
hr = HRESULT_FROM_WIN32(DNS_ERROR_RCODE_NAME_ERROR);
|
||||||
|
|
||||||
@ -393,7 +466,7 @@ static DNS_STATUS WINAPI hook_DnsQuery_W(
|
|||||||
pos = &dns_hook_entries[i];
|
pos = &dns_hook_entries[i];
|
||||||
|
|
||||||
if (match_domain(pszName, pos->from)) {
|
if (match_domain(pszName, pos->from)) {
|
||||||
if(pos->to == NULL) {
|
if (pos->to == NULL) {
|
||||||
LeaveCriticalSection(&dns_hook_lock);
|
LeaveCriticalSection(&dns_hook_lock);
|
||||||
return HRESULT_FROM_WIN32(DNS_ERROR_RCODE_NAME_ERROR);
|
return HRESULT_FROM_WIN32(DNS_ERROR_RCODE_NAME_ERROR);
|
||||||
}
|
}
|
||||||
@ -437,7 +510,7 @@ static DNS_STATUS WINAPI hook_DnsQueryEx(
|
|||||||
pos = &dns_hook_entries[i];
|
pos = &dns_hook_entries[i];
|
||||||
|
|
||||||
if (match_domain(pRequest->QueryName, pos->from)) {
|
if (match_domain(pRequest->QueryName, pos->from)) {
|
||||||
if(pos->to == NULL) {
|
if (pos->to == NULL) {
|
||||||
LeaveCriticalSection(&dns_hook_lock);
|
LeaveCriticalSection(&dns_hook_lock);
|
||||||
return HRESULT_FROM_WIN32(DNS_ERROR_RCODE_NAME_ERROR);
|
return HRESULT_FROM_WIN32(DNS_ERROR_RCODE_NAME_ERROR);
|
||||||
}
|
}
|
||||||
@ -504,7 +577,7 @@ static int WSAAPI hook_getaddrinfo(
|
|||||||
pos = &dns_hook_entries[i];
|
pos = &dns_hook_entries[i];
|
||||||
|
|
||||||
if (match_domain(wstr, pos->from)) {
|
if (match_domain(wstr, pos->from)) {
|
||||||
if(pos->to == NULL) {
|
if (pos->to == NULL) {
|
||||||
LeaveCriticalSection(&dns_hook_lock);
|
LeaveCriticalSection(&dns_hook_lock);
|
||||||
result = EAI_NONAME;
|
result = EAI_NONAME;
|
||||||
|
|
||||||
@ -558,7 +631,7 @@ static HINTERNET WINAPI hook_WinHttpConnect(
|
|||||||
pos = &dns_hook_entries[i];
|
pos = &dns_hook_entries[i];
|
||||||
|
|
||||||
if (match_domain(pwszServerName, pos->from)) {
|
if (match_domain(pwszServerName, pos->from)) {
|
||||||
if(pos->to == NULL) {
|
if (pos->to == NULL) {
|
||||||
LeaveCriticalSection(&dns_hook_lock);
|
LeaveCriticalSection(&dns_hook_lock);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -592,8 +665,8 @@ static bool WINAPI hook_WinHttpCrackUrl(
|
|||||||
if (match_domain(pwszUrl, pos->from)) {
|
if (match_domain(pwszUrl, pos->from)) {
|
||||||
wchar_t* toAddr = pos->to;
|
wchar_t* toAddr = pos->to;
|
||||||
wchar_t titleBuffer[255];
|
wchar_t titleBuffer[255];
|
||||||
|
|
||||||
if(wcscmp(toAddr, L"title") == 0) {
|
if (wcscmp(toAddr, L"title") == 0) {
|
||||||
size_t wstr_c;
|
size_t wstr_c;
|
||||||
mbstowcs_s(&wstr_c, titleBuffer, 255, received_title_url, strlen(received_title_url));
|
mbstowcs_s(&wstr_c, titleBuffer, 255, received_title_url, strlen(received_title_url));
|
||||||
toAddr = titleBuffer;
|
toAddr = titleBuffer;
|
||||||
@ -618,3 +691,93 @@ static bool WINAPI hook_WinHttpCrackUrl(
|
|||||||
lpUrlComponents
|
lpUrlComponents
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int WINAPI hook_connect(SOCKET s, const struct sockaddr *name, int namelen) {
|
||||||
|
const struct sockaddr_in *n;
|
||||||
|
struct sockaddr_in new_name;
|
||||||
|
unsigned ip;
|
||||||
|
unsigned short port, new_port;
|
||||||
|
|
||||||
|
EnterCriticalSection(&dns_hook_lock);
|
||||||
|
|
||||||
|
n = (const struct sockaddr_in *)name;
|
||||||
|
ip = n->sin_addr.S_un.S_addr;
|
||||||
|
if (WSANtohs(s, n->sin_port, &port)) return SOCKET_ERROR;
|
||||||
|
|
||||||
|
if (port == 80 && startup_port) {
|
||||||
|
new_port = startup_port;
|
||||||
|
} else if (port == 8443 && billing_port) {
|
||||||
|
new_port = billing_port;
|
||||||
|
} else if (port == 22345 && aimedb_port) {
|
||||||
|
new_port = aimedb_port;
|
||||||
|
} else { // No match
|
||||||
|
dprintf("TCP Connect: %u.%u.%u.%u:%hu\n", ip & 0xff, (ip >> 8) & 0xff, (ip >> 16) & 0xff, (ip >> 24) & 0xff, port);
|
||||||
|
|
||||||
|
LeaveCriticalSection(&dns_hook_lock);
|
||||||
|
return next_connect(
|
||||||
|
s,
|
||||||
|
name,
|
||||||
|
namelen
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// matched
|
||||||
|
new_name = *n;
|
||||||
|
if (WSAHtons(s, new_port, &new_name.sin_port)) return SOCKET_ERROR;
|
||||||
|
|
||||||
|
dprintf("TCP Connect: %u.%u.%u.%u:%hu, mapped to port %hu\n", ip & 0xff, (ip >> 8) & 0xff, (ip >> 16) & 0xff, (ip >> 24) & 0xff, port, new_port);
|
||||||
|
|
||||||
|
LeaveCriticalSection(&dns_hook_lock);
|
||||||
|
return next_connect(
|
||||||
|
s,
|
||||||
|
(const struct sockaddr *)&new_name,
|
||||||
|
sizeof(new_name)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
DWORD WINAPI hook_send(SOCKET s, const char* buf, int len, int flags) {
|
||||||
|
if (strstr(buf, "HTTP/") != NULL) {
|
||||||
|
char *new_buf = malloc(len + 1);
|
||||||
|
if (new_buf == NULL) return SOCKET_ERROR;
|
||||||
|
|
||||||
|
memcpy(new_buf, buf, len);
|
||||||
|
new_buf[len] = '\0';
|
||||||
|
|
||||||
|
char *host_start = strstr(new_buf, "Host: ");
|
||||||
|
if (host_start != NULL) {
|
||||||
|
char *host_end = strstr(host_start, "\r\n");
|
||||||
|
if (host_end != NULL) {
|
||||||
|
host_end += 2;
|
||||||
|
int host_len = host_end - host_start;
|
||||||
|
|
||||||
|
char *host_value_start = host_start + 6;
|
||||||
|
char *host_value_end = strstr(host_value_start, "\r\n");
|
||||||
|
if (host_value_end != NULL) {
|
||||||
|
int value_len = host_value_end - host_value_start;
|
||||||
|
char* host_value = (char*)malloc(value_len + 1);
|
||||||
|
strncpy(host_value, host_value_start, value_len);
|
||||||
|
host_value[value_len] = '\0';
|
||||||
|
|
||||||
|
for (struct dns_hook_entry *entry = dns_hook_entries; entry && entry->from; entry++) {
|
||||||
|
char from_value[256];
|
||||||
|
wcstombs(from_value, entry->from, sizeof(from_value));
|
||||||
|
|
||||||
|
if (strcmp(host_value, from_value) == 0) {
|
||||||
|
char to_value[256];
|
||||||
|
wcstombs(to_value, entry->to, sizeof(to_value));
|
||||||
|
snprintf(host_start, len - (host_start - new_buf), "Host: %s\r\n", to_value);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free(host_value);
|
||||||
|
}
|
||||||
|
len = (int)strlen(new_buf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DWORD result = next_send(s, new_buf, len, flags);
|
||||||
|
free(new_buf);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
return next_send(s, buf, len, flags);
|
||||||
|
}
|
@ -3,7 +3,9 @@
|
|||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
void http_hook_init();
|
||||||
|
void port_hook_init(unsigned short _startup_port, unsigned short _billing_port, unsigned short _aimedb_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);
|
@ -2,9 +2,9 @@ hooklib_lib = static_library(
|
|||||||
'hooklib',
|
'hooklib',
|
||||||
include_directories : inc,
|
include_directories : inc,
|
||||||
implicit_include_directories : false,
|
implicit_include_directories : false,
|
||||||
c_pch : '../precompiled.h',
|
|
||||||
dependencies : [
|
dependencies : [
|
||||||
capnhook.get_variable('hook_dep'),
|
capnhook.get_variable('hook_dep'),
|
||||||
|
ws2_32_lib
|
||||||
],
|
],
|
||||||
sources : [
|
sources : [
|
||||||
'cursor.c',
|
'cursor.c',
|
@ -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);
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user