Show More
Commit Description:
Add timers for Simulation and various engines...
Commit Description:
Add timers for Simulation and various engines
Starting to add additional timers for different stages of the process of
updating in order to get more insight into what is slowing it down.
The update takes 9ms, which is much longer than it used to.
Engine-specific timers are coming later.
References:
File last commit:
Show/Diff file:
Action:
FNA/lib/FAudio/cpp/win_registry.cpp
87 lines | 2.5 KiB | text/x-c | CppLexer
87 lines | 2.5 KiB | text/x-c | CppLexer
r0 | #define WIN32_LEAN_AND_MEAN | |||
#include <windows.h> | ||||
#include <stdio.h> /* snprintf */ | ||||
static bool registry_write_string(HKEY reg, const char *name, const char *value, size_t len) | ||||
{ | ||||
HRESULT hr = RegSetValueExA( | ||||
reg, | ||||
name, | ||||
0, | ||||
REG_SZ, | ||||
reinterpret_cast<const BYTE *> (value), | ||||
static_cast<DWORD>((len + 1) * sizeof(char)) | ||||
); | ||||
return hr == ERROR_SUCCESS; | ||||
} | ||||
static const char *base_key() | ||||
{ | ||||
if (sizeof(void *) == 4) | ||||
{ | ||||
return "Software\\Classes\\WOW6432Node\\CLSID"; | ||||
} | ||||
else | ||||
{ | ||||
return "Software\\Classes\\CLSID"; | ||||
} | ||||
} | ||||
static void format_clsid(REFIID clsid, char *value, size_t max) | ||||
{ | ||||
snprintf(value, max, "{%08lX-%04hX-%04hX-%02hhX%02hhX-%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX}", | ||||
clsid.Data1, clsid.Data2, clsid.Data3, | ||||
clsid.Data4[0], clsid.Data4[1], clsid.Data4[2], clsid.Data4[3], | ||||
clsid.Data4[4], clsid.Data4[5], clsid.Data4[6], clsid.Data4[7]); | ||||
} | ||||
extern "C" HRESULT register_faudio_dll(void *DllHandle, REFIID clsid) | ||||
{ | ||||
// not your typical COM register functions because we're "hijacking" the existing XAudio2 registration | ||||
// - COM classes are historically registered under HKEY_CLASSES_ROOT | ||||
// - on modern Windows version this is a merged from on HKEY_LOCAL_MACHINE/Software/Classes and HKEY_CURRENT_USER/Software/Classes | ||||
// - the system-wide configuration is stored under HKEY_LOCAL_MACHINE | ||||
// - we override the registration for the XAudio2 DLLs for the current user | ||||
char str_clsid[40]; | ||||
format_clsid(clsid, str_clsid, sizeof(str_clsid) / sizeof(char)); | ||||
char key[2048]; | ||||
snprintf(key, sizeof(key) / sizeof(char), "%s\\%s\\InProcServer32", base_key(), str_clsid); | ||||
// open registry (creating key if it does not exist) | ||||
HKEY registry_key = NULL; | ||||
if (RegCreateKeyExA(HKEY_CURRENT_USER, key, 0, NULL, 0, KEY_WRITE, NULL, ®istry_key, NULL)) | ||||
{ | ||||
return E_FAIL; | ||||
} | ||||
// retrieve path to the dll | ||||
char path[2048]; | ||||
DWORD len = GetModuleFileNameA(reinterpret_cast<HMODULE>(DllHandle), path, sizeof(key) / sizeof(char)); | ||||
// update registry | ||||
registry_write_string(registry_key, NULL, path, len); | ||||
RegCloseKey(registry_key); | ||||
return S_OK; | ||||
} | ||||
extern "C" HRESULT unregister_faudio_dll(void *DllHandle, REFIID clsid) | ||||
{ | ||||
// open registry | ||||
HKEY registry_key = NULL; | ||||
if (RegOpenKeyExA(HKEY_CURRENT_USER, base_key(), 0, DELETE | KEY_SET_VALUE | KEY_ENUMERATE_SUB_KEYS | KEY_QUERY_VALUE, ®istry_key)) | ||||
{ | ||||
return E_FAIL; | ||||
} | ||||
char str_clsid[40]; | ||||
format_clsid(clsid, str_clsid, sizeof(str_clsid) / sizeof(char)); | ||||
// delete key | ||||
HRESULT hr = RegDeleteTreeA(registry_key, str_clsid); | ||||
RegCloseKey(registry_key); | ||||
return S_OK; | ||||
} | ||||