Compare commits

...

35 Commits

Author SHA1 Message Date
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
36849bd09a Merge branch 'feature/ffb' into develop 2024-09-30 23:23:23 +02:00
4fa9abffe8 printer: add ability to delay printing 2024-09-27 11:06:18 +02:00
201 changed files with 1607 additions and 497 deletions

4
.clang-format Normal file
View File

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

View File

@ -1,6 +1,6 @@
# Segatools
Version: `2024-08-20`
Version: `2024-09-30`
Loaders and hardware emulators for SEGA games that run on the Nu and ALLS platforms.

View File

@ -12,6 +12,7 @@
#include "util/crc.h"
#include "util/dprintf.h"
#include "util/env.h"
struct aime_io_config {
wchar_t aime_path[MAX_PATH];
@ -222,7 +223,7 @@ uint16_t aime_io_get_api_version(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;
}

View File

@ -3,7 +3,6 @@ aimeio_lib = static_library(
name_prefix : '',
include_directories: inc,
implicit_include_directories : false,
c_pch : '../precompiled.h',
link_with : [
util_lib,
],

View File

@ -1,10 +1,11 @@
#include <windows.h>
#include <devioctl.h>
#include <ntdddisk.h>
#include <winioctl.h>
#include <assert.h>
#include <ctype.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include "amex/ds.h"
@ -19,13 +20,11 @@
#include "util/dprintf.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 {
DS_IOCTL_GET_ABI_VERSION = 0x80006000,
DS_IOCTL_SETUP = 0x80006004,
DS_IOCTL_READ_SECTOR = 0x80006010,
};
#pragma pack(push, 1)
struct ds_eeprom {
uint32_t crc32;

View File

@ -6,7 +6,7 @@
#include <winnt.h>
#endif
#include <devioctl.h>
#include <ntdddisk.h>
#include <winioctl.h>
#include <assert.h>
@ -20,9 +20,7 @@
#include "util/dprintf.h"
#include "util/str.h"
enum {
EEPROM_IOCTL_GET_ABI_VERSION = 0x80006000,
};
#define EEPROM_IOCTL_GET_ABI_VERSION CTL_CODE(0x8000, 0x800, METHOD_BUFFERED, FILE_READ_ACCESS)
static HRESULT eeprom_handle_irp(struct irp *irp);
static HRESULT eeprom_handle_open(struct irp *irp);

View File

@ -1,5 +1,6 @@
#include <windows.h>
#include <ntstatus.h>
#include <winioctl.h>
#include <assert.h>
#include <string.h>
@ -13,12 +14,10 @@
#include "util/dprintf.h"
#include "util/str.h"
enum {
GPIO_IOCTL_SET_LEDS = 0x8000A004,
GPIO_IOCTL_GET_PSW = 0x80006008,
GPIO_IOCTL_GET_DIPSW = 0x8000600C,
GPIO_IOCTL_DESCRIBE = 0x80006014,
};
#define GPIO_IOCTL_SET_LEDS CTL_CODE(0x8000, 0x801, METHOD_BUFFERED, FILE_WRITE_ACCESS)
#define GPIO_IOCTL_GET_PSW CTL_CODE(0x8000, 0x802, METHOD_BUFFERED, FILE_READ_ACCESS)
#define GPIO_IOCTL_GET_DIPSW CTL_CODE(0x8000, 0x803, METHOD_BUFFERED, FILE_READ_ACCESS)
#define GPIO_IOCTL_DESCRIBE CTL_CODE(0x8000, 0x805, METHOD_BUFFERED, FILE_READ_ACCESS)
enum {
GPIO_TYPE_NONE = 0,

View File

@ -4,6 +4,7 @@
#include <winternl.h>
#include <ntstatus.h>
#include <winioctl.h>
#include <assert.h>
#include <stddef.h>
@ -21,11 +22,9 @@
#include "util/dump.h"
#include "util/str.h"
enum {
JVS_IOCTL_HELLO = 0x80006004,
JVS_IOCTL_SENSE = 0x8000600C,
JVS_IOCTL_TRANSACT = 0x8000E008,
};
#define JVS_IOCTL_HELLO CTL_CODE(0x8000, 0x801, METHOD_BUFFERED, FILE_READ_ACCESS)
#define JVS_IOCTL_TRANSACT CTL_CODE(0x8000, 0x802, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
#define JVS_IOCTL_SENSE CTL_CODE(0x8000, 0x803, METHOD_BUFFERED, FILE_READ_ACCESS)
static HRESULT jvs_handle_irp(struct irp *irp);
static HRESULT jvs_handle_open(struct irp *irp);

View File

@ -2,7 +2,6 @@ amex_lib = static_library(
'amex',
include_directories : inc,
implicit_include_directories : false,
c_pch : '../precompiled.h',
dependencies : [
capnhook.get_variable('hook_dep'),
],

View File

@ -6,7 +6,7 @@
#include <winnt.h>
#endif
#include <devioctl.h>
#include <ntdddisk.h>
#include <winioctl.h>
#include <assert.h>
@ -20,9 +20,7 @@
#include "util/dprintf.h"
#include "util/str.h"
enum {
SRAM_IOCTL_GET_ABI_VERSION = 0x80006000,
};
#define SRAM_IOCTL_GET_ABI_VERSION CTL_CODE(0x8000, 0x800, METHOD_BUFFERED, FILE_READ_ACCESS)
static HRESULT sram_handle_irp(struct irp *irp);
static HRESULT sram_handle_open(struct irp *irp);

View File

@ -1,6 +1,7 @@
#pragma once
#include <windows.h>
#include <stdbool.h>
#include "aimeio/aimeio.h"

View File

@ -72,6 +72,7 @@ void aime_config_load(struct aime_config *cfg, const wchar_t *filename)
aime_dll_config_load(&cfg->dll, filename);
cfg->enable = GetPrivateProfileIntW(L"aime", L"enable", 1, filename);
cfg->port_no = GetPrivateProfileIntW(L"aime", L"portNo", 0, filename);
cfg->high_baudrate = GetPrivateProfileIntW(L"aime", L"highBaud", 1, filename);
cfg->gen = GetPrivateProfileIntW(L"aime", L"gen", 0, filename);
}
@ -90,7 +91,7 @@ void vfd_config_load(struct vfd_config *cfg, const wchar_t *filename)
assert(filename != NULL);
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);
}

View File

@ -2,6 +2,7 @@
#include <windows.h>
#include <stdbool.h>
#include <stdint.h>
struct ffb_config {
bool enable;

View File

@ -16,6 +16,7 @@
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <stdlib.h>
#include "board/io3.h"

View File

@ -7,6 +7,7 @@
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <stdlib.h>
#include "board/config.h"
#include "board/guid.h"

View File

@ -3,6 +3,7 @@
#include <windows.h>
#include <stdint.h>
#include <stdbool.h>
#define IO4_REPORT_OUT_PAYLOAD_LEN 62

View File

@ -13,6 +13,7 @@
#include <process.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
@ -242,7 +243,7 @@ static HRESULT led15070_handle_irp_locked(int board, struct irp *irp)
dump_iobuf(&boarduart->written);
#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.pos = 0;

View File

@ -88,7 +88,7 @@ struct led15093_req_reset {
struct led15093_req_set_timeout {
struct led15093_req_hdr hdr;
uint8_t cmd;
uint8_t count;
uint16_t count;
};
struct led15093_req_set_disable_response {

View File

@ -20,6 +20,7 @@
#include <process.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include "board/led15093-cmd.h"
@ -272,7 +273,7 @@ static HRESULT led15093_handle_irp_locked(int board, struct irp *irp)
dump_iobuf(&boarduart->written);
#endif
req_iobuf.bytes = (byte*)&req;
req_iobuf.bytes = (uint8_t*)&req;
req_iobuf.nbytes = sizeof(req.hdr) + sizeof(req.payload);
req_iobuf.pos = 0;

View File

@ -2,7 +2,6 @@ board_lib = static_library(
'board',
include_directories : inc,
implicit_include_directories : false,
c_pch : '../precompiled.h',
dependencies : [
capnhook.get_variable('hook_dep'),
],

View File

@ -354,13 +354,13 @@ static HRESULT sg_nfc_poll_felica(
felica->type = 0x20;
felica->id_len = sizeof(felica->IDm) + sizeof(felica->PMm);
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 */
nfc->felica.IDm = IDm;
nfc->felica.PMm = felica_get_generic_PMm();
nfc->felica.system_code = 0x0000;
nfc->felica.PMm = felica_get_amusement_ic_PMm();
nfc->felica.system_code = 0x88b4;
return S_OK;
}

View File

@ -47,7 +47,7 @@ static struct sg_led sg_reader_led;
HRESULT sg_reader_hook_init(
const struct aime_config *cfg,
unsigned int port_no,
unsigned int default_port_no,
unsigned int gen,
HINSTANCE self)
{
@ -66,6 +66,11 @@ HRESULT sg_reader_hook_init(
return hr;
}
unsigned int port_no = cfg->port_no;
if (port_no == 0){
port_no = default_port_no;
}
if (cfg->gen != 0) {
gen = cfg->gen;
}
@ -85,6 +90,7 @@ HRESULT sg_reader_hook_init(
sg_reader_uart.baud.BaudRate = 38400;
}
dprintf("NFC Assembly: enabling (port=%d)\n", port_no);
uart_init(&sg_reader_uart, port_no);
sg_reader_uart.written.bytes = sg_reader_written_bytes;
sg_reader_uart.written.nbytes = sizeof(sg_reader_written_bytes);

View File

@ -9,12 +9,13 @@
struct aime_config {
struct aime_dll_config dll;
bool enable;
unsigned int port_no;
bool high_baudrate;
unsigned int gen;
};
HRESULT sg_reader_hook_init(
const struct aime_config *cfg,
unsigned int port_no,
unsigned int default_port_no,
unsigned int gen,
HINSTANCE self);

View File

@ -8,6 +8,7 @@
#include <assert.h>
#include <stdint.h>
#include <stdlib.h>
#include "board/config.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;
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){
return S_FALSE;
@ -58,13 +59,13 @@ HRESULT vfd_hook_init(struct vfd_config *cfg, int default_port)
utf_enabled = cfg->utf_conversion;
int port = cfg->port;
if (port == 0){
port = default_port;
unsigned int port_no = cfg->port_no;
if (port_no == 0){
port_no = default_port_no;
}
dprintf("VFD: enabling (port=%d)\n", port);
uart_init(&vfd_uart, port);
dprintf("VFD: enabling (port=%d)\n", port_no);
uart_init(&vfd_uart, port_no);
vfd_uart.written.bytes = vfd_written;
vfd_uart.written.nbytes = sizeof(vfd_written);
vfd_uart.readable.bytes = vfd_readable;

View File

@ -4,10 +4,10 @@
struct vfd_config {
bool enable;
int port;
unsigned int port_no;
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

@ -53,6 +53,7 @@
#include "platform/platform.h"
#include "util/dprintf.h"
#include "util/env.h"
static HMODULE carol_hook_mod;
static process_entry_t carol_startup;
@ -100,7 +101,7 @@ static DWORD CALLBACK carol_pre_startup(void)
/* Config load */
carol_hook_config_load(&carol_hook_cfg, L".\\segatools.ini");
carol_hook_config_load(&carol_hook_cfg, get_config_path());
/* Hook Win32 APIs */
@ -164,7 +165,7 @@ static DWORD CALLBACK carol_pre_startup(void)
}
/* Initialize debug helpers */
spike_hook_init(L".\\segatools.ini");
spike_hook_init(get_config_path());
dprintf("--- End carol_pre_startup ---\n");

View File

@ -4,7 +4,6 @@ shared_library(
include_directories : inc,
implicit_include_directories : false,
vs_module_defs : 'carolhook.def',
c_pch : '../precompiled.h',
dependencies : [
capnhook.get_variable('hook_dep'),
capnhook.get_variable('hooklib_dep'),

View File

@ -8,6 +8,7 @@
#include "carolio/carolio.h"
#include "carolio/config.h"
#include "util/dprintf.h"
#include "util/env.h"
static unsigned int __stdcall carol_io_touch_thread_proc(void *ctx);
@ -25,7 +26,7 @@ uint16_t carol_io_get_api_version(void)
HRESULT carol_io_jvs_init(void)
{
carol_io_config_load(&carol_io_cfg, L".\\segatools.ini");
carol_io_config_load(&carol_io_cfg, get_config_path());
return S_OK;
}
@ -178,4 +179,4 @@ static unsigned int __stdcall carol_io_touch_thread_proc(void *ctx)
}
return 0;
}
}

View File

@ -3,7 +3,6 @@ carolio_lib = static_library(
name_prefix : '',
include_directories : inc,
implicit_include_directories : false,
c_pch : '../precompiled.h',
sources : [
'carolio.c',
'carolio.h',

View File

@ -3,6 +3,7 @@
#include <assert.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdlib.h>
#include "amex/amex.h"
#include "amex/config.h"

View File

@ -36,6 +36,7 @@
#include "platform/platform.h"
#include "util/dprintf.h"
#include "util/env.h"
static HMODULE chuni_hook_mod;
static process_entry_t chuni_startup;
@ -71,7 +72,7 @@ static DWORD CALLBACK chuni_pre_startup(void)
/* Config load */
chuni_hook_config_load(&chuni_hook_cfg, L".\\segatools.ini");
chuni_hook_config_load(&chuni_hook_cfg, get_config_path());
/* Hook Win32 APIs */
@ -129,7 +130,7 @@ static DWORD CALLBACK chuni_pre_startup(void)
/* Initialize debug helpers */
spike_hook_init(L".\\segatools.ini");
spike_hook_init(get_config_path());
dprintf("--- End chuni_pre_startup ---\n");

View File

@ -4,7 +4,6 @@ shared_library(
include_directories : inc,
implicit_include_directories : false,
vs_module_defs : 'chunihook.def',
c_pch : '../precompiled.h',
dependencies : [
capnhook.get_variable('hook_dep'),
capnhook.get_variable('hooklib_dep'),

View File

@ -4,12 +4,14 @@
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include "chuniio/chuniio.h"
#include "chuniio/config.h"
#include "chuniio/ledoutput.h"
#include "util/dprintf.h"
#include "util/env.h"
static unsigned int __stdcall chuni_io_slider_thread_proc(void *ctx);
@ -27,7 +29,7 @@ uint16_t chuni_io_get_api_version(void)
HRESULT chuni_io_jvs_init(void)
{
chuni_io_config_load(&chuni_io_cfg, L".\\segatools.ini");
chuni_io_config_load(&chuni_io_cfg, get_config_path());
led_init_mutex = CreateMutex(
NULL, // default security attributes
@ -92,7 +94,7 @@ void chuni_io_jvs_poll(uint8_t *opbtn, uint8_t *beams)
} else {
// Use actual AIR
for (i = 0; i < 6; i++) {
if(GetAsyncKeyState(chuni_io_cfg.vk_ir[i]) & 0x8000) {
if (GetAsyncKeyState(chuni_io_cfg.vk_ir[i]) & 0x8000) {
*beams |= (1 << i);
} else {
*beams &= ~(1 << i);

View File

@ -3,6 +3,7 @@
#include <assert.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "chuniio/config.h"

View File

@ -2,6 +2,7 @@
#include <stddef.h>
#include <stdint.h>
#include <stdbool.h>
struct chuni_io_config {
uint8_t vk_test;

View File

@ -13,10 +13,10 @@
// This struct is used to send data related to the slider and billboard LEDs
struct _chuni_led_data_buf_t {
byte framing; // Sync byte
uint8_t framing; // Sync byte
uint8_t board; // LED output the data is for (0-1: billboard, 2: slider)
byte data[LED_OUTPUT_DATA_SIZE_MAX]; // Buffer for LEDs
byte data_len; // How many bytes to output from the buffer
uint8_t data[LED_OUTPUT_DATA_SIZE_MAX]; // Buffer for LEDs
uint8_t data_len; // How many bytes to output from the buffer
};
static byte chuni_led_board_data_lens[LED_BOARDS_TOTAL] = {53*3, 63*3, 31*3};
static uint8_t chuni_led_board_data_lens[LED_BOARDS_TOTAL] = {53*3, 63*3, 31*3};

View File

@ -73,14 +73,14 @@ struct _chuni_led_data_buf_t* escape_led_data(struct _chuni_led_data_buf_t* unes
{
struct _chuni_led_data_buf_t* out_struct = &led_escaped_buf[unescaped->board];
byte* in_buf = unescaped->data;
byte* out_buf = out_struct->data;
uint8_t* in_buf = unescaped->data;
uint8_t* out_buf = out_struct->data;
int i = 0;
int o = 0;
while (i < unescaped->data_len)
{
byte b = in_buf[i++];
uint8_t b = in_buf[i++];
if (b == LED_PACKET_FRAMING || b == LED_PACKET_ESCAPE)
{
out_buf[o++] = LED_PACKET_ESCAPE;
@ -94,7 +94,7 @@ struct _chuni_led_data_buf_t* escape_led_data(struct _chuni_led_data_buf_t* unes
return out_struct;
}
void led_output_update(uint8_t board, const byte* rgb)
void led_output_update(uint8_t board, const uint8_t* rgb)
{
if (board < 0 || board > 2 || !any_outputs_enabled)
{

View File

@ -16,4 +16,4 @@
extern HANDLE led_init_mutex;
HRESULT led_output_init(struct chuni_io_config* const cfg);
void led_output_update(uint8_t board, const byte* rgb);
void led_output_update(uint8_t board, const uint8_t* rgb);

View File

@ -3,7 +3,6 @@ chuniio_lib = static_library(
name_prefix : '',
include_directories : inc,
implicit_include_directories : false,
c_pch : '../precompiled.h',
sources : [
'chu2to3.c',

View File

@ -98,7 +98,7 @@ void led_serial_update(struct _chuni_led_data_buf_t* data)
ReleaseMutex(serial_write_mutex);
}
void led_serial_update_openithm(const byte* rgb)
void led_serial_update_openithm(const uint8_t* rgb)
{
if (serial_port != INVALID_HANDLE_VALUE)
{

View File

@ -8,9 +8,10 @@
#pragma once
#include <windows.h>
#include <stdint.h>
#include "chuniio/leddata.h"
HRESULT led_serial_init(wchar_t led_com[12], DWORD baud);
void led_serial_update(struct _chuni_led_data_buf_t* data);
void led_serial_update_openithm(const byte* rgb);
void led_serial_update_openithm(const uint8_t* rgb);

View File

@ -2,6 +2,7 @@
#include <assert.h>
#include <stdlib.h>
#include <stdlib.h>
#include "chuniio/chu2to3.h"
#include "chusanhook/chuni-dll.h"

View File

@ -1,5 +1,6 @@
#include <assert.h>
#include <stddef.h>
#include <stdlib.h>
#include "board/config.h"

View File

@ -49,6 +49,7 @@
#include "platform/platform.h"
#include "util/dprintf.h"
#include "util/env.h"
static HMODULE chusan_hook_mod;
static process_entry_t chusan_startup;
@ -84,7 +85,7 @@ static DWORD CALLBACK chusan_pre_startup(void)
/* Config load */
chusan_hook_config_load(&chusan_hook_cfg, L".\\segatools.ini");
chusan_hook_config_load(&chusan_hook_cfg, get_config_path());
/* Hook Win32 APIs */
@ -173,7 +174,7 @@ static DWORD CALLBACK chusan_pre_startup(void)
/* Initialize debug helpers */
spike_hook_init(L".\\segatools.ini");
spike_hook_init(get_config_path());
dprintf("--- End chusan_pre_startup ---\n");

View File

@ -4,7 +4,6 @@ shared_library(
include_directories : inc,
implicit_include_directories : false,
vs_module_defs : 'chusanhook.def',
c_pch : '../precompiled.h',
dependencies : [
capnhook.get_variable('hook_dep'),
capnhook.get_variable('hooklib_dep'),

View File

@ -1,5 +1,6 @@
#include <assert.h>
#include <stddef.h>
#include <stdlib.h>
#include "board/config.h"

View File

@ -35,6 +35,7 @@
#include "unityhook/hook.h"
#include "util/dprintf.h"
#include "util/env.h"
static HMODULE cm_hook_mod;
static process_entry_t cm_startup;
@ -48,7 +49,7 @@ static DWORD CALLBACK cm_pre_startup(void)
/* Load config */
cm_hook_config_load(&cm_hook_cfg, L".\\segatools.ini");
cm_hook_config_load(&cm_hook_cfg, get_config_path());
/* Hook Win32 APIs */
@ -105,7 +106,7 @@ static DWORD CALLBACK cm_pre_startup(void)
/* Initialize debug helpers */
spike_hook_init(L".\\segatools.ini");
spike_hook_init(get_config_path());
dprintf("--- End cm_pre_startup ---\n");

View File

@ -4,7 +4,6 @@ shared_library(
include_directories : inc,
implicit_include_directories : false,
vs_module_defs : 'cmhook.def',
c_pch : '../precompiled.h',
dependencies : [
capnhook.get_variable('hook_dep'),
capnhook.get_variable('hooklib_dep'),

View File

@ -6,6 +6,7 @@
#include "cmio/cmio.h"
#include "cmio/config.h"
#include "util/env.h"
static uint8_t cm_opbtn;
static struct cm_io_config cm_io_cfg;
@ -18,7 +19,7 @@ uint16_t cm_io_get_api_version(void)
HRESULT cm_io_init(void)
{
cm_io_config_load(&cm_io_cfg, L".\\segatools.ini");
cm_io_config_load(&cm_io_cfg, get_config_path());
return S_OK;
}

View File

@ -3,7 +3,6 @@ cmio_lib = static_library(
name_prefix : '',
include_directories : inc,
implicit_include_directories : false,
c_pch : '../precompiled.h',
sources : [
'cmio.c',
'cmio.h',

View File

@ -3,6 +3,7 @@
#include <assert.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdlib.h>
#include "amex/amex.h"
#include "amex/config.h"

View File

@ -23,6 +23,7 @@
#include "platform/platform.h"
#include "util/dprintf.h"
#include "util/env.h"
static HMODULE cxb_hook_mod;
static process_entry_t cxb_startup;
@ -58,7 +59,7 @@ static DWORD CALLBACK cxb_pre_startup(void)
/* Config load */
cxb_hook_config_load(&cxb_hook_cfg, L".\\segatools.ini");
cxb_hook_config_load(&cxb_hook_cfg, get_config_path());
/* Hook Win32 APIs */
@ -110,7 +111,7 @@ static DWORD CALLBACK cxb_pre_startup(void)
/* Initialize debug helpers */
spike_hook_init(L".\\segatools.ini");
spike_hook_init(get_config_path());
dprintf("--- End cxb_pre_startup ---\n");

View File

@ -1,6 +1,9 @@
#include <windows.h>
#include <assert.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>
#include "cxbhook/led.h"
#include "cxbhook/cxb-dll.h"

View File

@ -4,7 +4,6 @@ shared_library(
include_directories : inc,
implicit_include_directories : false,
vs_module_defs : 'cxbhook.def',
c_pch : '../precompiled.h',
dependencies : [
capnhook.get_variable('hook_dep'),
capnhook.get_variable('hooklib_dep'),

View File

@ -1,6 +1,9 @@
#include <windows.h>
#include <assert.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>
#include <winuser.h>
#include "cxbhook/revio.h"

View File

@ -8,6 +8,7 @@
#include "cxbio/config.h"
#include "util/dprintf.h"
#include "util/env.h"
static bool cxb_io_coin;
static int cxb_io_coins;
@ -21,7 +22,7 @@ uint16_t cxb_io_get_api_version(void)
HRESULT cxb_io_revio_init(void)
{
dprintf("CXB IO: REVIO init\n");
cxb_io_config_load(&cxb_io_cfg, L".\\segatools.ini");
cxb_io_config_load(&cxb_io_cfg, get_config_path());
return S_OK;
}
@ -75,4 +76,4 @@ HRESULT cxb_io_led_init(void)
}
void cxb_io_led_update(int id, int color)
{}
{}

View File

@ -3,7 +3,6 @@ cxbio_lib = static_library(
name_prefix : '',
include_directories : inc,
implicit_include_directories : false,
c_pch : '../precompiled.h',
sources : [
'cxbio.c',
'cxbio.h',

View File

@ -64,6 +64,8 @@ subnet=192.168.126.0
; -----------------------------------------------------------------------------
[gfx]
; Enables the graphics hook.
enable=1
; Force the game to run windowed.
windowed=1
; Add a frame to the game window if running windowed.

View File

@ -56,6 +56,8 @@ subnet=192.168.139.0
; -----------------------------------------------------------------------------
[gfx]
; Enables the graphics hook.
enable=1
; Force the game to run windowed.
windowed=1
; Add a frame to the game window if running windowed.

View File

@ -82,6 +82,8 @@ dipsw3=1
; -----------------------------------------------------------------------------
[gfx]
; Enables the graphics hook.
enable=1
; Force the game to run windowed.
windowed=1
; Add a frame to the game window if running windowed.

View File

@ -75,6 +75,8 @@ path=../DEVICE/sram.bin
; -----------------------------------------------------------------------------
[gfx]
; Enables the graphics hook.
enable=1
; Force the game to run windowed.
windowed=1
; Add a frame to the game window if running windowed.

View File

@ -5,7 +5,7 @@
[vfs]
; Insert the path to the game AMFS directory here (contains ICF1 and ICF2)
amfs=
; Insert the path to the game Option directory here (contains Axxx directories)
; Insert the path to the game Option (mdata) directory here (contains Mxxx directories)
option=
; Create an empty directory somewhere and insert the path here.
; This directory may be shared between multiple SEGA games.
@ -36,6 +36,10 @@ default=127.0.0.1
; Chunithm is extremely picky about its LAN environment, so leaving this
; setting enabled is strongly recommended.
enable=1
; The final octet of the local host's IP address on the virtualized subnet (so,
; if the keychip subnet is `192.168.32.0` and this value is set to `11`, then the
; local host's virtualized LAN IP is `192.168.32.11`).
addrSuffix=11
; -----------------------------------------------------------------------------
; Board settings
@ -54,6 +58,18 @@ dipsw1=1
; that subnet must start with 192.168.
subnet=192.168.78.0
; -----------------------------------------------------------------------------
; Misc. hooks settings
; -----------------------------------------------------------------------------
[gfx]
; Enables the graphics hook.
enable=1
; Force the game to run windowed.
windowed=1
; Add a frame to the game window if running windowed.
framed=0
; -----------------------------------------------------------------------------
; Custom IO settings
; -----------------------------------------------------------------------------

View File

@ -85,6 +85,14 @@ freeplay=0
; Misc. hook settings
; -----------------------------------------------------------------------------
[gfx]
; Enables the graphics hook.
enable=1
; Force the game to run windowed.
windowed=0
; Add a frame to the game window if running windowed.
framed=0
[touch]
; WinTouch emulation setting.
enable=1

View File

@ -250,7 +250,6 @@ constantForceStrength=100
damperStrength=100
; Rumble strength, used for road surface effects.
; WARNING: THIS WILL CRASH ON FANATEC (maybe even more) WHEELS!
rumbleStrength=100
; Rumble duration factor from ms to µs, used to scale the duration of the rumble effect.
rumbleDuration=1000

View File

@ -240,7 +240,6 @@ constantForceStrength=100
damperStrength=100
; Rumble strength, used for road surface effects.
; WARNING: THIS WILL CRASH ON FANATEC (maybe even more) WHEELS!
rumbleStrength=100
; Rumble duration factor from ms to µs, used to scale the duration of the rumble effect.
rumbleDuration=1000

View File

@ -89,6 +89,9 @@ enable=1
serial_no="5A-A123"
; Insert the path to the image output directory here.
printerOutPath="DEVICE\print"
; The length in milliseconds the printer should be busy printing.
; Set to 0 to instantly finish printing.
waitTime=20000
; -----------------------------------------------------------------------------
; LED settings

View File

@ -74,6 +74,7 @@ dipsw1=1
; -----------------------------------------------------------------------------
[gfx]
; Enables the graphics hook.
enable=1
; Hooks related to the touch boards

View File

@ -70,6 +70,7 @@ dipsw1=1
; -----------------------------------------------------------------------------
[gfx]
; Enables the graphics hook.
enable=1
[unity]

View File

@ -200,7 +200,6 @@ constantForceStrength=100
damperStrength=100
; Rumble strength, used for road surface effects.
; WARNING: THIS WILL CRASH ON FANATEC (maybe even more) WHEELS!
rumbleStrength=100
; Rumble duration factor from ms to µs, used to scale the duration of the rumble effect.
rumbleDuration=1000

View File

@ -8,6 +8,9 @@
#include "board/config.h"
#include "board/sg-reader.h"
#include "hooklib/config.h"
#include "hooklib/dvd.h"
#include "divahook/config.h"
#include "platform/config.h"
@ -47,6 +50,8 @@ void diva_hook_config_load(
platform_config_load(&cfg->platform, filename);
amex_config_load(&cfg->amex, filename);
aime_config_load(&cfg->aime, filename);
dvd_config_load(&cfg->dvd, filename);
gfx_config_load(&cfg->gfx, filename);
diva_dll_config_load(&cfg->dll, filename);
slider_config_load(&cfg->slider, filename);
}

View File

@ -6,15 +6,23 @@
#include "board/sg-reader.h"
#include "hooklib/dvd.h"
#include "hooklib/touch.h"
#include "gfxhook/config.h"
#include "platform/config.h"
#include "divahook/diva-dll.h"
#include "divahook/slider.h"
#include "platform/platform.h"
struct diva_hook_config {
struct platform_config platform;
struct amex_config amex;
struct aime_config aime;
struct dvd_config dvd;
struct gfx_config gfx;
struct touch_screen_config touch;
struct diva_dll_config dll;
struct slider_config slider;
};

View File

@ -22,6 +22,9 @@
#include "divahook/jvs.h"
#include "divahook/slider.h"
#include "gfxhook/gfx.h"
#include "gfxhook/gl.h"
#include "hook/process.h"
#include "hooklib/serial.h"
@ -30,6 +33,7 @@
#include "platform/platform.h"
#include "util/dprintf.h"
#include "util/env.h"
static HMODULE diva_hook_mod;
static process_entry_t diva_startup;
@ -38,15 +42,30 @@ static struct diva_hook_config diva_hook_cfg;
static DWORD CALLBACK diva_pre_startup(void)
{
HRESULT hr;
HMODULE dbghelp;
dprintf("--- Begin diva_pre_startup ---\n");
/* Pin dbghelp so the path hooks apply to it. */
dbghelp = LoadLibraryW(L"dbghelp.dll");
if (dbghelp != NULL) {
dprintf("Pinned debug helper library, hMod=%p\n", dbghelp);
}
else {
dprintf("Failed to load debug helper library!\n");
}
/* Config load */
diva_hook_config_load(&diva_hook_cfg, L".\\segatools.ini");
diva_hook_config_load(&diva_hook_cfg, get_config_path());
/* Hook Win32 APIs */
dvd_hook_init(&diva_hook_cfg.dvd, diva_hook_mod);
gfx_hook_init(&diva_hook_cfg.gfx);
gfx_gl_hook_init(&diva_hook_cfg.gfx, diva_hook_mod);
serial_hook_init();
/* Initialize emulation hooks */
@ -87,7 +106,7 @@ static DWORD CALLBACK diva_pre_startup(void)
/* Initialize debug helpers */
spike_hook_init(L".\\segatools.ini");
spike_hook_init(get_config_path());
dprintf("--- End diva_pre_startup ---\n");

View File

@ -63,33 +63,33 @@ static void diva_jvs_read_switches(void *ctx, struct io3_switch_state *out)
diva_dll.jvs_poll(&opbtn, &gamebtn);
if (gamebtn & 0x01) {
if (gamebtn & DIVA_IO_GAMEBTN_CIRCLE) {
out->p1 |= 1 << 6;
}
if (gamebtn & 0x02) {
if (gamebtn & DIVA_IO_GAMEBTN_CROSS) {
out->p1 |= 1 << 7;
}
if (gamebtn & 0x04) {
if (gamebtn & DIVA_IO_GAMEBTN_SQUARE) {
out->p1 |= 1 << 8;
}
if (gamebtn & 0x08) {
if (gamebtn & DIVA_IO_GAMEBTN_TRIANGLE) {
out->p1 |= 1 << 9;
}
if (gamebtn & 0x10) {
if (gamebtn & DIVA_IO_GAMEBTN_START) {
out->p1 |= 1 << 15;
}
if (opbtn & 0x01) {
if (opbtn & DIVA_IO_OPBTN_TEST) {
out->system = 0x80;
} else {
out->system = 0;
}
if (opbtn & 0x02) {
if (opbtn & DIVA_IO_OPBTN_SERVICE) {
out->p1 |= 1 << 14;
}
}

View File

@ -4,7 +4,6 @@ shared_library(
include_directories : inc,
implicit_include_directories : false,
vs_module_defs : 'divahook.def',
c_pch : '../precompiled.h',
dependencies : [
capnhook.get_variable('hook_dep'),
capnhook.get_variable('hooklib_dep'),
@ -14,6 +13,7 @@ shared_library(
amex_lib,
board_lib,
divaio_lib,
gfxhook_lib,
hooklib_lib,
jvs_lib,
platform_lib,

View File

@ -7,6 +7,7 @@
#include "divaio/divaio.h"
#include "divaio/config.h"
#include "util/env.h"
static unsigned int __stdcall diva_io_slider_thread_proc(void *ctx);
@ -23,7 +24,7 @@ uint16_t diva_io_get_api_version(void)
HRESULT diva_io_jvs_init(void)
{
diva_io_config_load(&diva_io_cfg, L".\\segatools.ini");
diva_io_config_load(&diva_io_cfg, get_config_path());
return S_OK;
}
@ -37,11 +38,11 @@ void diva_io_jvs_poll(uint8_t *opbtn_out, uint8_t *gamebtn_out)
opbtn = 0;
if (GetAsyncKeyState(diva_io_cfg.vk_test) & 0x8000) {
opbtn |= 1;
opbtn |= DIVA_IO_OPBTN_TEST;
}
if (GetAsyncKeyState(diva_io_cfg.vk_service) & 0x8000) {
opbtn |= 2;
opbtn |= DIVA_IO_OPBTN_SERVICE;
}
for (i = 0 ; i < _countof(diva_io_cfg.vk_buttons) ; i++) {

View File

@ -5,6 +5,19 @@
#include <stdbool.h>
#include <stdint.h>
enum {
DIVA_IO_OPBTN_TEST = 0x01,
DIVA_IO_OPBTN_SERVICE = 0x02
};
enum {
DIVA_IO_GAMEBTN_CIRCLE = 0x01,
DIVA_IO_GAMEBTN_CROSS = 0x02,
DIVA_IO_GAMEBTN_SQUARE = 0x04,
DIVA_IO_GAMEBTN_TRIANGLE = 0x08,
DIVA_IO_GAMEBTN_START = 0x10,
};
/* Get the version of the Project Diva IO API that this DLL supports. This
function should return a positive 16-bit integer, where the high byte is
the major version and the low byte is the minor version (as defined by the

View File

@ -3,7 +3,6 @@ divaio_lib = static_library(
name_prefix : '',
include_directories : inc,
implicit_include_directories : false,
c_pch : '../precompiled.h',
sources : [
'divaio.c',
'divaio.h',

View File

@ -6,6 +6,17 @@ all games.
Keyboard binding settings use
[Virtual-Key Codes](https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes).
## Config Path
The default file path for config file is `./segatools.ini`.
You can modify environment variable `SEGATOOLS_CONFIG_PATH` to another path.
For example, You can have another `start.bat` with following code in it,
Then you can copy `segatools.ini` to `another_config.ini` but with different dns host in it
```bat
set SEGATOOLS_CONFIG_PATH=.\another_config.ini
```
## `[aimeio]`
Controls the card reader driver.
@ -31,6 +42,12 @@ Default: `1`
Enable Aime card reader assembly emulation. Disable to use a real SEGA Aime
reader (COM port number varies by game).
### `portNo`
Default: (game specific)
Sets the COM port to use for the aime card reader assembly.
### `highBaud`
Default: `1`
@ -197,6 +214,30 @@ Default: Empty string (i.e. use value from `default` setting)
Overrides the target of the `aime.naominet.jp` host lookup.
### `replaceHost`
Default: `0`
Replace the HOST field in HTTP request headers with the settings above. This may help bypass network restrictions in some regions.
### `startupPort`
Default: `0` (i.e. no operation will perform)
Overrides the port of connections to the `startup` server. The current implementation affects every TCP connection to the port 80.
### `billingPort`
Default: `0` (i.e. no operation will perform)
Overrides the port of connections to the `billing` server. The current implementation affects every TCP connection to the port 8443.
### `aimedbPort`
Default: `0` (i.e. no operation will perform)
Overrides the port of connections to the `aimedb` server. The current implementation affects every TCP connection to the port 22345.
## `[ds]`
Controls emulation of the "DS (Dallas Semiconductor) EEPROM" chip on the AMEX
@ -565,3 +606,16 @@ Default: Empty string
Configure the location of the "Option" data mount point. This mount point is
optional (hence the name, probably) and contains directories which contain
minor over-the-air content updates.
## `[openssl]`
Enable or disable the application of the OpenSSL patch for Intel Gen 10 or newer CPUs.
### `enable`
Default: `1`
Enable the patch automatically sets the OPENSSL_ia32cap variable in the user's environment
table if the CPU meets the requirements. This setting must be enabled on PCs with
Intel Gen 10 or newer CPUs to ensure the game runs properly, but it's ok to leave enabled
on other CPUs since the patch will not run if the CPU requirements are not met.

View File

@ -1,5 +1,6 @@
#include <assert.h>
#include <stddef.h>
#include <stdlib.h>
#include "board/config.h"
@ -122,5 +123,6 @@ void fgo_hook_config_load(
fgo_deck_config_load(&cfg->deck, filename);
ftdi_config_load(&cfg->ftdi, filename);
led15093_config_load(&cfg->led15093, filename);
gfx_config_load(&cfg->gfx, filename);
fgo_dll_config_load(&cfg->dll, filename);
}

View File

@ -9,6 +9,8 @@
#include "hooklib/touch.h"
#include "hooklib/printer.h"
#include "gfxhook/config.h"
#include "fgohook/deck.h"
#include "fgohook/ftdi.h"
#include "fgohook/fgo-dll.h"
@ -26,6 +28,7 @@ struct fgo_hook_config {
struct deck_config deck;
struct ftdi_config ftdi;
struct led15093_config led15093;
struct gfx_config gfx;
struct fgo_dll_config dll;
};

View File

@ -34,6 +34,8 @@
#include "hooklib/serial.h"
#include "hooklib/spike.h"
#include "gfxhook/gfx.h"
#include "fgohook/config.h"
#include "fgohook/io4.h"
#include "fgohook/fgo-dll.h"
@ -42,6 +44,7 @@
#include "platform/platform.h"
#include "util/dprintf.h"
#include "util/env.h"
static HMODULE fgo_hook_mod;
static process_entry_t fgo_startup;
@ -50,16 +53,29 @@ static struct fgo_hook_config fgo_hook_cfg;
static DWORD CALLBACK fgo_pre_startup(void)
{
HRESULT hr;
HMODULE dbghelp;
dprintf("--- Begin fgo_pre_startup ---\n");
/* Pin dbghelp so the path hooks apply to it. */
dbghelp = LoadLibraryW(L"dbghelp.dll");
if (dbghelp != NULL) {
dprintf("Pinned debug helper library, hMod=%p\n", dbghelp);
}
else {
dprintf("Failed to load debug helper library!\n");
}
/* Load config */
fgo_hook_config_load(&fgo_hook_cfg, L".\\segatools.ini");
fgo_hook_config_load(&fgo_hook_cfg, get_config_path());
/* Hook Win32 APIs */
dvd_hook_init(&fgo_hook_cfg.dvd, fgo_hook_mod);
gfx_hook_init(&fgo_hook_cfg.gfx);
touch_screen_hook_init(&fgo_hook_cfg.touch, fgo_hook_mod);
serial_hook_init();
@ -132,7 +148,7 @@ static DWORD CALLBACK fgo_pre_startup(void)
/* Initialize debug helpers */
spike_hook_init(L".\\segatools.ini");
spike_hook_init(get_config_path());
dprintf("--- End fgo_pre_startup ---\n");

View File

@ -16,8 +16,10 @@
#include <windows.h>
#include <setupapi.h>
#include <stdint.h>
#include <assert.h>
#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include "fgohook/ftdi.h"
@ -116,7 +118,7 @@ static const struct hook_symbol reg_syms[] = {
}
};
#define device_fake_key 0xDEADBEEF
const size_t device_fake_key = 0xDEADBEEF;
static HANDLE ftdi_fd;
static char port_name[8];

View File

@ -4,7 +4,6 @@ shared_library(
include_directories : inc,
implicit_include_directories : false,
vs_module_defs : 'fgohook.def',
c_pch : '../precompiled.h',
dependencies : [
capnhook.get_variable('hook_dep'),
capnhook.get_variable('hooklib_dep'),
@ -13,6 +12,7 @@ shared_library(
link_with : [
aimeio_lib,
board_lib,
gfxhook_lib,
hooklib_lib,
fgoio_lib,
platform_lib,

View File

@ -8,6 +8,7 @@
#include "fgoio/fgoio.h"
#include "fgoio/config.h"
#include "util/dprintf.h"
#include "util/env.h"
static uint8_t fgo_opbtn;
static uint8_t fgo_gamebtn;
@ -23,7 +24,7 @@ uint16_t fgo_io_get_api_version(void)
HRESULT fgo_io_init(void)
{
fgo_io_config_load(&fgo_io_cfg, L".\\segatools.ini");
fgo_io_config_load(&fgo_io_cfg, get_config_path());
return S_OK;
}
@ -109,8 +110,8 @@ HRESULT fgo_io_poll(void)
normalizedMagnitude = 0.0;
}
fgo_stick_x = normalizedLX * normalizedMagnitude * 32767;
fgo_stick_y = normalizedLY * normalizedMagnitude * 32767;
fgo_stick_x = (int16_t)(normalizedLX * normalizedMagnitude * 32767);
fgo_stick_y = (int16_t)(normalizedLY * normalizedMagnitude * 32767);
return S_OK;
}

View File

@ -3,7 +3,6 @@ fgoio_lib = static_library(
name_prefix : '',
include_directories : inc,
implicit_include_directories : false,
c_pch : '../precompiled.h',
dependencies : [
xinput_lib,
],

View File

@ -9,18 +9,53 @@
#include "util/dprintf.h"
typedef BOOL (WINAPI *ShowWindow_t)(HWND hWnd, int nCmdShow);
/* 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 ShowWindow_t next_ShowWindow;
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,
},
};
@ -46,3 +81,59 @@ static BOOL WINAPI hook_ShowWindow(HWND hWnd, int nCmdShow)
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
);
}

77
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
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',
include_directories : inc,
implicit_include_directories : false,
c_pch : '../precompiled.h',
dependencies : [
capnhook.get_variable('hook_dep'),
dxguid_lib,
@ -22,6 +21,8 @@ gfxhook_lib = static_library(
'dxgi.h',
'gfx.c',
'gfx.h',
'gl.c',
'gl.h',
'util.c',
'util.h',
],

View File

@ -2,6 +2,7 @@
#include <assert.h>
#include <stdbool.h>
#include <stdlib.h>
#include <stddef.h>
#include "hooklib/config.h"
@ -80,4 +81,6 @@ void printer_config_load(struct printer_config *cfg, const wchar_t *filename)
cfg->printer_out_path,
_countof(cfg->printer_out_path),
filename);
cfg->wait_time = GetPrivateProfileIntW(L"printer", L"waitTime", 0, filename);
}

View File

@ -3,6 +3,7 @@
#include <assert.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include "hook/table.h"

View File

@ -3,6 +3,7 @@
#include <assert.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include "hook/table.h"

View File

@ -8,12 +8,14 @@
#include <assert.h>
#include <stdbool.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "hook/hr.h"
#include "hook/table.h"
#include "util/dprintf.h"
#include "util/get_function_ordinal.h"
#include "hooklib/dns.h"
@ -81,6 +83,17 @@ static bool WINAPI hook_WinHttpCrackUrl(
DWORD dwFlags,
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 */
static DNS_STATUS (WINAPI *next_DnsQuery_A)(
@ -122,6 +135,17 @@ static bool (WINAPI *next_WinHttpCrackUrl)(
DWORD dwFlags,
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[] = {
{
.name = "DnsQuery_A",
@ -144,7 +168,7 @@ static const struct hook_symbol dns_hook_syms_ws2[] = {
.ordinal = 176,
.patch = hook_getaddrinfo,
.link = (void **) &next_getaddrinfo,
}
},
};
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,
.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;
@ -165,6 +204,9 @@ static CRITICAL_SECTION dns_hook_lock;
static struct dns_hook_entry *dns_hook_entries;
static size_t dns_hook_nentries;
static char received_title_url[255];
static unsigned short startup_port;
static unsigned short billing_port;
static unsigned short aimedb_port;
static void dns_hook_init(void)
{
@ -186,7 +228,7 @@ static void dns_hook_init(void)
"ws2_32.dll",
dns_hook_syms_ws2,
_countof(dns_hook_syms_ws2));
hook_table_apply(
NULL,
"winhttp.dll",
@ -194,6 +236,33 @@ static void dns_hook_init(void)
_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.
bool match_domain(const wchar_t* target, const wchar_t* pattern) {
if (_wcsicmp(pattern, target) == 0) {
@ -249,7 +318,7 @@ HRESULT dns_hook_push(const wchar_t *from_src, const wchar_t *to_src)
goto end;
}
if(to_src != NULL) {
if (to_src != NULL) {
to = _wcsdup(to_src);
if (to == NULL) {
@ -329,7 +398,7 @@ static DNS_STATUS WINAPI hook_DnsQuery_A(
pos = &dns_hook_entries[i];
if (match_domain(wstr, pos->from)) {
if(pos->to == NULL) {
if (pos->to == NULL) {
LeaveCriticalSection(&dns_hook_lock);
hr = HRESULT_FROM_WIN32(DNS_ERROR_RCODE_NAME_ERROR);
@ -393,7 +462,7 @@ static DNS_STATUS WINAPI hook_DnsQuery_W(
pos = &dns_hook_entries[i];
if (match_domain(pszName, pos->from)) {
if(pos->to == NULL) {
if (pos->to == NULL) {
LeaveCriticalSection(&dns_hook_lock);
return HRESULT_FROM_WIN32(DNS_ERROR_RCODE_NAME_ERROR);
}
@ -437,7 +506,7 @@ static DNS_STATUS WINAPI hook_DnsQueryEx(
pos = &dns_hook_entries[i];
if (match_domain(pRequest->QueryName, pos->from)) {
if(pos->to == NULL) {
if (pos->to == NULL) {
LeaveCriticalSection(&dns_hook_lock);
return HRESULT_FROM_WIN32(DNS_ERROR_RCODE_NAME_ERROR);
}
@ -504,7 +573,7 @@ static int WSAAPI hook_getaddrinfo(
pos = &dns_hook_entries[i];
if (match_domain(wstr, pos->from)) {
if(pos->to == NULL) {
if (pos->to == NULL) {
LeaveCriticalSection(&dns_hook_lock);
result = EAI_NONAME;
@ -558,7 +627,7 @@ static HINTERNET WINAPI hook_WinHttpConnect(
pos = &dns_hook_entries[i];
if (match_domain(pwszServerName, pos->from)) {
if(pos->to == NULL) {
if (pos->to == NULL) {
LeaveCriticalSection(&dns_hook_lock);
return NULL;
}
@ -592,8 +661,8 @@ static bool WINAPI hook_WinHttpCrackUrl(
if (match_domain(pwszUrl, pos->from)) {
wchar_t* toAddr = pos->to;
wchar_t titleBuffer[255];
if(wcscmp(toAddr, L"title") == 0) {
if (wcscmp(toAddr, L"title") == 0) {
size_t wstr_c;
mbstowcs_s(&wstr_c, titleBuffer, 255, received_title_url, strlen(received_title_url));
toAddr = titleBuffer;
@ -618,3 +687,93 @@ static bool WINAPI hook_WinHttpCrackUrl(
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,8 @@
#include <windows.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
HRESULT dns_hook_push(const wchar_t *from_src, const wchar_t *to_src);

View File

@ -2,7 +2,6 @@ hooklib_lib = static_library(
'hooklib',
include_directories : inc,
implicit_include_directories : false,
c_pch : '../precompiled.h',
dependencies : [
capnhook.get_variable('hook_dep'),
],

View File

@ -58,6 +58,7 @@ static int32_t MTF[9];
/* Printer status */
static uint8_t STATUS = 0;
static ULONGLONG finishTime = 0;
/* C3XXFWDLusb API hooks */
@ -97,7 +98,7 @@ int WINAPI chcusb_imageformat_330(
uint16_t width,
uint16_t height,
uint16_t *rResult);
int __thiscall chcusb_setmtf(int32_t *mtf);
int __fastcall chcusb_setmtf(int32_t *mtf);
int WINAPI chcusb_makeGamma(uint16_t k, uint8_t *intoneR, uint8_t *intoneG, uint8_t *intoneB);
int WINAPI chcusb_setIcctable(
LPCSTR icc1,
@ -1244,6 +1245,10 @@ void printer_hook_insert_hooks(HMODULE target) {
proc_addr_table_push(target, "C300FWDLusb.dll", C3XXFWDLusb_hooks, _countof(C3XXFWDLusb_hooks));
}
static inline bool check_for_wait_time(){
return finishTime > 0 && GetTickCount64() < finishTime;
}
static void generate_rfid(void) {
for (int i = 0; i < sizeof(cardRFID); i++)
cardRFID[i] = rand();
@ -1629,7 +1634,7 @@ int WINAPI fwdlusb_open(uint16_t *rResult) {
return 1;
}
void fwdlusb_close() {}
void WINAPI fwdlusb_close() {}
int WINAPI fwdlusb_listupPrinter(uint8_t *rIdArray) {
dprintf("Printer: C3XXFWDLusb: %s\n", __func__);
@ -2110,7 +2115,7 @@ int WINAPI chcusb_open(uint16_t *rResult) {
return 1;
}
void chcusb_close() {
void WINAPI chcusb_close() {
dprintf("Printer: C3XXusb: %s\n", __func__);
}
@ -2329,7 +2334,7 @@ int WINAPI chcusb_imageformat_330(
return 1;
}
int __thiscall chcusb_setmtf(int32_t *mtf) {
int __fastcall chcusb_setmtf(int32_t *mtf) {
dprintf("Printer: C3XXusb: %s\n", __func__);
memcpy(MTF, mtf, sizeof(MTF));
@ -2403,7 +2408,11 @@ int WINAPI chcusb_copies(uint16_t copies, uint16_t *rResult) {
int WINAPI chcusb_status(uint16_t *rResult) {
// dprintf("Printer: C3XXusb: %s\n", __func__);
*rResult = 0;
if (check_for_wait_time()) {
*rResult = 2203;
} else {
*rResult = 0;
}
return 1;
}
@ -2439,6 +2448,10 @@ int WINAPI chcusb_startpage_300(uint16_t postCardState, uint16_t *rResult) {
int WINAPI chcusb_endpage(uint16_t *rResult) {
dprintf("Printer: C3XXusb: %s\n", __func__);
if (printer_config.wait_time > 0){
finishTime = GetTickCount64() + printer_config.wait_time;
dprintf("Printer: Waiting for %dms...\n", printer_config.wait_time);
}
awaitingCardExit = true;
*rResult = 0;
@ -2622,13 +2635,12 @@ int WINAPI chcusb_getPrintIDStatus(uint16_t pageId, uint8_t *rBuffer, uint16_t *
// dprintf("Printer: C3XXusb: %s\n", __func__);
memset(rBuffer, 0, 8);
if (STATUS > 1)
{
if (check_for_wait_time()) {
*((uint16_t*)(rBuffer + 6)) = 2203;
} else if (STATUS > 1) {
STATUS = 0;
*((uint16_t*)(rBuffer + 6)) = 2212;
}
else
{
} else {
*((uint16_t*)(rBuffer + 6)) = 2300;
}
@ -2658,6 +2670,7 @@ int WINAPI chcusb_setPrintStandby_300(uint16_t *rResult) {
*rResult = 0;
if (awaitingCardExit){ // 300 does not use exitCard, so reset this for getPrinterInfo.
awaitingCardExit = false;
finishTime = 0;
STATUS = 1;
}
if (STATUS == 0)
@ -2677,8 +2690,14 @@ int WINAPI chcusb_testCardFeed(uint16_t mode, uint16_t times, uint16_t *rResult)
int WINAPI chcusb_exitCard(uint16_t *rResult) {
dprintf("Printer: C3XXusb: %s\n", __func__);
awaitingCardExit = false;
generate_rfid();
if (check_for_wait_time()) {
*rResult = 2203;
return 0;
} else {
awaitingCardExit = false;
finishTime = 0;
generate_rfid();
}
*rResult = 0;
return 1;
@ -3332,4 +3351,4 @@ DWORD WriteArrayToFile(LPCSTR lpOutputFilePath, LPVOID lpDataTemp, DWORD nDataSi
void printer_set_dimensions(int width, int height){
WIDTH = width;
HEIGHT = height;
}
}

View File

@ -12,6 +12,7 @@ struct printer_config {
wchar_t dsp_fw_path[MAX_PATH];
wchar_t param_fw_path[MAX_PATH];
wchar_t printer_out_path[MAX_PATH];
uint32_t wait_time;
};
void printer_hook_init(const struct printer_config *cfg, int rfid_port_no, HINSTANCE self);

View File

@ -1,5 +1,6 @@
#include <windows.h>
#include <assert.h>
#include <stdarg.h>
#include <stddef.h>
#include <stdio.h>

View File

@ -1,6 +1,8 @@
#include <assert.h>
#include <stddef.h>
#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include "iccard/aime.h"
#include "iccard/mifare.h"

View File

@ -3,6 +3,7 @@
#include <assert.h>
#include <stddef.h>
#include <stdint.h>
#include <stdlib.h>
#include "hook/iobuf.h"
@ -21,21 +22,27 @@ static HRESULT felica_cmd_get_system_code(
struct const_iobuf *req,
struct iobuf *res);
static HRESULT felica_cmd_nda_a4(
static HRESULT felica_cmd_active(
struct felica *f,
struct const_iobuf *req,
struct iobuf *res);
uint64_t felica_get_generic_PMm(void)
static HRESULT felica_cmd_read_without_encryption(
struct felica *f,
struct const_iobuf *req,
struct iobuf *res);
static HRESULT felica_cmd_write_without_encryption(
struct felica* f,
struct const_iobuf* req,
struct iobuf* res);
uint64_t felica_get_amusement_ic_PMm(void)
{
/* A FeliCa PMm contains low-level protocol timing information for
communicating with a particular IC card. The exact values are not
particularly important for our purposes, so we'll just return a hard-
coded PMm. This current value has been taken from an iPhone, emulating
a Suica pass via Apple Wallet, which seems to be one of the few
universally accepted FeliCa types for these games. Certain older
Suica passes and other payment and transportation cards
do not seem to be supported anymore. */
/*
* AIC Card PMm, if this is returned from the card,
* the aimelib will access the actual blocks for authentication.
*/
return 0x00F1000000014300;
}
@ -90,8 +97,14 @@ HRESULT felica_transact(
case FELICA_CMD_GET_SYSTEM_CODE:
return felica_cmd_get_system_code(f, req, res);
case FELICA_CMD_NDA_A4:
return felica_cmd_nda_a4(f, req, res);
case FELICA_READ_WITHOUT_ENCRYPTION:
return felica_cmd_read_without_encryption(f, req, res);
case FELICA_WRITE_WITHOUT_ENCRYPTION:
return felica_cmd_write_without_encryption(f, req, res);
case FELICA_CMD_ACTIVE:
return felica_cmd_active(f, req, res);
default:
dprintf("FeliCa: Unimplemented command %02x, payload:\n", code);
@ -184,7 +197,131 @@ static HRESULT felica_cmd_get_system_code(
return S_OK;
}
static HRESULT felica_cmd_nda_a4(
static HRESULT felica_cmd_read_without_encryption(
struct felica *f,
struct const_iobuf *req,
struct iobuf *res)
{
HRESULT hr;
uint8_t system_code_count;
uint16_t* system_codes;
uint8_t read_block_count;
uint8_t* blocks;
size_t i;
hr = iobuf_read_8(req, &system_code_count);
if (FAILED(hr)) {
goto fail;
}
system_codes = malloc(sizeof(uint16_t) * system_code_count);
if (!system_codes) goto fail;
for (i = 0; i < system_code_count; i++) {
hr = iobuf_read_be16(req, system_codes + i);
if (FAILED(hr)) {
goto fail;
}
}
hr = iobuf_read_8(req, &read_block_count);
if (FAILED(hr)) {
goto fail;
}
blocks = malloc(read_block_count);
if (!system_codes) goto fail;
for (i = 0; i < read_block_count; i++) {
// 0x80
hr = iobuf_read_8(req, blocks + i);
if (FAILED(hr)) {
goto fail;
}
// actual block num
hr = iobuf_read_8(req, blocks + i);
if (FAILED(hr)) {
goto fail;
}
}
// status
hr = iobuf_write_be16(res, 0);
if (FAILED(hr)) {
goto fail;
}
// block count
hr = iobuf_write_8(res, read_block_count);
if (FAILED(hr)) {
goto fail;
}
// block data
for (i = 0; i < read_block_count; i++)
{
dprintf("FeliCa: Read block %x\n", blocks[i]);
switch (blocks[i]) {
case 0x82: {
hr = iobuf_write_be64(res, f->IDm);
if (FAILED(hr))
{
goto fail;
}
hr = iobuf_write_be64(res, 0x0078000000000000ull);
if (FAILED(hr))
{
goto fail;
}
}
default: {
hr = iobuf_write_be64(res, 0);
if (FAILED(hr))
{
goto fail;
}
hr = iobuf_write_be64(res, 0);
if (FAILED(hr))
{
goto fail;
}
}
}
}
hr = S_OK;
fail:
if (system_codes) free(system_codes);
if (blocks) free(blocks);
return hr;
}
static HRESULT felica_cmd_write_without_encryption(
struct felica* f,
struct const_iobuf* req,
struct iobuf* res)
{
return iobuf_write_be16(res, 0);
}
static HRESULT felica_cmd_active(
struct felica *f,
struct const_iobuf *req,
struct iobuf *res)

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