Compare commits

...

130 Commits

Author SHA1 Message Date
6fa47f2c7f sekito: specify game ID in config 2025-09-30 22:44:45 +02:00
acedf0f372 ekt: fix ekthook vanishing 2025-09-30 22:41:30 +02:00
6848a7a6c6 ekt: fix filename reading 2025-09-30 22:41:19 +02:00
3195dbc282 sekito: get terminal to work 2025-09-30 22:17:54 +02:00
67d0513273 sekito: fix test card player for SKT 2025-09-30 21:09:48 +02:00
a21fad184f sekito: only initialize Y3 I/O dll on field 2025-09-30 20:50:06 +02:00
fc22a29c56 sekito: launch game from parent directory or file writing fails 2025-09-30 20:34:15 +02:00
e6e1171a5f sekito: fix printer 2025-09-30 20:34:02 +02:00
84362a2839 sekito: implement rest 2025-09-30 19:54:14 +02:00
7f017a0da9 MSVC and 32-bit fixes 2025-09-30 14:18:44 +02:00
f33fe0f2ae sekito: add hook 2025-09-30 12:14:00 +02:00
7dd1cd4a62 ekt: add config docs 2025-09-20 10:02:58 +02:00
d264ae0b37 ekt: add UDP broadcast netenv redirection 2025-09-13 11:37:23 +02:00
2950061d08 ekt: improve sample card player a bit 2025-09-12 12:35:39 +02:00
69a7f70388 ekt: improve sample card player a bit 2025-09-12 10:20:05 +02:00
1b09a57c0d ekt: add card player sample 2025-09-06 10:06:50 +02:00
d6143ebb5f ekt: enable AmCapture, add default settings for y3ws to segatools.ini 2025-09-05 16:45:50 +02:00
136da4a2b8 ekt: document port 2025-09-05 14:54:28 +02:00
04416715ef ekt: doc fix 2025-09-05 14:42:35 +02:00
a6915a95f8 ekt: implement y3ws 2025-09-05 13:41:08 +02:00
0f87e7510e ekt: remove bad ws implementation 2025-09-04 18:47:05 +02:00
05f68962cd ekt: fix missing call to y3.close 2025-09-04 18:45:07 +02:00
bbfbe71852 Merge remote-tracking branch 'fork-origin/feature/ekt' into feature/ekt
# Conflicts:
#	common/y3io/meson.build
2025-09-04 18:42:16 +02:00
619285c412 ekt: move files around 2025-09-04 08:42:54 +02:00
dc631215b1 ekt: partial y3ws implementation 2025-09-03 19:10:29 +02:00
3327548ca6 ekt: implement cx7000 printer 2025-09-03 17:09:40 +02:00
0480a7e767 ekt: fix doing too much search+replace 2025-09-02 21:16:18 +02:00
57d23726e8 ekt: fix doing too much search+replace 2025-09-02 18:09:17 +02:00
837b0663aa ekt: Fix bindings and trackball speed/range 2025-09-02 16:23:48 +02:00
873ae0a30a ekt: Make y3io expandable with I/O dlls 2025-09-02 15:37:40 +02:00
da0fc56500 ekt: make ports configurable, misc corrections 2025-09-02 13:54:07 +02:00
fdd9c2fbc8 ekt: cleanup and fixes 2025-09-02 13:16:35 +02:00
bb47e4f1b5 ekt: add button i/o 2025-09-01 16:28:14 +02:00
d9210b52e1 ekt: initial code 2025-08-31 20:47:24 +02:00
4788e54398 Merge remote-tracking branch 'origin/develop' into develop 2025-08-31 17:29:40 +02:00
e090f472af merge upstream 2025-08-31 15:28:21 +00:00
19c1a8e469 Merge pull request 'idac: Add configurable remapping for D-Pad Up/Down buttons.' (#77) from puniru/segatools:up_down into develop
Reviewed-on: TeamTofuShop/segatools#77
Reviewed-by: Dniel97 <dniel97@noreply.gitea.tendokyu.moe>
2025-08-27 20:39:40 +00:00
eb96660fdf idac: update config for up and down dpad buttons 2025-08-27 13:30:00 +09:00
83a9a49429 idac: allow changing up and down for custom boards 2025-08-22 15:03:19 +09:00
d423058cbd APM3: Fix amdaemon breakage when Unity Doorstop is present (#76)
Reviewed-on: TeamTofuShop/segatools#76
Co-authored-by: kyoubate-haruka <46010460+kyoubate-haruka@users.noreply.github.com>
Co-committed-by: kyoubate-haruka <46010460+kyoubate-haruka@users.noreply.github.com>
2025-08-10 16:04:01 +00:00
9703a0938a Merge remote-tracking branch 'origin/develop' into develop 2025-08-09 17:13:16 +02:00
ec1a232103 merge upstream 2025-08-09 15:12:16 +00:00
55a3859891 [swdc] fix magnitude calculation 2025-08-06 19:40:04 +02:00
3f2cfb6a26 [apm3, idac] improved launch.bat, removed zinput 2025-08-01 17:58:21 +02:00
e74e2a0d47 [apm3, swdc, idac] DInput8 cleanup 2025-07-29 18:06:10 +02:00
122034f922 [fgo] improve keyboard bindings 2025-07-27 22:05:07 +02:00
bb0b023ec0 [apm3] hook video loading, bug fixes 2025-07-27 19:22:57 +02:00
bb01e131e9 [epay]: hook enabled by default 2025-07-27 18:06:58 +02:00
ded1375e88 Vfs: Hook .ini reader functions to fix DLI reading (#75)
Pretty simple, DLI reading (more commonly known as DownloadOrder) calls GetPrivateProfile* with a file path with E:\tmpDli*.ini. This fails right now.

I have only hooked the functions that appear in the latest amdaemon.

Reviewed-on: TeamTofuShop/segatools#75
Reviewed-by: Dniel97 <dniel97@noreply.gitea.tendokyu.moe>
Co-authored-by: kyoubate-haruka <46010460+kyoubate-haruka@users.noreply.github.com>
Co-committed-by: kyoubate-haruka <46010460+kyoubate-haruka@users.noreply.github.com>
2025-07-24 09:16:22 +00:00
c2af0a0df5 Merge remote-tracking branch 'origin/develop' into develop 2025-07-23 18:55:54 +02:00
918d6368a5 merge upstream 2025-07-23 16:55:13 +00:00
0006731536 [apm3] fix led hook, fix blocked reboot 2025-07-21 21:09:24 +02:00
ae168cdaf9 Merge branch 'feature/apm3' into develop 2025-07-20 18:49:15 +02:00
e974a76fe6 [apm3] add DInput and XInput support 2025-07-20 18:13:29 +02:00
e2e4b37e3f APMv3: add hook (#73)
This adds support for APMv3 I/O, menus and the launcher.

* Added a apm3hook dll and I/O based on the usual layout.
* Added C:\Mount\Apm to vfs.
* Added the relevant .dlls to unityhook.
* Added a hook for apmmount.dll that uses `CreateDosDevice` to mount decrypted data to the locations the launcher and games expect files to be. This will conflict with anything that is already at W:\ and X:\, but I do not have better solutions for this.
* `launch.bat` is a bit more involved as it simulates the launcher loop. It can be broken by alt+f4ing or closing the launcher with "X".
* An extra export was added, so rundll32 can be used to get rid of the dosdevices after the launcher was killed.
* Since all the games do everything via `X:\lib\apm.dll`, no game hooks were needed in testing, therefore, `game.bat` files can be used as is.
* Path hooks are applied correctly, so you can go correctly between games, launcher, sub system test mode and game test modes.

A setup guide (some stuff specific to my server) can be found here:
https://gmg.hopto.org:82/gmg/wiki/index.php/All.Net_P-ras_Multi_Menu

Tested with the 2 APM sample apps, Blazblue, Puyo, Guilty Gear and some weird unity puzzle game whose name I forgot.

![Apmv3System_yLRityJVpm.png](/attachments/3d645e71-81e6-42e6-acd4-63c537cda59e)
![puyoe_hJNhnJGFnd.png](/attachments/01664049-71fe-4c38-9c99-39649ab21e56)

Reviewed-on: TeamTofuShop/segatools#73
Co-authored-by: kyoubate-haruka <46010460+kyoubate-haruka@users.noreply.github.com>
Co-committed-by: kyoubate-haruka <46010460+kyoubate-haruka@users.noreply.github.com>
2025-07-20 09:43:56 +00:00
f595af9686 [cm, mercury, mu3] update aime reader gen 2025-07-19 23:35:46 +02:00
03513e7b0c add aime scan button to default segatools.ini 2025-07-16 15:44:05 +02:00
d20bea1e16 merge upstream 2025-06-20 07:05:43 +00:00
cdb6815c5a add keychip id and pcbid to default segatools.ini 2025-06-19 19:28:10 +02:00
dfab6bdb54 Merge remote-tracking branch 'fork-origin/develop' into develop 2025-06-19 18:22:16 +02:00
4644e36ccc Merge branch 'feature/cleanup' into develop 2025-06-19 18:18:30 +02:00
dbfc62b5d4 platform: fix dipsw settings not applying 2025-06-19 18:17:20 +02:00
24e8bc87a3 remove reference to nonexistant files 2025-04-17 14:06:55 -04:00
a65b43fe1a Merge branch 'feature/cleanup' of https://gitea.tendokyu.moe/teamtofushop/segatools into feature/cleanup 2025-04-17 14:05:45 -04:00
66a53dd2de refactor all common parts and games 2025-04-17 20:04:17 +02:00
ae3dd666f4 refactor all common parts and games 2025-04-17 19:40:40 +02:00
a6126bf290 Merge branch 'feature/thinca_auth' into develop 2025-04-17 19:18:03 +02:00
015097972a emoney: improce doc and add python script 2025-04-17 19:17:42 +02:00
67eda7458b emoney: Add Thinca authentication card stuff (#35)
This PR adds everything that's needed on the segatools side to add E-Money support regarding Thinca authentication cards.

I've also included set-up documentation (with a network side bonus which was as far as I could figure out so far, but I'm pretty certain no more changes to segatools will be needed)

Due to the nature of a custom protcol called TCAP that Thinca uses for networking (see docs), I can't fully test that everything works as I haven't yet bothered to figure that protocol out.

Tested with both APMv3 and FGO.

![https://puu.sh/KeqVj/ccf4bcccbb.png](https://puu.sh/KeqVj/ccf4bcccbb.png)

Reviewed-on: TeamTofuShop/segatools#35
Co-authored-by: Haruka <haruka@noreply.gitea.tendokyu.moe>
Co-committed-by: Haruka <haruka@noreply.gitea.tendokyu.moe>
2025-04-17 17:01:38 +00:00
b37e1105d0 misc: added a showcursor counter to more accuratly replicate actual function behavior 2025-04-16 22:10:19 -04:00
9a6c4939c2 system: fix sysfile patches not applying when compiling with msvc 2025-04-16 22:09:48 -04:00
39711a994a FGO: add keyboard input (#61)
Probably self-explanatory :p

Reviewed-on: TeamTofuShop/segatools#61
Co-authored-by: kyoubate-haruka <46010460+kyoubate-haruka@users.noreply.github.com>
Co-committed-by: kyoubate-haruka <46010460+kyoubate-haruka@users.noreply.github.com>
2025-04-05 15:22:14 +00:00
61f95c3f2e GFX: add dpi-awareness switch for all games (#64)
Pretty simple, adds a new config setting to the gfx category, which defaults to enabled to disable DPI scaling if a scale higher than 100% is used, causing game windows to appear stretched and blurry.

Reviewed-on: TeamTofuShop/segatools#64
Co-authored-by: kyoubate-haruka <46010460+kyoubate-haruka@users.noreply.github.com>
Co-committed-by: kyoubate-haruka <46010460+kyoubate-haruka@users.noreply.github.com>
2025-03-14 11:53:31 +00:00
f8504b46b5 Merge remote-tracking branch 'fork-origin/develop' into develop 2025-03-10 09:51:11 +01:00
70c3e2fe0f FGO: fix printer hook always being enabled (#60)
that moment when the printer says OK but it absolutely isn't supposed to be OK lmao

edit: I'm not sure why the msvc commits are also in all of these PRs, they have no effect though...
Reviewed-on: TeamTofuShop/segatools#60
Co-authored-by: kyoubate-haruka <46010460+kyoubate-haruka@users.noreply.github.com>
Co-committed-by: kyoubate-haruka <46010460+kyoubate-haruka@users.noreply.github.com>
2025-03-09 16:05:03 +00:00
9b1f07e41b Merge remote-tracking branch 'fork-origin/develop' into develop
# Conflicts:
#	hooklib/meson.build
#	meson.build
#	platform/system.c
2025-03-09 10:30:19 +01:00
369fe28687 disable excess logging for carol touchscreen hook 2025-03-02 04:10:35 -05:00
3371f3f437 fix msvc build by removing ntstatus include from platform/system.c 2025-03-02 01:45:23 -05:00
a57542c2d2 Merge branch 'feature/code-cleanup' into develop 2025-03-02 00:36:27 +01:00
27116a7a41 idac, tokyo: improve dipsw cabinet id config 2025-03-02 00:36:13 +01:00
e850346b79 renamed start.bat to launch.bat 2025-03-02 00:25:15 +01:00
4d0ef54279 system: add dip switch label configurations 2025-03-02 00:23:53 +01:00
b8af67377c Merge branch 'feature/mai2-touch-led' into develop 2025-03-02 00:04:00 +01:00
4cb76dd1ee mai2: update all LED boards to use two boards 2025-03-02 00:01:45 +01:00
efe01d92a6 Fix MSVC build again, add support for standalone MSVC compiler (#59)
After switching away from VS, I realized the buildscript wouldn't detect the standalone MSVC compiler, because for whatever genius reason, MS installs that in the x86 program files directory...

Also fixes some duplicate definitions and a missing library that MSVC doesn't like
ah compilers...

Reviewed-on: TeamTofuShop/segatools#59
Co-authored-by: kyoubate-haruka <46010460+kyoubate-haruka@users.noreply.github.com>
Co-committed-by: kyoubate-haruka <46010460+kyoubate-haruka@users.noreply.github.com>
2025-02-24 18:49:22 +00:00
004a2f6dcd docs: fix playformID and billingType config docs 2025-02-21 19:37:54 -05:00
2313113fd0 gitignore some newer meson file 2025-02-21 11:32:52 +01:00
bf3ff76f0c add support for standalone MSVC compiler 2025-02-21 11:30:09 +01:00
9c0ca7d66c fix msvc build again 2025-02-21 11:29:58 +01:00
a1611afffc Mai2: Add touch and led15070 hook (#55)
In this PR, I have added the `mai2` touch and `led15070` hooks to provide an example for handling custom peripherals. This change allows users to implement the touch and `led15070` logic by writing appropriate `mai2io` scripts.

#### **Touch Hook**:
- The touch hook simulates touch points based on keyboard combinations. For example, to trigger the A1 touch point, the user must press the A and 1 keys on the keyboard. Input for the 1p requires Caps Lock to be off, while 2p requires Caps Lock to be on.
- The hook allows for independent control of whether device simulation is enabled for "1p" and "2p" and whether keyboard input mapping is enabled.
- **Note**: The current touch hook is not yet functional as it requires modifications to the `capnhook` for proper completion of the `sinmai` hook.

#### **LED15070 Hook**:
- This hook implements basic device simulation. Peripherals requiring lighting data should complete the logic as needed.
- **Note**: The LED data refresh can flood the console logs, so I’ve added a `DEBUG` flag to control whether the debug logging is enabled or not.

#### **Other Changes**:
- In certain versions of `sinmai`, key inputs for 1p and 2p can be directly read from the keyboard without requiring simulation via the `amdaemon io4` hook. I’ve added a switch to control this behavior to prevent redundant input.
- **Benefit**: This ensures that key input is only read when `sinmai` is in the foreground.

If you'd like to learn more about the touch and `led15070` features, my research findings are available here:
[Mai2Touch](https://github.com/Sucareto/Mai2Touch)

Co-authored-by: Sucareto <28331534+Sucareto@users.noreply.github.com>
Reviewed-on: TeamTofuShop/segatools#55
Co-authored-by: Mahuyo <mahuyo@noreply.gitea.tendokyu.moe>
Co-committed-by: Mahuyo <mahuyo@noreply.gitea.tendokyu.moe>
2025-02-16 12:49:58 +00:00
1d63ab24d3 Move capnhook to TeamTofuShop fork, update revision 2025-02-09 04:52:27 -05:00
2f54183636 bump capnhook rev 2025-02-04 11:09:23 -05:00
402bf0f247 nusec: add full IOCTL list without handlers 2025-01-28 01:41:03 -05:00
4c20deb60a bump capnhook ver 2025-01-27 02:09:14 -05:00
96ee1afc2f Merge pull request 'Revert: Add automatically apply OpenSSL patch for Intel Gen 10+ CPUs' (#54) from Bottersnike/segatools:develop into develop
Reviewed-on: TeamTofuShop/segatools#54
2024-12-27 14:18:27 +00:00
0c28765bdd Revert: Add automatically apply OpenSSL patch for Intel Gen 10+ CPUs 2024-12-27 14:12:58 +00:00
96bf8cab81 aime: add portNo to config 2024-12-23 21:49:24 +01:00
a3120181be replace hardcoded enums with #define CTL_CODEs 2024-12-23 21:48:30 +01:00
80d4902cfc remove 5gb wasted space by removing precompiled headers 2024-12-23 21:04:51 +01:00
b4f5cdbe59 Merge pull request 'Add automatically apply OpenSSL patch for Intel Gen 10+ CPUs' (#43) from kagaminehaku/segatools:develop into develop
Reviewed-on: Dniel97/segatools#43
2024-12-23 19:43:47 +00:00
25431a9db1 Add "openssl" config key doc 2024-12-24 02:34:44 +07:00
a705ae8748 Merge pull request 'Add changeable config path' (#53) from GEEKiDoS/segatools:develop into develop
Reviewed-on: Dniel97/segatools#53
2024-12-23 18:04:12 +00:00
b52455339f Merge pull request 'dns: add port overriding support' (#52) from t12i/segatools:develop into develop
Reviewed-on: Dniel97/segatools#52
2024-12-23 17:54:38 +00:00
ff21223f06 Removed the unused lines 2024-12-17 10:06:41 +07:00
047733d122 format code 2024-12-16 11:18:00 +08:00
21bb965382 typo 2024-12-16 11:14:14 +08:00
11556a1332 add changeable config path 2024-12-16 11:09:38 +08:00
d8202e1df4 dns: add port overriding support 2024-12-12 02:28:02 +08:00
2d3d6fc2bb Skip the patch when already patched 2024-11-26 01:40:57 +07:00
6d8ffb46ef Merge pull request 'dns: fix msvc build' (#50) from Haruka/segatools:fixmsvc into develop
Reviewed-on: Dniel97/segatools#50
2024-11-17 13:42:53 +00:00
2069b1ea85 dns: fix msvc build 2024-11-14 13:03:13 +01:00
c80f903cf8 Fix build with Microsoft Visual C++, Fix gfxhook and felica issue (#48)
I just wanna say that It is a SHAME that a Windows ONLY project was not able to build without MINGW
Also where's the missing `3mpxsc.h` in diva hook?

This also fixes the window size issue from hook_CreateWindowExA in gfxhook
And Fixes felica issue as described in #45

Reviewed-on: Dniel97/segatools#48
Reviewed-by: Dniel97 <dniel97@noreply.gitea.tendokyu.moe>
Co-authored-by: GEEKiDoS <geek_ds@foxmail.com>
Co-committed-by: GEEKiDoS <geek_ds@foxmail.com>
2024-11-11 16:28:24 +00:00
ceb2b63e8b Modify host header in HTTP requests to bypass domain censorship in China. (#34)
Co-authored-by: Sanheiii <35133371+Sanheiii@users.noreply.github.com>
Reviewed-on: Dniel97/segatools#34
Co-authored-by: Sanhei <sanhei@noreply.gitea.tendokyu.moe>
Co-committed-by: Sanhei <sanhei@noreply.gitea.tendokyu.moe>
2024-11-11 16:24:33 +00:00
83840e0a87 dns: add new WAHLAP url blocked (#49)
Reviewed-on: Dniel97/segatools#49
Co-authored-by: zaphkito <zaphkito@noreply.gitea.tendokyu.moe>
Co-committed-by: zaphkito <zaphkito@noreply.gitea.tendokyu.moe>
2024-11-10 20:47:40 +00:00
e50d6d8ebc Merge pull request 'Throw fatal when vfs option configured but invalid' (#47) from Bottersnike/segatools:feat/vfs-validation into develop
Reviewed-on: Dniel97/segatools#47
2024-11-05 16:36:43 +00:00
e1a47cf365 Throw fatal when vfs option configured but invalid 2024-11-04 22:55:15 +00:00
8aef1cfa79 Change method set environment variable to current process only using "SetEnvironmentVariableW" 2024-11-05 00:48:21 +07:00
8fc24503c8 diva, fgo: added gfx, close #46 2024-11-03 23:00:43 +01:00
ebf0f0b428 Develop a new/better method to detect cpu using intrinsic functions (__cpuid and __cpuidex) 2024-11-02 00:26:31 +07:00
892eb2b859 idz, idac, swdc: fixed rumble effect 2024-10-29 22:06:07 +01:00
b80b9fbc19 Delete useless comment 2024-10-18 13:44:47 +07:00
cef3406691 Add switch for openssl patch in segatools.ini 2024-10-18 13:34:25 +07:00
97d2d6b9bc resolved camelCase and the " :" problem 2024-10-16 15:53:52 +07:00
f39b9ce3a0 resolve dniel97 comments 2024-10-16 15:01:39 +07:00
243bb778d1 Add automatically apply OpenSSL patch for Intel Gen 10+ CPUs 2024-10-16 04:08:54 +07:00
66317a0054 bump capnhook rev to include serial fixes 2024-10-11 07:32:22 +02:00
8c24e04900 Merge pull request 'printer: Add setting to configure "printing time"' (#39) from Haruka/segatools:printerdelay into develop
Reviewed-on: Dniel97/segatools#39
2024-10-04 12:53:26 +00:00
3bb9404a38 printer: add the default waitTime setting to config 2024-10-04 11:43:34 +02:00
6819963f06 Merge branch 'refs/heads/develop' into printerdelay 2024-10-03 12:12:59 +02:00
4fa9abffe8 printer: add ability to delay printing 2024-09-27 11:06:18 +02:00
650 changed files with 20329 additions and 2411 deletions

4
.clang-format Normal file
View File

@ -0,0 +1,4 @@
---
BasedOnStyle: Google
IndentWidth: 4
---

4
.gitignore vendored
View File

@ -18,6 +18,10 @@ build/
# External dependencies # External dependencies
subprojects/capnhook subprojects/capnhook
subprojects/cwinwebsocket
# 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

View File

@ -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

View File

@ -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,68 @@ $(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)/ekt.zip:
$(V)echo ... $@
$(V)mkdir -p $(BUILD_DIR_ZIP)/ekt
$(V)mkdir -p $(BUILD_DIR_ZIP)/ekt/DEVICE
$(V)cp $(BUILD_DIR_64)/subprojects/capnhook/inject/inject.exe \
$(BUILD_DIR_GAMES_64)/ekthook/ekthook.dll \
$(DIST_DIR)/ekt/segatools_terminal.ini \
$(DIST_DIR)/ekt/segatools_satellite.ini \
$(DIST_DIR)/ekt/launch_terminal.bat \
$(DIST_DIR)/ekt/launch_satellite.bat \
$(DIST_DIR)/ekt/card_player.html \
$(DIST_DIR)/ekt/config_hook.json \
$(BUILD_DIR_ZIP)/ekt
$(V)cp pki/billing.pub \
pki/ca.crt \
$(BUILD_DIR_ZIP)/ekt/DEVICE
$(V)strip $(BUILD_DIR_ZIP)/ekt/*.{exe,dll}
$(V)cd $(BUILD_DIR_ZIP)/ekt ; zip -r ../ekt.zip *
$(BUILD_DIR_ZIP)/sekito.zip:
$(V)echo ... $@
$(V)mkdir -p $(BUILD_DIR_ZIP)/sekito
$(V)mkdir -p $(BUILD_DIR_ZIP)/sekito/DEVICE
$(V)cp $(DIST_DIR)/sekito/segatools_terminal.ini \
$(DIST_DIR)/sekito/segatools_satellite.ini \
$(DIST_DIR)/sekito/launch_terminal.bat \
$(DIST_DIR)/sekito/launch_satellite.bat \
$(DIST_DIR)/sekito/card_player.html \
$(DIST_DIR)/sekito/config_hook.json \
$(BUILD_DIR_ZIP)/sekito
$(V)cp pki/billing.pub \
pki/ca.crt \
$(BUILD_DIR_ZIP)/sekito/DEVICE
$(V)cp $(BUILD_DIR_32)/subprojects/capnhook/inject/inject.exe \
$(BUILD_DIR_ZIP)/sekito/inject_x86.exe
$(V)cp $(BUILD_DIR_64)/subprojects/capnhook/inject/inject.exe \
$(BUILD_DIR_ZIP)/sekito/inject_x64.exe
$(V)cp $(BUILD_DIR_32)/subprojects/capnhook/inject/inject.exe \
$(BUILD_DIR_ZIP)/sekito/inject_x86.exe
$(V)cp $(BUILD_DIR_GAMES_32)/sekitohook/sekitohook.dll \
$(BUILD_DIR_ZIP)/sekito/sekitohook_x86.dll
$(V)cp $(BUILD_DIR_GAMES_64)/sekitohook/sekitohook.dll \
$(BUILD_DIR_ZIP)/sekito/sekitohook_x64.dll
$(V)strip $(BUILD_DIR_ZIP)/sekito/*.{exe,dll}
$(V)cd $(BUILD_DIR_ZIP)/sekito ; zip -r ../sekito.zip *
$(BUILD_DIR_ZIP)/doc.zip: \ $(BUILD_DIR_ZIP)/doc.zip: \
$(DOC_DIR)/config \ $(DOC_DIR)/config \
$(DOC_DIR)/chunihook.md \ $(DOC_DIR)/chunihook.md \
@ -265,6 +327,8 @@ $(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 \
$(BUILD_DIR_ZIP)/ekt.zip \
CHANGELOG.md \ CHANGELOG.md \
README.md \ README.md \

View File

@ -1,6 +1,6 @@
# Segatools # Segatools
Version: `2024-09-30` Version: `2025-07-27`
Loaders and hardware emulators for SEGA games that run on the Nu and ALLS platforms. Loaders and hardware emulators for SEGA games that run on the Nu and ALLS platforms.
@ -32,6 +32,8 @@ Loaders and hardware emulators for SEGA games that run on the Nu and ALLS platfo
* starting from WACCA * starting from WACCA
* Kemono Friends * Kemono Friends
* Kemono Friends 3: Planet Tours * Kemono Friends 3: Planet Tours
* ALL.Net P-ras MULTI Version 3
* starting from ALL.Net P-ras MULTI Version 3 1.01
## End-users ## End-users

View File

@ -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;
} }

View File

@ -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,
], ],

View File

@ -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;

View File

@ -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);

View File

@ -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,

View File

@ -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);

View File

@ -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'),
], ],

View File

@ -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);

View File

@ -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"

View File

@ -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", 3, filename);
cfg->proxy_flag = GetPrivateProfileIntW(L"aime", L"proxyFlag", 2, filename);
GetPrivateProfileStringW(
L"aime",
L"authdataPath",
L"DEVICE\\authdata.bin",
cfg->authdata_path,
_countof(cfg->authdata_path),
filename);
} }
void io4_config_load(struct io4_config *cfg, const wchar_t *filename) 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);
} }

View File

@ -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;

View File

@ -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"

View File

@ -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"

View File

@ -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

View File

@ -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

View File

@ -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);

View File

@ -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 {

View File

@ -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);

View File

@ -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]);

View File

@ -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'),
], ],

View File

@ -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 {

View File

@ -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;
} }

View File

@ -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(

View File

@ -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);

View File

@ -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);

View File

@ -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;

View File

@ -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);

View File

@ -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
View 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
);
}

View File

@ -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
View 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
View File

@ -0,0 +1,3 @@
#pragma once
void gfx_gl_hook_init(const struct gfx_config *cfg, HINSTANCE self);

View File

@ -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',
], ],

246
common/hooklib/config.c Normal file
View File

@ -0,0 +1,246 @@
#include <windows.h>
#include <assert.h>
#include <stdbool.h>
#include <stdlib.h>
#include <stddef.h>
#include "hooklib/config.h"
#include "hooklib/dvd.h"
#include "hooklib/y3.h"
#include "hooklib/y3-dll.h"
void dvd_config_load(struct dvd_config *cfg, const wchar_t *filename)
{
assert(cfg != NULL);
assert(filename != NULL);
cfg->enable = GetPrivateProfileIntW(L"dvd", L"enable", 1, filename);
}
void touch_screen_config_load(struct touch_screen_config *cfg, const wchar_t *filename)
{
assert(cfg != NULL);
assert(filename != NULL);
cfg->enable = GetPrivateProfileIntW(L"touch", L"enable", 1, filename);
cfg->remap = GetPrivateProfileIntW(L"touch", L"remap", 1, filename);
cfg->cursor = GetPrivateProfileIntW(L"touch", L"cursor", 1, filename);
}
void printer_chc_config_load(struct printer_chc_config *cfg, const wchar_t *filename)
{
assert(cfg != NULL);
assert(filename != NULL);
wchar_t tmpstr[16];
cfg->enable = GetPrivateProfileIntW(L"printer", L"enable", 0, filename);
cfg->rotate_180 = GetPrivateProfileIntW(L"printer", L"rotate180", 0, filename);
GetPrivateProfileStringW(
L"printer",
L"serial_no",
L"5A-A123",
tmpstr,
_countof(tmpstr),
filename);
size_t n = wcstombs(cfg->serial_no, tmpstr, sizeof(cfg->serial_no));
for (int i = n; i < sizeof(cfg->serial_no); i++)
{
cfg->serial_no[i] = '\0';
}
GetPrivateProfileStringW(
L"printer",
L"mainFwPath",
L"DEVICE\\printer_main_fw.bin",
cfg->main_fw_path,
_countof(cfg->main_fw_path),
filename);
GetPrivateProfileStringW(
L"printer",
L"dspFwPath",
L"DEVICE\\printer_dsp_fw.bin",
cfg->dsp_fw_path,
_countof(cfg->dsp_fw_path),
filename);
GetPrivateProfileStringW(
L"printer",
L"paramFwPath",
L"DEVICE\\printer_param_fw.bin",
cfg->param_fw_path,
_countof(cfg->param_fw_path),
filename);
GetPrivateProfileStringW(
L"printer",
L"printerOutPath",
L"DEVICE\\print",
cfg->printer_out_path,
_countof(cfg->printer_out_path),
filename);
cfg->wait_time = GetPrivateProfileIntW(L"printer", L"waitTime", 0, filename);
}
void printer_cx_config_load(struct printer_cx_config *cfg, const wchar_t *filename){
assert(cfg != NULL);
assert(filename != NULL);
char filenameA[MAX_PATH];
size_t n = wcstombs(filenameA, filename, MAX_PATH);
for (int i = n; i < MAX_PATH; i++)
{
filenameA[i] = '\0';
}
cfg->enable = GetPrivateProfileIntW(L"printer", L"enable", 1, filename);
GetPrivateProfileStringA(
"printer",
"firmwareVersion",
"V04-03B",
cfg->printer_firm_version,
_countof(cfg->printer_firm_version),
filenameA);
GetPrivateProfileStringA(
"printer",
"configVersion",
"V01-75",
cfg->printer_config_version,
_countof(cfg->printer_config_version),
filenameA);
GetPrivateProfileStringA(
"printer",
"tableVersion",
"V01-E0",
cfg->printer_table_version,
_countof(cfg->printer_table_version),
filenameA);
GetPrivateProfileStringA(
"printer",
"cameraVersion",
"00.19",
cfg->printer_camera_version,
_countof(cfg->printer_camera_version),
filenameA);
GetPrivateProfileStringW(
L"printer",
L"printerOutPath",
L"DEVICE\\print",
cfg->printer_out_path,
_countof(cfg->printer_out_path),
filename);
GetPrivateProfileStringW(
L"printer",
L"printerDataPath",
L"DEVICE\\cx7000_data.bin",
cfg->printer_data_path,
_countof(cfg->printer_data_path),
filename);
}
void y3_dll_config_load(
struct y3_dll_config *cfg,
const wchar_t *filename)
{
assert(cfg != NULL);
assert(filename != NULL);
GetPrivateProfileStringW(
L"y3io",
L"path",
L"",
cfg->path,
_countof(cfg->path),
filename);
}
void y3_config_load(
struct y3_config *cfg,
const wchar_t *filename)
{
assert(cfg != NULL);
assert(filename != NULL);
wchar_t tmpstr[5];
memset(cfg->firm_name_field, ' ', sizeof(cfg->firm_name_field) - 1);
cfg->firm_name_field[sizeof(cfg->firm_name_field) - 1] = '\0';
memset(cfg->firm_name_printer, ' ', sizeof(cfg->firm_name_printer) - 1);
cfg->firm_name_printer[sizeof(cfg->firm_name_printer) - 1] = '\0';
memset(cfg->target_code_field, ' ', sizeof(cfg->target_code_field) - 1);
cfg->target_code_field[sizeof(cfg->target_code_field) - 1] = '\0';
memset(cfg->target_code_printer, ' ', sizeof(cfg->target_code_printer) - 1);
cfg->target_code_printer[sizeof(cfg->target_code_printer) - 1] = '\0';
cfg->enable = GetPrivateProfileIntW(L"flatPanelReader", L"enable", 1, filename);
cfg->port_field = GetPrivateProfileIntW(L"flatPanelReader", L"port_field", 10, filename);
cfg->port_printer = GetPrivateProfileIntW(L"flatPanelReader", L"port_printer", 11, filename);
cfg->dll_version = (float)GetPrivateProfileIntW(
L"flatPanelReader",
L"dllVersion",
1,
filename);
cfg->firm_version = (float)GetPrivateProfileIntW(
L"flatPanelReader",
L"firmVersion",
1,
filename);
GetPrivateProfileStringW(
L"flatPanelReader",
L"firmNameField",
L"SFPR",
tmpstr,
_countof(tmpstr),
filename);
wcstombs(cfg->firm_name_field, tmpstr, sizeof(cfg->firm_name_field) - 1);
GetPrivateProfileStringW(
L"flatPanelReader",
L"firmNamePrinter",
L"SPRT",
tmpstr,
_countof(tmpstr),
filename);
wcstombs(cfg->firm_name_printer, tmpstr, sizeof(cfg->firm_name_printer) - 1);
GetPrivateProfileStringW(
L"flatPanelReader",
L"targetCodeField",
L"SFR0",
tmpstr,
_countof(tmpstr),
filename);
wcstombs(cfg->target_code_field, tmpstr, sizeof(cfg->target_code_field) - 1);
GetPrivateProfileStringW(
L"flatPanelReader",
L"targetCodePrinter",
L"SPT0",
tmpstr,
_countof(tmpstr),
filename);
wcstombs(cfg->target_code_printer, tmpstr, sizeof(cfg->target_code_printer) - 1);
}

32
common/hooklib/config.h Normal file
View File

@ -0,0 +1,32 @@
#pragma once
#include <stddef.h>
#include "hooklib/dvd.h"
#include "hooklib/touch.h"
#include "hooklib/printer_chc.h"
#include "hooklib/printer_cx.h"
struct y3_config {
bool enable;
float dll_version;
float firm_version;
char firm_name_field[5];
char firm_name_printer[5];
char target_code_field[5];
char target_code_printer[5];
uint8_t port_field;
uint8_t port_printer;
};
struct y3_dll_config {
wchar_t path[MAX_PATH];
};
void dvd_config_load(struct dvd_config *cfg, const wchar_t *filename);
void touch_screen_config_load(struct touch_screen_config *cfg, const wchar_t *filename);
void printer_chc_config_load(struct printer_chc_config *cfg, const wchar_t *filename);
void printer_cx_config_load(struct printer_cx_config *cfg, const wchar_t *filename);
void y3_config_load(struct y3_config *cfg, const wchar_t *filename);
void y3_dll_config_load(struct y3_dll_config *cfg, const wchar_t *filename);

View File

@ -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"

View File

@ -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)

View File

@ -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);
}

View File

@ -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);

212
common/hooklib/imageutil.c Normal file
View File

@ -0,0 +1,212 @@
#include <windows.h>
#include <stdbool.h>
#include <stdlib.h>
#include "imageutil.h"
// copy pasted from https://dev.s-ul.net/domeori/c310emu
#define BITMAPHEADERSIZE 0x36
int ConvertDataToBitmap(
DWORD dwBitCount,
DWORD dwWidth, DWORD dwHeight,
PBYTE pbInput, DWORD cbInput,
PBYTE pbOutput, DWORD cbOutput,
PDWORD pcbResult,
bool pFlip) {
if (!pbInput || !pbOutput || dwBitCount < 8) return -3;
if (cbInput < (dwWidth * dwHeight * dwBitCount / 8)) return -3;
PBYTE pBuffer = malloc(cbInput);
if (!pBuffer) return -2;
BYTE dwColors = (BYTE)(dwBitCount / 8);
if (!dwColors) {
free(pBuffer);
return -1;
}
UINT16 cbColors;
RGBQUAD pbColors[256];
switch (dwBitCount) {
case 1:
cbColors = 1;
break;
case 2:
cbColors = 4;
break;
case 4:
cbColors = 16;
break;
case 8:
cbColors = 256;
break;
default:
cbColors = 0;
break;
}
if (cbColors) {
BYTE dwStep = (BYTE)(256 / cbColors);
for (UINT16 i = 0; i < cbColors; ++i) {
pbColors[i].rgbRed = dwStep * i;
pbColors[i].rgbGreen = dwStep * i;
pbColors[i].rgbBlue = dwStep * i;
pbColors[i].rgbReserved = 0;
}
}
DWORD dwTable = cbColors * sizeof(RGBQUAD);
DWORD dwOffset = BITMAPHEADERSIZE + dwTable;
// calculate the padded row size, again
DWORD dwLineSize = (dwWidth * dwBitCount / 8 + 3) & ~3;
BITMAPFILEHEADER bFile = {0};
BITMAPINFOHEADER bInfo = {0};
bFile.bfType = 0x4D42; // MAGIC
bFile.bfSize = dwOffset + cbInput;
bFile.bfOffBits = dwOffset;
bInfo.biSize = sizeof(BITMAPINFOHEADER);
bInfo.biWidth = dwWidth;
bInfo.biHeight = dwHeight;
bInfo.biPlanes = 1;
bInfo.biBitCount = (WORD)dwBitCount;
bInfo.biCompression = BI_RGB;
bInfo.biSizeImage = cbInput;
if (cbOutput < bFile.bfSize) {
free(pBuffer);
return -1;
}
// Flip the image (if necessary) and add padding to each row
if (pFlip) {
for (size_t i = 0; i < dwHeight; i++) {
for (size_t j = 0; j < dwWidth; j++) {
for (size_t k = 0; k < dwColors; k++) {
// Calculate the position in the padded buffer
// Make sure to also flip the colors from RGB to BRG
size_t x = (dwHeight - i - 1) * dwLineSize + (dwWidth - j - 1) * dwColors + (dwColors - k - 1);
size_t y = (dwHeight - i - 1) * dwWidth * dwColors + j * dwColors + k;
*(pBuffer + x) = *(pbInput + y);
}
}
}
} else {
for (size_t i = 0; i < dwHeight; i++) {
for (size_t j = 0; j < dwWidth; j++) {
for (size_t k = 0; k < dwColors; k++) {
// Calculate the position in the padded buffer
size_t x = i * dwLineSize + j * dwColors + (dwColors - k - 1);
size_t y = (dwHeight - i - 1) * dwWidth * dwColors + j * dwColors + k;
*(pBuffer + x) = *(pbInput + y);
}
}
}
}
memcpy(pbOutput, &bFile, sizeof(BITMAPFILEHEADER));
memcpy(pbOutput + sizeof(BITMAPFILEHEADER), &bInfo, sizeof(BITMAPINFOHEADER));
if (cbColors) memcpy(pbOutput + BITMAPHEADERSIZE, pbColors, dwTable);
memcpy(pbOutput + dwOffset, pBuffer, cbInput);
*pcbResult = bFile.bfSize;
free(pBuffer);
return 0;
}
int WriteDataToBitmapFile(
LPCWSTR lpFilePath, DWORD dwBitCount,
DWORD dwWidth, DWORD dwHeight,
PBYTE pbInput, DWORD cbInput,
PBYTE pbMetadata, DWORD cbMetadata,
bool pFlip) {
if (!lpFilePath || !pbInput) return -3;
HANDLE hFile;
DWORD dwBytesWritten;
hFile = CreateFileW(
lpFilePath,
GENERIC_WRITE,
FILE_SHARE_READ,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH,
NULL);
if (hFile == INVALID_HANDLE_VALUE) return -1;
// calculate the padded row size and padded image size
DWORD dwLineSize = (dwWidth * dwBitCount / 8 + 3) & ~3;
DWORD dwImageSize = dwLineSize * dwHeight;
DWORD cbResult;
DWORD cbBuffer = dwImageSize + 0x500;
PBYTE pbBuffer = calloc(cbBuffer, 1);
if (!pbBuffer) return -2;
if (ConvertDataToBitmap(dwBitCount, dwWidth, dwHeight, pbInput, dwImageSize, pbBuffer, cbBuffer, &cbResult, pFlip) < 0) {
cbResult = -1;
goto WriteDataToBitmapFile_End;
}
WriteFile(hFile, pbBuffer, cbResult, &dwBytesWritten, NULL);
if (pbMetadata)
WriteFile(hFile, pbMetadata, cbMetadata, &dwBytesWritten, NULL);
CloseHandle(hFile);
cbResult = dwBytesWritten;
WriteDataToBitmapFile_End:
free(pbBuffer);
return cbResult;
}
int WriteArrayToFile(LPCSTR lpOutputFilePath, LPVOID lpDataTemp, DWORD nDataSize, BOOL isAppend) {
#ifdef NDEBUG
return nDataSize;
#else
HANDLE hFile;
DWORD dwBytesWritten;
DWORD dwDesiredAccess;
DWORD dwCreationDisposition;
if (isAppend) {
dwDesiredAccess = FILE_APPEND_DATA;
dwCreationDisposition = OPEN_ALWAYS;
} else {
dwDesiredAccess = GENERIC_WRITE;
dwCreationDisposition = CREATE_ALWAYS;
}
hFile = CreateFileA(
lpOutputFilePath,
dwDesiredAccess,
FILE_SHARE_READ,
NULL,
dwCreationDisposition,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH,
NULL);
if (hFile == INVALID_HANDLE_VALUE) {
return FALSE;
}
WriteFile(hFile, lpDataTemp, nDataSize, &dwBytesWritten, NULL);
CloseHandle(hFile);
return dwBytesWritten;
#endif
}

View File

@ -0,0 +1,21 @@
#pragma once
#include <windows.h>
#include <stdbool.h>
int ConvertDataToBitmap(
DWORD dwBitCount,
DWORD dwWidth, DWORD dwHeight,
PBYTE pbInput, DWORD cbInput,
PBYTE pbOutput, DWORD cbOutput,
PDWORD pcbResult,
bool pFlip);
int WriteDataToBitmapFile(
LPCWSTR lpFilePath, DWORD dwBitCount,
DWORD dwWidth, DWORD dwHeight,
PBYTE pbInput, DWORD cbInput,
PBYTE pbMetadata, DWORD cbMetadata,
bool pFlip);
int WriteArrayToFile(LPCSTR lpOutputFilePath, LPVOID lpDataTemp, DWORD nDataSize, BOOL isAppend);

Some files were not shown because too many files have changed in this diff Show More