spicetools/misc/device.cpp

741 lines
28 KiB
C++

#include "device.h"
#include <ctime>
#include "avs/game.h"
#include "cfg/api.h"
#include "games/gitadora/io.h"
#include "games/jb/jb.h"
#include "games/jb/io.h"
#include "games/rb/io.h"
#include "util/detour.h"
#include "util/libutils.h"
#include "util/logging.h"
#include "util/utils.h"
#include "rawinput/rawinput.h"
#include "eamuse.h"
using namespace GameAPI;
// settings
const char DEVICE_SYSTEM_VERSION[] = "4.2.0:0";
const char DEVICE_SUBBOARD_VERSION[] = "4.2.0:0";
// state
static HINSTANCE DEVICE_INSTANCE;
static std::string DEVICE_INSTANCE_NAME1 = "device.dll";
static std::string DEVICE_INSTANCE_NAME2 = "libdevice.dll";
static bool DEVICE_INITIALIZED = false;
static int DEVICE_INPUT_STATE;
static int __cdecl device_check_secplug(int a1) {
// check for invalid index
if (a1 > 1) {
return 0;
}
// J44/K44 has it flipped
if (avs::game::is_model({ "J44", "K44" })) {
return 0x101 - a1;
} else {
return 0x100 + a1;
}
}
static int __cdecl device_force_check_secplug(int a1, int a2) {
return 0;
}
static short __cdecl device_dispose_coinstock() {
eamuse_coin_consume_stock();
return 0;
}
static int __cdecl device_finalize(int a1, int a2) {
return 0;
}
static void __cdecl device_get_coinstock(unsigned short *coin1, unsigned short *coin2) {
*coin1 = (unsigned short) eamuse_coin_get_stock();
*coin2 = 0;
// without this, jubeat will spawn never ending credit inserts
eamuse_coin_consume_stock();
}
static void __cdecl device_get_coinstock_all(unsigned short *coin1, unsigned short *coin2) {
*coin1 = (unsigned short) eamuse_coin_get_stock();
*coin2 = 0;
// without this, jubeat will spawn never ending credit inserts
eamuse_coin_consume_stock();
}
static char __cdecl device_get_dispw() {
return 0;
}
static long __cdecl device_get_input(int a1) {
// Gitadora
if (avs::game::is_model({ "J32", "J33", "K32", "K33", "L32", "L33", "M32" })) {
long ret = 0;
// get buttons
auto &buttons = games::gitadora::get_buttons();
if (Buttons::getState(RI_MGR, buttons.at(games::gitadora::Buttons::Service))) {
ret |= 0x8;
}
if (Buttons::getState(RI_MGR, buttons.at(games::gitadora::Buttons::Test))) {
ret |= 0x2;
}
if (Buttons::getState(RI_MGR, buttons.at(games::gitadora::Buttons::Coin))) {
ret |= 0x10;
}
// gf player 2 controls
if (a1 == 1) {
if (Buttons::getState(RI_MGR, buttons.at(games::gitadora::Buttons::GuitarP2Start))) {
ret |= 0x4;
}
if (Buttons::getState(RI_MGR, buttons.at(games::gitadora::Buttons::GuitarP2Up))) {
ret |= 0x20;
}
if (Buttons::getState(RI_MGR, buttons.at(games::gitadora::Buttons::GuitarP2Down))) {
ret |= 0x40;
}
if (Buttons::getState(RI_MGR, buttons.at(games::gitadora::Buttons::GuitarP2Left))) {
ret |= 0x80;
}
if (Buttons::getState(RI_MGR, buttons.at(games::gitadora::Buttons::GuitarP2Right))) {
ret |= 0x100;
}
if (Buttons::getState(RI_MGR, buttons.at(games::gitadora::Buttons::GuitarP2Help))) {
ret |= 0x200;
}
if (Buttons::getState(RI_MGR, buttons.at(games::gitadora::Buttons::GuitarP2Effect1))) {
ret |= 0x400;
}
if (Buttons::getState(RI_MGR, buttons.at(games::gitadora::Buttons::GuitarP2Effect2))) {
ret |= 0x800;
}
if (Buttons::getState(RI_MGR, buttons.at(games::gitadora::Buttons::GuitarP2Effect3))) {
ret |= 0x1000;
}
if (!Buttons::getState(RI_MGR, buttons.at(games::gitadora::Buttons::GuitarP2EffectPedal))) {
ret |= 0x2000;
}
if (Buttons::getState(RI_MGR, buttons.at(games::gitadora::Buttons::GuitarP2ButtonExtra1))) {
ret |= 0x4000;
}
if (Buttons::getState(RI_MGR, buttons.at(games::gitadora::Buttons::GuitarP2ButtonExtra2))) {
ret |= 0x8000;
}
// return flags
return ret;
}
if (Buttons::getState(RI_MGR, buttons.at(games::gitadora::Buttons::GuitarP1Start)) ||
Buttons::getState(RI_MGR, buttons.at(games::gitadora::Buttons::DrumStart)))
{
ret |= 0x4;
}
if (Buttons::getState(RI_MGR, buttons.at(games::gitadora::Buttons::GuitarP1Up)) ||
Buttons::getState(RI_MGR, buttons.at(games::gitadora::Buttons::DrumUp)))
{
ret |= 0x20;
}
if (Buttons::getState(RI_MGR, buttons.at(games::gitadora::Buttons::GuitarP1Down)) ||
Buttons::getState(RI_MGR, buttons.at(games::gitadora::Buttons::DrumDown)))
{
ret |= 0x40;
}
if (Buttons::getState(RI_MGR, buttons.at(games::gitadora::Buttons::GuitarP1Left)) ||
Buttons::getState(RI_MGR, buttons.at(games::gitadora::Buttons::DrumLeft)))
{
ret |= 0x80;
}
if (Buttons::getState(RI_MGR, buttons.at(games::gitadora::Buttons::GuitarP1Right)) ||
Buttons::getState(RI_MGR, buttons.at(games::gitadora::Buttons::DrumRight)))
{
ret |= 0x100;
}
if (Buttons::getState(RI_MGR, buttons.at(games::gitadora::Buttons::GuitarP1Help)) ||
Buttons::getState(RI_MGR, buttons.at(games::gitadora::Buttons::DrumHelp)))
{
ret |= 0x200;
}
if (Buttons::getState(RI_MGR, buttons.at(games::gitadora::Buttons::GuitarP1Effect1))) {
ret |= 0x400;
}
if (Buttons::getState(RI_MGR, buttons.at(games::gitadora::Buttons::GuitarP1Effect2))) {
ret |= 0x800;
}
if (Buttons::getState(RI_MGR, buttons.at(games::gitadora::Buttons::GuitarP1Effect3))) {
ret |= 0x1000;
}
if (!Buttons::getState(RI_MGR, buttons.at(games::gitadora::Buttons::GuitarP1EffectPedal))) {
ret |= 0x2000;
}
if (Buttons::getState(RI_MGR, buttons.at(games::gitadora::Buttons::GuitarP1ButtonExtra1)) ||
Buttons::getState(RI_MGR, buttons.at(games::gitadora::Buttons::DrumButtonExtra1)))
{
ret |= 0x4000;
}
if (Buttons::getState(RI_MGR, buttons.at(games::gitadora::Buttons::GuitarP1ButtonExtra2)) ||
Buttons::getState(RI_MGR, buttons.at(games::gitadora::Buttons::DrumButtonExtra2)))
{
ret |= 0x8000;
}
// return flags
return ret;
}
// all other games get updated in device_update()
if (a1) {
return 0;
}
return DEVICE_INPUT_STATE;
}
static long __cdecl device_get_input_time() {
time_t t = std::time(nullptr);
auto now = static_cast<long int> (t);
return now;
}
static int *__cdecl device_get_jamma() {
return &DEVICE_INPUT_STATE;
}
static int __cdecl device_get_jamma_history(struct T_JAMMA_HISTORY_INFO *a1, int a2) {
return 0;
}
static int __cdecl device_get_panel_trg_off(int a1, int a2, int a3) {
return 0;
}
static int __cdecl device_get_panel_trg_on(int a1, int a2, int a3) {
return 0;
}
static int __cdecl device_get_panel_trg_short_on(int a1, int a2, int a3) {
return 0;
}
static int __cdecl device_get_secplug_error(int a1) {
return 0;
}
static int __cdecl device_get_secplug_hist(int a1, int a2, char *a3) {
*a3 = 0;
return 0;
}
static int __cdecl device_get_racecount() {
return 0;
}
static int __cdecl device_get_secplug(int a1, int a2, int a3) {
return 1;
}
static int __cdecl device_get_sliptrg(int a1) {
return 0;
}
static int __cdecl device_get_status() {
return 0;
}
static int __cdecl device_get_subboard_version(void *data, unsigned int size) {
if (size < sizeof(DEVICE_SUBBOARD_VERSION)) {
memset(data, 0, MIN(1, size));
} else {
memcpy(data, DEVICE_SUBBOARD_VERSION, sizeof(DEVICE_SUBBOARD_VERSION));
}
return 0;
}
static const char *__cdecl device_get_sys_version() {
return DEVICE_SYSTEM_VERSION;
}
static int __cdecl device_initialize(int a1, int a2) {
DEVICE_INITIALIZED = true;
return 0;
}
static bool __cdecl device_is_initialized() {
return DEVICE_INITIALIZED;
}
static void __cdecl device_poweroff() {
}
static int __cdecl device_read_secplug(int a1, int a2, int a3) {
return 1;
}
static int __cdecl device_set_coinblocker_open(char number, char open) {
return 0;
}
static void __cdecl device_set_coincounter_merge() {
}
static int __cdecl device_set_coincounter_work() {
return 0;
}
static void __cdecl device_set_coincounter_controllable() {
}
static int __cdecl device_set_panel_mode(int mode) {
return 0;
}
static void __cdecl device_set_jamma_asyncmode() {
}
static void __cdecl device_set_jamma_normalmode() {
}
static void __cdecl device_set_jamma_unti_inputskip(int a1) {
}
static int __cdecl device_set_portout(size_t index, int value) {
// reflec beat
if (avs::game::is_model("MBR")) {
// get lights
auto &lights = games::rb::get_lights();
// mapping
static const size_t light_mapping[] {
games::rb::Lights::WooferR,
games::rb::Lights::WooferG,
games::rb::Lights::WooferB,
games::rb::Lights::EscutcheonR,
games::rb::Lights::EscutcheonG,
games::rb::Lights::EscutcheonB,
games::rb::Lights::TitleR,
games::rb::Lights::TitleG,
games::rb::Lights::TitleB,
games::rb::Lights::TitleUpR,
games::rb::Lights::TitleUpG,
games::rb::Lights::TitleUpB,
};
// set light
if (index < std::size(light_mapping)) {
Lights::writeLight(RI_MGR, lights.at(light_mapping[index]), value / 127.f);
}
}
return 0;
}
static void __cdecl device_set_portoutbit() {
}
static int __cdecl device_set_watchdog_timer(int a1) {
return 0;
}
static void __cdecl device_set_watchdog() {
return;
}
static void __cdecl device_update() {
// flush device output
RI_MGR->devices_flush_output();
// JB knit and copious
if (avs::game::is_model({ "J44", "K44" })) {
// update touch
games::jb::touch_update();
// get buttons
auto &buttons = games::jb::get_buttons();
// reset
DEVICE_INPUT_STATE = 0;
if (Buttons::getState(RI_MGR, buttons.at(games::jb::Buttons::Service))) {
DEVICE_INPUT_STATE |= 1 << 30;
}
if (Buttons::getState(RI_MGR, buttons.at(games::jb::Buttons::Test))) {
DEVICE_INPUT_STATE |= 1 << 28;
}
if (Buttons::getState(RI_MGR, buttons.at(games::jb::Buttons::CoinMech))) {
DEVICE_INPUT_STATE |= 1 << 29;
}
if (games::jb::TOUCH_STATE[3] || Buttons::getState(RI_MGR, buttons.at(games::jb::Buttons::Button1))) {
DEVICE_INPUT_STATE |= 1 << 13;
}
if (games::jb::TOUCH_STATE[7] || Buttons::getState(RI_MGR, buttons.at(games::jb::Buttons::Button2))) {
DEVICE_INPUT_STATE |= 1 << 9;
}
if (games::jb::TOUCH_STATE[11] || Buttons::getState(RI_MGR, buttons.at(games::jb::Buttons::Button3))) {
DEVICE_INPUT_STATE |= 1 << 21;
}
if (games::jb::TOUCH_STATE[15] || Buttons::getState(RI_MGR, buttons.at(games::jb::Buttons::Button4))) {
DEVICE_INPUT_STATE |= 1 << 17;
}
if (games::jb::TOUCH_STATE[2] || Buttons::getState(RI_MGR, buttons.at(games::jb::Buttons::Button5))) {
DEVICE_INPUT_STATE |= 1 << 14;
}
if (games::jb::TOUCH_STATE[6] || Buttons::getState(RI_MGR, buttons.at(games::jb::Buttons::Button6))) {
DEVICE_INPUT_STATE |= 1 << 10;
}
if (games::jb::TOUCH_STATE[10] || Buttons::getState(RI_MGR, buttons.at(games::jb::Buttons::Button7))) {
DEVICE_INPUT_STATE |= 1 << 22;
}
if (games::jb::TOUCH_STATE[14] || Buttons::getState(RI_MGR, buttons.at(games::jb::Buttons::Button8))) {
DEVICE_INPUT_STATE |= 1 << 18;
}
if (games::jb::TOUCH_STATE[1] || Buttons::getState(RI_MGR, buttons.at(games::jb::Buttons::Button9))) {
DEVICE_INPUT_STATE |= 1 << 15;
}
if (games::jb::TOUCH_STATE[5] || Buttons::getState(RI_MGR, buttons.at(games::jb::Buttons::Button10))) {
DEVICE_INPUT_STATE |= 1 << 11;
}
if (games::jb::TOUCH_STATE[9] || Buttons::getState(RI_MGR, buttons.at(games::jb::Buttons::Button11))) {
DEVICE_INPUT_STATE |= 1 << 23;
}
if (games::jb::TOUCH_STATE[13] || Buttons::getState(RI_MGR, buttons.at(games::jb::Buttons::Button12))) {
DEVICE_INPUT_STATE |= 1 << 19;
}
if (games::jb::TOUCH_STATE[0] || Buttons::getState(RI_MGR, buttons.at(games::jb::Buttons::Button13))) {
DEVICE_INPUT_STATE |= 1 << 24;
}
if (games::jb::TOUCH_STATE[4] || Buttons::getState(RI_MGR, buttons.at(games::jb::Buttons::Button14))) {
DEVICE_INPUT_STATE |= 1 << 12;
}
if (games::jb::TOUCH_STATE[8] || Buttons::getState(RI_MGR, buttons.at(games::jb::Buttons::Button15))) {
DEVICE_INPUT_STATE |= 1 << 26;
}
if (games::jb::TOUCH_STATE[12] || Buttons::getState(RI_MGR, buttons.at(games::jb::Buttons::Button16))) {
DEVICE_INPUT_STATE |= 1 << 20;
}
DEVICE_INPUT_STATE = ~DEVICE_INPUT_STATE;
}
// JB
if (avs::game::is_model("L44")) {
// update touch
games::jb::touch_update();
// get buttons
auto &buttons = games::jb::get_buttons();
// reset
DEVICE_INPUT_STATE = 0;
if (Buttons::getState(RI_MGR, buttons.at(games::jb::Buttons::Service))) {
DEVICE_INPUT_STATE |= 1 << 25;
}
if (Buttons::getState(RI_MGR, buttons.at(games::jb::Buttons::Test))) {
DEVICE_INPUT_STATE |= 1 << 28;
}
if (Buttons::getState(RI_MGR, buttons.at(games::jb::Buttons::CoinMech))) {
DEVICE_INPUT_STATE |= 1 << 24;
}
if (games::jb::TOUCH_STATE[0] || Buttons::getState(RI_MGR, buttons.at(games::jb::Buttons::Button1))) {
DEVICE_INPUT_STATE |= 1 << 5;
}
if (games::jb::TOUCH_STATE[1] || Buttons::getState(RI_MGR, buttons.at(games::jb::Buttons::Button2))) {
DEVICE_INPUT_STATE |= 1 << 1;
}
if (games::jb::TOUCH_STATE[2] || Buttons::getState(RI_MGR, buttons.at(games::jb::Buttons::Button3))) {
DEVICE_INPUT_STATE |= 1 << 13;
}
if (games::jb::TOUCH_STATE[3] || Buttons::getState(RI_MGR, buttons.at(games::jb::Buttons::Button4))) {
DEVICE_INPUT_STATE |= 1 << 9;
}
if (games::jb::TOUCH_STATE[4] || Buttons::getState(RI_MGR, buttons.at(games::jb::Buttons::Button5))) {
DEVICE_INPUT_STATE |= 1 << 6;
}
if (games::jb::TOUCH_STATE[5] || Buttons::getState(RI_MGR, buttons.at(games::jb::Buttons::Button6))) {
DEVICE_INPUT_STATE |= 1 << 2;
}
if (games::jb::TOUCH_STATE[6] || Buttons::getState(RI_MGR, buttons.at(games::jb::Buttons::Button7))) {
DEVICE_INPUT_STATE |= 1 << 14;
}
if (games::jb::TOUCH_STATE[7] || Buttons::getState(RI_MGR, buttons.at(games::jb::Buttons::Button8))) {
DEVICE_INPUT_STATE |= 1 << 10;
}
if (games::jb::TOUCH_STATE[8] || Buttons::getState(RI_MGR, buttons.at(games::jb::Buttons::Button9))) {
DEVICE_INPUT_STATE |= 1 << 7;
}
if (games::jb::TOUCH_STATE[9] || Buttons::getState(RI_MGR, buttons.at(games::jb::Buttons::Button10))) {
DEVICE_INPUT_STATE |= 1 << 3;
}
if (games::jb::TOUCH_STATE[10] || Buttons::getState(RI_MGR, buttons.at(games::jb::Buttons::Button11))) {
DEVICE_INPUT_STATE |= 1 << 15;
}
if (games::jb::TOUCH_STATE[11] || Buttons::getState(RI_MGR, buttons.at(games::jb::Buttons::Button12))) {
DEVICE_INPUT_STATE |= 1 << 11;
}
if (games::jb::TOUCH_STATE[12] || Buttons::getState(RI_MGR, buttons.at(games::jb::Buttons::Button13))) {
DEVICE_INPUT_STATE |= 1 << 16;
}
if (games::jb::TOUCH_STATE[13] || Buttons::getState(RI_MGR, buttons.at(games::jb::Buttons::Button14))) {
DEVICE_INPUT_STATE |= 1 << 4;
}
if (games::jb::TOUCH_STATE[14] || Buttons::getState(RI_MGR, buttons.at(games::jb::Buttons::Button15))) {
DEVICE_INPUT_STATE |= 1 << 20;
}
if (games::jb::TOUCH_STATE[15] || Buttons::getState(RI_MGR, buttons.at(games::jb::Buttons::Button16))) {
DEVICE_INPUT_STATE |= 1 << 12;
}
}
// RB
if (avs::game::is_model({ "KBR", "LBR", "MBR" })) {
// get buttons
auto &buttons = games::rb::get_buttons();
// reset
DEVICE_INPUT_STATE = 0;
if (Buttons::getState(RI_MGR, buttons.at(games::rb::Buttons::Service))) {
DEVICE_INPUT_STATE |= 0x08;
}
if (Buttons::getState(RI_MGR, buttons.at(games::rb::Buttons::Test))) {
DEVICE_INPUT_STATE |= 0x02;
}
}
}
static void __cdecl device_update_secplug() {
}
static int __cdecl devsci_break(char a1, char a2) {
return 0;
}
static int __cdecl devsci_open(int a1, int a2) {
return 0;
}
static int __cdecl devsci_read(int a1, int a2) {
return 0;
}
static int __cdecl devsci_write(int a1, int a2, int a3) {
return a3;
}
static int __cdecl p4io_sci_boot() {
return 1;
}
static int __cdecl p4io_sci_close(int index) {
return 0;
}
static int __cdecl p4io_sci_set_linebreak(int index, char c) {
return 0;
}
static int __cdecl p4io_sci_setparam(int a1, int a2, int a3, uint8_t a4) {
return 1;
}
static int __cdecl p4io_sci_puts(int index, const char *msg, int size) {
return 0;
}
static int __cdecl p4io_sci_gets(int index, uint8_t *buffer, int buffer_size) {
return 0;
}
static int __cdecl p4io_sci_flush() {
return 0;
}
static int __cdecl p4io_sci_flush_complete() {
return 1;
}
static int __cdecl p4io_sci_clear_error(int index) {
// return cleared error
return 0;
}
static int __cdecl p4io_sci_get_error(int index) {
return 0;
}
static int __cdecl p4io_sci_print_error(int index, int (__fastcall *logger)(const char *)) {
return 0;
}
void spicedevice_attach() {
// get instance
DEVICE_INSTANCE = libutils::try_module(DEVICE_INSTANCE_NAME1);
if (!DEVICE_INSTANCE) {
DEVICE_INSTANCE = libutils::try_module(DEVICE_INSTANCE_NAME2);
}
if (!DEVICE_INSTANCE) {
log_info("device", "skipping device module hooks");
return;
}
log_info("device", "SpiceTools DEVICE");
/*
* Patches
* the trick here is to account for normal names and specific ones
*/
detour::inline_hook((void *) device_check_secplug, libutils::try_proc_list(
DEVICE_INSTANCE, {"device_check_secplug", "?device_check_secplug@@YAHH@Z"}));
detour::inline_hook((void *) device_force_check_secplug, libutils::try_proc_list(
DEVICE_INSTANCE, {"device_force_check_secplug", "?device_force_check_secplug@@YAXXZ"}));
detour::inline_hook((void *) device_dispose_coinstock, libutils::try_proc_list(
DEVICE_INSTANCE, {"device_dispose_coinstock"}));
detour::inline_hook((void *) device_finalize, libutils::try_proc_list(
DEVICE_INSTANCE, {"device_finalize", "?device_finalize@@YAXXZ"}));
detour::inline_hook((void *) device_get_coinstock, libutils::try_proc_list(
DEVICE_INSTANCE, {"device_get_coinstock", "?device_get_coinstock@@YAXPEAG0@Z"}));
detour::inline_hook((void *) device_get_coinstock_all, libutils::try_proc_list(
DEVICE_INSTANCE, {"device_get_coinstock_all",
"?device_get_coinstock_all@@YAXPEAG0@Z",
"?device_get_coinstock_all@@YAXPAG0@Z"}));
detour::inline_hook((void *) device_get_dispw, libutils::try_proc_list(
DEVICE_INSTANCE, {"device_get_dispw", "?device_get_dipsw@@YAEH@Z"}));
detour::inline_hook((void *) device_get_input, libutils::try_proc_list(
DEVICE_INSTANCE, {"device_get_input", "?device_get_input@@YAIH@Z"}));
detour::inline_hook((void *) device_get_input_time, libutils::try_proc_list(
DEVICE_INSTANCE, {"device_get_input_time", "?device_get_input_time@@YA_KXZ"}));
detour::inline_hook((void *) device_get_jamma, libutils::try_proc_list(
DEVICE_INSTANCE, {"device_get_jamma"}));
detour::inline_hook((void *) device_get_jamma_history, libutils::try_proc_list(
DEVICE_INSTANCE, {"device_get_jamma_history",
"?device_get_jamma_history@@YAHPEAUT_JAMMA_HISTORY_INFO@@H@Z",
"?device_get_jamma_history@@YAHPAUT_JAMMA_HISTORY_INFO@@H@Z"}));
detour::inline_hook((void *) device_get_panel_trg_off, libutils::try_proc_list(
DEVICE_INSTANCE, {"device_get_panel_trg_off"}));
detour::inline_hook((void *) device_get_panel_trg_on, libutils::try_proc_list(
DEVICE_INSTANCE, {"device_get_panel_trg_on"}));
detour::inline_hook((void *) device_get_panel_trg_short_on, libutils::try_proc_list(
DEVICE_INSTANCE, {"device_get_panel_trg_short_on"}));
detour::inline_hook((void *) device_get_secplug_error, libutils::try_proc_list(
DEVICE_INSTANCE, {"device_get_secplug_error"}));
detour::inline_hook((void *) device_get_secplug_hist, libutils::try_proc_list(
DEVICE_INSTANCE, {"device_get_secplug_hist"}));
detour::inline_hook((void *) device_get_racecount, libutils::try_proc_list(
DEVICE_INSTANCE, {"device_get_racecount", "?device_get_racecount@@YAHXZ"}));
detour::inline_hook((void *) device_get_secplug, libutils::try_proc_list(
DEVICE_INSTANCE, {"device_get_secplug", "?device_get_secplug@@YAHHQEAE0@Z"}));
detour::inline_hook((void *) device_get_sliptrg, libutils::try_proc_list(
DEVICE_INSTANCE, {"device_get_sliptrg", "?device_get_sliptrg@@YAIH@Z"}));
detour::inline_hook((void *) device_get_status, libutils::try_proc_list(
DEVICE_INSTANCE, {"device_get_status", "?device_get_status@@YAHXZ"}));
detour::inline_hook((void *) device_get_subboard_version, libutils::try_proc_list(
DEVICE_INSTANCE, {"device_get_subboard_version",
"?device_get_subboard_version@@YAHPEADH@Z",
"?device_get_subboard_version@@YAHPADH@Z"}));
detour::inline_hook((void *) device_get_sys_version, libutils::try_proc_list(
DEVICE_INSTANCE, {"device_get_sys_version", "?device_get_sys_version@@YAPEBDXZ"}));
detour::inline_hook((void *) device_initialize, libutils::try_proc_list(
DEVICE_INSTANCE, {"device_initialize",
"?device_initialize@@YAHH@Z",
"?device_initialize@@YAHXZ"}));
detour::inline_hook((void *) device_is_initialized, libutils::try_proc_list(
DEVICE_INSTANCE, {"device_is_initialized"}));
detour::inline_hook((void *) device_poweroff, libutils::try_proc_list(
DEVICE_INSTANCE, {"device_poweroff", "?device_poweroff@@YAXXZ"}));
detour::inline_hook((void *) device_read_secplug, libutils::try_proc_list(
DEVICE_INSTANCE, {"device_read_secplug", "?device_read_secplug@@YAHHQEAE0@Z"}));
detour::inline_hook((void *) device_set_coinblocker_open, libutils::try_proc_list(
DEVICE_INSTANCE, {"device_set_coinblocker_open", "?device_set_coinblocker_open@@YAXEE@Z"}));
detour::inline_hook((void *) device_set_coincounter_merge, libutils::try_proc_list(
DEVICE_INSTANCE, {"device_set_coincounter_merge", "?device_set_coincounter_merge@@YAXE@Z"}));
detour::inline_hook((void *) device_set_coincounter_work, libutils::try_proc_list(
DEVICE_INSTANCE, {"device_set_coincounter_work", "?device_set_coincounter_work@@YAXEE@Z"}));
detour::inline_hook((void *) device_set_coincounter_controllable, libutils::try_proc_list(
DEVICE_INSTANCE, {"device_set_coincounter_controllable", "?device_set_coincounter_controllable@@YAXEE@Z"}));
detour::inline_hook((void *) device_set_panel_mode, libutils::try_proc_list(
DEVICE_INSTANCE, {"device_set_panel_mode"}));
detour::inline_hook((void *) device_set_jamma_asyncmode, libutils::try_proc_list(
DEVICE_INSTANCE, {"device_set_jamma_asyncmode", "?device_set_jamma_asyncmode@@YAXXZ"}));
detour::inline_hook((void *) device_set_jamma_normalmode, libutils::try_proc_list(
DEVICE_INSTANCE, {"device_set_jamma_normalmode", "?device_set_jamma_normalmode@@YAXXZ"}));
detour::inline_hook((void *) device_set_jamma_unti_inputskip, libutils::try_proc_list(
DEVICE_INSTANCE, {"device_set_jamma_unti_inputskip", "?device_set_jamma_unti_inputskip@@YAXH@Z"}));
detour::inline_hook((void *) device_set_portout, libutils::try_proc_list(
DEVICE_INSTANCE, {"device_set_portout", "?device_set_portout@@YAXHH@Z"}));
detour::inline_hook((void *) device_set_portoutbit, libutils::try_proc_list(
DEVICE_INSTANCE, {"device_set_portoutbit", "?device_set_portoutbit@@YAXHH@Z"}));
detour::inline_hook((void *) device_set_watchdog_timer, libutils::try_proc_list(
DEVICE_INSTANCE, {"device_set_watchdog_timer"}));
detour::inline_hook((void *) device_set_watchdog, libutils::try_proc_list(
DEVICE_INSTANCE, {"?device_set_watchdog@@YAXH@Z"}));
detour::inline_hook((void *) device_update, libutils::try_proc_list(
DEVICE_INSTANCE, {"device_update", "?device_update@@YAXXZ"}));
detour::inline_hook((void *) device_update_secplug, libutils::try_proc_list(
DEVICE_INSTANCE, {"device_update_secplug", "?device_update_secplug@@YAXXZ"}));
detour::inline_hook((void *) devsci_break, libutils::try_proc_list(
DEVICE_INSTANCE, {"devsci_break", "?devsci_break@@YAXHH@Z"}));
detour::inline_hook((void *) devsci_open, libutils::try_proc_list(
DEVICE_INSTANCE, {"devsci_open", "?devsci_open@@YAXHHH@Z"}));
detour::inline_hook((void *) devsci_read, libutils::try_proc_list(
DEVICE_INSTANCE, {"devsci_read", "?devsci_read@@YAHHPEAEH@Z"}));
detour::inline_hook((void *) devsci_write, libutils::try_proc_list(
DEVICE_INSTANCE, {"devsci_write", "?devsci_write@@YAHHPEBEH@Z"}));
detour::inline_hook((void *) p4io_sci_boot, libutils::try_proc_list(
DEVICE_INSTANCE, {"p4io_sci_boot"}));
detour::inline_hook((void *) p4io_sci_close, libutils::try_proc_list(
DEVICE_INSTANCE, {"p4io_sci_close"}));
detour::inline_hook((void *) p4io_sci_set_linebreak, libutils::try_proc_list(
DEVICE_INSTANCE, {"p4io_sci_set_linebreak"}));
detour::inline_hook((void *) p4io_sci_setparam, libutils::try_proc_list(
DEVICE_INSTANCE, {"p4io_sci_setparam"}));
detour::inline_hook((void *) p4io_sci_puts, libutils::try_proc_list(
DEVICE_INSTANCE, {"p4io_sci_puts"}));
detour::inline_hook((void *) p4io_sci_gets, libutils::try_proc_list(
DEVICE_INSTANCE, {"p4io_sci_gets"}));
detour::inline_hook((void *) p4io_sci_flush, libutils::try_proc_list(
DEVICE_INSTANCE, {"p4io_sci_flush"}));
detour::inline_hook((void *) p4io_sci_flush_complete, libutils::try_proc_list(
DEVICE_INSTANCE, {"p4io_sci_flush_complete"}));
detour::inline_hook((void *) p4io_sci_clear_error, libutils::try_proc_list(
DEVICE_INSTANCE, {"p4io_sci_clear_error"}));
detour::inline_hook((void *) p4io_sci_get_error, libutils::try_proc_list(
DEVICE_INSTANCE, {"p4io_sci_get_error"}));
detour::inline_hook((void *) p4io_sci_print_error, libutils::try_proc_list(
DEVICE_INSTANCE, {"p4io_sci_print_error"}));
// TODO: missing functions
// device_hwinfo_etc_update
// device_hwinfo_get
// device_hwinfo_update
// device_set_jamma_interrupt_status
// sci_mng_get_debug_info
// test_device
}
void spicedevice_detach() {
// TODO
}