diff --git a/hooklib/reg.c b/hooklib/reg.c index cc3c584..64e72fb 100644 --- a/hooklib/reg.c +++ b/hooklib/reg.c @@ -43,6 +43,11 @@ static LSTATUS reg_hook_query_val_locked( void *bytes, uint32_t *nbytes); +static LSTATUS reg_hook_open_locked_a( + HKEY parent, + const char *name, + HKEY *out); + /* API hooks */ static LSTATUS WINAPI hook_RegOpenKeyExW( @@ -52,6 +57,13 @@ static LSTATUS WINAPI hook_RegOpenKeyExW( uint32_t access, HKEY *out); +static LSTATUS WINAPI hook_RegOpenKeyExA( + HKEY parent, + const char *name, + uint32_t flags, + uint32_t access, + HKEY *out); + static LSTATUS WINAPI hook_RegCreateKeyExW( HKEY parent, const wchar_t *name, @@ -108,6 +120,13 @@ static LSTATUS (WINAPI *next_RegOpenKeyExW)( uint32_t access, HKEY *out); +static LSTATUS (WINAPI *next_RegOpenKeyExA)( + HKEY parent, + const char *name, + uint32_t flags, + uint32_t access, + HKEY *out); + static LSTATUS (WINAPI *next_RegCreateKeyExW)( HKEY parent, const wchar_t *name, @@ -160,6 +179,10 @@ static const struct hook_symbol reg_hook_syms[] = { .name = "RegOpenKeyExW", .patch = hook_RegOpenKeyExW, .link = (void **) &next_RegOpenKeyExW, + },{ + .name = "RegOpenKeyExA", + .patch = hook_RegOpenKeyExA, + .link = (void **) &next_RegOpenKeyExA, }, { .name = "RegCreateKeyExW", .patch = hook_RegCreateKeyExW, @@ -369,6 +392,70 @@ static LSTATUS reg_hook_open_locked( return err; } +static LSTATUS reg_hook_open_locked_a( + HKEY parent, + const char *name, + HKEY *out) +{ + struct reg_hook_key *key; + LSTATUS err; + size_t i; + wchar_t *name_w; + size_t name_c; + + *out = NULL; + + mbstowcs_s(&name_c, NULL, 0, name, 0); + name_w = malloc(name_c * sizeof(wchar_t)); + + if (name_w == NULL) { + return ERROR_OUTOFMEMORY; + } + + mbstowcs_s(NULL, name_w, name_c, name, name_c - 1); + + for (i = 0 ; i < reg_hook_nkeys ; i++) { + /* Assume reg keys are referenced from a root key and not from some + intermediary key */ + key = ®_hook_keys[i]; + + if (key->root == parent && wstr_ieq(key->name, name_w)) { + break; + } + } + + /* (Bail out if we didn't find anything; this causes the open/create call + to be passed onward down the hook chain) */ + + if (i >= reg_hook_nkeys) { + return ERROR_SUCCESS; + } + + /* Assume only one handle will be open at a time */ + + if (key->handle != NULL) { + return ERROR_SHARING_VIOLATION; + } + + /* Open a unique HKEY handle that we can use to identify accesses to + this virtual registry key. We open a read-only handle to an arbitrary + registry key that we can reliably assume exists and isn't one of the + hardcoded root handles. HKLM\SOFTWARE will suffice for this purpose. */ + + err = next_RegOpenKeyExA( + HKEY_LOCAL_MACHINE, + "SOFTWARE", + 0, + KEY_READ, + out); + + if (err == ERROR_SUCCESS) { + key->handle = *out; + } + + return err; +} + static LSTATUS WINAPI hook_RegOpenKeyExW( HKEY parent, const wchar_t *name, @@ -397,6 +484,34 @@ static LSTATUS WINAPI hook_RegOpenKeyExW( return err; } +static LSTATUS WINAPI hook_RegOpenKeyExA( + HKEY parent, + const char *name, + uint32_t flags, + uint32_t access, + HKEY *out) +{ + LSTATUS err; + + if (out == NULL) { + return ERROR_INVALID_PARAMETER; + } + + EnterCriticalSection(®_hook_lock); + err = reg_hook_open_locked_a(parent, name, out); + LeaveCriticalSection(®_hook_lock); + + + if (err == ERROR_SUCCESS) { + if (*out != NULL) { + //dprintf("Registry: Opened virtual key %s\n", name); + } else { + err = next_RegOpenKeyExA(parent, name, flags, access, out); + } + } + + return err; +} static LSTATUS WINAPI hook_RegCreateKeyExW( HKEY parent, const wchar_t *name, diff --git a/platform/config.c b/platform/config.c index cbb6060..2e89872 100644 --- a/platform/config.c +++ b/platform/config.c @@ -214,6 +214,13 @@ void misc_config_load( cfg->block_input_hook = GetPrivateProfileIntW(L"misc", L"blockInputHook", 1, filename); cfg->show_cursor_hook = GetPrivateProfileIntW(L"misc", L"showCursorHook", 1, filename); + GetPrivateProfileStringW( + L"misc", + L"systemVersion", + L"XXX100-1-NA-SYS0-A00", + cfg->system_version, + _countof(cfg->system_version), + filename); } void es3sec_config_load(struct es3sec_config *cfg, const wchar_t *filename) diff --git a/platform/misc.c b/platform/misc.c index 0bdc2ef..8601811 100644 --- a/platform/misc.c +++ b/platform/misc.c @@ -5,6 +5,7 @@ #include #include "hook/table.h" +#include "hooklib/reg.h" #include "platform/misc.h" @@ -16,13 +17,14 @@ static BOOL WINAPI my_BlockInput(BOOL fBlockIt); static int WINAPI my_ShowCursor(BOOL bShow); static BOOL WINAPI my_GetCursorInfo(PCURSORINFO pci); +static HRESULT reg_read_sys_ver(void *bytes, uint32_t *nbytes); + static BOOL (WINAPI *next_BlockInput)(BOOL fBlockIt); static int (WINAPI *next_ShowCursor)(BOOL bShow); static BOOL (WINAPI *next_GetCursorInfo)(PCURSORINFO pci); -BOOL block_input_hook = true; -BOOL show_cursor_hook = true; -int real_cursor_state = 0; +static struct misc_config config; +static int real_cursor_state = 0; static const struct hook_symbol misc_hook_syms[] = { { @@ -40,12 +42,19 @@ static const struct hook_symbol misc_hook_syms[] = { } }; +static const struct reg_hook_val nbgi_reg[] = { + { + .name = L"SystemVersion", + .type = REG_SZ, + .read = reg_read_sys_ver + } +}; + HRESULT misc_hook_init(const struct misc_config *cfg) { assert(cfg != NULL); - show_cursor_hook = cfg->show_cursor_hook; - block_input_hook = cfg->block_input_hook; + memcpy(&config, cfg, sizeof(*cfg)); dprintf("Misc: init\n"); @@ -55,12 +64,18 @@ HRESULT misc_hook_init(const struct misc_config *cfg) misc_hook_syms, _countof(misc_hook_syms)); + reg_hook_push_key( + HKEY_LOCAL_MACHINE, + L"SOFTWARE\\NBGI", + nbgi_reg, + _countof(nbgi_reg)); + return S_OK; } static BOOL WINAPI my_BlockInput(BOOL fBlockIt) { - if (!block_input_hook) { + if (!config.block_input_hook) { return next_BlockInput(fBlockIt); } @@ -71,7 +86,7 @@ static BOOL WINAPI my_BlockInput(BOOL fBlockIt) static int WINAPI my_ShowCursor(BOOL bShow) { - if (!show_cursor_hook) { + if (!config.show_cursor_hook) { return next_ShowCursor(bShow); } @@ -87,7 +102,7 @@ static int WINAPI my_ShowCursor(BOOL bShow) static BOOL WINAPI my_GetCursorInfo(PCURSORINFO pci) { - if (!show_cursor_hook) { + if (!config.show_cursor_hook) { return next_GetCursorInfo(pci); } @@ -103,4 +118,10 @@ static BOOL WINAPI my_GetCursorInfo(PCURSORINFO pci) } return true; +} + +static HRESULT reg_read_sys_ver(void *bytes, uint32_t *nbytes) +{ + dprintf("Misc: Get system version\n"); + return reg_hook_read_wstr(bytes, nbytes, config.system_version); } \ No newline at end of file diff --git a/platform/misc.h b/platform/misc.h index 1b4aee1..2f1b1f8 100644 --- a/platform/misc.h +++ b/platform/misc.h @@ -7,6 +7,7 @@ struct misc_config { bool block_input_hook; bool show_cursor_hook; + wchar_t system_version[256]; }; HRESULT misc_hook_init(const struct misc_config *cfg); \ No newline at end of file