mirror of
https://github.com/djhackersdev/bemanitools.git
synced 2024-11-24 14:50:10 +01:00
asiohook: Adds asio reghook for later use
This commit is contained in:
parent
0d3fa54316
commit
bd382e5509
@ -77,6 +77,7 @@ imps += avs avs-ea3
|
|||||||
include src/main/aciodrv/Module.mk
|
include src/main/aciodrv/Module.mk
|
||||||
include src/main/acioemu/Module.mk
|
include src/main/acioemu/Module.mk
|
||||||
include src/main/aciotest/Module.mk
|
include src/main/aciotest/Module.mk
|
||||||
|
include src/main/asiohook/Module.mk
|
||||||
include src/main/bio2emu/Module.mk
|
include src/main/bio2emu/Module.mk
|
||||||
include src/main/bsthook/Module.mk
|
include src/main/bsthook/Module.mk
|
||||||
include src/main/bstio/Module.mk
|
include src/main/bstio/Module.mk
|
||||||
|
9
src/main/asiohook/Module.mk
Normal file
9
src/main/asiohook/Module.mk
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
libs += asiohook
|
||||||
|
|
||||||
|
libs_asiohook := \
|
||||||
|
hook \
|
||||||
|
hooklib \
|
||||||
|
util \
|
||||||
|
|
||||||
|
src_asiohook := \
|
||||||
|
asio-reghook.c \
|
199
src/main/asiohook/asio-reghook.c
Normal file
199
src/main/asiohook/asio-reghook.c
Normal file
@ -0,0 +1,199 @@
|
|||||||
|
#define LOG_MODULE "asio-reghook"
|
||||||
|
|
||||||
|
// clang-format off
|
||||||
|
// Don't format because the order is important here
|
||||||
|
#include <windows.h>
|
||||||
|
#include <initguid.h>
|
||||||
|
// clang-format on
|
||||||
|
|
||||||
|
#include <winreg.h>
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include "hook/com-proxy.h"
|
||||||
|
#include "hook/table.h"
|
||||||
|
|
||||||
|
#include "asiohook/asio-reghook.h"
|
||||||
|
|
||||||
|
#include "util/defs.h"
|
||||||
|
#include "util/log.h"
|
||||||
|
#include "util/str.h"
|
||||||
|
#include "util/time.h"
|
||||||
|
|
||||||
|
// MAXDRVNAMELEN
|
||||||
|
#define ASIO_NAME_STRING_SIZE 128
|
||||||
|
|
||||||
|
static char asio_expected_name[ASIO_NAME_STRING_SIZE] = "XONAR SOUND CARD(64)";
|
||||||
|
static char asio_target_name[ASIO_NAME_STRING_SIZE] = "XONAR SOUND CARD(64)";
|
||||||
|
static HKEY asio_root_key;
|
||||||
|
static HKEY asio_sub_key;
|
||||||
|
|
||||||
|
LSTATUS my_RegOpenKeyA(HKEY hKey, LPCSTR lpSubKey, PHKEY phkResult);
|
||||||
|
|
||||||
|
LSTATUS my_RegEnumKeyA(HKEY hKey, DWORD dwIndex, LPSTR lpName, DWORD cchName);
|
||||||
|
|
||||||
|
LSTATUS my_RegOpenKeyExA(
|
||||||
|
HKEY hKey,
|
||||||
|
LPCSTR lpSubKey,
|
||||||
|
DWORD ulOptions,
|
||||||
|
REGSAM samDesired,
|
||||||
|
PHKEY phkResult);
|
||||||
|
|
||||||
|
LSTATUS my_RegQueryValueExA(
|
||||||
|
HKEY hKey,
|
||||||
|
LPCSTR lpValueName,
|
||||||
|
LPDWORD lpReserved,
|
||||||
|
LPDWORD lpType,
|
||||||
|
LPBYTE lpData,
|
||||||
|
LPDWORD lpcbData);
|
||||||
|
|
||||||
|
LSTATUS my_RegCloseKey(HKEY hKey);
|
||||||
|
|
||||||
|
LSTATUS (*real_RegOpenKeyA)(HKEY hKey, LPCSTR lpSubKey, PHKEY phkResult);
|
||||||
|
|
||||||
|
LSTATUS (*real_RegEnumKeyA)
|
||||||
|
(HKEY hKey, DWORD dwIndex, LPSTR lpName, DWORD cchName);
|
||||||
|
|
||||||
|
LSTATUS (*real_RegOpenKeyExA)
|
||||||
|
(HKEY hKey,
|
||||||
|
LPCSTR lpSubKey,
|
||||||
|
DWORD ulOptions,
|
||||||
|
REGSAM samDesired,
|
||||||
|
PHKEY phkResult);
|
||||||
|
|
||||||
|
LSTATUS (*real_RegQueryValueExA)
|
||||||
|
(HKEY hKey,
|
||||||
|
LPCSTR lpValueName,
|
||||||
|
LPDWORD lpReserved,
|
||||||
|
LPDWORD lpType,
|
||||||
|
LPBYTE lpData,
|
||||||
|
LPDWORD lpcbData);
|
||||||
|
|
||||||
|
LSTATUS (*real_RegCloseKey)(HKEY hKey);
|
||||||
|
|
||||||
|
static const struct hook_symbol asio_reghook_advapi32_syms[] = {
|
||||||
|
{.name = "RegOpenKeyA",
|
||||||
|
.patch = my_RegOpenKeyA,
|
||||||
|
.link = (void **) &real_RegOpenKeyA},
|
||||||
|
{.name = "RegEnumKeyA",
|
||||||
|
.patch = my_RegEnumKeyA,
|
||||||
|
.link = (void **) &real_RegEnumKeyA},
|
||||||
|
{.name = "RegOpenKeyExA",
|
||||||
|
.patch = my_RegOpenKeyExA,
|
||||||
|
.link = (void **) &real_RegOpenKeyExA},
|
||||||
|
{.name = "RegQueryValueExA",
|
||||||
|
.patch = my_RegQueryValueExA,
|
||||||
|
.link = (void **) &real_RegQueryValueExA},
|
||||||
|
{.name = "RegCloseKey",
|
||||||
|
.patch = my_RegCloseKey,
|
||||||
|
.link = (void **) &real_RegCloseKey},
|
||||||
|
};
|
||||||
|
|
||||||
|
LSTATUS my_RegOpenKeyA(HKEY hKey, LPCSTR lpSubKey, PHKEY phkResult)
|
||||||
|
{
|
||||||
|
LSTATUS result = real_RegOpenKeyA(hKey, lpSubKey, phkResult);
|
||||||
|
|
||||||
|
if (!strcmp("software\\asio", lpSubKey)) {
|
||||||
|
log_info("ASIO root key found");
|
||||||
|
asio_root_key = *phkResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
LSTATUS my_RegEnumKeyA(HKEY hKey, DWORD dwIndex, LPSTR lpName, DWORD cchName)
|
||||||
|
{
|
||||||
|
LSTATUS result = real_RegEnumKeyA(hKey, dwIndex, lpName, cchName);
|
||||||
|
|
||||||
|
if (hKey == asio_root_key) {
|
||||||
|
if (!strcmp(asio_target_name, lpName)) {
|
||||||
|
log_info(
|
||||||
|
"Replacing key [%s] with [%s]",
|
||||||
|
asio_target_name,
|
||||||
|
asio_expected_name);
|
||||||
|
strncpy(lpName, asio_expected_name, cchName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
LSTATUS my_RegOpenKeyExA(
|
||||||
|
HKEY hKey,
|
||||||
|
LPCSTR lpSubKey,
|
||||||
|
DWORD ulOptions,
|
||||||
|
REGSAM samDesired,
|
||||||
|
PHKEY phkResult)
|
||||||
|
{
|
||||||
|
if (hKey == asio_root_key) {
|
||||||
|
if (!strcmp(asio_expected_name, lpSubKey)) {
|
||||||
|
// swap to the real one so the call succeeds
|
||||||
|
LSTATUS result = real_RegOpenKeyExA(
|
||||||
|
hKey, asio_target_name, ulOptions, samDesired, phkResult);
|
||||||
|
|
||||||
|
asio_sub_key = *phkResult;
|
||||||
|
log_info("ASIO device key found");
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return real_RegOpenKeyExA(hKey, lpSubKey, ulOptions, samDesired, phkResult);
|
||||||
|
}
|
||||||
|
|
||||||
|
LSTATUS my_RegQueryValueExA(
|
||||||
|
HKEY hKey,
|
||||||
|
LPCSTR lpValueName,
|
||||||
|
LPDWORD lpReserved,
|
||||||
|
LPDWORD lpType,
|
||||||
|
LPBYTE lpData,
|
||||||
|
LPDWORD lpcbData)
|
||||||
|
{
|
||||||
|
DWORD lpcbData_orig = *lpcbData;
|
||||||
|
LSTATUS result = real_RegQueryValueExA(
|
||||||
|
hKey, lpValueName, lpReserved, lpType, lpData, lpcbData);
|
||||||
|
|
||||||
|
if (result == ERROR_SUCCESS) {
|
||||||
|
if (hKey == asio_sub_key) {
|
||||||
|
if (!strcmp("description", lpValueName)) {
|
||||||
|
log_info(
|
||||||
|
"Replacing description [%s] with [%s]",
|
||||||
|
lpData,
|
||||||
|
asio_expected_name);
|
||||||
|
strncpy((char *) lpData, asio_expected_name, lpcbData_orig);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
LSTATUS my_RegCloseKey(HKEY hKey)
|
||||||
|
{
|
||||||
|
if (hKey == asio_root_key) {
|
||||||
|
asio_root_key = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hKey == asio_sub_key) {
|
||||||
|
asio_sub_key = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return real_RegCloseKey(hKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
void asio_reghook_init(const char *expected_name, const char *target_name)
|
||||||
|
{
|
||||||
|
strncpy(asio_expected_name, expected_name, ASIO_NAME_STRING_SIZE - 1);
|
||||||
|
strncpy(asio_target_name, target_name, ASIO_NAME_STRING_SIZE - 1);
|
||||||
|
|
||||||
|
asio_expected_name[ASIO_NAME_STRING_SIZE - 1] = '\0';
|
||||||
|
asio_target_name[ASIO_NAME_STRING_SIZE - 1] = '\0';
|
||||||
|
|
||||||
|
hook_table_apply(
|
||||||
|
NULL,
|
||||||
|
"Advapi32.dll",
|
||||||
|
asio_reghook_advapi32_syms,
|
||||||
|
lengthof(asio_reghook_advapi32_syms));
|
||||||
|
|
||||||
|
log_info("Inserted reg hooks for ASIO override");
|
||||||
|
}
|
6
src/main/asiohook/asio-reghook.h
Normal file
6
src/main/asiohook/asio-reghook.h
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
#ifndef IASIO_REG_HOOK_H
|
||||||
|
#define IASIO_REG_HOOK_H
|
||||||
|
|
||||||
|
void asio_reghook_init(const char *expected_name, const char *target_name);
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue
Block a user