forked from Hay1tsme/segatools
Compare commits
34 Commits
2024-09-30
...
2024-12-23
Author | SHA1 | Date | |
---|---|---|---|
96bf8cab81
|
|||
a3120181be
|
|||
80d4902cfc
|
|||
b4f5cdbe59 | |||
25431a9db1 | |||
a705ae8748 | |||
b52455339f | |||
ff21223f06 | |||
047733d122 | |||
21bb965382 | |||
11556a1332 | |||
d8202e1df4 | |||
2d3d6fc2bb | |||
6d8ffb46ef | |||
2069b1ea85 | |||
c80f903cf8 | |||
ceb2b63e8b | |||
83840e0a87 | |||
e50d6d8ebc | |||
e1a47cf365 | |||
8aef1cfa79 | |||
8fc24503c8
|
|||
ebf0f0b428 | |||
892eb2b859
|
|||
b80b9fbc19 | |||
cef3406691 | |||
97d2d6b9bc | |||
f39b9ce3a0 | |||
243bb778d1 | |||
66317a0054
|
|||
8c24e04900 | |||
3bb9404a38 | |||
6819963f06 | |||
4fa9abffe8 |
4
.clang-format
Normal file
4
.clang-format
Normal file
@ -0,0 +1,4 @@
|
||||
---
|
||||
BasedOnStyle: Google
|
||||
IndentWidth: 4
|
||||
---
|
@ -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;
|
||||
}
|
||||
|
@ -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,
|
||||
],
|
||||
|
13
amex/ds.c
13
amex/ds.c
@ -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;
|
||||
|
@ -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);
|
||||
|
11
amex/gpio.c
11
amex/gpio.c
@ -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,
|
||||
|
@ -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);
|
||||
|
@ -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'),
|
||||
],
|
||||
|
@ -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);
|
||||
|
@ -1,6 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
#include <windows.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#include "aimeio/aimeio.h"
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -2,6 +2,7 @@
|
||||
|
||||
#include <windows.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
|
||||
struct ffb_config {
|
||||
bool enable;
|
||||
|
@ -16,6 +16,7 @@
|
||||
#include <stdbool.h>
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "board/io3.h"
|
||||
|
||||
|
@ -7,6 +7,7 @@
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "board/config.h"
|
||||
#include "board/guid.h"
|
||||
|
@ -3,6 +3,7 @@
|
||||
#include <windows.h>
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#define IO4_REPORT_OUT_PAYLOAD_LEN 62
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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 {
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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'),
|
||||
],
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
13
board/vfd.c
13
board/vfd.c
@ -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;
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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");
|
||||
|
||||
|
@ -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'),
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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',
|
||||
|
@ -3,6 +3,7 @@
|
||||
#include <assert.h>
|
||||
#include <stdbool.h>
|
||||
#include <stddef.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "amex/amex.h"
|
||||
#include "amex/config.h"
|
||||
|
@ -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");
|
||||
|
||||
|
@ -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'),
|
||||
|
@ -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);
|
||||
|
@ -3,6 +3,7 @@
|
||||
#include <assert.h>
|
||||
#include <stddef.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "chuniio/config.h"
|
||||
|
@ -2,6 +2,7 @@
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
struct chuni_io_config {
|
||||
uint8_t vk_test;
|
||||
|
@ -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};
|
@ -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)
|
||||
{
|
||||
|
@ -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);
|
||||
|
@ -3,7 +3,6 @@ chuniio_lib = static_library(
|
||||
name_prefix : '',
|
||||
include_directories : inc,
|
||||
implicit_include_directories : false,
|
||||
c_pch : '../precompiled.h',
|
||||
|
||||
sources : [
|
||||
'chu2to3.c',
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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);
|
@ -2,6 +2,7 @@
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "chuniio/chu2to3.h"
|
||||
#include "chusanhook/chuni-dll.h"
|
||||
|
@ -1,5 +1,6 @@
|
||||
#include <assert.h>
|
||||
#include <stddef.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "board/config.h"
|
||||
|
||||
|
@ -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");
|
||||
|
||||
|
@ -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'),
|
||||
|
@ -1,5 +1,6 @@
|
||||
#include <assert.h>
|
||||
#include <stddef.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "board/config.h"
|
||||
|
||||
|
@ -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");
|
||||
|
||||
|
@ -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'),
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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',
|
||||
|
@ -3,6 +3,7 @@
|
||||
#include <assert.h>
|
||||
#include <stdbool.h>
|
||||
#include <stddef.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "amex/amex.h"
|
||||
#include "amex/config.h"
|
||||
|
@ -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");
|
||||
|
||||
|
@ -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"
|
||||
|
@ -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'),
|
||||
|
@ -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"
|
||||
|
@ -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)
|
||||
{}
|
||||
{}
|
||||
|
@ -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',
|
||||
|
2
dist/carol/segatools.ini
vendored
2
dist/carol/segatools.ini
vendored
@ -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.
|
||||
|
2
dist/chuni/segatools.ini
vendored
2
dist/chuni/segatools.ini
vendored
@ -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.
|
||||
|
2
dist/chusan/segatools.ini
vendored
2
dist/chusan/segatools.ini
vendored
@ -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.
|
||||
|
2
dist/cxb/segatools.ini
vendored
2
dist/cxb/segatools.ini
vendored
@ -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.
|
||||
|
18
dist/diva/segatools.ini
vendored
18
dist/diva/segatools.ini
vendored
@ -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
|
||||
; -----------------------------------------------------------------------------
|
||||
|
8
dist/fgo/segatools.ini
vendored
8
dist/fgo/segatools.ini
vendored
@ -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
|
||||
|
1
dist/idac/segatools.ini
vendored
1
dist/idac/segatools.ini
vendored
@ -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
|
||||
|
1
dist/idz/segatools.ini
vendored
1
dist/idz/segatools.ini
vendored
@ -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
|
3
dist/kemono/segatools.ini
vendored
3
dist/kemono/segatools.ini
vendored
@ -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
|
||||
|
1
dist/mercury/segatools.ini
vendored
1
dist/mercury/segatools.ini
vendored
@ -74,6 +74,7 @@ dipsw1=1
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[gfx]
|
||||
; Enables the graphics hook.
|
||||
enable=1
|
||||
|
||||
; Hooks related to the touch boards
|
||||
|
1
dist/mu3/segatools.ini
vendored
1
dist/mu3/segatools.ini
vendored
@ -70,6 +70,7 @@ dipsw1=1
|
||||
; -----------------------------------------------------------------------------
|
||||
|
||||
[gfx]
|
||||
; Enables the graphics hook.
|
||||
enable=1
|
||||
|
||||
[unity]
|
||||
|
1
dist/swdc/segatools.ini
vendored
1
dist/swdc/segatools.ini
vendored
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
};
|
||||
|
@ -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");
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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,
|
||||
|
@ -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++) {
|
||||
|
@ -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
|
||||
|
@ -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',
|
||||
|
@ -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.
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
};
|
||||
|
||||
|
@ -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");
|
||||
|
||||
|
@ -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];
|
||||
|
@ -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,
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -3,7 +3,6 @@ fgoio_lib = static_library(
|
||||
name_prefix : '',
|
||||
include_directories : inc,
|
||||
implicit_include_directories : false,
|
||||
c_pch : '../precompiled.h',
|
||||
dependencies : [
|
||||
xinput_lib,
|
||||
],
|
||||
|
@ -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
77
gfxhook/gl.c
Normal file
@ -0,0 +1,77 @@
|
||||
#include <windows.h>
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "gfxhook/gfx.h"
|
||||
#include "gfxhook/gl.h"
|
||||
|
||||
#include "hook/table.h"
|
||||
|
||||
#include "hooklib/dll.h"
|
||||
|
||||
#include "util/dprintf.h"
|
||||
|
||||
/* Hook functions */
|
||||
|
||||
static void WINAPI hook_glutFullScreen(void);
|
||||
static void WINAPI hook_glutInitDisplayMode(unsigned int mode);
|
||||
|
||||
/* Link pointers */
|
||||
|
||||
static void (WINAPI *next_glutFullScreen)(void);
|
||||
static void (WINAPI *next_glutInitDisplayMode)(unsigned int mode);
|
||||
|
||||
static struct gfx_config gfx_config;
|
||||
|
||||
static const struct hook_symbol glut_hooks[] = {
|
||||
{
|
||||
.name = "glutFullScreen",
|
||||
.patch = hook_glutFullScreen,
|
||||
.link = (void **) &next_glutFullScreen,
|
||||
}, {
|
||||
.name = "glutInitDisplayMode",
|
||||
.patch = hook_glutInitDisplayMode,
|
||||
.link = (void **) &next_glutInitDisplayMode,
|
||||
},
|
||||
};
|
||||
|
||||
void gfx_gl_hook_init(const struct gfx_config *cfg, HINSTANCE self)
|
||||
{
|
||||
assert(cfg != NULL);
|
||||
|
||||
if (!cfg->enable) {
|
||||
return;
|
||||
}
|
||||
|
||||
memcpy(&gfx_config, cfg, sizeof(*cfg));
|
||||
hook_table_apply(NULL, "glut32.dll", glut_hooks, _countof(glut_hooks));
|
||||
|
||||
if (self != NULL) {
|
||||
dll_hook_push(self, L"glut32.dll");
|
||||
}
|
||||
}
|
||||
|
||||
static void WINAPI hook_glutFullScreen(void)
|
||||
{
|
||||
dprintf("Gfx: glutFullScreen hook hit\n");
|
||||
|
||||
if (gfx_config.windowed) {
|
||||
return;
|
||||
}
|
||||
|
||||
next_glutFullScreen();
|
||||
}
|
||||
|
||||
static void WINAPI hook_glutInitDisplayMode(unsigned int mode)
|
||||
{
|
||||
dprintf("Gfx: glutInitDisplayMode hook hit\n");
|
||||
|
||||
// GLUT adds a frame when going windowed
|
||||
if (gfx_config.windowed && !gfx_config.framed) {
|
||||
// GLUT_BORDERLESS
|
||||
mode |= 0x0800;
|
||||
}
|
||||
|
||||
next_glutInitDisplayMode(mode);
|
||||
}
|
3
gfxhook/gl.h
Normal file
3
gfxhook/gl.h
Normal file
@ -0,0 +1,3 @@
|
||||
#pragma once
|
||||
|
||||
void gfx_gl_hook_init(const struct gfx_config *cfg, HINSTANCE self);
|
@ -2,7 +2,6 @@ gfxhook_lib = static_library(
|
||||
'gfxhook',
|
||||
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',
|
||||
],
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -3,6 +3,7 @@
|
||||
#include <assert.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "hook/table.h"
|
||||
|
@ -3,6 +3,7 @@
|
||||
#include <assert.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "hook/table.h"
|
||||
|
179
hooklib/dns.c
179
hooklib/dns.c
@ -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);
|
||||
}
|
@ -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);
|
||||
|
||||
|
@ -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'),
|
||||
],
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -1,5 +1,6 @@
|
||||
#include <windows.h>
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdarg.h>
|
||||
#include <stddef.h>
|
||||
#include <stdio.h>
|
||||
|
@ -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"
|
||||
|
163
iccard/felica.c
163
iccard/felica.c
@ -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)
|
||||
|
@ -8,9 +8,11 @@
|
||||
#include "hook/iobuf.h"
|
||||
|
||||
enum {
|
||||
FELICA_CMD_POLL = 0x00,
|
||||
FELICA_CMD_GET_SYSTEM_CODE = 0x0c,
|
||||
FELICA_CMD_NDA_A4 = 0xa4,
|
||||
FELICA_CMD_POLL = 0x00,
|
||||
FELICA_READ_WITHOUT_ENCRYPTION = 0x06,
|
||||
FELICA_WRITE_WITHOUT_ENCRYPTION = 0x08,
|
||||
FELICA_CMD_GET_SYSTEM_CODE = 0x0c,
|
||||
FELICA_CMD_ACTIVE = 0xa4,
|
||||
};
|
||||
|
||||
struct felica {
|
||||
@ -24,4 +26,4 @@ HRESULT felica_transact(
|
||||
struct const_iobuf *req,
|
||||
struct iobuf *res);
|
||||
|
||||
uint64_t felica_get_generic_PMm(void);
|
||||
uint64_t felica_get_amusement_ic_PMm(void);
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user