mirror of
https://gitea.tendokyu.moe/TeamTofuShop/segatools.git
synced 2026-09-30 22:07:56 +03:00
This adds a setting to the global configuration to allow only input when the game is focused. This prevents issues, such as triggering game buttons or service buttons while being tabbed out. Turned off by default. The implementation is not the best, but in the context how these games are structured, the most acceptable. It will keep scanning if the foreground window title fully matches (some games partially match, like FGO because due to the revision number in the title), and if found, will grab the HWND of that window and compare that from then on, to not tank performance due to constant string operations. Tested with FGO, chusan and ongeki. Reviewed-on: https://gitea.tendokyu.moe/TeamTofuShop/segatools/pulls/83 Reviewed-by: Dniel97 <dniel97@noreply.gitea.tendokyu.moe> Co-authored-by: kyoubate-haruka <46010460+kyoubate-haruka@users.noreply.github.com> Co-committed-by: kyoubate-haruka <46010460+kyoubate-haruka@users.noreply.github.com>
169 lines
3.6 KiB
C
169 lines
3.6 KiB
C
/*
|
|
"CHUNITHM" (chuni) hook
|
|
|
|
Devices
|
|
|
|
JVS: 837-14572 "Type 3" I/O Board
|
|
COM1: 837-15330 Ground Slider
|
|
COM10: 837-15093-06 LED Controller Board
|
|
COM11: 837-15093-06 LED Controller Board
|
|
COM12: TN32MSEC003S "Gen 1" Aime Reader
|
|
*/
|
|
|
|
#include <windows.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include "amex/amex.h"
|
|
|
|
#include "board/led15093.h"
|
|
#include "board/sg-reader.h"
|
|
|
|
#include "chunihook/config.h"
|
|
#include "chunihook/jvs.h"
|
|
#include "chunihook/slider.h"
|
|
|
|
#include "chuniio/chuniio.h"
|
|
|
|
#include "gfxhook/d3d9.h"
|
|
#include "gfxhook/gfx.h"
|
|
|
|
#include "hook/process.h"
|
|
|
|
#include "hooklib/serial.h"
|
|
#include "hooklib/spike.h"
|
|
|
|
#include "platform/platform.h"
|
|
|
|
#include "util/dprintf.h"
|
|
#include "util/env.h"
|
|
#include "util/fg-detect.h"
|
|
|
|
static HMODULE chuni_hook_mod;
|
|
static process_entry_t chuni_startup;
|
|
static struct chuni_hook_config chuni_hook_cfg;
|
|
|
|
static DWORD CALLBACK chuni_pre_startup(void)
|
|
{
|
|
HMODULE d3dc;
|
|
HMODULE dbghelp;
|
|
HRESULT hr;
|
|
|
|
dprintf("--- Begin chuni_pre_startup ---\n");
|
|
|
|
/* Pin the D3D shader compiler. This makes startup much faster. */
|
|
|
|
d3dc = LoadLibraryW(L"D3DCompiler_43.dll");
|
|
|
|
if (d3dc != NULL) {
|
|
dprintf("Pinned shader compiler, hMod=%p\n", d3dc);
|
|
} else {
|
|
dprintf("Failed to load shader compiler!\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 */
|
|
|
|
chuni_hook_config_load(&chuni_hook_cfg, get_config_path());
|
|
|
|
/* Hook Win32 APIs */
|
|
|
|
gfx_hook_init(&chuni_hook_cfg.gfx);
|
|
gfx_d3d9_hook_init(&chuni_hook_cfg.gfx, chuni_hook_mod);
|
|
serial_hook_init();
|
|
|
|
/* Initialize emulation hooks */
|
|
|
|
hr = platform_hook_init(
|
|
&chuni_hook_cfg.platform,
|
|
"SDBT",
|
|
"AAV1",
|
|
chuni_hook_mod);
|
|
|
|
if (FAILED(hr)) {
|
|
goto fail;
|
|
}
|
|
|
|
hr = chuni_dll_init(&chuni_hook_cfg.dll, chuni_hook_mod);
|
|
|
|
if (FAILED(hr)) {
|
|
goto fail;
|
|
}
|
|
|
|
hr = amex_hook_init(&chuni_hook_cfg.amex, chunithm_jvs_init);
|
|
|
|
if (FAILED(hr)) {
|
|
goto fail;
|
|
}
|
|
|
|
hr = slider_hook_init(&chuni_hook_cfg.slider);
|
|
|
|
if (FAILED(hr)) {
|
|
goto fail;
|
|
}
|
|
|
|
if ( chuni_dll.led_init == NULL || chuni_dll.led_set_leds == NULL )
|
|
{
|
|
dprintf("IO DLL doesn't support led_init/led_set_leds, cannot start LED15093 hook\n");
|
|
} else {
|
|
unsigned int led_port_no[2] = {10, 11};
|
|
hr = led15093_hook_init(&chuni_hook_cfg.led15093,
|
|
chuni_dll.led_init, chuni_dll.led_set_leds, led_port_no);
|
|
|
|
if (FAILED(hr)) {
|
|
goto fail;
|
|
}
|
|
}
|
|
|
|
hr = sg_reader_hook_init(&chuni_hook_cfg.aime, 12, 1, chuni_hook_mod);
|
|
|
|
if (FAILED(hr)) {
|
|
goto fail;
|
|
}
|
|
|
|
if (chuni_hook_cfg.amex.jvs.enable && chuni_hook_cfg.amex.jvs.foreground) {
|
|
fgdet_init(L"teaGfx DirectX Release", false);
|
|
}
|
|
|
|
/* Initialize debug helpers */
|
|
|
|
spike_hook_init(get_config_path());
|
|
|
|
dprintf("--- End chuni_pre_startup ---\n");
|
|
|
|
/* Jump to EXE start address */
|
|
|
|
return chuni_startup();
|
|
|
|
fail:
|
|
ExitProcess(EXIT_FAILURE);
|
|
}
|
|
|
|
BOOL WINAPI DllMain(HMODULE mod, DWORD cause, void *ctx)
|
|
{
|
|
HRESULT hr;
|
|
|
|
if (cause != DLL_PROCESS_ATTACH) {
|
|
return TRUE;
|
|
}
|
|
|
|
chuni_hook_mod = mod;
|
|
|
|
hr = process_hijack_startup(chuni_pre_startup, &chuni_startup);
|
|
|
|
if (!SUCCEEDED(hr)) {
|
|
dprintf("Failed to hijack process startup: %x\n", (int) hr);
|
|
}
|
|
|
|
return SUCCEEDED(hr);
|
|
}
|