sao: progress
This commit is contained in:
parent
49c31853e6
commit
180d217e1f
@ -21,6 +21,37 @@ void sao_dll_config_load(
|
|||||||
filename);
|
filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void systype_config_load(
|
||||||
|
struct systype_config *cfg,
|
||||||
|
const wchar_t *filename)
|
||||||
|
{
|
||||||
|
cfg->enable = GetPrivateProfileIntW(
|
||||||
|
L"systype",
|
||||||
|
L"enable",
|
||||||
|
1,
|
||||||
|
filename
|
||||||
|
);
|
||||||
|
|
||||||
|
cfg->type = GetPrivateProfileIntW(
|
||||||
|
L"systype",
|
||||||
|
L"type",
|
||||||
|
0,
|
||||||
|
filename
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
void sao_touch_config_load(
|
||||||
|
struct sao_touch_config *cfg,
|
||||||
|
const wchar_t *filename)
|
||||||
|
{
|
||||||
|
cfg->enable = GetPrivateProfileIntW(
|
||||||
|
L"touch",
|
||||||
|
L"enable",
|
||||||
|
1,
|
||||||
|
filename
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
void sao_hook_config_load(
|
void sao_hook_config_load(
|
||||||
struct sao_hook_config *cfg,
|
struct sao_hook_config *cfg,
|
||||||
const wchar_t *filename)
|
const wchar_t *filename)
|
||||||
@ -34,5 +65,6 @@ void sao_hook_config_load(
|
|||||||
qr_config_load(&cfg->qr, filename);
|
qr_config_load(&cfg->qr, filename);
|
||||||
bpreader_config_load(&cfg->reader, filename);
|
bpreader_config_load(&cfg->reader, filename);
|
||||||
usio_config_load(&cfg->usio, filename);
|
usio_config_load(&cfg->usio, filename);
|
||||||
|
systype_config_load(&cfg->systype, filename);
|
||||||
|
sao_touch_config_load(&cfg->touch, filename);
|
||||||
}
|
}
|
||||||
|
@ -8,6 +8,8 @@
|
|||||||
#include "gfxhook/config.h"
|
#include "gfxhook/config.h"
|
||||||
#include "amcus/config.h"
|
#include "amcus/config.h"
|
||||||
#include "board/config.h"
|
#include "board/config.h"
|
||||||
|
#include "saohook/systype.h"
|
||||||
|
#include "saohook/touch.h"
|
||||||
|
|
||||||
struct sao_hook_config {
|
struct sao_hook_config {
|
||||||
struct platform_config platform;
|
struct platform_config platform;
|
||||||
@ -18,6 +20,8 @@ struct sao_hook_config {
|
|||||||
struct qr_config qr;
|
struct qr_config qr;
|
||||||
struct bpreader_config reader;
|
struct bpreader_config reader;
|
||||||
struct usio_config usio;
|
struct usio_config usio;
|
||||||
|
struct systype_config systype;
|
||||||
|
struct sao_touch_config touch;
|
||||||
};
|
};
|
||||||
|
|
||||||
void sao_dll_config_load(
|
void sao_dll_config_load(
|
||||||
@ -32,3 +36,11 @@ void sao_hook_config_load(
|
|||||||
struct sao_hook_config *cfg,
|
struct sao_hook_config *cfg,
|
||||||
const wchar_t *filename);
|
const wchar_t *filename);
|
||||||
|
|
||||||
|
void systype_config_load(
|
||||||
|
struct systype_config *cfg,
|
||||||
|
const wchar_t *filename);
|
||||||
|
|
||||||
|
void sao_touch_config_load(
|
||||||
|
struct sao_touch_config *cfg,
|
||||||
|
const wchar_t *filename);
|
||||||
|
|
||||||
|
@ -5,6 +5,8 @@
|
|||||||
#include "saohook/sao-dll.h"
|
#include "saohook/sao-dll.h"
|
||||||
#include "saohook/usio.h"
|
#include "saohook/usio.h"
|
||||||
#include "saohook/unity.h"
|
#include "saohook/unity.h"
|
||||||
|
#include "saohook/systype.h"
|
||||||
|
#include "saohook/touch.h"
|
||||||
|
|
||||||
#include "amcus/amcus.h"
|
#include "amcus/amcus.h"
|
||||||
|
|
||||||
@ -75,6 +77,18 @@ static DWORD CALLBACK sao_pre_startup(void)
|
|||||||
ExitProcess(EXIT_FAILURE);
|
ExitProcess(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hr = systype_hook_init(&sao_hook_cfg.systype, &sao_hook_cfg.platform.dongle);
|
||||||
|
|
||||||
|
if (FAILED(hr)) {
|
||||||
|
ExitProcess(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
hr = sao_touch_hook_init(&sao_hook_cfg.touch);
|
||||||
|
|
||||||
|
if (FAILED(hr)) {
|
||||||
|
ExitProcess(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
unity_hook_init();
|
unity_hook_init();
|
||||||
|
|
||||||
gfx_hook_init(&sao_hook_cfg.gfx);
|
gfx_hook_init(&sao_hook_cfg.gfx);
|
||||||
|
@ -26,6 +26,10 @@ shared_library(
|
|||||||
'config.h',
|
'config.h',
|
||||||
'sao-dll.c',
|
'sao-dll.c',
|
||||||
'sao-dll.h',
|
'sao-dll.h',
|
||||||
|
'systype.c',
|
||||||
|
'systype.h',
|
||||||
|
'touch.c',
|
||||||
|
'touch.h',
|
||||||
'usio.c',
|
'usio.c',
|
||||||
'usio.h',
|
'usio.h',
|
||||||
'unity.c',
|
'unity.c',
|
||||||
|
109
saohook/systype.c
Normal file
109
saohook/systype.c
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
#include "hook/table.h"
|
||||||
|
#include "hooklib/reg.h"
|
||||||
|
#include "hooklib/procaddr.h"
|
||||||
|
#include "util/dprintf.h"
|
||||||
|
#include "saohook/systype.h"
|
||||||
|
#include "platform/es3sec.h"
|
||||||
|
|
||||||
|
const wchar_t *cpu_name_client = L"Intel(R) Genuine Snake Oil";
|
||||||
|
const wchar_t *cpu_name_terminal = L"AMD(R) Certified Abacus";
|
||||||
|
static bool is_terminal = false;
|
||||||
|
static struct es3sec_config dong_config;
|
||||||
|
static HRESULT systype_read_cpu_name(void *bytes, uint32_t *nbytes);
|
||||||
|
static BOOL my_GlobalMemoryStatusEx(LPMEMORYSTATUSEX lpBuffer);
|
||||||
|
static BOOL (*next_GlobalMemoryStatusEx)(LPMEMORYSTATUSEX lpBuffer);
|
||||||
|
|
||||||
|
static int my_GetSerialNumber(ULONG usercode, intptr_t serialnumber);
|
||||||
|
static int (*next_GetSerialNumber)(ULONG usercode, intptr_t serialnumber);
|
||||||
|
|
||||||
|
const struct reg_hook_val sys_info_reg[] = {
|
||||||
|
{
|
||||||
|
.name = L"ProcessorNameString",
|
||||||
|
.type = REG_SZ,
|
||||||
|
.read = systype_read_cpu_name
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct hook_symbol systype_kernel32_syms[] = {
|
||||||
|
{
|
||||||
|
.name = "GlobalMemoryStatusEx",
|
||||||
|
.patch = my_GlobalMemoryStatusEx,
|
||||||
|
.link = (void **) &next_GlobalMemoryStatusEx,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct hook_symbol procaddr_dong_syms[] = {
|
||||||
|
{
|
||||||
|
.name = "GetSerialNumber",
|
||||||
|
.patch = my_GetSerialNumber,
|
||||||
|
.link = (void **) &next_GetSerialNumber,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
HRESULT systype_hook_init(const struct systype_config *sys_cfg, const struct es3sec_config *dong_cfg)
|
||||||
|
{
|
||||||
|
HRESULT hr = S_OK;
|
||||||
|
if (!sys_cfg->enable) {
|
||||||
|
return hr;
|
||||||
|
}
|
||||||
|
|
||||||
|
is_terminal = sys_cfg->type;
|
||||||
|
memcpy(&dong_config, dong_cfg, sizeof(*dong_cfg));
|
||||||
|
|
||||||
|
hr = reg_hook_push_key(
|
||||||
|
HKEY_LOCAL_MACHINE,
|
||||||
|
L"HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0",
|
||||||
|
sys_info_reg,
|
||||||
|
_countof(sys_info_reg));
|
||||||
|
|
||||||
|
hook_table_apply(
|
||||||
|
NULL,
|
||||||
|
"kernel32.dll",
|
||||||
|
systype_kernel32_syms,
|
||||||
|
_countof(systype_kernel32_syms));
|
||||||
|
|
||||||
|
proc_addr_table_push(
|
||||||
|
NULL,
|
||||||
|
"nbamUsbFinder_sup.dll",
|
||||||
|
procaddr_dong_syms,
|
||||||
|
_countof(procaddr_dong_syms)
|
||||||
|
);
|
||||||
|
|
||||||
|
dprintf("Systype: Init\n");
|
||||||
|
return hr;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT systype_read_cpu_name(void *bytes, uint32_t *nbytes)
|
||||||
|
{
|
||||||
|
dprintf("Systype: Read CPU Name\n");
|
||||||
|
if (!is_terminal) {
|
||||||
|
return reg_hook_read_wstr(bytes, nbytes, cpu_name_client);
|
||||||
|
}
|
||||||
|
return reg_hook_read_wstr(bytes, nbytes, cpu_name_terminal);
|
||||||
|
}
|
||||||
|
|
||||||
|
static BOOL my_GlobalMemoryStatusEx(LPMEMORYSTATUSEX lpBuffer)
|
||||||
|
{
|
||||||
|
dprintf("Systype: Get RAM Size\n");
|
||||||
|
BOOL ret = next_GlobalMemoryStatusEx(lpBuffer);
|
||||||
|
if (!ret) {
|
||||||
|
dprintf("Systype: next_GlobalMemoryStatusEx failed!\n");
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!is_terminal) {
|
||||||
|
lpBuffer->ullTotalPhys = (DWORDLONG) 8000 << 20;
|
||||||
|
} else {
|
||||||
|
lpBuffer->ullTotalPhys = (DWORDLONG) 4000 << 20;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int my_GetSerialNumber(ULONG usercode, intptr_t serialnumber)
|
||||||
|
{
|
||||||
|
wcstombs((char *)serialnumber, dong_config.serial, 32);
|
||||||
|
dprintf("Systype: my_GetSerialNumber %ls\n", dong_config.serial);
|
||||||
|
return 0;
|
||||||
|
}
|
16
saohook/systype.h
Normal file
16
saohook/systype.h
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <windows.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include "platform/es3sec.h"
|
||||||
|
|
||||||
|
enum SAO_SYS_TYPE {
|
||||||
|
CLIENT,
|
||||||
|
TERMINAL
|
||||||
|
};
|
||||||
|
|
||||||
|
struct systype_config {
|
||||||
|
bool enable;
|
||||||
|
enum SAO_SYS_TYPE type;
|
||||||
|
};
|
||||||
|
|
||||||
|
HRESULT systype_hook_init(const struct systype_config *sys_cfg, const struct es3sec_config *dong_cfg);
|
40
saohook/touch.c
Normal file
40
saohook/touch.c
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
#include "hook/table.h"
|
||||||
|
#include "hooklib/reg.h"
|
||||||
|
#include "util/dprintf.h"
|
||||||
|
#include "saohook/touch.h"
|
||||||
|
|
||||||
|
static int WINAPI my_GetSystemMetrics(int nIndex);
|
||||||
|
static int (WINAPI *next_GetSystemMetrics)(int nIndex);
|
||||||
|
|
||||||
|
static const struct hook_symbol touch_user32_syms[] = {
|
||||||
|
{
|
||||||
|
.name = "GetSystemMetrics",
|
||||||
|
.patch = my_GetSystemMetrics,
|
||||||
|
.link = (void **) &next_GetSystemMetrics,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
HRESULT sao_touch_hook_init(const struct sao_touch_config *cfg)
|
||||||
|
{
|
||||||
|
if (!cfg->enable) {
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
hook_table_apply(
|
||||||
|
NULL,
|
||||||
|
"User32.dll",
|
||||||
|
touch_user32_syms,
|
||||||
|
_countof(touch_user32_syms));
|
||||||
|
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int WINAPI my_GetSystemMetrics(int nIndex)
|
||||||
|
{
|
||||||
|
if (nIndex == SM_DIGITIZER) {
|
||||||
|
return NID_MULTI_INPUT;
|
||||||
|
}
|
||||||
|
return next_GetSystemMetrics(nIndex);
|
||||||
|
}
|
9
saohook/touch.h
Normal file
9
saohook/touch.h
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <windows.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
struct sao_touch_config {
|
||||||
|
bool enable;
|
||||||
|
};
|
||||||
|
|
||||||
|
HRESULT sao_touch_hook_init(const struct sao_touch_config *cfg);
|
@ -8,9 +8,12 @@
|
|||||||
#include "hooklib/dll.h"
|
#include "hooklib/dll.h"
|
||||||
#include "hooklib/path.h"
|
#include "hooklib/path.h"
|
||||||
#include "hooklib/serial.h"
|
#include "hooklib/serial.h"
|
||||||
|
#include "hooklib/reg.h"
|
||||||
|
#include "hooklib/procaddr.h"
|
||||||
|
|
||||||
#include "amcus/amcus.h"
|
#include "amcus/amcus.h"
|
||||||
#include "board/usio.h"
|
#include "board/usio.h"
|
||||||
|
#include "platform/epay.h"
|
||||||
|
|
||||||
#include "util/dprintf.h"
|
#include "util/dprintf.h"
|
||||||
|
|
||||||
@ -33,7 +36,13 @@ static const wchar_t *target_modules[] = {
|
|||||||
L"bnAMPF.dll",
|
L"bnAMPF.dll",
|
||||||
L"bnReader.dll",
|
L"bnReader.dll",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const wchar_t *dep_hooks[] = {
|
||||||
|
L"libamw.dll",
|
||||||
|
};
|
||||||
|
|
||||||
static const size_t target_modules_len = _countof(target_modules);
|
static const size_t target_modules_len = _countof(target_modules);
|
||||||
|
static const size_t dep_hooks_len = _countof(dep_hooks);
|
||||||
|
|
||||||
void unity_hook_init(void)
|
void unity_hook_init(void)
|
||||||
{
|
{
|
||||||
@ -53,10 +62,13 @@ static HMODULE WINAPI my_LoadLibraryW(const wchar_t *name)
|
|||||||
{
|
{
|
||||||
const wchar_t *name_end;
|
const wchar_t *name_end;
|
||||||
const wchar_t *target_module;
|
const wchar_t *target_module;
|
||||||
|
const wchar_t *target_dep;
|
||||||
bool already_loaded;
|
bool already_loaded;
|
||||||
HMODULE result;
|
HMODULE result;
|
||||||
|
HMODULE dep_mod;
|
||||||
size_t name_len;
|
size_t name_len;
|
||||||
size_t target_module_len;
|
size_t target_module_len;
|
||||||
|
size_t dep_len;
|
||||||
|
|
||||||
if (name == NULL) {
|
if (name == NULL) {
|
||||||
SetLastError(ERROR_INVALID_PARAMETER);
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
@ -96,9 +108,22 @@ static HMODULE WINAPI my_LoadLibraryW(const wchar_t *name)
|
|||||||
dll_hook_insert_hooks(result);
|
dll_hook_insert_hooks(result);
|
||||||
path_hook_insert_hooks(result);
|
path_hook_insert_hooks(result);
|
||||||
amcus_insert_hooks(result);
|
amcus_insert_hooks(result);
|
||||||
|
reg_hook_apply_hooks(result);
|
||||||
usio_hook_proc_addr(result);
|
usio_hook_proc_addr(result);
|
||||||
iohook_apply_hooks(result);
|
proc_addr_insert_hooks(result);
|
||||||
serial_hook_apply_hooks(result);
|
}
|
||||||
|
|
||||||
|
for (size_t i = 0; i < dep_hooks_len; i++) {
|
||||||
|
target_dep = dep_hooks[i];
|
||||||
|
|
||||||
|
dep_mod = GetModuleHandleW(target_dep);
|
||||||
|
if (dep_mod != NULL) {
|
||||||
|
dprintf("Unity: Hook dependency %ls\n", target_dep);
|
||||||
|
iohook_apply_hooks(dep_mod);
|
||||||
|
serial_hook_apply_hooks(dep_mod);
|
||||||
|
reg_hook_apply_hooks(dep_mod);
|
||||||
|
epay_insert_hook(dep_mod);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user