From 925ce381c685408a1a6d35d2d8521b16d9755733 Mon Sep 17 00:00:00 2001 From: Pablo Navarro Date: Thu, 12 Feb 2026 18:31:25 +0100 Subject: [PATCH 01/68] Removed trying to load Windows system DLLs from user folders (#329) * Removed trying to load Windows system DLLs from user folders Fixes https://github.com/Ylianst/MeshCentral/issues/7606 --- meshservice/ServiceMain.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/meshservice/ServiceMain.c b/meshservice/ServiceMain.c index 9278c54c3..f92a15741 100644 --- a/meshservice/ServiceMain.c +++ b/meshservice/ServiceMain.c @@ -141,11 +141,9 @@ void GdiPlusFlat_Init() BOOL _ok = InitCommonControlsEx(&icex); char input[24] = { 0 }; - _gdip = LoadLibraryExW(L"Gdiplus.dll", NULL, LOAD_LIBRARY_SEARCH_USER_DIRS); - if (_gdip == NULL) { _gdip = LoadLibraryExW(L"Gdiplus.dll", NULL, 0); } + _gdip = LoadLibraryExW(L"Gdiplus.dll", NULL, 0); if (_gdip == NULL) { return; } - _shm = LoadLibraryExW(L"Shlwapi.dll", NULL, LOAD_LIBRARY_SEARCH_USER_DIRS); - if (_shm == NULL) { _gdip = LoadLibraryExW(L"Shlwapi.dll", NULL, 0); } + _shm = LoadLibraryExW(L"Shlwapi.dll", NULL, 0); if (_shm == NULL) { FreeLibrary(_gdip); _gdip = NULL; return; } __GdipCreateBitmapFromStream = (_GdipCreateBitmapFromStream)GetProcAddress(_gdip, (LPCSTR)"GdipCreateBitmapFromStream"); From 609a2ce4c4dd237eeebb86df9fafef6f6bc73949 Mon Sep 17 00:00:00 2001 From: Obsidian <123307773+LightZirconite@users.noreply.github.com> Date: Thu, 12 Feb 2026 18:32:43 +0100 Subject: [PATCH 02/68] Fix (UAC/Lock screen) (#320) --- meshcore/KVM/Windows/kvm.c | 1261 ++++++++++++++++++++---------------- 1 file changed, 716 insertions(+), 545 deletions(-) diff --git a/meshcore/KVM/Windows/kvm.c b/meshcore/KVM/Windows/kvm.c index fce04fed6..0e50ec901 100644 --- a/meshcore/KVM/Windows/kvm.c +++ b/meshcore/KVM/Windows/kvm.c @@ -1,4 +1,4 @@ -/* +/* Copyright 2006 - 2022 Intel Corporation Licensed under the Apache License, Version 2.0 (the "License"); @@ -15,7 +15,7 @@ limitations under the License. */ #if defined(_LINKVM) -#pragma warning(disable: 4996) +#pragma warning(disable : 4996) #include #include "kvm.h" @@ -38,7 +38,7 @@ limitations under the License. extern void KVM_WriteLog(ILibKVM_WriteHandler writeHandler, void *user, char *format, ...); -//#define KVMDEBUGENABLED 1 +// #define KVMDEBUGENABLED 1 ILibProcessPipe_SpawnTypes gProcessSpawnType = ILibProcessPipe_SpawnTypes_USER; int gProcessTSID = -1; extern int gRemoteMouseRenderDefault; @@ -52,12 +52,11 @@ typedef struct KVMDebugLog unsigned short logType; unsigned short logFlags; char logData[]; -}KVMDebugLog; +} KVMDebugLog; #pragma pack(pop) - #ifdef KVMDEBUGENABLED -void KvmCriticalLog(const char* msg, const char* file, int line, int user1, int user2) +void KvmCriticalLog(const char *msg, const char *file, int line, int user1, int user2) { int len; HANDLE h; @@ -65,8 +64,10 @@ void KvmCriticalLog(const char* msg, const char* file, int line, int user1, int h = OpenMutex(MUTEX_ALL_ACCESS, FALSE, TEXT("MeshAgentKvmLogLock")); if (h == NULL) { - if (GetLastError() != ERROR_FILE_NOT_FOUND) return; - if ((h = CreateMutex(NULL, TRUE, TEXT("MeshAgentKvmLogLock"))) == NULL) return; + if (GetLastError() != ERROR_FILE_NOT_FOUND) + return; + if ((h = CreateMutex(NULL, TRUE, TEXT("MeshAgentKvmLogLock"))) == NULL) + return; DontDestroy = 1; } else @@ -74,39 +75,45 @@ void KvmCriticalLog(const char* msg, const char* file, int line, int user1, int WaitForSingleObject(h, INFINITE); } len = sprintf_s(ILibScratchPad, sizeof(ILibScratchPad), "\r\n%s:%d (%d,%d) %s", file, line, user1, user2, msg); - if (len > 0 && len < (int)sizeof(ILibScratchPad)) ILibAppendStringToDiskEx("C:\\Temp\\MeshAgentKvm.log", ILibScratchPad, len); + if (len > 0 && len < (int)sizeof(ILibScratchPad)) + ILibAppendStringToDiskEx("C:\\Temp\\MeshAgentKvm.log", ILibScratchPad, len); ReleaseMutex(h); - if (DontDestroy == 0) CloseHandle(h); + if (DontDestroy == 0) + CloseHandle(h); } -#define KVMDEBUG(m,u) { KvmCriticalLog(m, __FILE__, __LINE__, u, GetLastError()); printf("KVMMSG: %s (%d,%d).\r\n", m, (int)u, (int)GetLastError()); } +#define KVMDEBUG(m, u) \ + { \ + KvmCriticalLog(m, __FILE__, __LINE__, u, GetLastError()); \ + printf("KVMMSG: %s (%d,%d).\r\n", m, (int)u, (int)GetLastError()); \ + } #define KVMDEBUG2 ILIBLOGMESSAGEX #else #define KVMDEBUG(m, u) -#define KVMDEBUG2(...) +#define KVMDEBUG2(...) #endif int TILE_WIDTH = 0; int TILE_HEIGHT = 0; -int SCREEN_COUNT = -1; // Total number of displays -int SCREEN_SEL = 0; // Currently selected display (0 = all) -int SCREEN_SEL_TARGET = 0; // Desired selected display (0 = all) -int SCREEN_SEL_PROCESS = 0; // In process of changing displays (0 = all) -int SCREEN_X = 0; // Left most of current screen -int SCREEN_Y = 0; // Top most of current screen -int SCREEN_WIDTH = 0; // Width of current screen -int SCREEN_HEIGHT = 0; // Height of current screen -int VSCREEN_X = 0; // Left most of virtual screen -int VSCREEN_Y = 0; // Top most of virtual screen -int VSCREEN_WIDTH = 0; // Width of virtual screen -int VSCREEN_HEIGHT = 0; // Height of virtual screen +int SCREEN_COUNT = -1; // Total number of displays +int SCREEN_SEL = 0; // Currently selected display (0 = all) +int SCREEN_SEL_TARGET = 0; // Desired selected display (0 = all) +int SCREEN_SEL_PROCESS = 0; // In process of changing displays (0 = all) +int SCREEN_X = 0; // Left most of current screen +int SCREEN_Y = 0; // Top most of current screen +int SCREEN_WIDTH = 0; // Width of current screen +int SCREEN_HEIGHT = 0; // Height of current screen +int VSCREEN_X = 0; // Left most of virtual screen +int VSCREEN_Y = 0; // Top most of virtual screen +int VSCREEN_WIDTH = 0; // Width of virtual screen +int VSCREEN_HEIGHT = 0; // Height of virtual screen int SCALED_WIDTH = 0; int SCALED_HEIGHT = 0; int PIXEL_SIZE = 0; int TILE_WIDTH_COUNT = 0; int TILE_HEIGHT_COUNT = 0; int COMPRESSION_RATIO = 0; -int SCALING_FACTOR = 1024; // Scaling factor, 1024 = 100% -int SCALING_FACTOR_NEW = 1024; // Desired scaling factor, 1024 = 100% +int SCALING_FACTOR = 1024; // Scaling factor, 1024 = 100% +int SCALING_FACTOR_NEW = 1024; // Desired scaling factor, 1024 = 100% int FRAME_RATE_TIMER = 0; HANDLE kvmthread = NULL; int g_shutdown = 999; @@ -131,7 +138,7 @@ void kvm_slave_OnRawForwardLog(ILibRemoteLogging sender, ILibRemoteLogging_Modul { if (flags <= ILibRemoteLogging_Flags_VerbosityLevel_1) { - KVMDebugLog *log = (KVMDebugLog*)buffer; + KVMDebugLog *log = (KVMDebugLog *)buffer; log->length = bufferLen + 1; log->logType = (unsigned short)module; log->logFlags = (unsigned short)flags; @@ -149,10 +156,10 @@ void kvm_setupSasPermissions() KVMDEBUG("kvm_setupSasPermissions", 0); - // SoftwareSASGeneration - if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System", 0, KEY_ALL_ACCESS, &key) == ERROR_SUCCESS) + // SoftwareSASGeneration + if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System", 0, KEY_ALL_ACCESS, &key) == ERROR_SUCCESS) { - RegSetValueEx(key, "SoftwareSASGeneration", 0, REG_DWORD, (BYTE*)&dw, 4); + RegSetValueEx(key, "SoftwareSASGeneration", 0, REG_DWORD, (BYTE *)&dw, 4); RegCloseKey(key); } } @@ -160,9 +167,9 @@ void kvm_setupSasPermissions() // Emulate the CTRL-ALT-DEL (Should work on WinXP, not on Vista & Win7) DWORD WINAPI kvm_ctrlaltdel(LPVOID Param) { - UNREFERENCED_PARAMETER( Param ); + UNREFERENCED_PARAMETER(Param); KVMDEBUG("kvm_ctrlaltdel", (int)(uintptr_t)Param); - typedef VOID(WINAPI *SendSas)(BOOL asUser); + typedef VOID(WINAPI * SendSas)(BOOL asUser); SendSas sas; // Perform new method (Vista & Win7) @@ -171,7 +178,10 @@ DWORD WINAPI kvm_ctrlaltdel(LPVOID Param) // We need to dynamically load this, becuase it doesn't exist on Windows Core. // However, LOAD_LIBRARY_SEARCH_SYSTEM32 does not exist on Windows 7 SP1 / Windows Server 2008 R2 without a MSFT Patch, // but this patch is no longer available from MSFT, so this fallback case will only affect insecure versions of Windows 7 SP1 / Server 2008 R2 - if (m == NULL && GetLastError() == ERROR_INVALID_PARAMETER) { m = LoadLibraryA("sas.dll"); } + if (m == NULL && GetLastError() == ERROR_INVALID_PARAMETER) + { + m = LoadLibraryA("sas.dll"); + } if (m != NULL) { sas = (SendSas)GetProcAddress(m, "SendSAS"); @@ -188,43 +198,48 @@ DWORD WINAPI kvm_ctrlaltdel(LPVOID Param) BOOL CALLBACK DisplayInfoEnumProc(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData) { int w, h, deviceid = 0; - MONITORINFOEX mi; - DWORD *selection = (DWORD*)dwData; - UNREFERENCED_PARAMETER( hdcMonitor ); - UNREFERENCED_PARAMETER( lprcMonitor ); + MONITORINFOEX mi; + DWORD *selection = (DWORD *)dwData; + UNREFERENCED_PARAMETER(hdcMonitor); + UNREFERENCED_PARAMETER(lprcMonitor); ZeroMemory(&mi, sizeof(mi)); - mi.cbSize = sizeof(mi); + mi.cbSize = sizeof(mi); // Get the display information - if (!GetMonitorInfo(hMonitor, (LPMONITORINFO)&mi)) return TRUE; - if (sscanf_s(mi.szDevice, "\\\\.\\DISPLAY%d", &deviceid) != 1) return TRUE; - if (--selection[0] > 0) { return TRUE; } - + if (!GetMonitorInfo(hMonitor, (LPMONITORINFO)&mi)) + return TRUE; + if (sscanf_s(mi.szDevice, "\\\\.\\DISPLAY%d", &deviceid) != 1) + return TRUE; + if (--selection[0] > 0) + { + return TRUE; + } + // See if anything changed w = abs(mi.rcMonitor.left - mi.rcMonitor.right); h = abs(mi.rcMonitor.top - mi.rcMonitor.bottom); - if (SCREEN_X != mi.rcMonitor.left || SCREEN_Y != mi.rcMonitor.top || SCREEN_WIDTH != w || SCREEN_HEIGHT != h || SCALING_FACTOR != SCALING_FACTOR_NEW) + if (SCREEN_X != mi.rcMonitor.left || SCREEN_Y != mi.rcMonitor.top || SCREEN_WIDTH != w || SCREEN_HEIGHT != h || SCALING_FACTOR != SCALING_FACTOR_NEW) { SCREEN_X = mi.rcMonitor.left; SCREEN_Y = mi.rcMonitor.top; SCREEN_WIDTH = w; SCREEN_HEIGHT = h; - SCREEN_SEL_PROCESS |= 1; // Force the new resolution to be sent to the client. + SCREEN_SEL_PROCESS |= 1; // Force the new resolution to be sent to the client. } if (SCREEN_SEL != SCREEN_SEL_TARGET) { SCREEN_SEL = SCREEN_SEL_TARGET; - SCREEN_SEL_PROCESS |= 2; // Force the display list to be sent to the client, includes the new display selection + SCREEN_SEL_PROCESS |= 2; // Force the display list to be sent to the client, includes the new display selection } - - return TRUE; + + return TRUE; } BOOL CALLBACK DisplayInfoEnumProc_Info(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData) { - unsigned short* buffer = (unsigned short*)dwData; + unsigned short *buffer = (unsigned short *)dwData; MONITORINFOEX mi; UNREFERENCED_PARAMETER(hdcMonitor); UNREFERENCED_PARAMETER(lprcMonitor); @@ -233,64 +248,73 @@ BOOL CALLBACK DisplayInfoEnumProc_Info(HMONITOR hMonitor, HDC hdcMonitor, LPRECT mi.cbSize = sizeof(mi); // Get the display information - if (!GetMonitorInfo(hMonitor, (LPMONITORINFO)&mi)) return TRUE; + if (!GetMonitorInfo(hMonitor, (LPMONITORINFO)&mi)) + return TRUE; int w = abs(mi.rcMonitor.left - mi.rcMonitor.right); int h = abs(mi.rcMonitor.top - mi.rcMonitor.bottom); int i = (int)(buffer[0]++); int offset = (5 * i) + 4; - if ((((i + 1) * 10) + 4) > buffer[1]) { return(FALSE); } + if ((((i + 1) * 10) + 4) > buffer[1]) + { + return (FALSE); + } - buffer[offset] = (unsigned short)htons((unsigned short)(i+1)); // ID - buffer[offset+1] = (unsigned short)htons((unsigned short)(mi.rcMonitor.left)); // X - buffer[offset+2] = (unsigned short)htons((unsigned short)(mi.rcMonitor.top)); // Y - buffer[offset+3] = (unsigned short)htons((unsigned short)(w)); // WIDTH - buffer[offset+4] = (unsigned short)htons((unsigned short)(h)); // HEIGHT - return(TRUE); + buffer[offset] = (unsigned short)htons((unsigned short)(i + 1)); // ID + buffer[offset + 1] = (unsigned short)htons((unsigned short)(mi.rcMonitor.left)); // X + buffer[offset + 2] = (unsigned short)htons((unsigned short)(mi.rcMonitor.top)); // Y + buffer[offset + 3] = (unsigned short)htons((unsigned short)(w)); // WIDTH + buffer[offset + 4] = (unsigned short)htons((unsigned short)(h)); // HEIGHT + return (TRUE); } void kvm_send_display_list(ILibKVM_WriteHandler writeHandler, void *reserved) { int i; char dwData[4096]; - ((unsigned short*)dwData)[0] = (unsigned short)0; - ((unsigned short*)dwData)[1] = (unsigned short)sizeof(dwData); - ((unsigned short*)dwData)[2] = (unsigned short)htons((unsigned short)MNG_KVM_DISPLAY_INFO); // Write the type + ((unsigned short *)dwData)[0] = (unsigned short)0; + ((unsigned short *)dwData)[1] = (unsigned short)sizeof(dwData); + ((unsigned short *)dwData)[2] = (unsigned short)htons((unsigned short)MNG_KVM_DISPLAY_INFO); // Write the type if (EnumDisplayMonitors(NULL, NULL, DisplayInfoEnumProc_Info, (LPARAM)dwData)) { - ((unsigned short*)dwData)[3] = (unsigned short)htons((((unsigned short*)dwData)[0]) * 10 + 4); // Length - writeHandler(dwData+4, (((unsigned short*)dwData)[0]) * 10 + 4, reserved); + ((unsigned short *)dwData)[3] = (unsigned short)htons((((unsigned short *)dwData)[0]) * 10 + 4); // Length + writeHandler(dwData + 4, (((unsigned short *)dwData)[0]) * 10 + 4, reserved); } // Not looked at the number of screens yet - if (SCREEN_COUNT == -1) return; + if (SCREEN_COUNT == -1) + return; char *buffer = ILibMemory_AllocateA((5 + SCREEN_COUNT) * 2); memset(buffer, 0xFF, ILibMemory_AllocateA_Size(buffer)); // Send the list of possible displays to remote if (SCREEN_COUNT == 0 || SCREEN_COUNT == 1) { // Only one display, send empty - ((unsigned short*)buffer)[0] = (unsigned short)htons((unsigned short)MNG_KVM_GET_DISPLAYS); // Write the type - ((unsigned short*)buffer)[1] = (unsigned short)htons((unsigned short)(8)); // Write the size - ((unsigned short*)buffer)[2] = (unsigned short)htons((unsigned short)(0)); // Screen Count - ((unsigned short*)buffer)[3] = (unsigned short)htons((unsigned short)(0)); // Selected Screen + ((unsigned short *)buffer)[0] = (unsigned short)htons((unsigned short)MNG_KVM_GET_DISPLAYS); // Write the type + ((unsigned short *)buffer)[1] = (unsigned short)htons((unsigned short)(8)); // Write the size + ((unsigned short *)buffer)[2] = (unsigned short)htons((unsigned short)(0)); // Screen Count + ((unsigned short *)buffer)[3] = (unsigned short)htons((unsigned short)(0)); // Selected Screen writeHandler(buffer, 8, reserved); } else { // Many displays - ((unsigned short*)buffer)[0] = (unsigned short)htons((unsigned short)MNG_KVM_GET_DISPLAYS); // Write the type - ((unsigned short*)buffer)[1] = (unsigned short)htons((unsigned short)(10 + (2 * SCREEN_COUNT))); // Write the size - ((unsigned short*)buffer)[2] = (unsigned short)htons((unsigned short)(SCREEN_COUNT + 1)); // Screen Count - ((unsigned short*)buffer)[3] = (unsigned short)htons((unsigned short)(-1)); // Possible Screen (ALL) - for (i = 0; i < SCREEN_COUNT; i++) { - ((unsigned short*)buffer)[4 + i] = (unsigned short)htons((unsigned short)(i + 1)); // Possible Screen + ((unsigned short *)buffer)[0] = (unsigned short)htons((unsigned short)MNG_KVM_GET_DISPLAYS); // Write the type + ((unsigned short *)buffer)[1] = (unsigned short)htons((unsigned short)(10 + (2 * SCREEN_COUNT))); // Write the size + ((unsigned short *)buffer)[2] = (unsigned short)htons((unsigned short)(SCREEN_COUNT + 1)); // Screen Count + ((unsigned short *)buffer)[3] = (unsigned short)htons((unsigned short)(-1)); // Possible Screen (ALL) + for (i = 0; i < SCREEN_COUNT; i++) + { + ((unsigned short *)buffer)[4 + i] = (unsigned short)htons((unsigned short)(i + 1)); // Possible Screen } - if (SCREEN_SEL == 0) { - ((unsigned short*)buffer)[4 + i] = (unsigned short)htons((unsigned short)(-1)); // Selected Screen (All) - } else { - ((unsigned short*)buffer)[4 + i] = (unsigned short)htons((unsigned short)(SCREEN_SEL)); // Selected Screen + if (SCREEN_SEL == 0) + { + ((unsigned short *)buffer)[4 + i] = (unsigned short)htons((unsigned short)(-1)); // Selected Screen (All) + } + else + { + ((unsigned short *)buffer)[4 + i] = (unsigned short)htons((unsigned short)(SCREEN_SEL)); // Selected Screen } writeHandler(buffer, (10 + (2 * SCREEN_COUNT)), reserved); @@ -309,55 +333,77 @@ void CheckDesktopSwitch(int checkres, ILibKVM_WriteHandler writeHandler, void *r // KVMDEBUG("CheckDesktopSwitch", checkres); // Check desktop switch - if ((desktop2 = GetThreadDesktop(GetCurrentThreadId())) == NULL) { KVMDEBUG("GetThreadDesktop Error", 0); } // CloseDesktop() is not needed + if ((desktop2 = GetThreadDesktop(GetCurrentThreadId())) == NULL) + { + KVMDEBUG("GetThreadDesktop Error", 0); + } // CloseDesktop() is not needed if ((desktop = OpenInputDesktop(0, TRUE, - DESKTOP_CREATEMENU | - DESKTOP_CREATEWINDOW | - DESKTOP_ENUMERATE | - DESKTOP_HOOKCONTROL | - DESKTOP_WRITEOBJECTS | - DESKTOP_READOBJECTS | - DESKTOP_SWITCHDESKTOP | - GENERIC_WRITE)) == NULL) { KVMDEBUG("OpenInputDesktop Error", 0); } + DESKTOP_CREATEMENU | + DESKTOP_CREATEWINDOW | + DESKTOP_ENUMERATE | + DESKTOP_HOOKCONTROL | + DESKTOP_WRITEOBJECTS | + DESKTOP_READOBJECTS | + DESKTOP_SWITCHDESKTOP | + GENERIC_WRITE)) == NULL) + { + KVMDEBUG("OpenInputDesktop Error", 0); + } if (SetThreadDesktop(desktop) == 0) { - if (CloseDesktop(desktop) == 0) { KVMDEBUG("CloseDesktop1 Error", 0); } + if (CloseDesktop(desktop) == 0) + { + KVMDEBUG("CloseDesktop1 Error", 0); + } desktop = desktop2; - } else { + } + else + { CloseDesktop(desktop2); } // Check desktop name switch if (GetUserObjectInformationA(desktop, UOI_NAME, name, 63, 0)) { - //ILibRemoteLogging_printf(gKVMRemoteLogging, ILibRemoteLogging_Modules_Agent_KVM, ILibRemoteLogging_Flags_VerbosityLevel_1, "KVM [SLAVE]: name = %s", name); + ILibRemoteLogging_printf(gKVMRemoteLogging, ILibRemoteLogging_Modules_Agent_KVM, ILibRemoteLogging_Flags_VerbosityLevel_1, "KVM [SLAVE]: Current desktop = %s", name); // KVMDEBUG(name, 0); if (kvm_server_currentDesktopname == 0) { // This is the first time we come here. - kvm_server_currentDesktopname = ((int*)name)[0]; + kvm_server_currentDesktopname = ((int *)name)[0]; + ILibRemoteLogging_printf(gKVMRemoteLogging, ILibRemoteLogging_Modules_Agent_KVM, ILibRemoteLogging_Flags_VerbosityLevel_1, "KVM [SLAVE]: Initial desktop captured: %s", name); } else { - // If the desktop name has changed, shutdown. - if (kvm_server_currentDesktopname != ((int*)name)[0]) + // If the desktop name has changed, switch to it instead of shutting down + if (kvm_server_currentDesktopname != ((int *)name)[0]) { - KVMDEBUG("DESKTOP NAME CHANGE DETECTED, triggering shutdown", 0); - ILibRemoteLogging_printf(gKVMRemoteLogging, ILibRemoteLogging_Modules_Agent_KVM, ILibRemoteLogging_Flags_VerbosityLevel_1, "KVM [SLAVE]: kvm_server_currentDesktop: NAME CHANGE DETECTED..."); - g_shutdown = 1; + KVMDEBUG("DESKTOP NAME CHANGE DETECTED, switching session", 0); + ILibRemoteLogging_printf(gKVMRemoteLogging, ILibRemoteLogging_Modules_Agent_KVM, ILibRemoteLogging_Flags_VerbosityLevel_1, "KVM [SLAVE]: Desktop switched to: %s (UAC/Lock screen detected)", name); + kvm_server_currentDesktopname = ((int *)name)[0]; + // Force screen refresh after desktop switch + if (checkres != 0) + { + kvm_server_SetResolution(); + } } } } else { KVMDEBUG("GetUserObjectInformation Error", 0); + ILibRemoteLogging_printf(gKVMRemoteLogging, ILibRemoteLogging_Modules_Agent_KVM, ILibRemoteLogging_Flags_VerbosityLevel_1, "KVM [SLAVE]: Failed to get desktop information"); } // See if the number of displays has changed x = GetSystemMetrics(SM_CMONITORS); - if (SCREEN_COUNT != x) { SCREEN_COUNT = x; kvm_send_display_list(writeHandler, reserved); } + if (SCREEN_COUNT != x) + { + SCREEN_COUNT = x; + kvm_send_display_list(writeHandler, reserved); + } // Check resolution change if (checkres != 0 && g_shutdown == 0) @@ -376,7 +422,9 @@ void CheckDesktopSwitch(int checkres, ILibKVM_WriteHandler writeHandler, void *r y = 0; w = GetSystemMetrics(SM_CXSCREEN); h = GetSystemMetrics(SM_CYSCREEN); - } else { + } + else + { // New style, entire virtual desktop x = VSCREEN_X; y = VSCREEN_Y; @@ -386,7 +434,7 @@ void CheckDesktopSwitch(int checkres, ILibKVM_WriteHandler writeHandler, void *r if (SCREEN_X != x || SCREEN_Y != y || SCREEN_WIDTH != w || SCREEN_HEIGHT != h || SCALING_FACTOR != SCALING_FACTOR_NEW) { - //printf("RESOLUTION CHANGED! (supposedly)\n"); + // printf("RESOLUTION CHANGED! (supposedly)\n"); SCREEN_X = x; SCREEN_Y = y; SCREEN_WIDTH = w; @@ -394,7 +442,11 @@ void CheckDesktopSwitch(int checkres, ILibKVM_WriteHandler writeHandler, void *r kvm_server_SetResolution(writeHandler, reserved); } - if (SCREEN_SEL_TARGET != SCREEN_SEL) { SCREEN_SEL = SCREEN_SEL_TARGET; kvm_send_display_list(writeHandler, reserved); } + if (SCREEN_SEL_TARGET != SCREEN_SEL) + { + SCREEN_SEL = SCREEN_SEL_TARGET; + kvm_send_display_list(writeHandler, reserved); + } } else { @@ -405,8 +457,10 @@ void CheckDesktopSwitch(int checkres, ILibKVM_WriteHandler writeHandler, void *r if (EnumDisplayMonitors(NULL, NULL, DisplayInfoEnumProc, (LPARAM)&selection)) { // Set the resolution - if (SCREEN_SEL_PROCESS & 1) kvm_server_SetResolution(writeHandler, reserved); - if (SCREEN_SEL_PROCESS & 2) kvm_send_display_list(writeHandler, reserved); + if (SCREEN_SEL_PROCESS & 1) + kvm_server_SetResolution(writeHandler, reserved); + if (SCREEN_SEL_PROCESS & 2) + kvm_send_display_list(writeHandler, reserved); } SCREEN_SEL_PROCESS = 0; } @@ -418,25 +472,27 @@ unsigned char g_blockinput = 0; // Feed network data into the KVM. Return the number of bytes consumed. // This method consumes a single command. -int kvm_server_inputdata(char* block, int blocklen, ILibKVM_WriteHandler writeHandler, void *reserved) +int kvm_server_inputdata(char *block, int blocklen, ILibKVM_WriteHandler writeHandler, void *reserved) { unsigned short type, size; // Decode the block header - if (blocklen < 4) return 0; + if (blocklen < 4) + return 0; ILibRemoteLogging_printf(gKVMRemoteLogging, ILibRemoteLogging_Modules_Agent_KVM, ILibRemoteLogging_Flags_VerbosityLevel_2, "KVM [SLAVE]: Handle Input [Len = %d]", blocklen); // KVMDEBUG("kvm_server_inputdata", blocklen); CheckDesktopSwitch(0, writeHandler, reserved); - type = ntohs(((unsigned short*)(block))[0]); - size = ntohs(((unsigned short*)(block))[1]); + type = ntohs(((unsigned short *)(block))[0]); + size = ntohs(((unsigned short *)(block))[1]); ILibRemoteLogging_printf(gKVMRemoteLogging, ILibRemoteLogging_Modules_Agent_KVM, ILibRemoteLogging_Flags_VerbosityLevel_2, "KVM [SLAVE]: Handle Input [Len = %d, type = %u, size = %u]", blocklen, type, size); - if (size > blocklen) return 0; + if (size > blocklen) + return 0; - //printf("INPUT: %d, %d\r\n", type, size); + // printf("INPUT: %d, %d\r\n", type, size); switch (type) { @@ -448,180 +504,217 @@ int kvm_server_inputdata(char* block, int blocklen, ILibKVM_WriteHandler writeHa { switch (block[4]) { - case 0: - g_blockinput = 0; - BlockInput(0); - break; - case 1: - g_blockinput = 1; - BlockInput(1); - break; - case 2: - break; - default: - return(size); - break; + case 0: + g_blockinput = 0; + BlockInput(0); + break; + case 1: + g_blockinput = 1; + BlockInput(1); + break; + case 2: + break; + default: + return (size); + break; } unsigned char buffer[5]; - ((unsigned short*)buffer)[0] = (unsigned short)htons((unsigned short)MNG_KVM_INPUT_LOCK); // Write the type - ((unsigned short*)buffer)[1] = (unsigned short)htons((unsigned short)5); // Write the size - buffer[4] = g_blockinput; // status + ((unsigned short *)buffer)[0] = (unsigned short)htons((unsigned short)MNG_KVM_INPUT_LOCK); // Write the type + ((unsigned short *)buffer)[1] = (unsigned short)htons((unsigned short)5); // Write the size + buffer[4] = g_blockinput; // status - writeHandler((char*)buffer, 5, reserved); + writeHandler((char *)buffer, 5, reserved); } - + break; case MNG_KVM_KEY: // Key - { - if (size != 6) break; - //KVM_WriteLog(writeHandler, reserved, "Key[%u] UP: %d", (unsigned char)(block[5]), block[4]); - KeyAction(block[5], block[4]); + { + if (size != 6) break; - } + // KVM_WriteLog(writeHandler, reserved, "Key[%u] UP: %d", (unsigned char)(block[5]), block[4]); + KeyAction(block[5], block[4]); + break; + } case MNG_KVM_KEY_UNICODE: // Unicode key - { - if (size != 7) break; - //KVM_WriteLog(writeHandler, reserved, "UnicodeKey[%u] UP: %d", ((((unsigned char)block[5]) << 8) + ((unsigned char)block[6])), block[4]); - KeyActionUnicode(((((unsigned char)block[5]) << 8) + ((unsigned char)block[6])), block[4]); + { + if (size != 7) break; - } + // KVM_WriteLog(writeHandler, reserved, "UnicodeKey[%u] UP: %d", ((((unsigned char)block[5]) << 8) + ((unsigned char)block[6])), block[4]); + KeyActionUnicode(((((unsigned char)block[5]) << 8) + ((unsigned char)block[6])), block[4]); + break; + } case MNG_KVM_MOUSE: // Mouse - { - double x, y; - short w = 0; - KVM_MouseCursors curcursor = KVM_MouseCursor_NOCHANGE; + { + double x, y; + short w = 0; + KVM_MouseCursors curcursor = KVM_MouseCursor_NOCHANGE; - if (size == 10 || size == 12) - { - gRemoteMouseMoved = 1; + if (size == 10 || size == 12) + { + gRemoteMouseMoved = 1; - // Get positions and scale correctly - x = (double)ntohs(((short*)(block))[3]) * 1024 / SCALING_FACTOR; - y = (double)ntohs(((short*)(block))[4]) * 1024 / SCALING_FACTOR; + // Get positions and scale correctly + x = (double)ntohs(((short *)(block))[3]) * 1024 / SCALING_FACTOR; + y = (double)ntohs(((short *)(block))[4]) * 1024 / SCALING_FACTOR; - // Add relative display position - x += fabs((double)(SCREEN_X - VSCREEN_X)); - y += fabs((double)(SCREEN_Y - VSCREEN_Y)); + // Add relative display position + x += fabs((double)(SCREEN_X - VSCREEN_X)); + y += fabs((double)(SCREEN_Y - VSCREEN_Y)); - // Scale back to the virtual screen - x = (x * ((double)SCREEN_WIDTH / (double)VSCREEN_WIDTH)) * (double)65535; - y = (y * ((double)SCREEN_HEIGHT / (double)VSCREEN_HEIGHT)) * (double)65535; + // Scale back to the virtual screen + x = (x * ((double)SCREEN_WIDTH / (double)VSCREEN_WIDTH)) * (double)65535; + y = (y * ((double)SCREEN_HEIGHT / (double)VSCREEN_HEIGHT)) * (double)65535; - // Perform the mouse movement - if (size == 12) w = ((short)ntohs(((short*)(block))[5])); - MouseAction((((double)x / (double)SCREEN_WIDTH)), (((double)y / (double)SCREEN_HEIGHT)), (int)(unsigned char)(block[5]), w); - } - break; + // Perform the mouse movement + if (size == 12) + w = ((short)ntohs(((short *)(block))[5])); + MouseAction((((double)x / (double)SCREEN_WIDTH)), (((double)y / (double)SCREEN_HEIGHT)), (int)(unsigned char)(block[5]), w); } + break; + } case MNG_KVM_COMPRESSION: // Compression + { + if (size >= 10) { - if (size >= 10) { int fr = ((int)ntohs(((unsigned short*)(block + 8))[0])); if (fr >= 20 && fr <= 5000) FRAME_RATE_TIMER = fr; } - if (size >= 8) { int ns = ((int)ntohs(((unsigned short*)(block + 6))[0])); if (ns >= 64 && ns <= 4096) SCALING_FACTOR_NEW = ns; } - if (size >= 6) { set_tile_compression((int)block[4], (int)block[5]); } - COMPRESSION_RATIO = 100; - break; + int fr = ((int)ntohs(((unsigned short *)(block + 8))[0])); + if (fr >= 20 && fr <= 5000) + FRAME_RATE_TIMER = fr; } - case MNG_KVM_REFRESH: // Refresh + if (size >= 8) { - int row, col; - char buffer[8]; - if (size != 4) break; + int ns = ((int)ntohs(((unsigned short *)(block + 6))[0])); + if (ns >= 64 && ns <= 4096) + SCALING_FACTOR_NEW = ns; + } + if (size >= 6) + { + set_tile_compression((int)block[4], (int)block[5]); + } + COMPRESSION_RATIO = 100; + break; + } + case MNG_KVM_REFRESH: // Refresh + { + int row, col; + char buffer[8]; + if (size != 4) + break; - ((unsigned short*)buffer)[0] = (unsigned short)htons((unsigned short)MNG_KVM_SCREEN); // Write the type - ((unsigned short*)buffer)[1] = (unsigned short)htons((unsigned short)8); // Write the size - ((unsigned short*)buffer)[2] = (unsigned short)htons((unsigned short)SCALED_WIDTH); // X position - ((unsigned short*)buffer)[3] = (unsigned short)htons((unsigned short)SCALED_HEIGHT); // Y position + ((unsigned short *)buffer)[0] = (unsigned short)htons((unsigned short)MNG_KVM_SCREEN); // Write the type + ((unsigned short *)buffer)[1] = (unsigned short)htons((unsigned short)8); // Write the size + ((unsigned short *)buffer)[2] = (unsigned short)htons((unsigned short)SCALED_WIDTH); // X position + ((unsigned short *)buffer)[3] = (unsigned short)htons((unsigned short)SCALED_HEIGHT); // Y position - writeHandler((char*)buffer, 8, reserved); + writeHandler((char *)buffer, 8, reserved); - // Send the list of available displays - kvm_send_display_list(writeHandler, reserved); + // Send the list of available displays + kvm_send_display_list(writeHandler, reserved); - // Reset all tile information - if (tileInfo == NULL) { - if ((tileInfo = (struct tileInfo_t **) malloc(TILE_HEIGHT_COUNT * sizeof(struct tileInfo_t *))) == NULL) ILIBCRITICALEXIT(254); - for (row = 0; row < TILE_HEIGHT_COUNT; row++) { if ((tileInfo[row] = (struct tileInfo_t *)malloc(TILE_WIDTH_COUNT * sizeof(struct tileInfo_t))) == NULL) ILIBCRITICALEXIT(254); } + // Reset all tile information + if (tileInfo == NULL) + { + if ((tileInfo = (struct tileInfo_t **)malloc(TILE_HEIGHT_COUNT * sizeof(struct tileInfo_t *))) == NULL) + ILIBCRITICALEXIT(254); + for (row = 0; row < TILE_HEIGHT_COUNT; row++) + { + if ((tileInfo[row] = (struct tileInfo_t *)malloc(TILE_WIDTH_COUNT * sizeof(struct tileInfo_t))) == NULL) + ILIBCRITICALEXIT(254); } - for (row = 0; row < TILE_HEIGHT_COUNT; row++) { for (col = 0; col < TILE_WIDTH_COUNT; col++) { tileInfo[row][col].crc = 0xFF; tileInfo[row][col].flags = 0; } } - - break; } - case MNG_KVM_PAUSE: // Pause + for (row = 0; row < TILE_HEIGHT_COUNT; row++) { - if (size != 5) break; - g_remotepause = block[4]; - break; + for (col = 0; col < TILE_WIDTH_COUNT; col++) + { + tileInfo[row][col].crc = 0xFF; + tileInfo[row][col].flags = 0; + } } - case MNG_KVM_FRAME_RATE_TIMER: - { - int fr = ((int)ntohs(((unsigned short*)(block))[2])); - if (fr >= 20 && fr <= 5000) FRAME_RATE_TIMER = fr; + + break; + } + case MNG_KVM_PAUSE: // Pause + { + if (size != 5) break; - } + g_remotepause = block[4]; + break; + } + case MNG_KVM_FRAME_RATE_TIMER: + { + int fr = ((int)ntohs(((unsigned short *)(block))[2])); + if (fr >= 20 && fr <= 5000) + FRAME_RATE_TIMER = fr; + break; + } case MNG_KVM_INIT_TOUCH: - { - // Attempt to initialized touch support - char buffer[6]; - unsigned short r = (unsigned short)TouchInit(); - ((unsigned short*)buffer)[0] = (unsigned short)htons((unsigned short)MNG_KVM_INIT_TOUCH); // Write the type - ((unsigned short*)buffer)[1] = (unsigned short)htons((unsigned short)6); // Write the size - ((unsigned short*)buffer)[2] = (unsigned short)htons(r); // Write the return code - - writeHandler((char*)buffer, 6, reserved); - break; - } + { + // Attempt to initialized touch support + char buffer[6]; + unsigned short r = (unsigned short)TouchInit(); + ((unsigned short *)buffer)[0] = (unsigned short)htons((unsigned short)MNG_KVM_INIT_TOUCH); // Write the type + ((unsigned short *)buffer)[1] = (unsigned short)htons((unsigned short)6); // Write the size + ((unsigned short *)buffer)[2] = (unsigned short)htons(r); // Write the return code + + writeHandler((char *)buffer, 6, reserved); + break; + } case MNG_KVM_TOUCH: - { - int r = 0; + { + int r = 0; - if (block[4] == 1) // Version 1 touch structure (Very simple) - { - unsigned int flags = (unsigned int)ntohl(((unsigned int*)(block + 6))[0]); + if (block[4] == 1) // Version 1 touch structure (Very simple) + { + unsigned int flags = (unsigned int)ntohl(((unsigned int *)(block + 6))[0]); - // Get positions and scale correctly - unsigned short x = (unsigned short)(ntohs(((unsigned short*)(block + 10))[0])) * 1024 / (unsigned short)SCALING_FACTOR; - unsigned short y = (unsigned short)(ntohs(((unsigned short*)(block + 12))[0])) * 1024 / (unsigned short)SCALING_FACTOR; + // Get positions and scale correctly + unsigned short x = (unsigned short)(ntohs(((unsigned short *)(block + 10))[0])) * 1024 / (unsigned short)SCALING_FACTOR; + unsigned short y = (unsigned short)(ntohs(((unsigned short *)(block + 12))[0])) * 1024 / (unsigned short)SCALING_FACTOR; - // Add relative display position - x += (unsigned short)fabs((double)(SCREEN_X - VSCREEN_X)); - y += (unsigned short)fabs((double)(SCREEN_Y - VSCREEN_Y)); + // Add relative display position + x += (unsigned short)fabs((double)(SCREEN_X - VSCREEN_X)); + y += (unsigned short)fabs((double)(SCREEN_Y - VSCREEN_Y)); - // Scale back to the virtual screen - x = (unsigned short)(((double)x * ((double)SCREEN_WIDTH / (double)VSCREEN_WIDTH)) * (double)65535); - y = (unsigned short)(((double)y * ((double)SCREEN_HEIGHT / (double)VSCREEN_HEIGHT)) * (double)65535); + // Scale back to the virtual screen + x = (unsigned short)(((double)x * ((double)SCREEN_WIDTH / (double)VSCREEN_WIDTH)) * (double)65535); + y = (unsigned short)(((double)y * ((double)SCREEN_HEIGHT / (double)VSCREEN_HEIGHT)) * (double)65535); - r = TouchAction1(block[5], flags, x, y); - } - else if (block[4] == 2) // Version 2 touch structure array - { - r = TouchAction2(block + 5, size - 5, SCALING_FACTOR); - } + r = TouchAction1(block[5], flags, x, y); + } + else if (block[4] == 2) // Version 2 touch structure array + { + r = TouchAction2(block + 5, size - 5, SCALING_FACTOR); + } - if (r == 1) { - // Reset touch - char buffer[4]; - ((unsigned short*)buffer)[0] = (unsigned short)htons((unsigned short)MNG_KVM_TOUCH); // Write the type - ((unsigned short*)buffer)[1] = (unsigned short)htons((unsigned short)4); // Write the size + if (r == 1) + { + // Reset touch + char buffer[4]; + ((unsigned short *)buffer)[0] = (unsigned short)htons((unsigned short)MNG_KVM_TOUCH); // Write the type + ((unsigned short *)buffer)[1] = (unsigned short)htons((unsigned short)4); // Write the size - writeHandler((char*)buffer, 4, reserved); - } - break; + writeHandler((char *)buffer, 4, reserved); } + break; + } case MNG_KVM_GET_DISPLAYS: - { - kvm_send_display_list(writeHandler, reserved); - break; - } + { + kvm_send_display_list(writeHandler, reserved); + break; + } case MNG_KVM_SET_DISPLAY: - { - // Set the display - int x = 0; - if (size < 6) break; - x = (unsigned short)ntohs(((unsigned short*)(block + 4))[0]); - if (x == 65535) SCREEN_SEL_TARGET = 0; else SCREEN_SEL_TARGET = x; + { + // Set the display + int x = 0; + if (size < 6) break; - } + x = (unsigned short)ntohs(((unsigned short *)(block + 4))[0]); + if (x == 65535) + SCREEN_SEL_TARGET = 0; + else + SCREEN_SEL_TARGET = x; + break; + } } return size; } @@ -632,31 +725,33 @@ typedef struct kvm_data_handler void *reserved; int len; char buffer[]; -}kvm_data_handler; - - +} kvm_data_handler; // Feed network data into the KVM. Return the number of bytes consumed. // This method consumes as many input commands as it can. -int kvm_relay_feeddata(char* buf, int len, ILibKVM_WriteHandler writeHandler, void *reserved) +int kvm_relay_feeddata(char *buf, int len, ILibKVM_WriteHandler writeHandler, void *reserved) { if (gChildProcess != NULL) { - if (len >= 2 && ntohs(((unsigned short*)buf)[0]) == MNG_CTRLALTDEL) + if (len >= 2 && ntohs(((unsigned short *)buf)[0]) == MNG_CTRLALTDEL) { HANDLE ht = CreateThread(NULL, 0, kvm_ctrlaltdel, 0, 0, 0); - if (ht != NULL) CloseHandle(ht); + if (ht != NULL) + CloseHandle(ht); } ILibProcessPipe_Process_WriteStdIn(gChildProcess, buf, len, ILibTransport_MemoryOwnership_USER); - ILibRemoteLogging_printf(ILibChainGetLogger(gILibChain), ILibRemoteLogging_Modules_Microstack_Generic, ILibRemoteLogging_Flags_VerbosityLevel_2, "KVM [Master]: Write Input [Type = %u]", ntohs(((unsigned short*)buf)[0])); + ILibRemoteLogging_printf(ILibChainGetLogger(gILibChain), ILibRemoteLogging_Modules_Microstack_Generic, ILibRemoteLogging_Flags_VerbosityLevel_2, "KVM [Master]: Write Input [Type = %u]", ntohs(((unsigned short *)buf)[0])); return len; } else { int len2 = 0; int ptr = 0; - //while ((len2 = kvm_server_inputdata(buf + ptr, len - ptr, kvm_relay_feeddata_ex, (void*[]) {writeHandler, reserved})) != 0) { ptr += len2; } - while ((len2 = kvm_server_inputdata(buf + ptr, len - ptr, writeHandler, reserved)) != 0) { ptr += len2; } + // while ((len2 = kvm_server_inputdata(buf + ptr, len - ptr, kvm_relay_feeddata_ex, (void*[]) {writeHandler, reserved})) != 0) { ptr += len2; } + while ((len2 = kvm_server_inputdata(buf + ptr, len - ptr, writeHandler, reserved)) != 0) + { + ptr += len2; + } return ptr; } } @@ -692,7 +787,15 @@ void kvm_server_SetResolution(ILibKVM_WriteHandler writeHandler, void *reserved) KVMDEBUG("kvm_server_SetResolution", 0); // Free the tileInfo before you manipulate the TILE_HEIGHT_COUNT - if (tileInfo != NULL) { for (row = 0; row < TILE_HEIGHT_COUNT; row++) { free(tileInfo[row]); } free(tileInfo); tileInfo = NULL; } + if (tileInfo != NULL) + { + for (row = 0; row < TILE_HEIGHT_COUNT; row++) + { + free(tileInfo[row]); + } + free(tileInfo); + tileInfo = NULL; + } // Setup scaling SCALING_FACTOR = SCALING_FACTOR_NEW; @@ -702,21 +805,33 @@ void kvm_server_SetResolution(ILibKVM_WriteHandler writeHandler, void *reserved) // Compute the tile count TILE_WIDTH_COUNT = SCALED_WIDTH / TILE_WIDTH; TILE_HEIGHT_COUNT = SCALED_HEIGHT / TILE_HEIGHT; - if (SCALED_WIDTH % TILE_WIDTH) TILE_WIDTH_COUNT++; - if (SCALED_HEIGHT % TILE_HEIGHT) TILE_HEIGHT_COUNT++; + if (SCALED_WIDTH % TILE_WIDTH) + TILE_WIDTH_COUNT++; + if (SCALED_HEIGHT % TILE_HEIGHT) + TILE_HEIGHT_COUNT++; - ((unsigned short*)buffer)[0] = (unsigned short)htons((unsigned short)MNG_KVM_SCREEN); // Write the type - ((unsigned short*)buffer)[1] = (unsigned short)htons((unsigned short)8); // Write the size - ((unsigned short*)buffer)[2] = (unsigned short)htons((unsigned short)SCALED_WIDTH); // X position - ((unsigned short*)buffer)[3] = (unsigned short)htons((unsigned short)SCALED_HEIGHT); // Y position + ((unsigned short *)buffer)[0] = (unsigned short)htons((unsigned short)MNG_KVM_SCREEN); // Write the type + ((unsigned short *)buffer)[1] = (unsigned short)htons((unsigned short)8); // Write the size + ((unsigned short *)buffer)[2] = (unsigned short)htons((unsigned short)SCALED_WIDTH); // X position + ((unsigned short *)buffer)[3] = (unsigned short)htons((unsigned short)SCALED_HEIGHT); // Y position - writeHandler((char*)buffer, 8, reserved); + writeHandler((char *)buffer, 8, reserved); - if ((tileInfo = (struct tileInfo_t **)malloc(TILE_HEIGHT_COUNT * sizeof(struct tileInfo_t *))) == NULL) ILIBCRITICALEXIT(254); - for (row = 0; row < TILE_HEIGHT_COUNT; row++) { - if ((tileInfo[row] = (struct tileInfo_t *)malloc(TILE_WIDTH_COUNT * sizeof(struct tileInfo_t))) == NULL) ILIBCRITICALEXIT(254); + if ((tileInfo = (struct tileInfo_t **)malloc(TILE_HEIGHT_COUNT * sizeof(struct tileInfo_t *))) == NULL) + ILIBCRITICALEXIT(254); + for (row = 0; row < TILE_HEIGHT_COUNT; row++) + { + if ((tileInfo[row] = (struct tileInfo_t *)malloc(TILE_WIDTH_COUNT * sizeof(struct tileInfo_t))) == NULL) + ILIBCRITICALEXIT(254); + } + for (row = 0; row < TILE_HEIGHT_COUNT; row++) + { + for (col = 0; col < TILE_WIDTH_COUNT; col++) + { + tileInfo[row][col].crc = 0xFF; + tileInfo[row][col].flags = 0; + } } - for (row = 0; row < TILE_HEIGHT_COUNT; row++) { for (col = 0; col < TILE_WIDTH_COUNT; col++) { tileInfo[row][col].crc = 0xFF; tileInfo[row][col].flags = 0; } } } #define BUFSIZE 65535 @@ -729,26 +844,34 @@ DWORD WINAPI kvm_mainloopinput_ex(LPVOID Param) char pchRequest2[30000]; BOOL fSuccess = FALSE; DWORD cbBytesRead = 0; - ILibKVM_WriteHandler writeHandler = (ILibKVM_WriteHandler)((void**)Param)[0]; - void *reserved = ((void**)Param)[1]; + ILibKVM_WriteHandler writeHandler = (ILibKVM_WriteHandler)((void **)Param)[0]; + void *reserved = ((void **)Param)[1]; KVMDEBUG("kvm_mainloopinput / start", (int)GetCurrentThreadId()); ILibRemoteLogging_printf(gKVMRemoteLogging, ILibRemoteLogging_Modules_Agent_KVM, ILibRemoteLogging_Flags_VerbosityLevel_1, "KVM [SLAVE]: (mainloopinput) Starting..."); - while (!g_shutdown) { fSuccess = ReadFile(hStdIn, pchRequest2 + len, 30000 - len, &cbBytesRead, NULL); - if (!fSuccess || cbBytesRead == 0 || g_shutdown) - { + if (!fSuccess || cbBytesRead == 0 || g_shutdown) + { ILibRemoteLogging_printf(gKVMRemoteLogging, ILibRemoteLogging_Modules_Agent_KVM, ILibRemoteLogging_Flags_VerbosityLevel_1, "KVM [SLAVE]: fSuccess/%d cbBytesRead/%d g_shutdown/%d", fSuccess, cbBytesRead, g_shutdown); - KVMDEBUG("ReadFile() failed", 0); /*ILIBMESSAGE("KVMBREAK-K1\r\n");*/ g_shutdown = 1; break; + KVMDEBUG("ReadFile() failed", 0); /*ILIBMESSAGE("KVMBREAK-K1\r\n");*/ + g_shutdown = 1; + break; } len += cbBytesRead; ptr2 = 0; - while ((ptr2 = kvm_server_inputdata((char*)pchRequest2 + ptr, len - ptr, writeHandler, reserved)) != 0) { ptr += ptr2; } - if (ptr == len) { len = 0; ptr = 0; } + while ((ptr2 = kvm_server_inputdata((char *)pchRequest2 + ptr, len - ptr, writeHandler, reserved)) != 0) + { + ptr += ptr2; + } + if (ptr == len) + { + len = 0; + ptr = 0; + } // TODO: else move the reminder. } ILibRemoteLogging_printf(gKVMRemoteLogging, ILibRemoteLogging_Modules_Agent_KVM, ILibRemoteLogging_Flags_VerbosityLevel_1, "KVM [SLAVE]: (mainloopinput) Exiting..."); @@ -763,7 +886,7 @@ DWORD WINAPI kvm_mainloopinput_ex(LPVOID Param) DWORD WINAPI kvm_mainloopinput(LPVOID Param) { DWORD ret = 0; - if (((int*)&(((void**)Param)[3]))[0] == 1) + if (((int *)&(((void **)Param)[3]))[0] == 1) { ILib_DumpEnabledContext winException; __try @@ -779,27 +902,26 @@ DWORD WINAPI kvm_mainloopinput(LPVOID Param) { ret = kvm_mainloopinput_ex(Param); } - return(ret); + return (ret); } #endif - // This is the main KVM pooling loop. It will look at the display and see if any changes occur. [Runs as daemon if Windows Service] DWORD WINAPI kvm_server_mainloop_ex(LPVOID parm) { - //long cur_timestamp = 0; - //long prev_timestamp = 0; - //long time_diff = 50; + // long cur_timestamp = 0; + // long prev_timestamp = 0; + // long time_diff = 50; long long tilesize; int width, height = 0; void *buf, *desktop; long long desktopsize; BITMAPINFO bmpInfo; int row, col; - ILibKVM_WriteHandler writeHandler = (ILibKVM_WriteHandler)((void**)parm)[0]; - void *reserved = ((void**)parm)[1]; + ILibKVM_WriteHandler writeHandler = (ILibKVM_WriteHandler)((void **)parm)[0]; + void *reserved = ((void **)parm)[1]; char *tmoBuffer; - long mouseMove[3] = { 0,0,0 }; + long mouseMove[3] = {0, 0, 0}; int sentHideCursor = 0; gPendingPackets = ILibQueue_Create(); @@ -815,13 +937,18 @@ DWORD WINAPI kvm_server_mainloop_ex(LPVOID parm) #endif // This basic lock will prevent 2 thread from running at the same time. Gives time for the first one to fully exit. - while (ThreadRunning != 0 && height < 200) { height++; Sleep(50); } - if (height >= 200 && ThreadRunning != 0) return 0; + while (ThreadRunning != 0 && height < 200) + { + height++; + Sleep(50); + } + if (height >= 200 && ThreadRunning != 0) + return 0; ThreadRunning = 1; g_shutdown = 0; g_pause = 0; - g_remotepause = ((int*)&(((void**)parm)[2]))[0]; + g_remotepause = ((int *)&(((void **)parm)[2]))[0]; KVMDEBUG("kvm_server_mainloop / start1", (int)GetCurrentThreadId()); @@ -843,7 +970,8 @@ DWORD WINAPI kvm_server_mainloop_ex(LPVOID parm) ILibRemoteLogging_printf(gKVMRemoteLogging, ILibRemoteLogging_Modules_Agent_KVM, ILibRemoteLogging_Flags_VerbosityLevel_1, "KVM [SLAVE]: initialize_gdiplus() failed"); } #endif - KVMDEBUG("kvm_server_mainloop / initialize_gdiplus failed", (int)GetCurrentThreadId()); return 0; + KVMDEBUG("kvm_server_mainloop / initialize_gdiplus failed", (int)GetCurrentThreadId()); + return 0; } #ifdef _WINSERVICE if (!kvmConsoleMode) @@ -853,7 +981,6 @@ DWORD WINAPI kvm_server_mainloop_ex(LPVOID parm) #endif kvm_server_SetResolution(writeHandler, reserved); - #ifdef _WINSERVICE if (!kvmConsoleMode) { @@ -864,8 +991,10 @@ DWORD WINAPI kvm_server_mainloop_ex(LPVOID parm) #endif // Set all CRCs to 0xFF - for (row = 0; row < TILE_HEIGHT_COUNT; row++) { - for (col = 0; col < TILE_WIDTH_COUNT; col++) { + for (row = 0; row < TILE_HEIGHT_COUNT; row++) + { + for (col = 0; col < TILE_WIDTH_COUNT; col++) + { tileInfo[row][col].crc = 0xFF; } } @@ -882,9 +1011,9 @@ DWORD WINAPI kvm_server_mainloop_ex(LPVOID parm) KVMDEBUG("kvm_server_mainloop / loop1", (int)GetCurrentThreadId()); // Reset all the flags to TILE_TODO - for (row = 0; row < TILE_HEIGHT_COUNT; row++) + for (row = 0; row < TILE_HEIGHT_COUNT; row++) { - for (col = 0; col < TILE_WIDTH_COUNT; col++) + for (col = 0; col < TILE_WIDTH_COUNT; col++) { tileInfo[row][col].flags = (char)TILE_TODO; #ifdef KVM_ALL_TILES @@ -893,8 +1022,8 @@ DWORD WINAPI kvm_server_mainloop_ex(LPVOID parm) } } CheckDesktopSwitch(1, writeHandler, reserved); - if (g_shutdown) break; - + if (g_shutdown) + break; // Enter Alertable State, so we can dispatch any packets if necessary. // We are doing it here, in case we need to merge any data with the bitmaps @@ -902,28 +1031,28 @@ DWORD WINAPI kvm_server_mainloop_ex(LPVOID parm) mouseMove[0] = 0; while ((tmoBuffer = ILibQueue_DeQueue(gPendingPackets)) != NULL) { - if (ntohs(((unsigned short*)tmoBuffer)[0]) == MNG_KVM_MOUSE_MOVE) + if (ntohs(((unsigned short *)tmoBuffer)[0]) == MNG_KVM_MOUSE_MOVE) { if (SCREEN_SEL_TARGET == 0) { mouseMove[0] = 1; - mouseMove[1] = ((long*)tmoBuffer)[1] - VSCREEN_X; - mouseMove[2] = ((long*)tmoBuffer)[2] - VSCREEN_Y; + mouseMove[1] = ((long *)tmoBuffer)[1] - VSCREEN_X; + mouseMove[2] = ((long *)tmoBuffer)[2] - VSCREEN_Y; } else { - if (((long*)tmoBuffer)[1] >= SCREEN_X && ((long*)tmoBuffer)[1] <= (SCREEN_X + SCREEN_WIDTH) && - ((long*)tmoBuffer)[2] >= SCREEN_Y && ((long*)tmoBuffer)[2] <= (SCREEN_Y + SCREEN_HEIGHT)) + if (((long *)tmoBuffer)[1] >= SCREEN_X && ((long *)tmoBuffer)[1] <= (SCREEN_X + SCREEN_WIDTH) && + ((long *)tmoBuffer)[2] >= SCREEN_Y && ((long *)tmoBuffer)[2] <= (SCREEN_Y + SCREEN_HEIGHT)) { mouseMove[0] = 1; - mouseMove[1] = ((long*)tmoBuffer)[1] - SCREEN_X; - mouseMove[2] = ((long*)tmoBuffer)[2] - SCREEN_Y; + mouseMove[1] = ((long *)tmoBuffer)[1] - SCREEN_X; + mouseMove[2] = ((long *)tmoBuffer)[2] - SCREEN_Y; } } } else { - if (ntohs(((unsigned short*)tmoBuffer)[0]) != MNG_KVM_MOUSE_CURSOR || sentHideCursor==0) + if (ntohs(((unsigned short *)tmoBuffer)[0]) != MNG_KVM_MOUSE_CURSOR || sentHideCursor == 0) { writeHandler(tmoBuffer, (int)ILibMemory_Size(tmoBuffer), reserved); } @@ -933,7 +1062,7 @@ DWORD WINAPI kvm_server_mainloop_ex(LPVOID parm) if (mouseMove[0] == 0 && (gRemoteMouseRenderDefault != 0 || gRemoteMouseMoved == 0)) { mouseMove[0] = 1; - CURSORINFO info = { 0 }; + CURSORINFO info = {0}; info.cbSize = sizeof(info); GetCursorInfo(&info); @@ -954,8 +1083,8 @@ DWORD WINAPI kvm_server_mainloop_ex(LPVOID parm) { sentHideCursor = 1; char tmpBuffer[5]; - ((unsigned short*)tmpBuffer)[0] = (unsigned short)htons((unsigned short)MNG_KVM_MOUSE_CURSOR); // Write the type - ((unsigned short*)tmpBuffer)[1] = (unsigned short)htons((unsigned short)5); // Write the size + ((unsigned short *)tmpBuffer)[0] = (unsigned short)htons((unsigned short)MNG_KVM_MOUSE_CURSOR); // Write the type + ((unsigned short *)tmpBuffer)[1] = (unsigned short)htons((unsigned short)5); // Write the size tmpBuffer[4] = (char)KVM_MouseCursor_NONE; // Cursor Type writeHandler(tmpBuffer, 5, reserved); } @@ -966,8 +1095,8 @@ DWORD WINAPI kvm_server_mainloop_ex(LPVOID parm) { sentHideCursor = 0; char tmpBuffer[5]; - ((unsigned short*)tmpBuffer)[0] = (unsigned short)htons((unsigned short)MNG_KVM_MOUSE_CURSOR); // Write the type - ((unsigned short*)tmpBuffer)[1] = (unsigned short)htons((unsigned short)5); // Write the size + ((unsigned short *)tmpBuffer)[0] = (unsigned short)htons((unsigned short)MNG_KVM_MOUSE_CURSOR); // Write the type + ((unsigned short *)tmpBuffer)[1] = (unsigned short)htons((unsigned short)5); // Write the size tmpBuffer[4] = (char)gCurrentCursor; // Cursor Type writeHandler(tmpBuffer, 5, reserved); } @@ -985,20 +1114,33 @@ DWORD WINAPI kvm_server_mainloop_ex(LPVOID parm) KVMDEBUG("get_desktop_buffer() failed, shutting down", (int)GetCurrentThreadId()); g_shutdown = 1; } - else + else { bmpInfo = get_bmp_info(TILE_WIDTH, TILE_HEIGHT); - for (row = 0; row < TILE_HEIGHT_COUNT; row++) { - for (col = 0; col < TILE_WIDTH_COUNT; col++) { + for (row = 0; row < TILE_HEIGHT_COUNT; row++) + { + for (col = 0; col < TILE_WIDTH_COUNT; col++) + { height = TILE_HEIGHT * row; width = TILE_WIDTH * col; - while (!g_shutdown && (g_pause)) { Sleep(50); /*printf(".");*/ } // If the socket is in pause state, wait here. //ToDo: YLIAN!!!! + while (!g_shutdown && (g_pause)) + { + Sleep(50); /*printf(".");*/ + } // If the socket is in pause state, wait here. //ToDo: YLIAN!!!! + + if (g_shutdown || SCALING_FACTOR != SCALING_FACTOR_NEW) + { + height = SCALED_HEIGHT; + width = SCALED_WIDTH; + break; + } - if (g_shutdown || SCALING_FACTOR != SCALING_FACTOR_NEW) { height = SCALED_HEIGHT; width = SCALED_WIDTH; break; } - // Skip the tile if it has already been sent or if the CRC is same as before - if (tileInfo[row][col].flags == (char)TILE_SENT || tileInfo[row][col].flags == (char)TILE_DONT_SEND) { continue; } + if (tileInfo[row][col].flags == (char)TILE_SENT || tileInfo[row][col].flags == (char)TILE_DONT_SEND) + { + continue; + } if (get_tile_at(width, height, &buf, &tilesize, desktop, row, col) == 1) { @@ -1008,28 +1150,29 @@ DWORD WINAPI kvm_server_mainloop_ex(LPVOID parm) if (buf && !g_shutdown) { KVMDEBUG2("Writing JPEG: %llu bytes", tilesize); - switch (writeHandler((char*)buf, (int)tilesize, reserved)) + switch (writeHandler((char *)buf, (int)tilesize, reserved)) { - case ILibTransport_DoneState_INCOMPLETE: - g_pause = 1; - ILibRemoteLogging_printf(ILibChainGetLogger(gILibChain), ILibRemoteLogging_Modules_Agent_KVM, ILibRemoteLogging_Flags_VerbosityLevel_2, "Agent KVM: KVM PAUSE"); - KVMDEBUG2("JPEG WRITE resulted in PAUSE"); - break; - case ILibTransport_DoneState_ERROR: - g_shutdown = 1; - height = SCALED_HEIGHT; - width = SCALED_WIDTH; - KVMDEBUG2("JPEG WRITE resulted in ERROR"); - break; + case ILibTransport_DoneState_INCOMPLETE: + g_pause = 1; + ILibRemoteLogging_printf(ILibChainGetLogger(gILibChain), ILibRemoteLogging_Modules_Agent_KVM, ILibRemoteLogging_Flags_VerbosityLevel_2, "Agent KVM: KVM PAUSE"); + KVMDEBUG2("JPEG WRITE resulted in PAUSE"); + break; + case ILibTransport_DoneState_ERROR: + g_shutdown = 1; + height = SCALED_HEIGHT; + width = SCALED_WIDTH; + KVMDEBUG2("JPEG WRITE resulted in ERROR"); + break; } free(buf); } } } - + KVMDEBUG("kvm_server_mainloop / loop2", (int)GetCurrentThreadId()); - if (desktop) free(desktop); + if (desktop) + free(desktop); desktop = NULL; desktopsize = 0; } @@ -1038,14 +1181,29 @@ DWORD WINAPI kvm_server_mainloop_ex(LPVOID parm) // We can't go full speed here, we need to slow this down. height = FRAME_RATE_TIMER; - while (!g_shutdown && height > 0) { if (height > 50) { height -= 50; Sleep(50); } else { Sleep(height); height = 0; } SleepEx(0, TRUE); } + while (!g_shutdown && height > 0) + { + if (height > 50) + { + height -= 50; + Sleep(50); + } + else + { + Sleep(height); + height = 0; + } + SleepEx(0, TRUE); + } } KVMDEBUG("kvm_server_mainloop / end3", (int)GetCurrentThreadId()); KVMDEBUG("kvm_server_mainloop / end2", (int)GetCurrentThreadId()); - if (tileInfo != NULL) { - for (row = 0; row < TILE_HEIGHT_COUNT; row++) free(tileInfo[row]); + if (tileInfo != NULL) + { + for (row = 0; row < TILE_HEIGHT_COUNT; row++) + free(tileInfo[row]); free(tileInfo); tileInfo = NULL; } @@ -1062,7 +1220,6 @@ DWORD WINAPI kvm_server_mainloop_ex(LPVOID parm) } ILibQueue_Destroy(gPendingPackets); - ILibRemoteLogging_printf(gKVMRemoteLogging, ILibRemoteLogging_Modules_Agent_KVM, ILibRemoteLogging_Flags_VerbosityLevel_1, "KVM [SLAVE]: Process Exiting..."); ThreadRunning = 0; @@ -1073,7 +1230,7 @@ DWORD WINAPI kvm_server_mainloop_ex(LPVOID parm) DWORD WINAPI kvm_server_mainloop(LPVOID parm) { DWORD ret = 0; - if (((int*)&(((void**)parm)[3]))[0] == 1) + if (((int *)&(((void **)parm)[3]))[0] == 1) { // Enable Core Dump in KVM Child ILib_DumpEnabledContext winException; @@ -1081,9 +1238,9 @@ DWORD WINAPI kvm_server_mainloop(LPVOID parm) DWORD strLen; if ((strLen = GetModuleFileNameW(NULL, str, _MAX_PATH)) > 5) { - str[strLen - 4] = 0; // We're going to convert .exe to _kvm.dmp + str[strLen - 4] = 0; // We're going to convert .exe to _kvm.dmp g_ILibCrashDump_path = ILibMemory_Allocate((strLen * 2) + 10, 0, NULL, NULL); // Add enough space to add '.dmp' to the end of the path - swprintf_s((wchar_t*)g_ILibCrashDump_path, strLen + 5, L"%s_kvm.dmp", str); + swprintf_s((wchar_t *)g_ILibCrashDump_path, strLen + 5, L"%s_kvm.dmp", str); ILibCriticalLogFilename = "KVMSlave.log"; } @@ -1101,16 +1258,16 @@ DWORD WINAPI kvm_server_mainloop(LPVOID parm) // Core Dump not enabled in KVM Child ret = kvm_server_mainloop_ex(parm); } - return(ret); + return (ret); } #ifdef _WINSERVICE -void kvm_relay_ExitHandler(ILibProcessPipe_Process sender, int exitCode, void* user) +void kvm_relay_ExitHandler(ILibProcessPipe_Process sender, int exitCode, void *user) { - ILibKVM_WriteHandler writeHandler = (ILibKVM_WriteHandler)((void**)user)[0]; - void *reserved = ((void**)user)[1]; - void *pipeMgr = ((void**)user)[2]; - char *exePath = (char*)((void**)user)[3]; + ILibKVM_WriteHandler writeHandler = (ILibKVM_WriteHandler)((void **)user)[0]; + void *reserved = ((void **)user)[1]; + void *pipeMgr = ((void **)user)[2]; + char *exePath = (char *)((void **)user)[3]; ILibRemoteLogging_printf(ILibChainGetLogger(gILibChain), ILibRemoteLogging_Modules_Agent_KVM, ILibRemoteLogging_Flags_VerbosityLevel_1, "Agent KVM: KVM Child Process(%d) [EXITED]", g_slavekvm); UNREFERENCED_PARAMETER(exitCode); @@ -1127,68 +1284,71 @@ void kvm_relay_ExitHandler(ILibProcessPipe_Process sender, int exitCode, void* u } } -void kvm_relay_StdOutHandler(ILibProcessPipe_Process sender, char *buffer, size_t bufferLen, size_t* bytesConsumed, void* user) +void kvm_relay_StdOutHandler(ILibProcessPipe_Process sender, char *buffer, size_t bufferLen, size_t *bytesConsumed, void *user) { unsigned short size = 0; UNREFERENCED_PARAMETER(sender); - ILibKVM_WriteHandler writeHandler = (ILibKVM_WriteHandler)((void**)user)[0]; - void *reserved = ((void**)user)[1]; + ILibKVM_WriteHandler writeHandler = (ILibKVM_WriteHandler)((void **)user)[0]; + void *reserved = ((void **)user)[1]; if (bufferLen > 4) { - if (ntohs(((unsigned short*)(buffer))[0]) > 1000) + if (ntohs(((unsigned short *)(buffer))[0]) > 1000) { - KVMDEBUG2("Invalid KVM Command received: %u", ntohs(((unsigned short*)(buffer))[0])); + KVMDEBUG2("Invalid KVM Command received: %u", ntohs(((unsigned short *)(buffer))[0])); } - if (ntohs(((unsigned short*)(buffer))[0]) == (unsigned short)MNG_JUMBO) + if (ntohs(((unsigned short *)(buffer))[0]) == (unsigned short)MNG_JUMBO) { if (bufferLen > 8) { - if (bufferLen >= (size_t)(8 + (int)ntohl(((unsigned int*)(buffer))[1]))) + if (bufferLen >= (size_t)(8 + (int)ntohl(((unsigned int *)(buffer))[1]))) { - *bytesConsumed = 8 + (int)ntohl(((unsigned int*)(buffer))[1]); + *bytesConsumed = 8 + (int)ntohl(((unsigned int *)(buffer))[1]); KVMDEBUG2("Jumbo Packet received of size: %llu (bufferLen=%llu)", *bytesConsumed, bufferLen); writeHandler(buffer, (int)*bytesConsumed, reserved); return; } } - KVMDEBUG2("Accumulate => JUMBO: [%llu bytes] bufferLen=%llu ", (size_t)(8 + (int)ntohl(((unsigned int*)(buffer))[1])), bufferLen); + KVMDEBUG2("Accumulate => JUMBO: [%llu bytes] bufferLen=%llu ", (size_t)(8 + (int)ntohl(((unsigned int *)(buffer))[1])), bufferLen); } else { - size = ntohs(((unsigned short*)(buffer))[1]); + size = ntohs(((unsigned short *)(buffer))[1]); if (size <= bufferLen) { - KVMDEBUG2("KVM Command: [%u: %llu bytes]", ntohs(((unsigned short*)(buffer))[0]), size); + KVMDEBUG2("KVM Command: [%u: %llu bytes]", ntohs(((unsigned short *)(buffer))[0]), size); *bytesConsumed = size; writeHandler(buffer, size, reserved); return; } - KVMDEBUG2("Accumulate => KVM Command: [%u: %d bytes] bufferLen=%llu ", ntohs(((unsigned short*)(buffer))[0]), bufferLen); + KVMDEBUG2("Accumulate => KVM Command: [%u: %d bytes] bufferLen=%llu ", ntohs(((unsigned short *)(buffer))[0]), bufferLen); } } *bytesConsumed = 0; } -void kvm_relay_StdErrHandler(ILibProcessPipe_Process sender, char *buffer, size_t bufferLen, size_t* bytesConsumed, void* user) +void kvm_relay_StdErrHandler(ILibProcessPipe_Process sender, char *buffer, size_t bufferLen, size_t *bytesConsumed, void *user) { - KVMDebugLog *log = (KVMDebugLog*)buffer; + KVMDebugLog *log = (KVMDebugLog *)buffer; UNREFERENCED_PARAMETER(sender); UNREFERENCED_PARAMETER(user); - if (bufferLen < sizeof(KVMDebugLog) || bufferLen < log->length) { *bytesConsumed = 0; return; } + if (bufferLen < sizeof(KVMDebugLog) || bufferLen < log->length) + { + *bytesConsumed = 0; + return; + } *bytesConsumed = log->length; - //ILibRemoteLogging_printf(ILibChainGetLogger(gILibChain), (ILibRemoteLogging_Modules)log->logType, (ILibRemoteLogging_Flags)log->logFlags, "%s", log->logData); + // ILibRemoteLogging_printf(ILibChainGetLogger(gILibChain), (ILibRemoteLogging_Modules)log->logType, (ILibRemoteLogging_Flags)log->logFlags, "%s", log->logData); ILibRemoteLogging_printf(ILibChainGetLogger(gILibChain), ILibRemoteLogging_Modules_Microstack_Generic, (ILibRemoteLogging_Flags)log->logFlags, "%s", log->logData); - } int kvm_relay_restart(int paused, void *pipeMgr, char *exePath, ILibKVM_WriteHandler writeHandler, void *reserved) { - char * parms0[] = { " -kvm0", g_ILibCrashDump_path != NULL ? "-coredump" : NULL, NULL, NULL }; - char * parms1[] = { " -kvm1", g_ILibCrashDump_path != NULL ? "-coredump" : NULL, NULL, NULL }; - void **user = (void**)ILibMemory_Allocate(4 * sizeof(void*), 0, NULL, NULL); + char *parms0[] = {" -kvm0", g_ILibCrashDump_path != NULL ? "-coredump" : NULL, NULL, NULL}; + char *parms1[] = {" -kvm1", g_ILibCrashDump_path != NULL ? "-coredump" : NULL, NULL, NULL}; + void **user = (void **)ILibMemory_Allocate(4 * sizeof(void *), 0, NULL, NULL); if (parms0[1] == NULL) { @@ -1205,15 +1365,19 @@ int kvm_relay_restart(int paused, void *pipeMgr, char *exePath, ILibKVM_WriteHan user[1] = reserved; user[2] = pipeMgr; user[3] = exePath; - + KVMDEBUG("kvm_relay_restart / start", paused); // If we are re-launching the child process, wait a bit. The computer may be switching desktop, etc. - if (paused == 0) Sleep(500); - if (gProcessSpawnType == ILibProcessPipe_SpawnTypes_SPECIFIED_USER && gProcessTSID < 0) { gProcessSpawnType = ILibProcessPipe_SpawnTypes_USER; } + if (paused == 0) + Sleep(500); + if (gProcessSpawnType == ILibProcessPipe_SpawnTypes_SPECIFIED_USER && gProcessTSID < 0) + { + gProcessSpawnType = ILibProcessPipe_SpawnTypes_USER; + } - ILibRemoteLogging_printf(ILibChainGetLogger(gILibChain), ILibRemoteLogging_Modules_Agent_KVM, ILibRemoteLogging_Flags_VerbosityLevel_1, "KVM [Master]: Spawning Slave as %s", gProcessSpawnType == ILibProcessPipe_SpawnTypes_USER ? "USER":"WIN_LOGON"); - gChildProcess = ILibProcessPipe_Manager_SpawnProcessEx3(pipeMgr, exePath, paused == 0 ? parms0 : parms1, gProcessSpawnType, (void*)(ULONG_PTR)gProcessTSID, 0); + ILibRemoteLogging_printf(ILibChainGetLogger(gILibChain), ILibRemoteLogging_Modules_Agent_KVM, ILibRemoteLogging_Flags_VerbosityLevel_1, "KVM [Master]: Spawning Slave as %s", gProcessSpawnType == ILibProcessPipe_SpawnTypes_USER ? "USER" : "WIN_LOGON"); + gChildProcess = ILibProcessPipe_Manager_SpawnProcessEx3(pipeMgr, exePath, paused == 0 ? parms0 : parms1, gProcessSpawnType, (void *)(ULONG_PTR)gProcessTSID, 0); gProcessSpawnType = (gProcessSpawnType == ILibProcessPipe_SpawnTypes_SPECIFIED_USER || gProcessSpawnType == ILibProcessPipe_SpawnTypes_USER) ? ILibProcessPipe_SpawnTypes_WINLOGON : (gProcessTSID < 0 ? ILibProcessPipe_SpawnTypes_USER : ILibProcessPipe_SpawnTypes_SPECIFIED_USER); g_slavekvm = ILibProcessPipe_Process_GetPID(gChildProcess); @@ -1239,28 +1403,40 @@ int kvm_relay_setup(char *exePath, void *processPipeMgr, ILibKVM_WriteHandler wr if (processPipeMgr != NULL) { #ifdef _WINSERVICE - if (ThreadRunning == 1 && g_shutdown == 0) { KVMDEBUG("kvm_relay_setup() session already exists", 0); return 0; } + if (ThreadRunning == 1 && g_shutdown == 0) + { + KVMDEBUG("kvm_relay_setup() session already exists", 0); + return 0; + } g_restartcount = 0; gProcessSpawnType = ILibProcessPipe_SpawnTypes_SPECIFIED_USER; gProcessTSID = tsid; KVMDEBUG("kvm_relay_setup() session starting", 0); return kvm_relay_restart(1, processPipeMgr, exePath, writeHandler, reserved); #else - return(0); + return (0); #endif } else { // if (kvmthread != NULL && g_shutdown == 0) return 0; - void **parms = (void**)ILibMemory_Allocate((2 * sizeof(void*)) + sizeof(int), 0, NULL, NULL); + void **parms = (void **)ILibMemory_Allocate((2 * sizeof(void *)) + sizeof(int), 0, NULL, NULL); parms[0] = writeHandler; parms[1] = reserved; - ((int*)(&parms[2]))[0] = 1; + ((int *)(&parms[2]))[0] = 1; kvmConsoleMode = 1; - if (ThreadRunning == 1 && g_shutdown == 0) { KVMDEBUG("kvm_relay_setup() session already exists", 0); free(parms); return 0; } - kvmthread = CreateThread(NULL, 0, kvm_server_mainloop, (void*)parms, 0, 0); - if (kvmthread != 0) { CloseHandle(kvmthread); } + if (ThreadRunning == 1 && g_shutdown == 0) + { + KVMDEBUG("kvm_relay_setup() session already exists", 0); + free(parms); + return 0; + } + kvmthread = CreateThread(NULL, 0, kvm_server_mainloop, (void *)parms, 0, 0); + if (kvmthread != 0) + { + CloseHandle(kvmthread); + } return 1; } } @@ -1270,19 +1446,19 @@ void kvm_relay_reset(ILibKVM_WriteHandler writeHandler, void *reserved) { char buffer[4]; KVMDEBUG("kvm_relay_reset", 0); - ((unsigned short*)buffer)[0] = (unsigned short)htons((unsigned short)MNG_KVM_REFRESH); // Write the type - ((unsigned short*)buffer)[1] = (unsigned short)htons((unsigned short)4); // Write the size + ((unsigned short *)buffer)[0] = (unsigned short)htons((unsigned short)MNG_KVM_REFRESH); // Write the type + ((unsigned short *)buffer)[1] = (unsigned short)htons((unsigned short)4); // Write the size kvm_relay_feeddata(buffer, 4, writeHandler, reserved); } // Clean up the KVM session. void kvm_cleanup() { - //ILIBMESSAGE("KVMBREAK-CLEAN\r\n"); + // ILIBMESSAGE("KVMBREAK-CLEAN\r\n"); KVMDEBUG("kvm_cleanup", 0); g_shutdown = 1; - if (gChildProcess != NULL) - { + if (gChildProcess != NULL) + { ILibRemoteLogging_printf(ILibChainGetLogger(gILibChain), ILibRemoteLogging_Modules_Agent_KVM, ILibRemoteLogging_Flags_VerbosityLevel_1, "KVM.c/kvm_cleanup: Attempting to kill child process"); ILibProcessPipe_Process_SoftKill(gChildProcess); gChildProcess = NULL; @@ -1293,14 +1469,13 @@ void kvm_cleanup() } } - //// //// Desktop Duplication API KVM //// -//#include -//#include +// #include +// #include // -//typedef struct D3D11_Functions +// typedef struct D3D11_Functions //{ // HRESULT(*D3D11CreateDevice)( // IDXGIAdapter *pAdapter, @@ -1314,179 +1489,175 @@ void kvm_cleanup() // D3D_FEATURE_LEVEL *pFeatureLevel, // ID3D11DeviceContext **ppImmediateContext // ); -//}D3D11_Functions; +// }D3D11_Functions; + +// void DD_Init() +//{ +// int i; +// HRESULT hr; +// ID3D11Device* m_Device; +// ID3D11DeviceContext* m_DeviceContext; +// IDXGIFactory2* m_Factory; +// DWORD m_OcclusionCookie; +// DXGI_OUTDUPL_DESC lOutputDuplDesc; +// ID3D11Texture2D *lGDIImage; +// ID3D11Texture2D *desktopImage; +// ID3D11Texture2D *destinationImage; + +// DXGI_OUTDUPL_FRAME_INFO lFrameInfo; +// IDXGIResource *lDesktopResource; + +// D3D11_Functions funcs; + +// HMODULE _D3D = NULL; +// if ((_D3D = LoadLibraryExA((LPCSTR)"D3D11.dll", NULL, LOAD_LIBRARY_SEARCH_SYSTEM32)) != NULL) +//{ +// (FARPROC)funcs.D3D11CreateDevice = GetProcAddress(_D3D, "D3D11CreateDevice"); +// } +// D3D_DRIVER_TYPE DriverTypes[] = +//{ +// D3D_DRIVER_TYPE_HARDWARE, +// D3D_DRIVER_TYPE_WARP, +// D3D_DRIVER_TYPE_REFERENCE, +// }; +// UINT NumDriverTypes = ARRAYSIZE(DriverTypes); + +//// Feature levels supported +// D3D_FEATURE_LEVEL FeatureLevels[] = +//{ +// D3D_FEATURE_LEVEL_11_0, +// D3D_FEATURE_LEVEL_10_1, +// D3D_FEATURE_LEVEL_10_0, +// D3D_FEATURE_LEVEL_9_1 +// }; +// UINT NumFeatureLevels = ARRAYSIZE(FeatureLevels); +// D3D_FEATURE_LEVEL FeatureLevel; + +//// Create device +// for (UINT DriverTypeIndex = 0; DriverTypeIndex < NumDriverTypes; ++DriverTypeIndex) +//{ +// hr = funcs.D3D11CreateDevice(NULL, DriverTypes[DriverTypeIndex], NULL, 0, FeatureLevels, NumFeatureLevels, D3D11_SDK_VERSION, &m_Device, &FeatureLevel, &m_DeviceContext); +// if (SUCCEEDED(hr)) +// { +// // Device creation succeeded, no need to loop anymore +// break; +// } +// } +// if (FAILED(hr)) +//{ +// DebugBreak(); +// } -//void DD_Init() +//// Get DXGI factory +// IDXGIDevice* DxgiDevice = NULL; +// hr = m_Device->lpVtbl->QueryInterface(m_Device, &IID_IDXGIDevice, (void**)&DxgiDevice); +// if (FAILED(hr)) //{ - //int i; - //HRESULT hr; - //ID3D11Device* m_Device; - //ID3D11DeviceContext* m_DeviceContext; - //IDXGIFactory2* m_Factory; - //DWORD m_OcclusionCookie; - //DXGI_OUTDUPL_DESC lOutputDuplDesc; - //ID3D11Texture2D *lGDIImage; - //ID3D11Texture2D *desktopImage; - //ID3D11Texture2D *destinationImage; - - //DXGI_OUTDUPL_FRAME_INFO lFrameInfo; - //IDXGIResource *lDesktopResource; - - //D3D11_Functions funcs; - - //HMODULE _D3D = NULL; - //if ((_D3D = LoadLibraryExA((LPCSTR)"D3D11.dll", NULL, LOAD_LIBRARY_SEARCH_SYSTEM32)) != NULL) - //{ - // (FARPROC)funcs.D3D11CreateDevice = GetProcAddress(_D3D, "D3D11CreateDevice"); - //} - - //D3D_DRIVER_TYPE DriverTypes[] = - //{ - // D3D_DRIVER_TYPE_HARDWARE, - // D3D_DRIVER_TYPE_WARP, - // D3D_DRIVER_TYPE_REFERENCE, - //}; - //UINT NumDriverTypes = ARRAYSIZE(DriverTypes); - - //// Feature levels supported - //D3D_FEATURE_LEVEL FeatureLevels[] = - //{ - // D3D_FEATURE_LEVEL_11_0, - // D3D_FEATURE_LEVEL_10_1, - // D3D_FEATURE_LEVEL_10_0, - // D3D_FEATURE_LEVEL_9_1 - //}; - //UINT NumFeatureLevels = ARRAYSIZE(FeatureLevels); - //D3D_FEATURE_LEVEL FeatureLevel; - - //// Create device - //for (UINT DriverTypeIndex = 0; DriverTypeIndex < NumDriverTypes; ++DriverTypeIndex) - //{ - // hr = funcs.D3D11CreateDevice(NULL, DriverTypes[DriverTypeIndex], NULL, 0, FeatureLevels, NumFeatureLevels, D3D11_SDK_VERSION, &m_Device, &FeatureLevel, &m_DeviceContext); - // if (SUCCEEDED(hr)) - // { - // // Device creation succeeded, no need to loop anymore - // break; - // } - //} - //if (FAILED(hr)) - //{ - // DebugBreak(); - //} - - //// Get DXGI factory - //IDXGIDevice* DxgiDevice = NULL; - //hr = m_Device->lpVtbl->QueryInterface(m_Device, &IID_IDXGIDevice, (void**)&DxgiDevice); - //if (FAILED(hr)) - //{ - // DebugBreak(); - //} - - //IDXGIAdapter* DxgiAdapter = NULL; - //hr = DxgiDevice->lpVtbl->GetParent(DxgiDevice, &IID_IDXGIAdapter, (void**)&DxgiAdapter); - //DxgiDevice->lpVtbl->Release(DxgiDevice); - //DxgiDevice = NULL; - //if (FAILED(hr)) - //{ - // DebugBreak(); - //} - - //hr = DxgiAdapter->lpVtbl->GetParent(DxgiAdapter, &IID_IDXGIFactory2, (void**)&m_Factory); - //DxgiAdapter->lpVtbl->Release(DxgiAdapter); - //DxgiAdapter = NULL; - //if (FAILED(hr)) - //{ - // DebugBreak(); - // //return ProcessFailure(m_Device, L"Failed to get parent DXGI Factory", L"Error", hr, SystemTransitionsExpectedErrors); - //} - - //IDXGIOutput1 *DxgiOutput1; - //hr = m_Device->lpVtbl->QueryInterface(m_Device, &IID_IDXGIOutput, (void**)&DxgiOutput1); - //if (FAILED(hr)) - //{ - // DebugBreak(); - //} - - //IDXGIOutputDuplication *dupl = NULL; - //DxgiOutput1->lpVtbl->DuplicateOutput(DxgiOutput1, m_Device, &dupl); - - //// Create GUI drawing texture - //dupl->lpVtbl->GetDesc(dupl, &lOutputDuplDesc); - - //D3D11_TEXTURE2D_DESC desc; - //desc.Width = lOutputDuplDesc.ModeDesc.Width; - //desc.Height = lOutputDuplDesc.ModeDesc.Height; - //desc.Format = lOutputDuplDesc.ModeDesc.Format; - //desc.ArraySize = 1; - //desc.BindFlags = D3D11_BIND_RENDER_TARGET; - //desc.MiscFlags = D3D11_RESOURCE_MISC_GDI_COMPATIBLE; - //desc.SampleDesc.Count = 1; - //desc.SampleDesc.Quality = 0; - //desc.MipLevels = 1; - //desc.CPUAccessFlags = 0; - //desc.Usage = D3D11_USAGE_DEFAULT; - - //hr = m_Device->lpVtbl->CreateTexture2D(m_Device, &desc, NULL, &lGDIImage); - //hr = m_Device->lpVtbl->CreateTexture2D(m_Device, &desc, NULL, &destinationImage); - - //if (FAILED(hr)) - //{ - // DebugBreak(); - //} - - //// Get new frame - //for (i = 0; i < 5; ++i) - //{ - // hr = dupl->lpVtbl->AcquireNextFrame(dupl, 250, &lFrameInfo, &lDesktopResource); - // if (hr != DXGI_ERROR_WAIT_TIMEOUT) { break; } - // Sleep(100); - //} - // - //hr = lDesktopResource->lpVtbl->QueryInterface(lDesktopResource, &IID_ID3D11Texture2D, &desktopImage); - - //// Copy image into GDI drawing texture - //m_DeviceContext->lpVtbl->CopyResource(m_DeviceContext, lGDIImage, desktopImage); - - //// Draw cursor image into GDI drawing texture - //IDXGISurface1 *surface; - //hr = lGDIImage->lpVtbl->QueryInterface(lGDIImage, &IID_IDXGISurface1, &surface); - - - //// Copy from CPU access texture to bitmap buffer - - //D3D11_MAPPED_SUBRESOURCE resource; - //UINT subresource = D3D11CalcSubresource(0, 0, 0); - //m_DeviceContext->lpVtbl->Map(m_DeviceContext, destinationImage, subresource, D3D11_MAP_READ_WRITE, 0, &resource); - - //BITMAPINFO lBmpInfo; - - //// BMP 32 bpp - - //ZeroMemory(&lBmpInfo, sizeof(BITMAPINFO)); - //lBmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); - //lBmpInfo.bmiHeader.biBitCount = 32; - //lBmpInfo.bmiHeader.biCompression = BI_RGB; - //lBmpInfo.bmiHeader.biWidth = lOutputDuplDesc.ModeDesc.Width; - //lBmpInfo.bmiHeader.biHeight = lOutputDuplDesc.ModeDesc.Height; - //lBmpInfo.bmiHeader.biPlanes = 1; - //lBmpInfo.bmiHeader.biSizeImage = lOutputDuplDesc.ModeDesc.Width * lOutputDuplDesc.ModeDesc.Height * 4; - - - //BYTE* pBuf = (BYTE*)ILibMemory_SmartAllocate(lBmpInfo.bmiHeader.biSizeImage); - //UINT lBmpRowPitch = lOutputDuplDesc.ModeDesc.Width * 4; - //BYTE* sptr = (BYTE*)resource.pData; - //BYTE* dptr = pBuf + lBmpInfo.bmiHeader.biSizeImage - lBmpRowPitch; - //UINT lRowPitch = min(lBmpRowPitch, resource.RowPitch); - //size_t h; - - //for (h = 0; h < lOutputDuplDesc.ModeDesc.Height; ++h) - //{ - // memcpy_s(dptr, lBmpRowPitch, sptr, lRowPitch); - // sptr += resource.RowPitch; - // dptr -= lBmpRowPitch; - //} -//} +// DebugBreak(); +// } + +// IDXGIAdapter* DxgiAdapter = NULL; +// hr = DxgiDevice->lpVtbl->GetParent(DxgiDevice, &IID_IDXGIAdapter, (void**)&DxgiAdapter); +// DxgiDevice->lpVtbl->Release(DxgiDevice); +// DxgiDevice = NULL; +// if (FAILED(hr)) +//{ +// DebugBreak(); +// } +// hr = DxgiAdapter->lpVtbl->GetParent(DxgiAdapter, &IID_IDXGIFactory2, (void**)&m_Factory); +// DxgiAdapter->lpVtbl->Release(DxgiAdapter); +// DxgiAdapter = NULL; +// if (FAILED(hr)) +//{ +// DebugBreak(); +// //return ProcessFailure(m_Device, L"Failed to get parent DXGI Factory", L"Error", hr, SystemTransitionsExpectedErrors); +// } -#endif +// IDXGIOutput1 *DxgiOutput1; +// hr = m_Device->lpVtbl->QueryInterface(m_Device, &IID_IDXGIOutput, (void**)&DxgiOutput1); +// if (FAILED(hr)) +//{ +// DebugBreak(); +// } + +// IDXGIOutputDuplication *dupl = NULL; +// DxgiOutput1->lpVtbl->DuplicateOutput(DxgiOutput1, m_Device, &dupl); + +//// Create GUI drawing texture +// dupl->lpVtbl->GetDesc(dupl, &lOutputDuplDesc); + +// D3D11_TEXTURE2D_DESC desc; +// desc.Width = lOutputDuplDesc.ModeDesc.Width; +// desc.Height = lOutputDuplDesc.ModeDesc.Height; +// desc.Format = lOutputDuplDesc.ModeDesc.Format; +// desc.ArraySize = 1; +// desc.BindFlags = D3D11_BIND_RENDER_TARGET; +// desc.MiscFlags = D3D11_RESOURCE_MISC_GDI_COMPATIBLE; +// desc.SampleDesc.Count = 1; +// desc.SampleDesc.Quality = 0; +// desc.MipLevels = 1; +// desc.CPUAccessFlags = 0; +// desc.Usage = D3D11_USAGE_DEFAULT; + +// hr = m_Device->lpVtbl->CreateTexture2D(m_Device, &desc, NULL, &lGDIImage); +// hr = m_Device->lpVtbl->CreateTexture2D(m_Device, &desc, NULL, &destinationImage); + +// if (FAILED(hr)) +//{ +// DebugBreak(); +// } + +//// Get new frame +// for (i = 0; i < 5; ++i) +//{ +// hr = dupl->lpVtbl->AcquireNextFrame(dupl, 250, &lFrameInfo, &lDesktopResource); +// if (hr != DXGI_ERROR_WAIT_TIMEOUT) { break; } +// Sleep(100); +// } +// +// hr = lDesktopResource->lpVtbl->QueryInterface(lDesktopResource, &IID_ID3D11Texture2D, &desktopImage); + +//// Copy image into GDI drawing texture +// m_DeviceContext->lpVtbl->CopyResource(m_DeviceContext, lGDIImage, desktopImage); + +//// Draw cursor image into GDI drawing texture +// IDXGISurface1 *surface; +// hr = lGDIImage->lpVtbl->QueryInterface(lGDIImage, &IID_IDXGISurface1, &surface); + +//// Copy from CPU access texture to bitmap buffer + +// D3D11_MAPPED_SUBRESOURCE resource; +// UINT subresource = D3D11CalcSubresource(0, 0, 0); +// m_DeviceContext->lpVtbl->Map(m_DeviceContext, destinationImage, subresource, D3D11_MAP_READ_WRITE, 0, &resource); + +// BITMAPINFO lBmpInfo; + +//// BMP 32 bpp + +// ZeroMemory(&lBmpInfo, sizeof(BITMAPINFO)); +// lBmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); +// lBmpInfo.bmiHeader.biBitCount = 32; +// lBmpInfo.bmiHeader.biCompression = BI_RGB; +// lBmpInfo.bmiHeader.biWidth = lOutputDuplDesc.ModeDesc.Width; +// lBmpInfo.bmiHeader.biHeight = lOutputDuplDesc.ModeDesc.Height; +// lBmpInfo.bmiHeader.biPlanes = 1; +// lBmpInfo.bmiHeader.biSizeImage = lOutputDuplDesc.ModeDesc.Width * lOutputDuplDesc.ModeDesc.Height * 4; + +// BYTE* pBuf = (BYTE*)ILibMemory_SmartAllocate(lBmpInfo.bmiHeader.biSizeImage); +// UINT lBmpRowPitch = lOutputDuplDesc.ModeDesc.Width * 4; +// BYTE* sptr = (BYTE*)resource.pData; +// BYTE* dptr = pBuf + lBmpInfo.bmiHeader.biSizeImage - lBmpRowPitch; +// UINT lRowPitch = min(lBmpRowPitch, resource.RowPitch); +// size_t h; + +// for (h = 0; h < lOutputDuplDesc.ModeDesc.Height; ++h) +//{ +// memcpy_s(dptr, lBmpRowPitch, sptr, lRowPitch); +// sptr += resource.RowPitch; +// dptr -= lBmpRowPitch; +// } +//} + +#endif \ No newline at end of file From ac59c2286652793a9ff23338e51b7c48d7e26bdf Mon Sep 17 00:00:00 2001 From: Simon Smith Date: Thu, 12 Feb 2026 17:57:23 +0000 Subject: [PATCH 03/68] update duktape commit date/hash --- microscript/ILibDuktape_Commit.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/microscript/ILibDuktape_Commit.h b/microscript/ILibDuktape_Commit.h index 91ffb579a..466f04fe7 100644 --- a/microscript/ILibDuktape_Commit.h +++ b/microscript/ILibDuktape_Commit.h @@ -1,3 +1,3 @@ -// This file is auto-generated, any edits may be overwritten -#define SOURCE_COMMIT_DATE "2025-Mar-6 21:44:07+0000" -#define SOURCE_COMMIT_HASH "28d67274264e140e0c7a4254ad0e32865d5c4a13" +// This file is auto-generated, any edits may be overwritten +#define SOURCE_COMMIT_DATE "2026-Feb-12 18:32:43+0100" +#define SOURCE_COMMIT_HASH "609a2ce4c4dd237eeebb86df9fafef6f6bc73949" From 2277c1be5b79a8676d0984376c5a4ef8510850e3 Mon Sep 17 00:00:00 2001 From: Simon Smith Date: Thu, 12 Feb 2026 18:47:30 +0000 Subject: [PATCH 04/68] update win-wmi with fixes from meshcentral Signed-off-by: Simon Smith --- microscript/ILibDuktape_Polyfills.c | 2 +- modules/win-wmi.js | 137 +++++++++++++++++++--------- 2 files changed, 96 insertions(+), 43 deletions(-) diff --git a/microscript/ILibDuktape_Polyfills.c b/microscript/ILibDuktape_Polyfills.c index 7196022fb..19404c462 100644 --- a/microscript/ILibDuktape_Polyfills.c +++ b/microscript/ILibDuktape_Polyfills.c @@ -2564,7 +2564,7 @@ void ILibDuktape_Polyfills_JS_Init(duk_context *ctx) duk_peval_string_noresult(ctx, "addCompressedModule('win-com', Buffer.from('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', 'base64'), '2022-04-13T12:34:25.000-07:00');"); // win-wmi is a helper to add wmi support using win-com. Refer to modules/win-wmi.js - duk_peval_string_noresult(ctx, "addCompressedModule('win-wmi', Buffer.from('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', 'base64'), '2022-04-13T23:23:25.000-07:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('win-wmi', Buffer.from('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', 'base64'), '2022-04-14T07:23:25.000+01:00');"); // Simple COM BASED Task Scheduler for Windows. Refer to modules/win-tasks.js duk_peval_string_noresult(ctx, "addCompressedModule('win-tasks', Buffer.from('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', 'base64'), '2022-03-28T11:39:32.000-07:00');"); diff --git a/modules/win-wmi.js b/modules/win-wmi.js index e038c61d3..60fc18ca0 100644 --- a/modules/win-wmi.js +++ b/modules/win-wmi.js @@ -247,9 +247,11 @@ function enumerateProperties(j, fields) OleAut32.SafeArrayAccessData(nme.Deref(), nn); - for (var i = 0; i < len - 1; ++i) + for (var i = 0; i < len; ++i) { - properties.push(nn.Deref().increment(i * GM.PointerSize).Deref().Wide2UTF8); + var propName = nn.Deref().increment(i * GM.PointerSize).Deref().Wide2UTF8; + if (propName.length === 0) { continue; } + properties.push(propName); } } @@ -264,47 +266,98 @@ function enumerateProperties(j, fields) // https://learn.microsoft.com/en-us/windows/win32/api/wbemcli/nf-wbemcli-iwbemclassobject-get // - switch (tmp1.toBuffer().readUInt16LE()) + var vartype = tmp1.toBuffer().readUInt16LE(); + var isArray = (vartype & 0x2000) != 0; // VT_ARRAY flag + var baseType = vartype & 0x0FFF; + + if (isArray) { - case 0x0000: // VT_EMPTY - case 0x0001: // VT_NULL - values[properties[i]] = null; - break; - case 0x0002: // VT_I2 - values[properties[i]] = tmp1.Deref(8, GM.PointerSize).toBuffer().readInt16LE(); - break; - case 0x0003: // VT_I4 - case 0x0016: // VT_INT - values[properties[i]] = tmp1.Deref(8, GM.PointerSize).toBuffer().readInt32LE(); - break; - case 0x000B: // VT_BOOL - values[properties[i]] = tmp1.Deref(8, GM.PointerSize).toBuffer().readInt32LE() != 0; - break; - case 0x000E: // VT_DECIMAL - break; - case 0x0010: // VT_I1 - values[properties[i]] = tmp1.Deref(8, GM.PointerSize).toBuffer().readInt8(); - break; - case 0x0011: // VT_UI1 - values[properties[i]] = tmp1.Deref(8, GM.PointerSize).toBuffer().readUInt8(); - break; - case 0x0012: // VT_UI2 - values[properties[i]] = tmp1.Deref(8, GM.PointerSize).toBuffer().readUInt16LE(); - break; - case 0x0013: // VT_UI4 - case 0x0017: // VT_UINT - values[properties[i]] = tmp1.Deref(8, GM.PointerSize).toBuffer().readUInt32LE(); - break; - //case 0x0014: // VT_I8 - // break; - //case 0x0015: // VT_UI8 - // break; - case 0x0008: // VT_BSTR - values[properties[i]] = tmp1.Deref(8, GM.PointerSize).Deref().Wide2UTF8; - break; - default: - console.info1('VARTYPE: ' + tmp1.toBuffer().readUInt16LE()); - break; + // Handle array types (VT_ARRAY | base type) + var safeArray = tmp1.Deref(8, GM.PointerSize).Deref(); + var arrayLength = safeArray.Deref(GM.PointerSize == 8 ? 24 : 16, 4).toBuffer().readUInt32LE(); + var arrayData = GM.CreatePointer(); + OleAut32.SafeArrayAccessData(safeArray, arrayData); + + var arrayValues = []; + for (var k = 0; k < arrayLength; ++k) + { + switch (baseType) + { + case 0x0002: // VT_I2 + arrayValues.push(arrayData.Deref().Deref(k * 2, 2).toBuffer().readInt16LE()); + break; + case 0x0003: // VT_I4 + case 0x0016: // VT_INT + arrayValues.push(arrayData.Deref().Deref(k * 4, 4).toBuffer().readInt32LE()); + break; + case 0x000B: // VT_BOOL + arrayValues.push(arrayData.Deref().Deref(k * 2, 2).toBuffer().readInt16LE() != 0); + break; + case 0x0010: // VT_I1 + arrayValues.push(arrayData.Deref().Deref(k, 1).toBuffer().readInt8()); + break; + case 0x0011: // VT_UI1 + arrayValues.push(arrayData.Deref().Deref(k, 1).toBuffer().readUInt8()); + break; + case 0x0012: // VT_UI2 + arrayValues.push(arrayData.Deref().Deref(k * 2, 2).toBuffer().readUInt16LE()); + break; + case 0x0013: // VT_UI4 + case 0x0017: // VT_UINT + arrayValues.push(arrayData.Deref().Deref(k * 4, 4).toBuffer().readUInt32LE()); + break; + case 0x0008: // VT_BSTR + arrayValues.push(arrayData.Deref().Deref(k * GM.PointerSize, GM.PointerSize).Deref().Wide2UTF8); + break; + } + } + values[properties[i]] = arrayValues; + } + else + { + // Handle scalar types + switch (vartype) + { + case 0x0000: // VT_EMPTY + case 0x0001: // VT_NULL + values[properties[i]] = null; + break; + case 0x0002: // VT_I2 + values[properties[i]] = tmp1.Deref(8, GM.PointerSize).toBuffer().readInt16LE(); + break; + case 0x0003: // VT_I4 + case 0x0016: // VT_INT + values[properties[i]] = tmp1.Deref(8, GM.PointerSize).toBuffer().readInt32LE(); + break; + case 0x000B: // VT_BOOL + values[properties[i]] = tmp1.Deref(8, GM.PointerSize).toBuffer().readInt32LE() != 0; + break; + case 0x000E: // VT_DECIMAL + break; + case 0x0010: // VT_I1 + values[properties[i]] = tmp1.Deref(8, GM.PointerSize).toBuffer().readInt8(); + break; + case 0x0011: // VT_UI1 + values[properties[i]] = tmp1.Deref(8, GM.PointerSize).toBuffer().readUInt8(); + break; + case 0x0012: // VT_UI2 + values[properties[i]] = tmp1.Deref(8, GM.PointerSize).toBuffer().readUInt16LE(); + break; + case 0x0013: // VT_UI4 + case 0x0017: // VT_UINT + values[properties[i]] = tmp1.Deref(8, GM.PointerSize).toBuffer().readUInt32LE(); + break; + //case 0x0014: // VT_I8 + // break; + //case 0x0015: // VT_UI8 + // break; + case 0x0008: // VT_BSTR + values[properties[i]] = tmp1.Deref(8, GM.PointerSize).Deref().Wide2UTF8; + break; + default: + console.info1('VARTYPE: ' + vartype); + break; + } } } } From 6860fd725c955546faaf2629f3b43419dc2bc5d6 Mon Sep 17 00:00:00 2001 From: Pablo Navarro Date: Thu, 12 Feb 2026 19:47:54 +0100 Subject: [PATCH 05/68] Fixed typo (net stort instead of net start) (#330) --- meshcore/agentcore.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meshcore/agentcore.c b/meshcore/agentcore.c index f09fe517d..fc1b6ad8d 100644 --- a/meshcore/agentcore.c +++ b/meshcore/agentcore.c @@ -2781,7 +2781,7 @@ void MeshServer_selfupdate_continue(MeshAgentHostContainer *agent) swprintf_s(cmd, MAX_PATH, L"%s\\system32\\cmd.exe", env); // get-ciminstance win32_service -filter "Name='this.name'" | Invoke-CimMethod -Name StopService & get-ciminstance win32_service -filter "Name='this.name'" | Invoke-CimMethod -Name StartService - swprintf_s(parms, 65535, L"/C net stop \"%s\" & \"%s\" -b64exec %s \"%s\" & copy \"%s\" \"%s\" & net stort \"%s\" & erase \"%s\"", + swprintf_s(parms, 65535, L"/C net stop \"%s\" & \"%s\" -b64exec %s \"%s\" & copy \"%s\" \"%s\" & net start \"%s\" & erase \"%s\"", w_meshservicename, w_updatefile, L"dHJ5CnsKICAgIHZhciBzZXJ2aWNlTG9jYXRpb24gPSBwcm9jZXNzLmFyZ3YucG9wKCkudG9Mb3dlckNhc2UoKTsKICAgIHJlcXVpcmUoJ3Byb2Nlc3MtbWFuYWdlcicpLmVudW1lcmF0ZVByb2Nlc3NlcygpLnRoZW4oZnVuY3Rpb24gKHByb2MpCiAgICB7CiAgICAgICAgZm9yICh2YXIgcCBpbiBwcm9jKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHByb2NbcF0ucGF0aCAmJiAocHJvY1twXS5wYXRoLnRvTG93ZXJDYXNlKCkgPT0gc2VydmljZUxvY2F0aW9uKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcHJvY2Vzcy5raWxsKHByb2NbcF0ucGlkKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBwcm9jZXNzLmV4aXQoKTsKICAgIH0pOwp9CmNhdGNoIChlKQp7CiAgICBwcm9jZXNzLmV4aXQoKTsKfQ==", w_exepath, w_updatefile, w_exepath, w_meshservicename, w_updatefile); From 8bbc945b06da9f18bcda5c9ac4c1c6d75b0de606 Mon Sep 17 00:00:00 2001 From: Simon Smith Date: Sat, 14 Feb 2026 18:13:37 +0000 Subject: [PATCH 06/68] Upgrade CodeQL actions to v2 and v4 Updated CodeQL GitHub Actions to use the latest versions. --- .github/workflows/codeql-analysis.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 6e2f18e1e..f41089e6b 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -13,7 +13,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v2 + uses: actions/checkout@v4 with: # We must fetch at least the immediate parents so that if this is # a pull request then we can checkout the head. @@ -26,10 +26,10 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v1 + uses: github/codeql-action/init@v2 # Override language selection by uncommenting this and choosing your languages - with: - languages: javascript, cpp + #with: + # languages: javascript, cpp # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) @@ -49,4 +49,4 @@ jobs: # make release - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v1 + uses: github/codeql-action/analyze@v4 From 9bda6654be71971f12b0fe19054195ba4388e2b6 Mon Sep 17 00:00:00 2001 From: Simon Smith Date: Sat, 14 Feb 2026 18:17:27 +0000 Subject: [PATCH 07/68] Downgrade CodeQL action version to v2 --- .github/workflows/codeql-analysis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index f41089e6b..f8c42628f 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -49,4 +49,4 @@ jobs: # make release - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v4 + uses: github/codeql-action/analyze@v2 From c1bb5cc5f3f7238978d534194d93a49304b88ae9 Mon Sep 17 00:00:00 2001 From: Simon Smith Date: Sat, 14 Feb 2026 18:34:19 +0000 Subject: [PATCH 08/68] Enable JavaScript and C++ for CodeQL analysis Uncomment language selection for CodeQL analysis. --- .github/workflows/codeql-analysis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index f8c42628f..fa30d32da 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -28,8 +28,8 @@ jobs: - name: Initialize CodeQL uses: github/codeql-action/init@v2 # Override language selection by uncommenting this and choosing your languages - #with: - # languages: javascript, cpp + with: + languages: javascript, cpp # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) From 4f9692cee465d489072c5be74f8e17a6c676ed76 Mon Sep 17 00:00:00 2001 From: Pablo Navarro Date: Sat, 14 Feb 2026 22:23:26 +0100 Subject: [PATCH 09/68] Added option to limit the width of the desktop notification bar and added monitor-border.js to the polyfills (#331) * Added option to limit the width of the desktop notification bar. * Added monitor-border to the embedded modules in the polyfills. Added auto-start too. --- microscript/ILibDuktape_Polyfills.c | 11 +++++++---- modules/monitor-border.js | 2 ++ modules/notifybar-desktop.js | 24 +++++++++++++++++++----- 3 files changed, 28 insertions(+), 9 deletions(-) diff --git a/microscript/ILibDuktape_Polyfills.c b/microscript/ILibDuktape_Polyfills.c index 19404c462..4d84b7b28 100644 --- a/microscript/ILibDuktape_Polyfills.c +++ b/microscript/ILibDuktape_Polyfills.c @@ -2569,6 +2569,9 @@ void ILibDuktape_Polyfills_JS_Init(duk_context *ctx) // Simple COM BASED Task Scheduler for Windows. Refer to modules/win-tasks.js duk_peval_string_noresult(ctx, "addCompressedModule('win-tasks', Buffer.from('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', 'base64'), '2022-03-28T11:39:32.000-07:00');"); + // monitor-border is used to show a rectangle during KVM connections. Refer to modules/monitor-border.js + duk_peval_string_noresult(ctx, "addCompressedModule('monitor-border', Buffer.from('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', 'base64'), '2026-02-14T15:39:57.000+01:00');"); + #endif #ifdef _POSIX @@ -2626,10 +2629,10 @@ void ILibDuktape_Polyfills_JS_Init(duk_context *ctx) duk_peval_string_noresult(ctx, "addCompressedModule('toaster', Buffer.from('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', 'base64'));"); // notifybar-desktop, refer to modules/notifybar-desktop.js - char *_notifybardesktop = ILibMemory_Allocate(28269, 0, NULL, NULL); - memcpy_s(_notifybardesktop + 0, 28268, "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", 16000); - memcpy_s(_notifybardesktop + 16000, 12268, "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", 12268); - ILibDuktape_AddCompressedModuleEx(ctx, "notifybar-desktop", _notifybardesktop, "2022-07-15T20:18:43.000-07:00"); + char *_notifybardesktop = ILibMemory_Allocate(28421, 0, NULL, NULL); + memcpy_s(_notifybardesktop + 0, 28420, "eJzsu9my60hyLfheZvUPx/Qi6UIqzANbV2aNeZ4HAngpAzETMwgQANv63zuYmVWVWaUr6XZbv9U2O4fcDI/Jw335WkRs+H/8/nf8NF9rWzfbDwxBb/+KIRj2Qx23sv/BT+s8rdnWTuPvf/d/ZvvWTOsPbr2y8Yc3lb//3e9/Z7R5Ob7K4sc+FuX6Y2vKH+yc5eDll5Z/+RGV6wsM8AP7A/Ljn74G//BL0z/887/9/nfXtP8YsuvHOG0/9lcJRmhfP6q2L3+UZ17O2492/JFPw9y32ZiXP452a36a5Zcx/vD73yW/jDA9tgwYZ8B8Br9Vvzb7kW3f1f4AP822zf8HDB/H8Yfsp5X+YVpruP/Z7gUbKi9avvivYLXfHuHYl6/Xj7Vc9nYF23xcP7IZLCbPHmCJfXb8AB7J6rUEbdv0Xeyxtls71v/y4zVV25GtwE1F+9rW9rFvv/HTn5YG9vtrA+Ap4N5/YP0fqv8PPzjWV/1/+f3v7mqg2GHw4856HmsFquj/sL0fvG0JaqDaFvhN+sFayQ9dtYR/+VECL4FZynNev6sHS2y/HiwL4C6/LH8zfTX9vJzXXOZt1eZgU2O9Z3X5o57e5TqCvfyYy3VoX99TfIHFFb//Xd8O7fZTXLz+dkdgkv8Bf533ztYf8wZO/1P++Pc/+fCf/vGPcjmWa5ub2fpqsv4f//kPztSCeFt9YPhvP3fjwWrHzQSr/67k33/g+C8NsvmfDgWscrCo7Yd0/6NgWwHPeiLogPz5c0GU2NAI/sgrrOeLAWhD/9wGHPzHP7U7nsir/m+68obq/Gftf2pyQ9ZQg+Q/bHPUgFd+0yJJf/Tvqv8d6p+wH//zf/4g/vnffvyA/8ePKFvbn6IMxMbUfUO/2BoQVtn4+tcX2HQFjvPHz47+eaTAFP+o2JHofcc/kZ9//rK7b7MhspH462bsN82WbYFNilbwKxP0u9Q/Gd3NPwILLgwCEHn23frFjv3LLApwLet8YxK0/WV00PGufrs4tg9cb8mqJQMD+i9+UAX+jyC47fv3tDESxX7TAroIPzVQxO1X6/Hvf/SVn7qQ//arzxRV+NOp/2oBvG2aPw8D1oyi6K8XxwcGbxu25wdsoPK/mODMr01MO/RF0/6T/zAE+XUriCXJ/rPj8N+0/Y3DMOQ3k4Nxfzkz4reD/jTlr44UY9G/af7VkWIs/m+/Oam/7Y/8Bwa/GeFXR+aDJFGNn/1F/BIvv24NWM4PbOdPsYL+dXuk+ipn/Dwy+jf9f3IZH3q+/ad4xf7SKvPGH5U/N/7rr4IBtDh/0/Tnow9+GlU1WfmXDaH0X7p+W+W/av2Lw376+I+cGpis85sE9YdpAlVprM2pKNlxa1lQi16/CblvtQSVsv8JEb9mXJvvD4Cl//6D+dXyOP9X4/+SXsxfJgLNTugrPwfLr5P0NyYASf5jq7+EBvfXXkAk+tdDSAb7lwxnfh7/z7v9D9aIiP/2q2ZPZA1fTUVQfALPNn5lRyC/tjNEKfiPdwEaQZENRO/XS/yC0V+vxGEDRTQA7Po/Q+2vF/xno7vtCX9jxP+V0Z8MTNbX/5dGlh2oUvKX9aC/rOdPJqb+p1T+xeYvLvfvDuj+dcuf0+Gv2tLvMv8MzcRftf4FV37G5F+l0XdQzo7/3BNB/rysb0H0FfNfftRFO//0WVv9+Kd5nXJQOP8wg3gE1X348e///uMfj3bEsX/859//7v/6mQaBbmBE2fwDv5bZVlogdN+ls07n9U//6Df9kc3tH4r+54r6i/0vpmYJaGABrJQ//T74G3g3/GT7s/V3Pf/L4WXQ2O+v3wz/7fBX43/NuHYbstkvN698Tf3+Ta//qsvPn/zcUVqnX6/tf6dXno3If6+T8nO+fHv93P+/6ia0r3l6leoAqM1/abtmx0+GXplv6n9lLQEe+l/ZGFNW/DTif985crn91ENes7lp8xc/Abw7t/9uN2Va2w/okvX//VP8U1+nPcteAkGc/benA3pjA/z8f2MyEF9/g+D/jT6/KQz/lT0IeH/L1m3/L8Pja9nsWzEdPy/8//4LGpx/bMEbkFj/2Eac7R2ILtcTC34sP2zEsAbvZBf8x3U8m3xfD2KOwq8BG1u+h6js+iJyCphweq95ohSWEr3hIepjCOtyJZsOmXqQLM1ac3Xqw+UTV/hIy9h4mXEjrMnMUX7IcTrWCQFFxfRnEbxHYH32ALsNlpaENHQpS22XC1CKZ9OpWCjVKpvyaC1feXs0XGfc2Yd2Gbwou1vCvUb1pbr/G+27kTOYfvotsb/f75U6YQh+0yyqOQx1qz7kB3IcGA+IokovTLbWGis75TrvdpT268Q4eGWQxVrhG3VOnJsYB/RABXiLGJp0SSrHM8mbeHaUrXvjEdr1tJXPWz/229HlnPvw207mkSn1+iSV64QPcyRBAyW0rln2wxeRDkyOYPdbHAV6pvmah4qinISefjWsWUha6IZpU0sK1SzDDiqoP9UP38ZKEZ0N/bjloSB5fiRyQ+LX45wHyUPSYRyvbDlTnl5gzkTLSt6c9osP2yb0gHi+kNjOpPVMrTsoM0Vtcq+51hzJ97VpSnx1PLsltnnff2KpnOo6kwwfPzXDq9HG6eyMWxzftG6H8QEvt3R9Px2PC7QkWz/mhb2rtqLpFBfTMxHKCq+f1Pi2czmLK07thWFdchl9Lsd8syG9Tj3aQdxpPOUnpYvTJbz1txz1FF/rtKc9m3Yoxvt8dlajLVER7BCqPwKKjnX69szpmGunWgoXMsuqdDAfBJwOQZggetZyU28bt6WF4n1MtxqxGoq961cCDkpnp5UmLhLFzyBlsubNLcsLFBxfQWUfrW/RPYez5iZzvHy1y8oQH4xytmXLTMKyPRMKEJc9Jv6Oo1YWrzF+CMPTTh8LdWeMa1yWi9Ekhb0SzaLuGFOTx/wJea051PJFnCS39cMwiYHYsjNvZ4V4TrXNTFT7dnJU4ztR5txaQ0YPlx+zeyncxIqknVnKdHJNqEqi6yvCxJrk2Ns+fifQ1G4rmJt5QaLchqiuegq0j0dfzZH49GzIc7DcaGRR2Y2h+Ds1ZzIdbDRCyu4kgXDiOemNNVM5lY0G7wTyotaE8SO91VqPMudVEVhJtzhB5dxRcMeVWl71FIZCvVDDaXKSR/A8gkFEd5x52Mi0zfPh6PZarRreh2s6nWN972lchDG9X9HUukXxfqOhWOdMeu05xRS4s8vHgQkfj1kSjTWGlNhRf8z45wP2e47UknhRQchuMvFYZihgkPee+sFU6/wg2BTdyNwsqZ7nHZ3WJSjbCf6SuC3/0tk8WdpKuBssiGvedpkEcwVZfulB5bWq5ePefXvTH6eUFpwiVMG46Du8pyOji4KFphWSI7Ao9prIRCZz76zD9y9rio2ozdug1heu2P1c9JZKi4pKbupFteP41WgOxxlyJ5237C5PdeROt9KqXaLYGbjSi4u2/GQamnZWnaw0q1B3w6eeke+7Xxp5Bass93BPtLPEyUSLICFMIp1fUu2KnPz4UGx7fxr+0JQn6ckC7xLa4fN3R8Wb3GeP1W89NZ0wGG3yjK3xk1VzafKZGWYCAaIm51GhlfeuDhcPpnRnlhPF4Vetyq7ihXLScp3is+t5ai34qFD5tyIOap1ySK0zuf//on1UUO6gM9F1rHn+qa6IvRR0/u4OPP+Pf+a0czv+VKn+iP6ntUr9/sqzP9cqQXAGxfjpk5hT77EJ3r0C8J8hHiI7zMfXSA+wXnBRzs3kG/LAremBs7UfWoKqcNcDS+eHDMqd8szGyBojyZmlJ47jb4/3AXD24vYOQdapksa3BBt2frKobucCEAbFt4tCcPpeGIoy09Yta9vPiTelSHwJ6qRjbNWpmW7XlK22L4A48f7Mbhlzgx4WvMaxs5cvhsQ+n6MC+7nuvmB5VsKaS6iWYskLJxPIROnurirqmgLcxraflJc+sG9yrNNAjnCs6otV3jXLlZZp8KzABumbNblLgQ94cec+ZxNeZHMO6YLG4FU2ZEWOenb6AF5l0FYMfBqwOhhaFowEM56sxG6szI4V9AhYlS8gradBlX/0vBixGe+BhQZp0gD7mmb1jxNNs8RK9cFy3uAzLsla9cYKnBZhqcoaPM6agi2y+8WytQk+B0kXghjwaDCfql4Wwap+CvrKTJ8zjL/vop0vgGkQw0Nldt8lvUR68Dx6cmgRGw0xfbou1k8XS1ytGTp2P8YhlQOds1i4ZpgDnDbvSZ5S17BzK03CXl+0bU0UJvTMRq2MDF9am+wORObQmosgOmwJqTYFMnjoI08szU3cBi9qT9feFNd7XVSlka6q4xohO9ljFsHWASkE44j3pjPGFCvjjrQa/RS1R5LPcVWR49HDbASjLygmGNipUMKgW00VrziRFM551sfrgwR6mH9IVWtkIyenmwIbuQHDR4FchujfdfLOTyGBin6ekOIwfT4gKNo21H09D3vkfeuIjXlBhwnhn5B9yRPExrtnZE2RHA7mX7l7VwKWeOcs6+j0g1FCna2FWm4FIr/hMMTAcFjWmsuzaQdkC+B2ced2Rh/orw+s8MAtns5z+spxMhxwMv9huebDccWH4+GztiaP18yAdxuO5wefVRSt1rOLd9tW/jzYAkTXGxXZwjI5L1OzIGeJ/ejvhPBEDwGeG16jOd24ON71uIutg8RXMkBR2ravn8+6jockJgBmqYAzGhovaC3neWq3e1ZYn+E0gxIYqUql3vJaJRv0lPdZpEGAXfX7kt9ifvaqfIUBHgpGJOxZjcuTB0D47aaKew4Tc5+0t5uvbuYkBzaVlbtgtYNNDOQy+XHYdcJ9HPEhsPv5svhXUL/41HpetNiu7AX46XJEyyHsxIgmDHQWh+vXYczyQSIWiFonHsn5UmPeRTrx9bpWeBcRi0mzjk5oJIXXLj1YxB3R1smDcjdJnurZoI1q8M5dnJjAODm6FR3Ruly/Dc1LoweX7YZzlgJf3DQZGUhfhbrXkr4Qn5ueHTNmqbxf3GcIAQCslxp3YxkIpOB0MuQ2TP/Sx7vG5llAhJA6ha958ZuxF+0QId20HwSNizI7CzdsmiIX4M8tAw5ptl5/h0k5iR8PHZ6jVZ+p5lP3bZrjQB7qOHOKeYUaZG+UovdIu79xMfJ6zx7UxhTrIMVxWE1zF06iGXVueMigEqdnj8s6lAR6kiLEKz1R97A+yjrYZSqQ/TuK6mVrZ0ZKFZ2fI733s0i+pnekD8u8rOVSA8qNguKrQnPcW7e1SyMTdZ6LO4b9skXLjLoUaj5CrJxtqlWWoZweqAvPCpnCSSffc8s8kJswS3L9iuDn20xqHjPTF16/1PvLWogUrYNY1FbFwuIT09c9gT2Mbj/YsmQi6X4s3UTLT/i2w/TJKATZnJB2IkE9jrpexgxO6XgTvPVSnWUqQQKjO9PoXJc5i/u+XX198xakWt9BttNZCRyISjs60rVLcicyjTFfKCkB21yKj+GtD/As1+cztZxgRdeWWjIqfEyPTSzo2z5DVDKuJEhi0nxQVVk+8BFqzpsBoyF8x6kZjhRBquXXcXTc9jI/Tc2cQXQ+PkdhMNWDiSQhzi3WpaKmv8sxkfjeXojMdIvkZ5g4T3mUY9vsCAyw0Dx7anUyAKg2gnK26Hn2g8cw6FlCB8JmngxufjLDQucOHT7IiX6McYDKB0q+qw3jslKaXtvSYrscaa/dy+Z+3Lf13JtoIu9ZlETRXLyQbBszpEfXfdup3Jvp3u4Qah23dDxo4dxeA7Y88vRlxwm37fs2YFh1l8akKcaNue8HRAXv1LrtI2bBAaIISZUKy6u4NyiU094lCfPd3qjsM392B8elm/aYDaxIPqfgYILz3BrH0MG0Y2Q/EKQYJawkc8L5tOqu+YRhGHMOGfPrcW64+i49vXCiMy4lCnnfi4G2H8eOTRgF79ZOzvRU5SNzIOM1lHcgdBHTUV2I88hChHkSikz5Xa0K6bgIxKV0PKrX7WmQUrwW5bFREb68i4Y+c+j2JK8RMiHic+D40yjvEWxaDI9fRmUEjPUee0jCEQtW4VsH4yuMuPxY8yGXHrZWhzJ3PwwaUmZGfUC281kfaZVdWIlyT50nXS/inoS+1XvMrb40Xfblrr6Ck+TT7nJyFgAYVPvzjrBFQw6yceCEqRF3pYlK2SHIo5XqDAnk2IorDxetD44ElKelIj5voxky5HqhuuVP0NKSi2NN+P70KYdJ9rQfTTRqi7vYv/zzII122a2BfL03mKErWyFmvOUhi5ZIgOYSepSZYh9vX5rPbDYa9WXPKRuojW1rweF67LJwmalValBcd5sfR17JtVFtYc/aZBUTrVxvSJvp6iWIF5/WZMaKu+4M7N6w72TDl3NnnKYQforhs5TSPGOqjFwO0EtmYvtdyp3uMjVBamMpNI/kkGIXdfbNw4DOO2VsF1P2bqVltO2ubJQaADjd5TFF0jSh16S8hqKPsAz+JKNup9k6tm+Lzq/Pte2uRX7eIwxv4kv1iVTH5iQ1ogsp7nZ2W+WJfD3PsyxeOnGGkk6kd245mF1dMH3Ao4B6bxFZ7tWKDGWHrnVEc9dkcJsrrdSxRfx+l6rynaMQEA9oDSIUQpNqkUfvBUnJoK9N8JDIPKpu9YQrz14mive1Qimu+ciSvcX9Hjjppg1U+QDkh3wIc7b0UBYLA2FhxYIIxe2+2Th66+KHQVaWbu10Taeg1tqwY7RMmlXa54XQDup3keOFUO9i9GYU212JIZn26Gaj306C0Fb8uNMfHA5o7b1tERtFFnp/RGm1aRDt4A5Facs+Ej1ojDPUfsTKdh6Oz8KIoh4UhtJjiHq470Se/7wlK4Xk9nlCEDzj7+JCLKtGo2f6kYnWOjxl7Kgq13A4L4VgzYrppFdbVJDzhin3vDCwmR/eeubNWzC8t0fS71TAHBBSPBZ8XBnv9qoE8kAcqSf9txVe9zGjEiPosOr6EFfRp+itamkSl4XHtKY0iTk2jgGxBUGUqAQN0sVwC5DoLbzt2NGJwtEvDAqDiG7iYWGoGMOXwp4YeHaCgCnp0dizde3zjB73csXQEnvglLeXFkMXNwMlGe8Bo9u9tAO8eFcW9YAr6QbHlbQBvGur2+e101icj/SCMQF9VjdR2NyiF/Ckihz0DeHW840rt+VQypq5KbkH53KTOA4olujzuAlcAoESt8tC8ljHZw3Zwdg6uHGjqmt0mVv3uQCsw1QLv/ZdOpN39X5G1K2ykfTpTWl19aQNP+Krh8uVpc7hjTEP/mwo6IrrjxnRSPR+b0dc5cWJv6cb4wSQx6gKM8HYk3xVUYDoFd2dQ9DBjMiSzw8smx+jeH2lXp0gjR8Azlq2QLepvAB0IAkD6l/bHdBxIXgnLF/hZ89AMHLFu+thyQNvxcD6+ftLa32N0faS0YI64duHxDnV99ye6mbtySMj0959MYhiThzdkx395vOU6Tqda5uQPFd813WCUjspPDroIXXYgyuWuGCdl1WHd0wMvZuuoOx4fwAqmR8fMduJpNBJULo8DZ2ZoHkET3x40JPCnr0NOL69bv6nYZK7oGldur4LGiTF/SE2d1GdB+hdKokus5wJNjpwNQuIPQ8InQA0GNcCyXeyoDiz4mGyfPKTWa123GG6bCKrQH6Jv3Q6fjGz2dYFM7NcndQsMPul03869gWfp44fU8kU9ujPM/PgwIeDe0BQ6QaovaGkopKrjm1Tdu+5x7LfmOrJlFA2A/nPOlNxEp1RNyzxfNtwu+h5a0btG9Wiws+qD+ZU7xFLBq1lQfknbpakmEGON3jNPNvbxydxD4lE+bBvWdd6XJi61YfBrbc3yAkgmoICFC5BP1Wx8x3zJshq5gzUg9x1enXwqLCQqw8HaFrek84c3CNWl5Y2+ovMp/4D267Pu/X1UTs/050GE9XnboK4+ShHVdxKjVYkd5H62w2GYSz+fnE83jgUftxSwRAkzXxdqdRD4a1CfWJpJ91+suQyuCk4BFFkx73imM8huhlXiWfd+aGKDUgUR2d57+cH1EIVWREfKdled1YmVpx/7NccrgNlp+QlaeLbIGEBdj6AZVUYOCHh4yBouPOsVkBBmbdOPEIG5Zjs5zsP82EcBhaO0It7GAjjLi8KdEMR88WHrK3QDMRVsNocykWrLmfKFTosaEEbqcF6nMu1sgjEvmIW2zU2nmg267xkg8o++eC8EYQqxYHl5De7KjeMqdpDzqS82c6Rb3VZ2x87VbxXAmp1XVXZFuod+Yl3oss5LSQcgkrGejLOJLRHy/Ye7IysD4Ndb4BQ3iH9CePSKUmk45Dm13+RGEIG6eDVLWZitdPqlmcN9aWSkU6UhtRCkPNM8K3gLoWtOCt7muNo24TyMg96f290Frsdj9c6UqkUIzc0/J4ocDTYtmbPLY7QgvSXh38MRek8CebDakA65bEDky2vikJ8i/LQyyQZJz4xph6xasq1yjaqxoE9AKwnbnzjfqAJvU8voboGSX005EnkJyWF+htVoyKUj0/4PPhIUg/Ojbx7SeIIzM/V0/4+juAersZGXK5aCiMcztQ++SLC1Kl+PrbB2h53jIij3hJZ79sXe5ROd6X28fA2TpS5LrX9+9kQmTyo5cSNvqUipeEjm85lRibf3g1Fr5fsXpT9eTV2QQ4HkbwJYlxAMF9y9lmC976z1jdEQ89t+dyyhYcrWbGCd6pNFaBud/c02eP1M921RAJcy+VAIVOTNmwzedFfVGGjpXnedfpxFi9BFSyOKJ7IDdSvscC305fV8BPM2p1JJ44VRLh9KstN6MXwFTtjMB+3Ek4CL5LL7nLB8XKsZIaPpDFBniObsGNLxK8jAnVIvnZ5sorJV+IdxAjvXVLrvgC4WTqr9Sl8seepXuYksRPsrNStfIGZwoXcq7EL627ia90BBWBDhsuQrSXbZz1AGId4i0S4dGH36rqoL2IiqG3cJ1WzbNd1pK6TKBre3K+XsVDtTu+PpV34Dg9MQb3qfZyp+GZos4WbLnwImc9R16sCMU7KE6x0ITVO2bQIpsNWVVU0qD433/1vO0ZVZnHCoy9yQhxc/PXwdjnJ2UOwP8V+gkofmiD2PF93D0eAbEH4ADEp+Nbp8vgXY1wpinIQ91gxpm9S7PRCCZDDiiJf1tX6Ixw2KAHKTJVPFrWSsOYBJ7GmWCkK5JG/54fsEaxjQgKJj3XpUdgjtzGQCm/jGyynfXs/sOORbjI09ybXo0X8aIBPF2QeuhdPt4XScV5vPUAO3avZsubTtk5orqe2beMLfxJEUp67UatxUTTYJ3ldlL47bM2XGqnccJd3aS8mnBdUeQdrmDv/KN5H5UGfF20m8rkJr6h5Dfx3baTgIo4LSCwOVUY/XyAkplVSv/9qu757qsg+1FeCpQPZ3EDlWV10A6hHE1M7gpoAsILLQMZHbMiVlTMS1Vhmzyh7claHaKyraEVP0dctFQ9ogEM62G0WGfzcVnjOnZyl0qQGmcMoDLGBiV80UCLfmJHDpmEFz/gOvVjRcpf6FEpt+1kTWRKbuXdDEFBXiGJHsm9soSCbc1A3taLFnuHS170+e7bJE09JLQIpi2GWEci0n6JsRUq8vtkjULAhOF2suEtn3ujqlEtYLM83U4wjvKCscoXzsGXuRROq3MW8jftlR3g9Va8VghUanCPO9L6nIsEd0CtNiQzgf34KecPceB95GVqbDKEOx2ZwMIIF42H2jr71M05xz/flCyctOI1G+XpN+mc+SPa2Y6/7OzbeLfSk7r32aHcfe/GgLp9RFHvolslnHkvvE2DSe92jutM35MBzOerJQJhvqbNPvKeZ7CWkbJrc+6Ut6e51ke1jIJwn8N5CdSo1ZplXPfr8fCW8MHXSsoXLtwZ1Jgxy+RiQAq4EZr8oZQ/99o5s68Nv2wBggTqps6MRDijsN4hkGILOSkFj5ZZn3j0z9dkqlHjyysymbYv9Tqrd3mFu1+LpQJi1q0vupGZBmg57LIouZZH70KZ3EOTeEnnucrvXmbf4lx/cIO/LDUxm1al9Wu2P+FOcAejeC/I+wK7FYhANOQuabQ69UTfow6SsiRosybR4cPMkGVJx2zlL0YFovCsVtwxSb9Cnjvc1bfXFiFc9orFhxmvNcoqm8XW7fGO5xZNQs25LLGPLBDXz+WwTyC9hknoQ+zPlzXrXNPJ74fO6xHWE75o8//iwdsulTuRdz8F26mao7556hwSLKTUH9hVmPAhSzfcrvzCR3nz3+5WPGv5WwBncqw126PShsvtjJHGwZuNsTn5bOEkn8/NSrAFSyyt7q2HSnkyC5LIptAkn49ONqKUtkpJRuVdMrjKOcNAgObe6K+ICv0C8W3EwTJ3Zuh7HIh/3kjpS2YfbnebF9bYkY3LDQZbtbKq9GlZjw944YdTcXUy0/Vnyt6jZAEf1tGFJTySbS1R4dqdSIIXF8sHb1xVMc5k3tukT7pGkinT0EZuPBlCXpjNrTJpU3Gnj2hoPxdW4u+GlRX6J/T0evcoCtBLg4C2T0c3LIj/LnooIWXCYlLbDUbeI/1DyZiLfmDQBuQaywER8XGM+Z+YAkTCltJZqScKaiDCZ3qmIoBaqYkkVsZI8FQq+247jpgV6vi/ohWHpM8/G4RA4FfCSxMuNukj7XaaMwUsf72f65ZFFhLdjQBWAJycpyyJ+0b9uHeC2i7Jb8wIxweFE0b2hPqt8MvlpCb5IllF/GZoZ4QyiErX8bIBWR0XHBcJ9/DSyOY/icTDwU15Qf2M+0NgzOFEAJ3CFRAGAKyoaeq+D7ArWcjhMuwck8hDfRB2FURIBuy/3zh3lSNje3Hogo0kseRLnInrMsz7tdQw/AmtSxmLXR+64oP4Dfs5RTk1C0Sja5yDXsUvByV6ODWWwBdv5qYZ8APeW1YS7aK2+R6nAt7nK9nN2X3liVxtTm+ynB6jmfUF5FL+70EuRUU1iAlTHn6HcauIwRcsOuBou8RfE1LbSJNn1Wi0OctdgcKXVWfc3vw1Yh0Bj9WjOPj04Jnjc0a3Crjv/AXwMSZpOXh+oCJTDtDDvjmmmUmFK3TAI42nzx248s67xdsM63FptVOLzgp0J1HrCbD2VfuL4+DodQMrB+Xlf7ikKrr9CPmXUi8SuC7W3lJQkz5m6d7Jr2ACZeTbmafzajVZtPsrkW9m6v7DdAeLqCYrd9EmxqO9e6MDcLM1IlTZ4TpsUxxeiIu3Qdt1aMFDpxM/nMyiPEi520rFIRrgcMD3WrIEDeCax1u/AskeTAMrv0G70uBY9WcuYx/eE4xcV0BNP+Ezu0iuTmymtARZuFGnsqirXgL432b3T2tDluYMpT8vwxTYBmKFsoMBRdnhdnKyZOJw3gLRjtDUISCF5P3O0Y1dJ2HFRMQRcWmu23C0wJuHGT3UCROWfre1+socTiUv/yPTkhmSsxmVwZDlOdX8mTGmP5XuhFkNSal49IRvxQV0RG13jwGs9DNldmjP3qaenaDpOAvAaLgQQI8k89d9ycmuodM7kbXXxjbZP0E/+PM43OCRVrV1e9yYLFU5cnFgzIFIHqoZ55YHaIAKaNgXfTVhtC405f+a5QIJyjqSjBkowCeZ5cCZ76OxTBBonOaTp1UjT3sQL9Pz++8Zq6AGSTud4xA7PThlKD80vyjf013a55awhT8ztAR7W6ZDIiddSX9FSoa9JAtLv42UkZGj+UgrzDKYjrPZMMOCnUHs/Lmbp3ZU3RbftQjZpnsGiXcRNmW5CmPry2kAptfUJ1wLOTQVbIB23K8hUJhkfNxypvlzGVt6YwRIFyKx8jbITfQT9o7FH6rOUVfVIHXx9v6vSVoLmYDXAPrPmvsDcTWH6rhsfKMi51ms0SQTaF4nSY1PM2KhmEaPnbtXOl4i5SW/4RlVACohpoqzUbhyfbftgXn04fR+HelzHB174YBNaTL58cY0eNB3gOO5Yo4LTBJHDysmU3nX3p5agFQKQqOQZoB0WptuA4JKSqxwA5FlQE8XbnX7etKUrFoEJiBkBlLNpZfgzHaYj4HOkaiNOU1nujO83DEFnx34Kfg6pakJpKRHUFAi+SH8/rOdJ0Pf2zN/vZweCGIj8mlx0EQ++uJBKw7CQSIKPYi6/sAAN4YHVNbSKAAkOTPl02p3CNLL0OiAFXC+VRuiGgtIboL5kreYnA+ApwQJAdNR5VXhxMBAkCz2q9wFMex8SoYGs8kCyedJUkGyYuo9HfWpULYgh4n1KTDvEdneNnEWC6LqVTTx+SFghgA7AIBDkSTWSUHn2j7h/nNEqmw/nBtFFiWtDuj+C+4LJDyEzgL6dXmI2VJh9ygbG0HKasmoXT89SZjsheFtxBI6VLg6qD+uevu0nuUjZOvqPyGcfLI229zRCUrlZ22WLF+MnHgG7QCdIz4mw7ZXTmk4xyEAt9PYevF9BHd5vLLKi1Dsh21fy7Ml7xNy2fpQ5pKhy6FptyGUVkc6sd24o882qSBeh3UqeHueA6A1joKE+3e99k05Dl7x5XqEdf1we1gf2c4xV9Mjns2UZd8Avx/V+g/Gr6J8odqrsNEaCM1cGmVJrxM/wCyQRLFtSGGd+IkK+pswNR/fiE+hnIC2lQU81j5FylEYyzpTeQnMQjLlo4lViqSrgq+vW+5IrbsV/3isFjdBAGfM+QG4OQNaCKWUsnaoHdPR+JwO8z9deAHtZUQAMllATi5xfQ2Ua/PGGRQJWPniKF2i+x0bNXrR+jI94gzFBLJ/CmHMffCpNQsGyzz08zUDmjpzjQKKguC2EqBUkuIVV6A2uAp/ZVLQSHpMMF/hxtOPjDbCqErYBR25VjErEJj2M8ja60iF+BrvG9LO1iqo6sfPOfuZCWTZQeSUbXxHdwK6BlY8gi1d7pyjqIroO6RnYUZRUeNQx4nlAAof61t7KT16Wpe8ZsTUKZyJU7Gh9cryByrLyKMC3NVB596IZ9lTfo88wHfeGPXIbyIGTgJ4vWnZBVJUR4PkgJub1q4W8Lz47sJN714KWsy6yAX82m6IEJCPbEARdxF1qAO+SthsJtFhDD6QduUufPJTAcsQOAbnlgUJzvdEBRa7bvqzrpaeBbaidbxPVG6GKHc9OV0iyVwpAAcPfVz3FIjYidMk8yBNwnue6PnKWNRmGOY5ryC/MRuA8Woen5jkGO////X3sr8ZmFTaoxd/OAYDy5jACK16h06OuvNr1f+PeFfb3e1d/v3f193tXf7939fd7V3+/d/X3e1d/v3f193tXf7939fd7V3+/d/X3e1d/v3f1/+XelfQ8/3zvKr73h2Lf02qcKWg+hRwaLsPg+vLqX40Is9Rh3w2W0O7Bg5OvPF/ufsFPInyneuvlD4s1sy/OHy/13PzThe5FPkWXlE1+E8u1V2MudwmKZzU1hrxkZL88Ouk/ydUNhWQGCFzh1UuoaGQ7H0lHCmK2pNCiR+/n2Kf0ey9oGq5uulmchOxA6s7BXEBwlVOLjC0Gh1o4LMcAzv8hOEdoRIZXgoMFzRL4MDgIz2EbhGGVz/+qD3tGJ5/T7o0gTMDzI2zMvPW+RruyLsRuSAvC29El530nThLLytYzQdmQy7Z4RbLzrrtGE2p+FEU0kesSSrbD4iKOcJb8kXHkJ4jjp8LmDWMrAr1Xge/6thIvkrVm2CYECGE+HmvNtYtay+zZ6u97SJf4BpYK6R/W/N5belDpDD1fDECHHtEl4el5kuqxqsrVJrEHWkexE99+jHpRJ0XYMEHwLPfkRTdJm1ud8/U9J5/b++0TLBUrDSdq9EqX6K3V1YlTLe77/Ddx+ADGiFpUhafNAQ0M5tiDPYWNfcjuyPe7smq7PisFVfYYmoi84ZZpnnHFGmb+vQek0SNM2e8Vup1gL64wVd/v3fOTHrrdySDlqMVzw4yprZNmkr0uFd9PgrLt58ehIY2slr3VFWewKWsoUaAZZYRtBtn9gLBM0RHjIemQhY9TA19gRnq78ptJVkzJs15999IwSsLOz7j53g8wqAWTX+j5i5WGt1ewYeF3BpE2IV+HcPeOb/5NVBvAMSRGy2eHDoFKufOHfE8z6R0DKJhwKdk5str0eD20oVVYwrE71DGh506/6Z3ArGdJtSJumD3rIkFuIkFU+pbgIqqG2oCgMJAiTcPzMZMYRNNBVrGCw1EUBDt7h24DWvXIMUzli4qkUPrAjlsUSM/dlK0fIusOpAZbK8lWoxZCcbM8tFkziMn3e93Lrj4hF/QXtSz0O7MObhEIup0pe7wou544UWYTr1XPu+pyrMy5LK9P0/dMW5lN094tbEQ/oxd2pFIYQyikLcM3lg6BNTEjs4AMZoPCco258Awuaa6PZiLn0WmOqYWAQ5QQhnYoEQBJfq305+Kbn5/VeM/s0fit3opuSwi1PQ+DHR55IN1QA0jXz6PYZeLz3Nc57/giWqSEfk4SYBSPO3qLgMJxVC2UX0nzVGbre3/khlFFkReO8jxQNbHkk9WbiN8i4AeubXX2BfAAzCOYNgF4UsKrrgvmpFKDffEgRo4na2baOnhvMulfd6iqtoMgELzqHXD+wyppDBsR+eRkkktJcFUCGj1St/R1ZNua4c+bkKYe8M3x0F/+ob8pobAQFGWCwq6XdsrPQzFer2eff7/Dfum65L8h5MObEoyyiH0icgpp3gJqiE3i73P7bnO70yRjp0s2bFexXq2+3GxN41msvosJ/dovw6oW43T1n/BBXPpue5Q4WBTxaWbn1AgpEKOI2bFH5AL/XfZz0KaMbRzHUcRjhhmSr2x6w2jRPeTvHatOrDtRhZUjlnP5Ylseo7J5eI3D90/alzv/eojn954WyFPhoo3vMwE0Mfe7kUSEw1L3tMBi5RheZjzTJZXnvB94DkE/1zfMCTh5JK+7LuXAB02dK2YwI1R+2s9JB2PlB0uC2CWQnDuUYcm4xGtAzoldh3Sv+0MVv89tvPV7pySzZBrWGPgy9oUWTPYM9TmcnaKI3/AcxYdhcgbYVDUh627CfKKyXqS42LYAsz0m3o/HAyn7cJJbnW/j62ojv+ciKVsWtfli5GG7pyedsnp6vOqBhBEdlQ805FYazOsim3lwXHHYhzN4WgQqMj3A/qxZlmWFMPzRgFhLpO4O9tDcF5x/tQdIFVAsI9RHBNfquj6U2HgDmG2EFNDexuGPBxeL+vc5vVVUkr+ixa4p0A2FkmdpIXgAWIGfz1zCmvvFs5nweAdu7p3APwpye6d7sET+ur4nEWIXQDk4aaKfQNpU8Cfv9NK1blJ7t3zSswSxdPnA9vRReLUf+XwlPhW7YOcrxRltttv7vlMpWvlLdLS245gqYgV3skVQ0SFFPh50d9FusT/zVZtsauj5C+ov2DdXK4F+ixiLlbUoHowjuCk9anRYaDtJ0YxWBTp2GOpe2HhRLtS6YGXHfOAShnEMYJ3FxSgM4JNwmtAwCgnFdUJmiIhq2VfTxgSRx63hWip67ckV6Wg5XHt83SOGj8UQxIfW3bdCmW4yjNMbvqKA1aGYk1BqpyoJHxTm1IfzQ/9eXk1BHp/KG/zsm06+s2HOZAJWkmLH9OPOAMWajFhdBao7tftzpqKOkj46W4R3li52PIDH7M5fMkmS9KPuTtg45EnKi4BLn7v1pIcl5SQz6kf4nZMowJ8R4WMeNU8I9y0WAzmCvz6V77Eaix+hUwdlQb3d4LFtKCs6X584arraq+9/OI3hoqPOq0oQ+oxxGpP3NGKq41yQK7x9L1m6QKRNjCkv76oJf3StMmxAXEw9DaSVJBns5zrSt+hjXhz4p7tfo4cU6vmA1AGCqZBhK73cCFlUOVb9PtdPbgAvimCi9OfTJ/i1EaqqUkzK2AWAAAcQ6nO9Qni9eS++djkxzIPHg77dQiryqXRdYNDVHg8+VjuiFkorQ7u73EwZvM9ZP4Qx5+pcHmz463Uv+dfz3d/D9Lr7V43JSXvqNZgDFJ7Tlofq4APWwr9H9fhidB/yjSe537vQRokTWA5D58gTAfe9M5hnl+1dJlBk501JMOdp8z37FIWruIFyBKFH2KAi3jpLrbisiEA8iY9dvvZWu+gMqeA/PTv9YpxGkgS7", 16000); + memcpy_s(_notifybardesktop + 16000, 12420, "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", 12420); + ILibDuktape_AddCompressedModuleEx(ctx, "notifybar-desktop", _notifybardesktop, "2026-02-14T15:40:48.000+01:00"); free(_notifybardesktop); // proxy-helper, refer to modules/proxy-helper.js diff --git a/modules/monitor-border.js b/modules/monitor-border.js index fcc0985b1..163f5e0fa 100644 --- a/modules/monitor-border.js +++ b/modules/monitor-border.js @@ -127,6 +127,7 @@ function windows_monitorborder() }, 450); }); } + this.Start(); } function linux_monitorborder() @@ -313,6 +314,7 @@ function linux_monitorborder() } self._timeout = setTimeout(self._isUnity ? self.unity_drawBorder : self.timeoutHandler, 400); } + this.Start(); } switch(process.platform) diff --git a/modules/notifybar-desktop.js b/modules/notifybar-desktop.js index 679a3c3f1..3886342d3 100644 --- a/modules/notifybar-desktop.js +++ b/modules/notifybar-desktop.js @@ -216,7 +216,7 @@ function windows_notifybar_system(title, tsid, options) var ret = {}; if (!options) { options = {}; } - var script = Buffer.from("require('notifybar-desktop').DefaultPinned=" + require('notifybar-desktop').DefaultPinned + ";require('notifybar-desktop')('" + title + "', " + JSON.stringify(options) + ").on('close', function(){process._exit();});require('DescriptorEvents').addDescriptor(require('util-descriptors').getProcessHandle(" + process.pid + ")).on('signaled', function(){process._exit();});").toString('base64'); + var script = Buffer.from("require('notifybar-desktop').DefaultPinned=" + require('notifybar-desktop').DefaultPinned + ";require('notifybar-desktop').MaxWidth=" + require('notifybar-desktop').MaxWidth + ";require('notifybar-desktop')('" + title + "', " + JSON.stringify(options) + ").on('close', function(){process._exit();});require('DescriptorEvents').addDescriptor(require('util-descriptors').getProcessHandle(" + process.pid + ")).on('signaled', function(){process._exit();});").toString('base64'); require('events').EventEmitter.call(ret, true) .createEvent('close') @@ -267,15 +267,28 @@ function windows_notifybar_local(title, bar_options) { monWidth = (m[i].right - m[i].left); monHeight = (m[i].bottom - m[i].top); - barWidth = Math.floor(monWidth * 0.30); - barHeight = Math.floor(monHeight * 0.035); - if (m[i].dpi != null) - { + + if (m[i].dpi == null) { + barWidth = Math.floor(monWidth * 0.30); + barHeight = Math.floor(monHeight * 0.035); + } else { barHeight = Math.floor(m[i].dpi / 3); barWidth = Math.floor(m[i].dpi * 9); if (barWidth > monWidth) { barWidth = monWidth; } if (barWidth > (monWidth * 0.45)) { barWidth = monWidth * 0.45; } } + + // Maximum bar width override + if (module.exports.MaxWidth > 0) { + if (barWidth > module.exports.MaxWidth) { + if (m[i].dpi != null) { + barWidth = Math.floor(module.exports.MaxWidth * m[i].dpi / 96); + } else { + barWidth = module.exports.MaxWidth; + } + } + } + console.info1('Monitor: ' + i + ' = Width[' + (m[i].right - m[i].left) + '] BarHeight[' + barHeight + '] BarWidth[' + barWidth + ']'); offset = Math.floor(monWidth * 0.50) - Math.floor(barWidth * 0.50); @@ -678,6 +691,7 @@ switch(process.platform) module.exports.system = windows_notifybar_system; module.exports.RGB = RGB; module.exports.DefaultPinned = true; + module.exports.MaxWidth = 0; break; case 'linux': case 'freebsd': From 3e6203d96b4d6993db9a3470e0a0f04ab7d26b6f Mon Sep 17 00:00:00 2001 From: Ylian Saint-Hilaire Date: Sun, 15 Feb 2026 16:27:07 -0800 Subject: [PATCH 10/68] Code safely fix --- meshcore/agentcore.c | 8 +++----- meshservice/MeshService.rc | Bin 12532 -> 12536 bytes microscript/ILibDuktape_Commit.h | 6 ++++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/meshcore/agentcore.c b/meshcore/agentcore.c index fc1b6ad8d..12a817ba1 100644 --- a/meshcore/agentcore.c +++ b/meshcore/agentcore.c @@ -4131,11 +4131,9 @@ void MeshServer_ConnectEx(MeshAgentHostContainer *agent) } // Set User-Agent for proxies to identify agents and versions - const char* FieldData = "MeshAgent "; - char combined[40]; - strcpy(combined, FieldData); - strcat(combined, SOURCE_COMMIT_DATE); - ILibAddHeaderLine(req, "User-Agent", 10, combined, (int)strnlen_s(combined, 50)); + char combined[sizeof("MeshAgent ") + sizeof(SOURCE_COMMIT_DATE)]; + int combinedLen = sprintf_s(combined, sizeof(combined), "MeshAgent %s", SOURCE_COMMIT_DATE); + ILibAddHeaderLine(req, "User-Agent", 10, combined, combinedLen); free(path); diff --git a/meshservice/MeshService.rc b/meshservice/MeshService.rc index dddc69bd0bcdda7e872db57c82757ccc007374bc..89631d2870ead49a430802435fa0de81544287c5 100644 GIT binary patch delta 97 zcmey8_#<(H2EV!)gD!&`Ln=cOkTzs6VNhT&0zxYwHU^Vs4B89^42GM1`Mnv5R=iih GTmb-Bj1Rm3 delta 105 zcmey7_$6_J2EVE)gD!(FLn1>FkTzpbU@&4ZWUyi|W-temhCouA!GOVF@<9RV$s1TX VCI<-eZEoO~VkA!6=7R#}3IJgZ6I%cP diff --git a/microscript/ILibDuktape_Commit.h b/microscript/ILibDuktape_Commit.h index 466f04fe7..5ee55f419 100644 --- a/microscript/ILibDuktape_Commit.h +++ b/microscript/ILibDuktape_Commit.h @@ -1,3 +1,5 @@ // This file is auto-generated, any edits may be overwritten -#define SOURCE_COMMIT_DATE "2026-Feb-12 18:32:43+0100" -#define SOURCE_COMMIT_HASH "609a2ce4c4dd237eeebb86df9fafef6f6bc73949" +#define SOURCE_COMMIT_DATE "2026-Feb-14 22:23:26+0100" +#define SOURCE_COMMIT_DATE "2026-Feb-14 22:23:26+0100" +#define SOURCE_COMMIT_HASH "4f9692cee465d489072c5be74f8e17a6c676ed76" +#define SOURCE_COMMIT_HASH "4f9692cee465d489072c5be74f8e17a6c676ed76" From 4a349669e299c6df69d5f22a5e329b99d9a34b9f Mon Sep 17 00:00:00 2001 From: Josiah Baldwin Date: Sun, 15 Feb 2026 16:33:12 -0800 Subject: [PATCH 11/68] Feat/agent validate webcert (#259) * Fix strcat_s implementation Old implementation didn't work, it would crash when it tried to dereference and set a null pointer (*x = i). This version works by setting the default size to destinationSize, so it will throw in the later check if no \0 is found. This function is otherwise unused in the code. * Added function to load certs from the system Windows doesn't respect the openssl standard, so that needed to be handled manuall. Since this project uses a statically linked openssl, the default locations may be inaccurate. If that directory doesn't exist, it tries to get it from the system openssl via a popen. If that also fails, it will not be able to load system certs. * Added system cert loading wherever an SSL context is established * Modified OnHttpsConnection callback so the binder can pass general data to the callback. This was necessary to get a handle on the agent during the connection callback. * Added check for validateWebCert config option This will cause the connection to fail if the value is set and the agent attempts to connect to a server with an invalid web certificate * Fixed some handling of rejectUnauthorized in duktape net handler Before it would override any user defined checks; now it will foil to connect if the system certs don't match, but will still run user checks if it passes those. * Added validatewebcert arg to meshcmd.js This will cause rejectUnauthorized to be true if you pass it in * Updated default recovery core to check for the "validateWebCert" option and use rejectUnauthorized if it is set. --- meshcore/agentcore.c | 12 +++++-- microscript/ILibDuktape_net.c | 6 ++-- microstack/ILibCrypto.c | 65 ++++++++++++++++++++++++++++++++++ microstack/ILibCrypto.h | 1 + microstack/ILibParsers.c | 10 +++--- microstack/ILibWebClient.c | 9 +++-- microstack/ILibWebClient.h | 4 +-- microstack/ILibWebServer.c | 1 + microstack/ILibWrapperWebRTC.c | 1 + modules/RecoveryCore.js | 2 +- modules/meshcmd.js | 5 +-- 11 files changed, 99 insertions(+), 17 deletions(-) diff --git a/meshcore/agentcore.c b/meshcore/agentcore.c index 12a817ba1..4e215bfbc 100644 --- a/meshcore/agentcore.c +++ b/meshcore/agentcore.c @@ -4351,8 +4351,14 @@ void MeshServer_Connect(MeshAgentHostContainer *agent) } #ifndef MICROSTACK_NOTLS -int ValidateMeshServer(ILibWebClient_RequestToken sender, int preverify_ok, STACK_OF(X509) *certs, struct sockaddr_in6 *address) +int ValidateMeshServer(ILibWebClient_RequestToken sender, int preverify_ok, STACK_OF(X509) *certs, struct sockaddr_in6 *address, MeshAgentHostContainer *agent) { + int len = ILibSimpleDataStore_Get(agent->masterDb, "validateWebCert", ILibScratchPad, sizeof(ILibScratchPad)); + // Values here are 0 terminated, but the 0 is counted in size, so add one to the length check. + if ((len == 2 && strncmp("1", ILibScratchPad, 1) == 0) || + (len == 5 && strncmp("true", ILibScratchPad, 4) == 0)) { + return preverify_ok; + } // Server validation is always true here. We will do a second round within the websocket to see if the server is really valid or not. return 1; } @@ -5330,10 +5336,10 @@ int MeshAgent_AgentMode(MeshAgentHostContainer *agentHost, int paramLen, char ** #ifndef MICROSTACK_NOTLS if (agentHost->selftlscert.x509 == NULL) { // We don't have a TLS certificate, so setup the client without one. - ILibWebClient_EnableHTTPS(agentHost->httpClientManager, NULL, NULL, ValidateMeshServer); + ILibWebClient_EnableHTTPS(agentHost->httpClientManager, NULL, NULL, ValidateMeshServer, agentHost); } else { // We have a TLS certificate, use it for HTTPS client side auth (not super useful). - ILibWebClient_EnableHTTPS(agentHost->httpClientManager, &(agentHost->selftlscert), agentHost->selfcert.x509, ValidateMeshServer); + ILibWebClient_EnableHTTPS(agentHost->httpClientManager, &(agentHost->selftlscert), agentHost->selfcert.x509, ValidateMeshServer, agentHost); } #endif diff --git a/microscript/ILibDuktape_net.c b/microscript/ILibDuktape_net.c index ce9bac03d..252d7183c 100644 --- a/microscript/ILibDuktape_net.c +++ b/microscript/ILibDuktape_net.c @@ -2107,7 +2107,7 @@ int ILibDuktape_TLS_verify(int preverify_ok, X509_STORE_CTX *storectx) duk_push_heapptr(data->ctx, data->object); // [Socket] duk_get_prop_string(data->ctx, -1, ILibDuktape_SOCKET2OPTIONS); // [Socket][Options] - if (Duktape_GetBooleanProperty(data->ctx, -1, "rejectUnauthorized", 1)) { duk_pop_2(data->ctx); return(preverify_ok); } + if (Duktape_GetBooleanProperty(data->ctx, -1, "rejectUnauthorized", 1) && preverify_ok != 1) { duk_pop_2(data->ctx); return(preverify_ok); } void *OnVerify = Duktape_GetHeapptrProperty(data->ctx, -1, "checkServerIdentity"); if (OnVerify == NULL) { duk_pop_2(data->ctx); return(1); } @@ -2137,7 +2137,7 @@ int ILibDuktape_TLS_server_verify(int preverify_ok, X509_STORE_CTX *storectx) duk_push_heapptr(data->ctx, data->self); // [Server] duk_get_prop_string(data->ctx, -1, ILibDuktape_SERVER2OPTIONS); // [Server][Options] - if (Duktape_GetBooleanProperty(data->ctx, -1, "rejectUnauthorized", 1)) { duk_pop_2(data->ctx); return(preverify_ok); } + if (Duktape_GetBooleanProperty(data->ctx, -1, "rejectUnauthorized", 1) && preverify_ok != 1) { duk_pop_2(data->ctx); return(preverify_ok); } void *OnVerify = Duktape_GetHeapptrProperty(data->ctx, -1, "checkClientIdentity"); if (OnVerify == NULL) { return(1); } @@ -2702,6 +2702,8 @@ duk_ret_t ILibDuktape_TLS_createSecureContext(duk_context *ctx) SSL_CTX_use_PrivateKey(ssl_ctx, cert->pkey); } + util_load_system_certs(ssl_ctx); + return(1); } duk_ret_t ILibDuktape_TLS_generateCertificate(duk_context *ctx) diff --git a/microstack/ILibCrypto.c b/microstack/ILibCrypto.c index e344a00a9..28c31cee2 100644 --- a/microstack/ILibCrypto.c +++ b/microstack/ILibCrypto.c @@ -61,6 +61,7 @@ void BCRYPT_FINAL(char *h, BCRYPT_CTX* ctx) #include "microstack/nossl/sha1.h" #include "microstack/nossl/sha.h" #include +#include #endif #endif @@ -518,6 +519,70 @@ void __fastcall util_openssl_uninit() #endif } +int __fastcall util_load_system_certs(SSL_CTX *ctx) +{ + #ifdef WIN32 + X509_STORE *xs = SSL_CTX_get_cert_store(ctx); + HCERTSTORE s = CertOpenSystemStoreW(0, L"ROOT"); + BIO *in; + X509 *x; + const CERT_CONTEXT *wctx = NULL; + for (;;) { + wctx = CertEnumCertificatesInStore(s, wctx); + if (!wctx) + break; + in = BIO_new_mem_buf(wctx->pbCertEncoded, wctx->cbCertEncoded); + x = d2i_X509_bio(in, NULL); + X509_STORE_add_cert(xs, x); + X509_free(x); + BIO_free(in); + } + + CertFreeCertificateContext(wctx); + CertCloseStore(s, 0); + #else + const char *cert_dir = X509_get_default_cert_dir(); + struct stat s; + int err = stat(cert_dir, &s); + // The system we are on uses a different SSL dir than our statically included openssl. Try to grab it from the locally installed openssl distribution. + if (err == -1) { + char buf[1024] = {0}; + char dest[1024] = {0}; + + FILE *output; + if ((output = popen("openssl version -d", "r")) == NULL) { + return -1; + } + char *tokenized; + while (fgets(buf, 1024, output) != NULL) { + tokenized = strtok(buf, "\""); + while(tokenized != NULL) { + if (tokenized[0] == '/') { + strcat_s(dest, sizeof(dest), tokenized); + strcat_s(dest, sizeof(dest), "/certs"); + // Some systems use a /certs dir, some don't. Test for both. + err = stat(dest, &s); + if (err) { + SSL_CTX_load_verify_locations(ctx, NULL, tokenized); + } else { + SSL_CTX_load_verify_locations(ctx, NULL, dest); + } + break; + } + tokenized = strtok(NULL, "\""); + } + } + if (pclose(output)) { + return -1; + } + } else { + SSL_CTX_set_default_verify_paths(ctx); + } + #endif + return 0; + +} + // Add extension using V3 code: we can set the config file as NULL because we wont reference any other sections. int __fastcall util_add_ext(X509 *cert, int nid, char *value) { diff --git a/microstack/ILibCrypto.h b/microstack/ILibCrypto.h index 9dab77275..50ba1bd71 100644 --- a/microstack/ILibCrypto.h +++ b/microstack/ILibCrypto.h @@ -143,6 +143,7 @@ typedef enum CERTIFICATE_TYPES void __fastcall util_openssl_init(); void __fastcall util_openssl_uninit(); +int __fastcall util_load_system_certs(SSL_CTX *ctx); void __fastcall util_free(char* ptr); // Certificate & crypto methods diff --git a/microstack/ILibParsers.c b/microstack/ILibParsers.c index d18eaf356..15ea2a1af 100644 --- a/microstack/ILibParsers.c +++ b/microstack/ILibParsers.c @@ -9405,14 +9405,14 @@ char* ILibString_Cat_s(char *destination, size_t destinationSize, char *source) { size_t sourceLen = strnlen_s(source, destinationSize); size_t i; - size_t *x = NULL; + size_t x = destinationSize; for (i = 0; i < destinationSize - 1; ++i) { - if (destination[i] == 0) { *x = i; break; } + if (destination[i] == 0) { x = i; break; } } - if (x == NULL || ((*x + sourceLen + 1 )> destinationSize)) { ILIBCRITICALEXIT(254); } - memcpy_s(destination + *x, destinationSize - *x, source, sourceLen); - destination[*x + sourceLen] = 0; + if (((x + sourceLen + 1 )> destinationSize)) { ILIBCRITICALEXIT(254); } + memcpy_s(destination + x, destinationSize - x, source, sourceLen); + destination[x + sourceLen] = 0; return(destination); } #ifndef WIN32 diff --git a/microstack/ILibWebClient.c b/microstack/ILibWebClient.c index 3e21e106c..c68dd1d91 100644 --- a/microstack/ILibWebClient.c +++ b/microstack/ILibWebClient.c @@ -177,6 +177,7 @@ struct ILibWebClientManager SSL_CTX *ssl_ctx; ILibWebClient_OnSslConnection OnSslConnection; ILibWebClient_OnHttpsConnection OnHttpsConnection; + void *OnHttpsConnectionData; int EnableHTTPS_Called; #endif @@ -3541,7 +3542,7 @@ static int ILibWebClient_Https_AuthenticateServer(int preverify_ok, X509_STORE_C if (wcdo->Parent->OnHttpsConnection != NULL) { STACK_OF(X509) *certChain = X509_STORE_CTX_get_chain(ctx); - retVal = wcdo->Parent->OnHttpsConnection(token, preverify_ok, certChain, &(wcdo->remote)); + retVal = wcdo->Parent->OnHttpsConnection(token, preverify_ok, certChain, &(wcdo->remote), wcdo->Parent->OnHttpsConnectionData); //sk_X509_free(certChain); } SSL_TRACE2("ILibWebClient_Https_AuthenticateServer()"); @@ -3554,7 +3555,7 @@ void ILibWebClient_SetTLS(ILibWebClient_RequestManager manager, void *ssl_ctx, I wcm->ssl_ctx = (SSL_CTX*)ssl_ctx; wcm->OnSslConnection = OnSslConnection; } -int ILibWebClient_EnableHTTPS(ILibWebClient_RequestManager manager, struct util_cert* leafCert, X509* nonLeafCert, ILibWebClient_OnHttpsConnection OnHttpsConnection) +int ILibWebClient_EnableHTTPS(ILibWebClient_RequestManager manager, struct util_cert* leafCert, X509* nonLeafCert, ILibWebClient_OnHttpsConnection OnHttpsConnection, void* OnHttpsConnectionData) { SSL_CTX* ctx; if (((struct ILibWebClientManager *)manager)->ssl_ctx != NULL) // SSL Context was already previously set @@ -3583,6 +3584,9 @@ int ILibWebClient_EnableHTTPS(ILibWebClient_RequestManager manager, struct util_ SSL_CTX_add_extra_chain_cert(ctx, X509_dup(nonLeafCert)); } } + + util_load_system_certs(ctx); + SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, ILibWebClient_Https_AuthenticateServer); // Ask for server authentication if (ILibWebClientDataObjectIndex < 0) @@ -3592,6 +3596,7 @@ int ILibWebClient_EnableHTTPS(ILibWebClient_RequestManager manager, struct util_ ((struct ILibWebClientManager *)manager)->ssl_ctx = ctx; ((struct ILibWebClientManager *)manager)->OnHttpsConnection = OnHttpsConnection; + ((struct ILibWebClientManager *)manager)->OnHttpsConnectionData = OnHttpsConnectionData; ((struct ILibWebClientManager *)manager)->EnableHTTPS_Called = 1; SSL_TRACE2("ILibWebClient_EnableHTTPS()"); return 0; diff --git a/microstack/ILibWebClient.h b/microstack/ILibWebClient.h index 61303af1a..c4eee8915 100644 --- a/microstack/ILibWebClient.h +++ b/microstack/ILibWebClient.h @@ -145,7 +145,7 @@ typedef void(*ILibWebClient_OnDisconnect)(ILibWebClient_StateObject sender, ILib #ifndef MICROSTACK_NOTLS typedef int(*ILibWebClient_OnSslConnection)(ILibWebClient_StateObject sender, STACK_OF(X509) *certs, struct sockaddr_in6 *address, void *user); -typedef int(*ILibWebClient_OnHttpsConnection)(ILibWebClient_RequestToken sender, int preverify_ok, STACK_OF(X509) *certs, struct sockaddr_in6 *address); +typedef int(*ILibWebClient_OnHttpsConnection)(ILibWebClient_RequestToken sender, int preverify_ok, STACK_OF(X509) *certs, struct sockaddr_in6 *address, void *data); #endif // @@ -273,7 +273,7 @@ typedef enum ILibWebClient_RequestToken_HTTPS #ifndef MICROSTACK_NOTLS void ILibWebClient_SetTLS(ILibWebClient_RequestManager manager, void *ssl_ctx, ILibWebClient_OnSslConnection OnSslConnection); -int ILibWebClient_EnableHTTPS(ILibWebClient_RequestManager manager, struct util_cert* leafCert, X509* nonLeafCert, ILibWebClient_OnHttpsConnection OnHttpsConnection); +int ILibWebClient_EnableHTTPS(ILibWebClient_RequestManager manager, struct util_cert* leafCert, X509* nonLeafCert, ILibWebClient_OnHttpsConnection OnHttpsConnection, void* OnHttpsConnectionData); void ILibWebClient_Request_SetHTTPS(ILibWebClient_RequestToken reqToken, ILibWebClient_RequestToken_HTTPS requestMode); void ILibWebClient_Request_SetSNI(ILibWebClient_RequestToken reqToken, char *host, int hostLen); #endif diff --git a/microstack/ILibWebServer.c b/microstack/ILibWebServer.c index 312b3f3ae..dd0089571 100644 --- a/microstack/ILibWebServer.c +++ b/microstack/ILibWebServer.c @@ -996,6 +996,7 @@ int ILibWebServer_EnableHTTPS(ILibWebServer_ServerToken object, struct util_cert SSL_CTX_set_options(ctx, SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER | SSL_MODE_ENABLE_PARTIAL_WRITE | SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3 | SSL_OP_NO_TLSv1); + util_load_system_certs(ctx); SSL_CTX_use_certificate(ctx, leafCert->x509); SSL_CTX_use_PrivateKey(ctx, leafCert->pkey); diff --git a/microstack/ILibWrapperWebRTC.c b/microstack/ILibWrapperWebRTC.c index 9f933cfbb..97b89e771 100644 --- a/microstack/ILibWrapperWebRTC.c +++ b/microstack/ILibWrapperWebRTC.c @@ -452,6 +452,7 @@ void ILibWrapper_WebRTC_InitializeCrypto(ILibWrapper_WebRTC_ConnectionFactoryStr factory->ctx = SSL_CTX_new(DTLS_method()); //SSL_CTX_set_ecdh_auto(factory->ctx, 1); // Turn on elliptic curve for dTLS, this is required starting with Firefox 39. (DEPRECATED for OpenSSL/1.1.x) #endif + util_load_system_certs(factory->ctx); if (ILibWrapper_WebRTC_ConnectionFactoryIndex < 0) { ILibWrapper_WebRTC_ConnectionFactoryIndex = SSL_CTX_get_ex_new_index(0, "ILibWrapper_WebRTC_ConnectionFactoryStruct index", NULL, NULL, NULL); diff --git a/modules/RecoveryCore.js b/modules/RecoveryCore.js index 762fa91f5..ae909b738 100644 --- a/modules/RecoveryCore.js +++ b/modules/RecoveryCore.js @@ -153,7 +153,7 @@ require('MeshAgent').AddCommandHandler(function (data) var xurl = getServerTargetUrlEx(data.value); if (xurl != null) { var woptions = http.parseUri(xurl); - woptions.rejectUnauthorized = 0; + woptions.rejectUnauthorized = global._MSH && (global._MSH().validateWebCert === "true"); //sendConsoleText(JSON.stringify(woptions)); var tunnel = http.request(woptions); tunnel.on('upgrade', function (response, s, head) diff --git a/modules/meshcmd.js b/modules/meshcmd.js index 47302ce80..de0596c48 100644 --- a/modules/meshcmd.js +++ b/modules/meshcmd.js @@ -133,6 +133,7 @@ function run(argv) { if (args.nocommander) { settings.noconsole = true; } if (args.lmsdebug) { settings.lmsdebug = true; } if (args.tls) { settings.tls = true; } + if (args.validatewebcert) { settings.validatewebcert = true; } if ((argv.length > 1) && (actions.indexOf(argv[1].toUpperCase()) >= 0)) { settings.action = argv[1]; } // Validate meshaction.txt @@ -623,7 +624,7 @@ function startMeshCommander() { } else { // If TLS is going to be used, setup a TLS socket var tls = require('tls'); - var tlsoptions = { host: webargs.host, port: webargs.port, secureProtocol: ((webargs.tls1only == 1) ? 'TLSv1_method' : 'SSLv23_method'), rejectUnauthorized: false }; + var tlsoptions = { host: webargs.host, port: webargs.port, secureProtocol: ((webargs.tls1only == 1) ? 'TLSv1_method' : 'SSLv23_method'), rejectUnauthorized: settings.validatewebcert == true }; ws.forwardclient = tls.connect(tlsoptions, function () { this.pipe(this.ws, { end: false }); this.ws.pipe(this, { end: false }); }); ws.forwardclient.ws = ws; } @@ -1394,7 +1395,7 @@ function OnTcpClientConnected(c) { options = http.parseUri(settings.serverurl + '?user=' + settings.username + '&pass=' + settings.password + '&nodeid=' + settings.remotenodeid + '&tcpport=' + settings.remoteport); } catch (e) { console.log('Unable to parse \"serverUrl\".'); process.exit(1); return; } options.checkServerIdentity = onVerifyServer; - options.rejectUnauthorized = false; + options.rejectUnauthorized = settings.validatewebcert == true; c.websocket = http.request(options); c.websocket.tcp = c; c.websocket.tunneling = false; From 62b206e0b485b296e8a73a6547cef02bbf5a2d62 Mon Sep 17 00:00:00 2001 From: gutschke Date: Sun, 15 Feb 2026 16:43:44 -0800 Subject: [PATCH 12/68] Force alignment of allocated memory to prevent segmentation faults on ARM systems (#224) * Force alignment of allocated memory. Without this change, I have noticed crashes on ARM based devices which have stricter alignment requirements than x86. Ideally, this code should be rewritten to pad the sizes of all "structs" and to consider all of the different architecture-specific alignment requirements. But in practice, I suspect that rounding up allocation sizes to a multiple of pointer sizes is likely good enough. This is a pragmatic one-line change that shouldn't break existing code and should prevent any of the crashes that I have observed. * Added a few more memory alignments when using both primary and extra memory in a back-to-back memory allocation. --- microstack/ILibParsers.c | 3 +++ microstack/ILibParsers.h | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/microstack/ILibParsers.c b/microstack/ILibParsers.c index 15ea2a1af..02eccb4c2 100644 --- a/microstack/ILibParsers.c +++ b/microstack/ILibParsers.c @@ -1036,6 +1036,8 @@ void* ILibMemory_SmartReAllocate(void *ptr, size_t len) size_t originalRawSize = ILibMemory_Init_Size(ILibMemory_Size(ptr), ILibMemory_ExtraSize(ptr)); size_t originalSize = ILibMemory_Size(ptr); size_t originalExtraSize = ILibMemory_ExtraSize(ptr); + if (originalExtraSize) + len = (len + sizeof(void *) - 1) & -sizeof(void *); size_t newRawSize = ILibMemory_Init_Size(len, originalExtraSize); if (newRawSize < originalRawSize && originalExtraSize > 0) @@ -1095,6 +1097,7 @@ void* ILibMemory_SmartAllocateEx_ResizeExtra(void *ptr, size_t newExtraSize) void* ILibMemory_Init(void *ptr, size_t primarySize, size_t extraSize, ILibMemory_Types memType) { if (ptr == NULL) { ILIBCRITICALEXIT(254); } + if (extraSize) primarySize = (primarySize + sizeof(void *) - 1) & -sizeof(void *); memset(ptr, 0, primarySize + extraSize + sizeof(ILibMemory_Header) + (extraSize > 0 ? sizeof(ILibMemory_Header) : 0)); void *primary = ILibMemory_FromRaw(ptr); diff --git a/microstack/ILibParsers.h b/microstack/ILibParsers.h index 604fcb544..be29a2b1d 100644 --- a/microstack/ILibParsers.h +++ b/microstack/ILibParsers.h @@ -480,7 +480,7 @@ int ILibIsRunningOnChainThread(void* chain); #define ILibMemory_FromRaw(ptr) ((char*)(ptr) + sizeof(ILibMemory_Header)) #define ILibMemory_Size_Validate(primaryLen, extraLen) (((size_t)(primaryLen)<(UINT32_MAX - (size_t)(extraLen)))&&((size_t)(extraLen)<(UINT32_MAX-(size_t)(primaryLen)))&&((size_t)((primaryLen) + (extraLen))<(UINT32_MAX - sizeof(ILibMemory_Header)))&&((extraLen)==0 || ((size_t)((primaryLen)+(extraLen)+sizeof(ILibMemory_Header))<(UINT32_MAX-sizeof(ILibMemory_Header))))) - #define ILibMemory_Init_Size(primaryLen, extraLen) (primaryLen + extraLen + sizeof(ILibMemory_Header) + (extraLen>0?sizeof(ILibMemory_Header):0)) + #define ILibMemory_Init_Size(primaryLen, extraLen) (primaryLen + extraLen + sizeof(ILibMemory_Header) + (extraLen>0?sizeof(ILibMemory_Header) + (((primaryLen + sizeof(ILibMemory_Header)) + sizeof(void *) - 1) & - sizeof(void *)):0)) void* ILibMemory_Init(void *ptr, size_t primarySize, size_t extraSize, ILibMemory_Types memType); #define ILibMemory_SmartAllocate(len) ILibMemory_InitEx(ILibMemory_Size_Validate(len,0)?malloc(ILibMemory_Init_Size(len, 0)):NULL, (int)len, 0, ILibMemory_Types_HEAP) #define ILibMemory_SmartAllocateEx(primaryLen, extraLen) ILibMemory_InitEx(ILibMemory_Size_Validate(primaryLen,extraLen)?malloc(ILibMemory_Init_Size(primaryLen, extraLen)):NULL, (int)primaryLen, (int)extraLen, ILibMemory_Types_HEAP) From c0faef27a89416db980849a86a1c3688fa7c7fcd Mon Sep 17 00:00:00 2001 From: Ylian Saint-Hilaire Date: Sun, 15 Feb 2026 16:54:10 -0800 Subject: [PATCH 13/68] Fixed compiler warnings --- meshservice/MeshService.rc | Bin 12536 -> 12536 bytes microscript/ILibDuktape_Commit.h | 8 ++++---- microstack/ILibParsers.c | 5 ++--- microstack/ILibParsers.h | 2 +- 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/meshservice/MeshService.rc b/meshservice/MeshService.rc index 89631d2870ead49a430802435fa0de81544287c5..38f1ff5173e139aaebf78a3f7bc0be7ecd28d15d 100644 GIT binary patch delta 81 zcmey7_#<(H8NZ|{g93vggBgPrg9(E%m^5L~WiVi{n0!z`dh!NVj>!Rne488iH5hR# K-F#5MTmb;p@(>vS delta 81 zcmey7_#<(H8NZ|ng93vQ5LyATF_<)C&}J}TFr0i)Kzi~9R*uO5f_$4B_%#@DE8Toh Hz+3?U(a{h4 diff --git a/microscript/ILibDuktape_Commit.h b/microscript/ILibDuktape_Commit.h index 5ee55f419..55b81d8ac 100644 --- a/microscript/ILibDuktape_Commit.h +++ b/microscript/ILibDuktape_Commit.h @@ -1,5 +1,5 @@ // This file is auto-generated, any edits may be overwritten -#define SOURCE_COMMIT_DATE "2026-Feb-14 22:23:26+0100" -#define SOURCE_COMMIT_DATE "2026-Feb-14 22:23:26+0100" -#define SOURCE_COMMIT_HASH "4f9692cee465d489072c5be74f8e17a6c676ed76" -#define SOURCE_COMMIT_HASH "4f9692cee465d489072c5be74f8e17a6c676ed76" +#define SOURCE_COMMIT_DATE "2026-Feb-15 16:43:44-0800" +#define SOURCE_COMMIT_DATE "2026-Feb-15 16:43:44-0800" +#define SOURCE_COMMIT_HASH "62b206e0b485b296e8a73a6547cef02bbf5a2d62" +#define SOURCE_COMMIT_HASH "62b206e0b485b296e8a73a6547cef02bbf5a2d62" diff --git a/microstack/ILibParsers.c b/microstack/ILibParsers.c index 02eccb4c2..096d867f3 100644 --- a/microstack/ILibParsers.c +++ b/microstack/ILibParsers.c @@ -1036,8 +1036,7 @@ void* ILibMemory_SmartReAllocate(void *ptr, size_t len) size_t originalRawSize = ILibMemory_Init_Size(ILibMemory_Size(ptr), ILibMemory_ExtraSize(ptr)); size_t originalSize = ILibMemory_Size(ptr); size_t originalExtraSize = ILibMemory_ExtraSize(ptr); - if (originalExtraSize) - len = (len + sizeof(void *) - 1) & -sizeof(void *); + if (originalExtraSize) { len = (len + sizeof(void *) - 1) & ~(sizeof(void *) - 1); } size_t newRawSize = ILibMemory_Init_Size(len, originalExtraSize); if (newRawSize < originalRawSize && originalExtraSize > 0) @@ -1097,7 +1096,7 @@ void* ILibMemory_SmartAllocateEx_ResizeExtra(void *ptr, size_t newExtraSize) void* ILibMemory_Init(void *ptr, size_t primarySize, size_t extraSize, ILibMemory_Types memType) { if (ptr == NULL) { ILIBCRITICALEXIT(254); } - if (extraSize) primarySize = (primarySize + sizeof(void *) - 1) & -sizeof(void *); + if (extraSize) primarySize = (primarySize + sizeof(void *) - 1) & ~(sizeof(void *) - 1); memset(ptr, 0, primarySize + extraSize + sizeof(ILibMemory_Header) + (extraSize > 0 ? sizeof(ILibMemory_Header) : 0)); void *primary = ILibMemory_FromRaw(ptr); diff --git a/microstack/ILibParsers.h b/microstack/ILibParsers.h index be29a2b1d..9279e3d57 100644 --- a/microstack/ILibParsers.h +++ b/microstack/ILibParsers.h @@ -480,7 +480,7 @@ int ILibIsRunningOnChainThread(void* chain); #define ILibMemory_FromRaw(ptr) ((char*)(ptr) + sizeof(ILibMemory_Header)) #define ILibMemory_Size_Validate(primaryLen, extraLen) (((size_t)(primaryLen)<(UINT32_MAX - (size_t)(extraLen)))&&((size_t)(extraLen)<(UINT32_MAX-(size_t)(primaryLen)))&&((size_t)((primaryLen) + (extraLen))<(UINT32_MAX - sizeof(ILibMemory_Header)))&&((extraLen)==0 || ((size_t)((primaryLen)+(extraLen)+sizeof(ILibMemory_Header))<(UINT32_MAX-sizeof(ILibMemory_Header))))) - #define ILibMemory_Init_Size(primaryLen, extraLen) (primaryLen + extraLen + sizeof(ILibMemory_Header) + (extraLen>0?sizeof(ILibMemory_Header) + (((primaryLen + sizeof(ILibMemory_Header)) + sizeof(void *) - 1) & - sizeof(void *)):0)) + #define ILibMemory_Init_Size(primaryLen, extraLen) (primaryLen + extraLen + sizeof(ILibMemory_Header) + (extraLen>0?sizeof(ILibMemory_Header) + (((primaryLen + sizeof(ILibMemory_Header)) + sizeof(void *) - 1) & ~(sizeof(void *) - 1)):0)) void* ILibMemory_Init(void *ptr, size_t primarySize, size_t extraSize, ILibMemory_Types memType); #define ILibMemory_SmartAllocate(len) ILibMemory_InitEx(ILibMemory_Size_Validate(len,0)?malloc(ILibMemory_Init_Size(len, 0)):NULL, (int)len, 0, ILibMemory_Types_HEAP) #define ILibMemory_SmartAllocateEx(primaryLen, extraLen) ILibMemory_InitEx(ILibMemory_Size_Validate(primaryLen,extraLen)?malloc(ILibMemory_Init_Size(primaryLen, extraLen)):NULL, (int)primaryLen, (int)extraLen, ILibMemory_Types_HEAP) From 9cb8ba17f75c4543d51cb25f07953fe6d364dda1 Mon Sep 17 00:00:00 2001 From: Ylian Saint-Hilaire Date: Sun, 15 Feb 2026 17:40:13 -0800 Subject: [PATCH 14/68] Security note --- microstack/ILibCrypto.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/microstack/ILibCrypto.c b/microstack/ILibCrypto.c index 28c31cee2..f18f86078 100644 --- a/microstack/ILibCrypto.c +++ b/microstack/ILibCrypto.c @@ -550,6 +550,8 @@ int __fastcall util_load_system_certs(SSL_CTX *ctx) char dest[1024] = {0}; FILE *output; + // Running "openssl version -d" should give us the directory of the locally installed openssl. We can then use that directory to load the certs from that distribution. + // However, this could be a security risk as we are running "openssl" as root. if ((output = popen("openssl version -d", "r")) == NULL) { return -1; } @@ -580,7 +582,6 @@ int __fastcall util_load_system_certs(SSL_CTX *ctx) } #endif return 0; - } // Add extension using V3 code: we can set the config file as NULL because we wont reference any other sections. From 8dece7db56c5dca48447e90f0f181af24f1ee352 Mon Sep 17 00:00:00 2001 From: Ylian Saint-Hilaire Date: Sun, 15 Feb 2026 21:00:38 -0800 Subject: [PATCH 15/68] Linux compile fix --- microstack/ILibCrypto.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/microstack/ILibCrypto.c b/microstack/ILibCrypto.c index f18f86078..0fc294b36 100644 --- a/microstack/ILibCrypto.c +++ b/microstack/ILibCrypto.c @@ -34,6 +34,9 @@ limitations under the License. #include #include #include +#ifdef _POSIX +#include +#endif #else #ifdef WIN32 void BCRYPT_INIT(BCRYPT_CTX* ctx, void* alg) From ca0ebf27a842323686a1960c56edb64125fee259 Mon Sep 17 00:00:00 2001 From: Simon Smith Date: Tue, 24 Mar 2026 16:11:36 +0000 Subject: [PATCH 16/68] Update README with supported agent keys table --- readme.md | 48 ++++++++++++++++++++++++++---------------------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/readme.md b/readme.md index 9b9d55bde..d80dfe918 100644 --- a/readme.md +++ b/readme.md @@ -34,28 +34,32 @@ MeshServer=wss://example.com:443/agent.ashx Here is a list of the possible keys that are currently supported by the agent. Note that the key name must have the exact capitalization: -``` -AgentCapabilities Integer Mask, specifying supported Agent Capabilities -agentName If set, this will be sent to the server instead of the hostname -compactDirtyMinimum Minimum dirty bytes threshold for db.compact() operation -controlChannelDebug If set, will log/display controlChannel messages (Except for JSON messages) -controlChannelIdleTimeout Integer value specifying the idle timeout in seconds, to send Ping/Pong to server, to keep connection alive -coreDumpEnabled If set, a dump file will be written when the agent crashes -disableUpdate If set, will prevent the agent from self-updating -noUpdateCoreModule If set, will prevent the agent from taking a new meshcore from the server -enableILibRemoteLogging Integer value specifying the port number to enable Web Logging. Disabled otherwise -fakeUpdate If set, when the agent self-updates, it will update to the same version. Will set disableUpdate upon completion -forceUpdate If set, will cause the agent to perform a self-update on next start. -ignoreProxyFile If set, will cause the agent to ignore any proxy settings -logUpdate If set, will cause the agent to log self-update status -jsDebugPort Specify a JS Debugger Port -nocertstore If set on Windows, will force the Agent to use OpenSSL instead of WinCrypto for cert generation/storage. -remoteMouseRender If set, will always render the remote mouse cursor for KVM -skipmaccheck If set, the agent will not change NodeID on local mac address changes. -showModuleNames If set, will display the name of modules when they are loaded for the first time -slaveKvmLog [Linux] If set, will enable logging inside the Child KVM Process. -WebProxy Manually specify proxy configuration -``` +| Option | Description | +|---|---| +| `AgentCapabilities` | Bitmask specifying supported agent capabilities. | +| `agentName` | If set, sent to the server instead of the hostname. | +| `compactDirtyMinimum` | Minimum dirty bytes threshold for the `db.compact()` operation. | +| `consoleTextMaxRate` | Rate limit for `sendConsoleText`. Default is 10 messages per second. | +| `controlChannelDebug` | If set, logs/displays control channel messages (except JSON messages). | +| `controlChannelIdleTimeout` | Idle timeout in seconds; sends Ping/Pong to server to keep connection alive. | +| `coreDumpEnabled` | If set, writes a dump file when the agent crashes. | +| `disableUpdate` | If set, prevents the agent from self-updating. | +| `noUpdateCoreModule` | If set, prevents the agent from accepting a new meshcore from the server. | +| `enableILibRemoteLogging` | Port number to enable web logging. Disabled if not set. | +| `fakeUpdate` | If set, agent self-updates to the same version. Sets `disableUpdate` on completion. | +| `forceUpdate` | If set, causes the agent to perform a self-update on next start. | +| `ignoreProxyFile` | If set, causes the agent to ignore any proxy settings. | +| `logUpdate` | If set, causes the agent to log self-update status. | +| `jsDebugPort` | Specifies a JS debugger port. | +| `maxLogSize` | Maximum size of the error log file. | +| `nocertstore` | Windows only. Forces the agent to use OpenSSL instead of WinCrypto for cert generation/storage. | +| `readonly` | If set, forces the agent to open the database in read-only mode. | +| `readmsh` | If set while db is in read-only mode, caches the local `.msh` file in the read-only db. | +| `remoteMouseRender` | If set, always renders the remote mouse cursor for KVM. | +| `showModuleNames` | If set, displays module names when loaded for the first time. | +| `skipmaccheck` | If set, the agent will not change NodeID on local MAC address changes. | +| `slaveKvmLog` | Linux only. Enables logging inside the child KVM process. | +| `WebProxy` | Manually specifies proxy configuration. | Many of these values are used by developers and are not typically used in normal use. From 1d3662ea44ace0213ade20311018c0c75139ccd3 Mon Sep 17 00:00:00 2001 From: Simon Smith Date: Sun, 26 Apr 2026 11:42:22 +0100 Subject: [PATCH 17/68] add mutliple monitor support to x11 for linux (#340) Signed-off-by: Simon Smith --- meshcore/KVM/Linux/linux_kvm.c | 280 +++++++++++++++++++++++++++------ 1 file changed, 234 insertions(+), 46 deletions(-) diff --git a/meshcore/KVM/Linux/linux_kvm.c b/meshcore/KVM/Linux/linux_kvm.c index 131c31fdf..79c740889 100644 --- a/meshcore/KVM/Linux/linux_kvm.c +++ b/meshcore/KVM/Linux/linux_kvm.c @@ -27,6 +27,7 @@ limitations under the License. #include #include #include +#include #include #include #include @@ -131,6 +132,17 @@ int slave2master[2]; char CURRENT_XDISPLAY[256]; int CURRENT_DISPLAY_ID = -1; +typedef struct kvm_monitor_info { int id, x, y, width, height; } kvm_monitor_info; +#define KVM_MAX_MONITORS 16 +kvm_monitor_info g_monitors[KVM_MAX_MONITORS]; +int g_monitor_count = 0; +int SCREEN_SEL = 0; // 0 = all monitors, 1..N = specific physical monitor +int SCREEN_SEL_TARGET = 0; +int CAPTURE_X = 0; // top-left of capture region (0 if all monitors) +int CAPTURE_Y = 0; +int VSCREEN_WIDTH = 0; // full virtual desktop width (all monitors combined) +int VSCREEN_HEIGHT = 0; + FILE *logFile = NULL; int g_enableEvents = 0; extern int gRemoteMouseRenderDefault; @@ -166,6 +178,16 @@ typedef struct xfixes_struct xfixes_struct *xfixes_exports = NULL; xkb_struct *xkb_exports = NULL; +typedef struct xrandr_struct +{ + void *xrandr_lib; + XRRScreenResources*(*XRRGetScreenResources)(Display *dpy, Window window); + void(*XRRFreeScreenResources)(XRRScreenResources *resources); + XRRCrtcInfo*(*XRRGetCrtcInfo)(Display *dpy, XRRScreenResources *resources, RRCrtc crtc); + void(*XRRFreeCrtcInfo)(XRRCrtcInfo *crtcInfo); +} xrandr_struct; +xrandr_struct *xrandr_exports = NULL; + void kvm_keyboard_unmap_unicode_key(Display *display, int keycode) { // Delete a keymapping that we created previously @@ -420,10 +442,13 @@ void kvm_send_resolution() void kvm_send_display() { - char buffer[5]; + char buffer[6]; + unsigned short sel = (g_monitor_count > 0) + ? ((SCREEN_SEL == 0) ? (unsigned short)65535 : (unsigned short)SCREEN_SEL) + : (unsigned short)CURRENT_DISPLAY_ID; ((unsigned short*)buffer)[0] = (unsigned short)htons((unsigned short)MNG_KVM_SET_DISPLAY); // Write the type - ((unsigned short*)buffer)[1] = (unsigned short)htons((unsigned short)5); // Write the size - buffer[4] = CURRENT_DISPLAY_ID; // Display number + ((unsigned short*)buffer)[1] = (unsigned short)htons((unsigned short)6); // Write the size + ((unsigned short*)buffer)[2] = (unsigned short)htons(sel); // Display selection ignore_result(write(slave2master[1], buffer, sizeof(buffer))); } @@ -444,9 +469,94 @@ int lockfileCheckFn(const struct dirent *ent) { return 0; } -void getAvailableDisplays(unsigned short **array, int *len) +// Enumerate physical monitors via XRandR into g_monitors[] and update capture region. +// Falls back gracefully if XRandR is unavailable. +static void kvm_enumerate_monitors() +{ + g_monitor_count = 0; + if (xrandr_exports != NULL && xrandr_exports->XRRGetScreenResources != NULL) + { + Window root = x11_exports->XRootWindow(eventdisplay, SCREEN_NUM); + XRRScreenResources *res = xrandr_exports->XRRGetScreenResources(eventdisplay, root); + if (res != NULL) + { + int mi; + for (mi = 0; mi < res->ncrtc && g_monitor_count < KVM_MAX_MONITORS; mi++) + { + XRRCrtcInfo *ci = xrandr_exports->XRRGetCrtcInfo(eventdisplay, res, res->crtcs[mi]); + if (ci != NULL) + { + if (ci->width > 0 && ci->height > 0) + { + g_monitors[g_monitor_count].id = g_monitor_count + 1; + g_monitors[g_monitor_count].x = ci->x; + g_monitors[g_monitor_count].y = ci->y; + g_monitors[g_monitor_count].width = (int)ci->width; + g_monitors[g_monitor_count].height = (int)ci->height; + g_monitor_count++; + } + xrandr_exports->XRRFreeCrtcInfo(ci); + } + } + xrandr_exports->XRRFreeScreenResources(res); + } + } + // Update the capture region based on current SCREEN_SEL + if (SCREEN_SEL > 0 && (SCREEN_SEL - 1) < g_monitor_count) + { + int idx = SCREEN_SEL - 1; + CAPTURE_X = g_monitors[idx].x; + CAPTURE_Y = g_monitors[idx].y; + SCREEN_WIDTH = g_monitors[idx].width; + SCREEN_HEIGHT = g_monitors[idx].height; + } + else + { + SCREEN_SEL = 0; + CAPTURE_X = 0; + CAPTURE_Y = 0; + SCREEN_WIDTH = VSCREEN_WIDTH; + SCREEN_HEIGHT = VSCREEN_HEIGHT; + } +} + +// Send MNG_KVM_DISPLAY_INFO: per-monitor geometry (ID, X, Y, W, H) matching Windows format. +void kvm_send_display_info() { int i; + int totalSize; + char *buffer; + if (g_monitor_count == 0) { return; } + totalSize = 4 + (g_monitor_count * 10); // 4-byte header + 10 bytes (5 shorts) per monitor + buffer = (char*)ILibMemory_SmartAllocate(totalSize); + ((unsigned short*)buffer)[0] = (unsigned short)htons((unsigned short)MNG_KVM_DISPLAY_INFO); + ((unsigned short*)buffer)[1] = (unsigned short)htons((unsigned short)totalSize); + for (i = 0; i < g_monitor_count; i++) + { + int base = 2 + (i * 5); // index into unsigned short array + ((unsigned short*)buffer)[base + 0] = (unsigned short)htons((unsigned short)g_monitors[i].id); + ((unsigned short*)buffer)[base + 1] = (unsigned short)htons((unsigned short)g_monitors[i].x); + ((unsigned short*)buffer)[base + 2] = (unsigned short)htons((unsigned short)g_monitors[i].y); + ((unsigned short*)buffer)[base + 3] = (unsigned short)htons((unsigned short)g_monitors[i].width); + ((unsigned short*)buffer)[base + 4] = (unsigned short)htons((unsigned short)g_monitors[i].height); + } + ignore_result(write(slave2master[1], buffer, ILibMemory_Size(buffer))); + ILibMemory_Free(buffer); +} + +void getAvailableDisplays(unsigned short **array, int *len) +{ + int i; + if (g_monitor_count > 0) + { + // XRandR mode: expose 65535 ("all") + 1-based physical monitor IDs + *len = g_monitor_count + 1; + if ((*array = (unsigned short *)malloc((*len) * sizeof(unsigned short))) == NULL) ILIBCRITICALEXIT(254); + (*array)[0] = (unsigned short)65535; // "all monitors" + for (i = 0; i < g_monitor_count; i++) { (*array)[i + 1] = (unsigned short)g_monitors[i].id; } + return; + } + // Legacy: X11 logical screens (usually just one) *len = x11_exports->XScreenCount(eventdisplay); if ((*array = (unsigned short *)malloc((*len) * sizeof(unsigned short))) == NULL) ILIBCRITICALEXIT(254); for (i = 0; i < (*len); ++i) @@ -462,21 +572,30 @@ void kvm_send_display_list() char* buffer; int totalSize = 0; int i; + unsigned short currentSel; + + kvm_send_display_info(); // Send per-monitor geometry (MNG_KVM_DISPLAY_INFO) first getAvailableDisplays(&displays, &len); - totalSize = 2 /*Type*/ + 2 /*length of packet*/ + 2 /*length of data*/ + (len * 2) /*Data*/ + 2 /* Current display */; + totalSize = 2 /*Type*/ + 2 /*length of packet*/ + 2 /*count*/ + (len * 2) /*IDs*/ + 2 /* Current display */; buffer = (char*)ILibMemory_SmartAllocate(totalSize); ((unsigned short*)buffer)[0] = (unsigned short)htons((unsigned short)MNG_KVM_GET_DISPLAYS); // Write the type ((unsigned short*)buffer)[1] = (unsigned short)htons((unsigned short)totalSize); // Write the size - ((unsigned short*)buffer)[2] = (unsigned short)htons((unsigned short)len); // Length - for (i = 0; i < len; i++) + ((unsigned short*)buffer)[2] = (unsigned short)htons((unsigned short)len); // Count + for (i = 0; i < len; i++) { ((unsigned short*)buffer)[i + 3] = (unsigned short)htons(displays[i]); } - ((unsigned short*)buffer)[i + 3] = (unsigned short)htons((unsigned short)CURRENT_DISPLAY_ID); // Current display + // Current selection: 65535 = all monitors, 1..N = specific monitor (matches Windows convention) + if (g_monitor_count > 0) + currentSel = (SCREEN_SEL == 0) ? (unsigned short)65535 : (unsigned short)SCREEN_SEL; + else + currentSel = (unsigned short)CURRENT_DISPLAY_ID; + ((unsigned short*)buffer)[i + 3] = (unsigned short)htons(currentSel); ignore_result(write(slave2master[1], buffer, ILibMemory_Size(buffer))); + free(displays); } char Location_X11LIB[NAME_MAX]; @@ -484,13 +603,15 @@ char Location_X11TST[NAME_MAX]; char Location_X11EXT[NAME_MAX]; char Location_X11FIXES[NAME_MAX]; char Location_X11KB[NAME_MAX]; +char Location_X11RANDR[NAME_MAX]; void kvm_set_x11_locations(char *libx11, char *libx11tst, char *libx11ext, char *libxfixes, char *libx11kb) { if (libx11 != NULL) { strcpy_s(Location_X11LIB, sizeof(Location_X11LIB), libx11); } else { strcpy_s(Location_X11LIB, sizeof(Location_X11LIB), "libX11.so"); } if (libx11tst != NULL) { strcpy_s(Location_X11TST, sizeof(Location_X11TST), libx11tst); } else { strcpy_s(Location_X11TST, sizeof(Location_X11TST), "libXtst.so"); } - if (libx11ext != NULL) { strcpy_s(Location_X11EXT, sizeof(Location_X11EXT), libx11ext); } else { strcpy_s(Location_X11EXT, sizeof(Location_X11EXT), "libXext.so"); } + if (libx11ext != NULL) { strcpy_s(Location_X11EXT, sizeof(Location_X11EXT), libx11ext); } else { strcpy_s(Location_X11EXT, sizeof(Location_X11EXT), "libXext.so"); } if (libxfixes != NULL) { strcpy_s(Location_X11FIXES, sizeof(Location_X11FIXES), libxfixes); } else { strcpy_s(Location_X11FIXES, sizeof(Location_X11FIXES), "libXfixes.so"); } if (libx11kb != NULL) { strcpy_s(Location_X11KB, sizeof(Location_X11KB), libx11kb); } else { strcpy_s(Location_X11KB, sizeof(Location_X11KB), "libxkbfile.so"); } + strcpy_s(Location_X11RANDR, sizeof(Location_X11RANDR), "libXrandr.so"); } int kvm_init(int displayNo) @@ -581,7 +702,21 @@ int kvm_init(int displayNo) ((void**)xkb_exports)[4] = (void*)dlsym(xkb_exports->xkb_lib, "XkbSelectEvents"); } } - + if (xrandr_exports == NULL) + { + xrandr_exports = ILibMemory_SmartAllocate(sizeof(xrandr_struct)); + // Try unversioned name first (needs libxrandr-dev), then fall back to versioned runtime lib + xrandr_exports->xrandr_lib = dlopen(Location_X11RANDR, RTLD_NOW); + if (xrandr_exports->xrandr_lib == NULL) { xrandr_exports->xrandr_lib = dlopen("libXrandr.so.2", RTLD_NOW); } + if (xrandr_exports->xrandr_lib == NULL) { xrandr_exports->xrandr_lib = dlopen("libXrandr.so.2.2.0", RTLD_NOW); } + if (xrandr_exports->xrandr_lib) + { + ((void**)xrandr_exports)[1] = (void*)dlsym(xrandr_exports->xrandr_lib, "XRRGetScreenResources"); + ((void**)xrandr_exports)[2] = (void*)dlsym(xrandr_exports->xrandr_lib, "XRRFreeScreenResources"); + ((void**)xrandr_exports)[3] = (void*)dlsym(xrandr_exports->xrandr_lib, "XRRGetCrtcInfo"); + ((void**)xrandr_exports)[4] = (void*)dlsym(xrandr_exports->xrandr_lib, "XRRFreeCrtcInfo"); + } + } sprintf_s(CURRENT_XDISPLAY, sizeof(CURRENT_XDISPLAY), ":%d", (int)displayNo); @@ -602,15 +737,18 @@ int kvm_init(int displayNo) if (!g_enableEvents) { printf("FATAL::::Fake motion is not supported.\n\n\n"); } CURRENT_DISPLAY_ID = SCREEN_NUM = DefaultScreen(eventdisplay); - SCREEN_HEIGHT = DisplayHeight(eventdisplay, SCREEN_NUM); - SCREEN_WIDTH = DisplayWidth(eventdisplay, SCREEN_NUM); - SCREEN_DEPTH = DefaultDepth(eventdisplay, SCREEN_NUM); + VSCREEN_WIDTH = DisplayWidth(eventdisplay, SCREEN_NUM); + VSCREEN_HEIGHT = DisplayHeight(eventdisplay, SCREEN_NUM); + SCREEN_DEPTH = DefaultDepth(eventdisplay, SCREEN_NUM); if (SCREEN_DEPTH < 15) { // fprintf(stderr, "kvm_init: We do not support display depth < 15."); return -1; } + // Enumerate physical monitors and set SCREEN_WIDTH/HEIGHT/CAPTURE_X/Y + kvm_enumerate_monitors(); + // Some magic numbers. TILE_WIDTH = 32; TILE_HEIGHT = 32; @@ -648,27 +786,53 @@ int kvm_init(int displayNo) void CheckDesktopSwitch(int checkres) { - if (change_display) + if (change_display) { - if (logFile) { fprintf(logFile, "kvm_init(%d) checkDesktopSwitch\n", CURRENT_DISPLAY_ID); fflush(logFile); } + if (logFile) { fprintf(logFile, "CheckDesktopSwitch: SCREEN_SEL_TARGET=%d CURRENT_DISPLAY_ID=%d\n", SCREEN_SEL_TARGET, CURRENT_DISPLAY_ID); fflush(logFile); } int old_height_count = TILE_HEIGHT_COUNT; change_display = 0; - - SCREEN_NUM = CURRENT_DISPLAY_ID; - SCREEN_HEIGHT = DisplayHeight(eventdisplay, CURRENT_DISPLAY_ID); - SCREEN_WIDTH = DisplayWidth(eventdisplay, CURRENT_DISPLAY_ID); - SCREEN_DEPTH = DefaultDepth(eventdisplay, CURRENT_DISPLAY_ID); + + if (g_monitor_count > 0) + { + // XRandR mode: switch physical monitor selection + SCREEN_SEL = SCREEN_SEL_TARGET; + if (SCREEN_SEL > 0 && (SCREEN_SEL - 1) < g_monitor_count) + { + int idx = SCREEN_SEL - 1; + CAPTURE_X = g_monitors[idx].x; + CAPTURE_Y = g_monitors[idx].y; + SCREEN_WIDTH = g_monitors[idx].width; + SCREEN_HEIGHT = g_monitors[idx].height; + } + else + { + SCREEN_SEL = 0; + CAPTURE_X = 0; + CAPTURE_Y = 0; + SCREEN_WIDTH = VSCREEN_WIDTH; + SCREEN_HEIGHT = VSCREEN_HEIGHT; + } + } + else + { + // Legacy: switch X11 logical screen + SCREEN_NUM = CURRENT_DISPLAY_ID; + SCREEN_HEIGHT = DisplayHeight(eventdisplay, CURRENT_DISPLAY_ID); + SCREEN_WIDTH = DisplayWidth(eventdisplay, CURRENT_DISPLAY_ID); + SCREEN_DEPTH = DefaultDepth(eventdisplay, CURRENT_DISPLAY_ID); + CAPTURE_X = 0; + CAPTURE_Y = 0; + } TILE_HEIGHT_COUNT = SCREEN_HEIGHT / TILE_HEIGHT; - TILE_WIDTH_COUNT = SCREEN_WIDTH / TILE_WIDTH; - if (SCREEN_WIDTH % TILE_WIDTH) { TILE_WIDTH_COUNT++; } + TILE_WIDTH_COUNT = SCREEN_WIDTH / TILE_WIDTH; + if (SCREEN_WIDTH % TILE_WIDTH) { TILE_WIDTH_COUNT++; } if (SCREEN_HEIGHT % TILE_HEIGHT) { TILE_HEIGHT_COUNT++; } kvm_send_resolution(); kvm_send_display(); - + kvm_send_display_list(); // re-send list with updated current selection so the UI highlights the right icon reset_tile_info(old_height_count); - return; } } @@ -708,8 +872,9 @@ int kvm_server_inputdata(char* block, int blocklen) short w = 0; if (size == 10 || size == 12) { - x = ((int)ntohs(((unsigned short*)(block))[3])); - y = ((int)ntohs(((unsigned short*)(block))[4])); + // Client sends coords relative to the captured region; translate to absolute screen coords + x = ((int)ntohs(((unsigned short*)(block))[3])) + CAPTURE_X; + y = ((int)ntohs(((unsigned short*)(block))[4])) + CAPTURE_Y; if (size == 12) w = ((short)ntohs(((short*)(block))[5])); if (logFile) { fprintf(logFile, "RemoteMouseMove: (%d, %d)\n", x, y); } // printf("x:%d, y:%d, b:%d, w:%d\n", x, y, block[5], w); @@ -768,9 +933,23 @@ int kvm_server_inputdata(char* block, int blocklen) } case MNG_KVM_SET_DISPLAY: { - if (ntohs(((unsigned short*)(block))[2]) == CURRENT_DISPLAY_ID) { break; } // Don't do anything - CURRENT_DISPLAY_ID = ntohs(((unsigned short*)(block))[2]); - change_display = 1; + unsigned short newval = ntohs(((unsigned short*)(block))[2]); + if (g_monitor_count > 0) + { + // XRandR mode: 65535 = all monitors, 1..N = specific physical monitor + int newsel = (newval == 65535) ? 0 : (int)newval; + if (newsel == SCREEN_SEL_TARGET) { break; } + SCREEN_SEL_TARGET = newsel; + change_display = 1; + } + else + { + // Legacy X11 screen mode + if ((int)newval == CURRENT_DISPLAY_ID) { break; } + CURRENT_DISPLAY_ID = (int)newval; + SCREEN_SEL_TARGET = 0; + change_display = 1; + } break; } } @@ -1039,22 +1218,26 @@ void* kvm_server_mainloop(void* parm) imagedisplay = x11_exports->XOpenDisplay(CURRENT_XDISPLAY); if (imagedisplay == NULL) { g_shutdown = 1; break; } - if (DisplayWidth(imagedisplay, CURRENT_DISPLAY_ID) != SCREEN_WIDTH || - DisplayHeight(imagedisplay, CURRENT_DISPLAY_ID) != SCREEN_HEIGHT || + if (DisplayWidth(imagedisplay, CURRENT_DISPLAY_ID) != VSCREEN_WIDTH || + DisplayHeight(imagedisplay, CURRENT_DISPLAY_ID) != VSCREEN_HEIGHT || DefaultDepth(eventdisplay, CURRENT_DISPLAY_ID) != SCREEN_DEPTH) { int old = TILE_HEIGHT_COUNT; - SCREEN_HEIGHT = DisplayHeight(imagedisplay, CURRENT_DISPLAY_ID); - SCREEN_WIDTH = DisplayWidth(imagedisplay, CURRENT_DISPLAY_ID); - SCREEN_DEPTH = DefaultDepth(imagedisplay, CURRENT_DISPLAY_ID); - if (logFile) { fprintf(logFile, "SLAVE/KVM Resolution Changed: %d x %d x %d bpp\n", SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_DEPTH); fflush(logFile); } + VSCREEN_WIDTH = DisplayWidth(imagedisplay, CURRENT_DISPLAY_ID); + VSCREEN_HEIGHT = DisplayHeight(imagedisplay, CURRENT_DISPLAY_ID); + SCREEN_DEPTH = DefaultDepth(imagedisplay, CURRENT_DISPLAY_ID); + if (logFile) { fprintf(logFile, "SLAVE/KVM Virtual Screen Changed: %d x %d x %d bpp\n", VSCREEN_WIDTH, VSCREEN_HEIGHT, SCREEN_DEPTH); fflush(logFile); } + + // Re-enumerate physical monitors and update capture region + kvm_enumerate_monitors(); TILE_HEIGHT_COUNT = SCREEN_HEIGHT / TILE_HEIGHT; - TILE_WIDTH_COUNT = SCREEN_WIDTH / TILE_WIDTH; - if (SCREEN_WIDTH % TILE_WIDTH) { TILE_WIDTH_COUNT++; } + TILE_WIDTH_COUNT = SCREEN_WIDTH / TILE_WIDTH; + if (SCREEN_WIDTH % TILE_WIDTH) { TILE_WIDTH_COUNT++; } if (SCREEN_HEIGHT % TILE_HEIGHT) { TILE_HEIGHT_COUNT++; } kvm_send_resolution(); + kvm_send_display_list(); reset_tile_info(old); } @@ -1207,8 +1390,8 @@ void* kvm_server_mainloop(void* parm) x11ext_exports->XShmGetImage(imagedisplay, RootWindowOfScreen(ScreenOfDisplay(imagedisplay, CURRENT_DISPLAY_ID)), image, - 0, - 0, + CAPTURE_X, + CAPTURE_Y, AllPlanes); //image = XGetImage(imagedisplay, @@ -1232,16 +1415,21 @@ void* kvm_server_mainloop(void* parm) unsigned short h = ((unsigned short*)(cimage + 6))[0]; unsigned short xhot = ((unsigned short*)(cimage + 8))[0]; unsigned short yhot = ((unsigned short*)(cimage + 10))[0]; - unsigned short mx = rx - xhot, my = ry - yhot; + // Translate absolute cursor pos to capture-region-relative coordinates + int localRx = rx - CAPTURE_X; + int localRy = ry - CAPTURE_Y; + unsigned short mx = (localRx > (int)xhot) ? (unsigned short)(localRx - xhot) : 0; + unsigned short my = (localRy > (int)yhot) ? (unsigned short)(localRy - yhot) : 0; char *pixels = cimage + (sizeof(void*) == 8 ? 24 : 16); - //if (logFile) { fprintf(logFile, "BBP: %d, pad: %d, unit: %d, BPP: %d, F: %d, XO: %d: PW: %d\n", image->bytes_per_line, image->bitmap_pad, image->bitmap_unit, image->bits_per_pixel, image->format, image->xoffset, (adjust_screen_size(SCREEN_WIDTH) - image->width) * 3); fflush(logFile); } - //if (logFile) { fprintf(logFile, "[%d/ %d x %d] (%d, %d) => (%d, %d | %u, %u)\n", image->bits_per_pixel, xa.width, xa.height, screen_width, screen_height, rx, ry,w , h); fflush(logFile); } + if ((mx + w) > (unsigned short)SCREEN_WIDTH) { mx = (unsigned short)(SCREEN_WIDTH - w); } + if ((my + h) > (unsigned short)SCREEN_HEIGHT) { my = (unsigned short)(SCREEN_HEIGHT - h); } - if (xhot > rx) { mx = 0; } else if ((mx + w) > SCREEN_WIDTH) { mx = SCREEN_WIDTH - w; } - if (yhot > ry) { my = 0; } else if ((my + h) > SCREEN_HEIGHT) { my = SCREEN_HEIGHT - h; } - - bitblt(pixels, (int)w, (int)h, 0, 0, (int)w, (int)h, image->data, SCREEN_WIDTH, SCREEN_HEIGHT, mx, my, 1); + // Only render cursor if it is within the current capture region + if (localRx >= 0 && localRx < SCREEN_WIDTH && localRy >= 0 && localRy < SCREEN_HEIGHT) + { + bitblt(pixels, (int)w, (int)h, 0, 0, (int)w, (int)h, image->data, SCREEN_WIDTH, SCREEN_HEIGHT, mx, my, 1); + } if (sentHideCursor == 0) { From 795b7d4f655db2ccf0c1361a3238fd16909fab7a Mon Sep 17 00:00:00 2001 From: Pablo Navarro Date: Wed, 20 May 2026 11:37:09 +0200 Subject: [PATCH 18/68] Corrected kvm_server_SetResolution definition and call. Fixes UAC delay (issue #347) (#348) --- meshcore/KVM/Windows/kvm.c | 3 +-- meshcore/KVM/Windows/kvm.h | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/meshcore/KVM/Windows/kvm.c b/meshcore/KVM/Windows/kvm.c index 0e50ec901..12beda251 100644 --- a/meshcore/KVM/Windows/kvm.c +++ b/meshcore/KVM/Windows/kvm.c @@ -321,7 +321,6 @@ void kvm_send_display_list(ILibKVM_WriteHandler writeHandler, void *reserved) } } -void kvm_server_SetResolution(); int kvm_server_currentDesktopname = 0; void CheckDesktopSwitch(int checkres, ILibKVM_WriteHandler writeHandler, void *reserved) { @@ -386,7 +385,7 @@ void CheckDesktopSwitch(int checkres, ILibKVM_WriteHandler writeHandler, void *r // Force screen refresh after desktop switch if (checkres != 0) { - kvm_server_SetResolution(); + kvm_server_SetResolution(writeHandler, reserved); } } } diff --git a/meshcore/KVM/Windows/kvm.h b/meshcore/KVM/Windows/kvm.h index 55e795644..8cbe6b64b 100644 --- a/meshcore/KVM/Windows/kvm.h +++ b/meshcore/KVM/Windows/kvm.h @@ -25,5 +25,6 @@ int kvm_relay_setup(char* exePath, void *processPipeMgr, ILibKVM_WriteHandler wr void kvm_cleanup(); void kvm_setupSasPermissions(); void kvm_relay_reset(ILibKVM_WriteHandler writeHandler, void *reserved); +void kvm_server_SetResolution(ILibKVM_WriteHandler writeHandler, void *reserved); #endif From 973b720d5c2ec4256260657ec3c66b9bed7839c8 Mon Sep 17 00:00:00 2001 From: stachi Date: Wed, 20 May 2026 11:37:28 +0200 Subject: [PATCH 19/68] Run Duktape GC after system proxy detection (#346) System proxy detection executes the proxy-helper JavaScript path, which can create short-lived EventEmitter and ChildProcess object graphs during reconnect attempts. Without an explicit GC pass those objects can remain retained until a later heap cycle, causing repeated reconnects to drive up peak heap usage. Run a Duktape GC pass immediately after popping the proxy-helper result so the temporary proxy-detection objects are collected promptly. --- meshcore/agentcore.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/meshcore/agentcore.c b/meshcore/agentcore.c index 4e215bfbc..32db200bd 100644 --- a/meshcore/agentcore.c +++ b/meshcore/agentcore.c @@ -418,6 +418,8 @@ int MeshAgent_GetSystemProxy(MeshAgentHostContainer *agent, char *inBuffer, size } } duk_pop(agent->meshCoreCtx); // ... + // Proxy detection can create short-lived EventEmitter/ChildProcess object graphs. Run GC here so repeated reconnects do not retain them until a later heap cycle. + duk_gc(agent->meshCoreCtx, 0); return((int)bufferLen); } #ifdef _POSIX From a040c51d50e06509940a73442540cc494321042e Mon Sep 17 00:00:00 2001 From: Baptiste Das Neves <137995630+bdasnevesKP@users.noreply.github.com> Date: Wed, 20 May 2026 11:37:46 +0200 Subject: [PATCH 20/68] fix: prevent double-free of controlChannelRequest on connection timeout (#342) When MeshServer_ConnectEx_NetworkError fires (20s connection timeout), it frees j (==agent->controlChannelRequest) but does not set the pointer to NULL. ILibWebClient_CancelRequest, called immediately after, executes synchronously on the chain thread (ILibChain_RunOnMicrostackThread macro calls the handler inline when already on the chain thread). This triggers MeshServer_OnResponse(ReceiveStatus_Complete) which sees a non-NULL controlChannelRequest and calls ILibMemory_Free on the already-freed pointer, causing a double-free and heap corruption on every retry cycle. Fix: set agent->controlChannelRequest = NULL right after ILibMemory_Free(j) so MeshServer_OnResponse safely skips the cleanup block. Relates to: Ylianst/MeshAgent#110, #151, #281 Relates to: Ylianst/MeshCentral#7407 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- meshcore/agentcore.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/meshcore/agentcore.c b/meshcore/agentcore.c index 32db200bd..c5563e705 100644 --- a/meshcore/agentcore.c +++ b/meshcore/agentcore.c @@ -3779,6 +3779,10 @@ void MeshServer_ConnectEx_NetworkError(void *j) MeshAgentHostContainer *agent = (MeshAgentHostContainer*)((void**)j)[0]; void *request = ((void**)j)[1]; ILibMemory_Free(j); + // Nullify immediately to prevent double-free: ILibWebClient_CancelRequest runs + // synchronously on the chain thread and triggers MeshServer_OnResponse, which would + // otherwise call ILibMemory_Free on this already-freed pointer a second time. + agent->controlChannelRequest = NULL; if (agent->controlChannelDebug != 0) { ILIBLOGMESSAGEX("Network Timeout Occurred..."); } agent->serverConnectionState = 0; // We are cancelling connection request From 19e7135b1e162a41fd4d92de401710317422f43e Mon Sep 17 00:00:00 2001 From: Austin Renfroe Date: Wed, 20 May 2026 04:39:13 -0500 Subject: [PATCH 21/68] macOS Tahoe: helper joins console user audit session for screen capture (#344) On macOS Tahoe (26.x), the dashboard's Desktop tab shows a black frame on Apple-Silicon Macs because the user-context -kvm0 helper inherits the daemon's system-side audit session (asid != console user's gui session asid). Per-user XPC services like com.apple.replayd are registered in gui/ and unreachable from a different audit session, so SLSHWCaptureDesktopProxying / ReplayKit returns empty frames after a 5-second timeout. This patch joins the console user's GUI audit session at TWO points: 1. Pre-exec, inside SpawnProcessEx4's fork-child while still root: does the actual auditon-based discovery and audit_session_join. On Tahoe, only root can call audit_session_port() for arbitrary asids or enumerate via auditon(A_GETPINFO_ADDR) across audit sessions, so discovery has to happen here. 2. Post-exec, in the helper's main() entry for argv[1] == "-kvm0": the kernel resets the asid on exec, so the pre-exec join doesn't persist on its own. Post-exec re-joins the same session; the pre-exec join leaves enough kernel state that auditon visibility for the user's gui session works from the dropped-privilege uid. Discovery picks the LOWEST visible asid belonging to the target uid (typically 100002, the user's primary gui session, vs higher asids for transient/per-app sessions where replayd doesn't register). A fallback brute-force range probe handles the case where Tahoe's cross-session auditon visibility filter blocks discovery entirely. Also includes a small zlib build fix in meshcore/zlib/zutil.h: skip the "fdopen() not available" macro on __APPLE__ because newer Xcode/ Clang treats the resulting macro expansion as a compile error against the system stdio.h prototype. macOS has fdopen, so the macro shouldn't fire on Apple platforms anyway. No behavior change on Linux/Windows. No new dependencies (audit APIs ship with the macOS SDK). Tested on macOS Tahoe 26.x, Apple Silicon, MeshCentral 1.x server. Before patch: 100% black canvas in dashboard Desktop tab. After patch: full desktop video streaming at native resolution. Co-authored-by: austin --- meshconsole/main.c | 18 ++++++ meshcore/zlib/zutil.h | 6 +- microstack/ILibProcessPipe.c | 116 ++++++++++++++++++++++++++++++++--- 3 files changed, 128 insertions(+), 12 deletions(-) diff --git a/meshconsole/main.c b/meshconsole/main.c index 83609edd5..a1b9a3367 100644 --- a/meshconsole/main.c +++ b/meshconsole/main.c @@ -39,6 +39,12 @@ MeshAgentHostContainer *agentHost = NULL; char __agentExecPath[1024] = { 0 }; #endif +#if defined(__APPLE__) +#include +#include +#include +#endif + #ifdef WIN32 BOOL CtrlHandler(DWORD fdwCtrlType) @@ -277,6 +283,18 @@ char* crashMemory = ILib_POSIX_InstallCrashHandler(argv[0]); #if defined(_LINKVM) && defined(__APPLE__) if (argc > 1 && strcasecmp(argv[1], "-kvm0") == 0) { + // Tahoe audit-session join: pre-exec in SpawnProcessEx4 (as + // root) is what discovers and joins the user's gui session; + // post-exec call here as uid 501 inherits enough visibility + // from that to re-join cleanly and ensures the helper's + // kernel-tracked asid lands on the user's gui session before + // kvm_server_mainloop opens its XPC connection to + // com.apple.replayd. Both calls together are needed: the + // pre-exec join doesn't survive exec on its own, and + // post-exec alone is denied (uid 501 can't audit_session_port + // arbitrary asids on Tahoe). + extern int ILibProcessPipe_JoinUserAuditSession_OSX_PostExec(uid_t uid); + ILibProcessPipe_JoinUserAuditSession_OSX_PostExec(getuid()); kvm_server_mainloop(NULL); return 0; } diff --git a/meshcore/zlib/zutil.h b/meshcore/zlib/zutil.h index b079ea6a8..8ce9cc7db 100644 --- a/meshcore/zlib/zutil.h +++ b/meshcore/zlib/zutil.h @@ -136,8 +136,10 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ # if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os # include /* for fdopen */ # else -# ifndef fdopen -# define fdopen(fd,mode) NULL /* No fdopen() */ +# if !defined(__APPLE__) +# ifndef fdopen +# define fdopen(fd,mode) NULL /* No fdopen() */ +# endif # endif # endif # endif diff --git a/microstack/ILibProcessPipe.c b/microstack/ILibProcessPipe.c index 910f7303f..f74b83824 100644 --- a/microstack/ILibProcessPipe.c +++ b/microstack/ILibProcessPipe.c @@ -52,6 +52,93 @@ limitations under the License. #endif +#if defined(__APPLE__) +#include +#include +#include +#include +#include + +// macOS Tahoe (26.x) audit-session-isolation fix for the -kvm0 +// helper. The screen-capture / input-injection helper inherits the +// daemon's system-side audit session, where per-user XPC services +// like com.apple.replayd (which backs ReplayKit / ScreenCaptureKit) +// are unreachable. The cross-session XPC bootstrap-lookup fails with +// "xpc_error=[3: No such process]" and the helper returns empty +// (all-black) frames. Joining the console user's GUI audit session +// before exec fixes this. +// +// Two call sites are needed: +// 1. Pre-exec (in SpawnProcessEx4's fork-child, still root): does the +// actual discovery — Tahoe forbids non-root processes from +// enumerating with auditon() or calling audit_session_port() for +// arbitrary asids. Root can do both. +// 2. Post-exec (in main.c -kvm0 branch, as the target uid): the +// kernel resets the asid on exec, so we need to re-join from the +// helper's main entry. The pre-exec join leaves enough kernel +// state that the post-exec auditon visibility works. +static int ILibProcessPipe_TryJoinAsid_OSX(au_asid_t asid) +{ + mach_port_t port = MACH_PORT_NULL; + if (audit_session_port(asid, &port) != 0) return -1; + au_asid_t join_rc = audit_session_join(port); + mach_port_deallocate(mach_task_self(), port); + if (join_rc == AU_DEFAUDITSID || (int32_t)join_rc == -1) return -1; + return 0; +} + +int ILibProcessPipe_JoinUserAuditSession_OSX(uid_t uid); +int ILibProcessPipe_JoinUserAuditSession_OSX_PostExec(uid_t uid) { return ILibProcessPipe_JoinUserAuditSession_OSX(uid); } +int ILibProcessPipe_JoinUserAuditSession_OSX(uid_t uid) +{ + int n = proc_listallpids(NULL, 0); + if (n <= 0) return -1; + pid_t *pids = (pid_t*)calloc(n, sizeof(pid_t)); + if (pids == NULL) return -1; + int got = proc_listallpids(pids, n * (int)sizeof(pid_t)); + if (got <= 0) { free(pids); return -1; } + int count = got / (int)sizeof(pid_t); + int rc = -1; + // Discover all auditon-visible asids belonging to target uid; + // prefer the LOWEST asid as the candidate. The user's primary + // gui session is created early at login and gets a low asid + // (typically 100002), while transient and per-app sessions get + // higher asids (100041+, 101xxx). Picking lowest reliably lands + // us on the primary gui session, which is where replayd is. + au_asid_t best_asid = AU_DEFAUDITSID; + for (int i = 0; i < count; i++) + { + if (pids[i] == 0) continue; + struct auditpinfo_addr ap; + memset(&ap, 0, sizeof(ap)); + ap.ap_pid = pids[i]; + if (auditon(A_GETPINFO_ADDR, &ap, sizeof(ap)) != 0) continue; + if (ap.ap_auid != uid) continue; + if (ap.ap_asid == 0 || ap.ap_asid == AU_DEFAUDITSID) continue; + if (best_asid == AU_DEFAUDITSID || ap.ap_asid < best_asid) best_asid = ap.ap_asid; + } + free(pids); + if (best_asid != AU_DEFAUDITSID && ILibProcessPipe_TryJoinAsid_OSX(best_asid) == 0) rc = 0; + // Fallback: if auditon discovery yielded no usable asid (e.g., + // Tahoe's cross-session visibility filter denied the enumeration), + // brute-force try the typical user-gui asid range from low to high. + if (rc != 0) + { + for (au_asid_t a = 100002; a <= 100200; a++) + { + if (ILibProcessPipe_TryJoinAsid_OSX(a) == 0) + { + struct auditinfo_addr post; + memset(&post, 0, sizeof(post)); + getaudit_addr(&post, sizeof(post)); + if (post.ai_auid == uid) { rc = 0; break; } + } + } + } + return rc; +} +#endif + #define CONSOLE_SCREEN_WIDTH 80 #define CONSOLE_SCREEN_HEIGHT 25 @@ -755,16 +842,12 @@ ILibProcessPipe_Process ILibProcessPipe_Manager_SpawnProcessEx4(ILibProcessPipe_ retVal->stdOut->mProcess = retVal; } #ifdef __APPLE__ - if (needSetSid == 0) - { - set = &sset; - ILibVForkPrepareSignals_Parent_Init(set); - pid = vfork(); - } - else - { - pid = fork(); - } + // Use fork() not vfork() on macOS — child needs to call + // proc_listallpids / audit_session_join APIs to join the + // console user's audit session before exec, which are + // forbidden in vfork-child context (POSIX requires + // execve/_exit only in vfork children). + pid = fork(); #else set = &sset; ILibVForkPrepareSignals_Parent_Init(set); @@ -825,6 +908,19 @@ ILibProcessPipe_Process ILibProcessPipe_Manager_SpawnProcessEx4(ILibProcessPipe_ } if (UID != -1 && UID != 0) { +#if defined(__APPLE__) + // Tahoe: macOS forbids non-root processes from calling + // audit_session_port() for arbitrary asids (errno=EPERM) + // or enumerating with auditon(A_GETPINFO_ADDR) across + // sessions. So we MUST do the audit-session-join here, + // while the fork-child still has root privileges, before + // setuid drops us. Otherwise the helper post-exec runs + // as the target user with no authority to discover or + // join the user's gui audit session, and stays in the + // daemon's system-side session — where com.apple.replayd + // is unreachable, breaking screen capture. + ILibProcessPipe_JoinUserAuditSession_OSX((uid_t)UID); +#endif ignore_result(setuid((uid_t)UID)); } if (needSetSid != 0) From f9ace66615e312290de6bec3836ba290144b5c24 Mon Sep 17 00:00:00 2001 From: Simon Smith Date: Tue, 26 May 2026 20:43:05 +0100 Subject: [PATCH 22/68] fix db.Delete and add extra arguments to dbTool.js Signed-off-by: Simon Smith --- meshservice/MeshService.rc | Bin 12536 -> 12536 bytes microscript/ILibDuktape_Commit.h | 8 ++++---- microscript/ILibDuktape_SimpleDataStore.c | 14 +++++++++++--- modules/dbTool.js | 6 +++--- 4 files changed, 18 insertions(+), 10 deletions(-) diff --git a/meshservice/MeshService.rc b/meshservice/MeshService.rc index 38f1ff5173e139aaebf78a3f7bc0be7ecd28d15d..193bfff07b301fa6d6065e956f3555963916036e 100644 GIT binary patch delta 101 zcmey7_#<(H4!^Q5Ln1>FgD!&+gE4~wgCTeL; Sx4D5|j*%Emn-2<@D*yl@-4gEr diff --git a/microscript/ILibDuktape_Commit.h b/microscript/ILibDuktape_Commit.h index 55b81d8ac..4a04fc9e0 100644 --- a/microscript/ILibDuktape_Commit.h +++ b/microscript/ILibDuktape_Commit.h @@ -1,5 +1,5 @@ // This file is auto-generated, any edits may be overwritten -#define SOURCE_COMMIT_DATE "2026-Feb-15 16:43:44-0800" -#define SOURCE_COMMIT_DATE "2026-Feb-15 16:43:44-0800" -#define SOURCE_COMMIT_HASH "62b206e0b485b296e8a73a6547cef02bbf5a2d62" -#define SOURCE_COMMIT_HASH "62b206e0b485b296e8a73a6547cef02bbf5a2d62" +#define SOURCE_COMMIT_DATE "2026-Mar-23 10:29:58+0000" +#define SOURCE_COMMIT_DATE "2026-Mar-23 10:29:58+0000" +#define SOURCE_COMMIT_HASH "258751217256267e0a1b08b09b14a0d7b281ec15" +#define SOURCE_COMMIT_HASH "258751217256267e0a1b08b09b14a0d7b281ec15" diff --git a/microscript/ILibDuktape_SimpleDataStore.c b/microscript/ILibDuktape_SimpleDataStore.c index 4366cc98a..768e1e29f 100644 --- a/microscript/ILibDuktape_SimpleDataStore.c +++ b/microscript/ILibDuktape_SimpleDataStore.c @@ -191,12 +191,20 @@ duk_ret_t ILibDuktape_SimpleDataStore_Keys(duk_context *ctx) } duk_ret_t ILibDuktape_SimpleDataStore_Delete(duk_context *ctx) { + duk_size_t keyLen; + char *key = (char*)duk_get_lstring(ctx, 0, &keyLen); + duk_push_this(ctx); // [DataStore] duk_get_prop_string(ctx, -1, ILibDuktape_DataStore_PTR); // [DataStore][ptr] ILibSimpleDataStore ds = (ILibSimpleDataStore)duk_get_pointer(ctx, -1); - duk_size_t keyLen; - char *key = (char*)duk_get_lstring(ctx, 0, &keyLen); - + char *cguid = Duktape_GetContextGuidHex(ctx, ds); + + if (cguid != NULL) + { + keyLen = sprintf_s(ILibScratchPad2, sizeof(ILibScratchPad2), "%s/%s", cguid, key); + key = ILibScratchPad2; + } + ILibSimpleDataStore_DeleteEx(ds, key, (int)keyLen); return(0); } diff --git a/modules/dbTool.js b/modules/dbTool.js index 7304b6748..a71fc5a9e 100644 --- a/modules/dbTool.js +++ b/modules/dbTool.js @@ -62,10 +62,9 @@ if (process.argv.length > 1) process.exit(); break; case 'get': - console.log('GET ' + process.argv[2] + ' = '); var val = db.Get(process.argv[2]); if (process.argv[2] == 'CoreModule') { val = val.slice(4); } - console.log(val); + console.log('GET ' + process.argv[2] + ' = ' + val); process.exit(); break; case 'getx': @@ -148,7 +147,8 @@ else console.log('usage: '); console.log(' [get/getx/delete/export/import] [KEY]'); console.log(' [put/putx] [KEY] [value]'); - console.log(' [list]'); + console.log(' [list/keys]'); + console.log(' [keynum] [n]'); console.log(' Commonly used keys are: disableUpdate and noUpdateCoreModule'); process.exit(); } From b33a61daafa5ce7b3267ed39f004f2d16131cf11 Mon Sep 17 00:00:00 2001 From: Simon Smith Date: Tue, 26 May 2026 21:25:31 +0100 Subject: [PATCH 23/68] update WindowsTargetPlatformVersion and commit.h Signed-off-by: Simon Smith --- meshconsole/MeshConsole-2022.vcxproj | 2 +- meshservice/MeshService-2022.vcxproj | 2 +- meshservice/MeshService.rc | Bin 12536 -> 12536 bytes microscript/ILibDuktape_Commit.h | 6 ++---- 4 files changed, 4 insertions(+), 6 deletions(-) diff --git a/meshconsole/MeshConsole-2022.vcxproj b/meshconsole/MeshConsole-2022.vcxproj index 23e02d403..7f0cebacc 100644 --- a/meshconsole/MeshConsole-2022.vcxproj +++ b/meshconsole/MeshConsole-2022.vcxproj @@ -195,7 +195,7 @@ {E377F156-BAED-4086-B534-3CC43164607A} MicrostackDuktape - 10.0.22621.0 + 10.0.26100.0 MeshConsole-2022 diff --git a/meshservice/MeshService-2022.vcxproj b/meshservice/MeshService-2022.vcxproj index 4c34ea42b..81405781e 100644 --- a/meshservice/MeshService-2022.vcxproj +++ b/meshservice/MeshService-2022.vcxproj @@ -55,7 +55,7 @@ MeshConsole Win32Proj MeshService-2022 - 10.0.22621.0 + 10.0.26100.0 diff --git a/meshservice/MeshService.rc b/meshservice/MeshService.rc index 193bfff07b301fa6d6065e956f3555963916036e..742f9ab2c1df62569bc050a82a5f6700a1a1f12c 100644 GIT binary patch delta 93 zcmey7_#<(H0l$1DgD!&+gBgPYkThVhVlZJa29gF0rVQFZ(s1%Y0qMybSUDyK2=Z-i P;8$WKq+# Date: Tue, 2 Jun 2026 08:28:25 -0500 Subject: [PATCH 24/68] macOS Tahoe: split KVM helper into a user LaunchAgent (replaces #344 workaround) (#349) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * macOS Tahoe: post mouseMoved CGEvent instead of CGWarpMouseCursorPosition On Tahoe, CGWarpMouseCursorPosition fires hot-corner watchers when the warp destination sits in a corner zone — the OS treats the warp as a cursor 'presence' at the destination rather than silent teleportation. On every Desktop-tab connect from the MeshCentral browser UI, the initial mouse coordinate sent by the browser commonly lands in the top-right of the video pane, the warp puts the OS cursor at the top-right of the screen, and Tahoe fires Notification Center (surfacing Calendar + Weather widgets). Top-left maps to Mission Control / app-spread the same way. Posting a kCGEventMouseMoved CGEvent goes through the normal HID-event path. Hot-corner watchers fire on cursor *dwell*, not on synthetic movement events, so this stops triggering Notification Center / Mission Control on connect. Subsequent browser-side cursor movement generates normal CGEvents that move the OS cursor away from any corner the cursor briefly visits. This also makes mesh's mouse-move behavior more conformant with what macOS apps expect from input frameworks — CGWarpMouseCursorPosition is documented as 'does not generate mouse events,' which means apps that listen for mouseMoved (screensaver wake, sticky-corner activation, HID-tracking apps) miss out on cursor activity that's actually happening from the user's perspective. * macOS Tahoe: add -kvmagent mode + LaunchAgent plist (Phase 1) The user-context LaunchAgent runs natively in gui/ with the user's audit session id (typically asid=100002), where com.apple.replayd registers. This eliminates the cross-session XPC bootstrap-lookup failure that breaks ScreenCaptureKit screen capture when the kvm helper is spawned from the system-side LaunchDaemon (asid=100001). Architecture matches Splashtop Streamer's: a separate per-user LaunchAgent with LimitLoadToSessionType = ['Aqua', 'LoginWindow'], loaded by launchd into the user's domain. The daemon connects to the agent over a Unix domain socket; same TLV protocol that flowed over the inherited stdio pipes in the -kvm0 / -kvm1 case. Phase 1 deliverables: - mac_kvm.c: convert KVM_Listener_Path from #define to a writable variable + setter, so the listener path can be parameterized for the per-user agent. Defaults preserve legacy -kvm1 behavior. - meshconsole/main.c: new -kvmagent mode. Optional argv[2] sets the socket path; default is /tmp/meshagent-kvm-.sock so a non- root user can bind it. - macos/com.meshagent.kvm.plist: LaunchAgent definition. RunAtLoad true, KeepAlive on non-clean-exit, ThrottleInterval 30s. Phase 2 (next): daemon's kvm_relay_setup() in mac_kvm.c connects to this socket instead of fork-exec'ing a -kvm0 helper. Phase 3: drop the audit_session_join workaround entirely once the daemon-side connect path is live and verified. * macOS Tahoe: daemon connects to user-LaunchAgent socket (Phase 2) Phase 2 of the launchagent-split refactor. Adds the daemon-side socket-connect path that pairs with the -kvmagent mode added in Phase 1. When MeshCentral initiates a Desktop session, kvm_relay_setup() now first tries to connect to /tmp/meshagent-kvm-.sock — the listener registered by the user-context LaunchAgent. If the agent is up, the daemon hands the KVM session off to it via the existing TLV protocol (now flowing over a Unix domain socket instead of inherited stdio pipes from a fork-exec'd helper). If the agent isn't reachable, falls through to the legacy fork-exec -kvm0 helper, preserving the existing behavior for fixtures that don't yet have the LaunchAgent installed. The agent's audit session is gui/ natively (via launchd's LimitLoadToSessionType=Aqua loading), so com.apple.replayd is reachable from there and ScreenCaptureKit screen capture works without the audit_session_join workaround the daemon-spawn path needs. Cleanly supersedes PR #344's approach. Implementation: - New static state (g_kvmSocketPipe, g_kvmSocketFD, write handler + reserved pointer) tracking the socket-mode session. - kvm_relay_setup tries connect(); on success wraps the FD in ILibProcessPipe_Pipe_CreateFromExisting() so the existing pipe abstractions for write / pause / resume / free continue to work. - New kvm_relay_socket_ReadHandler with the ILibProcessPipe_Pipe_ReadHandler signature; reuses the same TLV parser as kvm_relay_StdOutHandler. - New kvm_relay_socket_BrokenHandler clears the static state on socket disconnect so subsequent kvm_relay_setup calls reconnect. - kvm_relay_feeddata branches: ILibProcessPipe_Pipe_Write to the socket pipe in socket mode; ILibProcessPipe_Process_WriteStdIn to the legacy child process in fork-exec mode. * macOS Tahoe: process key/mouse events locally when in socket mode Upstream's MNG_KVM_KEY and MNG_KVM_MOUSE cases in kvm_mainloopinput bail out when KVM_AGENT_FD != -1 — i.e., when the daemon is in the unused -kvm1 socket-mode (or now our -kvmagent mode). Presumably intended for an upstream design where the agent forwarded input messages elsewhere instead of dispatching them locally. That's wrong for the user-LaunchAgent architecture: the agent IS the process that should call KeyAction / MouseAction, since it's the only one in the right audit session and with the TCC permissions to post CGEvents into the user's session. The system-level daemon proxies bytes only. Symptom before fix: with the LaunchAgent up and the daemon connecting to it via socket, video streamed fine but every keystroke and mouse motion was silently dropped at the case-break. After fix: the agent handles input locally, video + keyboard + mouse all flow end-to-end through MeshCentral's Desktop tab. Verified empirically 2026-05-06. * macOS Tahoe: integrate -kvmagent into -fullinstall + harden socket-mode fallback Two follow-ups from the launchagent-split refactor's first working deployment: 1. agent-installer.js: -fullinstall now writes the LaunchAgent plist with parameters: ['-kvmagent'] (was ['-kvm1'] - never wired up on the daemon side) and sessionTypes: ['LoginWindow', 'Aqua'] (was ['LoginWindow'] only - meant the agent never loaded for logged-in user sessions). After installing the plist, immediately bootstraps it into gui/ so the agent is available without requiring a logout/login cycle. 2. mac_kvm.c kvm_relay_setup hardening: only fall through to the legacy fork-exec helper if the LaunchAgent socket file is genuinely absent from disk. If the socket exists but connect() transiently fails (e.g. agent re-accepting between sessions), retry up to 5 times with exponential backoff (50ms..800ms, ~1.55s total). Returns NULL if all retries fail rather than firing the broken fork-exec path that produces black frames / dead input under Tahoe's audit-session isolation. Adds for the stat() check. * macOS Tahoe: regenerate embedded modules with updated agent-installer.js Run code-utils expand/shrink to refresh the auto-generated block in microscript/ILibDuktape_Polyfills.c so the agent-installer module embedded in the binary reflects the LaunchAgent + -kvmagent changes made in modules/agent-installer.js earlier in this PR (commits b658692, 38d0120, 4a8a589, d77773f). Process used (per si458's note): ./meshagent_x86-64 -export \ --expandedPath=modules_expanded \ --filePath=microscript/ILibDuktape_Polyfills.c cp modules/agent-installer.js modules_expanded/agent-installer.js ./meshagent_x86-64 -exec \ 'require("code-utils").shrink({ expandedPath:"modules_expanded", filePath:"microscript/ILibDuktape_Polyfills.c", modulesPath:"modules"}); process.exit();' Diff is bounded to the BEGIN/END AUTO-GENERATED BODY markers. Module set is unchanged (1 net add: wget is now embedded as a real module rather than the prior lazy require() property; the corresponding process.arch lazy-getter remains in place outside the auto-gen region). --------- Co-authored-by: austin Co-authored-by: Austin Renfroe --- com.meshagent.kvm.plist | 48 +++++ meshconsole/main.c | 27 +++ meshcore/KVM/MacOS/mac_events.c | 16 +- meshcore/KVM/MacOS/mac_kvm.c | 181 +++++++++++++++++-- microscript/ILibDuktape_Polyfills.c | 261 ++++++++-------------------- modules/agent-installer.js | 35 +++- 6 files changed, 368 insertions(+), 200 deletions(-) create mode 100644 com.meshagent.kvm.plist diff --git a/com.meshagent.kvm.plist b/com.meshagent.kvm.plist new file mode 100644 index 000000000..1c67d0c29 --- /dev/null +++ b/com.meshagent.kvm.plist @@ -0,0 +1,48 @@ + + + + + Label + com.meshagent.kvm + + + LimitLoadToSessionType + + Aqua + LoginWindow + + + ProgramArguments + + /usr/local/mesh_services/meshagent/meshagent/meshagent + -kvmagent + + + + RunAtLoad + + KeepAlive + + SuccessfulExit + + + ThrottleInterval + 30 + + StandardOutPath + /tmp/meshagent-kvm.stdout.log + StandardErrorPath + /tmp/meshagent-kvm.stderr.log + + diff --git a/meshconsole/main.c b/meshconsole/main.c index a1b9a3367..b70a50815 100644 --- a/meshconsole/main.c +++ b/meshconsole/main.c @@ -303,6 +303,33 @@ char* crashMemory = ILib_POSIX_InstallCrashHandler(argv[0]); kvm_server_mainloop((void*)(uint64_t)getpid()); return 0; } + else if (argc > 1 && strcasecmp(argv[1], "-kvmagent") == 0) + { + // User-context LaunchAgent mode: long-running KVM server that + // listens on a Unix domain socket in the console user's session. + // Loaded by launchd into gui/ via a LaunchAgent plist; runs + // natively in the user's GUI audit session, so com.apple.replayd + // (which only registers in gui/) is reachable without the + // audit_session_join workaround the daemon-spawn path needs. + // Daemon connects to this socket when MeshCentral's Desktop tab + // opens, instead of fork+exec'ing a -kvm0 helper. + // Optional argv[2] = socket path; defaults to a tmp-dir path + // keyed by uid so the agent can bind it as a non-root user. + extern void kvm_set_listener_path(const char *path); + char defaultPath[128]; + if (argc > 2 && argv[2] != NULL && argv[2][0] != '\0') + { + kvm_set_listener_path(argv[2]); + } + else + { + snprintf(defaultPath, sizeof(defaultPath), + "/tmp/meshagent-kvm-%u.sock", (unsigned)getuid()); + kvm_set_listener_path(defaultPath); + } + kvm_server_mainloop((void*)(uint64_t)getpid()); + return 0; + } #endif if (argc > 2 && strcasecmp(argv[1], "-faddr") == 0) diff --git a/meshcore/KVM/MacOS/mac_events.c b/meshcore/KVM/MacOS/mac_events.c index f1f053fe9..c27e1f09b 100644 --- a/meshcore/KVM/MacOS/mac_events.c +++ b/meshcore/KVM/MacOS/mac_events.c @@ -185,7 +185,21 @@ void MouseAction(double absX, double absY, int button, short wheel) CFRelease(e); } else { - CGWarpMouseCursorPosition (curPos); + // Post a synthetic mouse-moved event instead of CGWarpMouseCursorPosition. + // On macOS Tahoe, CGWarpMouseCursorPosition appears to register as a + // genuine cursor presence at the destination — when the browser-side + // initial cursor sits over the upper-right corner of the video pane on + // connect, the warped OS cursor lingers in the screen's top-right hot- + // corner zone long enough for the system to fire Notification Center + // (Calendar / Weather widgets) and Mission Control. Posting a + // mouseMoved CGEvent goes through the normal HID-event path, which + // behaves like real mouse movement: the cursor passes through + // coordinates rather than being teleported to + held at them, and + // hot-corner watchers don't trigger on transient passage. + e = CGEventCreateMouseEvent(source, kCGEventMouseMoved, curPos, 0); + CGEventPost(kCGHIDEventTap, e); + CGEventPost(kCGSessionEventTap, e); + CFRelease(e); } if (button != 0) { diff --git a/meshcore/KVM/MacOS/mac_kvm.c b/meshcore/KVM/MacOS/mac_kvm.c index 3e202a29f..69e2a5a62 100644 --- a/meshcore/KVM/MacOS/mac_kvm.c +++ b/meshcore/KVM/MacOS/mac_kvm.c @@ -29,13 +29,29 @@ limitations under the License. #include #include #include +#include #include #include #include int KVM_Listener_FD = -1; -#define KVM_Listener_Path "/usr/local/mesh_services/meshagent/kvm" +// Socket path used when kvm_server_mainloop runs in socket-listener +// mode. Default is the system-owned path used by the legacy -kvm1 +// mode (root daemon spawn case). The new user-LaunchAgent flow +// (-kvmagent) overrides this via kvm_set_listener_path() before +// entering the loop, since the user agent can't bind under +// /usr/local/mesh_services/. +static char kvm_listener_path[256] = "/usr/local/mesh_services/meshagent/kvm"; + +void kvm_set_listener_path(const char *path) +{ + if (path == NULL || *path == '\0') return; + size_t len = strlen(path); + if (len >= sizeof(kvm_listener_path)) return; + memcpy(kvm_listener_path, path, len); + kvm_listener_path[len] = '\0'; +} #if defined(_TLSLOG) #define TLSLOG1 printf #else @@ -335,7 +351,12 @@ int kvm_server_inputdata(char* block, int blocklen) break; case MNG_KVM_KEY: // Key { - if (size != 6 || KVM_AGENT_FD != -1) { break; } + // Removed `KVM_AGENT_FD != -1` skip — in our user-LaunchAgent + // architecture (-kvmagent) the agent IS the process that + // should handle keystrokes locally via KeyAction, since it's + // the one in the user's GUI session with TCC permission to + // post CGEvents. + if (size != 6) { break; } KeyAction(block[5], block[4]); break; } @@ -343,7 +364,7 @@ int kvm_server_inputdata(char* block, int blocklen) { int x, y; short w = 0; - if (KVM_AGENT_FD != -1) { break; } + // Same as above — process mouse locally in -kvmagent mode. if (size == 10 || size == 12) { x = ((int)ntohs(((unsigned short*)(block))[3])) / SCREEN_SCALE; @@ -401,9 +422,30 @@ int kvm_server_inputdata(char* block, int blocklen) } +// Socket-mode (user-LaunchAgent) state. When the daemon successfully +// connects to /tmp/meshagent-kvm-.sock at session-init time, +// kvm_relay_setup() leaves these populated and the write/read paths +// fall through to the socket pipe instead of the legacy fork-exec +// helper's stdio. +static ILibProcessPipe_Pipe g_kvmSocketPipe = NULL; +static int g_kvmSocketFD = -1; +static ILibKVM_WriteHandler g_kvmSocketWriteHandler = NULL; +static void *g_kvmSocketReserved = NULL; + int kvm_relay_feeddata(char* buf, int len) { - ILibProcessPipe_Process_WriteStdIn(gChildProcess, buf, len, ILibTransport_MemoryOwnership_USER); + if (g_kvmSocketPipe != NULL) + { + // Socket-mode: forward bytes to the user-context LaunchAgent + // over the connected Unix domain socket. Same TLV protocol + // that flowed over the helper's stdin in fork-exec mode. + ILibProcessPipe_Pipe_Write(g_kvmSocketPipe, buf, len, ILibTransport_MemoryOwnership_USER); + return(len); + } + if (gChildProcess != NULL) + { + ILibProcessPipe_Process_WriteStdIn(gChildProcess, buf, len, ILibTransport_MemoryOwnership_USER); + } return(len); } @@ -544,8 +586,8 @@ void* kvm_server_mainloop(void* param) memset(&serveraddr, 0, sizeof(serveraddr)); serveraddr.sun_family = AF_UNIX; - strcpy(serveraddr.sun_path, KVM_Listener_Path); - remove(KVM_Listener_Path); + strcpy(serveraddr.sun_path, kvm_listener_path); + remove(kvm_listener_path); if (bind(KVM_Listener_FD, (struct sockaddr *)&serveraddr, SUN_LEN(&serveraddr)) < 0) { char tmp[255]; @@ -841,6 +883,59 @@ void kvm_relay_StdErrHandler(ILibProcessPipe_Process sender, char *buffer, size_ } +// macOS Tahoe: socket-mode read handler. Same TLV-frame parser as +// kvm_relay_StdOutHandler but with the (sender, buf, len, consumed) +// signature ILibProcessPipe_Pipe_AddPipeReadHandler expects (no user +// arg). User context is fetched from g_kvmSocket* statics, set in +// kvm_relay_setup. +static void kvm_relay_socket_ReadHandler(ILibProcessPipe_Pipe sender, char *buffer, size_t bufferLen, size_t* bytesConsumed) +{ + unsigned short size = 0; + UNREFERENCED_PARAMETER(sender); + ILibKVM_WriteHandler writeHandler = g_kvmSocketWriteHandler; + void *reserved = g_kvmSocketReserved; + if (writeHandler == NULL) { *bytesConsumed = bufferLen; return; } + + if (bufferLen > 4) + { + if (ntohs(((unsigned short*)(buffer))[0]) == (unsigned short)MNG_JUMBO) + { + if (bufferLen > 8) + { + if (bufferLen >= (8 + (int)ntohl(((unsigned int*)(buffer))[1]))) + { + *bytesConsumed = 8 + (int)ntohl(((unsigned int*)(buffer))[1]); + writeHandler(buffer, *bytesConsumed, reserved); + return; + } + } + } + else + { + size = ntohs(((unsigned short*)(buffer))[1]); + if (size <= bufferLen) + { + *bytesConsumed = size; + writeHandler(buffer, size, reserved); + return; + } + } + } + *bytesConsumed = 0; +} + +// macOS Tahoe: socket-mode broken-pipe handler. Clears state so +// kvm_relay_feeddata() falls through cleanly and a future Desktop +// session re-runs kvm_relay_setup() (which reconnects). +static void kvm_relay_socket_BrokenHandler(ILibProcessPipe_Pipe sender) +{ + UNREFERENCED_PARAMETER(sender); + g_kvmSocketPipe = NULL; + g_kvmSocketFD = -1; + g_kvmSocketWriteHandler = NULL; + g_kvmSocketReserved = NULL; +} + // Setup the KVM session. Return 1 if ok, 0 if it could not be setup. void* kvm_relay_setup(char *exePath, void *processPipeMgr, ILibKVM_WriteHandler writeHandler, void *reserved, int uid) { @@ -853,14 +948,78 @@ void* kvm_relay_setup(char *exePath, void *processPipeMgr, ILibKVM_WriteHandler if (uid != 0) { - // Spawn child kvm process into a specific user session + // macOS Tahoe path: prefer the user-LaunchAgent socket. Agent + // registers in gui/ natively → com.apple.replayd reachable + // → ScreenCaptureKit works without audit_session_join. Daemon + // just proxies bytes here. + // + // Fallback policy: only fall through to the legacy fork-exec + // helper if the LaunchAgent is genuinely NOT installed (no + // socket file on disk). If the socket exists but connect() + // transiently fails — e.g. agent is between sessions and + // hasn't re-accept()ed yet — we retry briefly with backoff + // rather than firing the broken fork-exec path that lands + // the helper in the wrong audit session and produces black + // frames. + char socketPath[128]; + snprintf(socketPath, sizeof(socketPath), "/tmp/meshagent-kvm-%d.sock", uid); + struct stat sockStat; + int agentInstalled = (stat(socketPath, &sockStat) == 0 && S_ISSOCK(sockStat.st_mode)); + + if (agentInstalled) + { + int fd = -1; + int attempt; + for (attempt = 0; attempt < 5; attempt++) + { + fd = socket(AF_UNIX, SOCK_STREAM, 0); + if (fd < 0) break; + struct sockaddr_un addr; + memset(&addr, 0, sizeof(addr)); + addr.sun_family = AF_UNIX; + strncpy(addr.sun_path, socketPath, sizeof(addr.sun_path) - 1); + if (connect(fd, (struct sockaddr*)&addr, SUN_LEN(&addr)) == 0) + { + // Agent is up. Wrap the connected socket in a Pipe so + // the daemon's existing Pipe_Write / read-handler paths + // work without changes elsewhere in the codebase. + g_kvmSocketFD = fd; + g_kvmSocketWriteHandler = writeHandler; + g_kvmSocketReserved = reserved; + g_kvmSocketPipe = ILibProcessPipe_Pipe_CreateFromExisting((ILibProcessPipe_Manager)processPipeMgr, fd); + ILibProcessPipe_Pipe_AddPipeReadHandler(g_kvmSocketPipe, 65535, &kvm_relay_socket_ReadHandler); + ILibProcessPipe_Pipe_SetBrokenPipeHandler(g_kvmSocketPipe, &kvm_relay_socket_BrokenHandler); + ILibProcessPipe_Pipe_ResetMetadata(g_kvmSocketPipe, "KVM user-LaunchAgent socket"); + g_shutdown = 0; + ILibMemory_Free(user); // not used in socket mode + return(g_kvmSocketPipe); + } + close(fd); + fd = -1; + // Transient failure (ECONNREFUSED on agent re-accept, + // or similar). Back off briefly: 50ms, 100ms, 200ms, + // 400ms, 800ms — total ~1.55s before giving up. + usleep(50000 << attempt); + } + // Socket exists but unreachable after retries. Don't fall + // back to fork-exec — that path is broken on Tahoe and + // would produce black-screen / dead-input. Return NULL + // to let the caller surface the error to MeshCentral. + ILibMemory_Free(user); + return(NULL); + } + + // Agent not installed (no socket file) — legacy fork-exec + // helper. Still subject to the audit-session-isolation + // problem on Tahoe; install the LaunchAgent (-fullinstall + // in agent-installer.js) to upgrade to the working path. gChildProcess = ILibProcessPipe_Manager_SpawnProcessEx3(processPipeMgr, exePath, parms0, ILibProcessPipe_SpawnTypes_DEFAULT, (void*)(uint64_t)uid, 0); g_slavekvm = ILibProcessPipe_Process_GetPID(gChildProcess); - + char tmp[255]; sprintf_s(tmp, sizeof(tmp), "Child KVM (pid: %d)", g_slavekvm); ILibProcessPipe_Process_ResetMetadata(gChildProcess, tmp); - + ILibProcessPipe_Process_AddHandlers(gChildProcess, 65535, &kvm_relay_ExitHandler, &kvm_relay_StdOutHandler, &kvm_relay_StdErrHandler, NULL, user); // Run the relay @@ -876,13 +1035,13 @@ void* kvm_relay_setup(char *exePath, void *processPipeMgr, ILibKVM_WriteHandler // struct sockaddr_un serveraddr; // memset(&serveraddr, 0, sizeof(serveraddr)); // serveraddr.sun_family = AF_UNIX; - // strcpy(serveraddr.sun_path, KVM_Listener_Path); + // strcpy(serveraddr.sun_path, kvm_listener_path); // if (!connect(fd, (struct sockaddr *)&serveraddr, SUN_LEN(&serveraddr)) < 0) // { // return((void*)(uint64_t)fd); // } //} - return((void*)KVM_Listener_Path); + return((void*)kvm_listener_path); } } diff --git a/microscript/ILibDuktape_Polyfills.c b/microscript/ILibDuktape_Polyfills.c index 4d84b7b28..993a47dd0 100644 --- a/microscript/ILibDuktape_Polyfills.c +++ b/microscript/ILibDuktape_Polyfills.c @@ -2486,200 +2486,93 @@ void ILibDuktape_dataGenerator_Push(duk_context *ctx, void *chain) void ILibDuktape_Polyfills_JS_Init(duk_context *ctx) { // {{ BEGIN AUTO-GENERATED BODY + duk_peval_string_noresult(ctx, "addCompressedModule('PE_Parser', Buffer.from('eJytV0tz2kgQvlPFf+j1RSjL8rJCEVM+EOxUqPWCC4FTOQ7SCKYsZrSjkTGbyn/fHkkIiad2KzogNNPzdffXL6n5oVoZimAr2XKloNNq92DEFfVhKGQgJFFM8GqlWnliDuUhdSHiLpWgVhQGAXHwlu7U4YXKEKWh02hBTQvcpFs3Zr9a2YoI1mQLXCiIQooILASP+RTou0MDBYyDI9aBzwh3KGyYWsVaUoxGtfI9RRALRVCYoHiAT15eDIjS1gJeK6WCu2Zzs9k0SGxpQ8hl00/kwubTaPg4th//QGv1iTn3aRiCpH9HTKKbiy2QAI1xyAJN9MkGhASylBT3lNDGbiRTjC/rEApPbYik1YrLQiXZIlIFnnamob95AWSKcLgZ2DCyb+DzwB7Z9Wrl22j2dTKfwbfBdDoYz0aPNkymMJyMH0az0WSMT19gMP4Of47GD3WgyBJqoe+B1NajiUwzSF2ky6a0oN4TiTlhQB3mMQed4suILCksxRuVHH2BgMo1C3UUQzTOrVZ8tmYqToLw2CNU8qGpyWs2YUpVJDnygmrW8QEgCxGpJM70nTqR0lRWK17EnXg/IDKkNdx6JmplVis/kri9EYlhUC/Eh3v48bO/X/VCXEkjVDO80DDzmy5uemFDBJTbW+7sgOtgyEVBcrFVNJxS4ubWXBF+xRX07x4+R55HZYP4vnBqXSt/lKvTUp2ClAhSsf4uF2OCiBuT9zCxYRVvJ3uZOYn9Ev/F9ntufW9WHVp16Fp42yliHtSy7fjUHAu33X16rLXMhhI2Jhpf1tpd/TAPMLJDgnSb8Ns9GB8H1oNhJkAp7fpSKyk2UDMiLqkjlpz9oyuBcSK3kMQ1I/LnKdfGs9Ke7ZiMHds9NHzKlzpkx47ddtCxbsvMu58dC3VV1xDIynlurOi7kbrbsj628Lrgsm5LBJ4f45aU91LfQuxGziqnsEC3VaT7WIeDxIPRthzjTtN120FO1X5bX0nCNxKSkS7jvdc1+kWZBWp97R/C9rpdK8HtWmVwUfoKrks9EvkqxpzzVy42/DKobgwe49S9AJzlS3oYawR7APETQm3MNAQ6zW8ny/mzZweuGzfA+wuZA7/jeDtZkTu8QvJmRXxY62eN3Fl5Ke0z1Djvs6cSia/NL/aiaD19GRzQX+BpuKLOqx2tn8V1Ziz86VpFnjWzE28oXB2bva2F45Z56syI42wkvu4fD0SR88d7J4/PeWmAdsfM3N6V6bHo9bZ4tmpbn/NVm3bDYp5nkThj46eO2T9ZQUMqlR7FRNGZHo77ND7rba8kVFpR53Buy5qkccrmD6KeBpVvxFZEqrJlqsE+dUu1v84uPkn3+1/xabfKsno9QJb1awJk/ZdAlw6Q1ft1AWq3D6N9bpAUpXYTNx0tgPoj/XaKbSx+R53suvFfZMmcOzBQ15mea12s6MvTqOj9ENXrUZakStZR9FvG5VQ47hv5yUIi/OWKObqHOnsEbP3cx28Xnqxiy9KP+oTHZKgAz8itucfU/X7lHo2iQo4cjhqUj4cM3rPxcsWXHFoqmbP5ULnGLeRGy7xkzjFgbN3xckljMSv2nl21/ISa/YviAvMFX4sugzxsnmJVCHbC82Jeoe+OL0KaOp+bcfobKc0ovRq/Fa2FG/m0gR9xQipde/GHUZyD1cq/OIedMw==', 'base64'), '2026-05-23T15:21:45.000+00:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('_agentNodeId', Buffer.from('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', 'base64'), '2026-05-23T15:21:45.000+00:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('_agentStatus', Buffer.from('eJydVk1v2zgQvQfwf+CNFOoqQZOTvdkimwbYLLpOt01P9cJQpJFNL02qJOXECPzfO6T1QcmO064O/iDfvJnhvBlqcLJONCm0WnED5JJo+F5yDYxWSzQaDzxEqgx4FiJmyRykneD6bUYjVgN5kX5K7AKRSJGCMXEhEpsrvSKXl4Q+cnn+jpL3hNEpPvF0WvACplNK3tQ+3hD69sPV7adrGpERYTVN+pixyG2eVpvocHCSlzK1XEmSJTb5M5GZAM3SRSn/iwYnz4MTgo8LS4Ac7/7xnOwAMa7NMdLfyEVEnoldcBOX0ix4biuGMWZrSy3HZNvaMjTD7HYUGpLs66205+8+3rCzKCK/k5D7Z3jbGF0KDbMRPAV2MXSRY9YX0bgFFslGqMRVQ5ZCVBtWb3Y/qqzd0wL/+nI3iYtEG2DOTWzVF6u5nLOoJq5STBObLgiDaI/MJ1LpIp5pWDJ6K9eJwJJ9BlMoiQr6DCnwNWS0ZnVPlWzHzaFoT0/7LgyrMsCDNqWw77t/R7Tj5zXroUcczvepm2+/3q4AKJTXa1vXDS0QhofrqLaBTr+XoDdXrnWYelgOsUtgjZ/YMl3B4qG5+sJj3Z2soWCYzhAByyYEl6zvTTNuFpZ+YYkB1BkjZTxDp7jxTNJVNiLUR0OH6FGUMCJucxv0iQvOta2T2b4gHF8qOKYSzgUJlkZxip1h4VpJCT5o9uxzHPnPmhLHQD0uqo1tTzcVf4wENN2RYbTtSUQtOgisEYMzc3JHm2A+hD46UJDZS+wHPLzQE6lQptcAXlG7eRUuuTK7YvxR5jnoOEca5vvU+Nbk+YbVJYv6dM72ocxb60QIlXrdLWuB9kwQHj9qbqEZWDXSyXtIzvoGyzhVxYah3bCdP53MPZ0DhLvbXoeBMHBcO05mh+uuYaXWcCXER24sSNCmKugLOjmEd1U9Iqvj+uiBjyjkkP5eVUZPFf9XEb+ohl9SwosqCI5mTwfbduJUkPAdw7YDCS8GN8+sM9x2LnRjE21ZOxSx/Y0SEAs1Z/QfN7fwRMjfYBbEj1NnYCGO4+aA50I9JCKeuY3SWHwBIQbsPV+BKi3bK2JQwI6vrzJ5EECscss2SW3gNHTnnvplZQZP3LLmNIbk/OzsrK11cAnUYw0jwbFpFyD7g74F7AfqhrSf/dWMxsG+uwrot8ndPbm+m0xuru9vPvxLm3eYvfyCI6xcQYbZ4u2AakC2/aucsDCBDEyqeWGVNrQTbZP+Xl7r41mF4a1D9524D7xjdAOzWGlsm1z9dFju/HrOD8Acql9oB/OvEq/jaqWvVFaiH3gqlLbGX8pe86Pd13CnklEgFrybfwDySlmh', 'base64'), '2026-05-23T15:21:45.000+00:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('agent-installer', Buffer.from('eJztPWtz28iR3/UrxqokINckJTt7e1VStDlZkhNlHUklyevdsn0qEBxKWIEAg4ckluOr+3j3/X5hfsl19zwwMxiApCzncnXH2rVNYh49Pf3unsHWNxsH2XyRx9c3JXu5/XKbHaclT9hBls+zPCzjLN34l7Aqb7KcvcoXYcrOM76x8SaOeFrwCavSCc9ZecPZ/jyM4C/5ZMB+5HkBvdnL0TbrYYNN+Wizv7uxyCo2CxcszUpWFRwGiAs2jRPO+EPE5yWLUxZls3kSh2nE2X1c3tAkcojRxs9ygGxchtA2hNZz+DY1W7Gw3Nhg8Lkpy/nO1tb9/f0oJChHWX69lYhWxdab44Ojk4ujIUC6sfE2TXhRsJz/pYpzWOB4wcI5wBGFY4AuCe8ZYCK8zjk8KzOE8z6Pyzi9HrAim5b3Yc43JnFR5vG4Ki0EKahgpWYDQBFgdXP/gh1fbLJX+xfHF4ONd8eXfzx9e8ne7Z+f759cHh9dsNNzdnB6cnh8eXx6At9es/2Tn9kPxyeHA8YBPTAJf5jnCDsAGCPq+GS0ccG5Nfk0E8AUcx7F0ziCFaXXVXjN2XV2x/MUFsLmPJ/FBW5eAaBNNpJ4FpdECkVzOaONb7Y2Nja2tuA/donbCP+F7IYnMAyryjiJywV0CEt8UBUCpTjAn3lxw/aveVoKRBZlmCQsLgueTHGwEMcZh9HtdZ7BtKzg+R3MOSCMQct5EpawnFkhRschQxqtqOZAu2UxQqg2ynyx8YnIQAEIgGXwP4BFoM6zZAGklxBuYCv28zxcDBCmKS+jGxNdADxP+AwniacAKqAcdrIYALnMsjvEHTWucoIYv/+lykpeYGt4AqSU03YAjSBAp+NfeFSOJnwap/xMAtWj+UfzPCuzcjGH9QbXvDwL83DGS54fPQQD6oyfT/pf+LkLk4rvsGmVRrhZrJdClwGD4cMqKX/Ep32rg91dDAG0g8spdxvPED29mO2x7V0Ws98Rz44Snl6XN7vs+fO43+jRHB8/gIse9n0ffxzBnsNGvQP6JWDZcxbsBf3mSO2j4QfABbD0mNUYuSu9piElhDDyi35zTSZMMIoJT7AJgLBPcnB6qAd+QShSQw9xaPa5C7wqT2mCFhCafZu/qFGs7bSHqzt9hic2zT8xybNHE/DXJF+FIyJNm2t6wXAYABV4Bu3E4ueNKASU9B76G5/gkUearI3ZGGTog9JVDTQPLDw/Gs3HOMl6uF5JOPzd5YKxb48XD0QV8RNw39CVIl+JWkih8CenkAkMUfJH8uJK9CEF8ahBi2KI5g7E0178/d72qlRCgxdokPEeaCqfUP/899ggi6MJXeznn5GpoZUSmD/9hPYhNkA7BWyU4fCnn/Z+/vmJWJyk1+pbGK+yf22qVP1Csut02kM+fO5D/lfRpO0atHN3tUmqkQBoFSZjkYE4AU8gui3QnsQ9miu8MoCtimBGTjs9C2/JphPcOIvTeFbNwBotcbfRT8gN3izIxEM7HL5s6HlpJr1xRQ/mmhV9SXqI9xnYwnvs6s8Xf+zJFSIiqZnFSj1g4SLK4zkOGwxYWiVJn+3t0T/Yb36DA42MJuzZnmzziYnR5lVBQtVotLeJEtbtCcIWNk5tRys4MTBjuDiB763g1E06wKkbGeAYPVcDB53GMO0Ex2jSDo7RqAbH7FmDo+HBJujDWiNv2LymKDLKUnC3yoJoajjU3WoilPaB9It4LqQOtQbWglXv/QTyRQoW012VftJwFqbgD+WjXwo9u5LQTcwJER0oOAKDzRoC2pYcYiy/RK6508auXIBGrF6+xOqG6Ny50zNwHy/EUn277SIeVoEzOb3sbWouTm1XOJkUjjKWaJYGJezNmOOuFtVs6TY0EeKAVWPGhddEkI1hnhS8fRUXJWqxFKSZM6Be0Gg0Ym94GcBikyITEktTn15uAc0cNZOzcjZHosozeA5rkn457kRwH6e/fRmw37OgdvcDtsNo+8hdD2yBjhrZ/N5UU2I2SfG94IpGOckm/HgS9EdFvbZeq67Aj9QUD11aUZKggcdLoAHpPKCFYK0KbYR3oCCz+2KAgRNzkfSQA8svQJOm17RbLiqBRHFtQJK9x+Kyv0zHr0B2CINLZjb6Pkv+NDRsLNgDYMgXYDXFYP3giiX96MiImKvWi/K5hKFH0k/rRYWEopxkVTnCOBvsN2DtuB5VjqhgRQbMEg5myjR70QsC5QYTlZLQYYLhd52fH4RUDP1iUbQJDM2sen0Pbo9HxgtGkkY8qAzGZ2M+mSAfzcMIA0IpU6NioIsiWBGYjjMM4FVzYZ+cXvBaaGjwPWCSJahgMrZNNpXCWT63RbQeVvyD2pa9gAEr/QLbKHBYU6haubLY9nD9oD1t5GoK0ViGvXxYvMYAby0o+AOPzkLwEms53072LpKdAcW/FfQ4tF7AiB6byzBlTENS7k8mIhytVTFGdo3wItGsiEqDSAWpr/dWh6mlFGBvCwqWhqUhSE0+cDgzNFhTd3i1wFEEa2qhBzgZ5vwaw8iwslEFLVAPXWbY9ge+6OmW+GhYcBHOhaZINgLLp/cpz0lOarTHk/6I3LQOPSPkJn+IfDpT7Tv+qRWSxRmnKXsTpxVQobBlnHVa/tc8m1dACSZm3x4fKsuoqpFbtAkaNTGSYGVqDRctJXhbxnKpfTyhoMYKZCOaduH8bTzpVV34bMfmCsSBtAEwmJyv2eM5sJBkAW1XKY/3HQ9yjPwT2kDn5xywTQg8PRN5hoz8Unx4gxoN/m7aNSN3HLVvFKYn10psagyC756jnBvA7kFjBQf5qlIK3nN0oMICMwWgRjLXCqaOWgfLniqtkaVqGHDD0qA0zBstirK5SGXstWwmMsCOT8r6bM5HK+qBNacQnzvy7709lKK/X8UK8I69I4axp5D7hgJ3pyGCnabou18u5oCGYP/t5enVxeX++WUwaMor8mYVsuznV3rPYFl5VfPiZ0GGchssH8+r3FwfU3UU8STVw4ls2Z36zpSGl9s2peVlm1OiaPSkpYIuUIzBlEWyTN2BTlWzmm4nNAhMH/g6ycZhMro+lUTd4naCaSliSXFBf7v9yAMr+m1uUGa2Ahi8vX3CDeZ1247jNAQbcYnjpWY0qNYzrxjLnfizlm/HUxYyIfxEdvk+RFkB2zYAORNgujGNkmrCMRonQ3UJKFVUMWKtyq+bo8t3f8NTV9MQy+nt0CpginJfxPcuFmnU0/K439wa1nPwWwclXMS//2iGx6ynQjl8AlulyiO+U2sAcIz5/QkJNdVBWmvPtWag6FmNQYU/gI1iIfPFEJzRABWtFqiIQWECocmP2gMz8IiSEQazwBKfxteVKCEQyCfEKzRHVZ6jNXWf5bck0AFtUZlJFWukGhA/vbjmUx2BrAHb23xBIUafMS6Da47p6ZeoPVcs+u1JRAXMttNsTxilx7tPsb8IO+ydtq39AiNBcyrA6JamPkdHA+hKW8NAUoGhfO9RuCQoFkXJZ+A9Aw5sEpEI2Aw21eqHAa7cbrW7GkXKbTDosV6cQpwmRHO0WtV44kyfDSrZa9LIVZJFoXIwJaHoaJZlmeoKhBRLCwzjcSUwzIZypOP0DMdB3wr0364jmxybSfDVAmRMiK5zososZEnDTVYlExRFtSOBxpGrB64kO82RGJ/Vcc+Wx0HQ9XCr4XS5qT4PZryJP1u2mxxR92ym/eRSkbEaWb9mZMO3CtPXNz9jMHRvu6MbAtAuvC5TXQZSHLudVkQOnW94v+v12RaGnkk8cQtjvjb56NCsVLRLhhfxhngV0p+G4AauzdKGAjetH1TflgKyWIiCLaTIpdeg8ziPwZ2ZSViCO9tAezTuVsFJh81nsLI2kNKM5kWdI6SQqXTq+bTmoTmUn+uJaIWATtjehRaWPmd7BTXkxP0kRLb/6on9sfeHpydHHz+kTn5iadyoyaUiFKHDtQ4p8ZTK/SgOpAL9whTMq1Q8m+bZjF2EU/7nbMJRZJ3wUrKxNZEVsxlHGKMWo6u+DhJGTp7cZH8RKyhi7omGedF1dH5+ev6RoajBXk38gola9ixNikZHcReZ8YxVzAkXfMXBszA6vWBvwiqNhLO6UyerUJ2AZ8TBqo7COTIqwBmn86rEnOxleJPxkRoHA+/CThkWMRjsYsTDkM8yWfCjNqoPJvydCLGWuhMLq0lcqsFkbIb1Qhjrb//5Hy+24fOiP0ALP0dzfzbCok8+yjn6kBMqXUxBaUQ3uHMY8FBDUbJEcUOICeYhBaaMFYuABBCOTCGhmJBeEMa11EjD27uZ0PZ/+/f/Ygn1n7AkCyeFlmrXVbz1uyqefM9SMKzveLKg4GSMFkKYy2gxQpWKBeuVUgBNrQYjOReE9wOB9h9iYYgX1A4oSI1DFggOdCUHukIrkNqGwv3FFhPahWExD+/BdkINknI+Kay9E21AhMAqr3IOcMCQZTUHExRchRRs/0IkODHbRljAelTA6Ns0ftD7lkW3YCySH4bRjwPMN4RossVlHGKhZcgOeXFbZnO18lG3tz0Jc+DLhqEDDDBCzPeWiyTGht9jNQDWAGPkXmycWMNoNFot7ry6yDToqtewa/wlM6nl+1G+0tvOihAhBoAH3oD1jP16/ZY+q4SK6gloS7B5scPeB2+y6zgVIjgYQP+/VGHw0d/VjDa9DzSrBB8brU0Hgnou1ySuYjiezfgE6QkU3TjLSrAjwrkoeja4WpsZoBSBFVXuyR0MpQGQ/SSbYaG6lUkAOcMp2yO5jtgGySgEtr+GH7bcwRLEGIsWEQqhV7woh3wKtAxCtbiNgebBvUpLVM9TzPVKiAgEO9W4PMuKakD2f9sd3a5buQlX/CDnGeOAjWJ8e7anrapuaDo2kvhP79Ic0WeyYC03UQkac6PHabOnu/w5hoKkQRxsvYnHOYjsLYMEChrTDQ6OqF/gH1djMbqJk8mVXBPFiniE3nEv2ALdsCWWEJVJCyvh532gl43s01zjoF7Cx5Z1rmFnqU9beR1+yEBhvfHSWsG2eS9+OD4j/VfzHWivlD+UgvY9MPk8NwmHtpSaQKxtMbmxxddmtt8xH8MJKll2fPLq9O3JIXt7eAbqPxGnL97x8fnlATsMy1CqpnXSnkiXSYbWWUNAr6ap3onTKmwKVHiPNgsCJhIoPmJm0ryTrGLBQUvaY0t2+rCOw+80h5fYuMzD6TSOPMQu4oLQCRRMnI7R5vC0Osuza1AQO4gb79Myi7IEhoCt8HfHiBU8P6vG4HkN4Jf4DhTAgB2S3Pb0OayD+jsy0aPMEaEf5NLOXp51LO9ocs3hKZg6RZicZTD3AkaDfUGV2GxNjsPESajg53O9+5bDobYZJAwQ5Wv57Rx2rofbt77HVTOA8Ahl8JfsANMbVMk89ktVGOnvjY6piD4vcCCjssOQ0U2/FHmAZl6B+t+f/mAtA/+Uudc13SkfMmpfEtcsw3X8Ad34GBVylGQFt/Aj7TphzEIfrBudZCmQHCKLhxNRXposEBmyRPUPYT7Gs1oHGeCSuELXJqhhZcI2LjD7WaFhDQsJ8xhgSNB6nnTbw3X2CXFLUPewypHJpICsxiv4Mdif3szZ1RWaIkfgV4JS2u732Z4ncuJ3P1U9EZ6zA6IBLMzRi6tSI+cSNouI9HMpq37r1BFpL/SGjpQZCnygqTSV5/n0WI9yG7oI+625ikc5CST7qaOwbFb10E2XYcW0tlVSZqtbA4JRlbpOkiWAKAkGbeL0lpJgZleyTNY31VXThqp/pKL3jWoXnmL0zIiwPdMpBkocFkDwBbibQSOvh0WXMZUJ1bztkvI853dxVhV1QI0b5xxFqQTacyAQK3kKVrYTJ3PVXP4yOlPS+Ytx3gnQ6iQEOs4YAqETChLwLCXwSi5ONJpM4g3/dfH2BbL0S2RqJa/0WGJFrUz9Uq5qgGkks3K+4IAg4MeFYgoj4mykEfGfE7C5XovUilsFCJbUWc6n8UPjiQZEhVvdBkbFaVs1wRPWjezivmHGzBT6ogZZVMbIepu7GCvSZJlMIRxCoxxGK67z+qAR5W0pUwut1REGbIY6/lM7W+OGoIqQnAhfKczsZCzc1JzQE68oDnZIFRNtYXZBqJRqJi+X6itIK06V/12B1SVCagNx1jYupK1JOQOFjxEzB6XCVRr2BrYfU/tE89Ki8ZA4mfaoRkVSWwQLJZdgXFihX1e+UJC49rztckwneeihs0+0XoEcgShh+Slr77Mrp0A+NcTTcHglClLQ45AJ0CaCa1xMwwjPbGP5VpTwMK3mCs8iSR0WRRbFdlVeXQSBH4vNPPyAhzFVxuswzlXlfo0Kkxnb+us2dncpu1dWxEoCW3K10+Zs5kIkwXRLxRVUtSvyeoZkGTTo47HJkhWqbO0Fy0U7/i6pJuOUoqj8/uqpk0lc+HInBqYsde7smnZXFGVTHWna0L0WugxyBv7SdLemvUGkd6gkl9BVOLInBuXdo2eePWpOLpcK3shJlg6VR6JvSmgEKhQeatUBwlsav+aHTE9+x5O3ePaixogqkNnyBYpkh9E8m/sig/V4qqGoMNlqhGTx41T2wy8HCDupgTmXZUZ73/vgaHbFHyeMMvDG7voOPbT2hy2h/rWswtDfN2sNcLh/fHawDsReNLeMPonzL12hHkJtlervpQ+KaJpOyZIQZ3EDovt9AH/5gpPUWTFRBmSBy4AO9XnWCI0MG/JoVGYX4mBpH02SrnF5nn+VceNU8XwLifmjqp7+ikI8SQp/j82kYH9l4f0tzLLaFJ9WBIVRnPJX2+zf2Na/Nsj+w4fRVn/1kdaYFD7FzV4xB9SX094mYOTDh81fF/DH5oD9aru/u95QlAruobm6er/PqzXd/Bx8SDdX2yekjK01yKCNlR8zhMnKK/dHV44ayyYtfe7DuDwSXl+jlZ0nsA4r4qdNjbVF2EWuGa99ms0wnU1qy9Boa2uwDx+eUIX5B1tPSGo3Or17j5ofdjD4KLhN0PFvX374EM0mVJuKgnTrAD0jH6EAOB5NRRWjrbTlPLU0wBfI6y8Qye1dDbpzaO7LwktGkFgHmL4kSHxAZ2qp6kUFLQzXqelqdJmSNBYlcprDOTYlBSnWrucxwxqw64dxeJ1mRRlH7tAyHdWWjCp0FHkp5l5jtszZiVYcsKYz142GRqCorso10W9vAX6+0HVrx96jiLJJkk2IHxPzbI67nNRPvLkhsBRsXHviDXQyw9kv83SG4VkenJ+esF+ysThQXK5KGfpKNncW8j7LsLhlRXTDJ1UC+9dkGOuMObYe6tbohlJEpX2Xt8AlibNJHFE6y6Ln0ZUM1qjYhvkM1pv2arm37v62ZO2bCRK6RefKihPTBppC9ymIa73Zl0WsWxM9dpD5dZwb2aNGoLk9xtzMG73iQHQU49NtB2a6yLguTU5D1NVy98NjSyu/dkzZKNd8J3MOYRKJI5z36m7FOjqsA6Ax2GXjsBCXWFIcsFYB+n4zI6JSX3TTUryw5hlwMRZek1FfKLRNCYL6QqFv+/psyRLq0qM1OijkOBnvbG7tvIwe38TpLRZkzuhK1bGODOsF4trj4lzGi9XlNH/9K7Me9BpR2u6seSZKn+xyDdXVU2Oyt7ck5Cdy62j3tkulZq8uAXFxeXp2duQqeHO+hqXQxvkvLRkickKO7ecXZetB3CbSngBeF9w+luMDN56B/IgL3qElVrryZbXMdTtGdM5cXnCFV7eKIDdmfFsvMVCI8SeG1/YBaxrsGmh9eutOLvptI4/EWLuKolWT+QBQ6my/TlJoUWMkK0yrqcjAUSux2FRcIMIfyjxU+EEZpFlCjnREJ1R7WDXFVrl8RdroO1QrhoY/iEoDv+vVsjU8fK1WzfC8U6jmpp+ySt8yQ6XnazpPzSq4towQe7/964+dVqJTbwXq2qy3KvYLTJZ+QsDqWjWWZue8qJJSZPYG4n65MFFfy3jGAfwd9uKftre3LR94Tr4yjYahA9tfXst2+5B/CVqo5pQIIfAYczWkOJYFZd6RbZJpaQ0IppdiCUrrluOnbTeEQ2EXwI2M2sRW0Kdxilm+R1vlX4bcFS363pcb035b+si50Gk4BWPFY0rjz9oX7/1SZKmIl5uVGnT3FDDMny5OT0ZURGY2NCxAo76sYfbe8XwM4rSjtkyF7gteHnJwxlJhYqqfjd+K0eHxxf6rN0eHoqzi+DWTw8tL2qnaUt243K9PvKfZEIw/NWKSXXej2oDoOJ1mbzCW1nvhm9Nzur64ye4ZpiFEDI69oDuiwHIvjEnNa71kPdJuowLJquG5CZOShVO8adAqSjI0O8GgziWj/QIKxhwv58M6b1hnv6NsYtzYr2shRsKM9t+EScCeics5/XdzyvtgjIMg9eVSqS69+eqVNxdLKm86Cm6UF1FHAUM/4/tcp1WDgyA0rMhg6wSb5qXKm18eLnROLa4QGHTLrqC5DMYv2SIMZ+/Q8XQ3Lr+CQWbOqP9t+4/1z4YXuWtGky12qytZ6B4mWu87/Zu41KJnVlFavfVke1aM3kwkORHU7lAdENhJ1rLttqUoazioPhsTPOtG+8ymzWOkfgOT9EuHZtExFsFRqCmY2Bhb1Rw3FM2AqUPP66ocY7yjByGPjMHWBlcUYHvB9QwvYaVj3e4dPkCt7lHvPd1z14hLdAjO+r5SQ3B2yOFaqArutUsdjVrKfxCZ2y5vW+XBM0seyHXQqyIadx9eGTf8EmM5ar/XxykM/W2BMGAZvuvjHtx5ui6abgqntvhKFKHNS63W/2fNn0caME6A7P+EamtRa/q5/yKSFrWw28CxcXVpy6MztXA5HBMndlvuE2lPxT2xIlmhTn0NzdJ0Tiz3RtwIb67D5HV9H9MemRWNSKqpgD1lyLsyQ2XX8gJ7qyJfkUK64c2qfXJIB06dMrYU1ckrKUgS6avhXQVM2gI+bKwTGB3bgzdCzjLMbQHm6NVJ8nLEGmWWFtuxvw58raw2dgvtJ+7YXwVydultUuwNvw6jhT5U9UfxPimlVenCbXmZPyUSk+mwmk/C0jgWVCyKK/FbLy60SzP+7tu+88oHsbFKYwaizySQSWQh47TeU/vccgpApz/22OZm/XT+YFz7p6HxHe5EGoDOAKY+dfJ703x5VU2nIJ6QAnvQaMACzMB89y3eYVrXqIEatW8+UreoL7u8yBE1Bg5RvGjIUbIOSOIQaMJEAzeR5qCMS6MejA4CzGVJ98x7+Xx4y9/SZPZJAD+kHmjPVcp3sx5qszZ8fFF8gkUW5M8fmu8TMQ8XG6LRlJJSRDGGBclmG7OR0IwiRXQT3uELJfBEaIwJ6fp9a9Z2PWs9cR8X51lW9lqvaxR5vEmGRwBpMp5m1fWN+WI3EiB4f54tn0TIIYlv8eqDaRgn4iJzIeHxOlVMZ7v3lht8RM5EKdQGLi3JsjkZ52MehfiiP+KpCETSKFKnJNFmijBwUMk7WzAOEnEAJ868tImGV/ANijAfDsVVhKasqyRN+QsvrrincshULzYZGLxumMAGr/Ya5P20uVrz3sH17Wm9jvZyF6Q9FD/GNYXlTZ7ds16QkFAOGu9oqYXio2qMmi8XakpTdRy4JZjQoA9G7G8cJBYGkjljR2XNtIO1BCvTTcgq6YvmD912yRle4+E6K4YWRp6yBqQbiakksPXySUG/9h2U9GW3MdLq5YUw54C9z7Dwri6AFPEUEOxDBLtR52fV+IHMl7fRrlj6J97cBL2e7zGzoLpZT91d1ecUltIFIw5gIxh6Ji+3pCsOHXr2LcRgGpe8u6agWxSX6amOATT6wfpV8abvQQ2tDyV+3Htd/ODg57Es27IM/zvZHsXG6rMKO7dB0xyxiSvF6tMm7H6U2QB948oTcV3G0fmPxwdH7OT0klGqlH3TdsWMb7g2Kltz6E7d1sTG2nn5J8REJ6jNV45oI/qZcnUxq5HfhY0rr93nRHzlsfzWqy3bAfsOr38bMMdL2HWnrK1fvE2Rjhk3nWbL6JP3L6FhyHpvjv6wf/Bz39f2kafymuz1JTpkpbqSVaY0Y+mNpzqk/s/+g3pUIeVM8qw5SxtKll9sZR9jRhMY9aG6pNu+Fd9dbmcZipQn0dK7jyzu+ZDup4znOea1o6jK6ZpxrLKrlMATbmgX7yxjHZsm6SpzUQorjH5MNJ/IQIK4x0XdnKVvEJuZro0LPzUWBCZe2g1GL455lnBwTTFNaIw6Wp4+2DDjI6oGrS0NX6NXb6wc1dBjPK1meEaQy1ef8KJZ1Ya92qiK7j0W9R6YgrRa+vdYcfT7+cfRXEaiXGJaUe0oJN2Ca1aPab3to7npzsbj538daxzU7iFeLY+1p0BVl/lCcAVepwf/fbctK7wLb5WepKLWSj3X0/MgzgLKT+1d1xa5oDQuLMJPqxrUdRw6E7WfUlpBh8ZkpExFyIBULzAc9lYqN7rhBosIxO2jAvIcExGFdeEGcadUifmP4mlPfBUCt86qiRd5btcVG3Uz08o2f22+9Mm4bpasnt22y4dX92nqCcG1qb88LquMXpDEhsSV9ofMy6MemmJIvKt02278lV2npsskN6fbN/IAX+9sazooV+8hE3kqdwYnIR8XJ+EJvbq1fgnsdv2KMBNn4v2un0UE2An9yrLAvFETVpMwbOYVtVFNelg3Ut7kVXdVI54kz5ulWW7R3xcX/DWF6OOq/5ZX/i3LpX3Iu9bcrOizZ26r5PPo4sdV4dXTLVf7j1lg28UYklpMIeaYKIpsjYJX2enZnu/FO4qy505dnZvXwLdDSiMFYVYYYuetRa8yoWQTP4amNPEvIXp/PeI/MNFT5uu45FTRsf2ErNCBiS9nBZLdNejPnz8hiXcA7iFx/zDnsgoVABQxFQdgOkBs30DgNdu1feIhbXU9dmhDKi6NsUkYmjYIWNFgU77TKw1WR2R9a+kSO9S6tDQwrxp/6gtLG+zha/r/t5c+7vbS/cnEyx5LGMSlay9hD0QRishBi6NXyVQY3ZhKtmI/hFJHVMtbmkVytSUlresMgixRCemB9a4tN1td29TYgl7rIexD+CoqHjZ9t7kt8fXWDyuhplR3kBhzS0fwwbxiRYQRPqRHFATRYY860j2id+u5etgzOmjjVifhCmG/4+LVir7p6/mozELi1Y5jWHuirp5I4pSvDOIy+NpfQdaKavB1HtMJVBd5NJuGog/z68IgGvwq4G6dwBrZnK3vDhEMx999i/2DxiOzpoFwJW/RyJE9jboGXeqg8Wql/xUKqf5rfYipWsxb1ICQiqIGfW/M4/exdf4BYaT2f5p+vRJAhn8/YheURcfkfM7pOroxXfiPF5AvZhle5Tmu6BW5Bb0Cnu4sxMHk8BfVHCt+nPofCRjGzHWcfNffRsUKsJ7aE0IA6bk0ui1knzO6JSCV8jd/2xXy8kulsm9q08bw2R0tU7e7qJ5JDENHTmH8oi7a8U+CxaSrTGG5A2od5m8d6xCVnJbiBML8b0xSTwY=', 'base64'), '2026-05-23T15:21:45.000+00:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('child-container', Buffer.from('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', 'base64'), '2026-05-23T15:21:45.000+00:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('clipboard', Buffer.from('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', 'base64'), '2026-05-23T15:21:45.000+00:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('crc32-stream', Buffer.from('eJyNVNFu2jAUfY+Uf7jiBaiygNgbVTWxtNOiVVARuqpPk3FugrdgZ7bTFCH+fdchtKTdpPnF2Pfk3HOOrxhd+F6kyp0W+cbCZDwZQywtFhApXSrNrFDS93zvVnCUBlOoZIoa7AZhVjJOW1sJ4DtqQ2iYhGMYOECvLfWGl763UxVs2Q6kslAZJAZhIBMFAj5zLC0ICVxty0IwyRFqYTdNl5Yj9L3HlkGtLSMwI3hJp+wcBsw6tUBrY205HY3qug5ZozRUOh8VR5wZ3cbRzTy5+UBq3Rf3skBjQOPvSmiyud4BK0kMZ2uSWLAalAaWa6SaVU5srYUVMg/AqMzWTKPvpcJYLdaV7eR0kkZ+zwGUFJPQmyUQJz34PEviJPC9h3j1dXG/gofZcjmbr+KbBBZLiBbz63gVL+Z0+gKz+SN8i+fXASClRF3wudROPUkULkFMKa4EsdM+U0c5pkQuMsHJlMwrliPk6gm1JC9Qot4K417RkLjU9wqxFbYZAvPeETW5GLnwnpiGB4qjyerqFOKgT2aRbfvD8FS8dGjfyyrJHSdwqlsc0DxEy+jjhA99b398PUep0RKbxPqFfHAsurV//emWew2cwgvzgG8q+SuArKjMZtjFvvnULTeN4Q9eaY3SNT2eG1ERfCKdnNSdODvgIUyP5b9XL9/3aiQN3lYOQfecCcmKc0P/6eQf7K/Hw6lG8Z5bHp9ft86v4OVpKAWrKyS3GSsMtuDF+idyG6ZIcvFOKxoguxsQRQD9J1ZU2A9gDznacydDuiJIpaX7n+ikBYeOvgZCu7s6uMnZqrQqMKSBV9oa0rdvZ2ja7nAg6B/4IHJ3', 'base64'), '2026-05-23T15:21:45.000+00:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('daemon', Buffer.from('eJyVVU1v2zgQvQvQf5jNoZYKVU6zaA8OcnBTdyu0dRa2u0VPC0Ya2wRkUktScYLA/70z+rbjXWB1oTScr/fmkRq/9r1bXTwZudk6uLq8uoREOczhVptCG+GkVr7ne19lispiBqXK0IDbIkwLkdLS7ETwFxpL3nAVX0LADhfN1kV47XtPuoSdeAKlHZQWKYO0sJY5Aj6mWDiQClK9K3IpVIqwl25bVWlyxL73s8mg750gZ0HuBX2th24gHHcL9GydKybj8X6/j0XVaazNZpzXfnb8NbmdzZezN9QtR3xXOVoLBv8ppSGY908gCmomFffUYi72oA2IjUHac5qb3RvppNpEYPXa7YVB38ukdUbel+6Ip7Y1wjt0IKaEgovpEpLlBXyYLpNl5Hs/ktXnu+8r+DFdLKbzVTJbwt0Cbu/mH5NVcjenr08wnf+EL8n8YwRILFEVfCwMd08tSmYQM6JriXhUfq3rdmyBqVzLlECpTSk2CBv9gEYRFijQ7KTlKVpqLvO9XO6kq0RgXyKiIq/HTJ7vrUuVshdYl+nSfabgHE2Qhr73XI9DrlkU0sYFUaVcu+iiSh7XcSE8Q2F0SmAaS8w0IyW6hoPvHQaV8FH2dXSG/16qrZEaYbcLtE4YB69eAUfBbzdwzpezh3W6Jis/D4II2BVwA1WSE0BuG8EJRLFDR8ciOleDT0WbeLidbmWeUQkqVL//l1/zAUcomoBDvWBu8QWSYSKkGQejTCschX3o4WSujLfGOMTVYjkivzHCzQ2oMs95qp0Jng/XbWcD34rwMwGNHS67IJ6BQbZ1TpP2hXtz2wmc9jkZvMOhwdic9WCED8SCHYXxjF9mxAb5xanI84AK0exMiWFPHekIhcPK+YQ2co8t3aS1LKnFnr/OGgxFzugC1vbZBLHFfE1ZyHrdM9bGFrlwdKh3LOHRXqrfr0bD1FoFo2Xyx2q2+DaKThKHHZtsbwXXEVIZ/m4SES/4iOknuqrPzJ/jT/Tcpey12QPoN5vzzW1mwgnq8ejueJmNttGY/xHAnkwweQ4ui4FfaRTwiNl0LHe6Fmm4vapZdMJsWL8tv/T50KTindjy3wKDtxG8bUs0h6abNaZ/VgSyf0SjGl5Ik0pmdacTeP/u/Ts4hDVYVljUS+m8gDoMO52VOdIG/b5ddeCgKVAtUY1tUi8kvF/A95P8', 'base64'), '2026-05-23T15:21:45.000+00:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('default_route', Buffer.from('eJztVttu4zYQfTfgf5gawUpKHDl2sgs0rltkc6vQxFnESRaLpghoaWQTK5NakoqcJvn3DmV5fY3bvvWhfLBM8nDmzBlyyMZ2tXIs0yfFB0MDrb3mjxAIgwkcS5VKxQyXolqpVi54iEJjBJmIUIEZIhylLKRPOVOHO1Sa0NDy98C1gFo5VfPa1cqTzGDEnkBIA5lGssA1xDxBwHGIqQEuIJSjNOFMhAg5N8PCS2nDr1a+lBZk3zACM4Kn1IvnYcCMZQvUhsakh41Gnuc+K5j6Ug0ayQSnGxfB8Wm3d7pLbO2KW5Gg1qDwW8YVhdl/ApYSmZD1iWLCcpAK2EAhzRlpyeaKGy4GddAyNjlTWK1EXBvF+5lZ0GlKjeKdB5BSTEDtqAdBrwYfj3pBr16tfA5ufr26vYHPR9fXR92b4LQHV9dwfNU9CW6Cqy71zuCo+wV+C7ondUBSibzgOFWWPVHkVkGMSK4e4oL7WE7o6BRDHvOQghKDjA0QBvIRlaBYIEU14tpmURO5qFpJ+IibYhPo1YjIyXbDihdnIrQYypqIZK4fIoxZlphrSZG6XrXyPEnJI1OksIEOiCxJ2rPB80saK7V3nYdzFKh4eMmUHrLE8Upk8IlQ55f+sUJmsEu0HvGTkuMn1wnSYZKylPtRMo8voZdohjJynXM0QXomFWUrurGJLaAzGpr/ifMu7pjiFuYeeO35CDTFRjiyv2LR3asXZurQnK7hsTtZ4t+xBDodaLZa3mSq1GVq2RSbbR0Ba9I38mMWx6hcz6fZ6JYO6n7r4tT1pp5s28yu8LDCcC3LPW82OcdzyhUF7WTU5Kiw6Z+gwthGf+C9TbS9akfJfGl0sUfb1rU43tlr859Kr+2dHe4t4pYoFlLIfIneAeyAy2Eb3n/w6vanvbqKx+DSyn8W0LJQG9jY1mjAyeRoQHE21qMsgx/sOXl5scfFHyEFHcLPMKO1/2EzrzWUNtAqxCrO5TNVNoMqZiEezrlr/o27Okw4Hv4LivC6RnzbXleHl4bmuuXf8kNBZEpQ/tDY1L4uFKeEi2y8qTSFQ55E84WoGHhIlQypujqej2MMz+jKcp1Gn4uGHjp1+N2hzx/TjVSs8LWhSql8KVwnYoYR6jsJN/RI5NcVPNGhjyLvjtNeHH7bjL1Di1U7HQhJ6R7lQAzomK1xwIVvbyzizlPKEkUPL0D3WQqlItRl+Ve4d55tLYCtZqdTK6dq8O4dbB0UA481sK5T8mRg6z25gtd7517gmJt74Sz6zRk3pzTx/eRPE7Qct0/MR5Pj5DjwS3E/wOHidnxjzWzvNSdhL2a9r6P/c+4INJrucdgl8XdjUtVWl7fSX+a2e/afzKymp2E4dMsM+WnCDN0Ro1laQ0avHYeeIvst53BWKUYyyugioLeSVMbeW+seK3MlqU/l6mt73mRRQDaaXC0xGw3G9Jyk/Tk1ORmMmCJmG90s7+k1Tgqp/gL2YXjV', 'base64'), '2026-05-23T15:21:45.000+00:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('file-search', Buffer.from('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', 'base64'), '2026-05-23T15:21:45.000+00:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('heci', Buffer.from('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', 'base64'), '2026-05-23T15:21:45.000+00:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('http-digest', Buffer.from('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', 'base64'), '2026-05-23T15:21:45.000+00:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('identifiers', Buffer.from('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', 'base64'), '2026-05-23T15:21:45.000+00:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('kvm-helper', Buffer.from('eJztWm1v2zYQ/h4g/4F1i1JCbLmt96Xy3KHLS9uhToc6WQOkWaZItE1UpjyJsp2l3m/fkXqlXhJ5SdcPsxDENnn33JF395A0vbuzuzMOmc2px9CE8NOA+IGm7+7c7O4geBaWj3wStBFtozBEA3Sz7kc9PvkzpD7RcAgqnYAEAUAEWDf2Q98njGsprBbq6EaggHrYR2sdECKMsecjjSLKRK8etcWGxUPHSJv7ng3Yxty1OIjP0KMBwkvKei9wjHpOL4xRZP6dAybippA6YEsFS6S5xQkaANBr8HBBMPr6FZX69j3GiM2JIw2F4XnJlUHqCvqp7ImZ8+Qi9Sv1aZ1MQuUoBbRLWbjC5WkRMQnm1pJZVy64iviUBobrTSg7pQ4Er5+JZhOcKuhZbw4zcQSGmUpmvg8QC11XV8UL2uKp1kb5tr6qlQtQcV58wkNfZE8oRiSb756qXNparustiXP67kAk3nliWc4et3x+MIRmjONmG5KXI3D4cmatZLRq0lsUCXUgOcZ0ounG8PWZgjC1grPF+CqP4NKrzpgyh/igDv0/U2b51xpegVzHDxnWiwhvmDcjcSY1QZoI+cTJMtz7lUOawMhpcUG4DHE2tptDrED4B5yVuYyGPwH9y+HoLUxaLjT9rAhARFQa96/hvxq9X0Yfjo255Qckkloj2+L2FGl/6SXZc1FjSTYJ3Eevfd+6NmggX7WctF6jnS/NXLfhEjbhU5Fxz8plGY0wSU/4tDDEDOV40IoYK0pry5BzFXyifKrhTidnZ4B1PebJfG02nh8jmLuUaxhwzp9fCKim03WfKcvV8G3zVlKvrbQ8pWUxURJpQX0eWu7BUE2jAmM9XJBSe/UhEguUtC0GKq2pETHm3jweUHHGco6nykBQ2diDJYUwyhBz73Q+J/6+BSHXy+O0oR3hNwdDbJZJvsAwwliOEVUyUdZQ8Vz5xPrSL1p6f3ZwWGNKsE/BREY0DeHPjvbr4AUzVcFHJHQnvkPGVujyh56lfzX2+49IZkq8t0oyWq6+v0WJG49FW8BCV73fEj3oVbIQ1m8WBKcL0QGSGp1Eo18hBnXNrBm5a1WNxTThWwWMPaWu82tUuXko2X4ZlzSu0vTmYiKEErDn9ZyYCpYxEhN0Au2BcXL4cdhGhC1MEH37bnSy/+H45OOH9ybCFCLukyuPT7HgywoznPgzWAZdsKPgkxWxj6gLrnavKOsGU9xOXMrWyORJQIB4HC/kBgQLOxa3QCfjKFukh1ibPZcYlI2955oNjDDiPmWwKSkyUxGXMmPpUw4OBSHCaC+L0B7Cn1lpDqt1k+0L6jD08iXqWBIqSVpAQk8bY5EV5Z9Z9L9eZWlRfggyWlEi3SqqmZMrFOIGpDaXE/VFtf66VFJQpGpBjcL53PO5Vq6pBLs28wVLiIVun7vo6dN0/whviwwkTikJp+j19Z5bNiuPDi50QYrOPCeE7CEr4XiQbMlUUfXEJ62kBwoBU08PsElpcloQIHAouJClmR6dTBS3i9SMaKWN5MEM6nCUHCagIqAzlY0kQP8YEhnkZHqKjEz7E4Ixm9FQrKeXar3Av+nWqjDgirNNPiGiY01dEJfWtWsxRwwprAtkLCNOgH5IFCaJDrvxIMdiZFBbAQ9G18wGGiLc7k6cWdcOA+7NDGCSMdZv53rJaLfQbiXLnWN4uShWq9RM+C3gfrzLUZrraU+edoXWHtBsjvQqOC9FTImmBcFCVcNHX9HEJ3P0KZrTQ5lhA2gFQ/gzkBLCf2D4aC2/oM6ReI9bd5vDNyUyqxCC1jiUg+f9hgpQhxoDcfbj8VF/bw92Jw0Vm3okk0h7wv7u/v64Gy83HE7ZBOYZ6w0RJkF4pXVRt41arTZ6wvSmw8tZVyPS1ZsjbDBUeKId+hPWRk44m12Dy6rl1ibOR/5LoPMXF4NBa2zBAtTawPmN/UdZFj3bzNP1RtLRdrO5SlP0pnJzKHeeDLWJH601TrYWNSVbu68QNFpkKwP4Zqbp8munZ8VKqFjlMpaWOXDn91+J3bvpu/c/5+/elsBvkUNbAt8S+JbAvw+BJ5v8WFfZ6Ys3KSc6NBDJGWdqxUZfjKBwGLj9Buce2/6aCXjg5SML23+whCjGct97EAe1gu5jlSFkfLtVbZNW9anhVbH58oXsqPgWo9qT1mxRA1FpsKICanBrKyaTr62aiq8l77Mb2aZVg7Tq1eRV7wESq1eTWb3vmlrqBUgaC8LuJsRHW0b8RqlblaWV6bxlxC0jftu02jKi+l3wwbCGDTfmt9wFN4ZerFf8UGrT5C5g9gqgaR/O7YXFi3oNgQa1TG7DsYUT9drFrLrcbKt6dXc15i23OAUIcUsQmOnP4wq96X2Lmb0tiMSXK2b+lw8FEWVFM9WPBVH1zGAWPheEleXUVD9Wu3AwNLO3SnLCX3SPdvMgscv9QJA6+QSS13Bo3TiQkjo2illVQNSh/gNJWmX1', 'base64'), '2026-05-23T15:21:45.000+00:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('lib-finder', Buffer.from('eJztVl1v2zYUfbYA/YdboSil1pGTvDWGN7hpihkLHCBOGxS2MdASZRORSY2k7BhJ/vsuJUaxnWQY1u5tfrCsy/txeM/hpTvvfe9UFhvF5wsDx4dHH2EgDMvhVKpCKmq4FL7ne+c8YUKzFEqRMgVmwaBf0AQfbqUN35jS6A3H8SGE1iFwS0HU9b2NLGFJNyCkgVIzzMA1ZDxnwG4TVhjgAhK5LHJORcJgzc2iquJyxL733WWQM0PRmaJ7gW/ZthtQY9ECfhbGFCedznq9jmmFNJZq3slrP905H5yeDUdnB4jWRnwVOdMaFPuz5Aq3OdsALRBMQmcIMadrkAroXDFcM9KCXStuuJi3QcvMrKlivpdybRSflWanT4/QcL/bDtgpKiDoj2AwCuBTfzQYtX3venD128XXK7juX172h1eDsxFcXMLpxfDz4GpwMcS3L9AffoffB8PPbWDYJazCbgtl0SNEbjvIUmzXiLGd8pms4eiCJTzjCW5KzEs6ZzCXK6YE7gUKppZcWxY1gkt9L+dLbioR6Oc7wiLvO7Z5WSkS64N8ijQUdMki37vzvZZGGpNFWCiZIL64yKlBGEtcbdnlVkIRGMmwqzOdkhNraq2oQhoM9GA87TaWZMHzFG2OoJBUhj9cZhLF7JYlX1BOIenMuOjoBWnDmOBjGtVZqoBYm1SWBh8KkxHywpIUIUmpoRjf7CtMIrirJFtFfuhBEhs5Qi7FPIy68LBfg4vY6oOFQXEzR7VkEgL4ALY1+AjgHjANmUwEsd/3BA10fQMEq9CeRgpN+PawDaYNk2C0oFaR53ymAfe74ilLTyZ4qIBnIe31ji22OsaMj6dtyPnMxtU+BWI01jQ+miJQeCBN8XviILjidzahK37UxlZrmybWEhP9cmSr1MneHtWJJoLdcjMRwc7u15SbM7SHUXeLT43t3mcgxv4twyiuS2I64kJQI6EN4/acYWxUWSvFtFqI8Q3axnyKOagy+hoPQeg6SxAtiSzURAo8niVDqHWcTbhCFHfW9QTqFA91wdaPy+vv9PXzBPaCwkijsIMcBdSIzNKK86qobKt4y2rJnpAtpSHZRt60Ieg4VeHbmE57vWA3NnimgUkjArKLcF8FrVWcy6SaJK8rwbni6Y+LUi/ClbPUDKK5VCLEhzPPFKM39qcd9/UoyZHy22qQgPvUURA2zC6l4EaqA9syJHbODJ6sAb7UgyvqbgU3FRDBw86kW1D9iQuqNiHKoZ52NoBn8GzawZveIzB49w5eXH4cgbbBj4gzmmsWVfq1qX/CFKz69IpMn639a5nuZHoahGu8qRjegXYOIjY3Bt3gcaI63p8qT7l2BPXYj/qeeEVNVWN3toa+osxzZ3pSRiWoh7177L+m1yL5n90fYjcI4NdX10+2uf5H9PveUqZlzrDP+NfX2CvLCqG7b4+bw48eze/nbk8qcpkax78AD6qD/w==', 'base64'), '2026-05-23T15:21:45.000+00:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('linux-acpi', Buffer.from('eJx9VVFvm0gQfkfiP8z5Bago5Ny3WHlwHJ8OXWWfQnJV1VbVGga8F7zL7S6xLSv//WYBO7h1ui8G9ttvvvlmZh2/c52ZrPeKl2sD46vxFSTCYAUzqWqpmOFSuI7rfOQZCo05NCJHBWaNMK1ZRj/9Tgj/oNKEhnF0Bb4FjPqtUTBxnb1sYMP2IKSBRiMxcA0FrxBwl2FtgAvI5KauOBMZwpabdRul54hc53PPIFeGEZgRvKa3YggDZqxaoLU2pr6O4+12G7FWaSRVGVcdTscfk9l8kc7fk1p74lFUqDUo/K/hitJc7YHVJCZjK5JYsS1IBaxUSHtGWrFbxQ0XZQhaFmbLFLpOzrVRfNWYM5+O0ijfIYCcYgJG0xSSdAS30zRJQ9f5lDz8uXx8gE/T+/vp4iGZp7C8h9lycZc8JMsFvf0B08Vn+CtZ3IWA5BJFwV2trHqSyK2DmJNdKeJZ+EJ2cnSNGS94RkmJsmElQimfUQnKBWpUG65tFTWJy12n4htu2ibQP2dEQd7F1jzXKRqRWRRUXDS77yyruR+4zqErha119H25+hczk9zBDXgt7L2FeZMO0zvve/iMwmgviOb2YU7xDaooY1XlW54QjGow6A7ZFWUKmcEW7XstZdBzdhGjHAsu8G8lKT2z71lGuqmpwakSoxAO8MyqBq9fVRRWAe6oXjrdi8z34memYtWI2EbIIy2zJzReAC/HYLxomaMTb6/x8Cq18yGjAglDLpyCCcvU5zGTQmDrpX+Ampn1NbwRO4QNGpYzw67PDIWXEE718AdODZSc1FAYz1J4wzPZuhFPwTn6h8N2kSpYVSRGTy5vNqumKKhnbkA0VfUGyMgnaibCtFEjI1MaEVH6QaSplamkX8WpoMPFC7pl2rNRhaKk6+LmBn4PqJZtYo3Qa16YPpcJvPySoUZ88gP4jVrTsxSvym/bh6hQcnMCy9oPLlNiRZN2gCHwIs4Oo2+z5/Yq6eDBz7ALptvVmU7iuoNf+LejV3DRKrtaUxSaCDf8OCe28QXbUN93jF+uvtF47Wv6MEy73xzTprfGHbUqdWr+SP8TH8a3cz8Ij9Nz4dCHtw69Ds5w/WDVGebsZThKNi1rBn3qEUTzYq+ljcybCmmO7URawwRuz66oyf8tuBKP', 'base64'), '2026-05-23T15:21:45.000+00:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('linux-cpuflags', Buffer.from('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', 'base64'), '2026-05-23T15:21:45.000+00:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('linux-dbus', Buffer.from('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', 'base64'), '2026-05-23T15:21:45.000+00:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('linux-gnome-helpers', Buffer.from('eJzNWW1z4jgS/k4V/6HHNbM2G2OSzNxdHSy1lZ0kNdztJqmQ7NRWkssqRoAmRvZJMi+VcL/9WrINBszLzmZmxx/AyFLrUffTj9qi9n259D6MJoL1+goO9w/+CVX8OtyHFlc0gPehiEJBFAt5uVQu/cx8yiXtQMw7VIDqUziKiI9f6RMXfqVCYm849PbB0R2s9JFVaZRLkzCGAZkADxXEkqIFJqHLAgp07NNIAePgh4MoYIT7FEZM9c0sqQ2vXPottRA+KIKdCXaP8Fc33w2I0mgBr75SUb1WG41GHjFIvVD0akHST9Z+br0/OWufVBGtHnHNAyolCPrfmAlc5sMESIRgfPKAEAMyglAA6QmKz1SowY4EU4z3XJBhV42IoOVSh0kl2EOsFvyUQcP15jugpwgH66gNrbYFPx21W223XPrYuvpwfn0FH48uL4/OrlonbTi/hPfnZ8etq9b5Gf46haOz3+DfrbNjFyh6CWeh40ho9AiRaQ/SDrqrTenC9N0wgSMj6rMu83FRvBeTHoVeOKSC41ogomLApI6iRHCdcilgA6YMCeTqinCS72vaeeVSN+a+7gUB4/H4vkfVL2HM1UXIuJJOpVx6SoIyJAL8Pgs60Mx87dim4T4SoY+LsCseHVP/FJnh2LUHxmuyb7twY+PXnSaSNmNGeFJ1wljhl0Brtt1YbA65Y3eIIjh4hs7xK/BkqGdG7TXB91TYxpjwnlNpwHRlAsY9HWjqWAO9IIBnwIH27S23wf7dxp9k9Ai2tX6g/WRveIitEc6uumA9WY0tPXlTYnSV83rfRT9T6Vq/48RbBmHcHdY8aLAfeGNvj1W2dN+GFq9xCsNguGF3LmbEIxLCBQu248HrExowi3YsUJOIwhtpZUZuxtWDu12M0CZDQo5zKD7tMkyuDLN0Ku6EO9J0bsr4AcmTMyD33mEqVmX13U5G0nC/kbe3yUc9u7Fch71qHvxouVbdsipuMuGCZ7ZNMN2RbNONZLOm9i2nY6Zu+RKzR4SpE3zgZM3JpxKT5CbNc30JqmKBOfev9vmZFxEhqbOct5XMyjSdgyi/Dw7uCJW15p6muUHTBfHp8XBAtfhciHA8aVOlBVo6Meu8mAK5qB+UD+v49eH8l5P63AZuaqKKO4tRT7SBMD4gnNMwQNk0GGC6qi9UiCIB083rBWzVzJfQwbU06snUs6j2UlUF9WPc+Yc0wN1Y9DwTBU9OpKIDL9KRSETTQtG09Oezlcrmrb2JrduUyNeCPFdEjIRWoGeTyZvGIbua1s2d1QASq37Twpto1DHfOoacDKj5Qbne+82DHSSWNPcb5AeDCWWWvIDMJivDVd0QpN0g7FAsYvzHnVWWdZ3ZoJvDO2g2wdIN1jZsu8GbIZxP8hZxRmLs6iDvv/sHojSwkZXYihB2AL1Nv5bXdXDXbFrFrPN0BWjBd99B3g3YvR9KZekEKMLflyqPX/dF/Niq8X8VeFh2J/D0Dc6dx/d1EGAaVHVuUK6wANaKYfCYdPliaIqAMOwmaFUHQRoImLvokXQHzlLj7d8xUD1sdNK4mQDibqq7V76Oy1KxSEAm939J6BbDVtWC9nL5vihJnXgwmLjzVJmJp3nw7aT7kksiIuUoFJ0XdIvePhY5+be3uyj0ttVve46uwan/V/uPiUFNcy9LAytJAn3pW+y2LkeSR7vWjU84SPtXl62Q1a2uvktZbx68kaZJ5+1qRy1r+V46PiergzM6FRhII5jvnRwi6NIrbZ1ayZ7pZunoGi13jaq6RsvcGWWNF4xcvFBV/Jn1sIcV2MCpFJbFDv1zNfExlY8qjD6SIIhIlJak30ZZXFDQfsN18ZokmVfFuMRcIdxJ/O49EP+xJ7A+7EDEfIwbrcaCZYSytxCqYEVryOMlIm3rs7V6rYYuj8JoZod1YZV1lHfkR6b6jm3ZFXh+XjU962HZVmU9D1fGJaqovYcF+srTgPKe6kMVDpYZTwNJd55lC/dlMfddc/p4QVR/ngXaO69mzUiF7F4TqNahwxqPgwCZNM1ej3TeDPHpZ/G+MbcRsY7Mp16adNUB4aRHRWLgImlErumFZdZn1NEnfI42xvT5pLa4Gin9mOYnKsB5woenIhxcsI6jjdyw2blb5iPqXbdPLvVeu8nONRpIelZeNRO1yYzkEBl2h7g/85jmppnmMHvHP12379sn7Xbr/Oxe3x8dH1/iT1wIXftwCfN6KzrQD4KSx0Y260J4/6Qs4sLrYPhmBHL4UmL3R1TqL5FB+QdkEDK1gr15zu2BvYs8mmDJEdN7ZBoULwqIwnQYzFPbJ5KCbY6n7fqcGVgixAHFEOqyADNwkZdLNNXX8ulSfc2pk1s4dFmI6uv35wIDBUpWXy9yBQbMGTZCLjqlX+w9zWXP+cMn6iuMYJdxiotE22riLHrOBfs+CJMSG6m05LghCWJaB2fOsMpWR7/QXwX5qzgftvQrTpB+zB9XkkQ3FidKofV5YTnqU0EZVg6z5En/V3hKCm94fQgFxeeq1ZW6IX+t3aXTqnNpyLSSj9LCUnZkBBkSFujiWzNC07+ec6H2XobIeHHGH3il4wI/YhUdU8AxBKsB7c3PAiF9wSKV/jlpuzvwbpGry1RdMywZKvSSTDkwIJ9CzE4sewaMm7uFnMpf+Bo3I3g3YTWTSrYn3Edex1Ik3DbrsCsFcDZAymC9cCZl1xffYTZOunaDXHgZ2GhivnEl/oXqr7PD6eyA8PXZqQtX+MLs6WOOhTdhHWT9wpm+hZpQJ7/x/fPq5uAOP8y54e3qVrYe18Yszq7ZK2bRtYEN+kpIusOL6Ib5pxtWkfyNM15DVQNw3fg1zZlS4HcRqEWtSlpy3ZLqDkuF/wOMU7WV', 'base64'), '2026-05-23T15:21:45.000+00:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('linux-pathfix', Buffer.from('eJytVFFP2zAQfo+U/3CqkJLQLim8jS4PXQERDbWIliFE0eQm19YitTPbIakY/33ntAU6eJzz4Pju8913d18SHbrOQBZrxRdLA8fdo6+QCIM5DKQqpGKGS+E6rnPJUxQaMyhFhgrMEqFfsJS2racDP1FpQsNx2AXfAlpbVyvouc5alrBiaxDSQKmRInANc54jYJ1iYYALSOWqyDkTKULFzbLJso0Rus7dNoKcGUZgRvCCTvP3MGDGsgVaS2OKkyiqqipkDdNQqkWUb3A6ukwGZ8Px2Rdia2/ciBy1BoW/S66ozNkaWEFkUjYjijmrQCpgC4XkM9KSrRQ3XCw6oOXcVEyh62RcG8Vnpdnr044a1fseQJ1iAlr9MSTjFnzvj5Nxx3Vuk8nF6GYCt/3r6/5wkpyNYXQNg9HwNJkkoyGdzqE/vIMfyfC0A0hdoixYF8qyJ4rcdhAzatcYcS/9XG7o6AJTPucpFSUWJVsgLOQTKkG1QIFqxbWdoiZymevkfMVNIwL9sSJKchjZ5s1LkVoMUJfTxytmln7gOs+bOfA5+IWSKREMi5wZ4rGCOAYv56KsvWCD2oLtemKKAvE8g3g3D99rDL+2cbwgxBrTc1KP70UzLiK99Dpw79H2YMW2C9XcCrUh4oo2RRE9r7dvlsL3MmYYBXitw08DeG4k2txqx5CGRo5pdmLhBz14+TSJLM1nSaz5/yXhIrTKo8IxXUo4uOpPLuAPsOoRpt4zrFHH3R6wWJMOjH/Q7cCsA60T+gatAvw6PurV32LWa7drm57P/dl9/RDHrUhTI1vWZmMcUX56CiJjrIGOU28qsOZmKryPzCrGzRk5fet6czbDZ0oj/VT8fxsVUqkrPwisGrrB26V3WrBrJx6NBsWT79mKqY87M9nuN7YHaIN30tSxx/Bl80rbi+W2klmZIymI/m9G07ReVdtQd52/UQCQ8A==', 'base64'), '2026-05-23T15:21:45.000+00:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('mac-powerutil', Buffer.from('eJztVk1v00AQvVvyfxjlYgdSp+qRiENog7BAiVQXEKIIbdaTeMHeNbvjuhHqf2fWcdMUAhISHxLCF9uzzzNv3r5ZefwgDE5NvbFqXRCcHJ8cQ6oJSzg1tjZWkDI6DMLghZKoHebQ6BwtUIEwrYXkW78ygldoHaPhJDmG2AMG/dJgOAmDjWmgEhvQhqBxyBmUg5UqEfBaYk2gNEhT1aUSWiK0ioquSp8jCYM3fQazJMFgwfCa31b7MBDk2QJfBVH9aDxu2zYRHdPE2PW43OLc+EV6OptnsyNm6794qUt0Dix+apTlNpcbEDWTkWLJFEvRgrEg1hZ5jYwn21pFSq9H4MyKWmExDHLlyKplQ/d0uqXG/e4DWCmhYTDNIM0G8GSapdkoDF6nF88WLy/g9fT8fDq/SGcZLM7hdDE/Sy/SxZzfnsJ0/gaep/OzESCrxFXwuraePVNUXkHMWa4M8V75ldnScTVKtVKSm9LrRqwR1uYKreZeoEZbKed30TG5PAxKVSnqTOC+7YiLPBh78VaNlh4DtWnRNqTKeBgGn7f74Dc6eb9YfkBJ6Rk8hqgS8miHjCa3G9YBXYlYM2iXsgv4dB7Sp/TXlbAgC1Xmk7uYY9fIAuLaGsl6JHUpiNuuhneQvQz+koKViXJhW6WjR/fXunVfgen0voijLvC+LxANE7xG+ZRdHEfjpdJjV0QjeBvx7d1w8p10iaPcNMQ369WIJvfDRsdMiAQn2okQy6LRH4fwuReJv3z4GLpgQiZjT+l1PJzAzQ+LorWHivrw7yuqdOInhQUyTjhpFY/6EcJlxIdMeTtjXb1BtnGEFcyuUJMb+DHrNv8yutR4rehSR9+v1ApFMwbFhyBLi+LjV/EcV6Ip6cCeU2FNC3HUO687sfxYYcW8toPbHV637jrI6uuSN9vHmz2r88iSsLRv9j70U3b/7/bDRf+y213RcIethiPLDmr/tHl3Tvpt9t01uH9Y97H/5/U/5eDibzj4zku/2sI3/o+jMnlTIvuB/3LJscYa2/3/l8kX1l4yWQ==', 'base64'), '2026-05-23T15:21:45.000+00:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('message-box', Buffer.from('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', 'base64'), '2026-05-23T15:21:45.000+00:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('monitor-border', Buffer.from('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', 'base64'), '2026-05-23T15:21:45.000+00:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('monitor-info', Buffer.from('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', 'base64'), '2026-05-23T15:21:45.000+00:00');"); + + char *_notifybardesktop = ILibMemory_Allocate(28421, 0, NULL, NULL); + memcpy_s(_notifybardesktop + 0, 28420, "eJzsu9my60hyLfheZvUPx/Qi6UIqzANbV2aNeZ4HAngpAzETMwgQANv63zuYmVWVWaUr6XZbv9U2O4fcDI/Jw335WkRs+H/8/nf8NF9rWzfbDwxBb/+KIRj2Qx23sv/BT+s8rdnWTuPvf/d/ZvvWTOsPbr2y8Yc3lb//3e9/Z7R5Ob7K4sc+FuX6Y2vKH+yc5eDll5Z/+RGV6wsM8AP7A/Ljn74G//BL0z/887/9/nfXtP8YsuvHOG0/9lcJRmhfP6q2L3+UZ17O2492/JFPw9y32ZiXP452a36a5Zcx/vD73yW/jDA9tgwYZ8B8Br9Vvzb7kW3f1f4AP822zf8HDB/H8Yfsp5X+YVpruP/Z7gUbKi9avvivYLXfHuHYl6/Xj7Vc9nYF23xcP7IZLCbPHmCJfXb8AB7J6rUEbdv0Xeyxtls71v/y4zVV25GtwE1F+9rW9rFvv/HTn5YG9vtrA+Ap4N5/YP0fqv8PPzjWV/1/+f3v7mqg2GHw4856HmsFquj/sL0fvG0JaqDaFvhN+sFayQ9dtYR/+VECL4FZynNev6sHS2y/HiwL4C6/LH8zfTX9vJzXXOZt1eZgU2O9Z3X5o57e5TqCvfyYy3VoX99TfIHFFb//Xd8O7fZTXLz+dkdgkv8Bf533ztYf8wZO/1P++Pc/+fCf/vGPcjmWa5ub2fpqsv4f//kPztSCeFt9YPhvP3fjwWrHzQSr/67k33/g+C8NsvmfDgWscrCo7Yd0/6NgWwHPeiLogPz5c0GU2NAI/sgrrOeLAWhD/9wGHPzHP7U7nsir/m+68obq/Gftf2pyQ9ZQg+Q/bHPUgFd+0yJJf/Tvqv8d6p+wH//zf/4g/vnffvyA/8ePKFvbn6IMxMbUfUO/2BoQVtn4+tcX2HQFjvPHz47+eaTAFP+o2JHofcc/kZ9//rK7b7MhspH462bsN82WbYFNilbwKxP0u9Q/Gd3NPwILLgwCEHn23frFjv3LLApwLet8YxK0/WV00PGufrs4tg9cb8mqJQMD+i9+UAX+jyC47fv3tDESxX7TAroIPzVQxO1X6/Hvf/SVn7qQ//arzxRV+NOp/2oBvG2aPw8D1oyi6K8XxwcGbxu25wdsoPK/mODMr01MO/RF0/6T/zAE+XUriCXJ/rPj8N+0/Y3DMOQ3k4Nxfzkz4reD/jTlr44UY9G/af7VkWIs/m+/Oam/7Y/8Bwa/GeFXR+aDJFGNn/1F/BIvv24NWM4PbOdPsYL+dXuk+ipn/Dwy+jf9f3IZH3q+/ad4xf7SKvPGH5U/N/7rr4IBtDh/0/Tnow9+GlU1WfmXDaH0X7p+W+W/av2Lw376+I+cGpis85sE9YdpAlVprM2pKNlxa1lQi16/CblvtQSVsv8JEb9mXJvvD4Cl//6D+dXyOP9X4/+SXsxfJgLNTugrPwfLr5P0NyYASf5jq7+EBvfXXkAk+tdDSAb7lwxnfh7/z7v9D9aIiP/2q2ZPZA1fTUVQfALPNn5lRyC/tjNEKfiPdwEaQZENRO/XS/yC0V+vxGEDRTQA7Po/Q+2vF/xno7vtCX9jxP+V0Z8MTNbX/5dGlh2oUvKX9aC/rOdPJqb+p1T+xeYvLvfvDuj+dcuf0+Gv2tLvMv8MzcRftf4FV37G5F+l0XdQzo7/3BNB/rysb0H0FfNfftRFO//0WVv9+Kd5nXJQOP8wg3gE1X348e///uMfj3bEsX/859//7v/6mQaBbmBE2fwDv5bZVlogdN+ls07n9U//6Df9kc3tH4r+54r6i/0vpmYJaGABrJQ//T74G3g3/GT7s/V3Pf/L4WXQ2O+v3wz/7fBX43/NuHYbstkvN698Tf3+Ta//qsvPn/zcUVqnX6/tf6dXno3If6+T8nO+fHv93P+/6ia0r3l6leoAqM1/abtmx0+GXplv6n9lLQEe+l/ZGFNW/DTif985crn91ENes7lp8xc/Abw7t/9uN2Va2w/okvX//VP8U1+nPcteAkGc/benA3pjA/z8f2MyEF9/g+D/jT6/KQz/lT0IeH/L1m3/L8Pja9nsWzEdPy/8//4LGpx/bMEbkFj/2Eac7R2ILtcTC34sP2zEsAbvZBf8x3U8m3xfD2KOwq8BG1u+h6js+iJyCphweq95ohSWEr3hIepjCOtyJZsOmXqQLM1ac3Xqw+UTV/hIy9h4mXEjrMnMUX7IcTrWCQFFxfRnEbxHYH32ALsNlpaENHQpS22XC1CKZ9OpWCjVKpvyaC1feXs0XGfc2Yd2Gbwou1vCvUb1pbr/G+27kTOYfvotsb/f75U6YQh+0yyqOQx1qz7kB3IcGA+IokovTLbWGis75TrvdpT268Q4eGWQxVrhG3VOnJsYB/RABXiLGJp0SSrHM8mbeHaUrXvjEdr1tJXPWz/229HlnPvw207mkSn1+iSV64QPcyRBAyW0rln2wxeRDkyOYPdbHAV6pvmah4qinISefjWsWUha6IZpU0sK1SzDDiqoP9UP38ZKEZ0N/bjloSB5fiRyQ+LX45wHyUPSYRyvbDlTnl5gzkTLSt6c9osP2yb0gHi+kNjOpPVMrTsoM0Vtcq+51hzJ97VpSnx1PLsltnnff2KpnOo6kwwfPzXDq9HG6eyMWxzftG6H8QEvt3R9Px2PC7QkWz/mhb2rtqLpFBfTMxHKCq+f1Pi2czmLK07thWFdchl9Lsd8syG9Tj3aQdxpPOUnpYvTJbz1txz1FF/rtKc9m3Yoxvt8dlajLVER7BCqPwKKjnX69szpmGunWgoXMsuqdDAfBJwOQZggetZyU28bt6WF4n1MtxqxGoq961cCDkpnp5UmLhLFzyBlsubNLcsLFBxfQWUfrW/RPYez5iZzvHy1y8oQH4xytmXLTMKyPRMKEJc9Jv6Oo1YWrzF+CMPTTh8LdWeMa1yWi9Ekhb0SzaLuGFOTx/wJea051PJFnCS39cMwiYHYsjNvZ4V4TrXNTFT7dnJU4ztR5txaQ0YPlx+zeyncxIqknVnKdHJNqEqi6yvCxJrk2Ns+fifQ1G4rmJt5QaLchqiuegq0j0dfzZH49GzIc7DcaGRR2Y2h+Ds1ZzIdbDRCyu4kgXDiOemNNVM5lY0G7wTyotaE8SO91VqPMudVEVhJtzhB5dxRcMeVWl71FIZCvVDDaXKSR/A8gkFEd5x52Mi0zfPh6PZarRreh2s6nWN972lchDG9X9HUukXxfqOhWOdMeu05xRS4s8vHgQkfj1kSjTWGlNhRf8z45wP2e47UknhRQchuMvFYZihgkPee+sFU6/wg2BTdyNwsqZ7nHZ3WJSjbCf6SuC3/0tk8WdpKuBssiGvedpkEcwVZfulB5bWq5ePefXvTH6eUFpwiVMG46Du8pyOji4KFphWSI7Ao9prIRCZz76zD9y9rio2ozdug1heu2P1c9JZKi4pKbupFteP41WgOxxlyJ5237C5PdeROt9KqXaLYGbjSi4u2/GQamnZWnaw0q1B3w6eeke+7Xxp5Bass93BPtLPEyUSLICFMIp1fUu2KnPz4UGx7fxr+0JQn6ckC7xLa4fN3R8Wb3GeP1W89NZ0wGG3yjK3xk1VzafKZGWYCAaIm51GhlfeuDhcPpnRnlhPF4Vetyq7ihXLScp3is+t5ai34qFD5tyIOap1ySK0zuf//on1UUO6gM9F1rHn+qa6IvRR0/u4OPP+Pf+a0czv+VKn+iP6ntUr9/sqzP9cqQXAGxfjpk5hT77EJ3r0C8J8hHiI7zMfXSA+wXnBRzs3kG/LAremBs7UfWoKqcNcDS+eHDMqd8szGyBojyZmlJ47jb4/3AXD24vYOQdapksa3BBt2frKobucCEAbFt4tCcPpeGIoy09Yta9vPiTelSHwJ6qRjbNWpmW7XlK22L4A48f7Mbhlzgx4WvMaxs5cvhsQ+n6MC+7nuvmB5VsKaS6iWYskLJxPIROnurirqmgLcxraflJc+sG9yrNNAjnCs6otV3jXLlZZp8KzABumbNblLgQ94cec+ZxNeZHMO6YLG4FU2ZEWOenb6AF5l0FYMfBqwOhhaFowEM56sxG6szI4V9AhYlS8gradBlX/0vBixGe+BhQZp0gD7mmb1jxNNs8RK9cFy3uAzLsla9cYKnBZhqcoaPM6agi2y+8WytQk+B0kXghjwaDCfql4Wwap+CvrKTJ8zjL/vop0vgGkQw0Nldt8lvUR68Dx6cmgRGw0xfbou1k8XS1ytGTp2P8YhlQOds1i4ZpgDnDbvSZ5S17BzK03CXl+0bU0UJvTMRq2MDF9am+wORObQmosgOmwJqTYFMnjoI08szU3cBi9qT9feFNd7XVSlka6q4xohO9ljFsHWASkE44j3pjPGFCvjjrQa/RS1R5LPcVWR49HDbASjLygmGNipUMKgW00VrziRFM551sfrgwR6mH9IVWtkIyenmwIbuQHDR4FchujfdfLOTyGBin6ekOIwfT4gKNo21H09D3vkfeuIjXlBhwnhn5B9yRPExrtnZE2RHA7mX7l7VwKWeOcs6+j0g1FCna2FWm4FIr/hMMTAcFjWmsuzaQdkC+B2ced2Rh/orw+s8MAtns5z+spxMhxwMv9huebDccWH4+GztiaP18yAdxuO5wefVRSt1rOLd9tW/jzYAkTXGxXZwjI5L1OzIGeJ/ejvhPBEDwGeG16jOd24ON71uIutg8RXMkBR2ravn8+6jockJgBmqYAzGhovaC3neWq3e1ZYn+E0gxIYqUql3vJaJRv0lPdZpEGAXfX7kt9ifvaqfIUBHgpGJOxZjcuTB0D47aaKew4Tc5+0t5uvbuYkBzaVlbtgtYNNDOQy+XHYdcJ9HPEhsPv5svhXUL/41HpetNiu7AX46XJEyyHsxIgmDHQWh+vXYczyQSIWiFonHsn5UmPeRTrx9bpWeBcRi0mzjk5oJIXXLj1YxB3R1smDcjdJnurZoI1q8M5dnJjAODm6FR3Ruly/Dc1LoweX7YZzlgJf3DQZGUhfhbrXkr4Qn5ueHTNmqbxf3GcIAQCslxp3YxkIpOB0MuQ2TP/Sx7vG5llAhJA6ha958ZuxF+0QId20HwSNizI7CzdsmiIX4M8tAw5ptl5/h0k5iR8PHZ6jVZ+p5lP3bZrjQB7qOHOKeYUaZG+UovdIu79xMfJ6zx7UxhTrIMVxWE1zF06iGXVueMigEqdnj8s6lAR6kiLEKz1R97A+yjrYZSqQ/TuK6mVrZ0ZKFZ2fI733s0i+pnekD8u8rOVSA8qNguKrQnPcW7e1SyMTdZ6LO4b9skXLjLoUaj5CrJxtqlWWoZweqAvPCpnCSSffc8s8kJswS3L9iuDn20xqHjPTF16/1PvLWogUrYNY1FbFwuIT09c9gT2Mbj/YsmQi6X4s3UTLT/i2w/TJKATZnJB2IkE9jrpexgxO6XgTvPVSnWUqQQKjO9PoXJc5i/u+XX198xakWt9BttNZCRyISjs60rVLcicyjTFfKCkB21yKj+GtD/As1+cztZxgRdeWWjIqfEyPTSzo2z5DVDKuJEhi0nxQVVk+8BFqzpsBoyF8x6kZjhRBquXXcXTc9jI/Tc2cQXQ+PkdhMNWDiSQhzi3WpaKmv8sxkfjeXojMdIvkZ5g4T3mUY9vsCAyw0Dx7anUyAKg2gnK26Hn2g8cw6FlCB8JmngxufjLDQucOHT7IiX6McYDKB0q+qw3jslKaXtvSYrscaa/dy+Z+3Lf13JtoIu9ZlETRXLyQbBszpEfXfdup3Jvp3u4Qah23dDxo4dxeA7Y88vRlxwm37fs2YFh1l8akKcaNue8HRAXv1LrtI2bBAaIISZUKy6u4NyiU094lCfPd3qjsM392B8elm/aYDaxIPqfgYILz3BrH0MG0Y2Q/EKQYJawkc8L5tOqu+YRhGHMOGfPrcW64+i49vXCiMy4lCnnfi4G2H8eOTRgF79ZOzvRU5SNzIOM1lHcgdBHTUV2I88hChHkSikz5Xa0K6bgIxKV0PKrX7WmQUrwW5bFREb68i4Y+c+j2JK8RMiHic+D40yjvEWxaDI9fRmUEjPUee0jCEQtW4VsH4yuMuPxY8yGXHrZWhzJ3PwwaUmZGfUC281kfaZVdWIlyT50nXS/inoS+1XvMrb40Xfblrr6Ck+TT7nJyFgAYVPvzjrBFQw6yceCEqRF3pYlK2SHIo5XqDAnk2IorDxetD44ElKelIj5voxky5HqhuuVP0NKSi2NN+P70KYdJ9rQfTTRqi7vYv/zzII122a2BfL03mKErWyFmvOUhi5ZIgOYSepSZYh9vX5rPbDYa9WXPKRuojW1rweF67LJwmalValBcd5sfR17JtVFtYc/aZBUTrVxvSJvp6iWIF5/WZMaKu+4M7N6w72TDl3NnnKYQforhs5TSPGOqjFwO0EtmYvtdyp3uMjVBamMpNI/kkGIXdfbNw4DOO2VsF1P2bqVltO2ubJQaADjd5TFF0jSh16S8hqKPsAz+JKNup9k6tm+Lzq/Pte2uRX7eIwxv4kv1iVTH5iQ1ogsp7nZ2W+WJfD3PsyxeOnGGkk6kd245mF1dMH3Ao4B6bxFZ7tWKDGWHrnVEc9dkcJsrrdSxRfx+l6rynaMQEA9oDSIUQpNqkUfvBUnJoK9N8JDIPKpu9YQrz14mive1Qimu+ciSvcX9Hjjppg1U+QDkh3wIc7b0UBYLA2FhxYIIxe2+2Th66+KHQVaWbu10Taeg1tqwY7RMmlXa54XQDup3keOFUO9i9GYU212JIZn26Gaj306C0Fb8uNMfHA5o7b1tERtFFnp/RGm1aRDt4A5Facs+Ej1ojDPUfsTKdh6Oz8KIoh4UhtJjiHq470Se/7wlK4Xk9nlCEDzj7+JCLKtGo2f6kYnWOjxl7Kgq13A4L4VgzYrppFdbVJDzhin3vDCwmR/eeubNWzC8t0fS71TAHBBSPBZ8XBnv9qoE8kAcqSf9txVe9zGjEiPosOr6EFfRp+itamkSl4XHtKY0iTk2jgGxBUGUqAQN0sVwC5DoLbzt2NGJwtEvDAqDiG7iYWGoGMOXwp4YeHaCgCnp0dizde3zjB73csXQEnvglLeXFkMXNwMlGe8Bo9u9tAO8eFcW9YAr6QbHlbQBvGur2+e101icj/SCMQF9VjdR2NyiF/Ckihz0DeHW840rt+VQypq5KbkH53KTOA4olujzuAlcAoESt8tC8ljHZw3Zwdg6uHGjqmt0mVv3uQCsw1QLv/ZdOpN39X5G1K2ykfTpTWl19aQNP+Krh8uVpc7hjTEP/mwo6IrrjxnRSPR+b0dc5cWJv6cb4wSQx6gKM8HYk3xVUYDoFd2dQ9DBjMiSzw8smx+jeH2lXp0gjR8Azlq2QLepvAB0IAkD6l/bHdBxIXgnLF/hZ89AMHLFu+thyQNvxcD6+ftLa32N0faS0YI64duHxDnV99ye6mbtySMj0959MYhiThzdkx395vOU6Tqda5uQPFd813WCUjspPDroIXXYgyuWuGCdl1WHd0wMvZuuoOx4fwAqmR8fMduJpNBJULo8DZ2ZoHkET3x40JPCnr0NOL69bv6nYZK7oGldur4LGiTF/SE2d1GdB+hdKokus5wJNjpwNQuIPQ8InQA0GNcCyXeyoDiz4mGyfPKTWa123GG6bCKrQH6Jv3Q6fjGz2dYFM7NcndQsMPul03869gWfp44fU8kU9ujPM/PgwIeDe0BQ6QaovaGkopKrjm1Tdu+5x7LfmOrJlFA2A/nPOlNxEp1RNyzxfNtwu+h5a0btG9Wiws+qD+ZU7xFLBq1lQfknbpakmEGON3jNPNvbxydxD4lE+bBvWdd6XJi61YfBrbc3yAkgmoICFC5BP1Wx8x3zJshq5gzUg9x1enXwqLCQqw8HaFrek84c3CNWl5Y2+ovMp/4D267Pu/X1UTs/050GE9XnboK4+ShHVdxKjVYkd5H62w2GYSz+fnE83jgUftxSwRAkzXxdqdRD4a1CfWJpJ91+suQyuCk4BFFkx73imM8huhlXiWfd+aGKDUgUR2d57+cH1EIVWREfKdled1YmVpx/7NccrgNlp+QlaeLbIGEBdj6AZVUYOCHh4yBouPOsVkBBmbdOPEIG5Zjs5zsP82EcBhaO0It7GAjjLi8KdEMR88WHrK3QDMRVsNocykWrLmfKFTosaEEbqcF6nMu1sgjEvmIW2zU2nmg267xkg8o++eC8EYQqxYHl5De7KjeMqdpDzqS82c6Rb3VZ2x87VbxXAmp1XVXZFuod+Yl3oss5LSQcgkrGejLOJLRHy/Ye7IysD4Ndb4BQ3iH9CePSKUmk45Dm13+RGEIG6eDVLWZitdPqlmcN9aWSkU6UhtRCkPNM8K3gLoWtOCt7muNo24TyMg96f290Frsdj9c6UqkUIzc0/J4ocDTYtmbPLY7QgvSXh38MRek8CebDakA65bEDky2vikJ8i/LQyyQZJz4xph6xasq1yjaqxoE9AKwnbnzjfqAJvU8voboGSX005EnkJyWF+htVoyKUj0/4PPhIUg/Ojbx7SeIIzM/V0/4+juAersZGXK5aCiMcztQ++SLC1Kl+PrbB2h53jIij3hJZ79sXe5ROd6X28fA2TpS5LrX9+9kQmTyo5cSNvqUipeEjm85lRibf3g1Fr5fsXpT9eTV2QQ4HkbwJYlxAMF9y9lmC976z1jdEQ89t+dyyhYcrWbGCd6pNFaBud/c02eP1M921RAJcy+VAIVOTNmwzedFfVGGjpXnedfpxFi9BFSyOKJ7IDdSvscC305fV8BPM2p1JJ44VRLh9KstN6MXwFTtjMB+3Ek4CL5LL7nLB8XKsZIaPpDFBniObsGNLxK8jAnVIvnZ5sorJV+IdxAjvXVLrvgC4WTqr9Sl8seepXuYksRPsrNStfIGZwoXcq7EL627ia90BBWBDhsuQrSXbZz1AGId4i0S4dGH36rqoL2IiqG3cJ1WzbNd1pK6TKBre3K+XsVDtTu+PpV34Dg9MQb3qfZyp+GZos4WbLnwImc9R16sCMU7KE6x0ITVO2bQIpsNWVVU0qD433/1vO0ZVZnHCoy9yQhxc/PXwdjnJ2UOwP8V+gkofmiD2PF93D0eAbEH4ADEp+Nbp8vgXY1wpinIQ91gxpm9S7PRCCZDDiiJf1tX6Ixw2KAHKTJVPFrWSsOYBJ7GmWCkK5JG/54fsEaxjQgKJj3XpUdgjtzGQCm/jGyynfXs/sOORbjI09ybXo0X8aIBPF2QeuhdPt4XScV5vPUAO3avZsubTtk5orqe2beMLfxJEUp67UatxUTTYJ3ldlL47bM2XGqnccJd3aS8mnBdUeQdrmDv/KN5H5UGfF20m8rkJr6h5Dfx3baTgIo4LSCwOVUY/XyAkplVSv/9qu757qsg+1FeCpQPZ3EDlWV10A6hHE1M7gpoAsILLQMZHbMiVlTMS1Vhmzyh7claHaKyraEVP0dctFQ9ogEM62G0WGfzcVnjOnZyl0qQGmcMoDLGBiV80UCLfmJHDpmEFz/gOvVjRcpf6FEpt+1kTWRKbuXdDEFBXiGJHsm9soSCbc1A3taLFnuHS170+e7bJE09JLQIpi2GWEci0n6JsRUq8vtkjULAhOF2suEtn3ujqlEtYLM83U4wjvKCscoXzsGXuRROq3MW8jftlR3g9Va8VghUanCPO9L6nIsEd0CtNiQzgf34KecPceB95GVqbDKEOx2ZwMIIF42H2jr71M05xz/flCyctOI1G+XpN+mc+SPa2Y6/7OzbeLfSk7r32aHcfe/GgLp9RFHvolslnHkvvE2DSe92jutM35MBzOerJQJhvqbNPvKeZ7CWkbJrc+6Ut6e51ke1jIJwn8N5CdSo1ZplXPfr8fCW8MHXSsoXLtwZ1Jgxy+RiQAq4EZr8oZQ/99o5s68Nv2wBggTqps6MRDijsN4hkGILOSkFj5ZZn3j0z9dkqlHjyysymbYv9Tqrd3mFu1+LpQJi1q0vupGZBmg57LIouZZH70KZ3EOTeEnnucrvXmbf4lx/cIO/LDUxm1al9Wu2P+FOcAejeC/I+wK7FYhANOQuabQ69UTfow6SsiRosybR4cPMkGVJx2zlL0YFovCsVtwxSb9Cnjvc1bfXFiFc9orFhxmvNcoqm8XW7fGO5xZNQs25LLGPLBDXz+WwTyC9hknoQ+zPlzXrXNPJ74fO6xHWE75o8//iwdsulTuRdz8F26mao7556hwSLKTUH9hVmPAhSzfcrvzCR3nz3+5WPGv5WwBncqw126PShsvtjJHGwZuNsTn5bOEkn8/NSrAFSyyt7q2HSnkyC5LIptAkn49ONqKUtkpJRuVdMrjKOcNAgObe6K+ICv0C8W3EwTJ3Zuh7HIh/3kjpS2YfbnebF9bYkY3LDQZbtbKq9GlZjw944YdTcXUy0/Vnyt6jZAEf1tGFJTySbS1R4dqdSIIXF8sHb1xVMc5k3tukT7pGkinT0EZuPBlCXpjNrTJpU3Gnj2hoPxdW4u+GlRX6J/T0evcoCtBLg4C2T0c3LIj/LnooIWXCYlLbDUbeI/1DyZiLfmDQBuQaywER8XGM+Z+YAkTCltJZqScKaiDCZ3qmIoBaqYkkVsZI8FQq+247jpgV6vi/ohWHpM8/G4RA4FfCSxMuNukj7XaaMwUsf72f65ZFFhLdjQBWAJycpyyJ+0b9uHeC2i7Jb8wIxweFE0b2hPqt8MvlpCb5IllF/GZoZ4QyiErX8bIBWR0XHBcJ9/DSyOY/icTDwU15Qf2M+0NgzOFEAJ3CFRAGAKyoaeq+D7ArWcjhMuwck8hDfRB2FURIBuy/3zh3lSNje3Hogo0kseRLnInrMsz7tdQw/AmtSxmLXR+64oP4Dfs5RTk1C0Sja5yDXsUvByV6ODWWwBdv5qYZ8APeW1YS7aK2+R6nAt7nK9nN2X3liVxtTm+ynB6jmfUF5FL+70EuRUU1iAlTHn6HcauIwRcsOuBou8RfE1LbSJNn1Wi0OctdgcKXVWfc3vw1Yh0Bj9WjOPj04Jnjc0a3Crjv/AXwMSZpOXh+oCJTDtDDvjmmmUmFK3TAI42nzx248s67xdsM63FptVOLzgp0J1HrCbD2VfuL4+DodQMrB+Xlf7ikKrr9CPmXUi8SuC7W3lJQkz5m6d7Jr2ACZeTbmafzajVZtPsrkW9m6v7DdAeLqCYrd9EmxqO9e6MDcLM1IlTZ4TpsUxxeiIu3Qdt1aMFDpxM/nMyiPEi520rFIRrgcMD3WrIEDeCax1u/AskeTAMrv0G70uBY9WcuYx/eE4xcV0BNP+Ezu0iuTmymtARZuFGnsqirXgL432b3T2tDluYMpT8vwxTYBmKFsoMBRdnhdnKyZOJw3gLRjtDUISCF5P3O0Y1dJ2HFRMQRcWmu23C0wJuHGT3UCROWfre1+socTiUv/yPTkhmSsxmVwZDlOdX8mTGmP5XuhFkNSal49IRvxQV0RG13jwGs9DNldmjP3qaenaDpOAvAaLgQQI8k89d9ycmuodM7kbXXxjbZP0E/+PM43OCRVrV1e9yYLFU5cnFgzIFIHqoZ55YHaIAKaNgXfTVhtC405f+a5QIJyjqSjBkowCeZ5cCZ76OxTBBonOaTp1UjT3sQL9Pz++8Zq6AGSTud4xA7PThlKD80vyjf013a55awhT8ztAR7W6ZDIiddSX9FSoa9JAtLv42UkZGj+UgrzDKYjrPZMMOCnUHs/Lmbp3ZU3RbftQjZpnsGiXcRNmW5CmPry2kAptfUJ1wLOTQVbIB23K8hUJhkfNxypvlzGVt6YwRIFyKx8jbITfQT9o7FH6rOUVfVIHXx9v6vSVoLmYDXAPrPmvsDcTWH6rhsfKMi51ms0SQTaF4nSY1PM2KhmEaPnbtXOl4i5SW/4RlVACohpoqzUbhyfbftgXn04fR+HelzHB174YBNaTL58cY0eNB3gOO5Yo4LTBJHDysmU3nX3p5agFQKQqOQZoB0WptuA4JKSqxwA5FlQE8XbnX7etKUrFoEJiBkBlLNpZfgzHaYj4HOkaiNOU1nujO83DEFnx34Kfg6pakJpKRHUFAi+SH8/rOdJ0Pf2zN/vZweCGIj8mlx0EQ++uJBKw7CQSIKPYi6/sAAN4YHVNbSKAAkOTPl02p3CNLL0OiAFXC+VRuiGgtIboL5kreYnA+ApwQJAdNR5VXhxMBAkCz2q9wFMex8SoYGs8kCyedJUkGyYuo9HfWpULYgh4n1KTDvEdneNnEWC6LqVTTx+SFghgA7AIBDkSTWSUHn2j7h/nNEqmw/nBtFFiWtDuj+C+4LJDyEzgL6dXmI2VJh9ygbG0HKasmoXT89SZjsheFtxBI6VLg6qD+uevu0nuUjZOvqPyGcfLI229zRCUrlZ22WLF+MnHgG7QCdIz4mw7ZXTmk4xyEAt9PYevF9BHd5vLLKi1Dsh21fy7Ml7xNy2fpQ5pKhy6FptyGUVkc6sd24o882qSBeh3UqeHueA6A1joKE+3e99k05Dl7x5XqEdf1we1gf2c4xV9Mjns2UZd8Avx/V+g/Gr6J8odqrsNEaCM1cGmVJrxM/wCyQRLFtSGGd+IkK+pswNR/fiE+hnIC2lQU81j5FylEYyzpTeQnMQjLlo4lViqSrgq+vW+5IrbsV/3isFjdBAGfM+QG4OQNaCKWUsnaoHdPR+JwO8z9deAHtZUQAMllATi5xfQ2Ua/PGGRQJWPniKF2i+x0bNXrR+jI94gzFBLJ/CmHMffCpNQsGyzz08zUDmjpzjQKKguC2EqBUkuIVV6A2uAp/ZVLQSHpMMF/hxtOPjDbCqErYBR25VjErEJj2M8ja60iF+BrvG9LO1iqo6sfPOfuZCWTZQeSUbXxHdwK6BlY8gi1d7pyjqIroO6RnYUZRUeNQx4nlAAof61t7KT16Wpe8ZsTUKZyJU7Gh9cryByrLyKMC3NVB596IZ9lTfo88wHfeGPXIbyIGTgJ4vWnZBVJUR4PkgJub1q4W8Lz47sJN714KWsy6yAX82m6IEJCPbEARdxF1qAO+SthsJtFhDD6QduUufPJTAcsQOAbnlgUJzvdEBRa7bvqzrpaeBbaidbxPVG6GKHc9OV0iyVwpAAcPfVz3FIjYidMk8yBNwnue6PnKWNRmGOY5ryC/MRuA8Woen5jkGO////X3sr8ZmFTaoxd/OAYDy5jACK16h06OuvNr1f+PeFfb3e1d/v3f193tXf7939fd7V3+/d/X3e1d/v3f193tXf7939fd7V3+/d/X3e1d/v3f1/+XelfQ8/3zvKr73h2Lf02qcKWg+hRwaLsPg+vLqX40Is9Rh3w2W0O7Bg5OvPF/ufsFPInyneuvlD4s1sy/OHy/13PzThe5FPkWXlE1+E8u1V2MudwmKZzU1hrxkZL88Ouk/ydUNhWQGCFzh1UuoaGQ7H0lHCmK2pNCiR+/n2Kf0ey9oGq5uulmchOxA6s7BXEBwlVOLjC0Gh1o4LMcAzv8hOEdoRIZXgoMFzRL4MDgIz2EbhGGVz/+qD3tGJ5/T7o0gTMDzI2zMvPW+RruyLsRuSAvC29El530nThLLytYzQdmQy7Z4RbLzrrtGE2p+FEU0kesSSrbD4iKOcJb8kXHkJ4jjp8LmDWMrAr1Xge/6thIvkrVm2CYECGE+HmvNtYtay+zZ6u97SJf4BpYK6R/W/N5belDpDD1fDECHHtEl4el5kuqxqsrVJrEHWkexE99+jHpRJ0XYMEHwLPfkRTdJm1ud8/U9J5/b++0TLBUrDSdq9EqX6K3V1YlTLe77/Ddx+ADGiFpUhafNAQ0M5tiDPYWNfcjuyPe7smq7PisFVfYYmoi84ZZpnnHFGmb+vQek0SNM2e8Vup1gL64wVd/v3fOTHrrdySDlqMVzw4yprZNmkr0uFd9PgrLt58ehIY2slr3VFWewKWsoUaAZZYRtBtn9gLBM0RHjIemQhY9TA19gRnq78ptJVkzJs15999IwSsLOz7j53g8wqAWTX+j5i5WGt1ewYeF3BpE2IV+HcPeOb/5NVBvAMSRGy2eHDoFKufOHfE8z6R0DKJhwKdk5str0eD20oVVYwrE71DGh506/6Z3ArGdJtSJumD3rIkFuIkFU+pbgIqqG2oCgMJAiTcPzMZMYRNNBVrGCw1EUBDt7h24DWvXIMUzli4qkUPrAjlsUSM/dlK0fIusOpAZbK8lWoxZCcbM8tFkziMn3e93Lrj4hF/QXtSz0O7MObhEIup0pe7wou544UWYTr1XPu+pyrMy5LK9P0/dMW5lN094tbEQ/oxd2pFIYQyikLcM3lg6BNTEjs4AMZoPCco258Awuaa6PZiLn0WmOqYWAQ5QQhnYoEQBJfq305+Kbn5/VeM/s0fit3opuSwi1PQ+DHR55IN1QA0jXz6PYZeLz3Nc57/giWqSEfk4SYBSPO3qLgMJxVC2UX0nzVGbre3/khlFFkReO8jxQNbHkk9WbiN8i4AeubXX2BfAAzCOYNgF4UsKrrgvmpFKDffEgRo4na2baOnhvMulfd6iqtoMgELzqHXD+wyppDBsR+eRkkktJcFUCGj1St/R1ZNua4c+bkKYe8M3x0F/+ob8pobAQFGWCwq6XdsrPQzFer2eff7/Dfum65L8h5MObEoyyiH0icgpp3gJqiE3i73P7bnO70yRjp0s2bFexXq2+3GxN41msvosJ/dovw6oW43T1n/BBXPpue5Q4WBTxaWbn1AgpEKOI2bFH5AL/XfZz0KaMbRzHUcRjhhmSr2x6w2jRPeTvHatOrDtRhZUjlnP5Ylseo7J5eI3D90/alzv/eojn954WyFPhoo3vMwE0Mfe7kUSEw1L3tMBi5RheZjzTJZXnvB94DkE/1zfMCTh5JK+7LuXAB02dK2YwI1R+2s9JB2PlB0uC2CWQnDuUYcm4xGtAzoldh3Sv+0MVv89tvPV7pySzZBrWGPgy9oUWTPYM9TmcnaKI3/AcxYdhcgbYVDUh627CfKKyXqS42LYAsz0m3o/HAyn7cJJbnW/j62ojv+ciKVsWtfli5GG7pyedsnp6vOqBhBEdlQ805FYazOsim3lwXHHYhzN4WgQqMj3A/qxZlmWFMPzRgFhLpO4O9tDcF5x/tQdIFVAsI9RHBNfquj6U2HgDmG2EFNDexuGPBxeL+vc5vVVUkr+ixa4p0A2FkmdpIXgAWIGfz1zCmvvFs5nweAdu7p3APwpye6d7sET+ur4nEWIXQDk4aaKfQNpU8Cfv9NK1blJ7t3zSswSxdPnA9vRReLUf+XwlPhW7YOcrxRltttv7vlMpWvlLdLS245gqYgV3skVQ0SFFPh50d9FusT/zVZtsauj5C+ov2DdXK4F+ixiLlbUoHowjuCk9anRYaDtJ0YxWBTp2GOpe2HhRLtS6YGXHfOAShnEMYJ3FxSgM4JNwmtAwCgnFdUJmiIhq2VfTxgSRx63hWip67ckV6Wg5XHt83SOGj8UQxIfW3bdCmW4yjNMbvqKA1aGYk1BqpyoJHxTm1IfzQ/9eXk1BHp/KG/zsm06+s2HOZAJWkmLH9OPOAMWajFhdBao7tftzpqKOkj46W4R3li52PIDH7M5fMkmS9KPuTtg45EnKi4BLn7v1pIcl5SQz6kf4nZMowJ8R4WMeNU8I9y0WAzmCvz6V77Eaix+hUwdlQb3d4LFtKCs6X584arraq+9/OI3hoqPOq0oQ+oxxGpP3NGKq41yQK7x9L1m6QKRNjCkv76oJf3StMmxAXEw9DaSVJBns5zrSt+hjXhz4p7tfo4cU6vmA1AGCqZBhK73cCFlUOVb9PtdPbgAvimCi9OfTJ/i1EaqqUkzK2AWAAAcQ6nO9Qni9eS++djkxzIPHg77dQiryqXRdYNDVHg8+VjuiFkorQ7u73EwZvM9ZP4Qx5+pcHmz463Uv+dfz3d/D9Lr7V43JSXvqNZgDFJ7Tlofq4APWwr9H9fhidB/yjSe537vQRokTWA5D58gTAfe9M5hnl+1dJlBk501JMOdp8z37FIWruIFyBKFH2KAi3jpLrbisiEA8iY9dvvZWu+gMqeA/PTv9YpxGkgS7", 16000); + memcpy_s(_notifybardesktop + 16000, 12420, "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", 12420); + ILibDuktape_AddCompressedModuleEx(ctx, "notifybar-desktop", _notifybardesktop, "2026-05-23T15:21:45.000+00:00"); + free(_notifybardesktop); - // The following can be overriden by calling addModule() or by having a .js file in the module path - - // CRC32-STREAM, refer to /modules/crc32-stream.js for details - duk_peval_string_noresult(ctx, "addCompressedModule('crc32-stream', Buffer.from('eJyNVNFu2jAUfY+Uf7jiBaiygNgbVTWxtNOiVVARuqpPk3FugrdgZ7bTFCH+fdchtKTdpPnF2Pfk3HOOrxhd+F6kyp0W+cbCZDwZQywtFhApXSrNrFDS93zvVnCUBlOoZIoa7AZhVjJOW1sJ4DtqQ2iYhGMYOECvLfWGl763UxVs2Q6kslAZJAZhIBMFAj5zLC0ICVxty0IwyRFqYTdNl5Yj9L3HlkGtLSMwI3hJp+wcBsw6tUBrY205HY3qug5ZozRUOh8VR5wZ3cbRzTy5+UBq3Rf3skBjQOPvSmiyud4BK0kMZ2uSWLAalAaWa6SaVU5srYUVMg/AqMzWTKPvpcJYLdaV7eR0kkZ+zwGUFJPQmyUQJz34PEviJPC9h3j1dXG/gofZcjmbr+KbBBZLiBbz63gVL+Z0+gKz+SN8i+fXASClRF3wudROPUkULkFMKa4EsdM+U0c5pkQuMsHJlMwrliPk6gm1JC9Qot4K417RkLjU9wqxFbYZAvPeETW5GLnwnpiGB4qjyerqFOKgT2aRbfvD8FS8dGjfyyrJHSdwqlsc0DxEy+jjhA99b398PUep0RKbxPqFfHAsurV//emWew2cwgvzgG8q+SuArKjMZtjFvvnULTeN4Q9eaY3SNT2eG1ERfCKdnNSdODvgIUyP5b9XL9/3aiQN3lYOQfecCcmKc0P/6eQf7K/Hw6lG8Z5bHp9ft86v4OVpKAWrKyS3GSsMtuDF+idyG6ZIcvFOKxoguxsQRQD9J1ZU2A9gDznacydDuiJIpaX7n+ikBYeOvgZCu7s6uMnZqrQqMKSBV9oa0rdvZ2ja7nAg6B/4IHJ3', 'base64'));"); - - // http-digest. Refer to /modules/http-digest.js for a human readable version - duk_peval_string_noresult(ctx, "addCompressedModule('http-digest', Buffer.from('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', 'base64'), '2022-07-01T10:24:45.000-07:00');"); - - // Clipboard. Refer to /modules/clipboard.js for a human readable version - duk_peval_string_noresult(ctx, "addCompressedModule('clipboard', Buffer.from('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', 'base64'), '2022-06-30T01:17:01.000-07:00');"); - - // Promise: This is very important, as it is used everywhere. Refer to /modules/promise.js to see a human readable version of promise.js - duk_peval_string_noresult(ctx, "addCompressedModule('promise', Buffer.from('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', 'base64'), '2021-08-23T14:25:14.000-07:00');"); - - // util-agentlog, used to parse agent error logs. Refer to modules/util-agentlog.js - duk_peval_string_noresult(ctx, "addCompressedModule('util-agentlog', Buffer.from('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', 'base64'));"); - - // util-pathHelper, used to settings/config by the agent. Refer to /modules/util-pathHelper for details. - duk_peval_string_noresult(ctx, "addCompressedModule('util-pathHelper', Buffer.from('eJy1VFFP2zAQfo+U/3DrA0lZSEu3J1A1dYVp0VA70bIKiRc3uaQeqe3ZDqFC++87N8kAMWli0vIQK77Pd9/33TmDQ9+bSrXTvNhYGA1HQ0iExRKmUiupmeVS+J7vXfAUhcEMKpGhBrtBmCiW0tJGIviG2hAaRvEQQgfotaFe/9T3drKCLduBkBYqg5SBG8h5iYD3KSoLXEAqt6rkTKQINbebfZU2R+x7120GubaMwIzgir7ypzBg1rEFejbWqpPBoK7rmO2ZxlIXg7LBmcFFMj2fLc6PiK07cSVKNAY0/qi4JpnrHTBFZFK2Joolq0FqYIVGilnpyNaaWy6KCIzMbc00+l7GjdV8XdlnPnXUSO9TADnFBPQmC0gWPfg4WSSLyPdWyfLz/GoJq8nl5WS2TM4XML+E6Xx2liyT+Yy+PsFkdg1fktlZBEguURW8V9qxJ4rcOYgZ2bVAfFY+lw0dozDlOU9JlCgqViAU8g61IC2gUG+5cV00RC7zvZJvud0PgXmpiIocDpx5eSVSh6H23OJXZjehotdxBG4ZRa7f09VZ3/cemtbwHMJmD96MQVRlCQcHjygHaZHuuWNUVd5SRRiD0jIlqXFaZ2E/NiTWht2eKpkllVsYjyGouXg3CuADBDc3AZxAMAjcGHZJm4Sxkir803ZlWg2vLdFkfJpyn4aYt6m/Sy5ezfhnN9TOub2psbFMW7OiAQiDOOi/tK2DHsdWXsga9ZQZJM9QZN0xvEc6CQ+/ObaSq7UbU1GEw6jdKlEUdCGP4H3/1LF5Lu5tc3L0yNYtWBr8SzP/xeHXN3H0H9rhFo220qJ12cX2bdrKrCqRvKXfp3Uqu0tx6qK+9wtCYKEt', 'base64'));"); - - // util-service-check, utility for correcting errors with meshServiceName initialization. Refer to modules/util-service-check.js - duk_peval_string_noresult(ctx, "addCompressedModule('util-service-check', Buffer.from('eJy1Vttu2zgQfRegfxj4xVI3kdLsW4Mu4HVdVEhi70bOBkFdLGh5JBOVSS1JxTaK/vsOZamRb7kA7bxIFOdyzsxwxPCN6/RlsVY8mxs4Pzs/g0gYzKEvVSEVM1wK13GdK56g0DiDUsxQgZkj9AqW0KPeOYF/UGnShvPgDDyr0Km3Ov6F66xlCQu2BiENlBrJA9eQ8hwBVwkWBriARC6KnDORICy5mVdRah+B69zXHuTUMFJmpF7QKm2rATMWLZDMjSneheFyuQxYhTSQKgvzjZ4Or6L+YBgPTgmttbgVOWoNCv8ruSKa0zWwgsAkbEoQc7YEqYBlCmnPSAt2qbjhIjsBLVOzZApdZ8a1UXxamq08NdCIb1uBMsUEdHoxRHEH/uzFUXziOnfR+NPodgx3vZub3nAcDWIY3UB/NPwQjaPRkFYfoTe8h8to+OEEkLJEUXBVKIueIHKbQZxRumLErfCp3MDRBSY85QmRElnJMoRMPqASxAUKVAuubRU1gZu5Ts4X3FRNoPcZUZA3oU2e66SlSKwW1U38q1E9kEZ/jslXz3edb5uCPDAF+uLxXWEG75uMe12yPKVPNkPrrt/SK5iZt5YPLC9RV5ZZ8HeJan2Ja88uPl0O7oMrmbD8murNBfVkNx59HFMuB5PJqEABsSxVgj/c8xS8jb9Al9OvuNb+ZqOGbMXmzbOBua36Qe0dCytEYvvDzr4V3aZfJ+10wQTVRHX9oH4LMjTxZnMH62f+pSHSFp56OuD6Gj3f3989gKPCEiS51GRywKEVhaZUYjdbRxB83/+EucafAmbH984yYSaZg7fyn0x+y6h+/d5MjTCEW1GdeTrlKRczmjOLyikVv91bYdNZYbuxmjZ9VYvex+PB9WTSL5VCYfpSGCXzGM1kUtddv7Zhf02/2oP4E0lNJl34DfYaioyjBTX+XxStu9sBh8rtrZ4pd6VJALgo8Wl/NUP7CDQNUuN1A1zhHgw6YpVOjiIz8z/ePh+/9lyZfT77QsQPe9543+gF2jBl9B0Nea/b6fo+fNtGWE7t70Rk3lv/4tChq2HCezJQklKubczEZvblk2GvM57Rt/KLJluL1xMT7gX4KozPTLxGXjX5GjlQjJfGPWK6aXXEI4SPkD3g7PgAfZyF9tHwFmWeW6zViNR0LyMYTTcVOTM0bhaPP/mE0VXD/st/P+++e3S9kLMyR+o+ulMa2x2794RWMqYKWbOeYcrK3Dzl6cfVw7PnYxt1m13jtuLxPwpX1LY=', 'base64'));"); - - // descriptor helper methods, see modules/util-descriptors for details - duk_peval_string_noresult(ctx, "addCompressedModule('util-descriptors', Buffer.from('eJztWE1z2zYQvWtG/2HLSYZUTFOyc6oVZ0b+atQ6ssdykkkV14VIUMKEAlkAtOy66m/vgh8SKTK2dGhO4cEygcXD28XuA8D2q2bjOIweBJtMFex39vegzxUN4DgUUSiIYiFvNpqNc+ZSLqkHMfeoADWl0IuIiz9Zjw0fqZBoDftOByxtYGRdRqvbbDyEMczIA/BQQSwpIjAJPgso0HuXRgoYBzecRQEj3KUwZ2qazJJhOM3G5wwhHCuCxgTNI3zzi2ZAlGYL+EyVig7a7fl87pCEqROKSTtI7WT7vH98Ohie7iJbPeIDD6iUIOhfMRPo5vgBSIRkXDJGigGZQyiATATFPhVqsnPBFOMTG2ToqzkRtNnwmFSCjWNVilNODf0tGmCkCAejN4T+0ICj3rA/tJuNT/3rdxcfruFT7+qqN7junw7h4gqOLwYn/ev+xQDfzqA3+Ay/9QcnNlCMEs5C7yOh2SNFpiNIPQzXkNLS9H6Y0pERdZnPXHSKT2IyoTAJ76jg6AtEVMyY1KsokZzXbARsxlSSBLLqEU7yqq2D52K3guHnwfG7q4tB//dTOITOfaez19FPV5s0G37MXQ2EsbsjAfOsVrPxmC6VmopwDpY5wNyQcYR5lwXIhB2IROiic04UEIU+zHQyLUqAE6ouIspPqHQFi1QoZIadokvMJXcKVgUo7c446MclGCfDx0UeS884WHXo544IcKcs8NC5LE0sM2m4zZDNlkPvqXuGSW2Z7THjbTk1bRiZ+HOjaRfhkpGOVF4YK/wRiGqa3XJzyC3TI4ogyNJZy23BY1I9yaidQ3AdFQ4xrfjEanVh8c2JqBBPICbjvjGScUdnO7UM7anEhIBdH4zi4jAP3wz4B5CT+eULN8H808RXMv8Ku2f6f9P4JrMlvvlobmCErSen54eG0d3QOsLgKCQ82ngE5ofFDve67M3grLuzw1objtuUPz69Q4mlqqwXzD6yDcDobD6W+dbR6PUN/AvtP0ad3Z9v2psS3I5jIXYv5Utp2DrwNui5t2Cbr5e9cfjxWWxouqld7sfNRiSMRZquzyJ/4fSeKcz3esw5YeoUDawqmBIP5YbH8qt+BFWxwAr9dXgxcCIiJLXWdcPByp9Zrdb6/Is1OiTRQNraeM5RRbLWIMeCkq/ddfUMGI/vf2hnTUoFEtra23aNcLZ977tp5/ZquJ3afgftLIuS1qQXbAtt2VKN/l+JeQb3h8As2zzqkzhQa9pShVskB8RljbpBKGnxcOh7PSHIw+r8qeXJ19rE4yDIQJivLzGoFAEbu3CY9qXykR5WXcL1XcZn3ANtY2oByddgPtU3m3wmJ6B8gveZt9CpHjqTiXPDKIysYlQ0CzR4C/uFuK7FdMnSSTxF+yLCojYmt1ps7yz8e0nU1AYiJkSIVUTqva9wfyIWy2lXIWbd1f9qFqHbo5tCU4RMivvD7S+UU8Hc95iWUxLgDnGMCaHoRyKYvpXl7FsFDPRDboVh7aH8pt5nq9SCV0+NvwyxyKkYsr9pPrG+WVlM33m6wOBNGa4LWgIrkcvIbsU1xR2xUt1gIJ0ollPdW2zHV8ymhOtR7PtUWC1HX5i1ncRdL2+0kfK2DpdW1fd0xJNkqbuIdfMrHvbXVKJc6dYqj9PkjPLMlCsQTDfL1N2AO3IozNrL4DliWOXqRthSXsxCzpDBLuN+iD6mg/r4Ypml/M3GuittKNW3hn2yuEsavFa3Ge6z6z/A+/cdvRTh/UM6YSISTlRI/SJkNuo9VdPQS4N1V9k8agyTxakYrmtwQaJrFL/ew4KqLseGXOFBkdYKVfpPrusapLrMc8ZvcdUu02PUO8I9LBA8TBU+KuShL5DCe9NPSZp9pYLT4PVzqpqbbbtMZj7Q8YKgEtMS9Noq6Pq5zI/E5eisXvLQlIEKQ63CtxgbOjboyBSqd7l8y9V7rKInkl/aUpuNJ76lPOaweAswk1uAeVBsyj6rmIXtexZ6cUCx3PUXH12fjzXfcg5q2uzKpn5QabGzTe4g+7WTdDxYCQQsCvEt5nn1nLEh0ezLVh27rKt2ziSyesddj6reeE3M9Nf75irAZS7OehEgubra0NP8B4ZlDiE=', 'base64'));"); - - // DNS helper util. See modules/util-dns for a human readable version - duk_peval_string_noresult(ctx, "addCompressedModule('util-dns', Buffer.from('eJzdV2uT2jYU/c4M/+HWbWN747V3SSZNlzIZso+UZsNmAkkmAyQVtgyaNZIrycuSLfntvQKzmH0AmWYmnfoDNtJ9nHuudGwFO+XSoUgnkg2GGip7lX1ocE0TOBQyFZJoJni5VC6dspByRSPIeEQl6CGFekpCvOUzHryjUqE1VPw9cIyBlU9ZbrVcmogMRmQCXGjIFMUITEHMEgr0MqSpBsYhFKM0YYSHFMZMD2dZ8hh+ufQhjyD6mqAxQfMU/8VFMyDaoAW8hlqnB0EwHo99MkPqCzkIkrmdCk4bh8fN1vEuojUeb3lClQJJ/8qYxDL7EyApgglJHyEmZAxCAhlIinNaGLBjyTTjAw+UiPWYSFouRUxpyfqZXuFpAQ3rLRogU4SDVW9Bo2XB83qr0fLKpfeN9u9nb9vwvv7mTb3Zbhy34OwNHJ41jxrtxlkT/51AvfkBXjaaRx5QZAmz0MtUGvQIkRkGaYR0tShdSR+LORyV0pDFLMSi+CAjAwoDcUElx1ogpXLElOmiQnBRuZSwEdOzRaBuV4RJdgJDXpzx0Nhg13gkxupTxJXjlktX805cEInEaqhBp1ddDrEUR3LCHfvTC8qpZOErItWQJLbrH0pKNG1i9gv6WorLiWM30mGSkpT5UYIWeSyW5qavqB6KyLFfUN2keizk+WsiyUjNLJd5I6LJNpnfEclM9539vcpjtwA8ofyr/K+d0dHX4nkWx1Q6rm9WEH2L2+1R5fT4OkteVAwOFnazFMeA90wg139HEqjVYM+de+RkX1fJ1SmuNgRqXPwjKmnsrMH8WjDc97LFPlMT9Sk8g8ovFTiAypOnHjx+uoRmrkgsnwuJzYWd9tNMDZ0cwVel9mD/iVvkSIsW7hg+cNwFieaawnhopMNxCmWupNvz1jWokNHNHdylIxY7Z/cHw26edjq/YXWZ5IDlaDMzLSz+hPHs8o6lHyLUqLhgZgOfUilC3LSIhl7S8ATLceygz3ighrYHHRtvvUXymYevdCQyjTeJ0Wy7ujosuGObVqPzNSQndOFqJrUzr4c1CAuMVmF6KwGV8u5IJtBtc8bnq9ixQqIhoDoMUIlEcuGHgsfwN6BipsDJiCoqUWVwBHHYXW6D/aeN/8j4HHZPzLNt3R/dvrLXTOLo0fFpzbKqG6xSrFvHYHU2WqJYOqy2X2W/NU+qDx8yd4P9JnyzHe38xL4EH38MDJVID749Moo9sN0Nnp9rCkVdo7vX9ixAnrbK9rlWq8CDB9Du7PdqNWvZBGtTNdsVVCD0Z9XtdvNfy8NmeO1OpbcFzEXrvI0dMVtwg8mm+QXa3tpk1nTtSuxyesk0LuBVmzFh+hgnnMWwlpNbujwXD+eP1lnTT1GMqHNzY/u4NUeodTdUBzdXOHTobaVfyFGnV/CYrryTRyQUd72R/2eydG87VZhplsDuLlJwvyB9Z0W6+m6KBF8g+Njtqh3Y6Xb1zpKZbrfT2dv9tdcLvplc1AtCdvZyWym7oTPznwNYPFme4doDjNh51Jvf9/+z2jPdSnv+lfrcrz9m2+vZgaYGW4hQ9ZZyzZz9czpRzjeQKIWHvHAITi45fpoQjct8tNSpkODBxZ59WNkHxaEYD2J9FS0GzTUSUYbg8CwkpFZY4fX3WKGOPn6Zn1eLkfDI8qiyNk7hULM2UkQkmq4Nda3F9wSKaEyyRK8LsSp9RXJhekdUJPof7kamjA==', 'base64'));"); -#ifdef WIN32 - // Adding win-registry, since it is very useful for windows... Refer to /modules/win-registry.js to see a human readable version - duk_peval_string_noresult(ctx, "addCompressedModule('win-registry', Buffer.from('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', 'base64'), '2022-07-25T17:31:37.000+01:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('power-monitor', Buffer.from('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', 'base64'), '2026-05-23T15:21:45.000+00:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('process-manager', Buffer.from('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', 'base64'), '2026-05-23T15:21:45.000+00:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('promise', Buffer.from('eJzNGl1v2zjyPUD+A5uHtbz12tk+HRIUh1ya4rzXTRZNtr1FEBiMTNvKKpKOkuz6ur7ffjOkKPFLspLmPvyQ2ORwON8zHHLy/eHBeZptebRcFeTN8Y9/ItOkYDE5T3mWclpEaXJ4cHjwIQpZkrM5KZM546RYMXKW0RD+VTMj8onxHKDJm/ExCRDgqJo6Gp4eHmzTkjzSLUnSgpQ5AwxRThZRzAj7ErKsIFFCwvQxiyOahIxsomIldqlwjA8PfqswpPcFBWAK4Bn8WuhghBZILYHPqiiyk8lks9mMqaB0nPLlJJZw+eTD9Pzi8vriB6AWV/yaxCzPCWf/KCMObN5vCc2AmJDeA4kx3ZCUE7rkDOaKFInd8KiIkuWI5Omi2FDODg/mUV7w6L4sDDkp0oBfHQAkRRNydHZNptdH5C9n19Pr0eHB5+nNX69+vSGfzz5+PLu8mV5ck6uP5Pzq8t30Znp1Cb/ek7PL38jfppfvRoSBlGAX9iXjSD2QGKEE2RzEdc2Ysf0ileTkGQujRRQCU8mypEtGluma8QR4IRnjj1GOWsyBuPnhQRw9RoUwgtzlCDb5foLCW1MOklvcCFm9JV93pzi6KJMQV5KMp4CVTRMQGI2jfzIe8NHD8PDgq9QUmsJ4BhzAWn5qjj3A2AOM7QyMS1Z8TNPiF4k4SO81bJsVGBUOjTNQSqKAhnK2AsIPgAByB7AiYCf/cVaUPCFiC4cMtoZlsxxsFcyLB3OWo+3MQhrHDByioBwIbShTuL6S2dX9AwuL6bsTMjCRDEYE0Z9Ui8f3UTK3EA/Jro0U0DFYIqgpyNOShwy2QfvEr5f0sSZJDMuvONxQWK8ap0ngXTdmYBCSKj+umjSNOMk4ajiN12weNBui5YD0H1H1twMFMLirlIA2GyAMjdDlYJfyEfjMXWUKJOOszFdBDXVLo7uhqU5pVn+//vBeMoI+vg2a0ZFEVDHhMoBaMxjQEFZmPp7NQjDB+S/qJ6wKmI0Rd5foAtpgAxQhOLKgLRgALC0hLF+IAAmrwDgGahc1+VEggUkwJfKa/HR9dTnGIJMso8UWcNsbK5+p8LyHcZsbZZygE7XdQHfLagym8afhsBHkDp7QGKOAYeWKbAUArFRDJ2LpSAZ/BtI9IQsaY0JhnKc8r3/WAGd8CaO3dyOisJ2nZVKckOMRmZXZCUnKOCa7U+V1IqQH0tHywXB8gV8uQMSweIw+FZjEK5uR5I/nbBElDOQG0bGQxjIiR0bMOBo1lqgZJX7AL05ILf1gCHJRcUDuWmbDU7Ibmatyc9WaxqWKYC374CdaVKDk1VsphO++I2oX8laODd11HlT4mUzIZ8ionEHSJnGaLCH8Q8qCwmBFE/8SpMAUZm2oiibP/h004CeMGeXTx0c2j2jB2vArrfk+bSRJiloW7txhz1AjXiJEbyHTVux62RXE+pBHWZHyn1lB57SgTzCuvRaiTM91CkClSPH5BESeP8/eR4nM3+/Yfbn8GSIVlA+DoS35lzFml8T82SSOpG4cQj3KsUwF8uDgX1VSNoSsUSyWGNEJs5nKYV2YE7b5ACUhSxh/A5sEzS6CaZl7xddz4Peehr+7u08mIVRnaczGcbo0UA6qtRLNQIbTCWYJQYr8Db8GTWhtZushXWii0Gu8pplAv6/3wkjT5HKMQa/0DVVManZotW/cy2BfS9gjj9xtBUeLgL9664k6HnuTJEJWmEkn+YQWEzR8jAjvsB+BgW8hugs8nD1CUX0Wx0oXuYYJ4z0JKdR7JPiCCeGpeGQV0olnp2tnMvHpp8KC+ghMITdZvEojf/xB2iFEeh4Ou41Bkdyq6jpz7MkXHs358kNXVjC38eaAXQtxmXGY6KBJeAomBeuoYmDx0MYzLUSwL3U1VXAntSjCjCU9sm1LprWk6MXalmP9JLRm112rsHf7gopmtM+MKd8ST/7PPLxdUJAqi1iX0zcJ5vZOF8RO5bWxXTBbGa4SBwbxOrGpQyD35NHayxpi62r5VOdX13wVf06t2RqF6zvd6Ro/4sRZjbuHUoNUO2E0htmeSYYe57R04dIoz7Z7UdsWS5+3VBM2A+m20tkc0H3n85ZFXQxqh/c7X7ShvSDb3USsj1myLFboKG9QXzh2++OdLBSEArcZSxdBNT4UHpWKon2gwesHZe2k3K5U0ezgT8sJ9V7YYjBP3DZIsWJJYLVaRnbr4jlKri3HCArUFx8VZFBHIF/kqEtHJ2AgkakdMOTgywWMznjwAvGiCt46xH4/6RkAuqx+v28Y6VUV8z2tEYUdcG910lSJbfOyRkTn4d5KYV889K/Ck2VTsTQttVEj4dvjdgH0s+sOm1YtJn/emybYarfM2Z7zWDXqZV25emfANpQTrJv4tX5yaJpMiAgfw8p7wA+oatBhB5lsGEmqu4+KgImUNYkKK8oZZ9zQPELpxuU0Sp3Coeoz91njJD4fGZVj9idDRp7nktE3voq2Xf/jjldXSZr8oPqyMlW1qE1c4ChIcctmK7C26PaGdh6s95yFTYb3cjKP5smgUO0pmmyBAHm3hiw8lHmBNGd0CY4uOBD9nJwsgCbxW1xOxVtxiSXpbGHqf2iSblViBBBZ5zexQnSD/OGBF/64bcdrXnQdDSFX2oc+H/zQTaUdrmXdicmYKjgZ41/nzKBfzCyweRdv9XjZIgQvFSo8P4MIXQ9okgYJejFVVVHeUkTB7cnqHeHRS3eN1k+7ZVmSEINMDyGePr3vhOhZWZvgfgtsNgu8+fubWxQ9OxQ7H67O6PUsI6+l3ktPOgXy/rz4JDo9CdvYl3TazbmOTS4xb6+bI4KnTO5WtlsS3OAbjTpX0JzQmDM635LGIyBAA56cgBzC33EnDMYrmsxjxj21hHsg4nWpo1WO/YoeyVvA131bvAJ4f23UgUGIfd0m8hboDoevVNiWZ+xpt+XSa7vabj3b6SXO07bzXIa5Wb9Ljq28i8sdexqod4oODxnPqUP2heUX1dK+2PJiOvI3Qfaf9PeV7+0HHW874D/NqnukMwsyfFQkEJmRE2JLtYFeBFRlAN86CV57L9FcPrZJRC8TG/I90M4Bw60eK91VXWDPOyY7eHa1OTwZoD+kan2wu3ZgeVDWU6VzlraBnVO1UgOE61d78pZxD0quKZxvOFswiM4hk08DIYPJ85CufflU7dZCPlvRfHWezlkwvHOSUjsXdvHpvY+3HG3OkAubEm1/3cAtS+h8PlAL6Gik79n+UMButBhvUzxy910EtPXzbMkEXbfofS4ALWKfcvG359LP7Yw94fJO3sKJ7pb31qwvA73u3HretRkMVeZmHlvL7HQPhBFH9wBnNZQfrn27p2yje+EL3MV96z2cdQcmZK76AKrf4jb/rPeP3spfO32OyIPYUhmC3m12Hkrueyfp6xE7ryTb6x3ZKHVLM71p2rwxUtkVM2sjFtE1NKQinkEOyX9JJi8hjipvf7s4oJLQZYGFRWXqaIeOobRLhMkTaFt5MNPuVuCrk83qe1kxn7vzGlUAov1yQedpwtruZcHZ8a0mTB8rITfpw9SYKQeLK20SFCbvvvrkN6wSyhAf2TrnyNevQcANgaJsNBmvLg57PbNr5NDydEPC1NfhzmZd5bxeZICtdbL7nkZxyZnD7quGyJdlqLquQ7o6WLB8DFOoK2nUwrGrfEt0HqFZr/fhv3K8w4PHdF7GbMy+ZCkvMGI0mcecGpttHvUWrR5oW1C/wq9X1CPuEijjaBkX2OLRA4E23Ph2k6tUakFXVWNVXEXvJrt/A1nU8Oc=', 'base64'), '2026-05-23T15:21:45.000+00:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('proxy-helper', Buffer.from('eJztPWtz2ziSn89V/g8IZ3cpTfT07NXtSaPMehyn4pvEzkX2ZFO2z0dLkMQzRWr5sKR1fL/9ugGQBN+gxk5N7YVTE0sE0N1o9AuNh7rf7+8dOauta84XPjno9f+dtOHPwQE5sX1qkSPHXTmu4ZuOvb+3v/fOnFDbo1MS2FPqEn9ByeHKmMAfUdIiv1LXg9rkoNMjDaygiSKtOdzf2zoBWRpbYjs+CTwKEEyPzEyLErqZ0JVPTJtMnOXKMg17Qsna9BcMi4DR2d/7LCA4t74BlQ2ovoJvM7kaMXyklsCz8P3VoNtdr9cdg1Hacdx51+L1vO67k6Pj0/FxG6jFFhe2RT2PuPTvgelCN2+3xFgBMRPjFki0jDVxXGLMXQplvoPErl3TN+15i3jOzF8bLt3fm5qe75q3gZ/gU0ga9FeuAJwybKIdjsnJWCM/H45Pxq39vU8n52/PLs7Jp8OPHw9Pz0+Ox+TsIzk6O319cn5ydgrf3pDD08/kl5PT1y1CgUuAhW5WLlIPJJrIQToFdo0pTaCfOZwcb0Un5sycQKfseWDMKZk799S1oS9kRd2l6eEoekDcdH/PMpemz4TAy/YIkHzfReb57nZ/74Gz/ez2f+jE70zpzLTpB9cBkP62cei6xrazch3f8bcrEBZ9Tv0PhmssqU/d443e4q3xeYg/4nNvWAEdkFlgT5AO0rChUYsAAiOw/F+xtJlskQLAgQBrWjC8/jBbiJxpmGREekNikh+ZaHYsas/9xZC8fGk2s01yUOBjzlDyTe/SvO54vuH63icYIUYxeUn0kd7MgVUCDx+gGUiLoAa3KEL2nAEVVALsfjOnYzJZAEYmSdeAFvIgoLPCCHKfMSqE3UbY5LGUwMC1GYYiInJa57wKASWGNgVRavYYlu0ics8tcGFfmCwlZb2ht9s6DFkO2KrewveJ4U8WpLEBEh6wfH8vIhTQHAa+AxzYbF87SzCSjWakl6gBU/YSxtsOLEugYrqb6kRU7+b9+G2j2TEA6gqhijaCLEEKRTkSr1DSwtYcTbMYOoCcgNnqGO78PsGjhh5h1JsxziIU5MsXAbRjgo3anM0aekdvgib3hIizoWDUDHMofSHA/OlP5IWAI2tKh2tKRDa8gNHjXyNwkeyy12KspLGxTDvY3GAnsVfSuEzAtDoWBcpnTr+hHy3o5A5NMdYzqUcu352cXvztmvGBt+h2CatFju1703XsJbV98qvhmsYttbywdw3hyhr6zNObHboB1+ONt/akoXepP+nSuHFklaRBKiJrbjm3hkWk1sSjPjpCj5H4L6GsTRamNWWmRZDBXtyIMWcU0ckb8P9Az61pd72F3iKXOvy5juCwJjAWUydA4+Ui8/Vh8rVjN/Sp4RvQOtbYCQ4YUz1s9XJEJh3fGXPrhiKQxQBjjg4d6TR8kuYQ+ULA9a8A/xeCg68BVP3qytaJ/t86vDPWd6T9Bj/rWhnsB72sFN4uHM8fadqQQOzFP0Cs5KKl4G8Nz1s77pR90ZuloMCrNcxRf2j+ePpmiF6sCnclcVyu/mD+b/e/vusih0FIYOQDChxVaOtBZOJD85bv3EH40NJGwCs1nLzFZf96NNLenp9/uPnw8exvn7XKLmGviEIleJi1GXEniEQevOT+L8bdVKKWgTJtf0Y0EYH+0dNaHLxi+1uXGncqdR8r+1Y6LtqjfmWDYfCv7LTUrg3TP4aSRvQe7WVaHzugUctGEw2oHknjg/ibY0XI6BV5c3Zx+nrAtKgAXIRStqtVdR9TXiIyksB4nGV0pqqGMWrQZWN2A+YtWNUxkRGAfw6DqEUGMZczwvrpGga4D6GSH7RglnTXIkzHhQZz9UWluGHtNaSJ6QrWvTy4BjoeryKRTEtuViR3kq4Op1BHBJe9mLUVgpbTLC1vEyZvBkxlWfdCv0hmrsP5B0X4fwfonoVMZF/iiKRCNgsh1JFPRqExucOp39Kw4Y8b+XByGcO81uVw9AlEOCLsOaU4g4S6bgm0kEmWM2/I0ArB5ehF4aiAblQECsXgRaxQUoFwH2+Dj7e5j7ebRKGRCmBuKf9g57v6Gq0PJ0xUBgPmDAdcM7pNNRIUKSVRbGHDfCpYLrdgeHIRhwGHCkhumURAwKCCiWodtERYEL5ptn+oAVRy7ZXVHxWqVdVJu/hkzYRJDYsqHL2mScOfmvju7O5lIAoeP6ya4/RLjPAyoa2Rxu5kfJ/O3oYQv1nbHaztNwP7zcB+M7Bfx8CmTOw2WCZNrLIdhZa1bSjDVmBDvxnOUiGODGfI9zCZpfFZmGJKqwSDihWpkdjaxSx/Faus0jyyk5kklwpmOc8l5sjPY8gFIrC33Jxrg263ju3mUCKjHbgWgKgDAOUBFAoaQm9r+AyQHtEM8wXAMiZPIDYsmcBLtb/0/tLTlIdMsVre8NyEQszQh19wuS7krzIVueBDteC9E1/qg1epA/hxTF4AK3EhBFmJn59Ws0IORVhEl1Qx1ZL0TBp28Efvr+xfrRWNVSuiocVkssV6PlQJ89RFh1oe/Rq9056rD9+iIJKcZjorao8vxsc7hkDe1kNPbM67YpFTPRKKmv6/in+Ug5wUZ0nXdRy/25mAx3AndZfxShCqKCpfUsLwhtq4jWiqsKBXDjF/Ta+8TY24p3hlr7J58eKeCmbZ87GlvZvj08Of3x2//mrxz9WVVid8EQMKkhTGQE8458zyJLPmWc0QRev/ZBzh6lafH4p0ygwBKWXY2qhKT5/qmLhsYOOl4P5Ltq0EP6JY12BKEhR+axEOi3/mTK4BENiALYEDGtfTLIIogYLfmu2DprIOwxMZJxliryXRjGF+u19HMEITJ4MMWRqBVAX4hOFuaJRH2pZ6PBxFqWKx6NOm+SKuYtj75UvMElVUteSX59WkDQdPwlTCw9gnp5ZbH0ZtK0wt1pyMhqEwxMBxmK+JTCXYi/xo/xkM9xOGycqBsq7/fgPl6s0WljMH7tTNBsat/smC4JzlDqmvz73YEerRg1IObu46wYrFrTPT9XyISvkH4PBq1BvuEMw+odElxkiOSHlySjUkArGNYiI0HyIg+k5rjkZ99BPZ0oOWRlixYjRSJz5jBDFui4lxuG0GhupRPc3FHg6GJZAw7yaNWF/d3soWFwIY9s+APIDFbXBRGPV+0pDlWrMVYqoBnMPoqTZR7X4N71XDfaXGJpYOEDwmGT9gJA0Mar7qJwq5//kzeLvvaglOPeoEhRHWO7rtsyC2HsYdsOIjoz2omSCWycfm4KkhMuOsrA9kB+JJvpjjTnGt1YgVRxJ2QecOnSSkpvFMPXVsQP3q6vnL3fntL1eJSVe0/xZFVtp9WwemsNPLVTynRfGpDwhAhNMXhNYLp1jwhc2wdqRMdA3lhkWnu2lInpSGnyKbnBZVInDihB+7Vx9tUl6fSfpUqz7htJBZ8xejXD+rGkE9VkZQMBWoCtkSG2GT9XbJqJdNFFjAzLPKicNB4RMdEipozygL2//H+Oy0szJcj2bISc8tUofAogNFpcge5dkR73iDI68+lhVtX8C0cLY4gtTBcvTX0tcOzDWofa9+GlAcOuR5q2FJHZ8uPWBcFle467ilpzkXPjyI7kEQzaCExxbzTy2W0IoPJxQIYaDYaUOOflSIHp84Nde7xiNZOi5JeXyPt47pjmypKCwgsYJMfMpntlGmsGBKm36iw3o12hUciMw/6VgiiOL8X54sklAYRR1JHsWbryWSSXRKUpk4UZuQzYIjtSVU47OzcJJv0ln2OvVKPnGayuZER2rmYdIlzPKUrncGnssSLPM4VZPN9ADsMR65xHP3HqWY5AGwa0oMlxI3sNnpdMNjibx0ngdIOklkerBS26P8HDuQM6bWLMdTinYgpBWOEWu+c+ZzOj2xLwA2zp/dgA7Teg2d+BiTimYcLwcQer5emODbkDRi2p5vWLh8FHj1/SwSH/P7PfUWh3N2iBOP0DImBquzFTuy32h2Ilw/b5H0ZnjYVd1k5DC4JtICOc3j68yAqUZO/WIpZZB2jRuEGMhEVMcQmUEqqIcPiMRrx9Z9cmc7a5ABJzH4TDxA3JESw946NrskwmLUQEXl8UgLvLA/F+a0kWckcqxAAQfLe3bBFlDwOowpntpemkC/JObwHgzpLa3qRq/WeCdGsfCUcrS/nt0jcnESpbwZ0nSuODwkILGUndduz21nSdsLaq2o63FhZ+e3xwJ8IwcgSpUA2Fk6U8rcytKwA8MqicDlVkbgL4754lS1NBb7GrEzCPsdQo52qL0k+kAuiPaWQcFf5QK2Ty9T23H9Zsb84RP6Kv35kZeIC+YrnpZxypRUMWGXLsWOOIfu0zOCGwPwophI6FEdJz6dRpGRv3DB/EBlppJ4rwArepQuKFg5nrnhkQ9To0ZgTltcYQ6nUzd5kcR8GH/eSDc5QHB4qduOCKCuyU9FJVIISQbk8lqC5w/lmx4qFNK4N0yLWSGIjRu7aDB0s9nkioqTZBuMsJ6NT7CT8w6/qQiN7DAVG+E0jMXNeDPQJtseu7KBoBWNQcxT6XIKDChwWSglSug/oDcTn7xHC50TwiAg4O40uqwC5AoxNfOhY6AV3Iq7LHJgNu6hpxspvO5CuBZeBQPEHxSbMLXgJR5Rc9U2gHi+GnfIP/25gwe1xDLZPR607SwN767B0gkntg/vMBWIlKjDiRmeC0zd53F2Cm7uGqRsKqOU1MfUDSMsRBLaK+nv2rSnztrDK0YwjPlI53jX1PYXuk1dAmMOY+1ic7TCMILrCqrv2dqm7inY7kaozyumNr5nJiLoZET/iYfvBhgm996cUBbuQEzvLZzAmoq4GO+T4uHCwvCl6AjfY5xJWKAZw01IWYp3d3Qr9wdY0nYFH6A7/xlQzo+iCm9/Of7ceedMDOu9MVlANNMi+vjz+Pz4/dXVUeC6QMeRY/uuY4H1uLoa8155V1cxnTo0uTmJw9/E3FQa2vAWn02xOgEDz/GONLTzEBZiEBlZO8ZJi/q6h/zASItfqUbJhNNpbeMwMjVpyjAxB3c1M0Nnfu6gtCW4miNGF6J2cSU5ZC27BinBvApVElw8ZdxxPSaMEVcYC2GaZhDLAJcMRgOccEtm6oLyoiQjO1kcqFXAcxev6/mt4oec8vKMi0ipABUCFV7YBWPk1budLNVYMvRtPbLzr8i/ssuQcirHnubmCLjjUW+XO824bGXBl2Q0+MG+J01r4J84VCywXUVqVFc9zA5+bw4T2HFEXgAkvleEx2hHzDjiNYm5s6rksWbQ/L+jXOnNzE1UCDYV44U+QoryoFZulCdTxrta5mCGcSSEysDgn91T1zVx/vMUKsEWrDBwBrsr7lsEu2tOXAevX7y6+sSpiwy1uIzy6gpvs3Rt6pMw4kMT/UEmUI8u94gXbRLxXKI7WU+XKGYxXuaVyNilZolxYMLmiP2Df+v04L8+S0smywaDPkTK4RbFBDIo/dFCp/VKzwv5CkJGbJeGlRsxgi4cb4z8ADTTTfnatO87nOKcKDXbLr57sJkbuFbgleLf79NYJZpK8PZa2UGTLkAsIUotPFsaE8fLu//tifaqPfs+tcRBjRwE5ec36iCI10i9SeCbFmm3udFT2v9WuvetYNWWiYi07aLu4Ysc0tFElNEUCnMjuVuopR1Hc8x3YAUJ7huqQqSGi5sqscMPNwjEs1m2ZeBSWrMuBQJdV6w544ztD0MW91UbAquV+Jy7K6pqA0IO1x8Zn0FQeZghH0uoghbv6Lo3rBbRyCBxC0JV8+zuDbZng/NL3rAB0BN7i6oAz2KpVmnxqFYtJPdaVVqik0TVQvxYLcSJnUgKu88rzlIIsRz1s/v2mEwkdsmVwVIWvuSu1Hqykth2ioGbVqd1OHKt3F1CAI7tlBc3sSkBVRCZx2KTqimMeN5+GrVt9QX7ZHCDR9pTyntjpLCuLNHAgtx6W11Q2jp4jotn9jH+0vpa9QRW5JzkXDKHwwKJKJUs3iklkhl/MJpLrPekcMs3TiSyXcmwR8osf0hmlvNzU3nhj+mx3TbJ1T8sYJMTdh1zlBNWmIsIwnLuNU4klH9XcxEuFDpLbPZLc0J82E0vPIKYrBDfxf177CVmzKirF5wZyYqlrI35KxiiaVLc8PJoPse94Yn/Blh5EJVY6lhujfItjBibwkx6TYktLvefOi1xWT/TVMPeErajQVzuGU+/gUcOXsC/Nj2KANZsqfcWmoh10RnwiCWSkKTw2PbENVd+OGkQo8CvVW77gW1TCwN+eyodAxJz6iWikWYJ4pWerMhvdLfpOmzSEH/DXTwntunH9hCm+Sw4F+Ik5jkdzIdZ9zS8NDtxx3tysr9eGVNzxejiTXR8gzaJX36eumT7JyK/HaDpjelHcjg8ackhJ7mcpTBRlr6OPqIX23FZwD0c7MMwLnFl5qK95cnLhO3l1OFuIdCMLn7rwIwnkkUGpsO5kQDN5kZA8grMKk3Mj8zlPH+9CApw8uoH3pFYRj7o9TBQwYIFNWDK5V3qmJEG7Wufb1dU5+kA8cMVCL67adsenz61YxksW4cG2NgrPr1LZY1x4HDFACrlFrGOs4+rtPcDsAWzw0oPyAAymtKTx5Sjy7hcgRSUKYFT7eci/iFLw4fDIxCGI5gcQLwREZSXp+Xdj6TzHw3xQpigUqIl/5xcwk6vtCVxpDUgNKnNjADCJN1xk7wIJ+dpcInmskKJy8C8tcmy8NGCkGX4MG1bSjfbG3jghi3D6gP51cyl9Nabhi/xWTrTAIINusGlcMyiPxBzbjsuZX5jkFmdbpEwlhikrtYnjxIn5KQxxw3u7oeDOpizOVMZdzqyqcA+NcBX2BXoY+jJpFEubBiNJAj2Yw1vmdsDaBlXOMzUj37XIO/nI5hlzv99jSQYcPGIK/xZDUlgAewgX/nSpkf8eErkipTUFKQWt8b+RveThhzLPEKP10V6T7HzJJMqLAAo67HyKAjm/ZaBKPqpkPBRWT2s+gmRAv7l/KRI+BT+tIgKFbV+aqSAtuwvhlQTELdJ/jTJqxH/bZKIwH7mJ3ZSX5M/MMLmCfHvnjC3D9PJvOXmR6Dy/wAhCJr+', 'base64'), '2026-05-23T15:21:45.000+00:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('service-host', Buffer.from('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', 'base64'), '2026-05-23T15:21:45.000+00:00');"); + + char *_servicemanager = ILibMemory_Allocate(35773, 0, NULL, NULL); + memcpy_s(_servicemanager + 0, 35772, "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", 16000); + memcpy_s(_servicemanager + 16000, 19772, "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", 16000); + memcpy_s(_servicemanager + 32000, 3772, "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", 3772); + ILibDuktape_AddCompressedModuleEx(ctx, "service-manager", _servicemanager, "2026-05-23T15:21:45.000+00:00"); + free(_servicemanager); - // Adding PE_Parser, since it is very userful for windows.. Refer to /modules/PE_Parser.js to see a human readable version - duk_peval_string_noresult(ctx, "addCompressedModule('PE_Parser', Buffer.from('eJytV0tz2kgQvlPFf+j1RSjL8rJCEVM+EOxUqPWCC4FTOQ7SCKYsZrSjkTGbyn/fHkkIiad2KzogNNPzdffXL6n5oVoZimAr2XKloNNq92DEFfVhKGQgJFFM8GqlWnliDuUhdSHiLpWgVhQGAXHwlu7U4YXKEKWh02hBTQvcpFs3Zr9a2YoI1mQLXCiIQooILASP+RTou0MDBYyDI9aBzwh3KGyYWsVaUoxGtfI9RRALRVCYoHiAT15eDIjS1gJeK6WCu2Zzs9k0SGxpQ8hl00/kwubTaPg4th//QGv1iTn3aRiCpH9HTKKbiy2QAI1xyAJN9MkGhASylBT3lNDGbiRTjC/rEApPbYik1YrLQiXZIlIFnnamob95AWSKcLgZ2DCyb+DzwB7Z9Wrl22j2dTKfwbfBdDoYz0aPNkymMJyMH0az0WSMT19gMP4Of47GD3WgyBJqoe+B1NajiUwzSF2ky6a0oN4TiTlhQB3mMQed4suILCksxRuVHH2BgMo1C3UUQzTOrVZ8tmYqToLw2CNU8qGpyWs2YUpVJDnygmrW8QEgCxGpJM70nTqR0lRWK17EnXg/IDKkNdx6JmplVis/kri9EYlhUC/Eh3v48bO/X/VCXEkjVDO80DDzmy5uemFDBJTbW+7sgOtgyEVBcrFVNJxS4ubWXBF+xRX07x4+R55HZYP4vnBqXSt/lKvTUp2ClAhSsf4uF2OCiBuT9zCxYRVvJ3uZOYn9Ev/F9ntufW9WHVp16Fp42yliHtSy7fjUHAu33X16rLXMhhI2Jhpf1tpd/TAPMLJDgnSb8Ns9GB8H1oNhJkAp7fpSKyk2UDMiLqkjlpz9oyuBcSK3kMQ1I/LnKdfGs9Ke7ZiMHds9NHzKlzpkx47ddtCxbsvMu58dC3VV1xDIynlurOi7kbrbsj628Lrgsm5LBJ4f45aU91LfQuxGziqnsEC3VaT7WIeDxIPRthzjTtN120FO1X5bX0nCNxKSkS7jvdc1+kWZBWp97R/C9rpdK8HtWmVwUfoKrks9EvkqxpzzVy42/DKobgwe49S9AJzlS3oYawR7APETQm3MNAQ6zW8ny/mzZweuGzfA+wuZA7/jeDtZkTu8QvJmRXxY62eN3Fl5Ke0z1Djvs6cSia/NL/aiaD19GRzQX+BpuKLOqx2tn8V1Ziz86VpFnjWzE28oXB2bva2F45Z56syI42wkvu4fD0SR88d7J4/PeWmAdsfM3N6V6bHo9bZ4tmpbn/NVm3bDYp5nkThj46eO2T9ZQUMqlR7FRNGZHo77ND7rba8kVFpR53Buy5qkccrmD6KeBpVvxFZEqrJlqsE+dUu1v84uPkn3+1/xabfKsno9QJb1awJk/ZdAlw6Q1ft1AWq3D6N9bpAUpXYTNx0tgPoj/XaKbSx+R53suvFfZMmcOzBQ15mea12s6MvTqOj9ENXrUZakStZR9FvG5VQ47hv5yUIi/OWKObqHOnsEbP3cx28Xnqxiy9KP+oTHZKgAz8itucfU/X7lHo2iQo4cjhqUj4cM3rPxcsWXHFoqmbP5ULnGLeRGy7xkzjFgbN3xckljMSv2nl21/ISa/YviAvMFX4sugzxsnmJVCHbC82Jeoe+OL0KaOp+bcfobKc0ovRq/Fa2FG/m0gR9xQipde/GHUZyD1cq/OIedMw==', 'base64'));"); - duk_peval_string_noresult(ctx, "addCompressedModule('win-authenticode-opus', Buffer.from('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', 'base64'), '2022-02-08T13:23:45.000-08:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('task-scheduler', Buffer.from('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', 'base64'), '2026-05-23T15:21:45.000+00:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('toaster', Buffer.from('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', 'base64'), '2026-05-23T15:21:45.000+00:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('update-helper', Buffer.from('eJytVd9v2zYQfheg/+GaF8mdK2d5jNEHL00xY4UzREmDdhgCWjrJzGSSI6m6XuD/fUdRtiX/QPcwvYgi77777rs7avQ2DG6kWmteLixcXV5dwlRYrOBGaiU1s1yKMAiDTzxDYTCHWuSowS4QJopl9GpPhvAZtSFruEouIXYGF+3RxWAcBmtZw5KtQUgLtUFC4AYKXiHg9wyVBS4gk0tVcSYyhBW3iyZKi5GEwZcWQc4tI2NG5oq+iq4ZMOvYAj0La9X1aLRarRLWME2kLkeVtzOjT9Ob21l6+47YOo9HUaExoPHvmmtKc74GpohMxuZEsWIrkBpYqZHOrHRkV5pbLsohGFnYFdMYBjk3VvN5bXs6balRvl0DUooJuJikME0v4JdJOk2HYfA0ffj17vEBnib395PZw/Q2hbt7uLmbfZg+TO9m9PURJrMv8Nt09mEISCpRFPyutGNPFLlTEHOSK0XshS+kp2MUZrzgGSUlypqVCKX8hlpQLqBQL7lxVTRELg+Dii+5bZrAHGdEQd6OnHjfmAalJbkivN9qGEftVuTKHwZFLTIHBMYybeNa5czi78wuBmHw6kvmcDRawhC42iLGO8eYkhySwcsAXpv+SZ5pp4loxruNl2bjZQwbF9fB8gLiNztW/3D1TiOjXKJBws1XrrpcHDRRaJDjwdita92EtvS18YCtActPJN2Dd4su+vi0f0Kiin2ez95jgRXVIyZAhfnAe7ZCbcVS/7dUW7l80MTNp0kqFCVN45v38PNgb9ah4h7VAMbRo6BuxMx1eCbpJhHWuGkhwGbao24k97SRskoS/+7hZr/EyuDZwFav+xsH555cjsZ2y1QYKk9GNbD4RIOMqaX1slMr+Ami51p4etGQZCwqVppriFbzqC/YAVv3ZMxmC4hx8ENqZ/M/EBZPnW27U/2Ajs8/cW1CIqjxyVPPhM794rSRFHHUcCVJ9t2267KDbPymC7sbqCPlWpcSbVuDbu/9cfnnIFFcYezjn2mQIx02rfAHkxUfj1GvfQ7q0++WWlRc/JWuRXZipE+7uD/UR8rjwOmwt/4r3EkGfbAzAjX92GvHo1TtmT7z2p7V3Rc2yqXYz/ZOfR92Lz92rtcmlG+H3a24v2rDYOP2lzKvK0zoSpHauvvr1f8+rv0LNmT4L6QVhQk=', 'base64'), '2026-05-23T15:21:45.000+00:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('user-sessions', Buffer.from('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', 'base64'), '2026-05-23T15:21:45.000+00:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('util-agentlog', Buffer.from('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', 'base64'), '2026-05-23T15:21:45.000+00:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('util-descriptors', Buffer.from('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', 'base64'), '2026-05-23T15:21:45.000+00:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('util-dns', Buffer.from('eJzdV2uT2jYU/c4M/+HWbWN747V3SSZNlzIZso+UZsNmAkkmAyQVtgyaNZIrycuSLfntvQKzmH0AmWYmnfoDNtJ9nHuudGwFO+XSoUgnkg2GGip7lX1ocE0TOBQyFZJoJni5VC6dspByRSPIeEQl6CGFekpCvOUzHryjUqE1VPw9cIyBlU9ZbrVcmogMRmQCXGjIFMUITEHMEgr0MqSpBsYhFKM0YYSHFMZMD2dZ8hh+ufQhjyD6mqAxQfMU/8VFMyDaoAW8hlqnB0EwHo99MkPqCzkIkrmdCk4bh8fN1vEuojUeb3lClQJJ/8qYxDL7EyApgglJHyEmZAxCAhlIinNaGLBjyTTjAw+UiPWYSFouRUxpyfqZXuFpAQ3rLRogU4SDVW9Bo2XB83qr0fLKpfeN9u9nb9vwvv7mTb3Zbhy34OwNHJ41jxrtxlkT/51AvfkBXjaaRx5QZAmz0MtUGvQIkRkGaYR0tShdSR+LORyV0pDFLMSi+CAjAwoDcUElx1ogpXLElOmiQnBRuZSwEdOzRaBuV4RJdgJDXpzx0Nhg13gkxupTxJXjlktX805cEInEaqhBp1ddDrEUR3LCHfvTC8qpZOErItWQJLbrH0pKNG1i9gv6WorLiWM30mGSkpT5UYIWeSyW5qavqB6KyLFfUN2keizk+WsiyUjNLJd5I6LJNpnfEclM9539vcpjtwA8ofyr/K+d0dHX4nkWx1Q6rm9WEH2L2+1R5fT4OkteVAwOFnazFMeA90wg139HEqjVYM+de+RkX1fJ1SmuNgRqXPwjKmnsrMH8WjDc97LFPlMT9Sk8g8ovFTiAypOnHjx+uoRmrkgsnwuJzYWd9tNMDZ0cwVel9mD/iVvkSIsW7hg+cNwFieaawnhopMNxCmWupNvz1jWokNHNHdylIxY7Z/cHw26edjq/YXWZ5IDlaDMzLSz+hPHs8o6lHyLUqLhgZgOfUilC3LSIhl7S8ATLceygz3ighrYHHRtvvUXymYevdCQyjTeJ0Wy7ujosuGObVqPzNSQndOFqJrUzr4c1CAuMVmF6KwGV8u5IJtBtc8bnq9ixQqIhoDoMUIlEcuGHgsfwN6BipsDJiCoqUWVwBHHYXW6D/aeN/8j4HHZPzLNt3R/dvrLXTOLo0fFpzbKqG6xSrFvHYHU2WqJYOqy2X2W/NU+qDx8yd4P9JnyzHe38xL4EH38MDJVID749Moo9sN0Nnp9rCkVdo7vX9ixAnrbK9rlWq8CDB9Du7PdqNWvZBGtTNdsVVCD0Z9XtdvNfy8NmeO1OpbcFzEXrvI0dMVtwg8mm+QXa3tpk1nTtSuxyesk0LuBVmzFh+hgnnMWwlpNbujwXD+eP1lnTT1GMqHNzY/u4NUeodTdUBzdXOHTobaVfyFGnV/CYrryTRyQUd72R/2eydG87VZhplsDuLlJwvyB9Z0W6+m6KBF8g+Njtqh3Y6Xb1zpKZbrfT2dv9tdcLvplc1AtCdvZyWym7oTPznwNYPFme4doDjNh51Jvf9/+z2jPdSnv+lfrcrz9m2+vZgaYGW4hQ9ZZyzZz9czpRzjeQKIWHvHAITi45fpoQjct8tNSpkODBxZ59WNkHxaEYD2J9FS0GzTUSUYbg8CwkpFZY4fX3WKGOPn6Zn1eLkfDI8qiyNk7hULM2UkQkmq4Nda3F9wSKaEyyRK8LsSp9RXJhekdUJPof7kamjA==', 'base64'), '2026-05-23T15:21:45.000+00:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('util-language', Buffer.from('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', 'base64'), '2026-05-23T15:21:45.000+00:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('util-pathHelper', Buffer.from('eJy1VFFP2zAQfo+U/3DrA0lZSEu3J1A1dYVp0VA70bIKiRc3uaQeqe3ZDqFC++87N8kAMWli0vIQK77Pd9/33TmDQ9+bSrXTvNhYGA1HQ0iExRKmUiupmeVS+J7vXfAUhcEMKpGhBrtBmCiW0tJGIviG2hAaRvEQQgfotaFe/9T3drKCLduBkBYqg5SBG8h5iYD3KSoLXEAqt6rkTKQINbebfZU2R+x7120GubaMwIzgir7ypzBg1rEFejbWqpPBoK7rmO2ZxlIXg7LBmcFFMj2fLc6PiK07cSVKNAY0/qi4JpnrHTBFZFK2Joolq0FqYIVGilnpyNaaWy6KCIzMbc00+l7GjdV8XdlnPnXUSO9TADnFBPQmC0gWPfg4WSSLyPdWyfLz/GoJq8nl5WS2TM4XML+E6Xx2liyT+Yy+PsFkdg1fktlZBEguURW8V9qxJ4rcOYgZ2bVAfFY+lw0dozDlOU9JlCgqViAU8g61IC2gUG+5cV00RC7zvZJvud0PgXmpiIocDpx5eSVSh6H23OJXZjehotdxBG4ZRa7f09VZ3/cemtbwHMJmD96MQVRlCQcHjygHaZHuuWNUVd5SRRiD0jIlqXFaZ2E/NiTWht2eKpkllVsYjyGouXg3CuADBDc3AZxAMAjcGHZJm4Sxkir803ZlWg2vLdFkfJpyn4aYt6m/Sy5ezfhnN9TOub2psbFMW7OiAQiDOOi/tK2DHsdWXsga9ZQZJM9QZN0xvEc6CQ+/ObaSq7UbU1GEw6jdKlEUdCGP4H3/1LF5Lu5tc3L0yNYtWBr8SzP/xeHXN3H0H9rhFo220qJ12cX2bdrKrCqRvKXfp3Uqu0tx6qK+9wtCYKEt', 'base64'), '2026-05-23T15:21:45.000+00:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('util-service-check', Buffer.from('eJy1Vttu2zgQfRegfxj4xVI3kdLsW4Mu4HVdVEhi70bOBkFdLGh5JBOVSS1JxTaK/vsOZamRb7kA7bxIFOdyzsxwxPCN6/RlsVY8mxs4Pzs/g0gYzKEvVSEVM1wK13GdK56g0DiDUsxQgZkj9AqW0KPeOYF/UGnShvPgDDyr0Km3Ov6F66xlCQu2BiENlBrJA9eQ8hwBVwkWBriARC6KnDORICy5mVdRah+B69zXHuTUMFJmpF7QKm2rATMWLZDMjSneheFyuQxYhTSQKgvzjZ4Or6L+YBgPTgmttbgVOWoNCv8ruSKa0zWwgsAkbEoQc7YEqYBlCmnPSAt2qbjhIjsBLVOzZApdZ8a1UXxamq08NdCIb1uBMsUEdHoxRHEH/uzFUXziOnfR+NPodgx3vZub3nAcDWIY3UB/NPwQjaPRkFYfoTe8h8to+OEEkLJEUXBVKIueIHKbQZxRumLErfCp3MDRBSY85QmRElnJMoRMPqASxAUKVAuubRU1gZu5Ts4X3FRNoPcZUZA3oU2e66SlSKwW1U38q1E9kEZ/jslXz3edb5uCPDAF+uLxXWEG75uMe12yPKVPNkPrrt/SK5iZt5YPLC9RV5ZZ8HeJan2Ja88uPl0O7oMrmbD8murNBfVkNx59HFMuB5PJqEABsSxVgj/c8xS8jb9Al9OvuNb+ZqOGbMXmzbOBua36Qe0dCytEYvvDzr4V3aZfJ+10wQTVRHX9oH4LMjTxZnMH62f+pSHSFp56OuD6Gj3f3989gKPCEiS51GRywKEVhaZUYjdbRxB83/+EucafAmbH984yYSaZg7fyn0x+y6h+/d5MjTCEW1GdeTrlKRczmjOLyikVv91bYdNZYbuxmjZ9VYvex+PB9WTSL5VCYfpSGCXzGM1kUtddv7Zhf02/2oP4E0lNJl34DfYaioyjBTX+XxStu9sBh8rtrZ4pd6VJALgo8Wl/NUP7CDQNUuN1A1zhHgw6YpVOjiIz8z/ePh+/9lyZfT77QsQPe9543+gF2jBl9B0Nea/b6fo+fNtGWE7t70Rk3lv/4tChq2HCezJQklKubczEZvblk2GvM57Rt/KLJluL1xMT7gX4KozPTLxGXjX5GjlQjJfGPWK6aXXEI4SPkD3g7PgAfZyF9tHwFmWeW6zViNR0LyMYTTcVOTM0bhaPP/mE0VXD/st/P+++e3S9kLMyR+o+ulMa2x2794RWMqYKWbOeYcrK3Dzl6cfVw7PnYxt1m13jtuLxPwpX1LY=', 'base64'), '2026-05-23T15:21:45.000+00:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('wget', Buffer.from('eJy9V0tz2zYQvmtG/2Hji6iEoZykhzYedUZRnLGaxE5Du55M1clA1IpEQgEMAFpWPf7vXYAPkXrYnR7Ki0RgH98udr8FB0+7nbHM1orHiYGXxy9+gYkwmMJYqkwqZrgU3U6384FHKDTOIRdzVGAShFHGIvopd3z4A5UmaXgZHINnBY7KraP+Sbezljks2RqENJBrJAtcw4KnCHgbYWaAC4jkMks5ExHCipvEeSltBN3Ol9KCnBlGwozEM3pbNMWAGYsW6EmMyV4PBqvVKmAOaSBVPEgLOT34MBmfnoenzwmt1bgSKWoNCn/kXFGYszWwjMBEbEYQU7YCqYDFCmnPSAt2pbjhIvZBy4VZMYXdzpxro/gsN608VdAo3qYAZYoJOBqFMAmP4M0onIR+t3M9uTy7uLqE69Hnz6Pzy8lpCBefYXxx/nZyObk4p7d3MDr/Au8n5299QMoSecHbTFn0BJHbDOKc0hUittwvZAFHZxjxBY8oKBHnLEaI5Q0qQbFAhmrJtT1FTeDm3U7Kl9y4ItC7EZGTpwObvG7nhinIlCRlhGGVRa9XLvVsAVgReybNffteb9qEumw3BChdyJa9fnBdbp4U/ha5iCwqWMVoPIVLafBKcR9SGbH0HZXVJ2YS323LzOHvdzt3RWVYZwoN+RG4qmB7tUkyp30S+NaHO1emwVdacaj0Sb3wzS18O4F7i78yS+kUZiyFwMie8RAWLNVYCtRR4Q1JaYrq1P45pRQbVAEBT8m38cGoHPuFjn2CiJJg0Al7vdnaIOke2mYzqUxrm83nH9Ekcl5t+rCJtRnjjxy1CZyM1y8DK+wYtS7+3G3s7oRah/cRdTKyuxQh1yRilEzHCSPRtFYoc3Jf/ETMRAl4VdR39WbxZzCAa6SOSYk/yg6kho6+28O7XYNGY1tRAy/IwEGz/WbJJqo8+jDDiFnuWSUoNoK1i1KSDp8bYLmRS6p8eypru7XgcW7rwOoVbm1H/cZuWBgpnpmgsEMQvCft3PR3cmeFyEZETRtkKTNkaQnDIfRWXLx62Ty9htKmdONmtknlOS1ZZln3qlpsOqLN4Pcc1fo9rt3L2fvTL8E4V4pAXmlUPvTCksOm0488UtJS2nR6zcVcrvR0WsqWBD+d2gmhBHVQWCaeSqr3yebkVNgm7fVtMC/6bSxboVThuFxS77qY/j+kISpivZ2EVahK0tglqyBjSluuKRZowvTgWR3EpmWaD1WPlikGqYwdJ1LtDH+Fbb1trdpxnMoZS5+b3DaQ7SlBk4el/G/0Km7bUr/fvN5vtVJRQT8uHo+vZtXKui2mNqFuHattCM864CLLTeHCjcqG0nYZbLD82dD6i4A1tFpbJ/uCK0yZ4KuRhqVvLEeSieOTxk5JcLRsIw2KwVE57zclW0OE5Fvve0wGzdFn9glIQayvlFQt8sWafUsDbrDQcmOq7Jh5gMMrK0gTpZ4ED9kiPssoeGyZ40sd76MstxFoug7kROpzhCdDujAeHyar3ch6RddB5Xde3PNCZxOs0deuLbY89XeP3D5Io/Ww82pkHdivAX51l9BGHyzsZC5mqr11YOjuIF47mq17xh0sUhZrQr+a9TYJ33WmE9b0FZ6NXv38U1jdcgqv3oPqjWJrQjrMAPZx89XDxxl5bzXu4yaTK/Gwzw1iW2oJ00mrzJJ9xa+9JDCS8kFcTTp42+s3C7htmkVRvsxpfBLtFHe56grp7SLeE6t9rAYVXQXLi5JcfPfBTv0Zi77392sdMLabwAYbPRuCMx6kKOKaRh41UfRycenzD1rfd0bVU5wVfZLZW+UBuXt///qCC5Y20/Of81Jp7i1uB2F3+fFz/3fN4Ogk4xl6m47fuSltyTScPCZKJb6HoVqsS7hi94k23OLt+nCcpeaBwv1G34nQrzXpJvlSznO6UNCHH3G8Lodl+W30D9/snQ8=', 'base64'), '2026-05-23T15:21:45.000+00:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('win-authenticode-opus', Buffer.from('eJy1WFtz2kYUfmeG/3DiByMcKgN2LjVxUyywo8ZcgnBST6fDyNIC2witvFoZU9f/vWeRAAkkwJ1GYw9o99tz+c5ldzk+yuc05s04HY0FVMvVKuiuIA5ojHuMm4IyN5/71QzEmHG44DPThR4j+Vw+d00t4vrEhsC1CQcxJlD3TAs/opkSfCXcRwFQVcugSMBBNHVQrOVzMxbAxJyBywQEPkEJ1IchdQiQR4t4AqgLFpt4DjVdi8CUivFcSyRDzeduIwnsTpgINhHu4dswDgNTSGsBn7EQ3tnx8XQ6Vc25pSrjo2MnxPnH17rWbBvNn9BaueLGdYjvAyf3AeXo5t0MTA+Nscw7NNExp4CMmCNOcE4waeyUU0HdUQl8NhRTkyNNNvUFp3eBSPC0MA39jQOQKaT3oG6AbhzARd3QjVI+903vf+rc9OFbvdert/t604BOD7ROu6H39U4b3y6h3r6Fz3q7UQKCLKEW8uhxaT2aSCWDxEa6DEIS6ocsNMf3iEWH1EKn3FFgjgiM2APhLvoCHuET6sso+micnc85dELFPC/8TY9QydGxJM/CaQG/vyn/PKgb7UGzrXUaevsKzqH8WA6fSm0B637WjMG7VGBFIpfA2KyyKfufNEHF5WKt2esPvtw0e7eDzsVvTa0/uNSvm+kWxbBIdL/Z7g+k7HcDQ79qNxuDZuui2cCllfK2JZfX9av0dUoFPnzYT0uqA5edXqveH1zo7XrvVtqxBTS3Yonc0JwQFVPWMq5CO3oDvX3ZGXTrvXoLBbxdQoyuNjC6g073xgghSKsuvTuoqCfqW7WinuL/SaWiVvGzUj2oycwYBq4lswcLy7QVzxTjYj73FBbog8nhSiqJik4pDK6ISzi1Wib3x6ZTkAYukBafYZM4xxWqhsIEaWNaPpAuZ48zpaDJ2ZOqajurVfMVEbhFsKXZEe5LQPisc/cXscRucMsfXRHRNbk52Q1uEIvZJCZ6Zb89bbo4Kass5sRXk1PZYZTTuK/2VGPYl13Rn3lkH/gl4xNzT/TYEIwncF1GURtXEij0exfGnhp0hAHT3SHbrdctYaD9wBFLWugQlAWVybAo6eVbStEhc6oET7hh2OQMBA8IPBdLoYL1Z/+q3S1gs94y1pQzxlcJkQmIZUEmZhX6DEgY76xJDHOW3UX1q+nAK2yZcHi4wsQiFqsNRUpSG4STobJOf3p3WQOt07T+Hk+2lWXFEPS0wspU83bkZVyWKthFMBzK1FZlk7rBE9FJ9bqpFFf1K5+1ZP2RrsfMfwkJa0QsyDCF4LX04flJxEeKYhojR5C0qOQN+jd2i3N4Dx9xBzyFM3hTnRdifP4IqsUMJRoLXNm4VwqzKU8wLh95aFFcuW3XwIUPK4H4+vp1MQl+2kxkiU/qTnNv3Z3iIpq1rRJV6lqcTLBC0cQjyOCsKimrVItpwmRSZW2skY7IEtVAD9xRcVNGitcL+u8cdgcJOZthe4nvC7n2tGEKM7vlZ6+0pD3SrEhLuQSnxa35kCXJW5O0f0TTZa7Vd3wnVxbHy7T9Jz18xRIaWEJ3S1jd8i+kLLVm9wjmwmnmBX5GR5Pit/eyLME/0nNp8N7Obycge418OBEBd0F5Apv4FqeePHWezfUvS2i5nX1Mjn/Do0P1pn/5HgvVDRynBAF3Emv3TK4MDfuufhl6abWKnWGiFCPj8fSzJdbP6VMpw2tDsdfoa/SxIF7qlpqfY4d+h1nfia0EnCZP/cP4oV/e0wtF1cMzP7nhdI6OHRvvETtU5SlP9fFqK5TCR4lmHlIQDZSWB/PpWP6goNyrDnFHYgy/ZJ0QBPuON1gUfZ8UdV6IsycrI0T+Uf4zohlr7JpNCddMnyDp2KYLPuF4gaZ2IXsjlpKG6pjhRQrzYx6nw0NYjRQK8j3SVfkzDkoMFgq797xYKbj+WaSkBNQ+i8nayJLn2Pf/EmtrTKzvLeOTkgz1g+kE8rIxYXbgEJU8eowLX/E4s4jv4zuxuvJWWFtdCcIlEQOb4VtCVKzSNVgKI+kGqFFqLgXF6YjlOnF8slO0NGBz+fPCo1DJq/N0dyRJE3+MYgZz9hLpp+BMYmGKFSFKbRF/bMwTUSaNHAnfsCPvzBhpA97NKtvKMqkj/TCjSCEb9m5RHFs2z9K14sLghgHCRE5OvXz7FGPOpqAUGm0DWrqBdzftk/wZD+9YQzoKwh8/S3Dd0T43G1goZ1CA1yv1WU01o6FGQVmEIMsvav9fbi00vdg3ar/AtX02hWd5wsrnkvU2zyzTrq2PR3WI0+GXTcCiryBk8bX2Lxq3GRs=', 'base64'), '2026-05-23T15:21:45.000+00:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('win-bcd', Buffer.from('eJzVV21v2zYQ/m7A/+HmD5XcqkqXFQPmIBi8xG2NJHYXpQ2COAho6SyzkUmXovyywP99R73Y8lvbtWix8oNFkce755473dEHT6uVEzmeKx4ONRy++PUPaAuNEZxINZaKaS5FtVKtnHMfRYwBJCJABXqI0Bwznx75jgPvUcUkDYfuC7CNQC3fqtWPqpW5TGDE5iCkhiRG0sBjGPAIAWc+jjVwAb4cjSPOhI8w5XqYWsl1uNXKTa5B9jUjYUbiY3oblMWAaYMWaAy1HjcODqbTqctSpK5U4UGUycUH5+2TVsdrPSe05sQ7EWEcg8KPCVfkZn8ObExgfNYniBGbglTAQoW0p6UBO1VccxE6EMuBnjKF1UrAY614P9FrPBXQyN+yADHFBNSaHrS9GvzV9NqeU61ct6/edN9dwXXz8rLZuWq3POhewkm3c9q+anc79PYKmp0bOGt3Th1AYoms4GysDHqCyA2DGBBdHuKa+YHM4MRj9PmA++SUCBMWIoRygkqQLzBGNeKxiWJM4IJqJeIjrtMkiLc9IiNPDwx5g0T4RgZC1Gc4j+16tfKYRWHCFJGq4RgeF0fZkj/kUUALOde2lS7cj5X0yQmr7uIM/VeUGXa+5KKY3FpTLgKurDt4BrVez5vHGke/HfZ6fT/AgGtzqubArZW/Ww5YByiSkZk8+olSKPTCuquXUbixDmSi6aEIkGUdrS9LYVsB04xULF20/To8ptmbnnp2DL6rpUdhFaFdP4LFlgFUarcmo2hDfMq4bs24ts3yisGIC4wJ4SZol8yO7LobU9C1bfVUT1iFwvSMGw/5wGjbeC2Um6SwjQVuUjqVqWc7efwKBFo+UMgJQipzy+8Km7A0WIg+4JzksgMlg2WRCYsSXAl9kFykmnJ/StKUO7ek8I6E00P51iJ70G6iiEl6mkOLrVS06ewqGQvxNHrLXE31bx6Pl8edzPB6Sv/AHCYk6ynswArVz5TOZXoDjFDjVoB+MLUZipTIHRT/ZNyW2EVhupbHBnghA/RQTahg23H27LARlj+JnGXi77nC0DSoOZF8Td0tjc8+gTdnrRv3XPosuqDmSkWBCPRuvKvWRa93kvF4IoVWMvJQ01I2p8gQqr6UtNRBPZXqodezKGYlcA6IJIqMumzN2kweHn+Ra1nrCcuptO7D0Uouq1mPlJcDlkS6AZaQAi0oehbJ024mRQrcvxNU84ye8DtSYZIEfKb9IdgfHzDNgvVSRpDcHDQcH+/njG4eX5wT5OxWD9iXBqfLD/nHJ0p9vRmkPNmz9f612Pw26KKkmdI2ffvs+1aeeJhQbZiKZekpFtLao9JfU4dSJL8cm6T/M52XikTDevG/urKkmny6DcoI3UiGdllT/eizJYoPYJUo969RoOL+BVPxkEVE8Fu6CGhUHv8HTTa/hCdPVtGQJgRMUYzraarPfn9prQI4kkFCmOgqLJWmi8pWBu8sio3dy87q2O4Pp7Fn3Snyq1FMnO1y1dheypM1owmjGD/j14ZvZuT3mUYxcfI7TCN/Oqum21hNna/l5Wu4CXNAYQ7oW7gq+Mreuv0P6GtTCanAvFWS/sjoub3OnQM1U0+MpprzKRob5ca7vrshvFYtPyNnRnr33d+Qym3lexXT7tg4ZopPNnuf3n7KV+7yiOl/uGk+k/ru/T1+muEz+tN52NgvYEbRxiyv+ap1f9E9bd13WlfX3cuzvZCK0VfIHj4hU7Ty/wrgmwwvdi8XVia7dO84k7f82Q7W9zC+9KPTvbxonu90YsNQ6TWt24t/ATXtbrU=', 'base64'), '2026-05-23T15:21:45.000+00:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('win-certstore', Buffer.from('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', 'base64'), '2026-05-23T15:21:45.000+00:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('win-com', Buffer.from('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', 'base64'), '2026-05-23T15:21:45.000+00:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('win-console', Buffer.from('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', 'base64'), '2026-05-23T15:21:45.000+00:00');"); + + char *_windialog = ILibMemory_Allocate(39145, 0, NULL, NULL); + memcpy_s(_windialog + 0, 39144, "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", 16000); + memcpy_s(_windialog + 16000, 23144, "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", 16000); + memcpy_s(_windialog + 32000, 7144, "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", 7144); + ILibDuktape_AddCompressedModuleEx(ctx, "win-dialog", _windialog, "2026-05-23T15:21:45.000+00:00"); + free(_windialog); - // Windows Message Pump, refer to modules/win-message-pump.js + duk_peval_string_noresult(ctx, "addCompressedModule('win-dispatcher', Buffer.from('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', 'base64'), '2026-05-23T15:21:45.000+00:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('win-firewall', Buffer.from('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', 'base64'), '2026-05-23T15:21:45.000+00:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('win-message-pump', Buffer.from('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', 'base64'), '2026-05-23T15:21:45.000+00:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('win-registry', Buffer.from('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', 'base64'), '2026-05-23T15:21:45.000+00:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('win-systray', Buffer.from('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', 'base64'), '2026-05-23T15:21:45.000+00:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('win-tasks', Buffer.from('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', 'base64'), '2026-05-23T15:21:45.000+00:00');"); + char *_winuserconsent = ILibMemory_Allocate(53869, 0, NULL, NULL); memcpy_s(_winuserconsent + 0, 53868, "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", 16000); memcpy_s(_winuserconsent + 16000, 37868, "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", 16000); memcpy_s(_winuserconsent + 32000, 21868, "q7gASlX5iSRN8szFfXlw58TCDt+QzEAs1H65VaCHkYYhOI1hpdQG0MV8KC3SklrcHYQSE39uHiZN8YJ8H7lgTtd9tnLx8R4vXHGcKkU6WIDpff+c2Hd/ppL2mxAiB19o5Fk5EY5Tqn0Uf9HkOlVPQskwFci0QvPE59trPgkmh/xv0Fkk3N48xC7JmOw4dDM07fJAU9dv4VoGZPBsVVFozDbfRKszFllOiU2pEKhtpPhWtuPG4zjEcXwAMDpj37oZmVNEpoAC1aRyZdMGN2ztFu2FWeaN4lfMCxp8Psdl8GndSxPaJRqxFxymo/E8VVXY+h0QLrjf61IziXH8MIRlw1FoBryJsuk29TUtnvGeo+A7YO3Lam5jQtJpsFo4NlourH8py5DlKHyurktwfHkfwo0N+zNpVaQSTGXvjftFI+lYw/JHkHrQmJV4inG0+dRjj73wtQN3Rj7bVbfS1iWmfsQ+G3PQSbPnYimDHUQ7jkX75lTiczxn/OzVq5y6+Nhc/VQDVKyHMURcWaSVItdPXm3FRvTk6YtEk+02EDgijKJJllL2fdxQ8pHIqvpYh+vYGkEUjsCBo7AfZ2emta8mlvG4JTk4v5VafVFwA7WLQD3xU3Pch57lpAXync8KFmom57ZYRPzYGZey2KOCExiej3U8mRebLq1XD3gUHfKmJ6vk36Opgcar8ruRBym97RcdtpONOw6Y8r8ewyP+mYCA+gYiC7X9NldCjaazdQHHsWugahkskYLbKlGVckIzcQPFUJT5rvInaNrsiffyvmGa8WynS1vBNdJ+fp+dmW5xI6t995Rg+dnnOvouhu2lPPKopTqmy2nFdcIWiB3EWHyAw7fH4jSFkMxHbR+KF7BMd7s99Bxv6JR4ibWPqMrpckUqx4W0LgYjZxuCqW34W+xVr2sgZvo9JcZJu6SAYCWUSFWiBcjbgosJ3q6vNSFYLRl99DaWyKy/u0/+15MEnzebcc2GYnrxU+cNhFTQNyokGzTK5r/iER+X97xvELHQDD5LQnPSNDTBle2rxL4HYPdi+kcFGxm9eM4Xhiyd5rg8yb8WrKKtbSTlkbUhoK/WHPzRp/RONbO4EXsZ98+F0IbiCSf2wr4vQzLh7+c8WO6D4/vMsjT9YJdxosxXSHHNl1DnLgVDe9mMvw3R61f7iwBkkTOTWSAn88gaHrlbUeP4xba/kNVY33jbqiH+WMtAvFk4mUBuj0E3JmVlJwFBvVjGLG3MSruvaNj9cTue6qstd6X8VoaKOZb+lspH5Iv8FHruj791Wni9McH29STpA3cg+ycXCea4G5oUwTrdNE7TrJZXW2t+iDKbrLQlDwidk0P9IM05gU6s2UGMb3cQjfCrtXydEy7QzPtn6Q0f6EF00eUr/Iuxcp/mwxULe/c/CXx3lJsvdDenOWqev9P6FvRkXnSvPpgzPUcnr3DM+9OjzbczgNXAGk33v5/VFVOg9kPkNlY/R898zUYwPdwPvQub42h45ZKR8VgGqpyPcVIztqBMEL8O+1Gc4hU9kSwcygNmyGP1eihzTC6OMNHIJLfOzamt28qKr8hPlfqoze7qzzP/vt/IY0E2Vqgo6didlSG/x9+SDGXUckC1xFIVMsV2MVlQJ7V1fW6TzIYdQvl233zz9UW4nDHD9Cf/HiND2i7D8jr6EhQOeFot32K1rbtQb3bGkizZ/aqy5oM30mdp4nXm+6+Dz2vZgysHGv8JB4n0Jm7FPl7VSz3A1K97WC0VpYaazIX3ruXuseNPPo1t9L0YKkutAaJIGOpH4WSgj6jBiuA6uAI71buneUpLXsYzoYKUvu3IyERvQr7arDNQuuHJMo9DcIObtybft9rohy0TatK27PK+jPx1VZkzGSTjtMflo8GvN32pm3AfoANOVlyZ7MEzqGX18E9gth6QeZ7P4kvMpJLMWw3Rl7kHkDL5XLZOa7s+SbOHqrjFBujQuMbXQeM88Rzm2rjxJakqGzlSzlB/Key8Lr5GW9DVUBu2mrmEXMZ/b/N+psz1W1ODuCI0VeVAee/8u/1zIFEvjooQ01u+LY/0XAfbRbwWT/fkdSdl4zU0hG6fCb9ZOnwI3BcXftgaIIIf0MDwIbnBiQbPqRm95AoHeY794726laVEoeb5tdXP0N8cj10IZRC119abFlhoyayhINzkI3N3qx3nBT+U+BZnPTbWl8rP3xoZwFe2W6r4eiEqe+D0vTQx+8F7iQvhitykeSV1PZ+AoVshutryjXRzF3rCfd1gUlO/riucrvYQKpV5J67IfOKzYQagXTf1Mg3PECkxPHvtZzQeMqc/CSHlx6RBVRdKrtiezwndRYQQylF4XBNJQax8f8t7+/1eFLW8/Tb5huFE5DtEijAveZwG8ljy9Ie6NsdR8PFPCGH2ZACzEgqNfN3taLuW2ylXe0kXInrHab5wsjc4q+uUY6XNG9csnmOkXOewljfJX1YenyaOouED+gF7PgcutE7sCkKbwtQHhYE4JMEwFLrDZZBlMLwdSz/yvktm4fp1jfaJYWW6X5FxwHBQXdx7lNYX/0CfAWoT+Wtv7785t6pfYkrlVz+JEw3BSxoe+qh/NbdOrgR+XNIqtdJyiu59fXwGZgv/pkmMzm2Fv6lP3GGs4Uu+APQof7Ppj6+YHSYl7qWMvsy5bid5YfQ1jLcUQNqeTfasZ+472y6KmuzfO8dYuMLYGVmkd2rwstuqn6N1hCN7bTGOT4srnq+iuyaXMeuMphnClIWGYattFDYcFI7ThbWFWt88sJt8QbXfHTwDYEelSV8PcVe8+L2n7xeTVjt55OHtR8DdW05rdHt+v7hKAvmDcy+T58PY7HYkGWi/WLjPYdfAF3xutz404yCO4tzYVjy4/njV+WHDOKGX7y4cZKk0hZiaQJRMU0oeNVEnfPdaC0ZCQfXfGvWEGiCfuS37ZXnpUy1FxdhzjJGEyuE+lkpHH8hhyfwO2McaIaAa7x3eYKNznM/nJrgSn4vrJYPSFRoIA9xTrUqz/dZubafIeGYNFxubi4VI6tWe9PUCDEFYzpWDDyliYTTG/ynvS7vURrJEv8858x+YL+P0kG0ksbum+h2tSAgktIFETx8fIQlJaEULILrrv78QqyDJdNouV9e8x7ETUNy4cePGXWMj6plda+4ItNwy2iis9QUODT1pRzUKkoTWbVTgEX09Wild4DsXBLyvpyQdrnbNbjoMN41NajcmYdjs+FzA7de2hC1xnBS0eY8ZKkTi8y63tb1g4OtB1J5OlyvJ3cNTHV4LyTyc+9QcKA6S+ZQiMd1J4Y83AQoHHQprpYQElXlrC+5TPBNjZn0XL+tWh97vu1BjYKkjv9nZ7ftWPd+7IJdpG8YS4RiC8R0c87EYHo94ZeihBauger6GEb2jpiQugjBrwS7mWBq02x4bOam7ZKN1AOc64sdknbKDbjhzhWBBp4ZIEXF/NK3Xl1xYGASMtoYWyqCB0Crq9V7W3MfbfmOwK9TRprlbtY18ksFQL2+bIPWFPNdGIWPNMLjGAgKdrspBayhcjwc5wrl8P/OQhcrx6IJVwQDC2SJoZ0I4Y4yBGLadfRbGrpGhPFl3hKkAHBEs5iOCaI3R+dDaMH10v2o2uvPe0AsbPaeVh3QTdpqdLpSDYGIB80IHHRSTgdD2U3G7GtsFTGRoOOBWo6hBq64RUgUbL6wko3uSMM06Yj5VW1x76oHYO2rnQBGIIBuso8JbrGXUFsasC63IyYIDIQuznXe66HLklJd0Ttw+Cvqfm8BfKoAK4HynnqZmUsDbJOqEnSHra6GAthxvSe9AVEZjMNfEcKU9agINcffrkNXEEQKvLZsZblDFXM4gv6CHc5yOZ4mt04sFjzKFLvU4lArcRd+SFlsWj5lQikFEyGDGJtzkqJvLUrzkw3oDBJPJphmT+obFBG6ouN1NIhLxcK6CoZMoZkgGi00ujMmJvZam0kAy01FmlaBC2FQ0QVF6e2MiRZsFsgJxiisw/V4iZW3QLtyOtWQr5kt7jgGBHSXdpj811kA453TPs4coLampOIuHWuYWvWW+Z9otdd5tYq1RtzuP9s11CmLgbTqqZ0ke8TNpmSa+hTGcGCC7pq2PJ4Y6ne6w3YalU5RhxEL2YJMUh3oy03V0R7McSkqCgBmNxlhfjQrU1R3c7oxTDhVJkcGJXc7ueL0zm2C4h3veQJgzG08L633cZgtuzgXubL7x5+O1KvLyGO2V8X53asRpYG5RdracOIQsupbf1bk5vpJsjwLhoaWLRbPdhTpjIFvuzBshfdVGQDI9dqeFStEm3F/6qjEKmQB4qaWt8Pmu8MAgLTcJPJWEeFywWoEQM2bQ04XpFHCS4Vc26Y56uGAOZ2hHDiiGY3wGDGWDU01E3rCKY6iGlDkkcOhYIMbyymRxTB3GBTeE+k63k6NznG87NlkgFLtIC5iRQOTB4mg7M2Bis5DrdcIpVmEgzAbi0lVWLSgHZqM1t1mDc9u2Kaley87qjbnZYIFEDsUIrTfqUDzdbRYLDjglYbmdshAZTDR4KiKemjRdUekrkM0Lejeor8mNytNurqMxq8ymocr3JZaf5vPxCtVFmHSXLjES5z3I9XLVgmg2BoEgCAKswDEX9X1PGaIjf0ICIz4cwMvVFF2j8Mh2dyaZMN4c97Ih5MyxxCsMPZZCz+oxup/QoqcNnDifTIEIzgYTSoEwZC6ayH5vNKHRSOc1RJfYfcsVWRFFXAWYmEQao4qUZqONinhOohSsoWKaLQhUJ0fmiDVglzC6GjOYN9GYeaox6NSDsrbgTXmHWQeo1nElb9kOSKCnM45UvAE03TXXtAXnizUs2MR0vhQGIpkSvsTHPatNpMslyGG0PcYUFhJPHFzy/KgH7K5b7JEigkJ6PeM5sQnZJizAhNDiCLQ1yfqLQOOH7mo35VCFCggBdlcdnZUmWkzU55Y+haddbCvBpEOjpOPWN7oUxOayLrRnO5z0fFFEVXc1D+M18DZzvOOsMW4axxsJyE1W5EDBpuiQ9Aq2abWWXSwy6XqcJmN24U3xIRhDEEh2ckhl2H3q7dq6aLo9F7WRHtXK2L0162Terrw7vzkBwj8Jtw3WWqqxYDS3JNN33bjhooOE37MuUMb2OCHrtN2UPdryKMHSd82cFm0QHGyHnr+pMyOhu55FVpfvmToQUswI+Y6qt3Y9E+ABrp9KXWQzGzgU18F3BCJ1IjST2pgwBjFEW7EtpD0ZWfOZsFYGC57rz5x1MSeDHrUFiZSedVopW4w5ecbv0U6TzlI9aFFojxJ1x+0O3D7TT/283XZGmDGiSStuI+bIJzXSdizfIpkBrmwCSN1SQwKo8XpWj5EJIi1xTMv2e9Mc9lFU9zM6cOIOIJjWi5WlZf25B3OJse74ycLyzE4wC9TO3mi1YatZ5ENVAQ4Noe2dhvSmO50Moq0mmU64RIZzIhsuM2uO4THR2HTrzX53vaFbTR+WmdZoqg70aQtd+diUirYrbrshNQrK5EWTixrj1XpszXLE5fBO0y6ERj5fUcthQaNWp94pckNWGMFj+hKkbN2h6cN1uDseeCBRUoum1bMZtzHzB7thj6FtOxsibrTSun1cs9FZVy0aTMxlvq47ktiR/LU+bcBEU+JXGdPL5im/BtEoiNWA5EihCaEkPtujODvJo2K3w1JxGvrt3lLrm1CPTkO/nxrSdKVsFv48nQihSE4ZapxzRb6I10iM9VBdj4iCV8XMT9Ks74TTAFtrRg6cH9W0WClbzxdNlvPahIZwZtgTTMXGBbQYbNSM7SeQLYy2Xp2aod3xSt9wlq37e12bjsx6fbZK7ITUZ+HWzkHalLMkTMSt+oLtmntNEFGpPTU30qrn6cx0wAdJ0M7NpmUqEipSGLDqM6hp7WnNdBZGuOTwojcihyqP8hLlrffZ3Nyxa06K0DXJ4gK2M+lMFYl1h+sbcCYg3F5ASGOdtTUO7a+IqRjabYdll1jXnjizzlwqBi1MSI2+mXa23Xq771PBJhyQ5HpqMPOxxZOrnrAReuQudXO1BbdUdkkK3jAvGBzqM/Wx25f0ham7TSLR7VyRmVno2vAUMYNOcxz4nGyvBZwi/VbSn4KIX3NI2aIVE8XHwmY4WS39NrWot9Y9Z4+tk5WlS4if2D4SDTAD1wWLaZZzgJwbJTjXnFICzMkG3N92+FWETDRyZmSmu/NAzEY7tlWe1Zo3IY9lSCNbTvDVGlqJhdijlLbqU/sRYzukKVtRQ11x+BZ1SE+g1IYdijhO8VA69P1UcunOdEb0PYm3c2mTalZM92XV1l10XIfYpuzni6C56ThFe0k77Wg99z2BQ9pjyUusmU+rIMpz89VeE12hjYA4GxYmBc8w/AZHi6xuI3Jsk4wSbvouY4N4Tx91672kwDYx3ELs3EFIkiBTMQi2wF/O9nJG5/FgxeWk0hYYFcd5HyTXW4MS15vpiuc7xbYV4UqRJWxr7WWh71HDiSFgm5nZ3srpLjO1rsT5XTYBPmI9kJp+V1n4oesZe3JDGCt72uYV4PPDohdtINQ3kG6GL/aTta+tbFuT5wrUGaAy2QHxUoox9rqfJQGczeCWMV4Bnvd4z/frzNgHFjxoSwupxTVmXRFa0uImxoTQ2qQLlLYHRNpmNNwNUAEYmOVmhGtCutNRyd50+yqpN4YI7hBzwjeArLAjrJwMHkaa2YqnQyLvopFqOd7UsWhCWS79YtlvKvsJQ0iG11d9IGpAY2xpuqtP2MhCdi170LbhXTdDNQcfrylS5LWZitrwzN5KDkUXWlCuE2yQUBJmotRIIW2lrjAzLiBlsYkyk3Awxykkq42QgkkYu27udeU4mDL7lZ6ObI6IOXUr640lyFeHJsLBgIHrFZ+s23HUWOx6luradD0buj0FdjJkow0DLWUChhk2RE7GZ6OWV8xspD7cJra26vQH0jgVfa7FIRFlBfQySUStJyX1zRDWVRCFtgwNjWYmrGmhy7Y0mhm0IU4hjX3eWe05WkHKWSZyLXdMJ0q2K0bGQaaiG7oBBDX1x0WKZAvMrXcFmSl4glAQJINXyoBEbU9gccYYIsUa2qMNcuTMh1RXJTC7lXRoNdQ2TSbDRnXamHUWGNenSYYcbPXYkLfoWIDHCtW3pvsZyG/JHTo2mDqqDRZhGgXcFHIEnlMc1gQWz1SnwPQow+G65UjaSG7ExLQjhvucaDKjLbNrj30Vg+mlli0KbE/qbmPU2gtbkEoz2sxHYtolDMJlhPEsGE77GpNu0XnccLo0pbE4PR6vmC1vzybKxHQMFnQzNTlrrWDFCjHCuL6NCiNhkGE8b5popz1mpI7TWtBiyzLUzWC32vHDupajgdfsMBs3nSvqqONjs/WWxTg62CKps2OA458UpoOSfOiYYDCkgd2aU8ZYUEzTNqdDjpegHmFMBVNHutjYdnltKjBNU3NXuY9xazlNvDZfpCtW4uIdN1o6/lh1tgu3JXoLuomPV602L7d2HRXdNpz+ICRAjmup6+7UYaaS4fZkclb+/I5IiXJO9SK1DMRERcQGudqXge0nMSDKO16OU1ya5116TidAl8dOuWSBbUPZH0YdoEJkRxWk7kQ3cMlI2L3pat48x3nZbUYg2eukcmymW9h11fp45URZHdvmFL3XunOEKSByy9LNdmS60N6einy6GfMOKzVmJGS1VH5LuqHXBryJe7SiMeq+aTa19g7ueAapdTpzkO/NELk1JtvDTFRdJ/fGDBW0h6rpzzlkmq7IVRtZrYAUJ7DWliMVbs1ppyWz3Rhh1h0Fjyy9mw4prVnXCQhd4RpCspIyWZos0fJWEooPMHJAMZiob8yiqZF+f71IsE7IQG1mFYJEu+vscWOL2Rq9ZleOJWmoJK7M5nQ29ef51FsQa6ubL+y01cTdJogWAetb42GvHB+n5XeawEDNd8pYluYrcTHFsRaKE7ilDlAyHnZFbprGgm23F1SbXzXbo952LhsLvlWo06Y6p2W9taZJnmhok/7eHJc/RKDOQsMfzgwY5lDZM6FZjFHrHc9BOaPRurT2Qt2lQy8s+EFzC8+EoojaQ93BbHMkJzrNSM00HaACaq4TG90xxWhO5BA3DMe7tLtu9WfcNMy4hdkc+lnbgesrgSGIDla32zNLaYuT+Xwk9RnD16RG3FxnGbOIplCexzzVMfeZafe7Ck8pQ8mpawk/3/GuJMBDEJ9GPJ1JqxR4JBc1+8lWwjFGERpbKMn7nqouQFxidM3hIk9GKgwTEghDOuOV0OIJoVHOKgqKpSjBBtFRdanLFCKuJH9YSG7XpzCdG6uEwK66eTqNhGBF+nmh9RbrJddkumSk7kJyPZnLOOGpqIV0eLgz4nqtejEc+ZwlpZ5gzOfsELYjBumRq/qgG3W4dT+vyy2BNvedOsrAOY8JViHviEm/z0TYViZHBbkYb2SFm0ZLudUhOXcp9vb0oLC2qL/308xBbVv0uHYpbqkBEl130HSG45aHjsmIJ7abRY4PSUInLCXSVyRrp6qNAQFU2e1mJC9hfwiQ0+UP9Ni0tdnEbWnckjPZRXi4jwvLbqfoTXF+3Y/MNYuyqOZRmmIz/m5an4jYKs86KjB+Q0xH8ZCKSXmErnY4b9uCLVC05OUjlBn520AOzDa+S4bA+KyASFqw0UDFCSmQNBYJORzPZoMegmzyZLUyISIaOATLxfpQmSO7dGuUvmxmKj6V7maLfCuOFUMkFCJnk0ErnPE22Uhbfp/Lx2II5S67U1guNFKHFLbxRGBpivU75J5lWrP5rEl5YynGmjzoQmdgs1i5adFuoQ0Xx4lNZ7mbjvubHM70mZ8tegrSI8gFzMdS20ZRP+sCk9zUmGCwNLORWvA40l3XYU2YScDYo8i6E/Q3lLhwaIhxIxoXVjN2qWTxWmovuyHmC6hD1Bc25/S4IG3b0bAe4qEs9N0mXxdMjWNxLEuF7kAmEE5woWy/dNd8ay3T+sjZzd0Bs8U8DYpnU2+8HLpNVMOaGJbJTmekt3Q8JKd25vQyjO64eLMPODtEkLhFTHvjZLryRtO2FnJMPOuis4CTl218BCFBU9NZatdfm62g2S9PGMjBjLDXHJ2KfYIdDrzRDmo0s5UGcdg2TQZO7kaqNFcKvqcpHgMPWSB8VGSYXttYzK16McPtOsbPIB7xnd22Nx5NWW/KLqeaV5+GbWuiEhTcGXtTxCWkJp62CxpRGZcRGVLBsbEhyyIlKPiUEbeCtE1UKraUUM7EJr2ux7zZFRSag0SkhYwJ3GQDJrQLT5ij3HqTrHeRmeIks1xAJkjCXWmQ7ClyZ8G7bTFQt4iGRLO12JkLvMOMx9umEbPOhmWbBLrs7AjBxZ2isMOBILH7/nhOmGuTZ7tMH2rLYxKoSiapXR3J11J3HqpZOHXmDoRbyV5hMEyg58FwICpqky03O7StVWJoyNDyBlN0Gy49qafN2muU4GcgVvLZ4ZSu78jBMoxURA1IpkvpMikrmVAMJ+oGXU56QldAgkbYaUwpq9dQFvVwPlkiXZ3QwiErCcPGTnSl/TKZL1DG7YGMc+Cz2wHeLnYzdw8pU9vl2thKC0Qxl/UEk1ZskQ+6fisz/UXXsoeK1VOIXoMXOHxOjXk13IEclon72TL2mss0UEftFBriQtAkU82QdA1DFiDsxeZJ2FEn82QJuVOFa9o0J6/9DVVIGsAR2nNm2iyw1AdkcAKQiYSSGYztTvWOL5G8PtwSRCPj224v5jzYBCmonSyXcMeOMJCdtVtyNyEn9kIFmVnBZkvJaQXbdcfa5PVFqydyfVXNJuZEhYLJZswkZtpet/I9W4eMwWQjyD17hzYaNuSpbYvySSIF4g1C98HcHisNu0Mq6cBmbGhOUUHHGoJsXo5xK1eFibmcTLgdQTW9wFul7iCJO9YO44IOsM18v9z1Qg2QSdicNHJWlTcSukXWSMCnHGVLgynS13tLYsLIXZagvchchfXtmlwOR8La3SjLVTT21E6xZvHdWGOn7XQK5MSkRUi2xA7BZe2Bia0VP9CGnjVkZ067o5ozeTTIOt1luk0JfxEn3W0wItupMkJDaq4ijMDU55MQJpaxJpMqmrYIZ6bs+04L2s/F5ZiEw8GW4i2/DaJITaRdA8pi1Zc8iNl6Xd5U6hq31Tv0wvB6cDMO0PoYDISVN7vUemKzVuA3FIcIodm662vuXtUWfGcH2XNSs22FT61td0tKQxLDli6NmZRdhxosZA561g7epFlDjBUpdac7fIiinqfpDQ3SA5BPSf58sgkwznZsZKMmwDKutFbaIYUMKXaIgQycrWYPC283cjaOwEaYXUfYHSNpazKJfYnLAs/dKnva15ymyMTcqoU6zSxAgtl4GK5x2CBQV0gWcDR3GKmveVao+5FQXgBsy62+ktmrbSvoLqI6r46ayya3nMMzb+fv1HUein6oO5tgO7a1SEf6AdEBnjXaQ37drddxdMdObEaYUbyoLlUwhKSkiJnF50Y/7dgjBlckkhr5RSzEpMc6aOzN5rgi1nFW24otIM88zK3IAuST+YbVO2FDmU9W3c5+19IpJexGTKZpFmxONvogKVoLiLFbDZImIwZjRGrEicnWG7qanXEDfLKivPmwv8elMYnZimS7w9bU40J2abRsFrZyZJobAeXM5p7LyYTRoqm53mxGqbwyEc0TcXJBLoil0tmY7UhoauLOEaQdKXl+v2ko4nZBAub5qo4LA3vORtmKQH18yA7DljFx7fU2a/p1bbPq9UdyVHQjwRw0xyN5ASN5x9kNRIkupnjAGnbSSVinQ9A9f8AAPwVMpEvt8jYyS1a7rUPKJDwbi+M47eStnb6AiB6wfb2AsBg3ENYFiVDWNlOHnfZAhGlqCXJ3TUZ3wC2a/rCXdZryfE/Avj+JKH7iOJ0WiFr9WXdULFqhbAtkOxvSkOGlajKmEF1uaSLG7gISxklxkm4XDpdLccSm6jDVconVMbctbVBV18fiepF1NrC48ULQ0w5BIW1vRo5INW/31YUqCFHX0faYStm4O3fm1l4RpxiTEY7eF0MwdslKcAVSFyl0iTuYQGlrSOsb6TRZzOUpHKjxOJyvW3bA9N10GpjTFVRvZW7bSg1hL/RlP0GGmofb7TpU4GObnRD9KS446TQm4j6lxRlNpkFTsr1Baw08izdUDXI27+5YmYaoAFF348Wgbc5mVH0yUrFwOScROWRRcbCMOWw1jvJ13HZnA3i0ouer4XzFDllhzbB4qHahDquMRUZaqnB9p3TdMMEnLN+CKMyYUqQIDNaMFAehhK/ENjaPIFkQ9yMUGUL1aVx0dlpnEK7YCRJajbDFy6GTChNy5vR8SR/OXLihcbjUndk2wwEPpW9nwzFmCJ6jJJG9GRV24nJsvmJcfsb0ZyuF55Vea4uJojzYifo8QTtKlmyXY6g9HTnLviGZHEUjFEhk3MxLpYkEr0VWmxRazMjT9c5xhnjuUBTNbG0KY6bUbuDwMxrnvYkFwUzUDsLdZtfuztsNbp7zgse5a48vGF6QmB6jAttRD3VqLdhcoUvOcBqhJG1vJUZxU5DusXbR2k7pvk/NAKu4DrkomnqY6FZaIFFz0B+SGhJO2L7H+Y21ge6ZpUfiEmzSvRmMa2iAGLvAXdk8NoodZWay/NCPgavJGXke8v3JihTQmDVZrBhhIqvsKCNqBAy+NlwoSZgCsQN5h2mj3FK2phhs4ViY6g1rOR4uqBiMVMNQ+jI/04Y9Z8wAXyMzS5daMn5i1HFvn3oKuWJG5ni4nJn9QNayzcJpLfc00kUpt7Pv8Gth0AbJHkq6DTbBt9R8vUf4SSoR5EDoEuVmX5fmgjashYLRVdXejtEJI92qDpaNcGGCTylUcgmIWXusQVveKtzYg3RkE1odWo9wO5fI5p6KTXUxxMhQxRppOHHAX6g83uiyIKhCp/EKh0YU0Zu5NDRUuPUwAX5e2zbqUXdTTL18uZtpiLmbeZQksd15rC4Ywe/S3HIr2zMCRPae5GIjXERkjl5vvVGWbJrwHGTSw24y5qnZzFTniOl4LNQfqeyGtjvNQooTbzlpdRJ0MpBTnM7qihNoFEUuvPlAQFIZ36Yjt5d2VtrC7fNDM99GI6hv5ZHOpWM0WDVRfggUp54Svb2BgryT9SRHkbitu91D68KbQDpI46BNk5rONnujP1bpDIlz14Yb2C5zEXJizLf0AGYIXhC4bd8VITaKN7OEhCdyt9efqBQHUfPeRAsyKRxMbM2HYQnEZAwZkXTuuBNYlvptprfpjTJE37Hzeovr6RrZMxSPR71JLNglT9j5apbw02UcRZu+s2yiTXrZRYPhUiiAlBFYxxOpsQON3GYTwmVvygxac5nbEq6cW0zPBLh8txUZBd4qlvPNaKEiO90Nc5PtGUa5zoBKq709980FxYj9zmoQEA2mj4sykLu0mM5Ge5CEhgqd2pjY5VrNAF0PB7gRuTutyynqXqRosjnkO8bOaHMxgtqCslJYYoLVmaw/3AAkLa/L0DTtZi6si4oxp3QlNyZjAQEZErGB3RWyUD0Ks0MKbTKm3h0P8Z2pKYbaW6fT3l4nWjbgtcJOFqGeCrMlz1qNsZjvdRkYJ14WuJ2jjKhm2rIX2G7ZjBxAmM4H6Nybz2cgENbcrN5KzcBTZdt1XL3PM/TU1RBOg7RVP4A6WzvtUEyqbPYk3OtGfZdGZIX2RoFjjaeW7Jo5J5u7RnMihiRqZ+E228nNiaKOKdtc1Tlx2OSDJYe2ZHKj7vlW2g1iNcAFbj9vF4t8nnT0ydYd1uFdmi5nCZTNMImmm24xQHIUzTBGJlfujlwMAmzmugwDHI6aD0cUZI0wnZnVd/64yQ/3EG9gvbzuXs58UQ09n9BLlMfgxmBBqPyEeXQW93wad8xzjMyLXwiSQpWRLPMTkRmjolb7tQbtoOMLvpzdlaQvOMnJZAkzIK8wCARdYGbjLyNMAZg4kCdxRxikggOUc/gLCAi9QtDyFxydyAxfliHVxsHAMlSFNvi23RlTYpzwEk6j3IDhBgCyC922jKMjXGLmZ+J7zUtxnCWpu7dAQWKtczexnj58GVihlbjGWE9SR/c/fPw0idwwsxIJAF4Jm00AZXNeJEjxTFvrUsoQ+BdUFPkZKGoibRip0jPmQcw55qfkmU9Xagf4aPKFBvGnxJdY/1KpWKIEPSQOGDutfmU8AU6JlCmek0+UNG/6j8sjnB/xoiSjMoMfQeBm7wZEJFH5MraVcZO+yCgmAQm5lJVDUC2fMhKDjY514ZPwVMtxmhkRh9LWfSkmlSI4UST6KBmP5Q8rcZA4i/FqFeCGpaSISiTGDjjiBAK3qsWA36dBalWaJw9sO9Q68AdAPJ2B67VO9+MNh/jxGD2jh2G4wn5pwnwZkPKMF0G4RqLVMaj0YQw0jRkx3FWDkFteyF8U7tBRkriA3BTfFd5oKDZCcVYkcbnKolYVYiCi2j1Au9oL6cuIpG6KoZc24FUTITIDWn48PmUpiY5KBcSBjIr8qALXujZC3DbSg44cPBdTsy8EqI4DHpcAv1SeyzRTCk/VMoCnpCqL6OhEF3Jbdn7cvH3M8eIYLclr3T4fkwSjjMHz9u1zoMdMuRQCSjq3Jaen3QcknYp6t0U0iU5LK9eHqoJzMtFg7FERCGvZyUopr8hnI/5lAgaXkW44UxZLsghs4rUUvikt0aI4YPkVALmvzrPktbR5UypXmm39ckvVlMEr9do3pUBbb9rs3GPluZF2Le7eFIP/pRpdi3u3FANbRnIvofo3UBPprg24ynV8xEzeYuyh/AHv4FuIe+Yht8VjVGIPor68fT6ivwBPNiLLKk9w7b//u9b6eAsBOISOZqh2gEAuEPdCIyhA/GXthnRCRKlqyZXkicjzVKUEeYBxwsg4fat9jEoSl+dXbFNUZFDgFy5FVXQUVVXlJ+jUg1qt8V81Igo/ZDVDT6xalNTMwzcvjLafav/VqNQXeWCOqww6VJ7qiasvfKuWZknkWbWta2bOcy0F/nxpmXcopBkj3XDwTRR6mP7lMZ4xD2KAAy3NKiK8LNfD7DEtZefewAmkmJmU6v7UusGZg3BlYz3XrMy4q0EA4yoCB38IK57a1Vq8b9bI0Pbd1KnUvLjBO8P/S6Xg1ujD1aIbg49US154ula1VJlMSBEH7vpc2quWjvjZTSl8Q84ElSTgZs8uELkpRBWZnwK+8aOzf2m9KKdvyns35RxPMwQpkadS+JYTPDkGzmtKivKDQOLg4IjSoFRd16VwhgKvR8qKyF2ipKrjlQ9xSCW6hrsV5wlKB3elVyN8ePwF5A1jdHKjlmVIcHl6dsnkjT8FnoiTJkAFOflGc/kJKijkrbkqw6MvGAgxBiKvHKKgoxva6EktTqLATW9C6NOjD6VRKkEG4zcD7BPU2EpT3bYmeRBXwbdu+JfgWPSXGJR9+HhpOnWqgEEUulmU/MUNlxGI2r+kjhEl1gm5RJc0DMaf8MTSM4vTM6BHkyTaFU8fJMff6rH7yfSPxADYE9jYypzIBBD0+XsgZeBTcCHaNt34VcQDUOjn6QXxv/9bCX6HuwTC3CzQY8nKRCuN/DxzgdkrK7wCfnxyrEQBXldoem8NQw+hr1egj0JU1jjWfasK4aZxlFpMecfTm3CJvj0AiZaRMW9BUon1JqZRpJsHTO9jwsDKDtCDRI8d10iBhc6sXfaeKnSUuHsArvvvG6FzvYm7s3wqSgL9Xc1MrSRzjfc2AuSFKRPTOPL1EnYcmW+yC8BLQRRljhvaX4MFYitlepLlbw55CeXkmRltw5OA//u/LfPQKKmpSSDtJp82uv9cM2P347//2z/+/d9q4FWqzVI3gKoCxQHFtUatX0aAZVliZXkS1p5Ahdp/naBKxL9V8AJ/CjrwRRxgT+ktVlAboCwLoOda+e/jCW2WFMcPJ+BzhRI8/ZTGvps9fXj+cAY/UXLCFQM7ZQFGP2V/g/7+8blW+Q7ffUf+/vGM47fjm6FnhvO0/3jT/G+3nQXv930s202ea/ZzbXHt4gW+9s/ak116+N7H8uOi/Ah3Pt4jKQfty0NM7rJE8B+/1sLc92v/+Z+1xfnLxxd8Ore6uGs1qbRa6ZTlp9ZDXn8phxvU+k/gkCiqyupDqV2WguK//rXE/wrQ4goEWn4AdSa27PWXxTNAC/4nVRp/u5HRY4DztH2uGTvwf3srTzpoztgC+UR+uT4saag+Ozc51jPn09KPouTJ2NXqtSe99hfA8xejUvqwL1Eou4EV5dlT+fV2YMonn6K4BE4/ZUcwNM8i1DCsGAjlr0Ccc+vlQB3qnVzvp6S0IBvraamD8XjPEN3VXgHb/PQBxB0kSJc+3CE4wBo+MPZPr/SO3AGNunarDCMi3/pUumYYeOqjOz8A1ywAapmXJoB1Sl/QgY94iSQ+vNLYKXB4ClL72mS6dYHm1cqHn07tvWSZoYPApTol9/ladh7vHRjvEokP9FwPTjJHUb+8hCxuIQ9CegdWju+u9lcQlJVat6v9968nM9nuAXt16HtpK8vC4gJWlGBP50Iges2PH2/R/uP264WPX3TTRNMiNI5GG9d9/4jnSw7yjibyqfSgZVIRJegnvQR8rv0NEHKZv/z7x0+ZY4VPF5Y/GenHl409aP86lqWwvErIsfREDXBQR2IutBjp3z/+8hL5bx8/AR5bYTY5CUp8DBpLlHfgv91+XQAf5v3yUgJO83t3438UooMMbQ+D+nW+HxCWIkJAnx9zpRQV4yZyNRzXN78AoTeAoILQ1dpZBuX61tPp0Scr3PytDIRNN/nwd2BbPvzP/6RFmllBE/mf/zECs6zxAbDrQwMHGQMKkpQPAOrAYN8NPRlEOZ/yxH/IywPRzqcUePE8+xSFTx9MPdMBtuuYf6z9A7D89bpb3c2OGv8azI3+v6Cr7FHtb/iIKec3//7hNSz3Y/eC5dRrLH+fMjAp4dtYnmVRiDuW4YGs/CyHR7hy/n1EPp/aeqkbmweqUb5eUY/yVRqEzacpiIKAXYdeqf8VHJceHpRJr7iKg6d4hZsva75PSQ+suTDqlkNHwFs2PVcnr1+V", 16000); memcpy_s(_winuserconsent + 48000, 5868, "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", 5868); - ILibDuktape_AddCompressedModuleEx(ctx, "win-userconsent", _winuserconsent, "2022-04-22T11:03:23.000-07:00"); + ILibDuktape_AddCompressedModuleEx(ctx, "win-userconsent", _winuserconsent, "2026-05-23T15:21:45.000+00:00"); free(_winuserconsent); - duk_peval_string_noresult(ctx, "addCompressedModule('win-message-pump', Buffer.from('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', 'base64'), '2022-04-22T11:58:23.000-07:00');"); - duk_peval_string_noresult(ctx, "addCompressedModule('win-console', Buffer.from('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', 'base64'));"); - char *_windialog = ILibMemory_Allocate(39145, 0, NULL, NULL); - memcpy_s(_windialog + 0, 39144, "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", 16000); - memcpy_s(_windialog + 16000, 23144, "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", 16000); - memcpy_s(_windialog + 32000, 7144, "Zkuh1zXwP3+7S8oouvvP/7zbPH75/IpQj71urnrNLnq9GJQb5e5NYn/r5hvU+s87uKHpS1qfnvrdU/D473/v2n8DaPMMBHq+AfWIbDfqb5svoFnwP7vE8fcXTHp+J+99/eXObsD/+iVDWaA7uwYMOvj1ubDD4bLssUvRKoKvXpSm2b3d3PXu7q27vwGav5qVzpp9SxMtjN20LO67r8+9dt++PhjSr1mnBir3/hH700M7Akr2/o1GqQZw8nNrnR1PI/drmHhp//7Tgz09Ad+5ANR1nngeaIX8Zsc3enkw2fdx7j/3ldfhidVB4deHjl7zkm0Bl2ElfhMlXaVEaUn98vzskb4NoG/XSAQEy4of5pimf30N2b6EPDHFFVjH6M3d33+7gzsub+7+n98e9NIIBQriNOhOOXUP2yewtgO7f3wIpnr4+fPLZv/75dcnAn6zHAfL28Q+a0nCiqJzO9/K3M2Gg6+dyereO51m2FerA/xy918AEY4kvmGLhbT6x+evReAm908kv7fzz687u9H/8yR2XPImIuenD9gAi3BG5gkXO//H519fN/7756+Axm5SyA8csj+7a12TV+C/v/y6AUZj9+trDiAkUcTm5NX8n5noxEP1aVK/T/dTgycWGf5yB0F3Ev8ODAWfYNa3ydcxy4lIxVk2n3Ti3X/f2ZFrZY8yewn0+de7F3XOVX69psPLKXpDwG8CPwv8LZBr+nY/H50CTTi5+KqGaRzxy2vBuZCt3357YHDP2rlFWETu92fmDdReFlypqFdo3f3297tPQJs+4/Ll7oI9bmiFwLGB6wL8qAftcIa8AjwPxu/eQdlJgQb8QCKNgOp+qv2gHdJ9J4b5Vy/NXD9Ly8S57vOqKXz3fkMby97dbujRkJzAN1mZB9cQb87kgsK0a116g7InsE8fbZVaYCqF88wrKX3d8jPoh1sXcF3TpDkpreb/fzMCCxcok9wlrD2YcPdJ977W/X+l5k+cBzO+ekLgAowFulmgvnQTNScupurLHat9IzBZ4yTwGf4nGYsV13UuSyoB8GK4OXNDWZ0pfMb7+xPVcU4eXC44xGkSgmjjbx1Tf/r89Vse2EDkbwyv6wxUfekvf2CKTropPmUJ3uz0YXbEc3EX1q7CBIRXL0b35U6U5pwmLb6RFI3pApgbecGJ2MJ4y0icJKrj4vfWYx7iu6WVhdYmcu+R91pr/7TW8uArCH/JfQjC5Idx33dkOkVwHdJfTp2dw8s3B/dCCXzLrPor6Waud78vsjw8up39Qu7+3zv07hegHr7cIUDUUrz0PDe7/wzMsOWAAG44ACrh3UF/sJf+AHQzgL/XzTuSfKZuN/rrBvTvIfohBMcdgsg1gnUGQoLH9m9pyD/S5wDu+kQ/0OdgOrrq8+0pOYfpT8tvchp2KyJvEgeAA6tlZ24M1FO3SlBkpfsO8GV4fv34959SZXMCjJFQOfPaXD86XGd3pVMv8MfU2AaQ8i3GBCMEcfIFvW+Mo2vjzG/3XVMv2BRE4n+7e1UKf/4M7CFgjbv/dV66ueFxv3QR/qtz4X6k+R5w+pq727X6g5vVkHO1f3w6rzfdGOmJp7w0Ke5+e+G1nXmHBg9WjywInxs5LyOd/tGrb6Q01whsQV2UPmjgb8AwLVRK+3In6dqjWv4mLyiCU7/cEQInvyp8/K7omMBpxnOBzGkEe/d/7mj6m7riVAD6xN5P2vTKNU2KLyBEqUPH/eXE0cAEvzn+TVkUafIhKvRH/zdQ4We9NNz1w4R0gdicbbCc5k+e0vi1r8aSK/mn/LWH7l72dGruyyXYU+B1QfcLHX2epwdPFTxZyd/mkiktSGoBqNh9VVlpdXak3g03fxipU3x6Cx0gpPf3j74zUBXw18noRmF/MAKYvyq7LprcLPknjfMsNBeDRMZPsvGgMUbwy4I+fFUwfP7+z0G6A0us+HJu+vB3sB4OR/9irG3rJNBsnTgXiA+uMUeu8XxF/+ngn4y5VVmFlb1D7WucL1H8s3H+UBTIJZUVhQ7QqV0u7r04EH4r2PuZbqnEeUOvdjT9UBjc/byhWn8Go++FwxfKF/hwwMTRwAheTv6zVQUe15uE+itQe1RN/254PWuf25j9K3B6oVu+j9bbiJ1ymPGL0OPJK5kO3hsSqPUq/HmK6f5AVYLu1tQFadEFWD/byDMZXi97fgER3L9srqjTXHXuJS0tREzrFCb9DROEL92A3uSh91aiTp//0tUrx/WsMiqu4jwIeoyNotR/kS17Z+H095t5uI4298FzCu5ykQhgHPx6Xfzk8b/ORt0/ZKE6sBc5wXNe6gM1T3DPYvMxJ7vLQEVWngtp4svFRVIsAA4/IcjfWEJfqB1XXyDzj5cIPmy99d1Cta3IPW8JuT9vyX20rJfruJdLvk9+5Ieg3lnIfzXss1Y4mziq6Yj0WlV8Ouc4Pr2KW24Cg9a7gPicbcqsJD9v+8i/amfL9KqNlfpNw3BVk2TgQYAvS07lcMAapy8Eywlk51mo3wSK1s6fzulwTsQY6sszN56Jc7kQ9OWCnUGcvk/z8MSYH67Tvl3n5ZLTl4tK+MmYdaMsgudaj6DQ8LmH15UCN/SD4rlW8OUFlHwSedB0N13PUKecYf/LIxQRhJEDmP0C4IJM8CvHJbjwXK68lVvORSezX5dWdCvB9Ec1a/DjHsIHNOFfyO3rW3Af5ejzvrXz5wWFCd16GwEGvpCEc+Fc0jjaeMXjVwmhLlZ9kQF6EcW+fnIOZd+Vi9u1XnPuR3/ekqWbeP98N2+L31/X0R8QWfinRdb+sMie1j26DUJ/hbiC/6p2ktezMr47/Xng6xdRZ2flHlZ7P79yhH5mQ8hNc2zfNMfPMeJfqzjO+cePKY7X5lHif1aT4Gq3YCnrKnvG4JW+OC0D3bRV7xjF06LLzUrvWMXTctIPWMXn1ZvbBvgPyxg9/IvN4tkwXfixf6qA/YQ9/FMF6rZ/+88SqB+yxHNpTv0hYyxgBL+gCO27tvmVfPV/xulEbsrk9+SrW3r7Yfn6bq0/IF9/tdt5Xq68IV9PuylerARsTgcA3tj28NZWmD9BSj9mBl9i+aY9/P3fRKZOLT+vkP2hyO3PEZqfMkqnbMG/lVEa/MVC8zhn/3Sz9BMB2s8w8YIjWIrktBG8+ll3izgv3N2oTZ0UPinNBePMyT+yOgEqi7qgcQI3f4BZqgSwGa+NxuC2APwFRmP4ptD8q4zGX+2UXazK/luIwJ/Z63mR+bSL9WElHb5pYp7W/b6bqXpjx86PZQ5+ImPwhzIF388QfAOD+OE8wXXNt5eGL2C+mys4Awc/myQIvVd9PqzG518jN/GL4O/9j2/qAFKH3SVuffd40Ka28jswTNe527gdhe5q984LkzAPQFHuFkWY+Hfl/p2s6k8TrDgr+m5j+02S3UiyvKHcb9Fmm4bJ/af/nf3v5NPnV4r+9qbgK0fs2nSdegFS8d933WT+0um8rstfngXw7vcXKbnvGL/LdIl9GpWQ2hag2Hmt3H40Us9O2AMrvzwk91DYbWJ8PAnyVHT3378/HfPoYP/nozBcmsPXZ6BuQd399l3FIfG/3H2S+E9fXj96sLi/PI7qitTPOaR3MT2nES5GeONpR9/u7+1xdwr6sv7DJrNPGGCn6NPtOhdZlIuaz6XPBzpHCFD+8OjzW30/nc94gcFj6UM7g24Z5fHXc1PPW0k78X04nnP/eEznIZHHJeHTRtBuI+mjNIBa/3WTZA/z8o+LOgDuca4v5vhsyi8ShVfzD57nRRu5+S+Xx+W/nkVcPT35+sKDeg9KlmRd/g4Mftp3csVqzS93w45y7cPfyPWKXzobmXXuykPhyeP55e60kH72Y365O2/o7fjml7sH+Xue4F9uTPqFlD/g8MjEEPSn0gJ/3F/zHtDDcYfvQKmGKlJz/cujjnqY7a/nuX3Y0f100PkHzx/cPHNwwSTnGxnC2MranzpeAH/sTMEfP0fw82cHntu4dWLgYfA3Dg081ro5Hx/eYX+1n5mUubvUu5MfSN5dfRBZ7V0ImLJL0b7u6+qQNATdRGfQH/96k3tOUnV3eWzp7S6unpyF8KnuSRZvV75UhfZtD7U//nzJwOcbAsJkfzr3+PEJHSCXyHbH1LV05yYfaeN6h3/XwIPl71T3hYTeP4zyGvLrI/td0+Aa7kK/X6r7J0p1QvkE/OR5tXnhxnK3D98FeOYcYBjsXpW5bwylraQFj4EQ+MSmHZG7Owq6jO/ldv8rsc5OThHQvR38W8dJ4M8ntfweCAJA6vdBUAASvA/S7b3//VKqvtYdecDvv4HfzYsnJ/UGfndP2rclsTu783AM/xbXf+na7X7V70hz+2YbZ/bv6rfdr+Adob6S5rMoz1Rp/vV85UTotffZ53caACW//b2bqhs6oLsR4NNpkm48bC/UwxUTWmWRYrbtdn7DnWdFuXvNppc38RTXD0/HSB8Y+Mynl5v91TQKHbwDub/hj1239dJhveklXle5WC57/HgN8uxOP3y6BnjwIm+P4PrQxqWQ/9ueW/jQwY3nKbw8sPF9KvRH/7dQ4VUU9nUzRk6bu15ryktT9PbqRf9SeE932ry86+b+hTn68qLVh+tkrpSz1am/c29fPSCIr1D9cvdpY+XuGPn0unbycHTr44azO9l1Xpd4oQxBqZ3u2/tTgxfDv/a8wvx0SVLnDLDi11e3Wp3rf7l72cuVlxl2o/oZS/3YQvCQSfoDTYB5KcpOZTzN4e0rse4fBvzlAe3Ldt5q49WdV/fnuo85pS+PA/hyI3ABESUEvQpYnzs9+fGnjk9W/7eXh/yuor6rzNtvjx1fra6cVhRPV0zddNlerfFdW73nK6rUE2ZnC/VElRtXWb2iyLn7kyfz8d7O/ZyrvnlM9tYFD8nmrSOf73b9dO/Z1QBv3o12f7FUf6VN334Cf/necE4wyeaJUq8H12XEvwUfm8kn+PqnZp453Tf3bfXGhN+68+zVzJ+7/8jMP/TGvtHb66vPbvcVfKQvNS0z270DUdq5tzOW17NCR6lVdLNyOm26foYM3oT8Xr+nMV6N8MblfkDRXpPwzS6/fBent5nJf7jp7iNHpK+n6+0L896YwSuoF2N8RORDjHLjqrqrLq8f3z+2/9zji+dYUoRYFFof6v/VnXp4aJeb0H6NwyvIG3i81dpHMHm6KfGq65c3KN7o9FpyLk+L/ohKe4e18tNW+2db/sP89bhb/8He3lTKr23xJVO9QOHL8213N8zyTWq/sq8vGvyeOTlNwMOdl9fzc3ET5pUWe4XI728FfkBLPF7Y9unL1c1rr2KEDrjLmzxDdimdm2DdvW/PYN2Fcbd97es7sF653M9x4dPNV7lbXF5r93zL3bOvVDwWPFa/Whnrih931j4ncM5XYL1C4Tk5+/KSrIu2LOcxc3jZ4HPpwyV2txp+ynbtuwC5g7vy5K627AlUd2/Q7WT5217ey4ZuU/2NqieufHUv2WU7byZiPz5xrxPgxatH72yzetnjhzdNvpm9/Hje8ieTla/RkdO8eOAW7PWcn3Yr6Cq1eHnl6AUZ3rzt81WK8kezk8/LK8/pyYsll08vc24/lct8Crkvs3MPZaDaY2qs+3qrs69l6Nzo8Fz8HAB2SP8tBzTuHoLw70HX6qFz//lmsxcJwotbTIt276a3oQAOn87LeJ8+v5lpvLha9mZsdwORiwzjO4hc5iHfQORFqvIGIpcX0D2bi5MpdiPvPWL6bpcjt0GBVIMwew6Yo0ttdgVf96Hz+WuRh85loqlr7/aCdOhdT2wH/LZyA8HwPL1LXNe5K9I7B9jF7j7cL90+CBBl3TnpSdzuoi41H7Uv6z7Ky49l72/IX/fzfCvtG1i+QnEDFCNA00mTT8VdYFXunZukpR/c7d0sDs/EPdXoxmAVL1v84XzyxaCBd78Ffl3niObA4Q/tsNvt9dzrJZrnz11U0MF01Lh7mPhX9/C9cZvRSx11Q3JvcAGgl6Zy5B0MBu/mT/Sx7I6lTih162IdpgEgoJvvivRij8tP0eaSLoSVJGnxoDLB8K0o9c+9AVa6NfwbQ38SoBtz332+JOXjsy7Dd+7tMlP2g5sGvh2AI9HtGLjcFfDN7jbrdVFde2OV/0JJ30UWsBjBL+BTnDpll1A/3ZR/Rgu4dfHJroLSc5OgxMp8EJH+1z/ufgfiEl6k27v5fd5Sc0Ij3NuXiuTUxN/sbg0gBIqj08tnM3WB1YuxgfpfYysH7v+rbMTpWZrY7pMHerFrrrtf9aV3faJ/V9bx9QmP5wuLgdV+3fD9pxP5Xrb7hl93wvCK6J078OsVIGBdOwv3RZoBd8VyrKK7D/qS3tcVHlyO+244cWx1mxs+PU3Nyw0Q9tWenWdd9strrfY0ac9D735qMIBHZ+dhTIfTNWDnnWvvLC2+ia213z/vtTvx0+nTL3eve8mD0CvA3P1+S53cnKHncOZ5jm6731n7JuqX90w/4P3BS4I/pbtPv7x+ds0Xj5fydh1YUW21+S0vuvu5dcHtc2/drL/R3fUNAN16yY92cvt2gfdq/f5qms7InsjpvWHFb03oj8Vnp+l3TxeT/1nh2dO2zWcR/g6vn1XTjzB8p6ZvsXb38643ce7vJCK3AscfCAqubjQAbvfD/qrHrVWX+6he3lz/J2zNeHy9yU9tzTg38YNZuVsZuY9k425n4k7kuky+PYL+GWm376bc/mC67Y+l2v5gmu3PSLH9Cem1qzTaY8tv59Cuds58NCn2z0uI/YnJsI8mwv5QEuxK2fyR/NaP5LZ+JK/1z8tp/bPyWf+KXNa/aR7rR3JY/5r81b8yd/Xvkbf6a3NWLzTQGxzyQ6mof14a6r3001+TS3qByddvxYPj9uRC3VgSeVHl1i7EE9Rp9fbXl4dqzr73xcuG/CjdWNFl/P/WMsKvNyr8WID4fhB45ZCfw7GHOPxGvPSAxxlAftpNebnueArSzoH7qcvHmL378hytd9+ulkW+18/1AcKHgPN15RtB7Wsa3gpwQND7Mo55/Pn9NpX/4k4/f/XCpFvsvf/Jzh9Xrr+9CClf9nGj8FZAfGaMlxHgDf44vSztxtz9MMFezvzLIPetWwBPA/r+cC7D9JP4npcHQdy9T7Miv3Hm6Mzevzz8/fIgz788/H1oDrT2/wFcUVE7", 7144); - ILibDuktape_AddCompressedModuleEx(ctx, "win-dialog", _windialog, "2022-04-20T10:46:39.000-07:00"); - free(_windialog); - - // win-utils, provides helper functions for Windows. Refer to modules/win-utils.js - duk_peval_string_noresult(ctx, "addCompressedModule('win-utils', Buffer.from('eJzNVk1v4zYQvQvQfxjkInvryKlzKRwYrZN4ESFbe2s5DYLVoqClscyGJlWS8geC/PcOJSV1GnvbU1EChkVq+Oa9xxna3Q++d6WKneb50kLvrNeDSFoUcKV0oTSzXEnf+4mVdqk0XOodkzBV6Hu+94mnKA1mUMoMNdglwrBgKX01bzrwK2pDANALz6DlAk6aVyftC9/bqRJWbAdSWSgNEgI3sOACAbcpFha4hFStCsGZTBE23C6rLA1G6HsPDYKaW0bBjMILmi32w4BZxxZoLK0t+t3uZrMJWcU0VDrvijrOdD9FV6NxPDoltm7HnRRoDGj8o+SaZM53wAoik7I5URRsA+QIyzXSO6sc2Y3mlsu8A0Yt7IZpsinjxmo+L+0bn16okd79AHKK7D0ZxhDFJ3A5jKO443v30exmcjeD++F0OhzPolEMkylcTcbX0SyajGn2EYbjB7iNxtcdQHKJsuC20I49UeTOQczIrhjxTfqFqumYAlO+4CmJknnJcoRcrVFL0gIF6hU37hQNkct8T/AVt1VdmPeKKMmHrjOv23UfOjN5WlouDBRarXmGBpYoCBMWpUxrEMfinstMbQx8FszSfGVqhDXT5H8Og5dTaAUOkZaca7vAVZHvvUC5bFWyVtv3nuojdzUV/jaZ/46pja4JKHilFFzshVhmHi8p26Bec+Ppr0c3qAXUDSnov1J/XWpZw7MOrJkosf12199A3HCiMrVyBbunixpAn1IVVk4H7TBHe10FVeDti8M4btc/oNzRkmQr/CbOI+4qmDwsm/CZchtvcdd6atj2m+9OlbVf534+hMgXrcqLwUCWQrTfBxxwxQ0qmF9K1Luqoq5KrVFaiKnY8HB8VR7rhni10/F1k5vb0UPoBJhOpe07CJIknnycURONkuRnnmrlmjRJmspLkiZfc2UlyWhbCKVR0z5bpo9TKiBzHnQgiNG6LjfBIeluaLSlltDS6y8/fIXBAM4PRT6/X0JhDig9Ytb/VXwtum4GEj8Aq+nhRziHPvSOOpaH93R54n8qoUNkj8lw7hY8M/vNRVdYSq11umKS7khdt9fnenG0bQXYZAxxi0f9od5wuKFAmdPvGfnz/YEG+ca5u9EwCR+5EBXcl7OvxxIeqLPa8rpIq9vvzUXW/hfVujd9puhndw373kplpUCST/8crLNO4mbvUr74ExcNcX8=', 'base64'), '2022-08-03T14:24:19.000-07:00');"); - - - // Windows Cert Store, refer to modules/win-certstore.js - duk_peval_string_noresult(ctx, "addCompressedModule('win-certstore', Buffer.from('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', 'base64'));"); - - // win-bcd is used to configure booting in Safe-Mode. refer to modules/win-bcd.js - duk_peval_string_noresult(ctx, "addCompressedModule('win-bcd', Buffer.from('eJzVV21v2zYQ/m7A/+HmD5XcqkqXFQPmIBi8xG2NJHYXpQ2COAho6SyzkUmXovyywP99R73Y8lvbtWix8oNFkce755473dEHT6uVEzmeKx4ONRy++PUPaAuNEZxINZaKaS5FtVKtnHMfRYwBJCJABXqI0Bwznx75jgPvUcUkDYfuC7CNQC3fqtWPqpW5TGDE5iCkhiRG0sBjGPAIAWc+jjVwAb4cjSPOhI8w5XqYWsl1uNXKTa5B9jUjYUbiY3oblMWAaYMWaAy1HjcODqbTqctSpK5U4UGUycUH5+2TVsdrPSe05sQ7EWEcg8KPCVfkZn8ObExgfNYniBGbglTAQoW0p6UBO1VccxE6EMuBnjKF1UrAY614P9FrPBXQyN+yADHFBNSaHrS9GvzV9NqeU61ct6/edN9dwXXz8rLZuWq3POhewkm3c9q+anc79PYKmp0bOGt3Th1AYoms4GysDHqCyA2DGBBdHuKa+YHM4MRj9PmA++SUCBMWIoRygkqQLzBGNeKxiWJM4IJqJeIjrtMkiLc9IiNPDwx5g0T4RgZC1Gc4j+16tfKYRWHCFJGq4RgeF0fZkj/kUUALOde2lS7cj5X0yQmr7uIM/VeUGXa+5KKY3FpTLgKurDt4BrVez5vHGke/HfZ6fT/AgGtzqubArZW/Ww5YByiSkZk8+olSKPTCuquXUbixDmSi6aEIkGUdrS9LYVsB04xULF20/To8ptmbnnp2DL6rpUdhFaFdP4LFlgFUarcmo2hDfMq4bs24ts3yisGIC4wJ4SZol8yO7LobU9C1bfVUT1iFwvSMGw/5wGjbeC2Um6SwjQVuUjqVqWc7efwKBFo+UMgJQipzy+8Km7A0WIg+4JzksgMlg2WRCYsSXAl9kFykmnJ/StKUO7ek8I6E00P51iJ70G6iiEl6mkOLrVS06ewqGQvxNHrLXE31bx6Pl8edzPB6Sv/AHCYk6ynswArVz5TOZXoDjFDjVoB+MLUZipTIHRT/ZNyW2EVhupbHBnghA/RQTahg23H27LARlj+JnGXi77nC0DSoOZF8Td0tjc8+gTdnrRv3XPosuqDmSkWBCPRuvKvWRa93kvF4IoVWMvJQ01I2p8gQqr6UtNRBPZXqodezKGYlcA6IJIqMumzN2kweHn+Ra1nrCcuptO7D0Uouq1mPlJcDlkS6AZaQAi0oehbJ024mRQrcvxNU84ye8DtSYZIEfKb9IdgfHzDNgvVSRpDcHDQcH+/njG4eX5wT5OxWD9iXBqfLD/nHJ0p9vRmkPNmz9f612Pw26KKkmdI2ffvs+1aeeJhQbZiKZekpFtLao9JfU4dSJL8cm6T/M52XikTDevG/urKkmny6DcoI3UiGdllT/eizJYoPYJUo969RoOL+BVPxkEVE8Fu6CGhUHv8HTTa/hCdPVtGQJgRMUYzraarPfn9prQI4kkFCmOgqLJWmi8pWBu8sio3dy87q2O4Pp7Fn3Snyq1FMnO1y1dheypM1owmjGD/j14ZvZuT3mUYxcfI7TCN/Oqum21hNna/l5Wu4CXNAYQ7oW7gq+Mreuv0P6GtTCanAvFWS/sjoub3OnQM1U0+MpprzKRob5ca7vrshvFYtPyNnRnr33d+Qym3lexXT7tg4ZopPNnuf3n7KV+7yiOl/uGk+k/ru/T1+muEz+tN52NgvYEbRxiyv+ap1f9E9bd13WlfX3cuzvZCK0VfIHj4hU7Ty/wrgmwwvdi8XVia7dO84k7f82Q7W9zC+9KPTvbxonu90YsNQ6TWt24t/ATXtbrU=', 'base64'));"); - - // win-dispatcher a helper to run JavaScript as a particular user. Refer to modules/win-dispatcher.js - duk_peval_string_noresult(ctx, "addCompressedModule('win-dispatcher', Buffer.from('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', 'base64'), '2022-08-21T19:27:42.000-07:00');"); - - // win-firewall is a helper to Modify Windows Firewall Filters. Refer to modules/win-firewall.js - duk_peval_string_noresult(ctx, "addCompressedModule('win-firewall', Buffer.from('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', 'base64'), '2022-04-24T22:30:10.000-07:00');"); - - // win-systray is a helper to add a system tray icon with context menu. Refer to modules/win-systray.js - duk_peval_string_noresult(ctx, "addCompressedModule('win-systray', Buffer.from('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', 'base64'));"); - - // win-com is a helper to add COM support. Refer to modules/win-com.js - duk_peval_string_noresult(ctx, "addCompressedModule('win-com', Buffer.from('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', 'base64'), '2022-04-13T12:34:25.000-07:00');"); - - // win-wmi is a helper to add wmi support using win-com. Refer to modules/win-wmi.js - duk_peval_string_noresult(ctx, "addCompressedModule('win-wmi', Buffer.from('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', 'base64'), '2022-04-14T07:23:25.000+01:00');"); - - // Simple COM BASED Task Scheduler for Windows. Refer to modules/win-tasks.js - duk_peval_string_noresult(ctx, "addCompressedModule('win-tasks', Buffer.from('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', 'base64'), '2022-03-28T11:39:32.000-07:00');"); - - // monitor-border is used to show a rectangle during KVM connections. Refer to modules/monitor-border.js - duk_peval_string_noresult(ctx, "addCompressedModule('monitor-border', Buffer.from('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', 'base64'), '2026-02-14T15:39:57.000+01:00');"); - -#endif - -#ifdef _POSIX - // Helper to locate installed libraries and binaries. - duk_peval_string_noresult(ctx, "addCompressedModule('lib-finder', Buffer.from('eJztVl1v2zYUfbYA/YdboSil1pGTvDWGN7hpihkLHCBOGxS2MdASZRORSY2k7BhJ/vsuJUaxnWQY1u5tfrCsy/txeM/hpTvvfe9UFhvF5wsDx4dHH2EgDMvhVKpCKmq4FL7ne+c8YUKzFEqRMgVmwaBf0AQfbqUN35jS6A3H8SGE1iFwS0HU9b2NLGFJNyCkgVIzzMA1ZDxnwG4TVhjgAhK5LHJORcJgzc2iquJyxL733WWQM0PRmaJ7gW/ZthtQY9ECfhbGFCedznq9jmmFNJZq3slrP905H5yeDUdnB4jWRnwVOdMaFPuz5Aq3OdsALRBMQmcIMadrkAroXDFcM9KCXStuuJi3QcvMrKlivpdybRSflWanT4/QcL/bDtgpKiDoj2AwCuBTfzQYtX3venD128XXK7juX172h1eDsxFcXMLpxfDz4GpwMcS3L9AffoffB8PPbWDYJazCbgtl0SNEbjvIUmzXiLGd8pms4eiCJTzjCW5KzEs6ZzCXK6YE7gUKppZcWxY1gkt9L+dLbioR6Oc7wiLvO7Z5WSkS64N8ijQUdMki37vzvZZGGpNFWCiZIL64yKlBGEtcbdnlVkIRGMmwqzOdkhNraq2oQhoM9GA87TaWZMHzFG2OoJBUhj9cZhLF7JYlX1BOIenMuOjoBWnDmOBjGtVZqoBYm1SWBh8KkxHywpIUIUmpoRjf7CtMIrirJFtFfuhBEhs5Qi7FPIy68LBfg4vY6oOFQXEzR7VkEgL4ALY1+AjgHjANmUwEsd/3BA10fQMEq9CeRgpN+PawDaYNk2C0oFaR53ymAfe74ilLTyZ4qIBnIe31ji22OsaMj6dtyPnMxtU+BWI01jQ+miJQeCBN8XviILjidzahK37UxlZrmybWEhP9cmSr1MneHtWJJoLdcjMRwc7u15SbM7SHUXeLT43t3mcgxv4twyiuS2I64kJQI6EN4/acYWxUWSvFtFqI8Q3axnyKOagy+hoPQeg6SxAtiSzURAo8niVDqHWcTbhCFHfW9QTqFA91wdaPy+vv9PXzBPaCwkijsIMcBdSIzNKK86qobKt4y2rJnpAtpSHZRt60Ieg4VeHbmE57vWA3NnimgUkjArKLcF8FrVWcy6SaJK8rwbni6Y+LUi/ClbPUDKK5VCLEhzPPFKM39qcd9/UoyZHy22qQgPvUURA2zC6l4EaqA9syJHbODJ6sAb7UgyvqbgU3FRDBw86kW1D9iQuqNiHKoZ52NoBn8GzawZveIzB49w5eXH4cgbbBj4gzmmsWVfq1qX/CFKz69IpMn639a5nuZHoahGu8qRjegXYOIjY3Bt3gcaI63p8qT7l2BPXYj/qeeEVNVWN3toa+osxzZ3pSRiWoh7177L+m1yL5n90fYjcI4NdX10+2uf5H9PveUqZlzrDP+NfX2CvLCqG7b4+bw48eze/nbk8qcpkax78AD6qD/w==', 'base64'), '2022-09-16T19:08:46.000-07:00');"); -#endif - - // monitor-info: Refer to modules/monitor-info.js - duk_peval_string_noresult(ctx, "addCompressedModule('monitor-info', Buffer.from('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', 'base64'), '2022-04-02T20:22:49.000-07:00');"); - - // service-host. Refer to modules/service-host.js - duk_peval_string_noresult(ctx, "addCompressedModule('service-host', Buffer.from('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', 'base64'));"); - - - // power-monitor, refer to modules/power-monitor.js for details - duk_peval_string_noresult(ctx, "addCompressedModule('power-monitor', Buffer.from('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', 'base64'));"); - - // service-manager, which on linux has a dependency on user-sessions and process-manager. Refer to /modules folder for human readable versions. - duk_peval_string_noresult(ctx, "addCompressedModule('process-manager', Buffer.from('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', 'base64'), '2022-08-03T11:11:18.000-07:00');"); - - // Helper functions for KVM - duk_peval_string_noresult(ctx, "addCompressedModule('kvm-helper', Buffer.from('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', 'base64'), '2022-12-13T10:41:20.000-08:00');"); - -#if defined(_POSIX) && !defined(__APPLE__) && !defined(_FREEBSD) - duk_peval_string_noresult(ctx, "addCompressedModule('linux-dbus', Buffer.from('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', 'base64'));"); - duk_peval_string_noresult(ctx, "addCompressedModule('linux-gnome-helpers', Buffer.from('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', 'base64'));"); - duk_peval_string_noresult(ctx, "addCompressedModule('linux-cpuflags', Buffer.from('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', 'base64'));"); - duk_peval_string_noresult(ctx, "addCompressedModule('linux-acpi', Buffer.from('eJx9VVFvm0gQfkfiP8z5Bago5Ny3WHlwHJ8OXWWfQnJV1VbVGga8F7zL7S6xLSv//WYBO7h1ui8G9ttvvvlmZh2/c52ZrPeKl2sD46vxFSTCYAUzqWqpmOFSuI7rfOQZCo05NCJHBWaNMK1ZRj/9Tgj/oNKEhnF0Bb4FjPqtUTBxnb1sYMP2IKSBRiMxcA0FrxBwl2FtgAvI5KauOBMZwpabdRul54hc53PPIFeGEZgRvKa3YggDZqxaoLU2pr6O4+12G7FWaSRVGVcdTscfk9l8kc7fk1p74lFUqDUo/K/hitJc7YHVJCZjK5JYsS1IBaxUSHtGWrFbxQ0XZQhaFmbLFLpOzrVRfNWYM5+O0ijfIYCcYgJG0xSSdAS30zRJQ9f5lDz8uXx8gE/T+/vp4iGZp7C8h9lycZc8JMsFvf0B08Vn+CtZ3IWA5BJFwV2trHqSyK2DmJNdKeJZ+EJ2cnSNGS94RkmJsmElQimfUQnKBWpUG65tFTWJy12n4htu2ibQP2dEQd7F1jzXKRqRWRRUXDS77yyruR+4zqErha119H25+hczk9zBDXgt7L2FeZMO0zvve/iMwmgviOb2YU7xDaooY1XlW54QjGow6A7ZFWUKmcEW7XstZdBzdhGjHAsu8G8lKT2z71lGuqmpwakSoxAO8MyqBq9fVRRWAe6oXjrdi8z34memYtWI2EbIIy2zJzReAC/HYLxomaMTb6/x8Cq18yGjAglDLpyCCcvU5zGTQmDrpX+Ampn1NbwRO4QNGpYzw67PDIWXEE718AdODZSc1FAYz1J4wzPZuhFPwTn6h8N2kSpYVSRGTy5vNqumKKhnbkA0VfUGyMgnaibCtFEjI1MaEVH6QaSplamkX8WpoMPFC7pl2rNRhaKk6+LmBn4PqJZtYo3Qa16YPpcJvPySoUZ88gP4jVrTsxSvym/bh6hQcnMCy9oPLlNiRZN2gCHwIs4Oo2+z5/Yq6eDBz7ALptvVmU7iuoNf+LejV3DRKrtaUxSaCDf8OCe28QXbUN93jF+uvtF47Wv6MEy73xzTprfGHbUqdWr+SP8TH8a3cz8Ij9Nz4dCHtw69Ds5w/WDVGebsZThKNi1rBn3qEUTzYq+ljcybCmmO7URawwRuz66oyf8tuBKP', 'base64'));"); -#endif - char* _servicemanager = ILibMemory_Allocate(35773, 0, NULL, NULL); - memcpy_s(_servicemanager + 0, 35772, "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", 16000); - memcpy_s(_servicemanager + 16000, 19772, "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", 16000); - memcpy_s(_servicemanager + 32000, 3772, "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", 3772); - ILibDuktape_AddCompressedModuleEx(ctx, "service-manager", _servicemanager, "2023-01-20T21:07:47.000+00:00"); - free(_servicemanager); - - duk_peval_string_noresult(ctx, "addCompressedModule('user-sessions', Buffer.from('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', 'base64'), '2022-03-29T11:33:55.000-07:00');"); - - // Mesh Agent NodeID helper, refer to modules/_agentNodeId.js - duk_peval_string_noresult(ctx, "addCompressedModule('_agentNodeId', Buffer.from('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', 'base64'), '2022-06-03T01:08:06.000-07:00');"); - - // Mesh Agent Status Helper, refer to modules/_agentStatus.js - duk_peval_string_noresult(ctx, "addCompressedModule('_agentStatus', Buffer.from('eJydVk1v2zgQvQfwf+CNFOoqQZOTvdkimwbYLLpOt01P9cJQpJFNL02qJOXECPzfO6T1QcmO064O/iDfvJnhvBlqcLJONCm0WnED5JJo+F5yDYxWSzQaDzxEqgx4FiJmyRykneD6bUYjVgN5kX5K7AKRSJGCMXEhEpsrvSKXl4Q+cnn+jpL3hNEpPvF0WvACplNK3tQ+3hD69sPV7adrGpERYTVN+pixyG2eVpvocHCSlzK1XEmSJTb5M5GZAM3SRSn/iwYnz4MTgo8LS4Ac7/7xnOwAMa7NMdLfyEVEnoldcBOX0ix4biuGMWZrSy3HZNvaMjTD7HYUGpLs66205+8+3rCzKCK/k5D7Z3jbGF0KDbMRPAV2MXSRY9YX0bgFFslGqMRVQ5ZCVBtWb3Y/qqzd0wL/+nI3iYtEG2DOTWzVF6u5nLOoJq5STBObLgiDaI/MJ1LpIp5pWDJ6K9eJwJJ9BlMoiQr6DCnwNWS0ZnVPlWzHzaFoT0/7LgyrMsCDNqWw77t/R7Tj5zXroUcczvepm2+/3q4AKJTXa1vXDS0QhofrqLaBTr+XoDdXrnWYelgOsUtgjZ/YMl3B4qG5+sJj3Z2soWCYzhAByyYEl6zvTTNuFpZ+YYkB1BkjZTxDp7jxTNJVNiLUR0OH6FGUMCJucxv0iQvOta2T2b4gHF8qOKYSzgUJlkZxip1h4VpJCT5o9uxzHPnPmhLHQD0uqo1tTzcVf4wENN2RYbTtSUQtOgisEYMzc3JHm2A+hD46UJDZS+wHPLzQE6lQptcAXlG7eRUuuTK7YvxR5jnoOEca5vvU+Nbk+YbVJYv6dM72ocxb60QIlXrdLWuB9kwQHj9qbqEZWDXSyXtIzvoGyzhVxYah3bCdP53MPZ0DhLvbXoeBMHBcO05mh+uuYaXWcCXER24sSNCmKugLOjmEd1U9Iqvj+uiBjyjkkP5eVUZPFf9XEb+ohl9SwosqCI5mTwfbduJUkPAdw7YDCS8GN8+sM9x2LnRjE21ZOxSx/Y0SEAs1Z/QfN7fwRMjfYBbEj1NnYCGO4+aA50I9JCKeuY3SWHwBIQbsPV+BKi3bK2JQwI6vrzJ5EECscss2SW3gNHTnnvplZQZP3LLmNIbk/OzsrK11cAnUYw0jwbFpFyD7g74F7AfqhrSf/dWMxsG+uwrot8ndPbm+m0xuru9vPvxLm3eYvfyCI6xcQYbZ4u2AakC2/aucsDCBDEyqeWGVNrQTbZP+Xl7r41mF4a1D9524D7xjdAOzWGlsm1z9dFju/HrOD8Acql9oB/OvEq/jaqWvVFaiH3gqlLbGX8pe86Pd13CnklEgFrybfwDySlmh', 'base64'), '2022-02-07T14:27:31.000-08:00');"); - - // Task Scheduler, refer to modules/task-scheduler.js - duk_peval_string_noresult(ctx, "addCompressedModule('task-scheduler', Buffer.from('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', 'base64'));"); - - // Child-Container, refer to modules/child-container.js - duk_peval_string_noresult(ctx, "addCompressedModule('child-container', Buffer.from('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', 'base64'), '2022-08-21T15:23:09.000-07:00');"); - - // message-box, refer to modules/message-box.js - duk_peval_string_noresult(ctx, "addCompressedModule('message-box', Buffer.from('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', 'base64'), '2022-08-13T00:51:56.000+01:00');"); - - // toaster, refer to modules/toaster.js - duk_peval_string_noresult(ctx, "addCompressedModule('toaster', Buffer.from('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', 'base64'));"); - - // notifybar-desktop, refer to modules/notifybar-desktop.js - char *_notifybardesktop = ILibMemory_Allocate(28421, 0, NULL, NULL); - memcpy_s(_notifybardesktop + 0, 28420, "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", 16000); - memcpy_s(_notifybardesktop + 16000, 12420, "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", 12420); - ILibDuktape_AddCompressedModuleEx(ctx, "notifybar-desktop", _notifybardesktop, "2026-02-14T15:40:48.000+01:00"); - free(_notifybardesktop); - - // proxy-helper, refer to modules/proxy-helper.js - duk_peval_string_noresult(ctx, "addCompressedModule('proxy-helper', Buffer.from('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', 'base64'), '2022-10-12T13:17:18.000-07:00');"); - - // daemon helper, refer to modules/daemon.js - duk_peval_string_noresult(ctx, "addCompressedModule('daemon', Buffer.from('eJyVVU1v2zgQvQvQf5jNoZYKVU6zaA8OcnBTdyu0dRa2u0VPC0Ya2wRkUktScYLA/70z+rbjXWB1oTScr/fmkRq/9r1bXTwZudk6uLq8uoREOczhVptCG+GkVr7ne19lispiBqXK0IDbIkwLkdLS7ETwFxpL3nAVX0LADhfN1kV47XtPuoSdeAKlHZQWKYO0sJY5Aj6mWDiQClK9K3IpVIqwl25bVWlyxL73s8mg750gZ0HuBX2th24gHHcL9GydKybj8X6/j0XVaazNZpzXfnb8NbmdzZezN9QtR3xXOVoLBv8ppSGY908gCmomFffUYi72oA2IjUHac5qb3RvppNpEYPXa7YVB38ukdUbel+6Ip7Y1wjt0IKaEgovpEpLlBXyYLpNl5Hs/ktXnu+8r+DFdLKbzVTJbwt0Cbu/mH5NVcjenr08wnf+EL8n8YwRILFEVfCwMd08tSmYQM6JriXhUfq3rdmyBqVzLlECpTSk2CBv9gEYRFijQ7KTlKVpqLvO9XO6kq0RgXyKiIq/HTJ7vrUuVshdYl+nSfabgHE2Qhr73XI9DrlkU0sYFUaVcu+iiSh7XcSE8Q2F0SmAaS8w0IyW6hoPvHQaV8FH2dXSG/16qrZEaYbcLtE4YB69eAUfBbzdwzpezh3W6Jis/D4II2BVwA1WSE0BuG8EJRLFDR8ciOleDT0WbeLidbmWeUQkqVL//l1/zAUcomoBDvWBu8QWSYSKkGQejTCschX3o4WSujLfGOMTVYjkivzHCzQ2oMs95qp0Jng/XbWcD34rwMwGNHS67IJ6BQbZ1TpP2hXtz2wmc9jkZvMOhwdic9WCED8SCHYXxjF9mxAb5xanI84AK0exMiWFPHekIhcPK+YQ2co8t3aS1LKnFnr/OGgxFzugC1vbZBLHFfE1ZyHrdM9bGFrlwdKh3LOHRXqrfr0bD1FoFo2Xyx2q2+DaKThKHHZtsbwXXEVIZ/m4SES/4iOknuqrPzJ/jT/Tcpey12QPoN5vzzW1mwgnq8ejueJmNttGY/xHAnkwweQ4ui4FfaRTwiNl0LHe6Fmm4vapZdMJsWL8tv/T50KTindjy3wKDtxG8bUs0h6abNaZ/VgSyf0SjGl5Ik0pmdacTeP/u/Ts4hDVYVljUS+m8gDoMO52VOdIG/b5ddeCgKVAtUY1tUi8kvF/A95P8', 'base64'));"); - -#ifdef _POSIX - duk_peval_string_noresult(ctx, "addCompressedModule('linux-pathfix', Buffer.from('eJytVFFP2zAQfo+U/3CqkJLQLim8jS4PXQERDbWIliFE0eQm19YitTPbIakY/33ntAU6eJzz4Pju8913d18SHbrOQBZrxRdLA8fdo6+QCIM5DKQqpGKGS+E6rnPJUxQaMyhFhgrMEqFfsJS2racDP1FpQsNx2AXfAlpbVyvouc5alrBiaxDSQKmRInANc54jYJ1iYYALSOWqyDkTKULFzbLJso0Rus7dNoKcGUZgRvCCTvP3MGDGsgVaS2OKkyiqqipkDdNQqkWUb3A6ukwGZ8Px2Rdia2/ciBy1BoW/S66ozNkaWEFkUjYjijmrQCpgC4XkM9KSrRQ3XCw6oOXcVEyh62RcG8Vnpdnr044a1fseQJ1iAlr9MSTjFnzvj5Nxx3Vuk8nF6GYCt/3r6/5wkpyNYXQNg9HwNJkkoyGdzqE/vIMfyfC0A0hdoixYF8qyJ4rcdhAzatcYcS/9XG7o6AJTPucpFSUWJVsgLOQTKkG1QIFqxbWdoiZymevkfMVNIwL9sSJKchjZ5s1LkVoMUJfTxytmln7gOs+bOfA5+IWSKREMi5wZ4rGCOAYv56KsvWCD2oLtemKKAvE8g3g3D99rDL+2cbwgxBrTc1KP70UzLiK99Dpw79H2YMW2C9XcCrUh4oo2RRE9r7dvlsL3MmYYBXitw08DeG4k2txqx5CGRo5pdmLhBz14+TSJLM1nSaz5/yXhIrTKo8IxXUo4uOpPLuAPsOoRpt4zrFHH3R6wWJMOjH/Q7cCsA60T+gatAvw6PurV32LWa7drm57P/dl9/RDHrUhTI1vWZmMcUX56CiJjrIGOU28qsOZmKryPzCrGzRk5fet6czbDZ0oj/VT8fxsVUqkrPwisGrrB26V3WrBrJx6NBsWT79mKqY87M9nuN7YHaIN30tSxx/Bl80rbi+W2klmZIymI/m9G07ReVdtQd52/UQCQ8A==', 'base64'));"); -#endif - - // wget: Refer to modules/wget.js for a human readable version. - duk_peval_string_noresult(ctx, "addModule('wget', Buffer.from('LyoNCkNvcHlyaWdodCAyMDE5IEludGVsIENvcnBvcmF0aW9uDQoNCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQoNCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCg0KVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQoqLw0KDQoNCnZhciBwcm9taXNlID0gcmVxdWlyZSgncHJvbWlzZScpOw0KdmFyIGh0dHAgPSByZXF1aXJlKCdodHRwJyk7DQp2YXIgd3JpdGFibGUgPSByZXF1aXJlKCdzdHJlYW0nKS5Xcml0YWJsZTsNCg0KDQpmdW5jdGlvbiB3Z2V0KHJlbW90ZVVyaSwgbG9jYWxGaWxlUGF0aCwgd2dldG9wdGlvbnMpDQp7DQogICAgdmFyIHJldCA9IG5ldyBwcm9taXNlKGZ1bmN0aW9uIChyZXMsIHJlaikgeyB0aGlzLl9yZXMgPSByZXM7IHRoaXMuX3JlaiA9IHJlajsgfSk7DQogICAgdmFyIGFnZW50Q29ubmVjdGVkID0gZmFsc2U7DQogICAgcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyLmNhbGwocmV0LCB0cnVlKQ0KICAgICAgICAuY3JlYXRlRXZlbnQoJ2J5dGVzJykNCiAgICAgICAgLmNyZWF0ZUV2ZW50KCdhYm9ydCcpDQogICAgICAgIC5hZGRNZXRob2QoJ2Fib3J0JywgZnVuY3Rpb24gKCkgeyB0aGlzLl9yZXF1ZXN0LmFib3J0KCk7IH0pOw0KDQogICAgdHJ5DQogICAgew0KICAgICAgICBhZ2VudENvbm5lY3RlZCA9IHJlcXVpcmUoJ01lc2hBZ2VudCcpLmlzQ29udHJvbENoYW5uZWxDb25uZWN0ZWQ7DQogICAgfQ0KICAgIGNhdGNoIChlKQ0KICAgIHsNCiAgICB9DQoNCiAgICAvLyBXZSBvbmx5IG5lZWQgdG8gY2hlY2sgcHJveHkgc2V0dGluZ3MgaWYgdGhlIGFnZW50IGlzIG5vdCBjb25uZWN0ZWQsIGJlY2F1c2Ugd2hlbiB0aGUgYWdlbnQNCiAgICAvLyBjb25uZWN0cywgaXQgYXV0b21hdGljYWxseSBjb25maWd1cmVzIHRoZSBwcm94eSBmb3IgSmF2YVNjcmlwdC4NCiAgICBpZiAoIWFnZW50Q29ubmVjdGVkKQ0KICAgIHsNCiAgICAgICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT0gJ3dpbjMyJykNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIHJlZyA9IHJlcXVpcmUoJ3dpbi1yZWdpc3RyeScpOw0KICAgICAgICAgICAgaWYgKHJlZy5RdWVyeUtleShyZWcuSEtFWS5DdXJyZW50VXNlciwgJ1NvZnR3YXJlXFxNaWNyb3NvZnRcXFdpbmRvd3NcXEN1cnJlbnRWZXJzaW9uXFxJbnRlcm5ldCBTZXR0aW5ncycsICdQcm94eUVuYWJsZScpID09IDEpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdmFyIHByb3h5VXJpID0gcmVnLlF1ZXJ5S2V5KHJlZy5IS0VZLkN1cnJlbnRVc2VyLCAnU29mdHdhcmVcXE1pY3Jvc29mdFxcV2luZG93c1xcQ3VycmVudFZlcnNpb25cXEludGVybmV0IFNldHRpbmdzJywgJ1Byb3h5U2VydmVyJyk7DQogICAgICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSByZXF1aXJlKCdodHRwJykucGFyc2VVcmkoJ2h0dHA6Ly8nICsgcHJveHlVcmkpOw0KDQogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3Byb3h5ID0+ICcgKyBwcm94eVVyaSk7DQogICAgICAgICAgICAgICAgcmVxdWlyZSgnZ2xvYmFsLXR1bm5lbCcpLmluaXRpYWxpemUob3B0aW9ucyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQoNCiAgICB2YXIgcmVxT3B0aW9ucyA9IHJlcXVpcmUoJ2h0dHAnKS5wYXJzZVVyaShyZW1vdGVVcmkpOw0KICAgIGlmICh3Z2V0b3B0aW9ucykNCiAgICB7DQogICAgICAgIGZvciAodmFyIGlucHV0T3B0aW9uIGluIHdnZXRvcHRpb25zKSB7DQogICAgICAgICAgICByZXFPcHRpb25zW2lucHV0T3B0aW9uXSA9IHdnZXRvcHRpb25zW2lucHV0T3B0aW9uXTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICByZXQuX3RvdGFsQnl0ZXMgPSAwOw0KICAgIHJldC5fcmVxdWVzdCA9IGh0dHAuZ2V0KHJlcU9wdGlvbnMpOw0KICAgIHJldC5fbG9jYWxGaWxlUGF0aCA9IGxvY2FsRmlsZVBhdGg7DQogICAgcmV0Ll9yZXF1ZXN0LnByb21pc2UgPSByZXQ7DQogICAgcmV0Ll9yZXF1ZXN0Lm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlKSB7IHRoaXMucHJvbWlzZS5fcmVqKGUpOyB9KTsNCiAgICByZXQuX3JlcXVlc3Qub24oJ2Fib3J0JywgZnVuY3Rpb24gKCkgeyB0aGlzLnByb21pc2UuZW1pdCgnYWJvcnQnKTsgfSk7DQogICAgcmV0Ll9yZXF1ZXN0Lm9uKCdyZXNwb25zZScsIGZ1bmN0aW9uIChpbXNnKQ0KICAgIHsNCiAgICAgICAgaWYoaW1zZy5zdGF0dXNDb2RlICE9IDIwMCkNCiAgICAgICAgew0KICAgICAgICAgICAgdGhpcy5wcm9taXNlLl9yZWooJ1NlcnZlciByZXNwb25zZWQgd2l0aCBTdGF0dXMgQ29kZTogJyArIGltc2cuc3RhdHVzQ29kZSk7DQogICAgICAgIH0NCiAgICAgICAgZWxzZQ0KICAgICAgICB7DQogICAgICAgICAgICB0cnkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0aGlzLl9maWxlID0gcmVxdWlyZSgnZnMnKS5jcmVhdGVXcml0ZVN0cmVhbSh0aGlzLnByb21pc2UuX2xvY2FsRmlsZVBhdGgsIHsgZmxhZ3M6ICd3YicgfSk7DQogICAgICAgICAgICAgICAgdGhpcy5fc2hhID0gcmVxdWlyZSgnU0hBMzg0U3RyZWFtJykuY3JlYXRlKCk7DQogICAgICAgICAgICAgICAgdGhpcy5fc2hhLnByb21pc2UgPSB0aGlzLnByb21pc2U7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjYXRjaChlKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRoaXMucHJvbWlzZS5fcmVqKGUpOw0KICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMuX3NoYS5vbignaGFzaCcsIGZ1bmN0aW9uIChoKSB7IHRoaXMucHJvbWlzZS5fcmVzKGgudG9TdHJpbmcoJ2hleCcpKTsgfSk7DQogICAgICAgICAgICB0aGlzLl9hY2N1bXVsYXRvciA9IG5ldyB3cml0YWJsZSgNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHdyaXRlOiBmdW5jdGlvbihjaHVuaywgY2FsbGJhY2spDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvbWlzZS5fdG90YWxCeXRlcyArPSBjaHVuay5sZW5ndGg7DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb21pc2UuZW1pdCgnYnl0ZXMnLCB0aGlzLnByb21pc2UuX3RvdGFsQnl0ZXMpOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsNCiAgICAgICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAgICAgZmluYWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB0aGlzLl9hY2N1bXVsYXRvci5wcm9taXNlID0gdGhpcy5wcm9taXNlOw0KICAgICAgICAgICAgaW1zZy5waXBlKHRoaXMuX2ZpbGUpOw0KICAgICAgICAgICAgaW1zZy5waXBlKHRoaXMuX2FjY3VtdWxhdG9yKTsNCiAgICAgICAgICAgIGltc2cucGlwZSh0aGlzLl9zaGEpOw0KICAgICAgICB9DQogICAgfSk7DQogICAgcmV0LnByb2dyZXNzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gKHRoaXMuX3RvdGFsQnl0ZXMpOyB9Ow0KICAgIHJldHVybiAocmV0KTsNCn0NCg0KbW9kdWxlLmV4cG9ydHMgPSB3Z2V0Ow0KDQoNCv==', 'base64').toString());"); - - // default_route: Refer to modules/default_route.js - duk_peval_string_noresult(ctx, "addCompressedModule('default_route', Buffer.from('eJztVttu4zYQfTfgf5gawUpKHDl2sgs0rltkc6vQxFnESRaLpghoaWQTK5NakoqcJvn3DmV5fY3bvvWhfLBM8nDmzBlyyMZ2tXIs0yfFB0MDrb3mjxAIgwkcS5VKxQyXolqpVi54iEJjBJmIUIEZIhylLKRPOVOHO1Sa0NDy98C1gFo5VfPa1cqTzGDEnkBIA5lGssA1xDxBwHGIqQEuIJSjNOFMhAg5N8PCS2nDr1a+lBZk3zACM4Kn1IvnYcCMZQvUhsakh41Gnuc+K5j6Ug0ayQSnGxfB8Wm3d7pLbO2KW5Gg1qDwW8YVhdl/ApYSmZD1iWLCcpAK2EAhzRlpyeaKGy4GddAyNjlTWK1EXBvF+5lZ0GlKjeKdB5BSTEDtqAdBrwYfj3pBr16tfA5ufr26vYHPR9fXR92b4LQHV9dwfNU9CW6Cqy71zuCo+wV+C7ondUBSibzgOFWWPVHkVkGMSK4e4oL7WE7o6BRDHvOQghKDjA0QBvIRlaBYIEU14tpmURO5qFpJ+IibYhPo1YjIyXbDihdnIrQYypqIZK4fIoxZlphrSZG6XrXyPEnJI1OksIEOiCxJ2rPB80saK7V3nYdzFKh4eMmUHrLE8Upk8IlQ55f+sUJmsEu0HvGTkuMn1wnSYZKylPtRMo8voZdohjJynXM0QXomFWUrurGJLaAzGpr/ifMu7pjiFuYeeO35CDTFRjiyv2LR3asXZurQnK7hsTtZ4t+xBDodaLZa3mSq1GVq2RSbbR0Ba9I38mMWx6hcz6fZ6JYO6n7r4tT1pp5s28yu8LDCcC3LPW82OcdzyhUF7WTU5Kiw6Z+gwthGf+C9TbS9akfJfGl0sUfb1rU43tlr859Kr+2dHe4t4pYoFlLIfIneAeyAy2Eb3n/w6vanvbqKx+DSyn8W0LJQG9jY1mjAyeRoQHE21qMsgx/sOXl5scfFHyEFHcLPMKO1/2EzrzWUNtAqxCrO5TNVNoMqZiEezrlr/o27Okw4Hv4LivC6RnzbXleHl4bmuuXf8kNBZEpQ/tDY1L4uFKeEi2y8qTSFQ55E84WoGHhIlQypujqej2MMz+jKcp1Gn4uGHjp1+N2hzx/TjVSs8LWhSql8KVwnYoYR6jsJN/RI5NcVPNGhjyLvjtNeHH7bjL1Di1U7HQhJ6R7lQAzomK1xwIVvbyzizlPKEkUPL0D3WQqlItRl+Ve4d55tLYCtZqdTK6dq8O4dbB0UA481sK5T8mRg6z25gtd7517gmJt74Sz6zRk3pzTx/eRPE7Qct0/MR5Pj5DjwS3E/wOHidnxjzWzvNSdhL2a9r6P/c+4INJrucdgl8XdjUtVWl7fSX+a2e/afzKymp2E4dMsM+WnCDN0Ro1laQ0avHYeeIvst53BWKUYyyugioLeSVMbeW+seK3MlqU/l6mt73mRRQDaaXC0xGw3G9Jyk/Tk1ORmMmCJmG90s7+k1Tgqp/gL2YXjV', 'base64'));"); - - // util-language, to detect current system language. Refer to modules/util-language.js - duk_peval_string_noresult(ctx, "addCompressedModule('util-language', Buffer.from('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', 'base64'));"); - - // agent-instaler: Refer to modules/agent-installer.js - duk_peval_string_noresult(ctx, "addCompressedModule('agent-installer', Buffer.from('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', 'base64'), '2022-06-28T11:11:27.000-07:00');"); - - // file-search: Refer to modules/file-search.js - duk_peval_string_noresult(ctx, "addCompressedModule('file-search', Buffer.from('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', 'base64'));"); - - // identifer: Refer to modules/identifers.js - duk_peval_string_noresult(ctx, "addCompressedModule('identifiers', Buffer.from('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', 'base64'), '2022-10-27T08:44:49.000+01:00');"); - - // zip-reader, refer to modules/zip-reader.js - duk_peval_string_noresult(ctx, "addCompressedModule('zip-reader', Buffer.from('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', 'base64'), '2022-02-01T20:15:31.000-08:00');"); - - // zip-writer, refer to modules/zip-writer.js - duk_peval_string_noresult(ctx, "addCompressedModule('zip-writer', Buffer.from('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', 'base64'), '2022-02-01T20:10:17.000-08:00');"); - - // update-helper, refer to modules/update-helper.js - duk_peval_string_noresult(ctx, "addCompressedModule('update-helper', Buffer.from('eJytVd9v2zYQfheg/+GaF8mdK2d5jNEHL00xY4UzREmDdhgCWjrJzGSSI6m6XuD/fUdRtiX/QPcwvYgi77777rs7avQ2DG6kWmteLixcXV5dwlRYrOBGaiU1s1yKMAiDTzxDYTCHWuSowS4QJopl9GpPhvAZtSFruEouIXYGF+3RxWAcBmtZw5KtQUgLtUFC4AYKXiHg9wyVBS4gk0tVcSYyhBW3iyZKi5GEwZcWQc4tI2NG5oq+iq4ZMOvYAj0La9X1aLRarRLWME2kLkeVtzOjT9Ob21l6+47YOo9HUaExoPHvmmtKc74GpohMxuZEsWIrkBpYqZHOrHRkV5pbLsohGFnYFdMYBjk3VvN5bXs6balRvl0DUooJuJikME0v4JdJOk2HYfA0ffj17vEBnib395PZw/Q2hbt7uLmbfZg+TO9m9PURJrMv8Nt09mEISCpRFPyutGNPFLlTEHOSK0XshS+kp2MUZrzgGSUlypqVCKX8hlpQLqBQL7lxVTRELg+Dii+5bZrAHGdEQd6OnHjfmAalJbkivN9qGEftVuTKHwZFLTIHBMYybeNa5czi78wuBmHw6kvmcDRawhC42iLGO8eYkhySwcsAXpv+SZ5pp4loxruNl2bjZQwbF9fB8gLiNztW/3D1TiOjXKJBws1XrrpcHDRRaJDjwdita92EtvS18YCtActPJN2Dd4su+vi0f0Kiin2ez95jgRXVIyZAhfnAe7ZCbcVS/7dUW7l80MTNp0kqFCVN45v38PNgb9ah4h7VAMbRo6BuxMx1eCbpJhHWuGkhwGbao24k97SRskoS/+7hZr/EyuDZwFav+xsH555cjsZ2y1QYKk9GNbD4RIOMqaX1slMr+Ami51p4etGQZCwqVppriFbzqC/YAVv3ZMxmC4hx8ENqZ/M/EBZPnW27U/2Ajs8/cW1CIqjxyVPPhM794rSRFHHUcCVJ9t2267KDbPymC7sbqCPlWpcSbVuDbu/9cfnnIFFcYezjn2mQIx02rfAHkxUfj1GvfQ7q0++WWlRc/JWuRXZipE+7uD/UR8rjwOmwt/4r3EkGfbAzAjX92GvHo1TtmT7z2p7V3Rc2yqXYz/ZOfR92Lz92rtcmlG+H3a24v2rDYOP2lzKvK0zoSpHauvvr1f8+rv0LNmT4L6QVhQk=', 'base64'));"); - -#ifndef _NOHECI - duk_peval_string_noresult(ctx, "addCompressedModule('heci', Buffer.from('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', 'base64'));"); -#endif - -#ifdef __APPLE__ - duk_peval_string_noresult(ctx, "addCompressedModule('mac-powerutil', Buffer.from('eJztVk1v00AQvVvyfxjlYgdSp+qRiENog7BAiVQXEKIIbdaTeMHeNbvjuhHqf2fWcdMUAhISHxLCF9uzzzNv3r5ZefwgDE5NvbFqXRCcHJ8cQ6oJSzg1tjZWkDI6DMLghZKoHebQ6BwtUIEwrYXkW78ygldoHaPhJDmG2AMG/dJgOAmDjWmgEhvQhqBxyBmUg5UqEfBaYk2gNEhT1aUSWiK0ioquSp8jCYM3fQazJMFgwfCa31b7MBDk2QJfBVH9aDxu2zYRHdPE2PW43OLc+EV6OptnsyNm6794qUt0Dix+apTlNpcbEDWTkWLJFEvRgrEg1hZ5jYwn21pFSq9H4MyKWmExDHLlyKplQ/d0uqXG/e4DWCmhYTDNIM0G8GSapdkoDF6nF88WLy/g9fT8fDq/SGcZLM7hdDE/Sy/SxZzfnsJ0/gaep/OzESCrxFXwuraePVNUXkHMWa4M8V75ldnScTVKtVKSm9LrRqwR1uYKreZeoEZbKed30TG5PAxKVSnqTOC+7YiLPBh78VaNlh4DtWnRNqTKeBgGn7f74Dc6eb9YfkBJ6Rk8hqgS8miHjCa3G9YBXYlYM2iXsgv4dB7Sp/TXlbAgC1Xmk7uYY9fIAuLaGsl6JHUpiNuuhneQvQz+koKViXJhW6WjR/fXunVfgen0voijLvC+LxANE7xG+ZRdHEfjpdJjV0QjeBvx7d1w8p10iaPcNMQ369WIJvfDRsdMiAQn2okQy6LRH4fwuReJv3z4GLpgQiZjT+l1PJzAzQ+LorWHivrw7yuqdOInhQUyTjhpFY/6EcJlxIdMeTtjXb1BtnGEFcyuUJMb+DHrNv8yutR4rehSR9+v1ApFMwbFhyBLi+LjV/EcV6Ip6cCeU2FNC3HUO687sfxYYcW8toPbHV637jrI6uuSN9vHmz2r88iSsLRv9j70U3b/7/bDRf+y213RcIethiPLDmr/tHl3Tvpt9t01uH9Y97H/5/U/5eDibzj4zku/2sI3/o+jMnlTIvuB/3LJscYa2/3/l8kX1l4yWQ==', 'base64'));"); -#endif - + duk_peval_string_noresult(ctx, "addCompressedModule('win-utils', Buffer.from('eJzNVk1v4zYQvQvQfxjkInvryKlzKRwYrZN4ESFbe2s5DYLVoqClscyGJlWS8geC/PcOJSV1GnvbU1EChkVq+Oa9xxna3Q++d6WKneb50kLvrNeDSFoUcKV0oTSzXEnf+4mVdqk0XOodkzBV6Hu+94mnKA1mUMoMNdglwrBgKX01bzrwK2pDANALz6DlAk6aVyftC9/bqRJWbAdSWSgNEgI3sOACAbcpFha4hFStCsGZTBE23C6rLA1G6HsPDYKaW0bBjMILmi32w4BZxxZoLK0t+t3uZrMJWcU0VDrvijrOdD9FV6NxPDoltm7HnRRoDGj8o+SaZM53wAoik7I5URRsA+QIyzXSO6sc2Y3mlsu8A0Yt7IZpsinjxmo+L+0bn16okd79AHKK7D0ZxhDFJ3A5jKO443v30exmcjeD++F0OhzPolEMkylcTcbX0SyajGn2EYbjB7iNxtcdQHKJsuC20I49UeTOQczIrhjxTfqFqumYAlO+4CmJknnJcoRcrVFL0gIF6hU37hQNkct8T/AVt1VdmPeKKMmHrjOv23UfOjN5WlouDBRarXmGBpYoCBMWpUxrEMfinstMbQx8FszSfGVqhDXT5H8Og5dTaAUOkZaca7vAVZHvvUC5bFWyVtv3nuojdzUV/jaZ/46pja4JKHilFFzshVhmHi8p26Bec+Ppr0c3qAXUDSnov1J/XWpZw7MOrJkosf12199A3HCiMrVyBbunixpAn1IVVk4H7TBHe10FVeDti8M4btc/oNzRkmQr/CbOI+4qmDwsm/CZchtvcdd6atj2m+9OlbVf534+hMgXrcqLwUCWQrTfBxxwxQ0qmF9K1Luqoq5KrVFaiKnY8HB8VR7rhni10/F1k5vb0UPoBJhOpe07CJIknnycURONkuRnnmrlmjRJmspLkiZfc2UlyWhbCKVR0z5bpo9TKiBzHnQgiNG6LjfBIeluaLSlltDS6y8/fIXBAM4PRT6/X0JhDig9Ytb/VXwtum4GEj8Aq+nhRziHPvSOOpaH93R54n8qoUNkj8lw7hY8M/vNRVdYSq11umKS7khdt9fnenG0bQXYZAxxi0f9od5wuKFAmdPvGfnz/YEG+ca5u9EwCR+5EBXcl7OvxxIeqLPa8rpIq9vvzUXW/hfVujd9puhndw373kplpUCST/8crLNO4mbvUr74ExcNcX8=', 'base64'), '2026-05-23T15:21:45.000+00:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('win-wmi', Buffer.from('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', 'base64'), '2026-05-23T15:21:45.000+00:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('zip-reader', Buffer.from('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', 'base64'), '2026-05-23T15:21:45.000+00:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('zip-writer', Buffer.from('eJzNGl1T27j2nRn+g9qHjb0NJgk0pWTZO5DQu8xS0iH0dros03EcJVFxbK/tFFjKf7/nSJYtW3KScvfhmmGSSOdLR0fnS979eXurH0YPMZvNU9JpdVrkLEipT/phHIWxm7Iw2N7a3jpnHg0SOiHLYEJjks4pOY5cDz6ymSb5D40TgCYdp0UsBHiZTb20e9tbD+GSLNwHEoQpWSYUKLCETJlPCb33aJQSFhAvXEQ+cwOPkjuWzjmXjIazvfU5oxCOUxeAXQCP4NdUBSNuitISeOZpGh3u7t7d3Tkul9QJ49muL+CS3fOz/unF6HQHpEWMj4FPk4TE9K8li2GZ4wfiRiCM545BRN+9I2FM3FlMYS4NUdi7mKUsmDVJEk7TOzem21sTlqQxGy/Tkp6kaLBeFQA05Qbk5fGInI1ekpPj0dmoub316ezqt+HHK/Lp+PLy+OLq7HREhpekP7wYnF2dDS/g1ztyfPGZ/H52MWgSCloCLvQ+ilF6EJGhBukE1DWitMR+Ggpxkoh6bMo8WFQwW7ozSmbhNxoHsBYS0XjBEtzFBISbbG/5bMFSbgSJviJg8vMuKu+bG5PTYX9wSY5Iu4V/ndfdnhgXo3t73b23nf2DbPD8HQ523+x19t+87mSDA4G/t999+/pNt9WTlCfLyKf3MJVtjtUAJVJ30bCdAZ/ikNNl4KGcYBUBLCe9Ct+PBsPRFVtQa+KmNIUvqPxgZm9vPQoT2d0lDTT5nVZ3p/3mqtM6fH1w2Hn7R6MnjYjzB+zIjVOQoEzISUDXqdW4atjXrRv5a6eB5o7IE0SxADWhcKYsSQdgbbJD2m8PWjb55RfytgD/boRv33C41/Y6wM6NbZdER1nXit7ORT/MRefIi6gkvyTG5Qd52m0JjZDfjaBV0eshO7kUf3B12mSXdIrVxDRdxgGxHvlCDkEHTb66Q07yCQGfSmYwo+mJm9B3oQ9Wa31z/WLb+eJAEbC665tiaAC/ozj04CQ5ke+mcGAW5OiINO5YsNdpkH+Rxp9/Nsghaew2FDWNgQtgNhpl1Sm/mPI9vM2XhAfSYoDa6hFGfoFp3/FpMEvnPfLqFbMFVCYzPmwKiqsX0C4gFSSudVisEy2TOerhmuWa3oUj9DVkgYULs7PRgS03C5+n4iv1E/qjLIzEnqQGcEHFqnEpbfOqkToeMRWQPOZG0QC7VSWV4FEYWSp/Cc+F5Qsf2OQVGUiYXLC7OQYmK42XVBcovIU9wymF8mZ7adAbro7hglp2eaICx5fFDyRfHCp4zqZpaXmV/dL3rIYu1zDQfqERt3VgA36ulKkL7HpmgDG47FvD3FOt/E9lGwhv67XIz+Ar8CviMOJphOOKazok1gC2GL4+y6yrUlctWFpUiW8DnYQYQuPSfdOUBSyZ04kVRjy0Fq4JglcS+tRhwTRsW41PIscgfRqkseuTAYQ/Lw3jB3JJvTCeJI7jlHx2FCbKr/5A+RG4CwommbsfTMCcLxENJsBBROnrm546B4Mj9jflVi2xIGSiUCK10MX6jbrgbpPcwVkgECZL2UKdL37ouf47OF1XmFjphyuTEnjWoFwDxRsHtmXyEeLHXuf81Op01a3tox8/WU6nNHZcH5Ct/S7sQ0ZYhSyvEs2nCqkc+lXSYCJq9SEf2+82yV4L/80cN6PSBirtffwHKu3OMwh04L+FBMqL6A8czFpprjlYexM8T4+UH9jkEZsFLtg2NWO3u6h3YLGvISN2Vgqswe0acd/D4VgsFytwW/etA/IdipX9gyY5yIkA7r9pQNEgPyyheIHjd8JS8s53ZyuIHaCqjIL0oRrBtBpP7HuazsNJnS45oWy7m6RzoJIDQrhN5AKmyTkPCSvJtMF6zIrBuiwOYHXHaVZEJCu2dg9sYO/AtLWn9wY6KyjluRqo1IYd7wiiQOmSQhbCvlEynE4TmqpUKo4MRoTHKlJMMxQ8qC7UFiRaYP8gToJFG5xN20nDEU9fLXstFbl7UGnh8c6JlT1Haz2hj4G3Ean99aTOXUg634cTKL+A1hVb6LSEDXR+lNaAJ8VGWpvIhc4k26BsL82L3O/YZY9SDSLOMhCpQ19NqgrIi+ViTOPhVMQbDTtLmSpB6EOYMB43JYa3jGMIPXI8g1ewuAFbGnmeDzYzIhwGRvXwHND7VA/NmIO8kKOQfGZfpVDZz16RG8AB4U2OI/I3i3ZEzVpKL6Uzxy5IInPbX0mL/PQTeZEXu9MEUnN6z5I0GT0EXgUrovQWToMikJzgua/UPk+gTOx45gnIMiVxwBJ8rrmmJAhURJqTU8N0YpqkbqoW5VxOHKyXspJ7ZNvI3eNRVXyO0TOBDzSuIewx56rRbVYg0fxTN0gTZ/jlcjC8OP9s5MGd9ZEuppMsx6KAzhf4ZZxXmZlOzVID9nmmcqE7JwFfUgd6Cafu5AE8c5Z8aUD9y74+lfspM6oo/11eRRi6JEKqBULJJXCbF8jLMU+p0FZKA1qy1XrbtUuWgoHxpAI7jcOFpam8rLk5zyWr9PPUKhstdK7jVgLZ+TtjtlN+9NzHTFHPRAxRW1JcnZesYFBKcFaIXJ+rrCBesQoHv2nZkMxflHjj8YYgj18/zAO7N02e1G7EA+PaBjtbc9QgF1MYAZdSLMfzt1Z+zdKAprbRUn4EJn6W4+GEgs2Tc5URVgnrtlYlLCjWFQDGwHiT+zDBsnxI1CAp5m2jOwlj1eEWCtzJ27AefEIszeGtR/Lp5OxqdEh22q9Fc85E1tEd1qr4rqFDYgpQGVYtEItoFs8eCaQCh6JLUUhVDhCY7lTMaYCYwtkdVnzfk0wmlophoe8eseBWTyy8OfVucc8Si0e5ckuSz4JdKnW43kuEZXxVO4gWbzBiiS0p4oRSUCf1MZpjXLMbNT9kUytxWIJClto/lb5IJqvo+JnoVBosPJIg4bxVsIq6aHTpGzNhca3gmT6I9RWVgf2eTfpp11/xjEh6EFlWNVhLHWBbdJWAwOoOnFiLsvMomi73D4hd0r0QYUUXsOhY4YfsV2U0dBMVTmFl8isyNPL9O1mZUabzOLwjVuMiFNd82b0TnWTN2jxJ7qMsyMENHkAVmEkl5I7GCkrZ9wn+JaWWpsp3ILBkgA3oXXaRZNWaHV87+AepC9DSMrhtkqkPmt7AnEy+C9tKnEy5tlEf3n4VpQrwGf6+edNVxZLOk1sF51g1ih/gt4InPlwhWutZl4zDofKXvl8D/GQe1vvWG4hVZso/N+dqGDILsXovRLEJaYu7wU5sJnC1Q96sOA8WuL5qtRua6/9odnx1uLF1i6s3kn9G1aBpHiwrNzE1TKpa43EeM8BNz3Vxysz85JWRZgblut6qPbM6pryEsU1KfP72FZgmS1mDXCjk/9kJ0AVeb05ilwWNOgnX+wA1imrZIv0GXh4Tk1P8cgoMU8zysXsCEadJlLtDfLIcmQNbDUgyZpgsNmohPHwLxi/NQ/4jSrt8tpmfegsZj11vxR1ZFp44ptmMIfeTZF4c8aMti/0QkBSuObNejY5SPQ4WzQg+PRx/hTzwDHs5DWyP8dgbOyJEj0RhocCLfBtKQ2zLtJWJogsnG3AKE+UwqVm1mJMnUL205DPSsWgTBkvG8chdJtQqko6aEg0QH596FZCieYSvWshhHP3gilwKmUHiWX6doZzuQEJaxVQbOCZmL/Cq0nzX/sLU2QKdJJ9YOt88PVY7kipnvGbbmEhPT1/NtRZulwyARgCLxlBxj7HMxKFmVtDpKuBFFvWnQNFIyMHJSsEEI/Jk1Z+/DKqoTEGnmvvUgJYBL2CrcGn8sDZuVTqffphQXj1lPGR1u+YNAs9Nvbmlhckn9RYgl9xcEOQnvwQrfLT0c0YIg4KyTrSx0IStyDe4+kpFRT9QdgyGF6f/8A6ZII39qtIW9C/74qqWrHqq3SvAeh673CPv6GupNGRALOw+Fv3F7AbseYzr+nKr16nze6ZdGwy0+n5QDiaq4NLCxCUkXst3unaT3xFtYpvFD00XRY8ffGJuuL2yK+Jv4MIRWoG9q0+eV2tNSeY9xAZn6odhbImhn0m71VIXopzNPEtp6hyagmTZ6vMbAfEl01lL8bsap/J9hhd7ex1LYDc1AGGKHyPsIZftXzNksYGSUFEb1XsEQxuwYlBqG1BMKW3AbKCmDZgbRH4pquYVtWGGN8HSnvKyUXFtWYp4cnDjKAeusuby9dcVXvNZd6vrToj8uvI9LMN7UZScBhN8/Vt7C0mLJniQqDfR7pI6nSokQlV8GH+xefO3ZHQqyj2Icv0tL3aAihjlSxnIF7vw9XB+ezxhye1zqItrHKB+FaagnMDAY+3SSy9Iqbc2fOl/04rILBCmtzldGYvwnadMXPH6AUlSfG2Z07+sNUIkXXO6DTaUI5vC+pOtW+VTfvLQ2yu1XX4xnp9L3lSFz7yhur21CCdLsFh6H4VxigXKo2ww8g9O/b+5oGkm', 'base64'), '2026-05-23T15:21:45.000+00:00');"); // }} END OF AUTO-GENERATED BODY duk_peval_string_noresult(ctx, "Object.defineProperty(this, 'wget', {get: function() { return(require('wget'));}});"); duk_peval_string_noresult(ctx, "Object.defineProperty(process, 'arch', {get: function() {return( require('os').arch());}});"); diff --git a/modules/agent-installer.js b/modules/agent-installer.js index 84a7dce68..30cd15654 100644 --- a/modules/agent-installer.js +++ b/modules/agent-installer.js @@ -302,8 +302,15 @@ function installService(params) } var svc = require('service-manager').manager.getService(options.name); - // macOS needs a LaunchAgent to help with some usages that need to run from within the user session, - // so we can setup ourselves to accomplish that. + // macOS LaunchAgent: required for screen capture + input on Tahoe. + // The system-side LaunchDaemon (this service) lives in the system audit + // session (asid≈100001), where com.apple.replayd is unreachable. We + // also install a per-user LaunchAgent that runs the same binary with + // -kvmagent — launchd loads it into gui/ natively, so it shares + // an audit session with replayd and ScreenCaptureKit works without + // the audit_session_join workaround the daemon-spawn path needs. + // The daemon's kvm_relay_setup() connects to this agent over a Unix + // socket when MeshCentral initiates a Desktop session. if (process.platform == 'darwin') { svc.load(); @@ -315,10 +322,30 @@ function installService(params) name: options.name, servicePath: svc.appLocation(), startType: 'AUTO_START', - sessionTypes: ['LoginWindow'], - parameters: ['-kvm1'] + sessionTypes: ['LoginWindow', 'Aqua'], + parameters: ['-kvmagent'] }); process.stdout.write(' [DONE]\n'); + + // Immediately bootstrap the LaunchAgent into the active console + // user's domain so the agent comes up without needing a logout/ + // login cycle. Best-effort: skip silently if no console user. + try + { + var consoleUid = require('user-sessions').consoleUid(); + if (consoleUid && consoleUid !== 0) + { + process.stdout.write(' -> bootstrapping launch agent into gui/' + consoleUid + '...'); + var plistPath = '/Library/LaunchAgents/' + options.name + '.plist'; + require('child_process').execFile('/bin/launchctl', + ['bootstrap', 'gui/' + consoleUid, plistPath]); + process.stdout.write(' [DONE]\n'); + } + } + catch (be) + { + process.stdout.write(' [SKIP — bootstrap on next login]\n'); + } } catch (sie) { From 6565c5e74ee82b67b1b4421a4f365a0763bc1ed1 Mon Sep 17 00:00:00 2001 From: Simon Smith Date: Tue, 2 Jun 2026 14:52:39 +0100 Subject: [PATCH 25/68] fix macos kvmagent reconnect Signed-off-by: Simon Smith --- meshcore/KVM/MacOS/mac_kvm.c | 33 ++++++++++++++++++++++++++++---- meshcore/agentcore.c | 3 ++- microscript/ILibDuktape_Commit.h | 6 +++--- 3 files changed, 34 insertions(+), 8 deletions(-) diff --git a/meshcore/KVM/MacOS/mac_kvm.c b/meshcore/KVM/MacOS/mac_kvm.c index 69e2a5a62..6d576904c 100644 --- a/meshcore/KVM/MacOS/mac_kvm.c +++ b/meshcore/KVM/MacOS/mac_kvm.c @@ -432,6 +432,29 @@ static int g_kvmSocketFD = -1; static ILibKVM_WriteHandler g_kvmSocketWriteHandler = NULL; static void *g_kvmSocketReserved = NULL; +// Not currently exported in ILibProcessPipe.h, but available from +// ILibProcessPipe.c. We use it here so socket-mode sessions are fully +// detached from the manager on KVM disconnect. +extern void ILibProcessPipe_FreePipe(void *pipeObject); + +static void kvm_relay_socket_ResetState(int closePipe) +{ + if (closePipe != 0 && g_kvmSocketPipe != NULL) + { + ILibProcessPipe_Pipe_SetBrokenPipeHandler(g_kvmSocketPipe, NULL); + ILibProcessPipe_FreePipe(g_kvmSocketPipe); + } + else if (closePipe != 0 && g_kvmSocketFD != -1) + { + close(g_kvmSocketFD); + } + + g_kvmSocketPipe = NULL; + g_kvmSocketFD = -1; + g_kvmSocketWriteHandler = NULL; + g_kvmSocketReserved = NULL; +} + int kvm_relay_feeddata(char* buf, int len) { if (g_kvmSocketPipe != NULL) @@ -930,10 +953,7 @@ static void kvm_relay_socket_ReadHandler(ILibProcessPipe_Pipe sender, char *buff static void kvm_relay_socket_BrokenHandler(ILibProcessPipe_Pipe sender) { UNREFERENCED_PARAMETER(sender); - g_kvmSocketPipe = NULL; - g_kvmSocketFD = -1; - g_kvmSocketWriteHandler = NULL; - g_kvmSocketReserved = NULL; + kvm_relay_socket_ResetState(0); } // Setup the KVM session. Return 1 if ok, 0 if it could not be setup. @@ -946,6 +966,10 @@ void* kvm_relay_setup(char *exePath, void *processPipeMgr, ILibKVM_WriteHandler user[2] = processPipeMgr; user[3] = exePath; + // Ensure stale socket-mode state from a prior Desktop session is gone + // before attempting a new connection. + kvm_relay_socket_ResetState(1); + if (uid != 0) { // macOS Tahoe path: prefer the user-LaunchAgent socket. Agent @@ -1059,6 +1083,7 @@ void kvm_cleanup() { KvmDebugLog("kvm_cleanup\n"); g_shutdown = 1; + kvm_relay_socket_ResetState(1); if (gChildProcess != NULL) { ILibProcessPipe_Process_SoftKill(gChildProcess); diff --git a/meshcore/agentcore.c b/meshcore/agentcore.c index c5563e705..fe8228b98 100644 --- a/meshcore/agentcore.c +++ b/meshcore/agentcore.c @@ -4357,8 +4357,9 @@ void MeshServer_Connect(MeshAgentHostContainer *agent) } #ifndef MICROSTACK_NOTLS -int ValidateMeshServer(ILibWebClient_RequestToken sender, int preverify_ok, STACK_OF(X509) *certs, struct sockaddr_in6 *address, MeshAgentHostContainer *agent) +int ValidateMeshServer(ILibWebClient_RequestToken sender, int preverify_ok, STACK_OF(X509) *certs, struct sockaddr_in6 *address, void *user) { + MeshAgentHostContainer *agent = (MeshAgentHostContainer*)user; int len = ILibSimpleDataStore_Get(agent->masterDb, "validateWebCert", ILibScratchPad, sizeof(ILibScratchPad)); // Values here are 0 terminated, but the 0 is counted in size, so add one to the length check. if ((len == 2 && strncmp("1", ILibScratchPad, 1) == 0) || diff --git a/microscript/ILibDuktape_Commit.h b/microscript/ILibDuktape_Commit.h index 588b6d36d..c4f4dc711 100644 --- a/microscript/ILibDuktape_Commit.h +++ b/microscript/ILibDuktape_Commit.h @@ -1,3 +1,3 @@ -// This file is auto-generated, any edits may be overwritten -#define SOURCE_COMMIT_DATE "2026-May-26 20:43:05+0100" -#define SOURCE_COMMIT_HASH "f9ace66615e312290de6bec3836ba290144b5c24" +// This file is auto-generated, any edits may be overwritten +#define SOURCE_COMMIT_DATE "2026-Jun-2 08:28:25-0500" +#define SOURCE_COMMIT_HASH "a20c31f9e8925b84206ca21de45d610f35d5468b" From f3e031a7877f0a86ecf581b4031e11c0ed03dd8a Mon Sep 17 00:00:00 2001 From: Pablo Navarro Date: Tue, 2 Jun 2026 18:46:11 +0200 Subject: [PATCH 26/68] Fix UninstallString issues with paths with spaces (#352) * Corrected kvm_server_SetResolution definition and call. Fixes UAC delay (issue #347) * Fix for possible spaces in UninstallString --- modules/service-manager.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/service-manager.js b/modules/service-manager.js index 76587ca98..7e7c1225c 100644 --- a/modules/service-manager.js +++ b/modules/service-manager.js @@ -2433,11 +2433,11 @@ function serviceManager() reg.WriteKey(reg.HKEY.LocalMachine, 'SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\' + options.name, 'NoRepair', 0x1); if (options.name == 'Mesh Agent' || options._installer == true) { - reg.WriteKey(reg.HKEY.LocalMachine, 'SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\' + options.name, 'UninstallString', options.servicePath + ' -funinstall --meshServiceName="' + options.name + '"'); + reg.WriteKey(reg.HKEY.LocalMachine, 'SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\' + options.name, 'UninstallString', '"' + options.servicePath + '" -funinstall --meshServiceName="' + options.name + '"'); } else { - reg.WriteKey(reg.HKEY.LocalMachine, 'SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\' + options.name, 'UninstallString', options.servicePath + ' -b64exec ' + script); + reg.WriteKey(reg.HKEY.LocalMachine, 'SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\' + options.name, 'UninstallString', '"' + options.servicePath + '" -b64exec ' + script); } reg.WriteKey(reg.HKEY.LocalMachine, 'SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\' + options.name, 'DisplayVersion', process.versions.commitDate.toString()); } From f2302c12a627a2c69c93a0756b6ff916190b066f Mon Sep 17 00:00:00 2001 From: Simon Smith Date: Tue, 2 Jun 2026 20:04:48 +0100 Subject: [PATCH 27/68] update modules #332 Signed-off-by: Simon Smith --- meshservice/MeshService.rc | Bin 12536 -> 12532 bytes microscript/ILibDuktape_Commit.h | 6 +++--- microscript/ILibDuktape_Polyfills.c | 26 +++++++++++++------------- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/meshservice/MeshService.rc b/meshservice/MeshService.rc index 742f9ab2c1df62569bc050a82a5f6700a1a1f12c..fda7e42c39d40bf099972660f768af9b24d5bf1d 100644 GIT binary patch delta 97 zcmey7_$6_J4!@!oLn%WZgD!&+g93vgg9U>Xg9(EfkTe8BZ3Y7dqsa#aq$h7+<(M2G S$hWzHUyhNmmdytR%oPCdp%SeC delta 89 zcmey8_#<(H4!^Q5Ln1>ZgD!&+gBgPYkThVhVlZJa29gF0rVQFZ(r~jczds{U3ik?_ GD*yog91ki0 diff --git a/microscript/ILibDuktape_Commit.h b/microscript/ILibDuktape_Commit.h index c4f4dc711..c46a67ba7 100644 --- a/microscript/ILibDuktape_Commit.h +++ b/microscript/ILibDuktape_Commit.h @@ -1,3 +1,3 @@ -// This file is auto-generated, any edits may be overwritten -#define SOURCE_COMMIT_DATE "2026-Jun-2 08:28:25-0500" -#define SOURCE_COMMIT_HASH "a20c31f9e8925b84206ca21de45d610f35d5468b" +// This file is auto-generated, any edits may be overwritten +#define SOURCE_COMMIT_DATE "2026-Jun-2 18:46:11+0200" +#define SOURCE_COMMIT_HASH "f3e031a7877f0a86ecf581b4031e11c0ed03dd8a" diff --git a/microscript/ILibDuktape_Polyfills.c b/microscript/ILibDuktape_Polyfills.c index 993a47dd0..1e2ac3c69 100644 --- a/microscript/ILibDuktape_Polyfills.c +++ b/microscript/ILibDuktape_Polyfills.c @@ -2486,17 +2486,17 @@ void ILibDuktape_dataGenerator_Push(duk_context *ctx, void *chain) void ILibDuktape_Polyfills_JS_Init(duk_context *ctx) { // {{ BEGIN AUTO-GENERATED BODY - duk_peval_string_noresult(ctx, "addCompressedModule('PE_Parser', Buffer.from('eJytV0tz2kgQvlPFf+j1RSjL8rJCEVM+EOxUqPWCC4FTOQ7SCKYsZrSjkTGbyn/fHkkIiad2KzogNNPzdffXL6n5oVoZimAr2XKloNNq92DEFfVhKGQgJFFM8GqlWnliDuUhdSHiLpWgVhQGAXHwlu7U4YXKEKWh02hBTQvcpFs3Zr9a2YoI1mQLXCiIQooILASP+RTou0MDBYyDI9aBzwh3KGyYWsVaUoxGtfI9RRALRVCYoHiAT15eDIjS1gJeK6WCu2Zzs9k0SGxpQ8hl00/kwubTaPg4th//QGv1iTn3aRiCpH9HTKKbiy2QAI1xyAJN9MkGhASylBT3lNDGbiRTjC/rEApPbYik1YrLQiXZIlIFnnamob95AWSKcLgZ2DCyb+DzwB7Z9Wrl22j2dTKfwbfBdDoYz0aPNkymMJyMH0az0WSMT19gMP4Of47GD3WgyBJqoe+B1NajiUwzSF2ky6a0oN4TiTlhQB3mMQed4suILCksxRuVHH2BgMo1C3UUQzTOrVZ8tmYqToLw2CNU8qGpyWs2YUpVJDnygmrW8QEgCxGpJM70nTqR0lRWK17EnXg/IDKkNdx6JmplVis/kri9EYlhUC/Eh3v48bO/X/VCXEkjVDO80DDzmy5uemFDBJTbW+7sgOtgyEVBcrFVNJxS4ubWXBF+xRX07x4+R55HZYP4vnBqXSt/lKvTUp2ClAhSsf4uF2OCiBuT9zCxYRVvJ3uZOYn9Ev/F9ntufW9WHVp16Fp42yliHtSy7fjUHAu33X16rLXMhhI2Jhpf1tpd/TAPMLJDgnSb8Ns9GB8H1oNhJkAp7fpSKyk2UDMiLqkjlpz9oyuBcSK3kMQ1I/LnKdfGs9Ke7ZiMHds9NHzKlzpkx47ddtCxbsvMu58dC3VV1xDIynlurOi7kbrbsj628Lrgsm5LBJ4f45aU91LfQuxGziqnsEC3VaT7WIeDxIPRthzjTtN120FO1X5bX0nCNxKSkS7jvdc1+kWZBWp97R/C9rpdK8HtWmVwUfoKrks9EvkqxpzzVy42/DKobgwe49S9AJzlS3oYawR7APETQm3MNAQ6zW8ny/mzZweuGzfA+wuZA7/jeDtZkTu8QvJmRXxY62eN3Fl5Ke0z1Djvs6cSia/NL/aiaD19GRzQX+BpuKLOqx2tn8V1Ziz86VpFnjWzE28oXB2bva2F45Z56syI42wkvu4fD0SR88d7J4/PeWmAdsfM3N6V6bHo9bZ4tmpbn/NVm3bDYp5nkThj46eO2T9ZQUMqlR7FRNGZHo77ND7rba8kVFpR53Buy5qkccrmD6KeBpVvxFZEqrJlqsE+dUu1v84uPkn3+1/xabfKsno9QJb1awJk/ZdAlw6Q1ft1AWq3D6N9bpAUpXYTNx0tgPoj/XaKbSx+R53suvFfZMmcOzBQ15mea12s6MvTqOj9ENXrUZakStZR9FvG5VQ47hv5yUIi/OWKObqHOnsEbP3cx28Xnqxiy9KP+oTHZKgAz8itucfU/X7lHo2iQo4cjhqUj4cM3rPxcsWXHFoqmbP5ULnGLeRGy7xkzjFgbN3xckljMSv2nl21/ISa/YviAvMFX4sugzxsnmJVCHbC82Jeoe+OL0KaOp+bcfobKc0ovRq/Fa2FG/m0gR9xQipde/GHUZyD1cq/OIedMw==', 'base64'), '2026-05-23T15:21:45.000+00:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('PE_Parser', Buffer.from('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', 'base64'), '2026-05-23T16:21:45.000+01:00');"); duk_peval_string_noresult(ctx, "addCompressedModule('_agentNodeId', Buffer.from('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', 'base64'), '2026-05-23T15:21:45.000+00:00');"); duk_peval_string_noresult(ctx, "addCompressedModule('_agentStatus', Buffer.from('eJydVk1v2zgQvQfwf+CNFOoqQZOTvdkimwbYLLpOt01P9cJQpJFNL02qJOXECPzfO6T1QcmO064O/iDfvJnhvBlqcLJONCm0WnED5JJo+F5yDYxWSzQaDzxEqgx4FiJmyRykneD6bUYjVgN5kX5K7AKRSJGCMXEhEpsrvSKXl4Q+cnn+jpL3hNEpPvF0WvACplNK3tQ+3hD69sPV7adrGpERYTVN+pixyG2eVpvocHCSlzK1XEmSJTb5M5GZAM3SRSn/iwYnz4MTgo8LS4Ac7/7xnOwAMa7NMdLfyEVEnoldcBOX0ix4biuGMWZrSy3HZNvaMjTD7HYUGpLs66205+8+3rCzKCK/k5D7Z3jbGF0KDbMRPAV2MXSRY9YX0bgFFslGqMRVQ5ZCVBtWb3Y/qqzd0wL/+nI3iYtEG2DOTWzVF6u5nLOoJq5STBObLgiDaI/MJ1LpIp5pWDJ6K9eJwJJ9BlMoiQr6DCnwNWS0ZnVPlWzHzaFoT0/7LgyrMsCDNqWw77t/R7Tj5zXroUcczvepm2+/3q4AKJTXa1vXDS0QhofrqLaBTr+XoDdXrnWYelgOsUtgjZ/YMl3B4qG5+sJj3Z2soWCYzhAByyYEl6zvTTNuFpZ+YYkB1BkjZTxDp7jxTNJVNiLUR0OH6FGUMCJucxv0iQvOta2T2b4gHF8qOKYSzgUJlkZxip1h4VpJCT5o9uxzHPnPmhLHQD0uqo1tTzcVf4wENN2RYbTtSUQtOgisEYMzc3JHm2A+hD46UJDZS+wHPLzQE6lQptcAXlG7eRUuuTK7YvxR5jnoOEca5vvU+Nbk+YbVJYv6dM72ocxb60QIlXrdLWuB9kwQHj9qbqEZWDXSyXtIzvoGyzhVxYah3bCdP53MPZ0DhLvbXoeBMHBcO05mh+uuYaXWcCXER24sSNCmKugLOjmEd1U9Iqvj+uiBjyjkkP5eVUZPFf9XEb+ohl9SwosqCI5mTwfbduJUkPAdw7YDCS8GN8+sM9x2LnRjE21ZOxSx/Y0SEAs1Z/QfN7fwRMjfYBbEj1NnYCGO4+aA50I9JCKeuY3SWHwBIQbsPV+BKi3bK2JQwI6vrzJ5EECscss2SW3gNHTnnvplZQZP3LLmNIbk/OzsrK11cAnUYw0jwbFpFyD7g74F7AfqhrSf/dWMxsG+uwrot8ndPbm+m0xuru9vPvxLm3eYvfyCI6xcQYbZ4u2AakC2/aucsDCBDEyqeWGVNrQTbZP+Xl7r41mF4a1D9524D7xjdAOzWGlsm1z9dFju/HrOD8Acql9oB/OvEq/jaqWvVFaiH3gqlLbGX8pe86Pd13CnklEgFrybfwDySlmh', 'base64'), '2026-05-23T15:21:45.000+00:00');"); - duk_peval_string_noresult(ctx, "addCompressedModule('agent-installer', Buffer.from('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', 'base64'), '2026-05-23T15:21:45.000+00:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('agent-installer', Buffer.from('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', 'base64'), '2026-05-23T16:21:45.000+01:00');"); duk_peval_string_noresult(ctx, "addCompressedModule('child-container', Buffer.from('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', 'base64'), '2026-05-23T15:21:45.000+00:00');"); duk_peval_string_noresult(ctx, "addCompressedModule('clipboard', Buffer.from('eJztPWtz2ziS31OV/4BR7Q2phJZtOZPNRuvZUmzFqxs/spbymEpSOpqCLMYUySMpSx6P77dfN8AHQIIPOc7u1G5YlbFENLobjUY3uhvCbD95/OjA828C+3Ieke7O7l/I0I2oQw68wPcCM7I99/Gjx4+ObYu6IZ2SpTulAYnmlPR904I/cYtB3tEgBGjS7ewQHQFacVOr3Xv86MZbkoV5Q1wvIsuQAgY7JDPboYSuLepHxHaJ5S18xzZdi5KVHc0ZlRhH5/GjX2MM3kVkArAJ4D58m4lgxIyQWwLPPIr8l9vbq9WqYzJOO15wue1wuHD7eHgwOB0NtoBb7PHWdWgYkoD+79IOYJgXN8T0gRnLvAAWHXNFvICYlwGFtshDZleBHdnupUFCbxatzIA+fjS1wyiwL5aRJKeENRivCACSMl3S6o/IcNQir/qj4ch4/Oj9cPz3s7dj8r5/ft4/HQ8HI3J2Tg7OTg+H4+HZKXx7Tfqnv5JfhqeHBqEgJaBC136A3AOLNkqQTkFcI0ol8jOPsxP61LJntgWDci+X5iUll941DVwYC/FpsLBDnMUQmJs+fuTYCztiShAWRwREnmyj8K7NgPiBB10p2U9kqGvxKw2nnwP13Zs3gQdUopvxjY/AOz3ecrAMAupGY3shvj31XPEr9j3xpvSc+o5piS0j6lAL2TxwKHzdJ92/5FtOvcie3UDT3m6+6Rw4pmGEbQnCD/3Jm/PhSf/8V3ibdDh4PRkPPozlN29Phwdnh4OkYS8d7NpybH/M9Gef3N6x97OlyygSF4R6TfvT6QHoPE4encLIlg7VXXNB248f3XItRkTXprNEHJc0+u+RCNXLwawBSNPit1Fwwz/EmDhkDCWgOjQjGR0+9kznsD/vtLO3AiYJm+7SFWF4+Ksnuzs7O+12J/JGoO7upd7uhKCWka4Rrd354tmuro01kZ6ErmUQrUWeJi+ekpbW6iXLGp+77CN1QlrPYCoUoXf8xzIja67Tdrms0s53CQ8o8N9sX9R1K53GLVji1FzAQC34G9Fkgr1AT0YMfTsXy9mMoqa6S8cR3nsgm6kZmZpBUmXRrSJ7MENoQlM8HFH5ZEnA5BX70LE8F8avf7Q+t4sCqhVvJUqh0SBK/HeiOKg75cojKXXI1AeQZxLLlEq7MEP6/Jkm9ggoruLWdHk18Sngm3AME9eDKVg6kW5Fa4N8apmKhcd0DhcC0zgjGdAMrBhvS9jhzSl5WVXbvU/wrxXzZM+IDjx1HOpegkP7mew+39vZKc7m9jY5GZF3drg0HTKKllPbI3MTjDB4vHVo/wYuKLXEooqCPV6gHsasCULmktCsOcA8mWjx0JJ1uJWuQ60NTRqADo/tixO68IKbSd9xPAuXM3bTgULC/1Oyy8ANsmOQ07fHx/y/MGZXXGHIlx1b5+Tdao6+XrfJX0mGsMq2BMSaL90rQIPw4fKCD1G3DcANjDxHG5MzITjop2CPtAVdWP7NJNTrR87/2XxY+QFvETsecAubOEfwvcVB2fdMOBoTRJ4pG1kSIdVLLbU3/EPML5i+hN+WhDkdKs7b4fIqMn06UfiTwZrrfEvLtBvZrxNMqtHFQaWkZ7Adqpew1D8e8ILx1oGNixdEIS4RBLgrOMhXbI1V+ERxkRb8Y7uRseBLRFz88BbVGvhO1nEy5ESAH1HqnLlDasGWRNeXbmhfurCxQ3xP2kzenMtMX9h3QV8MIncjT560fxQnqv2ZLSNBgKnwy20cXXNqKRJlfzZ5pWBNJwg0TpC4EQIjzj22LxvY7abWWnzBPYtCG/K2XNiyNDHk5Mcfic7HvL+P/pf8/jtJvs9McJ7th7f1jQb27T1BTpe7fwjH8PTfzi1Idl60OGDY8zandlScPWkaCzaoAZr4n4yn3E2wVb0M55NLx7uAte1dfIG4C5d0u4dtYBgmECv68aLna31rF4SbLvcWhwxXpj+JPD8G6fK3DLfYV/Z1JUDfZJSW6TiTBY3m3pRTARYJa+FM/2t86dQOfQxzzqk5BXM1le2zPY1XZGLpEISbM1XYQXSYKwt2GB0IwqOZFyww+NBWtrvX1arXrWmhyxDDpmVIg62Q8pQDjDVOA0DA2Gew+TUD1DmSzBCLAaqCLuuGI/TNIKRDwM0RfNz53BlxwsNpfm3eKZdiZTDEaJSOC6Ki0HPoW3uqqyIh/ifDLwoc8cKE5GNQFAW2wdSh01HOydQMYFq00nbUuYtwygDUs+rY7nKtoZvLIl3H9i88M5jCsFiKQ+HiQAeXAcStsmp2AtS/dk59laPmVt52pnG6yKYhJlFImMzYSxTMXa+BYvIhlCvm2nZnnjh3C8+1Iy/YwvcwRrBOH4bwEaSdV5MchxDEXjMuP/Tfjv9+dj4c//qSo++szSXYhMCObgxyOBy9Oe6nTbg4HfNGGsydmO3I9keYZomTanqWHIAdkgEAX9pAmUXdk4BJC/7bS198YS++9LKoO54ncKAWCg3a2YYl17oww4iF96l4RlZg+9GB52IWlga4aFmeQ89JI0+HY+qIecJIDaJMgUxrUhsxXmE4UbDM2w8JEsWkF+aUgdA1GF9poZaMBllFYDlbA965nFtU1B9ULNfbsTz7X3RtEAQeqoc5xcyEsDbLLRo+U+rQiMoI+ZAaDHqwptYyovGWs8Wyvyaa7Uo16alNCLcJnWhO3VSn9ev2LcfYCVliqN27ywSs0/ZtbE87FIcPL3rJ0o9nDlhv5bhnBil2jrFE7qSUbOIl38MypToqoEGaOctc9k3O0v0rvaXsLH/+7ir/qK4y5ymZ9n13lBs6ypq9KU4dN7zcjtU4lIfxfDl0ndRQ4ssKuHLHAmLDgXLTzY1kPB5okey62AiOX7bnKoIKpws4E1vreJfoLqvR3Nc3xMwquACat1Fwc6taVcjPXVLBua2YKOZGwE3c1Rjk27wfyTsSwcaJw2b42aLtyRpZZysa6WNS64mJRfaCesuo3phbWAwdc2glhl6xjwJMLlIpJFHeL6RRQj/TqpA6s3rmESpBWNiPKYBKuDQIZoR2DMZgW2U6ChsBmJ0JM9cT3JxEdB2xfUNuH1BRZt3YwYm1SKIqRuLui234aP2uJmPyHhYbCTFzJhU38cUk1mToR2GRv7Ydqpd7OoN81NYOfsKkEww/LrXjN4u98rTPBliXpc1clEHAJySWnnvBgXuttzNrk3KmDCGy1jCawq4Q/gS8dltsKimxJuET9sTUnJAL7qnYAGyg12WEsOmBCCl9gTo1E+NNJfADctYwcmL6lUPQAb4WWcgu6Co+9dVhKdZKcMdSKysJp8MXdVteobATy69QeXl+g3i5xCr0GrCLXf95jKosUokFKFofna4Vhw0y8wOtGxigD7u7FeZnAs1CeeUH+FpBWkNk6fksPM10kBgdcmK6tr90WMkknx5VhwqsnFO6TS9V6molqBCLJJpEPEcnVdK5XOTCb0yUo7l+UzxqVTTszK7nA/gchs6Eu843FTmZfBcpUMcMn1ud6gCAjXK1KJfVHCJw4AZmvPPhPX55Y6+pg7gwFo0DAYPE30MLgjMMTTvvTEfafyUPXyzSYDsHx8M3w8OECh56DNx+5C0KVI5O4n3+OzOw8TiXrmHfV2f980OtbZBCuamM4uuT8X0Jvh2/fjEZjc+Hp0cbkXxzfnbvQX4YDY4nh/1xfyOKw9OD8/tSxL4bETs/Oxu/H54m1M49L3pvu1NvVasqTaes/8tAIMAZHuEhS1pCqIJNVhzdSXlhR24N8hN7x1Q+/tNW6jBjYHTjWgWSSnFxfj33GmLS9KBjI275wlC3MRVWN3FVK+nGxWiIxzxLmS4fY9OlfUhDFgF6weA6F3rmmnA3a06n2Vs9kZsbnxpdLi5okGOHGRrcvKITgBDnJcs1FwPjhvwVzbCi031RJ1mTfSKP4Z74cC8aj1rajs6m7SJChXnHh+0MBsBR0QTs7nSfqaSIT3xQgE3QG4i3ccPMWRanRcFGBSv4MISn4MrZCJn2SWgNYLaMJ3wgOv8wAEEFdKbDSn6GxzH4GQ2dp7ffghXc6x4PIJqB4D93ILmE3xqeEzGySDMV4xvPRnurjJTzPS/sKLxv3/C3+/aMTNu5b19+Eqisd3V/NsdHNPYOyRn0/DxXmq4qmwfT/vynn/a4Kc8dcjdYdIviNkBwBhOBEQ+mnnEVVRZMcQSx2rU7PICsEyMTw2s8aSB3b9QPTEEUeDex32suuoaDDOjCu6aCJZ4pvbT4XIAWXFXA3KmbFK8LplssaxhEKjfl4ovayI/HC/hjFT1aR988/Pu22al/n+QUfmDH2hj7czOcH+A5Tn7MRpW0+qbpqvJUkZh+t6TziRVJqYdCN5lTx2e51RRN/Er3i4rAi1GNJkfbvrDd7XCu4VzAH+kHAta8mFzL3n1VVi1D//VSZ4uprOaUFAzLo2POhu12VqzgrPkh2TLXHvFhgW55+GO4helOiYihae5NhZoi0gT3ohRvvuvv5DKgPmll68UvrJYW+Z0dlWuBvSHap0+uRrT/0eCluboiW6/xs9YqzkBG5FaraoVXIFbd3t/t2X89fd17+tRu13WoxYgPP2T3J9uIvCvqhkYLf77RpCMe0dvnnT52PzfqYs2vWC9+XpWflt41niO92r6ww0y678cT0aqVAGkqBXh8UO5oRlr/FbbAlfNx7TYb110dUCVA60775GJu+5ObV5CVaUeDfN0Hl5tsHeoy3IkDLGnHJ/FU6bEHiUKSAq85URPXbtb1Ga6E3NZus7MURfi7op3GUp+79CVDHb9TWeq0VsBgKKvzcjq9QokzBslOVGXt29vkcMl+E3XAaRlkRWE7w38ke2U7Dvu9KFPZ5FwFvDEjsjJDWH7mChDD5phaSzNM4Bz7CvY5ER6KB8Rm4C3xl6ipnGPDjJ53V9c+YLZim5/PZlsivtuCXXl8mv1nMhoe/TI8PtbyepSDZ+lJEENizZH7PAzsAzJsoqDiunv2k8+PkpX8XDpxDWs7AmK5riLQKCu3VqSz/Zz6AKyYrzZIN6udJjRFiGKNJ1VR5dYkXfewEa4eMD+G506rEKLs/q9GcHwCk+GpxqHa9WRKsV/cDG1U9sFtPysTFLb+D1AbieYBRGJ/iMJIIghFwFNSPNywAPKNT8FOgFO0cOua+sf3oktJ0SWP8j+25PKfV5OgWYHhDBx6PltuCJcpPER5oJbcxkWNh6pONJm977WJ77WJZqzg87W1iXBls7CkaYHi/tUICzfw8jUsL6t7sF7ybn7kLeiFN71hexPirdyw4icNqqcuI1zkNL775St4XZmwVsmShSx4DhRDngVhaaX61Dc+qHP0Wqlz8CYucozwh8H7++QF+Rv5c5e8JHvPmwiElWuCScBH6QWcigJnqiHPQEVetIFA+qbLlKY5sTRv2oDYiwKxZ5sR8+NSSz2t58/ytPa6m9GKzOCSRvWUfnpeGNWLDSnxe5Bq6Py5WxjR883oZBa4hlS3ILzdRHj1xOh1mfVh0WBqfvKl0YbjoNcN9DvlYS8RWvpmdxOhAbF6/U5Rp4spfbPRYgJiNTqXUXpRoLTJSkJKVTqXYk1XkSTQTejUrtgUc7qOsjFtso7QdWDsrbSsysIqhquNNFo0qWkN1udDSZWbRcCicgqa3+7l/cn54B9vB6Px2flLlktvRCG792FO11ptGTfmPNXfWs4zyCrOR4PjwQHeTpdyXk/hfpzzxVDLdgxWxfO4f340GKcM1yC+J7ewoOp5RaBKTocng4zPKpQKLuv5xHRBUQCwWcXVWBpSV+xmxadmz5g8uRFj5E2SO/lmXsBHn6zmhkcd1Lgzl8fDJOUqS1oSQ1VoKAqrKTc8gsPENk0PoQg8xRjVfCl5UvADNtPIX5VopOLLPnUm7LKZLVKoQ1Ryz4IQFc/KDInqUYm2bHmkgNISqadTcvRDfOQKatlzTxV2r1wIX8hrL1iYUaLMjUIYxpow8Lxk5C0T3pDZBOtdE1sQ51fcKYs2N1DMXZYvotcPEaI9+KEdx0uNReGnXqvyX2Yk9/Fkief0Ishi6npyRF0a2NaJGYRz05GuGcMTNntdcRNyyq7OgiW6vuEHcPa6nakj97qigUudin4JgNQzfck7nPCbaLQjdvEOu8ypGeixZ101g3zrOgksh47HI8MeOF5IDwqhvBJ2GKaAfPn0r03bwU1bdb8jGqUdD5PouxT6zKeuzJAELDXrQn4P/WUMU86oLt8Ly/3pD/tEcfMjHpeJ8eUHkMeSq1/O81hzmFNFTq/oTCcym2R9nl9EMXjsHfbJ1m4OgC+GBOy9PaVd9Ng5qBwtriYytQY/6We/H/4WNR8//lFRYqizkpmkOvF4+fEA6RibrFqSegvnUb8J/35yArRQhvSLRchVZRHy6GRwMjk5ezfovzrGrOfOemdnpyuYIfnK4+/mr8L8PYjxGyz86OYbG8qi6SsFHalsajZLi6gsusaN5i0o35RmBQgiONeiNWLTo0sKaTAC3BIlbM475jLy2BlmfsGioDQNLV1iuoqIeDsjKiSp2F406ZQmsvQueYL14uTGQnYHorRNzalP0RDWeRyhVdYLPdean6ac5zDIPD/LRYMlXhi3MC0vzMwGO3xCRduRnXtIauE0DM1LunXhrdl1Cxk/WW81FcX2qwb7pYi9nZo8XusonMbM0LLEf3zTg5Dvl69eAeURTWavDI4VTmLgZAgCsLjL5XT5nQ9VdJ1N6DpqumfsbsXOlM5sNwsxZRRGfJqzZcguWxHqXGIBsXC+pqYTPrkDVtn5Mvl1r2y7n95r8/WnicWn5Jf7D/er/VKC2ZHH1RxMiB3Gp934IVntlp/BJH/qAjL1mcgiWuURyfws5Iccn2fEjWOrtXlFUq1gKBlQq0msVyArdj3sy4LAE+qlAisNVBP1qRwP+VspxZf8ii4F2ZwKSqwV13FysFtYydKhqRnXTDuMQpYq0baXYbCN1+g6TEuZiLR2+Z5daReyM1W9KujEOhQvSMh128xOZPOpHo0ss+Y3RATeiuD+KNl7j5Y+Usb/N8qr0WGy8OOlopXQKE5RfJlXla2VPVyttZVdlUI/gJ9cz9z92BgEyG965V3yl7iLnfNtZWj4XcFpT/61CCzdegfQ0vdy8HMuF/Fr7/8B77AOUA==', 'base64'), '2026-05-23T15:21:45.000+00:00');"); duk_peval_string_noresult(ctx, "addCompressedModule('crc32-stream', Buffer.from('eJyNVNFu2jAUfY+Uf7jiBaiygNgbVTWxtNOiVVARuqpPk3FugrdgZ7bTFCH+fdchtKTdpPnF2Pfk3HOOrxhd+F6kyp0W+cbCZDwZQywtFhApXSrNrFDS93zvVnCUBlOoZIoa7AZhVjJOW1sJ4DtqQ2iYhGMYOECvLfWGl763UxVs2Q6kslAZJAZhIBMFAj5zLC0ICVxty0IwyRFqYTdNl5Yj9L3HlkGtLSMwI3hJp+wcBsw6tUBrY205HY3qug5ZozRUOh8VR5wZ3cbRzTy5+UBq3Rf3skBjQOPvSmiyud4BK0kMZ2uSWLAalAaWa6SaVU5srYUVMg/AqMzWTKPvpcJYLdaV7eR0kkZ+zwGUFJPQmyUQJz34PEviJPC9h3j1dXG/gofZcjmbr+KbBBZLiBbz63gVL+Z0+gKz+SN8i+fXASClRF3wudROPUkULkFMKa4EsdM+U0c5pkQuMsHJlMwrliPk6gm1JC9Qot4K417RkLjU9wqxFbYZAvPeETW5GLnwnpiGB4qjyerqFOKgT2aRbfvD8FS8dGjfyyrJHSdwqlsc0DxEy+jjhA99b398PUep0RKbxPqFfHAsurV//emWew2cwgvzgG8q+SuArKjMZtjFvvnULTeN4Q9eaY3SNT2eG1ERfCKdnNSdODvgIUyP5b9XL9/3aiQN3lYOQfecCcmKc0P/6eQf7K/Hw6lG8Z5bHp9ft86v4OVpKAWrKyS3GSsMtuDF+idyG6ZIcvFOKxoguxsQRQD9J1ZU2A9gDznacydDuiJIpaX7n+ikBYeOvgZCu7s6uMnZqrQqMKSBV9oa0rdvZ2ja7nAg6B/4IHJ3', 'base64'), '2026-05-23T15:21:45.000+00:00');"); duk_peval_string_noresult(ctx, "addCompressedModule('daemon', Buffer.from('eJyVVU1v2zgQvQvQf5jNoZYKVU6zaA8OcnBTdyu0dRa2u0VPC0Ya2wRkUktScYLA/70z+rbjXWB1oTScr/fmkRq/9r1bXTwZudk6uLq8uoREOczhVptCG+GkVr7ne19lispiBqXK0IDbIkwLkdLS7ETwFxpL3nAVX0LADhfN1kV47XtPuoSdeAKlHZQWKYO0sJY5Aj6mWDiQClK9K3IpVIqwl25bVWlyxL73s8mg750gZ0HuBX2th24gHHcL9GydKybj8X6/j0XVaazNZpzXfnb8NbmdzZezN9QtR3xXOVoLBv8ppSGY908gCmomFffUYi72oA2IjUHac5qb3RvppNpEYPXa7YVB38ukdUbel+6Ip7Y1wjt0IKaEgovpEpLlBXyYLpNl5Hs/ktXnu+8r+DFdLKbzVTJbwt0Cbu/mH5NVcjenr08wnf+EL8n8YwRILFEVfCwMd08tSmYQM6JriXhUfq3rdmyBqVzLlECpTSk2CBv9gEYRFijQ7KTlKVpqLvO9XO6kq0RgXyKiIq/HTJ7vrUuVshdYl+nSfabgHE2Qhr73XI9DrlkU0sYFUaVcu+iiSh7XcSE8Q2F0SmAaS8w0IyW6hoPvHQaV8FH2dXSG/16qrZEaYbcLtE4YB69eAUfBbzdwzpezh3W6Jis/D4II2BVwA1WSE0BuG8EJRLFDR8ciOleDT0WbeLidbmWeUQkqVL//l1/zAUcomoBDvWBu8QWSYSKkGQejTCschX3o4WSujLfGOMTVYjkivzHCzQ2oMs95qp0Jng/XbWcD34rwMwGNHS67IJ6BQbZ1TpP2hXtz2wmc9jkZvMOhwdic9WCED8SCHYXxjF9mxAb5xanI84AK0exMiWFPHekIhcPK+YQ2co8t3aS1LKnFnr/OGgxFzugC1vbZBLHFfE1ZyHrdM9bGFrlwdKh3LOHRXqrfr0bD1FoFo2Xyx2q2+DaKThKHHZtsbwXXEVIZ/m4SES/4iOknuqrPzJ/jT/Tcpey12QPoN5vzzW1mwgnq8ejueJmNttGY/xHAnkwweQ4ui4FfaRTwiNl0LHe6Fmm4vapZdMJsWL8tv/T50KTindjy3wKDtxG8bUs0h6abNaZ/VgSyf0SjGl5Ik0pmdacTeP/u/Ts4hDVYVljUS+m8gDoMO52VOdIG/b5ddeCgKVAtUY1tUi8kvF/A95P8', 'base64'), '2026-05-23T15:21:45.000+00:00');"); duk_peval_string_noresult(ctx, "addCompressedModule('default_route', Buffer.from('eJztVttu4zYQfTfgf5gawUpKHDl2sgs0rltkc6vQxFnESRaLpghoaWQTK5NakoqcJvn3DmV5fY3bvvWhfLBM8nDmzBlyyMZ2tXIs0yfFB0MDrb3mjxAIgwkcS5VKxQyXolqpVi54iEJjBJmIUIEZIhylLKRPOVOHO1Sa0NDy98C1gFo5VfPa1cqTzGDEnkBIA5lGssA1xDxBwHGIqQEuIJSjNOFMhAg5N8PCS2nDr1a+lBZk3zACM4Kn1IvnYcCMZQvUhsakh41Gnuc+K5j6Ug0ayQSnGxfB8Wm3d7pLbO2KW5Gg1qDwW8YVhdl/ApYSmZD1iWLCcpAK2EAhzRlpyeaKGy4GddAyNjlTWK1EXBvF+5lZ0GlKjeKdB5BSTEDtqAdBrwYfj3pBr16tfA5ufr26vYHPR9fXR92b4LQHV9dwfNU9CW6Cqy71zuCo+wV+C7ondUBSibzgOFWWPVHkVkGMSK4e4oL7WE7o6BRDHvOQghKDjA0QBvIRlaBYIEU14tpmURO5qFpJ+IibYhPo1YjIyXbDihdnIrQYypqIZK4fIoxZlphrSZG6XrXyPEnJI1OksIEOiCxJ2rPB80saK7V3nYdzFKh4eMmUHrLE8Upk8IlQ55f+sUJmsEu0HvGTkuMn1wnSYZKylPtRMo8voZdohjJynXM0QXomFWUrurGJLaAzGpr/ifMu7pjiFuYeeO35CDTFRjiyv2LR3asXZurQnK7hsTtZ4t+xBDodaLZa3mSq1GVq2RSbbR0Ba9I38mMWx6hcz6fZ6JYO6n7r4tT1pp5s28yu8LDCcC3LPW82OcdzyhUF7WTU5Kiw6Z+gwthGf+C9TbS9akfJfGl0sUfb1rU43tlr859Kr+2dHe4t4pYoFlLIfIneAeyAy2Eb3n/w6vanvbqKx+DSyn8W0LJQG9jY1mjAyeRoQHE21qMsgx/sOXl5scfFHyEFHcLPMKO1/2EzrzWUNtAqxCrO5TNVNoMqZiEezrlr/o27Okw4Hv4LivC6RnzbXleHl4bmuuXf8kNBZEpQ/tDY1L4uFKeEi2y8qTSFQ55E84WoGHhIlQypujqej2MMz+jKcp1Gn4uGHjp1+N2hzx/TjVSs8LWhSql8KVwnYoYR6jsJN/RI5NcVPNGhjyLvjtNeHH7bjL1Di1U7HQhJ6R7lQAzomK1xwIVvbyzizlPKEkUPL0D3WQqlItRl+Ve4d55tLYCtZqdTK6dq8O4dbB0UA481sK5T8mRg6z25gtd7517gmJt74Sz6zRk3pzTx/eRPE7Qct0/MR5Pj5DjwS3E/wOHidnxjzWzvNSdhL2a9r6P/c+4INJrucdgl8XdjUtVWl7fSX+a2e/afzKymp2E4dMsM+WnCDN0Ro1laQ0avHYeeIvst53BWKUYyyugioLeSVMbeW+seK3MlqU/l6mt73mRRQDaaXC0xGw3G9Jyk/Tk1ORmMmCJmG90s7+k1Tgqp/gL2YXjV', 'base64'), '2026-05-23T15:21:45.000+00:00');"); duk_peval_string_noresult(ctx, "addCompressedModule('file-search', Buffer.from('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', 'base64'), '2026-05-23T15:21:45.000+00:00');"); - duk_peval_string_noresult(ctx, "addCompressedModule('heci', Buffer.from('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', 'base64'), '2026-05-23T15:21:45.000+00:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('heci', Buffer.from('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', 'base64'), '2026-05-23T16:21:45.000+01:00');"); duk_peval_string_noresult(ctx, "addCompressedModule('http-digest', Buffer.from('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', 'base64'), '2026-05-23T15:21:45.000+00:00');"); duk_peval_string_noresult(ctx, "addCompressedModule('identifiers', Buffer.from('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', 'base64'), '2026-05-23T15:21:45.000+00:00');"); duk_peval_string_noresult(ctx, "addCompressedModule('kvm-helper', Buffer.from('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', 'base64'), '2026-05-23T15:21:45.000+00:00');"); @@ -2508,9 +2508,9 @@ void ILibDuktape_Polyfills_JS_Init(duk_context *ctx) duk_peval_string_noresult(ctx, "addCompressedModule('linux-pathfix', Buffer.from('eJytVFFP2zAQfo+U/3CqkJLQLim8jS4PXQERDbWIliFE0eQm19YitTPbIakY/33ntAU6eJzz4Pju8913d18SHbrOQBZrxRdLA8fdo6+QCIM5DKQqpGKGS+E6rnPJUxQaMyhFhgrMEqFfsJS2racDP1FpQsNx2AXfAlpbVyvouc5alrBiaxDSQKmRInANc54jYJ1iYYALSOWqyDkTKULFzbLJso0Rus7dNoKcGUZgRvCCTvP3MGDGsgVaS2OKkyiqqipkDdNQqkWUb3A6ukwGZ8Px2Rdia2/ciBy1BoW/S66ozNkaWEFkUjYjijmrQCpgC4XkM9KSrRQ3XCw6oOXcVEyh62RcG8Vnpdnr044a1fseQJ1iAlr9MSTjFnzvj5Nxx3Vuk8nF6GYCt/3r6/5wkpyNYXQNg9HwNJkkoyGdzqE/vIMfyfC0A0hdoixYF8qyJ4rcdhAzatcYcS/9XG7o6AJTPucpFSUWJVsgLOQTKkG1QIFqxbWdoiZymevkfMVNIwL9sSJKchjZ5s1LkVoMUJfTxytmln7gOs+bOfA5+IWSKREMi5wZ4rGCOAYv56KsvWCD2oLtemKKAvE8g3g3D99rDL+2cbwgxBrTc1KP70UzLiK99Dpw79H2YMW2C9XcCrUh4oo2RRE9r7dvlsL3MmYYBXitw08DeG4k2txqx5CGRo5pdmLhBz14+TSJLM1nSaz5/yXhIrTKo8IxXUo4uOpPLuAPsOoRpt4zrFHH3R6wWJMOjH/Q7cCsA60T+gatAvw6PurV32LWa7drm57P/dl9/RDHrUhTI1vWZmMcUX56CiJjrIGOU28qsOZmKryPzCrGzRk5fet6czbDZ0oj/VT8fxsVUqkrPwisGrrB26V3WrBrJx6NBsWT79mKqY87M9nuN7YHaIN30tSxx/Bl80rbi+W2klmZIymI/m9G07ReVdtQd52/UQCQ8A==', 'base64'), '2026-05-23T15:21:45.000+00:00');"); duk_peval_string_noresult(ctx, "addCompressedModule('mac-powerutil', Buffer.from('eJztVk1v00AQvVvyfxjlYgdSp+qRiENog7BAiVQXEKIIbdaTeMHeNbvjuhHqf2fWcdMUAhISHxLCF9uzzzNv3r5ZefwgDE5NvbFqXRCcHJ8cQ6oJSzg1tjZWkDI6DMLghZKoHebQ6BwtUIEwrYXkW78ygldoHaPhJDmG2AMG/dJgOAmDjWmgEhvQhqBxyBmUg5UqEfBaYk2gNEhT1aUSWiK0ioquSp8jCYM3fQazJMFgwfCa31b7MBDk2QJfBVH9aDxu2zYRHdPE2PW43OLc+EV6OptnsyNm6794qUt0Dix+apTlNpcbEDWTkWLJFEvRgrEg1hZ5jYwn21pFSq9H4MyKWmExDHLlyKplQ/d0uqXG/e4DWCmhYTDNIM0G8GSapdkoDF6nF88WLy/g9fT8fDq/SGcZLM7hdDE/Sy/SxZzfnsJ0/gaep/OzESCrxFXwuraePVNUXkHMWa4M8V75ldnScTVKtVKSm9LrRqwR1uYKreZeoEZbKed30TG5PAxKVSnqTOC+7YiLPBh78VaNlh4DtWnRNqTKeBgGn7f74Dc6eb9YfkBJ6Rk8hqgS8miHjCa3G9YBXYlYM2iXsgv4dB7Sp/TXlbAgC1Xmk7uYY9fIAuLaGsl6JHUpiNuuhneQvQz+koKViXJhW6WjR/fXunVfgen0voijLvC+LxANE7xG+ZRdHEfjpdJjV0QjeBvx7d1w8p10iaPcNMQ369WIJvfDRsdMiAQn2okQy6LRH4fwuReJv3z4GLpgQiZjT+l1PJzAzQ+LorWHivrw7yuqdOInhQUyTjhpFY/6EcJlxIdMeTtjXb1BtnGEFcyuUJMb+DHrNv8yutR4rehSR9+v1ApFMwbFhyBLi+LjV/EcV6Ip6cCeU2FNC3HUO687sfxYYcW8toPbHV637jrI6uuSN9vHmz2r88iSsLRv9j70U3b/7/bDRf+y213RcIethiPLDmr/tHl3Tvpt9t01uH9Y97H/5/U/5eDibzj4zku/2sI3/o+jMnlTIvuB/3LJscYa2/3/l8kX1l4yWQ==', 'base64'), '2026-05-23T15:21:45.000+00:00');"); duk_peval_string_noresult(ctx, "addCompressedModule('message-box', Buffer.from('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', 'base64'), '2026-05-23T15:21:45.000+00:00');"); - duk_peval_string_noresult(ctx, "addCompressedModule('monitor-border', Buffer.from('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', 'base64'), '2026-05-23T15:21:45.000+00:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('monitor-border', Buffer.from('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', 'base64'), '2026-05-23T16:21:45.000+01:00');"); duk_peval_string_noresult(ctx, "addCompressedModule('monitor-info', Buffer.from('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', 'base64'), '2026-05-23T15:21:45.000+00:00');"); - + char *_notifybardesktop = ILibMemory_Allocate(28421, 0, NULL, NULL); memcpy_s(_notifybardesktop + 0, 28420, "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", 16000); memcpy_s(_notifybardesktop + 16000, 12420, "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", 12420); @@ -2522,15 +2522,15 @@ void ILibDuktape_Polyfills_JS_Init(duk_context *ctx) duk_peval_string_noresult(ctx, "addCompressedModule('promise', Buffer.from('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', 'base64'), '2026-05-23T15:21:45.000+00:00');"); duk_peval_string_noresult(ctx, "addCompressedModule('proxy-helper', Buffer.from('eJztPWtz2ziSn89V/g8IZ3cpTfT07NXtSaPMehyn4pvEzkX2ZFO2z0dLkMQzRWr5sKR1fL/9ugGQBN+gxk5N7YVTE0sE0N1o9AuNh7rf7+8dOauta84XPjno9f+dtOHPwQE5sX1qkSPHXTmu4ZuOvb+3v/fOnFDbo1MS2FPqEn9ByeHKmMAfUdIiv1LXg9rkoNMjDaygiSKtOdzf2zoBWRpbYjs+CTwKEEyPzEyLErqZ0JVPTJtMnOXKMg17Qsna9BcMi4DR2d/7LCA4t74BlQ2ovoJvM7kaMXyklsCz8P3VoNtdr9cdg1Hacdx51+L1vO67k6Pj0/FxG6jFFhe2RT2PuPTvgelCN2+3xFgBMRPjFki0jDVxXGLMXQplvoPErl3TN+15i3jOzF8bLt3fm5qe75q3gZ/gU0ga9FeuAJwybKIdjsnJWCM/H45Pxq39vU8n52/PLs7Jp8OPHw9Pz0+Ox+TsIzk6O319cn5ydgrf3pDD08/kl5PT1y1CgUuAhW5WLlIPJJrIQToFdo0pTaCfOZwcb0Un5sycQKfseWDMKZk799S1oS9kRd2l6eEoekDcdH/PMpemz4TAy/YIkHzfReb57nZ/74Gz/ez2f+jE70zpzLTpB9cBkP62cei6xrazch3f8bcrEBZ9Tv0PhmssqU/d443e4q3xeYg/4nNvWAEdkFlgT5AO0rChUYsAAiOw/F+xtJlskQLAgQBrWjC8/jBbiJxpmGREekNikh+ZaHYsas/9xZC8fGk2s01yUOBjzlDyTe/SvO54vuH63icYIUYxeUn0kd7MgVUCDx+gGUiLoAa3KEL2nAEVVALsfjOnYzJZAEYmSdeAFvIgoLPCCHKfMSqE3UbY5LGUwMC1GYYiInJa57wKASWGNgVRavYYlu0ics8tcGFfmCwlZb2ht9s6DFkO2KrewveJ4U8WpLEBEh6wfH8vIhTQHAa+AxzYbF87SzCSjWakl6gBU/YSxtsOLEugYrqb6kRU7+b9+G2j2TEA6gqhijaCLEEKRTkSr1DSwtYcTbMYOoCcgNnqGO78PsGjhh5h1JsxziIU5MsXAbRjgo3anM0aekdvgib3hIizoWDUDHMofSHA/OlP5IWAI2tKh2tKRDa8gNHjXyNwkeyy12KspLGxTDvY3GAnsVfSuEzAtDoWBcpnTr+hHy3o5A5NMdYzqUcu352cXvztmvGBt+h2CatFju1703XsJbV98qvhmsYttbywdw3hyhr6zNObHboB1+ONt/akoXepP+nSuHFklaRBKiJrbjm3hkWk1sSjPjpCj5H4L6GsTRamNWWmRZDBXtyIMWcU0ckb8P9Az61pd72F3iKXOvy5juCwJjAWUydA4+Ui8/Vh8rVjN/Sp4RvQOtbYCQ4YUz1s9XJEJh3fGXPrhiKQxQBjjg4d6TR8kuYQ+ULA9a8A/xeCg68BVP3qytaJ/t86vDPWd6T9Bj/rWhnsB72sFN4uHM8fadqQQOzFP0Cs5KKl4G8Nz1s77pR90ZuloMCrNcxRf2j+ePpmiF6sCnclcVyu/mD+b/e/vusih0FIYOQDChxVaOtBZOJD85bv3EH40NJGwCs1nLzFZf96NNLenp9/uPnw8exvn7XKLmGviEIleJi1GXEniEQevOT+L8bdVKKWgTJtf0Y0EYH+0dNaHLxi+1uXGncqdR8r+1Y6LtqjfmWDYfCv7LTUrg3TP4aSRvQe7WVaHzugUctGEw2oHknjg/ibY0XI6BV5c3Zx+nrAtKgAXIRStqtVdR9TXiIyksB4nGV0pqqGMWrQZWN2A+YtWNUxkRGAfw6DqEUGMZczwvrpGga4D6GSH7RglnTXIkzHhQZz9UWluGHtNaSJ6QrWvTy4BjoeryKRTEtuViR3kq4Op1BHBJe9mLUVgpbTLC1vEyZvBkxlWfdCv0hmrsP5B0X4fwfonoVMZF/iiKRCNgsh1JFPRqExucOp39Kw4Y8b+XByGcO81uVw9AlEOCLsOaU4g4S6bgm0kEmWM2/I0ArB5ehF4aiAblQECsXgRaxQUoFwH2+Dj7e5j7ebRKGRCmBuKf9g57v6Gq0PJ0xUBgPmDAdcM7pNNRIUKSVRbGHDfCpYLrdgeHIRhwGHCkhumURAwKCCiWodtERYEL5ptn+oAVRy7ZXVHxWqVdVJu/hkzYRJDYsqHL2mScOfmvju7O5lIAoeP6ya4/RLjPAyoa2Rxu5kfJ/O3oYQv1nbHaztNwP7zcB+M7Bfx8CmTOw2WCZNrLIdhZa1bSjDVmBDvxnOUiGODGfI9zCZpfFZmGJKqwSDihWpkdjaxSx/Faus0jyyk5kklwpmOc8l5sjPY8gFIrC33Jxrg263ju3mUCKjHbgWgKgDAOUBFAoaQm9r+AyQHtEM8wXAMiZPIDYsmcBLtb/0/tLTlIdMsVre8NyEQszQh19wuS7krzIVueBDteC9E1/qg1epA/hxTF4AK3EhBFmJn59Ws0IORVhEl1Qx1ZL0TBp28Efvr+xfrRWNVSuiocVkssV6PlQJ89RFh1oe/Rq9056rD9+iIJKcZjorao8vxsc7hkDe1kNPbM67YpFTPRKKmv6/in+Ug5wUZ0nXdRy/25mAx3AndZfxShCqKCpfUsLwhtq4jWiqsKBXDjF/Ta+8TY24p3hlr7J58eKeCmbZ87GlvZvj08Of3x2//mrxz9WVVid8EQMKkhTGQE8458zyJLPmWc0QRev/ZBzh6lafH4p0ygwBKWXY2qhKT5/qmLhsYOOl4P5Ltq0EP6JY12BKEhR+axEOi3/mTK4BENiALYEDGtfTLIIogYLfmu2DprIOwxMZJxliryXRjGF+u19HMEITJ4MMWRqBVAX4hOFuaJRH2pZ6PBxFqWKx6NOm+SKuYtj75UvMElVUteSX59WkDQdPwlTCw9gnp5ZbH0ZtK0wt1pyMhqEwxMBxmK+JTCXYi/xo/xkM9xOGycqBsq7/fgPl6s0WljMH7tTNBsat/smC4JzlDqmvz73YEerRg1IObu46wYrFrTPT9XyISvkH4PBq1BvuEMw+odElxkiOSHlySjUkArGNYiI0HyIg+k5rjkZ99BPZ0oOWRlixYjRSJz5jBDFui4lxuG0GhupRPc3FHg6GJZAw7yaNWF/d3soWFwIY9s+APIDFbXBRGPV+0pDlWrMVYqoBnMPoqTZR7X4N71XDfaXGJpYOEDwmGT9gJA0Mar7qJwq5//kzeLvvaglOPeoEhRHWO7rtsyC2HsYdsOIjoz2omSCWycfm4KkhMuOsrA9kB+JJvpjjTnGt1YgVRxJ2QecOnSSkpvFMPXVsQP3q6vnL3fntL1eJSVe0/xZFVtp9WwemsNPLVTynRfGpDwhAhNMXhNYLp1jwhc2wdqRMdA3lhkWnu2lInpSGnyKbnBZVInDihB+7Vx9tUl6fSfpUqz7htJBZ8xejXD+rGkE9VkZQMBWoCtkSG2GT9XbJqJdNFFjAzLPKicNB4RMdEipozygL2//H+Oy0szJcj2bISc8tUofAogNFpcge5dkR73iDI68+lhVtX8C0cLY4gtTBcvTX0tcOzDWofa9+GlAcOuR5q2FJHZ8uPWBcFle467ilpzkXPjyI7kEQzaCExxbzTy2W0IoPJxQIYaDYaUOOflSIHp84Nde7xiNZOi5JeXyPt47pjmypKCwgsYJMfMpntlGmsGBKm36iw3o12hUciMw/6VgiiOL8X54sklAYRR1JHsWbryWSSXRKUpk4UZuQzYIjtSVU47OzcJJv0ln2OvVKPnGayuZER2rmYdIlzPKUrncGnssSLPM4VZPN9ADsMR65xHP3HqWY5AGwa0oMlxI3sNnpdMNjibx0ngdIOklkerBS26P8HDuQM6bWLMdTinYgpBWOEWu+c+ZzOj2xLwA2zp/dgA7Teg2d+BiTimYcLwcQer5emODbkDRi2p5vWLh8FHj1/SwSH/P7PfUWh3N2iBOP0DImBquzFTuy32h2Ilw/b5H0ZnjYVd1k5DC4JtICOc3j68yAqUZO/WIpZZB2jRuEGMhEVMcQmUEqqIcPiMRrx9Z9cmc7a5ABJzH4TDxA3JESw946NrskwmLUQEXl8UgLvLA/F+a0kWckcqxAAQfLe3bBFlDwOowpntpemkC/JObwHgzpLa3qRq/WeCdGsfCUcrS/nt0jcnESpbwZ0nSuODwkILGUndduz21nSdsLaq2o63FhZ+e3xwJ8IwcgSpUA2Fk6U8rcytKwA8MqicDlVkbgL4754lS1NBb7GrEzCPsdQo52qL0k+kAuiPaWQcFf5QK2Ty9T23H9Zsb84RP6Kv35kZeIC+YrnpZxypRUMWGXLsWOOIfu0zOCGwPwophI6FEdJz6dRpGRv3DB/EBlppJ4rwArepQuKFg5nrnhkQ9To0ZgTltcYQ6nUzd5kcR8GH/eSDc5QHB4qduOCKCuyU9FJVIISQbk8lqC5w/lmx4qFNK4N0yLWSGIjRu7aDB0s9nkioqTZBuMsJ6NT7CT8w6/qQiN7DAVG+E0jMXNeDPQJtseu7KBoBWNQcxT6XIKDChwWSglSug/oDcTn7xHC50TwiAg4O40uqwC5AoxNfOhY6AV3Iq7LHJgNu6hpxspvO5CuBZeBQPEHxSbMLXgJR5Rc9U2gHi+GnfIP/25gwe1xDLZPR607SwN767B0gkntg/vMBWIlKjDiRmeC0zd53F2Cm7uGqRsKqOU1MfUDSMsRBLaK+nv2rSnztrDK0YwjPlI53jX1PYXuk1dAmMOY+1ic7TCMILrCqrv2dqm7inY7kaozyumNr5nJiLoZET/iYfvBhgm996cUBbuQEzvLZzAmoq4GO+T4uHCwvCl6AjfY5xJWKAZw01IWYp3d3Qr9wdY0nYFH6A7/xlQzo+iCm9/Of7ceedMDOu9MVlANNMi+vjz+Pz4/dXVUeC6QMeRY/uuY4H1uLoa8155V1cxnTo0uTmJw9/E3FQa2vAWn02xOgEDz/GONLTzEBZiEBlZO8ZJi/q6h/zASItfqUbJhNNpbeMwMjVpyjAxB3c1M0Nnfu6gtCW4miNGF6J2cSU5ZC27BinBvApVElw8ZdxxPSaMEVcYC2GaZhDLAJcMRgOccEtm6oLyoiQjO1kcqFXAcxev6/mt4oec8vKMi0ipABUCFV7YBWPk1budLNVYMvRtPbLzr8i/ssuQcirHnubmCLjjUW+XO824bGXBl2Q0+MG+J01r4J84VCywXUVqVFc9zA5+bw4T2HFEXgAkvleEx2hHzDjiNYm5s6rksWbQ/L+jXOnNzE1UCDYV44U+QoryoFZulCdTxrta5mCGcSSEysDgn91T1zVx/vMUKsEWrDBwBrsr7lsEu2tOXAevX7y6+sSpiwy1uIzy6gpvs3Rt6pMw4kMT/UEmUI8u94gXbRLxXKI7WU+XKGYxXuaVyNilZolxYMLmiP2Df+v04L8+S0smywaDPkTK4RbFBDIo/dFCp/VKzwv5CkJGbJeGlRsxgi4cb4z8ADTTTfnatO87nOKcKDXbLr57sJkbuFbgleLf79NYJZpK8PZa2UGTLkAsIUotPFsaE8fLu//tifaqPfs+tcRBjRwE5ec36iCI10i9SeCbFmm3udFT2v9WuvetYNWWiYi07aLu4Ysc0tFElNEUCnMjuVuopR1Hc8x3YAUJ7huqQqSGi5sqscMPNwjEs1m2ZeBSWrMuBQJdV6w544ztD0MW91UbAquV+Jy7K6pqA0IO1x8Zn0FQeZghH0uoghbv6Lo3rBbRyCBxC0JV8+zuDbZng/NL3rAB0BN7i6oAz2KpVmnxqFYtJPdaVVqik0TVQvxYLcSJnUgKu88rzlIIsRz1s/v2mEwkdsmVwVIWvuSu1Hqykth2ioGbVqd1OHKt3F1CAI7tlBc3sSkBVRCZx2KTqimMeN5+GrVt9QX7ZHCDR9pTyntjpLCuLNHAgtx6W11Q2jp4jotn9jH+0vpa9QRW5JzkXDKHwwKJKJUs3iklkhl/MJpLrPekcMs3TiSyXcmwR8osf0hmlvNzU3nhj+mx3TbJ1T8sYJMTdh1zlBNWmIsIwnLuNU4klH9XcxEuFDpLbPZLc0J82E0vPIKYrBDfxf177CVmzKirF5wZyYqlrI35KxiiaVLc8PJoPse94Yn/Blh5EJVY6lhujfItjBibwkx6TYktLvefOi1xWT/TVMPeErajQVzuGU+/gUcOXsC/Nj2KANZsqfcWmoh10RnwiCWSkKTw2PbENVd+OGkQo8CvVW77gW1TCwN+eyodAxJz6iWikWYJ4pWerMhvdLfpOmzSEH/DXTwntunH9hCm+Sw4F+Ik5jkdzIdZ9zS8NDtxx3tysr9eGVNzxejiTXR8gzaJX36eumT7JyK/HaDpjelHcjg8ackhJ7mcpTBRlr6OPqIX23FZwD0c7MMwLnFl5qK95cnLhO3l1OFuIdCMLn7rwIwnkkUGpsO5kQDN5kZA8grMKk3Mj8zlPH+9CApw8uoH3pFYRj7o9TBQwYIFNWDK5V3qmJEG7Wufb1dU5+kA8cMVCL67adsenz61YxksW4cG2NgrPr1LZY1x4HDFACrlFrGOs4+rtPcDsAWzw0oPyAAymtKTx5Sjy7hcgRSUKYFT7eci/iFLw4fDIxCGI5gcQLwREZSXp+Xdj6TzHw3xQpigUqIl/5xcwk6vtCVxpDUgNKnNjADCJN1xk7wIJ+dpcInmskKJy8C8tcmy8NGCkGX4MG1bSjfbG3jghi3D6gP51cyl9Nabhi/xWTrTAIINusGlcMyiPxBzbjsuZX5jkFmdbpEwlhikrtYnjxIn5KQxxw3u7oeDOpizOVMZdzqyqcA+NcBX2BXoY+jJpFEubBiNJAj2Yw1vmdsDaBlXOMzUj37XIO/nI5hlzv99jSQYcPGIK/xZDUlgAewgX/nSpkf8eErkipTUFKQWt8b+RveThhzLPEKP10V6T7HzJJMqLAAo67HyKAjm/ZaBKPqpkPBRWT2s+gmRAv7l/KRI+BT+tIgKFbV+aqSAtuwvhlQTELdJ/jTJqxH/bZKIwH7mJ3ZSX5M/MMLmCfHvnjC3D9PJvOXmR6Dy/wAhCJr+', 'base64'), '2026-05-23T15:21:45.000+00:00');"); duk_peval_string_noresult(ctx, "addCompressedModule('service-host', Buffer.from('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', 'base64'), '2026-05-23T15:21:45.000+00:00');"); - - char *_servicemanager = ILibMemory_Allocate(35773, 0, NULL, NULL); - memcpy_s(_servicemanager + 0, 35772, "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", 16000); - memcpy_s(_servicemanager + 16000, 19772, "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", 16000); - memcpy_s(_servicemanager + 32000, 3772, "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", 3772); - ILibDuktape_AddCompressedModuleEx(ctx, "service-manager", _servicemanager, "2026-05-23T15:21:45.000+00:00"); + + char *_servicemanager = ILibMemory_Allocate(35777, 0, NULL, NULL); + memcpy_s(_servicemanager + 0, 35776, "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", 16000); + memcpy_s(_servicemanager + 16000, 19776, "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", 16000); + memcpy_s(_servicemanager + 32000, 3776, "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", 3776); + ILibDuktape_AddCompressedModuleEx(ctx, "service-manager", _servicemanager, "2026-05-23T16:21:45.000+01:00"); free(_servicemanager); - duk_peval_string_noresult(ctx, "addCompressedModule('task-scheduler', Buffer.from('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', 'base64'), '2026-05-23T15:21:45.000+00:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('task-scheduler', Buffer.from('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', 'base64'), '2026-05-23T16:21:45.000+01:00');"); duk_peval_string_noresult(ctx, "addCompressedModule('toaster', Buffer.from('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', 'base64'), '2026-05-23T15:21:45.000+00:00');"); duk_peval_string_noresult(ctx, "addCompressedModule('update-helper', Buffer.from('eJytVd9v2zYQfheg/+GaF8mdK2d5jNEHL00xY4UzREmDdhgCWjrJzGSSI6m6XuD/fUdRtiX/QPcwvYgi77777rs7avQ2DG6kWmteLixcXV5dwlRYrOBGaiU1s1yKMAiDTzxDYTCHWuSowS4QJopl9GpPhvAZtSFruEouIXYGF+3RxWAcBmtZw5KtQUgLtUFC4AYKXiHg9wyVBS4gk0tVcSYyhBW3iyZKi5GEwZcWQc4tI2NG5oq+iq4ZMOvYAj0La9X1aLRarRLWME2kLkeVtzOjT9Ob21l6+47YOo9HUaExoPHvmmtKc74GpohMxuZEsWIrkBpYqZHOrHRkV5pbLsohGFnYFdMYBjk3VvN5bXs6balRvl0DUooJuJikME0v4JdJOk2HYfA0ffj17vEBnib395PZw/Q2hbt7uLmbfZg+TO9m9PURJrMv8Nt09mEISCpRFPyutGNPFLlTEHOSK0XshS+kp2MUZrzgGSUlypqVCKX8hlpQLqBQL7lxVTRELg+Dii+5bZrAHGdEQd6OnHjfmAalJbkivN9qGEftVuTKHwZFLTIHBMYybeNa5czi78wuBmHw6kvmcDRawhC42iLGO8eYkhySwcsAXpv+SZ5pp4loxruNl2bjZQwbF9fB8gLiNztW/3D1TiOjXKJBws1XrrpcHDRRaJDjwdita92EtvS18YCtActPJN2Dd4su+vi0f0Kiin2ez95jgRXVIyZAhfnAe7ZCbcVS/7dUW7l80MTNp0kqFCVN45v38PNgb9ah4h7VAMbRo6BuxMx1eCbpJhHWuGkhwGbao24k97SRskoS/+7hZr/EyuDZwFav+xsH555cjsZ2y1QYKk9GNbD4RIOMqaX1slMr+Ami51p4etGQZCwqVppriFbzqC/YAVv3ZMxmC4hx8ENqZ/M/EBZPnW27U/2Ajs8/cW1CIqjxyVPPhM794rSRFHHUcCVJ9t2267KDbPymC7sbqCPlWpcSbVuDbu/9cfnnIFFcYezjn2mQIx02rfAHkxUfj1GvfQ7q0++WWlRc/JWuRXZipE+7uD/UR8rjwOmwt/4r3EkGfbAzAjX92GvHo1TtmT7z2p7V3Rc2yqXYz/ZOfR92Lz92rtcmlG+H3a24v2rDYOP2lzKvK0zoSpHauvvr1f8+rv0LNmT4L6QVhQk=', 'base64'), '2026-05-23T15:21:45.000+00:00');"); duk_peval_string_noresult(ctx, "addCompressedModule('user-sessions', Buffer.from('eJztff132ri26M+3a/V/UFlzLuaUkJCmX+mhs2hCWt4kpDeQ6cxLcnMdMOAWbI5tSnIzfX/721sftmxLxiak7cyUc6YBe0vakrb2l7a2Nv/58MGeO7vx7NE4INtb9Rek7QTWhOy53sz1zMB2nYcPHj44tPuW41sDMncGlkeCsUWaM7MPf/ibKvnV8nyAJtu1LWIgQIm/KlVePXxw487J1LwhjhuQuW9BDbZPhvbEItZ135oFxHZI353OJrbp9C2ysIMxbYXXUXv44Hdeg3sVmABsAvgMfg1lMGIGiC2BzzgIZrubm4vFomZSTGuuN9qcMDh/87C91+p0WxuALZY4dSaW7xPP+vfc9qCbVzfEnAEyffMKUJyYC+J6xBx5FrwLXER24dmB7YyqxHeHwcL0rIcPBrYfePbVPIiNk0AN+isDwEiZDik1u6TdLZE3zW67W3344EO79+74tEc+NE9Omp1eu9Ulxydk77iz3+61jzvw64A0O7+TX9qd/SqxYJSgFet65iH2gKKNI2gNYLi6lhVrfugydPyZ1beHdh865Yzm5sgiI/ez5TnQFzKzvKnt4yz6gNzg4YOJPbUDSgR+ukfQyD83cfA+mx7pHPfaB79fHhyfXPbetbuX3Va3CwiTBtl6lYJoHh4KgC5A1DnEh6PLD70uf3G5967ZedvCCq63tt9IMO+PP7RO3pwcN/f3mt0eBdiuv+Dv37/pMYBuq9drd95KtbzYqj+RoJrvj7qn3fetzj59uxN/ddLqnh61ZIDnKoDmae/4qNlr71GQ+nYchiHSa/ZOuxIeTQF0crwHfb38r9PWye+X7Q6MDFbFBu16a2dLjFzv+JdWh4GxV1tbors995PlnPowMdEw0me9m5kFz2JwXYvObXuAwALV1skJzEi70z09OGjvtVud3uUb+No6oUAC6l2r+f7y/7ZOji+PWkfHER5bHBc+Ob3uJdBq9/iwhX87rb0eEZ8GMWCAKq/SkPvtbgyYQm7LkCfQZi9dJYN8ooBMVskgd2RIQWaHx29hxBN1PtVBHhwkIJ+pIfd+Ick6n6sgTztxWAr5QgUZjUHv5PiQQ75UQe6dtJq9VqLOpgqy1zo5anciYAr5phLO59vT9v5lc29/jy2py+7x6cle65X08k2z10Pqfd+CF51e820LEW22O7D0ZDhprt8fNn+/xEXRou0M504fGQyw88l86rw3Pd8yBmZgVsnAovzH8ioPH9wyro4VBkjLPiCLUDUfGF5gRKCvIkDPCgDq7II/Ag5o4GMb2TerpMLe8MrxYw9BeNF3Z/ZFbWI5IxBEr8lWhdxifbXZ3B9HAJVX5Asry/8AyNxziAF/EZMv2EOpj7hS+Sr0jahXKAxrl8dXH61+0EZuUwYR6W34HLL8SlROpZNRtj5bTuCXK7UWfmlBx6Hntb45mRhYVZUE3tyqRJ2q9T3LDCwKbZT7Y+D81qCsBZi4/U9Z7+eOAsIcDI6sYOwOwvJVEvbb4MNHx4b1lgHhAGpqCVvR1fMoVdEreTjZcxjMoTnxLfmV62hxTBTFcUxWjKW1uCmbZhWwKpC+Zp7bh6mtzSZmAEQ5JQ2Y8YXtPNkupwmS1Qjk8Bmk7jvXTfcpgprC4hmbE3gfksrlW8uxPLt/xF6VK6lCn0D4W5Mn29hduZbaHp3zDoj/z9Z7z72+Mcq/cNjaYJJVFS8qZvKtFRyaftDyPNfLXwoYFRRs9rH5PVgF7sQKBZhMeZmV7E1c33oHuszEKkeTQIt5N9EPabyjKheBn2dMPgS+ObMVYxKrKd25ljOfWqBhi175zSKl/2tueTdiPBykIqqmfShSx4k1AoU05EgdN0DFkNZTpJpTZ00VHYB6fWRNXe8mVupL9BXq7I8NsBgqyrn7Eptg2pA5+Ayzk2cemxRSS9usogTSzQksdfjddAZtB+wBc2L/r9W1B3nL742t/ieqm0G/r8CAGtuzvGVxtERTyQIoPvKtaAap6TN/GWv3lkzpl11SFtP+3l3g3AdoD8XmHgTRGMoO9m1/hjO3S+pf8rVSPnW8ZbWna/JmfS/I0+sTBNzR9JrWkkRnbg8OPHfaBfvNGTW1pdj7nnt6SuV4KBzk58YIKlMTMH645vIr5eNyudo81alfTc9GC9WoP0uuM3topAozHBN9SYNp2qBoVzlulRpFEMyASrzdRG/wIylFWDKB6Jf4TwsE29IagazcBYH1484nA+pT6LsOWLEB8Wln0EbH7qS4zxclW9HNIIwGp6aCokMjjY5nlvOeCf9yRVVOudClUpRVaFiqsixIUFpGEhFFih+CvjGfNft9d+4EwGx04kWLd4+u/zTaaZ6ewdGjn2qDJFzx6Rk0yk8HT6yX5tOXG9bL/acbO1dbWxvms6vBxnD4ZGc4fFp/9nTnRQy1pXZNZnPmc3PwYmunvnG189Tc2Omb1saL5+aTDcvqX13tPHthvrTq6eaU5lFmO8+G1rOXT58+23i+tQPtPDe3Nl4Mt3c2+tsvBi+fPBsOzJ3nKtHARXQ3gIlC4j4rMw0LeDWsJscBC4SqteIH1TPwd3dsDtwFfgNu3pch26hcwd9DZNfoR8IfJ5ZvBRTaXTgUCuRj+SLJNpEu9yamD6gsXfSoInApC8th5JnT8i7ZqqoBm8x7hwTfMacWQNY1kB9c7xMgvQ/qcj9A3WOXbGtAj1tHoHvukiea95F+ukt2NDBoAnKMnuowsun8RKg/0wDuu1PTFkDPNUB8IumMA9gLHdjEBuPuzdyeDDpz1EUA9mUmrBhX3RQwKHlc67o5YKAwq4M5WMA4fHXdHDDQd6Y3QKcrg9XNB4NtDgboHkVA3aQIVH0wySiiuqkJEQ3cvjtBJxtC6+YHV0bPZqOkm55Dd+Q6Akg3OW2n706BSN/cwKpFQN3MHM+DkSsBbusmR9R4AMuIQermRlQZQWZPDS5phFq2SDiYbkoksNY1AmqnxHWG9khUp5sKUDzsAV1TAlI3IbxhTjW/7iCsdl78E7BXQhMOQV8mFI40C7b9E9cNZO2QPTGydUKQQnMQrJ4d3GhU3FBTSymDUtla4L6ZD4eWZ1RquIdhtZ3ghfG0Sp7GpYVotjkAMsF9CxMWsf/Wc+czTfPvgUoCrPdVuhYTa5H8FkldVXiFuCKhs6sMqSNVYNPkCfz3dGenCnIg+X8F4kxpfZRLaUWsp9Qo03QX98lGiu4qO6Qy9Aw1krV9y7OGBmjarHkt0hrERfustDzdqIqdAtpPtg9bRoVVSW7DueHOrnSNikexznFL1MjozBKln1sIFBO1lkgbHFkBV4SPFw4To/IyUrw2ZjlMLajDmU8mCrJ1WAuZi62+tb2jIvkBFc6rlsaWmXg/ZD7oJfVAJakyqaUeTr6u1SsKnrvFdAW+PQjYzlPxstSrPmd7WVu69zl4T7pk1JfQMJOMKkO7EVcFpZEgBaVsa2KMIwOY+n2ZQXpg2hO2RfxvVJwJd/USG/0l5DGrLO6nYhXG2UXS5DPGVXkXsMrGgnKGRiMHM0tapZFX1Bir+Fe6O9QOIBwntp1It5RnsZ6lFrliFoFECpNHbHAUNi3bkYk4Z3y7s0obrYJKHiPwtTSC6nw1Il0qeTIbkYg8cwzkSvRMPE3vKdGzck/yYZDornJVoKj0HHghtgCS/D9J/ym/A8rKELUIceR41RTfq3Leq3rDGVQR95XoBUOKpLcxOK3LP3N5sRC72qUPqg3leBxr6YnSlQZvbmnRXVbBB3tgbZ/2Dl6Ibu+KiqQ3uAB26b8ZCsGXZes3g43EKEq9svKxn8QOaohLWo8GcX9iLoS6HvDImoRCoIAw/IgxmPAwWz9g1L2CynuFJtgJ7Y2Vj+PpFjJulmRs+eDaSHRJLMpqHItVqJ6SO8G9ZfSrZqDBxEBiquWtv5ra+asYORgthr8gKP53K9GfDL4ovVLMDVtGDKBmorFh5K04UdtVDcPQktQa0qiYu2hry4j3LC/5p2l/CeH/oPo/GdWHez4J0g+5eGqs7kxhCdRk/k/r7rNt91OqsUmBOuLpEo+FpOiFQ5O1q2/QmUrvY9kDUHKvD/gHFAs6S0a54165gxsycUcjoDUbdxjUdqUR101T/YTlgtqPk7YnxWMjc8suFtmiWntzVD/jDu+a5AuuLFnq+8KUlFFjD+8HscixnIna3tzzLCfmyuKPjP5Vzh3O26TWgW9nNmCzAveh+mJh6yLFc9KhGQbzKVFzEFCrspbWwlnSjS3lKWyhLOUqaJ/xiDeqX9rkXwzvDB3wFXn82M7nHeNzRAckIaht8k8xpGIS+LR1qW7bIDvkZ1LfJugArlRJblCFSoyofKRKcchIdiluBTRd/HysSZsuUJ/UraXo7RDcWNF3oxKOD9vF0zYfek5i+3RnRXB5QeiOBNmp6AfgQoEAroIQiQYR+4IVnY/xY03imVoG87Emm+F6DqhAiDWyH3OjrdCExMsUjSh8m4w1nUnVXkDzH/MZR2lpHFsfaYWHRX3WBtbQdjA8ZWZ5wQ0XzlUS7c7eAqFP5mD0+WN3wZ4eOxMBWSFfVFwNuDAU7F+Fwl7jeNUoA9EvrOzRaOJeAc1dOu4RjIw5st7PpzM9m9/cJB8s4vAjEz6MAwHz2SRTVpjMoHQVzxmQoRX0x/BmYTsDYJJjahqmuTsveIkF5RhHKLbB323gO02QAgfhpR1rEavQuMXjKLCWdtXnEGB80/XUZiYXgDxIJLNVGjpqXdtBLGy07w6sMHSU1ReSUWZonSGXGC+cWAxsNhIIHUNinNOHKLUGnR6nqDk97ze2NRmwaR647NgPhl+PEeI6IDSUGVQ4d0ZmsGBBdbf6c9O3yMICeKcckIUJAFARiswcMWdKfIaeO6VtyjRQZsFpZdqmOWdtQv+I2Q/m0NgNntGhhey+5/qB2f/E49nA8pj38XySGci1UooOQaCjY3cyAPyUKOH5HzBgpuZs7HrseM7cx36yJVkj7SHiQ3vtuIsq/sDjTwOoHOOLsYIPdL345Hk0bDYMmA1FAu8GK3NwaG6IPZ1aAxs4++RGM7EhBEyrbwVt8dOIaMS3JsP8W1DQxQ6sZTpGgPrY/GwlV3iVddAhItQPsacj0LeAvYXd49zG1+91IWry2sH1lHxWy454jdWB9F3VnVhKc1HxiTXJwxpptNI7Oqrpl8uoWYGUOgQKtFOdCFW1i+FNa0cqK2aqIH4YB7V2/JRBVhmIbW5yS7cGFqahn9saldT6Yda/Z91U6fL4+cK0mZSan4/F898xLj/1R8v5vL+wURojcI1Xkn/V95EHqeTnrho+2eACRsicKtpb0m68/cRRrIy2xUcWbpYwyFA59UF3BhbvSHwQJ8/PQDEnquKD/ItWeYYDMKEDcJFUCKypHUiHVtLwWp4kf1Kko/pcgfj6tAQuNczsHNtfZqCl8z3f3VDTA4tLRlpZ6OCg6PzQsQiPi62hQxkDl1VUcJX4yd+vxFLAMjPnkyDH2Mniopw+qHx22vmlc/yhQxhGF8zNI6G4ToqJn3DOgXxoTc1QrG5MXccOcJ+TU4F/TYOAD1ut92uhhCSiiePU60KYVXvZgSXQ7oB20tzrtX9t3WMP1jzgHP/7xj11UP3u+K+TbcTQTZ/uz4Esug8Y/xaeJKGKqZ3LfGsQ7UYj4v2XY+saJgX+Lae2VXSt4iFlaJNVwN1A21vV+IMl/rqtrP1M1Ufwv1gj6L9+FmskcJk70uBdWpuopZOltlTyIpNjUpO9pefBkwOXv5qcfYv1casAmuKzZOGY/UEfl35zL9faSX7yrKXkh3alfn9d4Zbh1+3P9v31591x76v0JYeeuUrV0erMMtnvYaEuGd4rE/MY3Bxan60JDLNyORcYvdWGROkl+MG0lkzdgB+dgcUBdsafnnHJ3en86dmW1Jv99tFRK30sNs/nO2BeOaq8Jwt0uRGoK51oMOYXiOeOwZhRDHdRpgeZ2M78ukz++IMoXw89y7ryB4r8Ier9RZYmpjw2/UN3ZDt7ATLcpa7BkRXsyglPcrsFowgLqUU8gILnLtK5YSQgvbeFxnuM7clA3gqkDy5n4ox1zbq2+gf2BN5sXtnOpj+Gbp6V4c+FbgnQGmp+MHDnAfzBGLhyOQ8sOl2Rmcc398Zz51PoY8LqHjcIfRiJDtW2XaoF22FHOIzSYgyyyPYx7MmGZibkD2IuPpHyLVAGGC/kp23ypXzu4D7juVPKrnhh2kELALVGRXrSGqkRqkE3puw8UamkqSdjfostmSxyLo0G01N7UKomyTCbbjXhLdqDQQJgGoUlwFcaDqeBpCOmCblYw2pf0hnWEht6eeTVkBkKBY3MWgz0oyIDzu2BL2ffUn3uYfmG1aaWcJ7Vmlqp+VZprFHL81SN4uOVG83RbMQggNpxTx2302Gy/iBQa/n83CmT8v+UiZYhaCqLuEvBkuXw3dD2/KABrCFT7ciqgTK2oVG6BRxWrsRpsFRxP6HzBZgHMoz/uUuFmE/ObtRf2f9yXmHQ3MoV3a5cEj+sV7RHZ/ZFtVkt7d6lV/hh401K//DPz9k/u+QW/sW9EPwhnlYJ/DOw/L788As8plNeJc2zJxf4b53++/TiblhxOqoWJqRS+O7LykQsSPBL8bEtfeHLrlDLQoLnaGypFMdPLGlN8rPEimRM//90jzvoNvUtI8lhl9kTYmcEQ+HqBq2IJeqxhzcG1F6lEgWs60wDP0N3Z0lk/ne1XZ5UKF+s5u9NRt1Ro4w1XlhWrbPxaIGEquzE9oMw7WVSdAlJVHQNC252VlwCDazJKoJrXaKGSZjtlSXMKoIlIU7w1CVgT1YTKah2up/Odi4aMIw0FNV1AtBtMc/ACtVFcgmlkQg/puIpJpLCwF3FK4xvFo+PHeyneAUaawweBRkQAB0CKsjwb53/3V5JmFF6Ki7AyoUHS4zURXFhmcN4jErGRM/9CB9x1KB+NxFEq1kCQw9MSIclaLM8CTA7GAEkjIYNSwNMX2Oa4Lk41Z9VeaYMxEq/P9lH7VOQ/dxRQ/7zP1nvpbTIK0/rYowyU6rudVZlOSrED0swgHY7myV3lmu7lPfzDIpe1FCfhUkaWNfHQ6PMc0KRI9MxR5ZXrpDXQB7UMhcF2Gl+EKGjwbSsfjPB6xW0b/0BvFpvnBNdI20nMKClClDy1HZybioU2FAQTp1YY3ldy3liqLJBMl5rXqlz26Qfrlnn+6r+iHv1Q2gbiyRP0vsw8qwZKb113KlFEosJnQsYAlVSqHkbB7uSS/PJMpdmDkOInofRuy7LZWRvBvP6hRStKVARa0pyXS8vo0j88vemNjlgTm7sruQGjDiTtPB7uQSvgcIiL07n4BUX8Vx7twFh0H3RnYKa7BCUwMdb/6JBe7aDpR/TLCeMRvHtK74LRL7g/2j7P8j2r0e298UkD+klTD+YpIraRAWp0xpyRmf5XXiwP568gD2hceBoO2YfUl8jiefZVrw/58/SXYLzErJDMSpIbuelGJEJGssgsaUWYbSrpiUD1SFWLPK6EV7BEqVHSepz4oi96AYLsJY6VcYjXeTg+LQTD4GQj4NH38Jhp7txl8cOC2m97GMuR7GLlpECA3HPKlqjZ/HBBnhN6jkSCMTtxxKGduDJJxJG2obHGEf2Z3wxnym5QEjM8Ttm8sTtstFPL8BvsHK+xmK5T+/o0vV5R59oQT9oAd/nXfydq/g4c/k17+zLXIP/8k/psyzop8zlmyzojyzmg8wlZVbwF/LspcqYBZXvMJev0E/7CsN5Vmk6cR5f7rb3AZ/XVIwlHIa+cBgqRucH311ZKwq5LmbZEFyXbMwIy4uCShKd04+uDZiQcgVVJaHAU5iGmkVzozMXo2bUZThglTrMKnVysUWiCiXQbmoDb/vJAb7GsDZpRpFSZM86kTGbs848cIVXdlKlyrZOlmtRm5ukhwF0ZGHiHaeE9VtkklumdfF0LCLTkA/zNHfUulIuzU+d5DOzaGBPaUFNCNaK2t0q6UtphgcSaiYLi6XOgPHBS3Ext4PIAYLJKMyRaS8fX6hQOcTVqI6VR/vx41XH2rcCvKEBKC5Toa+Sp1uZ9mmcoNeQQk2fufyHICikgGsjMUWoJe7cPFoSQqky2tIccDF2M0UE90sKjem29IpKAxOkgcmkgYldDHVuU9ZrlaFb4hvohob5uv5zCUPEShWhFAol8RVQaFj+Swl/nmeHIS1xKK3CVPSBtbkGdw2RJCtEkBSMHLlrxIjWiloSi5g7QmQtkSFai8pgZPd4q/K6ITnTc+NMdBGTWapOsTAUbU0+SxHYKPHcpflnOIHJ/9v871kAi3Jzk9oJvFr2rjBWeW1MlgqPB2uu1/AM4XkCxSJWaVX0v+BgZkbT5NVRNbC5AZdF2hSPsMkVWXOHqJgsSzesWvH8XizesMPfw07SHaIbv0lI5XdhwKoRyWfE6ssW5/CrGrP6eovAAgLQfucganMrf2Nr4Qh2ni05zZafrYnl0gQD8aVNNkj9IkxbK1KVKppQJ1nlOXbr2Vqjej+owY8OLtUnlZGHmm4xnDK4acYo4ifMt/zJusEkl7hJpYbMCLKCQmdQ/oJmND4Nd7LE46qc5RgeVNmi3ZUyxc7pVR/R9qchyqrzHosPDi1AQT9NL/A/2MEYhFvgb5YrSNMgay2YZlGVNtox3/VhNGSRGDkTyyXPA6o8vp+ZQKPd/mx7mMATuu6nbBIuxGB2sES+k4BzKftwmBAei4exn0r6ZmJQnsR5bPZEDTPMwS5mUb6DlU6k1A6D4goWwP72eXi1gRq0BJMWFKnh0mYczpluuKIzoGMOC8149q9qmNKUn9hUXJuR9JfIDWSclczehg01iyGqEwukvryXZtHqP2AJ6gpS1ARaCVDJpjd3NueBIvuwui6qDTAvUkwfAHM+OYwa/FKdS7r87nTY8w7+y1xVLPFj5qlDG9ur4U1pB0SOcbjDdrkGFdUKlX/Gf0mMnN10mo5mYc8NZab2yFGYumhBvO4PRynCxoQkqHF3b5w+0LcV9DepZolcA99HqmmNuQXKGhdReHFfMjs2fqQLCoAhAx7aZPOsCjx87k7mU+c9E8/DEXVElM8DvFMsnq+VldBNC01IQCHOti4oG8HcL0ftTplHmdTgu6xQceB6RvpHTZ3N36I6m7+tUKfARorCF5VJGRSEfptX+1LdMkSh5biYlLua+eOgExENChddpq/6PtzRX32b8Kv7vyMDARQmkliFwmhDIotOaaMhVG80zkucns8lK+inbRqZWmgHTkU1S60Mdkbi5+XmCNlNbpkkr5ihqZJ9meexJ9+A3r7PyL1YJCjO/pPXjSgseUjQBbeLXjgHnXQ/1eG/J8XJID3C1A+sygailweyLKqqpUIoESYOigTaSA5NTUgH5pyeOBcCi12lUIpxas6cz8IHaHqFrBmHKvpkyu2cV7dd8swYEkFTQ+UHGf/Fyfi+KbcuU+5W2kRfjVypwDlNkGz4cAkbXp4i54dycOeVlDpNIFbSuVhKKI/lnTa89F1sOD6vXlVLm/yIy9WZefGoUXJcOsGy6sAW25fzMvMOl2AhlvDfqggTP5f2rM/+4V/gKkUXaMYWck51Y7lDDsyV2cTsw1BUL8rV8kW5knltHXMPJ2k6eppB1LE8VtJFiLe8+C4MztyCWdOFlycdVDIGMb9V5rriUUuNZH80TO5HMMjdRNXMJxsW2XDRI4d/ZuxPfxqe3UFX3F81NjsjquAbx2YbbD+50miUcAJK9xAlSciU+vgiRDd3z7Y2Xl483syNKf1c8iycGE42vwJyjKrEzOsnverJYavztveuWLUp7DbMeTAmtcLo0WI63B4/E9htPCtWr8ibxEITRNTAP3yWOooNSTqQ4BqxST+ehcVjEQUYSSCGt8p6IkILiiFbJOyd5At4/e7C41MbYgqtlEm5LMGb2gNLKJd8g+d6ue0mJOpZStTIOwFJCbr0ZmJ3hk/8b+wl+LPLxfROyncSJJk3DKFEFAe885fVZD3UsZDw3DgKMxaPec3FL490soNptTQLfHylNfBSY/xopZyfKixBaF43GvWKunHVTq2mq7fqGpZJgjDUtGhp7t4uVu4+gj3WE6shH7MWC5idYJAOuW6p9wWWntHOTyLavEzZAQqxO8WR2+r8uwU36DLCAjKQWr7l8SMQ+Ucg8tcMRMYVyhUQ3K3jX2vCam9QJ8HdGDlvp2Bcs2KpqDfF74QJqgGqKOcVsMsZ8qyMRvazzsZKxx5+BB2TnGIrflgrb6zxnyRM2dcl8Usfyu0WO5Qbju+PGOc/cYzzV2Hqwl1ylpVvVV30MjvPem7muv6o7a8oDhVB4AWHUduLzCJE9nT9wy9V2WxUncLTyD6XOZKda8t/fdl/l9j73ISpLv5Vl+WFblnez+AWOFSQaxRXUAKSIGse7lUM0Gj/fcV0wOHu/MfG1quP/8JgOq4ePH78cfWMtrgV//FCDvBjugV/Tg9LaKLFxScjpWlGyN6S0iw/8HXSF5ujV3rfbEaTd10Kq55joWUzzrJkNImfVHBb7JALztvqY5AKwd/cJG8sIEMLsyT45g1x3Ct3cEPYtU4ja0BcB+xvKyj7hIY8YxYF38LrwUCHwkQLAGmSt/tH6swVSNyYBFOcW6D3IikiL7CPslLKb47bwOegk46s4Lc2fDWggmTv6VDT4jwsFX2/+KBGN29cYDg30TO+O7PcF4zVUswbRQ4kxcZzhJxoPqPj56dHzSG/iUEjvju16H1aVbxo6cq8mtwQvPOX/NrZy2DUX+PGsXvW5WMNf+1rIO7HX6auOdf1DwX9Zpoiha99WNV/pilbVG9d4aqH9fjS9DWtoHrftycos/GlFzoUUWU18IWA81z8UFwxjEotvWvojtc15Lk6Lusqh3u5wiHhATpdyQOEn/yXHizRf+m+d647DvKK+GzFFFY4FnjUECdQkpJeOpwiC/zwhMpdtOqEXqbXxPBzx9T/IocsV8i4NgZryhVUsJbcWaJXCsUqfgBSfI2+iX23d6C7HLiTAT1FJ58Ii17gWEUFv0UARAbM140vR6cgLBrmCEylNX5290MxOSyV9HEq6UBx8lifOGc8/zGH8hzO9ZNYX30SlVvq0i030qa8dp612ajxFHc5RD1PDmpBG289dz5TEEf43Bj9oA4ywtGgxDH60xHHSBDHqBhxLMauObVlsmBP/sbH4tgAfA02rlip7xOh/PxRvjBEui+lGD5/YaPnLriZWe4wrGq5DyX7snpBem3nszkBqsPqwRS0+vbQtjg1siZJ1KZG4dJdet83fYuUnfn0yvLKGjxEr8PrL2jDyTQbAgNcHCXdPezZaDDtvBAawsO9eqMuTbKha1TyotfCqyhgFWQhU5MvMgCssrIcxBuwB/JB8ULjTu2iJQ3KbWGNxS0aigcsfEPdcfYacSjo+VZN0Xd6XYHRr9xq75VZV/Dvio1I3gVxEIafgKFX2PGTMFSK8Zkif9Ara5jzTrnFTuW17JtbchGTMsUpbrQa9qNGIqVpIpXpRanwMbSEsM4dMp/nsFqu0HnDSm6iadssGDk/tJ1By/nccjChsiSx5Of5xNaV536imqkJHEexuaBJO4KvZlK2pqSoTA0/Te8EbSjq+Zh4hjQU5hOZ5UrwlNULPsj65CkTuRcwegeeO4XOGDOWkEntCKIuqo+IoWBwNNVSElcNvvixhwa2fRYvf/bx4mK1fGPpeqBbmhaKceCVUu6IKcGt5AxPj04Aa9DJjglGIUbbzX9i5XZZIp9CnqAlqbAUOmdEbwnNM06IeZKIp8g7f7YtTbfWLFXxs/o+2fd2Q1xGc4mULzhWmygqZ8y03bScz7YH7YiNsa0y/huAeKUClcvY0nlQip3IvtUIWPTrvq7DNwFYLb36Eh5aiQRvQxa8yszi4iAeP0CIRbcfMyvZYO+oGRxLMA5SOW9wWdE85ArPbrFMkKtKc/zoMh6mpXoOHNJsRtGEgvMsP671N1rF0lluwBvTTaMiKy2s0PCIPeJJlX6qN85L50CwP23zL9yrtIW3fNKliPm04R/614F/IjcEyUWv//Ef6tGH9a7UPDwpJZqaMpckZoupSjxZWm7aBKyiVCN2mLOkoTXQUMuAQjy7Dn6rqzSJ1TKWaFRchXZr0Cya0Hy2UJxzn2vKKlaEb/3V3Wpg8uGaWHLw82dS2jCvCTXCcO2krURpfc3FHZPRChNe2m+RzycMByyScoon9xGJe5wLvuoURE3vgXRkj3HudUY5gNrEmDhZQXAWrrbVrAG6xHj5dWnXolrqg1IsXQ7OxZaa1gamt8DbfxjobWLN/7jpNVFztIJtvnMmXe4aLTyu6NV5IqsqCDAQcVBzeGzZcmiIDOWc5yXjPNQE8RHLkLby1kqOG2E1EZ9iwhTpY/OKCbGR1t5Xba+19//eW6+2ar81IpjtKm5ZReQCq3ZEyQFzT8I3lneSAeMLJCH468ynSSpiT4XT7itkp0xsySdp4rvckI9Zod8l5XyNPEwDvz8hNRoiSjZPaWLQU8f+99yCJSzrF0maxRMq242G9K4iqxzr4F8aYsvPtQBHrCnnNYb5vEb4yeWE0sYqOG6gueNwiXPqOw1d+LGOUuuIzohP3gO9mt6NkIjSchplLKfRWpfT3a/3LLCNTyn3DmslFbqx2lpZmsno76uCSEmAcA/xvFa+B4NxbeybrMK/E9e0LCPQXNGpFDJTxckTOormwt+X9DiH3MB7ELiqsSmMKNld2Dno4pjtQ//7gevdxPMYi7Trd9Bqiyb7+bY8EYeHKxBsoFblium072vkg3PfowSJk0xJkn8p1/AflIr4l806fhM65h3pNo/ucb/5ie87EXGRAIu1uO4iP3g1dSKEOnI5FdH9TYXXTzooQltPHBRREHo8X3fk+tZnc4ul66YIKVPNsz/CS4iHTlUJvNUmL601y6xN5Zy/e7r5b7SIvjcyTg7h346I03S7NAv9qkRsD3rm1US2KJcIhYCDK2OQViF2e0BJHf58l1S8BtqEKdNTQ4b+K13lVJAa6UTdzCwVQao3FGO7n7ToWT0sUlXfv4aUcMZgGdtVrKZYPz5K+6JZ2zP2wPS8iOI/hogY2s3Q8AAfLYuLRA/HXSgMEntJwyuQDLaq0dNo9VX0+1CKcTjD6i9o/TkL2AMEx2KKAvk2gWiVWQt9b+55eLBDllexuwVVW7Yyk0y+FHwgxkbufBWFYAoTk8q6szL98ldlDAXXOx4EDVdztPXJ2MBSewJFziMmZhQyCgnxflPMZDZN4jezqqHCGz2Tr/3Ankwiyx1IKhydOvk5vIGTgBnVdsz4na5IthiRr8VMd79rZmYYbbrV+0juMjQyx5bfJvwouk44Rkg5xrD4nncehDKvN9YMzDLFR30PK8Umz02sTF9Kr3h+Eyvm24zdtcr1K8X54hAz1dY7TsXCdp5slyuYZuUQ4z+r5MjsH3er5MCzrDfdfVY6uSUfBLEAc/h5f75MHCYUUrv6wt2ZuXB6KMhqvdbJ0Xd5lU8Jx0y4kDZJWbr+6vz8um5hsCX8OS9V6V1+y7xKyarv5ikFMsySEYBXSkoIkQ9F42wOHoDegkzOc92gnKUNdK3JUKYj/H0PzqBItYfFtzH/E8jxZK+XBFKsIYIiMTO2fwKTJ88Ne5L3/iQ2kyzVU7qZkCtRWMuZTy0PWPFp0jEYf2Ok44PogRPPndq+JdMEfxSjPQqKY2ItRBEjmjvPoldWf9R3jymYlwDoTj7z+6KT51ZCmI/UZUxh5HMssamfAeTYdAaTuKs+fMilgBahmYSNwsKW3a6ymqTqFtfKDQklDXEo0rgr0WIDYOhsgRlGXjM7ABGQgMJQD1ESSsH/w+FJSErfnXt9xIZjwRfLr5SfhVlmWOAnOqlkM0LYFqjr+UnwYDoLOWX8LuOwyUTnUTizd6hqcN0iUi4yFw7gy5LWhBUklzTgAyhKDey7UxOw+Vnx7DGeGyjjDaxlmiA3AhCqrUKveMQG6AwaYp6g6CfOEgxHhnYRHyFWND1C4WDzBD3SFLMv2uvrYXyAdYflZdUpmsFwdUk8DgriU5mCRlbQowa9gZwzRjnsBuoULdghJXAAPlcoIWWb3bAb+Mx2Btb18ZDqmVFIEs0PRLDQGdhJ7BLpyA2TUbEdViw9q8RawQQo319LNMs3LIM5Dmiq1pgvI4EUlokUlXCTiwHx+Xz4YOoO5mA0Wdcz1wt8ztqRwrs8xRyt/v8DoYSWXw==', 'base64'), '2026-05-23T15:21:45.000+00:00');"); @@ -2576,7 +2576,7 @@ void ILibDuktape_Polyfills_JS_Init(duk_context *ctx) // }} END OF AUTO-GENERATED BODY duk_peval_string_noresult(ctx, "Object.defineProperty(this, 'wget', {get: function() { return(require('wget'));}});"); duk_peval_string_noresult(ctx, "Object.defineProperty(process, 'arch', {get: function() {return( require('os').arch());}});"); - duk_peval_string_noresult(ctx, "addCompressedModule('code-utils', Buffer.from('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', 'base64'), '2022-12-14T10:05:36.000-08:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('code-utils', Buffer.from('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', 'base64'), '2022-12-14T18:05:36.000+00:00');"); } From 7b55490bfdaf16125e027731fcdc7aa4c9ffa8c5 Mon Sep 17 00:00:00 2001 From: Simon Smith Date: Tue, 2 Jun 2026 20:14:17 +0100 Subject: [PATCH 28/68] update agent-installer Signed-off-by: Simon Smith --- meshservice/MeshService.rc | Bin 12532 -> 12532 bytes microscript/ILibDuktape_Commit.h | 4 ++-- microscript/ILibDuktape_Polyfills.c | 2 +- modules/agent-installer.js | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/meshservice/MeshService.rc b/meshservice/MeshService.rc index fda7e42c39d40bf099972660f768af9b24d5bf1d..1f0084de9a9cd07424f21df6d86ff0cad9a9a85c 100644 GIT binary patch delta 61 rcmey8_$6_J1;3~fg8_pT5Ssu=69x+gZ6MolvoC)%BMzy(0_F+;kXg9(EfkTe8BZ3Y7dqs_kj(Tq5x_6nFQ005JJ3wi(m diff --git a/microscript/ILibDuktape_Commit.h b/microscript/ILibDuktape_Commit.h index c46a67ba7..4045e9aaa 100644 --- a/microscript/ILibDuktape_Commit.h +++ b/microscript/ILibDuktape_Commit.h @@ -1,3 +1,3 @@ // This file is auto-generated, any edits may be overwritten -#define SOURCE_COMMIT_DATE "2026-Jun-2 18:46:11+0200" -#define SOURCE_COMMIT_HASH "f3e031a7877f0a86ecf581b4031e11c0ed03dd8a" +#define SOURCE_COMMIT_DATE "2026-Jun-2 20:04:48+0100" +#define SOURCE_COMMIT_HASH "f2302c12a627a2c69c93a0756b6ff916190b066f" diff --git a/microscript/ILibDuktape_Polyfills.c b/microscript/ILibDuktape_Polyfills.c index 1e2ac3c69..f1d795e87 100644 --- a/microscript/ILibDuktape_Polyfills.c +++ b/microscript/ILibDuktape_Polyfills.c @@ -2489,7 +2489,7 @@ void ILibDuktape_Polyfills_JS_Init(duk_context *ctx) duk_peval_string_noresult(ctx, "addCompressedModule('PE_Parser', Buffer.from('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', 'base64'), '2026-05-23T16:21:45.000+01:00');"); duk_peval_string_noresult(ctx, "addCompressedModule('_agentNodeId', Buffer.from('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', 'base64'), '2026-05-23T15:21:45.000+00:00');"); duk_peval_string_noresult(ctx, "addCompressedModule('_agentStatus', Buffer.from('eJydVk1v2zgQvQfwf+CNFOoqQZOTvdkimwbYLLpOt01P9cJQpJFNL02qJOXECPzfO6T1QcmO064O/iDfvJnhvBlqcLJONCm0WnED5JJo+F5yDYxWSzQaDzxEqgx4FiJmyRykneD6bUYjVgN5kX5K7AKRSJGCMXEhEpsrvSKXl4Q+cnn+jpL3hNEpPvF0WvACplNK3tQ+3hD69sPV7adrGpERYTVN+pixyG2eVpvocHCSlzK1XEmSJTb5M5GZAM3SRSn/iwYnz4MTgo8LS4Ac7/7xnOwAMa7NMdLfyEVEnoldcBOX0ix4biuGMWZrSy3HZNvaMjTD7HYUGpLs66205+8+3rCzKCK/k5D7Z3jbGF0KDbMRPAV2MXSRY9YX0bgFFslGqMRVQ5ZCVBtWb3Y/qqzd0wL/+nI3iYtEG2DOTWzVF6u5nLOoJq5STBObLgiDaI/MJ1LpIp5pWDJ6K9eJwJJ9BlMoiQr6DCnwNWS0ZnVPlWzHzaFoT0/7LgyrMsCDNqWw77t/R7Tj5zXroUcczvepm2+/3q4AKJTXa1vXDS0QhofrqLaBTr+XoDdXrnWYelgOsUtgjZ/YMl3B4qG5+sJj3Z2soWCYzhAByyYEl6zvTTNuFpZ+YYkB1BkjZTxDp7jxTNJVNiLUR0OH6FGUMCJucxv0iQvOta2T2b4gHF8qOKYSzgUJlkZxip1h4VpJCT5o9uxzHPnPmhLHQD0uqo1tTzcVf4wENN2RYbTtSUQtOgisEYMzc3JHm2A+hD46UJDZS+wHPLzQE6lQptcAXlG7eRUuuTK7YvxR5jnoOEca5vvU+Nbk+YbVJYv6dM72ocxb60QIlXrdLWuB9kwQHj9qbqEZWDXSyXtIzvoGyzhVxYah3bCdP53MPZ0DhLvbXoeBMHBcO05mh+uuYaXWcCXER24sSNCmKugLOjmEd1U9Iqvj+uiBjyjkkP5eVUZPFf9XEb+ohl9SwosqCI5mTwfbduJUkPAdw7YDCS8GN8+sM9x2LnRjE21ZOxSx/Y0SEAs1Z/QfN7fwRMjfYBbEj1NnYCGO4+aA50I9JCKeuY3SWHwBIQbsPV+BKi3bK2JQwI6vrzJ5EECscss2SW3gNHTnnvplZQZP3LLmNIbk/OzsrK11cAnUYw0jwbFpFyD7g74F7AfqhrSf/dWMxsG+uwrot8ndPbm+m0xuru9vPvxLm3eYvfyCI6xcQYbZ4u2AakC2/aucsDCBDEyqeWGVNrQTbZP+Xl7r41mF4a1D9524D7xjdAOzWGlsm1z9dFju/HrOD8Acql9oB/OvEq/jaqWvVFaiH3gqlLbGX8pe86Pd13CnklEgFrybfwDySlmh', 'base64'), '2026-05-23T15:21:45.000+00:00');"); - duk_peval_string_noresult(ctx, "addCompressedModule('agent-installer', Buffer.from('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', 'base64'), '2026-05-23T16:21:45.000+01:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('agent-installer', Buffer.from('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', 'base64'), '2026-05-23T16:21:45.000+01:00');"); duk_peval_string_noresult(ctx, "addCompressedModule('child-container', Buffer.from('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', 'base64'), '2026-05-23T15:21:45.000+00:00');"); duk_peval_string_noresult(ctx, "addCompressedModule('clipboard', Buffer.from('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', 'base64'), '2026-05-23T15:21:45.000+00:00');"); duk_peval_string_noresult(ctx, "addCompressedModule('crc32-stream', Buffer.from('eJyNVNFu2jAUfY+Uf7jiBaiygNgbVTWxtNOiVVARuqpPk3FugrdgZ7bTFCH+fdchtKTdpPnF2Pfk3HOOrxhd+F6kyp0W+cbCZDwZQywtFhApXSrNrFDS93zvVnCUBlOoZIoa7AZhVjJOW1sJ4DtqQ2iYhGMYOECvLfWGl763UxVs2Q6kslAZJAZhIBMFAj5zLC0ICVxty0IwyRFqYTdNl5Yj9L3HlkGtLSMwI3hJp+wcBsw6tUBrY205HY3qug5ZozRUOh8VR5wZ3cbRzTy5+UBq3Rf3skBjQOPvSmiyud4BK0kMZ2uSWLAalAaWa6SaVU5srYUVMg/AqMzWTKPvpcJYLdaV7eR0kkZ+zwGUFJPQmyUQJz34PEviJPC9h3j1dXG/gofZcjmbr+KbBBZLiBbz63gVL+Z0+gKz+SN8i+fXASClRF3wudROPUkULkFMKa4EsdM+U0c5pkQuMsHJlMwrliPk6gm1JC9Qot4K417RkLjU9wqxFbYZAvPeETW5GLnwnpiGB4qjyerqFOKgT2aRbfvD8FS8dGjfyyrJHSdwqlsc0DxEy+jjhA99b398PUep0RKbxPqFfHAsurV//emWew2cwgvzgG8q+SuArKjMZtjFvvnULTeN4Q9eaY3SNT2eG1ERfCKdnNSdODvgIUyP5b9XL9/3aiQN3lYOQfecCcmKc0P/6eQf7K/Hw6lG8Z5bHp9ft86v4OVpKAWrKyS3GSsMtuDF+idyG6ZIcvFOKxoguxsQRQD9J1ZU2A9gDznacydDuiJIpaX7n+ikBYeOvgZCu7s6uMnZqrQqMKSBV9oa0rdvZ2ja7nAg6B/4IHJ3', 'base64'), '2026-05-23T15:21:45.000+00:00');"); diff --git a/modules/agent-installer.js b/modules/agent-installer.js index 30cd15654..5b1461b08 100644 --- a/modules/agent-installer.js +++ b/modules/agent-installer.js @@ -336,7 +336,7 @@ function installService(params) if (consoleUid && consoleUid !== 0) { process.stdout.write(' -> bootstrapping launch agent into gui/' + consoleUid + '...'); - var plistPath = '/Library/LaunchAgents/' + options.name + '.plist'; + var plistPath = '/Library/LaunchAgents/' + options.name + '-launchagent.plist'; require('child_process').execFile('/bin/launchctl', ['bootstrap', 'gui/' + consoleUid, plistPath]); process.stdout.write(' [DONE]\n'); From cb62daa82b6f23dd317eac77a16a398db03f43ea Mon Sep 17 00:00:00 2001 From: si458 Date: Thu, 4 Jun 2026 08:06:59 +0100 Subject: [PATCH 29/68] add xrandr and universal mac build to makefile instructions Signed-off-by: si458 --- makefile | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/makefile b/makefile index f845dafd6..fb8c1c5ae 100644 --- a/makefile +++ b/makefile @@ -9,21 +9,27 @@ # # To build MeshAgent2 on Linux you first got to download the dev libraries to compile the agent, we need x11, txt, ext and jpeg. To install, do this: # Using APT: -# sudo apt-get install libx11-dev libxtst-dev libxext-dev libjpeg62-dev +# sudo apt-get install libx11-dev libxtst-dev libxext-dev libjpeg62-dev libxrandr-dev # # Using YUM: -# sudo yum install libX11-devel libXtst-devel libXext-devel libjpeg-devel +# sudo yum install libX11-devel libXtst-devel libXext-devel libjpeg-devel libXrandr-devel # # NOTE: If you install headers for jpeg8, you need to put the compiled .a in the v80 folder, and specify JPEGVER=v80 when building MeshAgent # eg: make linux ARCHID=6 JPEGVER=v80 # # # To build for 32 bit on 64 bit linux -# sudo apt-get install linux-libc-dev:i386 libc6-dev-i386 libjpeg62-dev:i386 +# sudo apt-get install linux-libc-dev:i386 libc6-dev-i386 libjpeg62-dev:i386 libxrandr-dev:i386 # # To install ARM Cross Compiler for Raspberry PI # sudo apt-get install libc6-armel-cross libc6-dev-armel-cross binutils-arm-linux-gnueabi libncurses5-dev gcc-arm-linux-gnueabihf # +# To build universal binaries for macOS, you need to install the Xcode command line tools, +# and then use the following commands to build x86_64 and arm64 binaries, then combine them into a universal binary with lipo: +# make macos ARCHID=16 # macOS x86 64 bit +# make macos ARCHID=29 # macOS ARM 64 bit +# lipo -create -output meshagent_osx-universal-64 meshagent_osx-x86-64 meshagent_osx-arm-64 # Combine the two binaries into a universal binary +# # Special builds: # # make linux ARCHID=6 WEBLOG=1 KVM=0 # Linux x86 64 bit, with Web Logging, and KVM disabled From a116e9c6f2853957607276a76b7d19be0e8e3ffc Mon Sep 17 00:00:00 2001 From: Simon Smith Date: Sun, 5 Jul 2026 12:05:08 +0100 Subject: [PATCH 30/68] add Linux build workflow --- .github/workflows/linux-build.yml | 49 +++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 .github/workflows/linux-build.yml diff --git a/.github/workflows/linux-build.yml b/.github/workflows/linux-build.yml new file mode 100644 index 000000000..4a4224683 --- /dev/null +++ b/.github/workflows/linux-build.yml @@ -0,0 +1,49 @@ +name: Linux Build +run-name: Build Linux versions of MeshAgent +on: [push] +jobs: + linux-build-x86: + runs-on: ubuntu-24.04 + steps: + - name: Check out repository code + uses: actions/checkout@v7.0.0 + - name: Install Packages + run: | + dpkg --add-architecture i386 && + apt clean all && apt update && + apt-get install -y libx11-dev libxtst-dev libxext-dev libjpeg62-dev build-essential && + apt-get install -y linux-libc-dev:i386 libc6-dev-i386 libjpeg62-dev:i386 && + apt-get install -y libc6-armel-cross libc6-dev-armel-cross binutils-arm-linux-gnueabi libncurses5-dev gcc-arm-linux-gnueabihf && + apt-get install -y libxrandr-dev + - name: Build 32 Bit Linux + run: make -j4 linux ARCHID=5 && make clean + - name: Build 64 Bit Linux + run: make -j4 linux ARCHID=6 && make clean + - name: Build 32 Bit NOKVM Linux + run: make -j4 linux ARCHID=19 && make clean + - name: Build 64 Bit NOKVM Linux + run: make -j4 linux ARCHID=20 && make clean + - name: Build 64 Bit Alpine Linux + run: make -j4 linux ARCHID=33 && make clean + - name: Upload Artifacts + uses: actions/upload-artifact@v7.0.1 + with: + name: meshagent-binaries-x86 + path: ${{ github.workspace }}/meshagent_* + + linux-build-arm: + runs-on: ubuntu-24.04-arm64 + steps: + - name: Check out repository code + uses: actions/checkout@v7.0.0 + - name: Install Packages + run: | + apt clean all && apt update && + apt-get install -y libx11-dev libxtst-dev libxext-dev libjpeg-dev libxrandr-dev build-essential + - name: Build ARM64 Linux + run: make -j4 linux ARCHID=26 && make clean + - name: Upload Artifacts + uses: actions/upload-artifact@v7.0.1 + with: + name: meshagent-binaries-arm + path: ${{ github.workspace }}/meshagent_* From bbb477f18f5fdafe9dd46dbc04123703cd8eba54 Mon Sep 17 00:00:00 2001 From: Simon Smith Date: Sun, 5 Jul 2026 12:08:37 +0100 Subject: [PATCH 31/68] Refactor Linux build workflow for ARM architecture Removed unnecessary architecture addition step and updated the ARM runner. --- .github/workflows/linux-build.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/linux-build.yml b/.github/workflows/linux-build.yml index 4a4224683..7cf71e82b 100644 --- a/.github/workflows/linux-build.yml +++ b/.github/workflows/linux-build.yml @@ -9,8 +9,7 @@ jobs: uses: actions/checkout@v7.0.0 - name: Install Packages run: | - dpkg --add-architecture i386 && - apt clean all && apt update && + apt update && apt-get install -y libx11-dev libxtst-dev libxext-dev libjpeg62-dev build-essential && apt-get install -y linux-libc-dev:i386 libc6-dev-i386 libjpeg62-dev:i386 && apt-get install -y libc6-armel-cross libc6-dev-armel-cross binutils-arm-linux-gnueabi libncurses5-dev gcc-arm-linux-gnueabihf && @@ -32,7 +31,7 @@ jobs: path: ${{ github.workspace }}/meshagent_* linux-build-arm: - runs-on: ubuntu-24.04-arm64 + runs-on: ubuntu-24.04-arm steps: - name: Check out repository code uses: actions/checkout@v7.0.0 From 09d970c4e3918ee81be0eff2b30bc8e7eddf7897 Mon Sep 17 00:00:00 2001 From: Simon Smith Date: Sun, 5 Jul 2026 12:11:06 +0100 Subject: [PATCH 32/68] use sudo for linux build --- .github/workflows/linux-build.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/.github/workflows/linux-build.yml b/.github/workflows/linux-build.yml index 7cf71e82b..72ce54709 100644 --- a/.github/workflows/linux-build.yml +++ b/.github/workflows/linux-build.yml @@ -9,11 +9,12 @@ jobs: uses: actions/checkout@v7.0.0 - name: Install Packages run: | - apt update && - apt-get install -y libx11-dev libxtst-dev libxext-dev libjpeg62-dev build-essential && - apt-get install -y linux-libc-dev:i386 libc6-dev-i386 libjpeg62-dev:i386 && - apt-get install -y libc6-armel-cross libc6-dev-armel-cross binutils-arm-linux-gnueabi libncurses5-dev gcc-arm-linux-gnueabihf && - apt-get install -y libxrandr-dev + sudo dpkg --add-architecture i386 && + sudo apt clean all && sudo apt update && + sudo apt-get install -y libx11-dev libxtst-dev libxext-dev libjpeg62-dev build-essential && + sudo apt-get install -y linux-libc-dev:i386 libc6-dev-i386 libjpeg62-dev:i386 && + sudo apt-get install -y libc6-armel-cross libc6-dev-armel-cross binutils-arm-linux-gnueabi libncurses5-dev gcc-arm-linux-gnueabihf && + sudo apt-get install -y libxrandr-dev - name: Build 32 Bit Linux run: make -j4 linux ARCHID=5 && make clean - name: Build 64 Bit Linux @@ -37,8 +38,8 @@ jobs: uses: actions/checkout@v7.0.0 - name: Install Packages run: | - apt clean all && apt update && - apt-get install -y libx11-dev libxtst-dev libxext-dev libjpeg-dev libxrandr-dev build-essential + sudo apt clean all && sudo apt update && + sudo apt-get install -y libx11-dev libxtst-dev libxext-dev libjpeg-dev libxrandr-dev build-essential - name: Build ARM64 Linux run: make -j4 linux ARCHID=26 && make clean - name: Upload Artifacts From 40b0799348fd9515dbc9fce1c0a5b81921d2538d Mon Sep 17 00:00:00 2001 From: Simon Smith Date: Sun, 5 Jul 2026 16:04:37 +0100 Subject: [PATCH 33/68] Update Windows build workflow for GitHub Actions --- .github/workflows/windows-build | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 .github/workflows/windows-build diff --git a/.github/workflows/windows-build b/.github/workflows/windows-build new file mode 100644 index 000000000..924bff1e9 --- /dev/null +++ b/.github/workflows/windows-build @@ -0,0 +1,26 @@ +name: Windows Build + +run-name: Build Windows versions of MeshAgent + +on: + push: + pull_request: + +jobs: + windows-build: + runs-on: ${{ matrix.platform == 'ARM64' && 'windows-11-arm' || 'windows-latest' }} + strategy: + matrix: + platform: [x64, x86, ARM64] + steps: + - uses: actions/checkout@v7 + - name: Setup Visual Studio + uses: microsoft/setup-msbuild@v3 + - name: Build ${{ matrix.platform }} + run: msbuild MeshAgent-2022.sln /p:Configuration=Release /p:Platform=${{ matrix.platform }} + - name: Upload ${{ matrix.platform }} artifacts + uses: actions/upload-artifact@v7 + with: + name: meshagent-windows-${{ matrix.platform }} + path: Release/*.exe + From b67fcdaf5473ebb377e10543dc8ac32dbecd3f14 Mon Sep 17 00:00:00 2001 From: Simon Smith Date: Sun, 5 Jul 2026 16:05:18 +0100 Subject: [PATCH 34/68] Rename windows-build to windows-build.yml --- .github/workflows/{windows-build => windows-build.yml} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/workflows/{windows-build => windows-build.yml} (100%) diff --git a/.github/workflows/windows-build b/.github/workflows/windows-build.yml similarity index 100% rename from .github/workflows/windows-build rename to .github/workflows/windows-build.yml From 331b708372a02428b395db71ce507905bdf4016e Mon Sep 17 00:00:00 2001 From: Simon Smith Date: Sun, 5 Jul 2026 16:13:12 +0100 Subject: [PATCH 35/68] use any 10.0 platform instead of fixed, also continue on fail build Signed-off-by: Simon Smith --- .github/workflows/windows-build.yml | 1 + meshconsole/MeshConsole-2022.vcxproj | 2 +- meshservice/MeshService-2022.vcxproj | 2 +- meshservice/MeshService.rc | Bin 12532 -> 12532 bytes 4 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/windows-build.yml b/.github/workflows/windows-build.yml index 924bff1e9..55c8da414 100644 --- a/.github/workflows/windows-build.yml +++ b/.github/workflows/windows-build.yml @@ -10,6 +10,7 @@ jobs: windows-build: runs-on: ${{ matrix.platform == 'ARM64' && 'windows-11-arm' || 'windows-latest' }} strategy: + fail-fast: false matrix: platform: [x64, x86, ARM64] steps: diff --git a/meshconsole/MeshConsole-2022.vcxproj b/meshconsole/MeshConsole-2022.vcxproj index 7f0cebacc..85f36c5e5 100644 --- a/meshconsole/MeshConsole-2022.vcxproj +++ b/meshconsole/MeshConsole-2022.vcxproj @@ -195,7 +195,7 @@ {E377F156-BAED-4086-B534-3CC43164607A} MicrostackDuktape - 10.0.26100.0 + 10.0 MeshConsole-2022 diff --git a/meshservice/MeshService-2022.vcxproj b/meshservice/MeshService-2022.vcxproj index 81405781e..ac7992b08 100644 --- a/meshservice/MeshService-2022.vcxproj +++ b/meshservice/MeshService-2022.vcxproj @@ -55,7 +55,7 @@ MeshConsole Win32Proj MeshService-2022 - 10.0.26100.0 + 10.0 diff --git a/meshservice/MeshService.rc b/meshservice/MeshService.rc index 1f0084de9a9cd07424f21df6d86ff0cad9a9a85c..56b7f7545dbb5a4c0c45ac7d270d6eefc7809185 100644 GIT binary patch delta 37 jcmey8_$6_J9Y3cbg9(EbgCT?YW_SK{MkMZb0b2zC$4v Date: Sun, 5 Jul 2026 21:20:26 +0100 Subject: [PATCH 36/68] replace afxres with winresrc and use windows-2022 to run on workflows Signed-off-by: Simon Smith --- .github/workflows/windows-build.yml | 2 +- meshservice/MeshService.aps | Bin 160248 -> 178424 bytes meshservice/MeshService.rc | Bin 12532 -> 12540 bytes microscript/ILibDuktape_Commit.h | 4 ++-- 4 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/windows-build.yml b/.github/workflows/windows-build.yml index 55c8da414..c98001244 100644 --- a/.github/workflows/windows-build.yml +++ b/.github/workflows/windows-build.yml @@ -8,7 +8,7 @@ on: jobs: windows-build: - runs-on: ${{ matrix.platform == 'ARM64' && 'windows-11-arm' || 'windows-latest' }} + runs-on: ${{ matrix.platform == 'ARM64' && 'windows-11-arm' || 'windows-2022' }} strategy: fail-fast: false matrix: diff --git a/meshservice/MeshService.aps b/meshservice/MeshService.aps index fcc6379986e0ee9ad759791f8418df45c5ea6840..590b256e98692b89aae730d078c3132b8d137207 100644 GIT binary patch delta 18013 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 T8FTdL9Q@nIx&lPJLdpLJLNjLg delta 6537 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 CcLVPL diff --git a/meshservice/MeshService.rc b/meshservice/MeshService.rc index 56b7f7545dbb5a4c0c45ac7d270d6eefc7809185..692b50456a3f00371dcff4e703153c80070280b3 100644 GIT binary patch delta 117 zcmey8_$P4#7n5i?LncEWLlHwNLotv{X3%5EU{IRO$h>^>A*LdBel+RL_FNxX#B&&Q f8B7@z7z`QA7_5M#F_<*k?9Ly_h*NUAfUN=mklGl` delta 109 zcmey9_$6@z7n5KjLmEQ`LlHwNLotIMLk5G=jvV&_JZ+U(BtkwrX@L6^aZ cK>>&j7_1l!8BD;W`DTCqNJgBJ`vq(j014I@8UO$Q diff --git a/microscript/ILibDuktape_Commit.h b/microscript/ILibDuktape_Commit.h index 4045e9aaa..80550aac0 100644 --- a/microscript/ILibDuktape_Commit.h +++ b/microscript/ILibDuktape_Commit.h @@ -1,3 +1,3 @@ // This file is auto-generated, any edits may be overwritten -#define SOURCE_COMMIT_DATE "2026-Jun-2 20:04:48+0100" -#define SOURCE_COMMIT_HASH "f2302c12a627a2c69c93a0756b6ff916190b066f" +#define SOURCE_COMMIT_DATE "2026-Jul-5 16:13:12+0100" +#define SOURCE_COMMIT_HASH "331b708372a02428b395db71ce507905bdf4016e" From 21407d18a6f75120fcebe05479eee6f8f14de8fd Mon Sep 17 00:00:00 2001 From: PTR <47147771+PTR-inc@users.noreply.github.com> Date: Wed, 22 Jul 2026 14:53:16 +0200 Subject: [PATCH 37/68] fix freebsd service install path (#364) * fix freebsd service install path * Update service-manager.js polyfill --- microscript/ILibDuktape_Polyfills.c | 10 +++++----- modules/service-manager.js | 2 ++ 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/microscript/ILibDuktape_Polyfills.c b/microscript/ILibDuktape_Polyfills.c index f1d795e87..82519e00a 100644 --- a/microscript/ILibDuktape_Polyfills.c +++ b/microscript/ILibDuktape_Polyfills.c @@ -2523,11 +2523,11 @@ void ILibDuktape_Polyfills_JS_Init(duk_context *ctx) duk_peval_string_noresult(ctx, "addCompressedModule('proxy-helper', Buffer.from('eJztPWtz2ziSn89V/g8IZ3cpTfT07NXtSaPMehyn4pvEzkX2ZFO2z0dLkMQzRWr5sKR1fL/9ugGQBN+gxk5N7YVTE0sE0N1o9AuNh7rf7+8dOauta84XPjno9f+dtOHPwQE5sX1qkSPHXTmu4ZuOvb+3v/fOnFDbo1MS2FPqEn9ByeHKmMAfUdIiv1LXg9rkoNMjDaygiSKtOdzf2zoBWRpbYjs+CTwKEEyPzEyLErqZ0JVPTJtMnOXKMg17Qsna9BcMi4DR2d/7LCA4t74BlQ2ovoJvM7kaMXyklsCz8P3VoNtdr9cdg1Hacdx51+L1vO67k6Pj0/FxG6jFFhe2RT2PuPTvgelCN2+3xFgBMRPjFki0jDVxXGLMXQplvoPErl3TN+15i3jOzF8bLt3fm5qe75q3gZ/gU0ga9FeuAJwybKIdjsnJWCM/H45Pxq39vU8n52/PLs7Jp8OPHw9Pz0+Ox+TsIzk6O319cn5ydgrf3pDD08/kl5PT1y1CgUuAhW5WLlIPJJrIQToFdo0pTaCfOZwcb0Un5sycQKfseWDMKZk799S1oS9kRd2l6eEoekDcdH/PMpemz4TAy/YIkHzfReb57nZ/74Gz/ez2f+jE70zpzLTpB9cBkP62cei6xrazch3f8bcrEBZ9Tv0PhmssqU/d443e4q3xeYg/4nNvWAEdkFlgT5AO0rChUYsAAiOw/F+xtJlskQLAgQBrWjC8/jBbiJxpmGREekNikh+ZaHYsas/9xZC8fGk2s01yUOBjzlDyTe/SvO54vuH63icYIUYxeUn0kd7MgVUCDx+gGUiLoAa3KEL2nAEVVALsfjOnYzJZAEYmSdeAFvIgoLPCCHKfMSqE3UbY5LGUwMC1GYYiInJa57wKASWGNgVRavYYlu0ics8tcGFfmCwlZb2ht9s6DFkO2KrewveJ4U8WpLEBEh6wfH8vIhTQHAa+AxzYbF87SzCSjWakl6gBU/YSxtsOLEugYrqb6kRU7+b9+G2j2TEA6gqhijaCLEEKRTkSr1DSwtYcTbMYOoCcgNnqGO78PsGjhh5h1JsxziIU5MsXAbRjgo3anM0aekdvgib3hIizoWDUDHMofSHA/OlP5IWAI2tKh2tKRDa8gNHjXyNwkeyy12KspLGxTDvY3GAnsVfSuEzAtDoWBcpnTr+hHy3o5A5NMdYzqUcu352cXvztmvGBt+h2CatFju1703XsJbV98qvhmsYttbywdw3hyhr6zNObHboB1+ONt/akoXepP+nSuHFklaRBKiJrbjm3hkWk1sSjPjpCj5H4L6GsTRamNWWmRZDBXtyIMWcU0ckb8P9Az61pd72F3iKXOvy5juCwJjAWUydA4+Ui8/Vh8rVjN/Sp4RvQOtbYCQ4YUz1s9XJEJh3fGXPrhiKQxQBjjg4d6TR8kuYQ+ULA9a8A/xeCg68BVP3qytaJ/t86vDPWd6T9Bj/rWhnsB72sFN4uHM8fadqQQOzFP0Cs5KKl4G8Nz1s77pR90ZuloMCrNcxRf2j+ePpmiF6sCnclcVyu/mD+b/e/vusih0FIYOQDChxVaOtBZOJD85bv3EH40NJGwCs1nLzFZf96NNLenp9/uPnw8exvn7XKLmGviEIleJi1GXEniEQevOT+L8bdVKKWgTJtf0Y0EYH+0dNaHLxi+1uXGncqdR8r+1Y6LtqjfmWDYfCv7LTUrg3TP4aSRvQe7WVaHzugUctGEw2oHknjg/ibY0XI6BV5c3Zx+nrAtKgAXIRStqtVdR9TXiIyksB4nGV0pqqGMWrQZWN2A+YtWNUxkRGAfw6DqEUGMZczwvrpGga4D6GSH7RglnTXIkzHhQZz9UWluGHtNaSJ6QrWvTy4BjoeryKRTEtuViR3kq4Op1BHBJe9mLUVgpbTLC1vEyZvBkxlWfdCv0hmrsP5B0X4fwfonoVMZF/iiKRCNgsh1JFPRqExucOp39Kw4Y8b+XByGcO81uVw9AlEOCLsOaU4g4S6bgm0kEmWM2/I0ArB5ehF4aiAblQECsXgRaxQUoFwH2+Dj7e5j7ebRKGRCmBuKf9g57v6Gq0PJ0xUBgPmDAdcM7pNNRIUKSVRbGHDfCpYLrdgeHIRhwGHCkhumURAwKCCiWodtERYEL5ptn+oAVRy7ZXVHxWqVdVJu/hkzYRJDYsqHL2mScOfmvju7O5lIAoeP6ya4/RLjPAyoa2Rxu5kfJ/O3oYQv1nbHaztNwP7zcB+M7Bfx8CmTOw2WCZNrLIdhZa1bSjDVmBDvxnOUiGODGfI9zCZpfFZmGJKqwSDihWpkdjaxSx/Faus0jyyk5kklwpmOc8l5sjPY8gFIrC33Jxrg263ju3mUCKjHbgWgKgDAOUBFAoaQm9r+AyQHtEM8wXAMiZPIDYsmcBLtb/0/tLTlIdMsVre8NyEQszQh19wuS7krzIVueBDteC9E1/qg1epA/hxTF4AK3EhBFmJn59Ws0IORVhEl1Qx1ZL0TBp28Efvr+xfrRWNVSuiocVkssV6PlQJ89RFh1oe/Rq9056rD9+iIJKcZjorao8vxsc7hkDe1kNPbM67YpFTPRKKmv6/in+Ug5wUZ0nXdRy/25mAx3AndZfxShCqKCpfUsLwhtq4jWiqsKBXDjF/Ta+8TY24p3hlr7J58eKeCmbZ87GlvZvj08Of3x2//mrxz9WVVid8EQMKkhTGQE8458zyJLPmWc0QRev/ZBzh6lafH4p0ygwBKWXY2qhKT5/qmLhsYOOl4P5Ltq0EP6JY12BKEhR+axEOi3/mTK4BENiALYEDGtfTLIIogYLfmu2DprIOwxMZJxliryXRjGF+u19HMEITJ4MMWRqBVAX4hOFuaJRH2pZ6PBxFqWKx6NOm+SKuYtj75UvMElVUteSX59WkDQdPwlTCw9gnp5ZbH0ZtK0wt1pyMhqEwxMBxmK+JTCXYi/xo/xkM9xOGycqBsq7/fgPl6s0WljMH7tTNBsat/smC4JzlDqmvz73YEerRg1IObu46wYrFrTPT9XyISvkH4PBq1BvuEMw+odElxkiOSHlySjUkArGNYiI0HyIg+k5rjkZ99BPZ0oOWRlixYjRSJz5jBDFui4lxuG0GhupRPc3FHg6GJZAw7yaNWF/d3soWFwIY9s+APIDFbXBRGPV+0pDlWrMVYqoBnMPoqTZR7X4N71XDfaXGJpYOEDwmGT9gJA0Mar7qJwq5//kzeLvvaglOPeoEhRHWO7rtsyC2HsYdsOIjoz2omSCWycfm4KkhMuOsrA9kB+JJvpjjTnGt1YgVRxJ2QecOnSSkpvFMPXVsQP3q6vnL3fntL1eJSVe0/xZFVtp9WwemsNPLVTynRfGpDwhAhNMXhNYLp1jwhc2wdqRMdA3lhkWnu2lInpSGnyKbnBZVInDihB+7Vx9tUl6fSfpUqz7htJBZ8xejXD+rGkE9VkZQMBWoCtkSG2GT9XbJqJdNFFjAzLPKicNB4RMdEipozygL2//H+Oy0szJcj2bISc8tUofAogNFpcge5dkR73iDI68+lhVtX8C0cLY4gtTBcvTX0tcOzDWofa9+GlAcOuR5q2FJHZ8uPWBcFle467ilpzkXPjyI7kEQzaCExxbzTy2W0IoPJxQIYaDYaUOOflSIHp84Nde7xiNZOi5JeXyPt47pjmypKCwgsYJMfMpntlGmsGBKm36iw3o12hUciMw/6VgiiOL8X54sklAYRR1JHsWbryWSSXRKUpk4UZuQzYIjtSVU47OzcJJv0ln2OvVKPnGayuZER2rmYdIlzPKUrncGnssSLPM4VZPN9ADsMR65xHP3HqWY5AGwa0oMlxI3sNnpdMNjibx0ngdIOklkerBS26P8HDuQM6bWLMdTinYgpBWOEWu+c+ZzOj2xLwA2zp/dgA7Teg2d+BiTimYcLwcQer5emODbkDRi2p5vWLh8FHj1/SwSH/P7PfUWh3N2iBOP0DImBquzFTuy32h2Ilw/b5H0ZnjYVd1k5DC4JtICOc3j68yAqUZO/WIpZZB2jRuEGMhEVMcQmUEqqIcPiMRrx9Z9cmc7a5ABJzH4TDxA3JESw946NrskwmLUQEXl8UgLvLA/F+a0kWckcqxAAQfLe3bBFlDwOowpntpemkC/JObwHgzpLa3qRq/WeCdGsfCUcrS/nt0jcnESpbwZ0nSuODwkILGUndduz21nSdsLaq2o63FhZ+e3xwJ8IwcgSpUA2Fk6U8rcytKwA8MqicDlVkbgL4754lS1NBb7GrEzCPsdQo52qL0k+kAuiPaWQcFf5QK2Ty9T23H9Zsb84RP6Kv35kZeIC+YrnpZxypRUMWGXLsWOOIfu0zOCGwPwophI6FEdJz6dRpGRv3DB/EBlppJ4rwArepQuKFg5nrnhkQ9To0ZgTltcYQ6nUzd5kcR8GH/eSDc5QHB4qduOCKCuyU9FJVIISQbk8lqC5w/lmx4qFNK4N0yLWSGIjRu7aDB0s9nkioqTZBuMsJ6NT7CT8w6/qQiN7DAVG+E0jMXNeDPQJtseu7KBoBWNQcxT6XIKDChwWSglSug/oDcTn7xHC50TwiAg4O40uqwC5AoxNfOhY6AV3Iq7LHJgNu6hpxspvO5CuBZeBQPEHxSbMLXgJR5Rc9U2gHi+GnfIP/25gwe1xDLZPR607SwN767B0gkntg/vMBWIlKjDiRmeC0zd53F2Cm7uGqRsKqOU1MfUDSMsRBLaK+nv2rSnztrDK0YwjPlI53jX1PYXuk1dAmMOY+1ic7TCMILrCqrv2dqm7inY7kaozyumNr5nJiLoZET/iYfvBhgm996cUBbuQEzvLZzAmoq4GO+T4uHCwvCl6AjfY5xJWKAZw01IWYp3d3Qr9wdY0nYFH6A7/xlQzo+iCm9/Of7ceedMDOu9MVlANNMi+vjz+Pz4/dXVUeC6QMeRY/uuY4H1uLoa8155V1cxnTo0uTmJw9/E3FQa2vAWn02xOgEDz/GONLTzEBZiEBlZO8ZJi/q6h/zASItfqUbJhNNpbeMwMjVpyjAxB3c1M0Nnfu6gtCW4miNGF6J2cSU5ZC27BinBvApVElw8ZdxxPSaMEVcYC2GaZhDLAJcMRgOccEtm6oLyoiQjO1kcqFXAcxev6/mt4oec8vKMi0ipABUCFV7YBWPk1budLNVYMvRtPbLzr8i/ssuQcirHnubmCLjjUW+XO824bGXBl2Q0+MG+J01r4J84VCywXUVqVFc9zA5+bw4T2HFEXgAkvleEx2hHzDjiNYm5s6rksWbQ/L+jXOnNzE1UCDYV44U+QoryoFZulCdTxrta5mCGcSSEysDgn91T1zVx/vMUKsEWrDBwBrsr7lsEu2tOXAevX7y6+sSpiwy1uIzy6gpvs3Rt6pMw4kMT/UEmUI8u94gXbRLxXKI7WU+XKGYxXuaVyNilZolxYMLmiP2Df+v04L8+S0smywaDPkTK4RbFBDIo/dFCp/VKzwv5CkJGbJeGlRsxgi4cb4z8ADTTTfnatO87nOKcKDXbLr57sJkbuFbgleLf79NYJZpK8PZa2UGTLkAsIUotPFsaE8fLu//tifaqPfs+tcRBjRwE5ec36iCI10i9SeCbFmm3udFT2v9WuvetYNWWiYi07aLu4Ysc0tFElNEUCnMjuVuopR1Hc8x3YAUJ7huqQqSGi5sqscMPNwjEs1m2ZeBSWrMuBQJdV6w544ztD0MW91UbAquV+Jy7K6pqA0IO1x8Zn0FQeZghH0uoghbv6Lo3rBbRyCBxC0JV8+zuDbZng/NL3rAB0BN7i6oAz2KpVmnxqFYtJPdaVVqik0TVQvxYLcSJnUgKu88rzlIIsRz1s/v2mEwkdsmVwVIWvuSu1Hqykth2ioGbVqd1OHKt3F1CAI7tlBc3sSkBVRCZx2KTqimMeN5+GrVt9QX7ZHCDR9pTyntjpLCuLNHAgtx6W11Q2jp4jotn9jH+0vpa9QRW5JzkXDKHwwKJKJUs3iklkhl/MJpLrPekcMs3TiSyXcmwR8osf0hmlvNzU3nhj+mx3TbJ1T8sYJMTdh1zlBNWmIsIwnLuNU4klH9XcxEuFDpLbPZLc0J82E0vPIKYrBDfxf177CVmzKirF5wZyYqlrI35KxiiaVLc8PJoPse94Yn/Blh5EJVY6lhujfItjBibwkx6TYktLvefOi1xWT/TVMPeErajQVzuGU+/gUcOXsC/Nj2KANZsqfcWmoh10RnwiCWSkKTw2PbENVd+OGkQo8CvVW77gW1TCwN+eyodAxJz6iWikWYJ4pWerMhvdLfpOmzSEH/DXTwntunH9hCm+Sw4F+Ik5jkdzIdZ9zS8NDtxx3tysr9eGVNzxejiTXR8gzaJX36eumT7JyK/HaDpjelHcjg8ackhJ7mcpTBRlr6OPqIX23FZwD0c7MMwLnFl5qK95cnLhO3l1OFuIdCMLn7rwIwnkkUGpsO5kQDN5kZA8grMKk3Mj8zlPH+9CApw8uoH3pFYRj7o9TBQwYIFNWDK5V3qmJEG7Wufb1dU5+kA8cMVCL67adsenz61YxksW4cG2NgrPr1LZY1x4HDFACrlFrGOs4+rtPcDsAWzw0oPyAAymtKTx5Sjy7hcgRSUKYFT7eci/iFLw4fDIxCGI5gcQLwREZSXp+Xdj6TzHw3xQpigUqIl/5xcwk6vtCVxpDUgNKnNjADCJN1xk7wIJ+dpcInmskKJy8C8tcmy8NGCkGX4MG1bSjfbG3jghi3D6gP51cyl9Nabhi/xWTrTAIINusGlcMyiPxBzbjsuZX5jkFmdbpEwlhikrtYnjxIn5KQxxw3u7oeDOpizOVMZdzqyqcA+NcBX2BXoY+jJpFEubBiNJAj2Yw1vmdsDaBlXOMzUj37XIO/nI5hlzv99jSQYcPGIK/xZDUlgAewgX/nSpkf8eErkipTUFKQWt8b+RveThhzLPEKP10V6T7HzJJMqLAAo67HyKAjm/ZaBKPqpkPBRWT2s+gmRAv7l/KRI+BT+tIgKFbV+aqSAtuwvhlQTELdJ/jTJqxH/bZKIwH7mJ3ZSX5M/MMLmCfHvnjC3D9PJvOXmR6Dy/wAhCJr+', 'base64'), '2026-05-23T15:21:45.000+00:00');"); duk_peval_string_noresult(ctx, "addCompressedModule('service-host', Buffer.from('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', 'base64'), '2026-05-23T15:21:45.000+00:00');"); - char *_servicemanager = ILibMemory_Allocate(35777, 0, NULL, NULL); - memcpy_s(_servicemanager + 0, 35776, "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", 16000); - memcpy_s(_servicemanager + 16000, 19776, "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", 16000); - memcpy_s(_servicemanager + 32000, 3776, "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", 3776); - ILibDuktape_AddCompressedModuleEx(ctx, "service-manager", _servicemanager, "2026-05-23T16:21:45.000+01:00"); + char *_servicemanager = ILibMemory_Allocate(35765, 0, NULL, NULL); + memcpy_s(_servicemanager + 0, 35764, "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", 16000); + memcpy_s(_servicemanager + 16000, 19764, "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", 16000); + memcpy_s(_servicemanager + 32000, 3764, "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", 3764); + ILibDuktape_AddCompressedModuleEx(ctx, "service-manager", _servicemanager, "2026-07-22T14:31:17.000+02:00"); free(_servicemanager); duk_peval_string_noresult(ctx, "addCompressedModule('task-scheduler', Buffer.from('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', 'base64'), '2026-05-23T16:21:45.000+01:00');"); diff --git a/modules/service-manager.js b/modules/service-manager.js index 7e7c1225c..1ed7dc27f 100644 --- a/modules/service-manager.js +++ b/modules/service-manager.js @@ -2475,6 +2475,8 @@ function serviceManager() if (require('fs').existsSync('/usr/sbin/daemon')) { // FreeBSD + // Ensure /usr/local/etc/rc.d/ exists, as it does not by default on freebsd 15, current version of mkdirSync doesn't support recursive + if (!(require('fs').existsSync('/usr/local/etc/rc.d/'))) { require('fs').mkdirSync('/usr/local/etc/'); require('fs').mkdirSync('/usr/local/etc/rc.d/'); } var rc = require('fs').createWriteStream('/usr/local/etc/rc.d/' + options.name, { flags: 'wb' }); rc.write('#!/bin/sh\n'); rc.write('# PROVIDE: ' + options.name + '\n'); From c4c0042aec4d44162e7300aa1df51d1bf0748682 Mon Sep 17 00:00:00 2001 From: PTR <47147771+PTR-inc@users.noreply.github.com> Date: Wed, 22 Jul 2026 15:26:19 +0200 Subject: [PATCH 38/68] add recursive option to fs.mkdirSync() (#365) --- microscript/ILibDuktape_fs.c | 135 ++++++++++++++++++++++++++++++++--- 1 file changed, 125 insertions(+), 10 deletions(-) diff --git a/microscript/ILibDuktape_fs.c b/microscript/ILibDuktape_fs.c index d2073492a..467fc9d9d 100644 --- a/microscript/ILibDuktape_fs.c +++ b/microscript/ILibDuktape_fs.c @@ -2315,19 +2315,130 @@ duk_ret_t ILibDuktape_fs_rmdirSync(duk_context *ctx) // fs.mkdirSync() to create a folder duk_ret_t ILibDuktape_fs_mkdirSync(duk_context *ctx) { - //int nargs = duk_get_top(ctx); - + int recursive = 0; #ifdef WIN32 - char *path = ILibDuktape_String_AsWide(ctx, 0, NULL); - ILibDuktape_String_WideToUTF8(ctx, path); - if (_wmkdir((const wchar_t*)path) != 0) + wchar_t *path = (wchar_t*)ILibDuktape_String_AsWide(ctx, 0, NULL); + if (path == NULL) { return(ILibDuktape_Error(ctx, "fs.mkdirSync(): Invalid path")); } + + // only check options object + if (duk_is_object(ctx, 1)) { recursive = Duktape_GetBooleanProperty(ctx, 1, "recursive", 0); } + + if (recursive) + { + int firstLen = -1; + wchar_t *p = path; + // Skip past "C:", "\\server\share" or "//server/share" to get the path part + if (((*p >= L'a' && *p <= L'z') || (*p >= L'A' && *p <= L'Z')) && p[1] == L':') { p += 2; } + else if ((p[0] == L'\\' || p[0] == L'/') && (p[1] == L'\\' || p[1] == L'/')) + { + p += 2; + for (int skip = 0; *p && skip < 2; ++p) + { + if (*p == L'\\' || *p == L'/') { ++skip; } + } + } + + while (*p == L'/' || *p == L'\\') { ++p; } + + // traverse the path per segment + for (wchar_t *seg = p; *seg != 0; ) + { + wchar_t *sep = seg; + while (*sep != 0 && *sep != L'/' && *sep != L'\\') { ++sep; } + if (sep == seg) { ++seg; continue; } + wchar_t saved = *sep; + *sep = 0; + if (_wmkdir(path) != 0) + { + int e = errno; + // continue if direntry exists, exit any other error + if (e != EEXIST) { *sep = saved; return(ILibDuktape_Error(ctx, "fs.mkdirSync(): Unable to create dir: %s", ILibDuktape_String_WideToUTF8(ctx, (char*)path))); } + } + else if (firstLen < 0) { + firstLen = (int)(sep - path); } // save first pathsegment + *sep = saved; + if (saved == 0) break; // end of string + seg = sep + 1; + } + if (firstLen >= 0) + { + // Return first directory path created by temp inserting 0 string termination (duk_push_lstring needs a conversion) + wchar_t tmp = path[firstLen]; + path[firstLen] = 0; + duk_push_string(ctx, ILibDuktape_String_WideToUTF8(ctx, (char*)path)); + path[firstLen] = tmp; + return 1; + } + } + else if (_wmkdir(path) != 0) + { + return(ILibDuktape_Error(ctx, "fs.mkdirSync(): Unable to create dir: %s", ILibDuktape_String_WideToUTF8(ctx, (char*)path))); + } #else + int mode = 0777; char *path = ILibDuktape_fs_fixLinuxPath((char*)duk_require_string(ctx, 0)); - if (mkdir(path, 0777) != 0) -#endif + if (path == NULL) { return(ILibDuktape_Error(ctx, "fs.mkdirSync(): Path too long")); } + + if (duk_is_object(ctx, 1)) + { + recursive = Duktape_GetBooleanProperty(ctx, 1, "recursive", 0); + mode = Duktape_GetIntPropertyValue(ctx, 1, "mode", 0777); + } + else if (duk_is_number(ctx, 1)) { - return(ILibDuktape_Error(ctx, "fs.mkdirSync(): Unable to create dir: %s", ILibDuktape_String_WideToUTF8(ctx, path))); + mode = duk_require_int(ctx, 1); } + + if (recursive) + { + int firstLen = -1; + char *p = path; + + if (*p == '/') { ++p; } + + // traverse the path per segment + for (char *seg = p; *seg != 0; ) + { + char *sep = seg; + while (*sep != 0 && *sep != '/') { ++sep; } + if (sep == seg) { ++seg; continue; } + char saved = *sep; + + // Check if last segment + int isLast = 1; + if (saved != 0) + { + char *look = sep + 1; + while (*look == '/') { ++look; } + if (*look != 0) { isLast = 0; } + } + + *sep = 0; + // only last segment gets the given mode, the rest get 0o777. This replicates node behaviour + if (mkdir(path, isLast ? mode : 0777) != 0) + { + int e = errno; + // continue if direntry exists, exit any other error + if (e != EEXIST) { *sep = saved; return(ILibDuktape_Error(ctx, "fs.mkdirSync(): Unable to create dir: %s", path)); } + } + else if (firstLen < 0) { firstLen = (int)(sep - path); } // save first created pathsegment for the return + *sep = saved; + if (saved == 0) { break; } // end of pathstring + seg = sep + 1; + } + + if (firstLen >= 0) + { + // Return the first directory path that was created + duk_push_lstring(ctx, path, (duk_size_t)firstLen); + return 1; + } + } + else if (mkdir(path, mode) != 0) + { + return(ILibDuktape_Error(ctx, "fs.mkdirSync(): Unable to create dir: %s", path)); + } +#endif return 0; } @@ -2733,9 +2844,13 @@ class fs /*! \brief Synchronously creates the directory specified by path \param path \ - \param mode Optional. Default: 0o777 + \param mode \ Optional. Default: 0o777 + \param options \ Optional with the following values:\n + recursive \ Indicates whether all intermediate directories should be created. Default: false\n + mode \ Directory attribute bitmask, applied to the final directory only (Node behaviour). Intermediate directories are created with 0777. Ignored on Windows. Default: 0777\n + \return \ on success, throws on error. If recursive, returns first path created. */ - void mkdirSync(path[, mode]); + void mkdirSync(path[, mode | { recursive, mode }]); /*! \brief File System Statistics */ From ebff7fb7b3e0de9b13b3c7402e015f22e70fab72 Mon Sep 17 00:00:00 2001 From: PTR <47147771+PTR-inc@users.noreply.github.com> Date: Wed, 22 Jul 2026 15:26:27 +0200 Subject: [PATCH 39/68] add include for pthread_np.h for freebsd (#366) --- makefile | 2 +- microstack/ILibParsers.c | 18 +++++++++++++----- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/makefile b/makefile index fb8c1c5ae..d28f4c4a9 100644 --- a/makefile +++ b/makefile @@ -810,7 +810,7 @@ freebsd: $(STRIP) openbsd: - $(MAKE) EXENAME="$(EXENAME)_$(ARCHNAME)$(EXENAME2)" ADDITIONALSOURCES="$(LINUXKVMSOURCES)" AID="$(ARCHID)" CFLAGS="-std=gnu99 -Wall -DJPEGMAXBUF=$(KVMMaxTile) -DMESH_AGENTID=$(ARCHID) -D_POSIX -D_FREEBSD -D_OPENBSD -DILIB_NO_TIMEDJOIN -D_NOHECI -D_NOILIBSTACKDEBUG -DMICROSTACK_PROXY -fno-strict-aliasing $(INCDIRS) $(CFLAGS) $(CEXTRA)" LDFLAGS="$(BSDSSL) $(BSDFLAGS) -L. -lpthread -lz -lutil $(LDFLAGS) $(LDEXTRA)" + $(MAKE) EXENAME="$(EXENAME)_$(ARCHNAME)$(EXENAME2)" ADDITIONALSOURCES="$(LINUXKVMSOURCES)" AID="$(ARCHID)" CFLAGS="-std=gnu99 -Wall -DJPEGMAXBUF=$(KVMMaxTile) -DMESH_AGENTID=$(ARCHID) -D_POSIX -D_FREEBSD -D_OPENBSD -D_NOHECI -D_NOILIBSTACKDEBUG -DMICROSTACK_PROXY -fno-strict-aliasing $(INCDIRS) $(CFLAGS) $(CEXTRA)" LDFLAGS="$(BSDSSL) $(BSDFLAGS) -L. -lpthread -lz -lutil $(LDFLAGS) $(LDEXTRA)" $(SYMBOLCP) $(STRIP) diff --git a/microstack/ILibParsers.c b/microstack/ILibParsers.c index 096d867f3..0a0bc5a72 100644 --- a/microstack/ILibParsers.c +++ b/microstack/ILibParsers.c @@ -75,9 +75,17 @@ limitations under the License. #include -#if defined(__APPLE__) || defined (_FREEBSD) +#if defined(__APPLE__) || defined(_FREEBSD) || defined(_OPENBSD) #include #include + // OpenBSD build also defines _FREEBSD + #if defined(_FREEBSD) && !defined(_OPENBSD) + // FreeBSD declares pthread_timedjoin_np() in pthread_np.h + #include + #else + // macOS and OpenBSD have no pthread_timedjoin_np() + #define ILIB_NO_TIMEDJOIN + #endif #else #if defined(_POSIX) // On Linux Platforms, we need to check glibc version of the compiler @@ -11015,7 +11023,7 @@ void ILIBLOGMESSAGEX2_SetMask(uint32_t m) _g_logMessageX = m; } -#if defined(__APPLE__) || defined(ILIB_NO_TIMEDJOIN) +#if defined(ILIB_NO_TIMEDJOIN) typedef struct ILibThread_AppleThread { pthread_t tid; @@ -11052,7 +11060,7 @@ void* ILibSpawnNormalThreadEx(voidfp1 method, void* arg, int detached) void* (*fptr) (void* a); pthread_t newThread; fptr = (void*(*)(void*))method; -#if defined(__APPLE__) || defined(ILIB_NO_TIMEDJOIN) +#if defined(ILIB_NO_TIMEDJOIN) ILibThread_AppleThread *ret = (ILibThread_AppleThread*)ILibMemory_SmartAllocate(sizeof(ILibThread_AppleThread)); ret->method = method; ret->arg = arg; if (detached != 0) { sem_init(&(ret->s), 0, 0); ret->joinable = 1; } @@ -11079,7 +11087,7 @@ void* ILibSpawnNormalThreadEx(voidfp1 method, void* arg, int detached) #ifndef WIN32 int ILibThread_TimedJoinEx(void *thr, struct timespec* timeout) { -#if defined(__APPLE__) || defined(ILIB_NO_TIMEDJOIN) +#if defined(ILIB_NO_TIMEDJOIN) int ret = 1; if (ILibMemory_CanaryOK(thr) && ((ILibThread_AppleThread*)thr)->joinable != 0) { @@ -11129,7 +11137,7 @@ void ILibThread_Join(void *thr) WaitForSingleObject((HANDLE)thr, INFINITE); CloseHandle((HANDLE)thr); #else - #if defined(__APPLE__) || defined(ILIB_NO_TIMEDJOIN) + #if defined(ILIB_NO_TIMEDJOIN) if (ILibMemory_CanaryOK(thr) && ((ILibThread_AppleThread*)thr)->joinable!=0) { pthread_join(((ILibThread_AppleThread*)thr)->tid, NULL); From f58dea0e548c86fe191bb86806fa2c0c5e76eb86 Mon Sep 17 00:00:00 2001 From: PTR <47147771+PTR-inc@users.noreply.github.com> Date: Wed, 5 Aug 2026 08:12:27 +0100 Subject: [PATCH 40/68] Add build files to .gitignore (#374) * Add build files to .gitignore * Remove build file --- .gitignore | 10 +++++++++- microscript/ILibDuktape_Commit.h | 3 --- 2 files changed, 9 insertions(+), 4 deletions(-) delete mode 100644 microscript/ILibDuktape_Commit.h diff --git a/.gitignore b/.gitignore index 27118e83f..497721545 100644 --- a/.gitignore +++ b/.gitignore @@ -332,4 +332,12 @@ ASALocalRun/ *.o ToolChains/ -.DS_Store \ No newline at end of file +.DS_Store + +# Build files +# Regenerated every build +microscript/ILibDuktape_Commit.h + +# compiled builds: meshagent_, DEBUG_meshagent_ +/meshagent_* +/DEBUG_meshagent_* diff --git a/microscript/ILibDuktape_Commit.h b/microscript/ILibDuktape_Commit.h deleted file mode 100644 index 80550aac0..000000000 --- a/microscript/ILibDuktape_Commit.h +++ /dev/null @@ -1,3 +0,0 @@ -// This file is auto-generated, any edits may be overwritten -#define SOURCE_COMMIT_DATE "2026-Jul-5 16:13:12+0100" -#define SOURCE_COMMIT_HASH "331b708372a02428b395db71ce507905bdf4016e" From 89989ce9957442963b8460f4cbab4a1450b1c8c5 Mon Sep 17 00:00:00 2001 From: Patrick Date: Wed, 19 Aug 2026 02:18:45 +1000 Subject: [PATCH 41/68] Add logRotate and logTruncate options for the agent log (#358) Once the log reached maxLogSize it stopped silently and didn't resume until the file was deleted (#357). Keep that as the default but write a single marker line when the cap is hit, and add two opt-in alternatives: logRotate=N rotate to .1 .. .N at maxLogSize, then start fresh logTruncate=1 clear the file and keep logging instead of stopping logRotate takes precedence if both are set. --- meshcore/agentcore.c | 18 +++++++ meshcore/agentcore.h | 4 +- microstack/ILibParsers.c | 107 ++++++++++++++++++++++++++++++++++++++- microstack/ILibParsers.h | 6 +++ readme.md | 4 +- 5 files changed, 136 insertions(+), 3 deletions(-) diff --git a/meshcore/agentcore.c b/meshcore/agentcore.c index fe8228b98..e50576f20 100644 --- a/meshcore/agentcore.c +++ b/meshcore/agentcore.c @@ -4911,6 +4911,24 @@ int MeshAgent_AgentMode(MeshAgentHostContainer *agentHost, int paramLen, char ** } } + if (ILibSimpleDataStore_Get(agentHost->masterDb, "logRotate", NULL, 0) != 0) + { + int len = ILibSimpleDataStore_Get(agentHost->masterDb, "logRotate", ILibScratchPad, sizeof(ILibScratchPad)); + if (len < sizeof(ILibScratchPad)) + { + uint64_t val = 0; + if (ILib_atoi_uint64(&val, ILibScratchPad, len) == 0 && val > 0) + { + ILibCriticalLog_CapMode = ILibAppendStringToDisk_Cap_Rotate; + ILibCriticalLog_RotateCount = (int)val; // value doubles as how many rotated logs to keep + } + } + } + if (ILibCriticalLog_CapMode == ILibAppendStringToDisk_Cap_Stop && ILibSimpleDataStore_Get(agentHost->masterDb, "logTruncate", NULL, 0) != 0) + { + ILibCriticalLog_CapMode = ILibAppendStringToDisk_Cap_Truncate; + } + #ifdef WIN32 if (agentHost->noCertStore == 0) { agentHost->noCertStore = ILibSimpleDataStore_Get(agentHost->masterDb, "nocertstore", NULL, 0); } #endif diff --git a/meshcore/agentcore.h b/meshcore/agentcore.h index 39431472f..ef24ae884 100644 --- a/meshcore/agentcore.h +++ b/meshcore/agentcore.h @@ -289,8 +289,10 @@ fakeUpdate: If set, when the agent self-updates, it will update to the same forceUpdate: If set, will cause the agent to perform a self-update on next start. ignoreProxyFile: If set, will cause the agent to ignore any proxy settings logUpdate: If set, will cause the agent to log self-update status +logRotate: If set to N>0, rotates the log file at maxLogSize, keeping N older copies (meshagent.log.1..N) +logTruncate: If set, clears and continues the log at maxLogSize instead of stopping. Ignored if logRotate is set jsDebugPort: Specify a JS Debugger Port -maxLogSize: Specifies the maximum size of the error log file. +maxLogSize: Maximum size in bytes of the log file (default 524288). When reached, logging stops unless logRotate/logTruncate is set. nocertstore: If set on Windows, will force the Agent to use OpenSSL instead of WinCrypto for cert generation/storage. readonly: If set, forces the agent to open the database in readonly mode readmsh: If set while db is in readonly mode, it will cache the local msh file in the readonly db diff --git a/microstack/ILibParsers.c b/microstack/ILibParsers.c index 0a0bc5a72..6470b64bd 100644 --- a/microstack/ILibParsers.c +++ b/microstack/ILibParsers.c @@ -9654,6 +9654,109 @@ void ILibAppendStringToDiskEx2(char *FileName, char *data, int dataLen, uint64_t fclose(SourceFile); } } +static int ILibRenameFileOnDisk(char *source, char *destination) +{ +#ifdef WIN32 + WCHAR SourceW[4096]; + WCHAR DestW[4096]; + ILibUTF8ToWideEx(source, -1, SourceW, (int)sizeof(SourceW) / 2); + ILibUTF8ToWideEx(destination, -1, DestW, (int)sizeof(DestW) / 2); + DeleteFileW(DestW); // MoveFileW fails if the destination already exists; POSIX rename() replaces it + return(MoveFileW(SourceW, DestW) ? 0 : 1); +#else + return(rename(source, destination)); +#endif +} +void ILibAppendStringToDiskEx3(char *FileName, char *data, int dataLen, uint64_t maxSize, int capMode, int maxCount) +{ + FILE *SourceFile = NULL; + uint64_t curSize; + + if (maxSize == 0) { ILibAppendStringToDiskEx2(FileName, data, dataLen, 0); return; } // 0 == unbounded, no cap policy to apply + +#ifdef WIN32 + _wfopen_s(&SourceFile, ILibUTF8ToWide(FileName, -1), L"ab"); +#else + SourceFile = fopen(FileName, "ab"); +#endif + if (SourceFile == NULL) { return; } + + fseek(SourceFile, 0, SEEK_END); +#ifdef WIN32 + curSize = (uint64_t)_ftelli64(SourceFile); +#else + curSize = (uint64_t)ftell(SourceFile); +#endif + + if (curSize < maxSize) + { + if (fwrite(data, sizeof(char), dataLen, SourceFile)) {} + if (capMode == ILibAppendStringToDisk_Cap_Stop) + { + // Stop mode goes silent once capped; leave a one-time marker on the entry that crosses the limit. + fseek(SourceFile, 0, SEEK_END); +#ifdef WIN32 + if ((uint64_t)_ftelli64(SourceFile) >= maxSize) +#else + if ((uint64_t)ftell(SourceFile) >= maxSize) +#endif + { + char *capMsg = "\r\n[log size limit reached - logging suspended until the file is rotated or removed]"; + if (fwrite(capMsg, sizeof(char), (int)strnlen_s(capMsg, 128), SourceFile)) {} + } + } + fclose(SourceFile); + return; + } + + if (capMode == ILibAppendStringToDisk_Cap_Truncate) + { + fclose(SourceFile); +#ifdef WIN32 + _wfopen_s(&SourceFile, ILibUTF8ToWide(FileName, -1), L"wb"); +#else + SourceFile = fopen(FileName, "wb"); +#endif + if (SourceFile != NULL) + { + if (fwrite(data, sizeof(char), dataLen, SourceFile)) {} + fclose(SourceFile); + } + } + else if (capMode == ILibAppendStringToDisk_Cap_Rotate) + { + int i; + char rotateFrom[4096]; + char rotateTo[4096]; + fclose(SourceFile); + if (maxCount < 1) { maxCount = 1; } + + // Shift .1 .. .(maxCount-1) up one (oldest .maxCount is overwritten), then current file becomes .1 + for (i = maxCount - 1; i >= 1; --i) + { + sprintf_s(rotateFrom, sizeof(rotateFrom), "%s.%d", FileName, i); + sprintf_s(rotateTo, sizeof(rotateTo), "%s.%d", FileName, i + 1); + ILibRenameFileOnDisk(rotateFrom, rotateTo); + } + sprintf_s(rotateTo, sizeof(rotateTo), "%s.1", FileName); + ILibRenameFileOnDisk(FileName, rotateTo); + +#ifdef WIN32 + _wfopen_s(&SourceFile, ILibUTF8ToWide(FileName, -1), L"ab"); +#else + SourceFile = fopen(FileName, "ab"); +#endif + if (SourceFile != NULL) + { + if (fwrite(data, sizeof(char), dataLen, SourceFile)) {} + fclose(SourceFile); + } + } + else + { + fclose(SourceFile); + } +} void ILibDeleteFileFromDisk(char *FileName) { #if defined(WIN32) || defined(_WIN32_WCE) @@ -10967,6 +11070,8 @@ void ILib6to4(struct sockaddr* addr) // Log a critical error to file char ILibCriticalLogBuffer[sizeof(ILibScratchPad)]; uint64_t ILibCriticalLog_MaxSize = ILIBCRITICALLOG_DEFAULT_MAXSIZE; +int ILibCriticalLog_CapMode = ILibAppendStringToDisk_Cap_Stop; +int ILibCriticalLog_RotateCount = 1; char* ILibCriticalLog (const char* msg, const char* file, int line, int user1, int user2) { @@ -10980,7 +11085,7 @@ char* ILibCriticalLog (const char* msg, const char* file, int line, int user1, i { len = sprintf_s(ILibCriticalLogBuffer, sizeof(ILibCriticalLogBuffer), "\r\n[%s] [%s] %s", timeStamp, g_ILibCrashID_HASH != NULL ? g_ILibCrashID_HASH : "", msg); } - if (len > 0 && len < (int)sizeof(ILibCriticalLogBuffer) && ILibCriticalLogFilename != NULL) ILibAppendStringToDiskEx2(ILibCriticalLogFilename, ILibCriticalLogBuffer, len, ILibCriticalLog_MaxSize); + if (len > 0 && len < (int)sizeof(ILibCriticalLogBuffer) && ILibCriticalLogFilename != NULL) ILibAppendStringToDiskEx3(ILibCriticalLogFilename, ILibCriticalLogBuffer, len, ILibCriticalLog_MaxSize, ILibCriticalLog_CapMode, ILibCriticalLog_RotateCount); if (file != NULL) { ILibRemoteLogging_printf(ILibChainGetLogger(gILibChain), ILibRemoteLogging_Modules_Microstack_Generic, ILibRemoteLogging_Flags_VerbosityLevel_1, "%s:%d (%d,%d) %s", file, line, user1, user2, msg); diff --git a/microstack/ILibParsers.h b/microstack/ILibParsers.h index 9279e3d57..00da0fd54 100644 --- a/microstack/ILibParsers.h +++ b/microstack/ILibParsers.h @@ -936,6 +936,10 @@ int ILibIsRunningOnChainThread(void* chain); void ILibWriteStringToDisk(char *FileName, char *data); void ILibAppendStringToDiskEx2(char *FileName, char *data, int dataLen, uint64_t maxSize); void ILibWriteStringToDiskEx(char *FileName, char *data, int dataLen); + #define ILibAppendStringToDisk_Cap_Stop 0 + #define ILibAppendStringToDisk_Cap_Truncate 1 + #define ILibAppendStringToDisk_Cap_Rotate 2 + void ILibAppendStringToDiskEx3(char *FileName, char *data, int dataLen, uint64_t maxSize, int capMode, int maxCount); void ILibDeleteFileFromDisk(char *FileName); void ILibGetDiskFreeSpace(void *i64FreeBytesToCaller, void *i64TotalBytes); int ILibFile_CopyTo(char *source, char *destination); @@ -1603,6 +1607,8 @@ int ILibIsRunningOnChainThread(void* chain); #define ILIBCRITICALLOG_DEFAULT_MAXSIZE 524288 extern uint64_t ILibCriticalLog_MaxSize; + extern int ILibCriticalLog_CapMode; + extern int ILibCriticalLog_RotateCount; #define ILIBCRITICALEXITMSG(code, msg) {printf("%s", ILibCriticalLog(msg, __FILE__, __LINE__, 0, 0)); exit(code);} #define ILIBLOGMESSSAGE(msg) ILibCriticalLog(msg, __FILE__, __LINE__, 0, 0) void ILIBLOGMESSAGEX(char *format, ...); diff --git a/readme.md b/readme.md index d80dfe918..37b83586b 100644 --- a/readme.md +++ b/readme.md @@ -50,8 +50,10 @@ Here is a list of the possible keys that are currently supported by the agent. N | `forceUpdate` | If set, causes the agent to perform a self-update on next start. | | `ignoreProxyFile` | If set, causes the agent to ignore any proxy settings. | | `logUpdate` | If set, causes the agent to log self-update status. | +| `logRotate` | If set to N (greater than 0), rotates the log file when it reaches `maxLogSize`, keeping N older copies (`meshagent.log.1` … `meshagent.log.N`). | +| `logTruncate` | If set, clears the log file and continues when it reaches `maxLogSize` instead of stopping. Ignored if `logRotate` is set. | | `jsDebugPort` | Specifies a JS debugger port. | -| `maxLogSize` | Maximum size of the error log file. | +| `maxLogSize` | Maximum size in bytes of the log file (`meshagent.log`). Default 524288 (512 KiB). When reached, logging stops by default unless `logRotate` or `logTruncate` is set. | | `nocertstore` | Windows only. Forces the agent to use OpenSSL instead of WinCrypto for cert generation/storage. | | `readonly` | If set, forces the agent to open the database in read-only mode. | | `readmsh` | If set while db is in read-only mode, caches the local `.msh` file in the read-only db. | From f3ecb67be915ffff6a74560b5980a1f839e22b55 Mon Sep 17 00:00:00 2001 From: PTR <47147771+PTR-inc@users.noreply.github.com> Date: Tue, 18 Aug 2026 18:19:37 +0200 Subject: [PATCH 42/68] Fix -exec and -b64exec script handling (#376) * fix typo: integragedJavaScriptLen > integratedJavaScriptLen * Fix -exec arg parameter length Now uses the real size of the provided script. ILibScratchPad is a 4096 char buffer and ILibStringCopy with a length arg of 0 also uses iLibScratchPad as a default/max size. If a larger script was provided, it got silently truncated and execution failed. * Fix -b64exec parameter length Use the real length of the provided script. ILibScratchPad2 is a 64k buffer, large, but with base64 text it could still be a reachable limit. --- meshconsole/main.c | 7 ++--- meshservice/ServiceMain.c | 58 +++++++++++++++++++-------------------- 2 files changed, 32 insertions(+), 33 deletions(-) diff --git a/meshconsole/main.c b/meshconsole/main.c index b70a50815..8dbcab0bf 100644 --- a/meshconsole/main.c +++ b/meshconsole/main.c @@ -145,13 +145,12 @@ char* crashMemory = ILib_POSIX_InstallCrashHandler(argv[0]); if (argc > 2 && strcmp(argv[1], "-exec") == 0 && integratedJavaScriptLen == 0) { - integratedJavaScript = ILibString_Copy(argv[2], 0); - integratedJavaScriptLen = (int)strnlen_s(integratedJavaScript, sizeof(ILibScratchPad)); + integratedJavaScriptLen = (int)strlen(argv[2]); + integratedJavaScript = ILibString_Copy(argv[2], (size_t)integratedJavaScriptLen); } if (argc > 2 && strcmp(argv[1], "-b64exec") == 0) { - integratedJavaScript = NULL; - integratedJavaScriptLen = ILibBase64Decode((unsigned char *)argv[2], (const int)strnlen_s(argv[2], sizeof(ILibScratchPad2)), (unsigned char**)&integratedJavaScript); + integratedJavaScriptLen = ILibBase64Decode((unsigned char *)argv[2], (const int)strlen(argv[2]), (unsigned char**)&integratedJavaScript); } if (argc > 1 && strcasecmp(argv[1], "-nodeid") == 0 && integratedJavaScriptLen == 0) { diff --git a/meshservice/ServiceMain.c b/meshservice/ServiceMain.c index f92a15741..f68a90272 100644 --- a/meshservice/ServiceMain.c +++ b/meshservice/ServiceMain.c @@ -541,7 +541,7 @@ int wmain(int argc, char* wargv[]) return(0); } char *integratedJavaScript = NULL; - int integragedJavaScriptLen = 0; + int integratedJavaScriptLen = 0; if (argc > 1 && strcasecmp(argv[1], "-info") == 0) { @@ -557,7 +557,7 @@ int wmain(int argc, char* wargv[]) printf("Agent ARCHID: %d\n", MESH_AGENTID); char script[] = "var _tmp = 'Detected OS: ' + require('os').Name; try{_tmp += (' - ' + require('os').arch());}catch(x){}console.log(_tmp);if(process.platform=='win32'){ _tmp=require('win-authenticode-opus')(process.execPath); if(_tmp!=null && _tmp.url!=null){ _tmp=require('win-authenticode-opus').locked(_tmp.url); if(_tmp!=null) { console.log('LOCKED to: ' + _tmp.dns); console.log(' => ' + _tmp.id); } } } process.exit();"; integratedJavaScript = ILibString_Copy(script, sizeof(script) - 1); - integragedJavaScriptLen = (int)sizeof(script) - 1; + integratedJavaScriptLen = (int)sizeof(script) - 1; } if (argc > 2 && strcasecmp(argv[1], "-faddr") == 0) @@ -585,113 +585,113 @@ int wmain(int argc, char* wargv[]) return(0); } - if (integratedJavaScript == NULL || integragedJavaScriptLen == 0) + if (integratedJavaScript == NULL || integratedJavaScriptLen == 0) { - ILibDuktape_ScriptContainer_CheckEmbedded(&integratedJavaScript, &integragedJavaScriptLen); + ILibDuktape_ScriptContainer_CheckEmbedded(&integratedJavaScript, &integratedJavaScriptLen); } - if (argc > 1 && strcmp(argv[1], "-export") == 0 && integragedJavaScriptLen == 0) + if (argc > 1 && strcmp(argv[1], "-export") == 0 && integratedJavaScriptLen == 0) { integratedJavaScript = ILibString_Copy("require('code-utils').expand({embedded: true});process.exit();", 0); - integragedJavaScriptLen = (int)strnlen_s(integratedJavaScript, sizeof(ILibScratchPad)); + integratedJavaScriptLen = (int)strnlen_s(integratedJavaScript, sizeof(ILibScratchPad)); } - if (argc > 1 && strcmp(argv[1], "-import") == 0 && integragedJavaScriptLen == 0) + if (argc > 1 && strcmp(argv[1], "-import") == 0 && integratedJavaScriptLen == 0) { integratedJavaScript = ILibString_Copy("require('code-utils').shrink();process.exit();", 0); - integragedJavaScriptLen = (int)strnlen_s(integratedJavaScript, sizeof(ILibScratchPad)); + integratedJavaScriptLen = (int)strnlen_s(integratedJavaScript, sizeof(ILibScratchPad)); } - if (argc > 2 && strcmp(argv[1], "-exec") == 0 && integragedJavaScriptLen == 0) + if (argc > 2 && strcmp(argv[1], "-exec") == 0 && integratedJavaScriptLen == 0) { - integratedJavaScript = ILibString_Copy(argv[2], 0); - integragedJavaScriptLen = (int)strnlen_s(integratedJavaScript, sizeof(ILibScratchPad)); + integratedJavaScriptLen = (int)strlen(argv[2]); + integratedJavaScript = ILibString_Copy(argv[2], (size_t)integratedJavaScriptLen); } - if (argc > 2 && strcmp(argv[1], "-b64exec") == 0 && integragedJavaScriptLen == 0) + if (argc > 2 && strcmp(argv[1], "-b64exec") == 0 && integratedJavaScriptLen == 0) { - integragedJavaScriptLen = ILibBase64Decode((unsigned char *)argv[2], (const int)strnlen_s(argv[2], sizeof(ILibScratchPad2)), (unsigned char**)&integratedJavaScript); + integratedJavaScriptLen = ILibBase64Decode((unsigned char *)argv[2], (const int)strlen(argv[2]), (unsigned char**)&integratedJavaScript); } if (argc > 1 && strcasecmp(argv[1], "-nodeid") == 0) { char script[] = "console.log(require('_agentNodeId')());process.exit();"; integratedJavaScript = ILibString_Copy(script, sizeof(script) - 1); - integragedJavaScriptLen = (int)sizeof(script) - 1; + integratedJavaScriptLen = (int)sizeof(script) - 1; } if (argc > 1 && strcasecmp(argv[1], "-name") == 0) { char script[] = "console.log(require('_agentNodeId').serviceName());process.exit();"; integratedJavaScript = ILibString_Copy(script, sizeof(script) - 1); - integragedJavaScriptLen = (int)sizeof(script) - 1; + integratedJavaScriptLen = (int)sizeof(script) - 1; } if (argc > 1 && (strcasecmp(argv[1], "exstate") == 0)) { char script[] = "var r={rawState: -1, state: 'NOT INSTALLED'};try{r=require('service-manager').manager.getService(require('_agentNodeId').serviceName()).status;}catch(z){};console.log(r.state);process.exit(r.rawState);"; integratedJavaScript = ILibString_Copy(script, sizeof(script) - 1); - integragedJavaScriptLen = (int)sizeof(script) - 1; + integratedJavaScriptLen = (int)sizeof(script) - 1; } if (argc > 1 && (strcasecmp(argv[1], "state") == 0)) { char script[] = "try{console.log(require('service-manager').manager.getService(require('_agentNodeId').serviceName()).status.state);}catch(z){console.log('NOT INSTALLED');};process.exit();"; integratedJavaScript = ILibString_Copy(script, sizeof(script) - 1); - integragedJavaScriptLen = (int)sizeof(script) - 1; + integratedJavaScriptLen = (int)sizeof(script) - 1; } if (argc > 1 && (strcasecmp(argv[1], "start") == 0 || strcasecmp(argv[1], "-start") == 0)) { char script[] = "try{require('service-manager').manager.getService(require('_agentNodeId').serviceName()).start();console.log('Service Started');}catch(z){console.log('Failed to start service');}process.exit();"; integratedJavaScript = ILibString_Copy(script, sizeof(script) - 1); - integragedJavaScriptLen = (int)sizeof(script) - 1; + integratedJavaScriptLen = (int)sizeof(script) - 1; } if (argc > 1 && (strcasecmp(argv[1], "stop") == 0 || strcasecmp(argv[1], "-stop") == 0)) { char script[] = "try{require('service-manager').manager.getService(require('_agentNodeId').serviceName()).stop().then(function(m){console.log('Service Stopped');process.exit();}, function(m){console.log(m);process.exit();});}catch(z){console.log('Failed to stop service');process.exit();}"; integratedJavaScript = ILibString_Copy(script, sizeof(script) - 1); - integragedJavaScriptLen = (int)sizeof(script) - 1; + integratedJavaScriptLen = (int)sizeof(script) - 1; } if (argc > 1 && (strcasecmp(argv[1], "restart") == 0 || strcasecmp(argv[1], "-restart") == 0)) { char script[] = "try{require('service-manager').manager.getService(require('_agentNodeId').serviceName()).restart().then(function(m){console.log('Service Restarted');process.exit();}, function(m){console.log(m);process.exit();});}catch(z){console.log('Failed to restart service');process.exit();}"; integratedJavaScript = ILibString_Copy(script, sizeof(script) - 1); - integragedJavaScriptLen = (int)sizeof(script) - 1; + integratedJavaScriptLen = (int)sizeof(script) - 1; } - if (argc > 1 && strcasecmp(argv[1], "-agentHash") == 0 && integragedJavaScriptLen == 0) + if (argc > 1 && strcasecmp(argv[1], "-agentHash") == 0 && integratedJavaScriptLen == 0) { char script[] = "console.log(getSHA384FileHash(process.execPath).toString('hex').substring(0,16));process.exit();"; integratedJavaScript = ILibString_Copy(script, sizeof(script) - 1); - integragedJavaScriptLen = (int)sizeof(script) - 1; + integratedJavaScriptLen = (int)sizeof(script) - 1; } - if (argc > 1 && strcasecmp(argv[1], "-agentFullHash") == 0 && integragedJavaScriptLen == 0) + if (argc > 1 && strcasecmp(argv[1], "-agentFullHash") == 0 && integratedJavaScriptLen == 0) { char script[] = "console.log(getSHA384FileHash(process.execPath).toString('hex'));process.exit();"; integratedJavaScript = ILibString_Copy(script, sizeof(script) - 1); - integragedJavaScriptLen = (int)sizeof(script) - 1; + integratedJavaScriptLen = (int)sizeof(script) - 1; } if (argc == 2 && (strcasecmp(argv[1], "-resetnodeid") == 0)) { // Set "resetnodeid" in registry char script[] = "try{require('_agentNodeId').resetNodeId();}catch(z){console.log('This command requires admin.');}process.exit();"; integratedJavaScript = ILibString_Copy(script, sizeof(script) - 1); - integragedJavaScriptLen = (int)sizeof(script) - 1; + integratedJavaScriptLen = (int)sizeof(script) - 1; } if (argc > 1 && (strcasecmp(argv[1], "-setfirewall") == 0)) { // Reset the firewall rules char script[] = "require('agent-installer').setfirewall();"; integratedJavaScript = ILibString_Copy(script, sizeof(script) - 1); - integragedJavaScriptLen = (int)sizeof(script) - 1; + integratedJavaScriptLen = (int)sizeof(script) - 1; } if (argc > 1 && (strcasecmp(argv[1], "-clearfirewall") == 0)) { // Clear the firewall rules char script[] = "require('agent-installer').clearfirewall();"; integratedJavaScript = ILibString_Copy(script, sizeof(script) - 1); - integragedJavaScriptLen = (int)sizeof(script) - 1; + integratedJavaScriptLen = (int)sizeof(script) - 1; } if (argc > 1 && (strcasecmp(argv[1], "-checkfirewall") == 0)) { // Clear the firewall rules char script[] = "require('agent-installer').checkfirewall();"; integratedJavaScript = ILibString_Copy(script, sizeof(script) - 1); - integragedJavaScriptLen = (int)sizeof(script) - 1; + integratedJavaScriptLen = (int)sizeof(script) - 1; } CoInitializeEx(NULL, COINIT_MULTITHREADED); if (argc > 1 && strcasecmp(argv[1], "-updaterversion") == 0) @@ -791,7 +791,7 @@ int wmain(int argc, char* wargv[]) if (argc > 1 && ((strcasecmp(argv[1], "connect") == 0))) { capabilities = MeshCommand_AuthInfo_CapabilitiesMask_TEMPORARY; } agent = MeshAgent_Create(capabilities); agent->meshCoreCtx_embeddedScript = integratedJavaScript; - agent->meshCoreCtx_embeddedScriptLen = integragedJavaScriptLen; + agent->meshCoreCtx_embeddedScriptLen = integratedJavaScriptLen; if (integratedJavaScript != NULL || (argc > 1 && (strcasecmp(argv[1], "run") == 0 || strcasecmp(argv[1], "connect") == 0))) { agent->runningAsConsole = 1; } MeshAgent_Start(agent, argc, argv); retCode = agent->exitCode; From f01f763eae2656fb6cc7216c4c1359a625344e54 Mon Sep 17 00:00:00 2001 From: Anthony Cochenour Date: Tue, 18 Aug 2026 10:30:08 -0600 Subject: [PATCH 43/68] Fix noncanonical Base64 padding in WebSocket client keys (#369) Fix Base64 pad bits for one-byte final blocks ILibencodeblock read in[1] even when len was 1. This caused an out-of-bounds read and allowed four adjacent-memory bits to populate the unused Base64 pad bits. WebSocket client nonces are 16 bytes, so every Sec-WebSocket-Key generation exercised this path. Strict RFC 4648 decoders reject the resulting noncanonical encoding. Zero the unused bits when len is 1 and add RFC 4648/RFC 6455 regression coverage. Impact assessment: This change does not modify the decoded nonce bytes, protocol version, agent configuration, or server behavior. It only ensures that unused Base64 pad bits are zero and prevents the one-byte out-of-bounds read. Co-authored-by: Anthony Cochenour --- microstack/ILibParsers.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/microstack/ILibParsers.c b/microstack/ILibParsers.c index 6470b64bd..0f5ebd16c 100644 --- a/microstack/ILibParsers.c +++ b/microstack/ILibParsers.c @@ -7373,7 +7373,8 @@ static const char cd64[]="|$$$}rstuvwxyz{$$$$$$$>?@ABCDEFGHIJKLMNOPQRSTUVW$$$$$$ void ILibencodeblock( unsigned char in[3], unsigned char out[4], int len ) { out[0] = cb64[ in[0] >> 2 ]; - out[1] = cb64[ ((in[0] & 0x03) << 4) | ((in[1] & 0xf0) >> 4) ]; + /* RFC 4648 section 3.5 requires unused pad bits to be zero. */ + out[1] = cb64[ ((in[0] & 0x03) << 4) | (len > 1 ? ((in[1] & 0xf0) >> 4) : 0) ]; out[2] = (unsigned char) (len > 1 ? cb64[ ((in[1] & 0x0f) << 2) | (len>2?((in[2] & 0xc0) >> 6):0) ] : '='); out[3] = (unsigned char) (len > 2 ? cb64[ in[2] & 0x3f ] : '='); } From ac950e5c46eb062f5f347660985ec02c233d4e8a Mon Sep 17 00:00:00 2001 From: Karol Grodzicki Date: Tue, 18 Aug 2026 18:30:55 +0200 Subject: [PATCH 44/68] Remove unused signcheck code (#361) --- meshcore/agentcore.c | 1 - meshcore/signcheck.c | 225 -------------------------------------- meshcore/signcheck.h | 19 ---- meshservice/ServiceMain.c | 2 - 4 files changed, 247 deletions(-) delete mode 100644 meshcore/signcheck.c delete mode 100644 meshcore/signcheck.h diff --git a/meshcore/agentcore.c b/meshcore/agentcore.c index e50576f20..a3fbd3d0d 100644 --- a/meshcore/agentcore.c +++ b/meshcore/agentcore.c @@ -25,7 +25,6 @@ limitations under the License. #endif #include "agentcore.h" -#include "signcheck.h" #include "meshdefines.h" #include "meshinfo.h" #include "microscript/ILibDuktape_Commit.h" diff --git a/meshcore/signcheck.c b/meshcore/signcheck.c deleted file mode 100644 index 30d63a3f5..000000000 --- a/meshcore/signcheck.c +++ /dev/null @@ -1,225 +0,0 @@ -/* -Copyright 2006 - 2018 Intel Corporation - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#if defined(WIN32) && !defined(_MINCORE) -#include -#include -#include -#include -#endif - -#ifdef WIN32 -#include -#include -#include -#include -#endif - -#include "MeshDefines.h" -#include "signcheck.h" -#include "microstack/ILibParsers.h" -#include "microstack/ILibCrypto.h" - - -// Trusted mesh agent update certificate hashs -const int TrustedCertificatesCount = 2; -const char TrustedCertificates[2][32] = { - { 0xde, 0x6e, 0x97, 0x6d, 0x14, 0xe9, 0x5e, 0xd6, 0x71, 0xe6, 0xd8, 0x14, 0x36, 0xd2, 0x66, 0x43, 0x03, 0x02, 0x8f, 0x5c, 0xf3, 0x63, 0x11, 0x78, 0x95, 0xc1, 0x01, 0xd0, 0xba, 0x22, 0x02, 0x23 }, - { 0xd1, 0x7a, 0xae, 0x40, 0x9a, 0xef, 0x05, 0xf6, 0x4a, 0x6e, 0x18, 0x55, 0x97, 0xb5, 0x97, 0xd8, 0xb7, 0x8d, 0xb7, 0xae, 0x14, 0x47, 0xe3, 0xfb, 0xa1, 0x81, 0x08, 0xcf, 0x11, 0xcf, 0x67, 0x3c } -}; - - -//! Check the file signature of an executable -/*! -\param filename File path to executable to verify -\param upgrade 1 = 'filename' expected to be a higher version. \n 2 = 'filename' is expected to be the same version -\return 0 = FAIL \n 1 = SUCCESS -*/ -int signcheck_verifysign(char* filename, int upgrade) -{ -#if defined(WIN32) && !defined(_MINCORE) - int i, ver = 0, agentid = 0, found = 0; - size_t len = 0; - WCHAR str[_MAX_PATH]; - GUID guidAction = WINTRUST_ACTION_GENERIC_VERIFY_V2; - WINTRUST_FILE_INFO sWintrustFileInfo; - WINTRUST_DATA sWintrustData; - char hash[32]; - CRYPT_PROVIDER_DATA const *psProvData = NULL; - CRYPT_PROVIDER_SGNR *psProvSigner = NULL; - CRYPT_PROVIDER_CERT *psProvCert = NULL; - - // Setup and check the executable signature hash & certificate - memset((void*)&sWintrustFileInfo, 0x00, sizeof(WINTRUST_FILE_INFO)); - memset((void*)&sWintrustData, 0x00, sizeof(WINTRUST_DATA)); - mbstowcs_s(&len, str, _MAX_PATH, filename, _MAX_PATH); - - sWintrustFileInfo.cbStruct = sizeof(WINTRUST_FILE_INFO); - sWintrustFileInfo.pcwszFilePath = str; - sWintrustFileInfo.hFile = NULL; - sWintrustData.cbStruct = sizeof(WINTRUST_DATA); - sWintrustData.dwUIChoice = WTD_UI_NONE; - sWintrustData.fdwRevocationChecks = WTD_REVOKE_NONE; - sWintrustData.dwUnionChoice = WTD_CHOICE_FILE; - sWintrustData.pFile = &sWintrustFileInfo; - sWintrustData.dwStateAction = WTD_STATEACTION_VERIFY; // Allocates memory that must be cleared - sWintrustData.dwProvFlags = WTD_HASH_ONLY_FLAG; - - if (WinVerifyTrust((HWND)INVALID_HANDLE_VALUE, &guidAction, &sWintrustData) == 0) - { - if ((psProvData = WTHelperProvDataFromStateData(sWintrustData.hWVTStateData)) != 0) - { - if ((psProvSigner = WTHelperGetProvSignerFromChain((PCRYPT_PROVIDER_DATA)psProvData, 0, FALSE, 0)) != 0) - { - if ((psProvCert = WTHelperGetProvCertFromChain(psProvSigner, 0)) != 0) - { - util_sha384((char*)(psProvCert->pCert->pbCertEncoded), psProvCert->pCert->cbCertEncoded, hash); - for (i = 0; (int)i < TrustedCertificatesCount; i++) if (memcmp(TrustedCertificates[i], hash, 32) == 0) found = 1; - } - } - } - } - - // Cleanup - sWintrustData.dwUIChoice = WTD_UI_NONE; - sWintrustData.dwStateAction = WTD_STATEACTION_CLOSE; - WinVerifyTrust((HWND)INVALID_HANDLE_VALUE, &guidAction, &sWintrustData); - if (found == 0) return 0; // Problem, exit now - - // Get the version number of the executable - if (GetFileVersionInfo(filename, 0, sizeof(ILibScratchPad2), ILibScratchPad2)) - { - VS_FIXEDFILEINFO *pFileInfo; - int buflen; - - if (VerQueryValueA(ILibScratchPad2, "\\", (LPVOID *)&pFileInfo, (PUINT)&buflen)) - { - ver += HIWORD(pFileInfo->dwFileVersionMS) * 10000; - ver += LOWORD(pFileInfo->dwFileVersionMS) * 100; - ver += HIWORD(pFileInfo->dwFileVersionLS); -#ifdef _WIN64 - agentid = LOWORD(pFileInfo->dwFileVersionLS) + 1; -#else - agentid = LOWORD(pFileInfo->dwFileVersionLS); -#endif - } - } - - // Compare architecture - // Setup the AgentID - if (agentid != MESH_AGENTID) { ILIBMESSAGE("BAD-ARCH-CHECK"); return 0; } // TODO: Replace AGENTID_WIN32_SERVICE with real value - - // Compare version information - if (upgrade) return (ver >= MESH_AGENT_VERSION ? 1 : 0); // Debug: upgrades should normally be stricly better versions. - return (ver == MESH_AGENT_VERSION ? 1 : 0); -#else - FILE *pFile = NULL; - size_t totallen = 0; - size_t len = 0; - int endblock[4]; - char* signatureblock = NULL; - int signatureblocklen = 0; - SHA512_CTX c; - char *buf = NULL; - char *hashs = NULL; - int hashslen; - char totalfilehash[32]; - struct util_cert cert; - size_t i = 0; - int j = 0; - char* certbuf = NULL; - int certbuflen = 0; - int found = 0; - char certhash[32]; - int agentid = 0; - int ver = 0; - - if (filename == NULL) return 0; - cert.pkey = NULL; - cert.x509 = NULL; - -#ifdef WIN32 - _wfopen_s(&pFile, ILibUTF8ToWide(filename, -1), L"rb"); -#else - pFile = fopen(filename, "rb"); -#endif - if (pFile == NULL) goto error; - - // Get the file total length - if (fseek(pFile, 0, SEEK_END)) goto error; - if ((totallen = ftell(pFile)) < 16) goto error; - - // Seek 16 bytes before the end of the file and read the end block - if (fseek(pFile, -16, SEEK_END)) goto error; - if (fread(&endblock, 1, 16, pFile) != 16) goto error; - endblock[0] = ntohl(endblock[0]); - endblock[1] = ntohl(endblock[1]); - endblock[2] = ntohl(endblock[2]); - endblock[3] = ntohl(endblock[3]); - if (endblock[1] != 1 || endblock[2] != 0x11BB22DD || endblock[3] != 0x21CB32ED || totallen <= (size_t)(endblock[0] + 16)) goto error; - - // Seek back and get the signature block - if (fseek(pFile, -(endblock[0] + 16), SEEK_END)) goto error; - if ((signatureblock = (char*)malloc(endblock[0])) == NULL) goto error; - signatureblocklen = fread(signatureblock, 1, endblock[0], pFile); - - // Decode and verify the signature block - hashslen = util_verify(signatureblock, signatureblocklen, &cert, &hashs); - if (hashslen != 72) goto error; - - // Set the file version and architecture numbers - ver = ntohl(((int*)hashs)[16]); - agentid = ntohl(((int*)hashs)[17]); - - // Compare architecture - if (agentid != g_agentid) { ILIBMESSAGE("BAD-ARCH-CHECK"); fclose(pFile); return 0; } - - // Seek to the start and hash the entire file except for the signature stuff at the end - SHA384_Init(&c); - if (fseek(pFile, 0, SEEK_SET)) goto error; - i = totallen - (size_t)(endblock[0] + 16); - if ((buf = (char*)malloc(4096)) == NULL) goto error; - while ((i > 0) && (len = fread(buf, 1, i > 4096 ? 4096 : i, pFile)) > 0) { SHA384_Update(&c, buf, len); i -= len; } - free(buf); - if (i != 0) goto error; - SHA384_Final((unsigned char*)totalfilehash, &c); - - // Check that the file hash is the same as the second hash in the hash block - if (memcmp(hashs + 48, totalfilehash, 48) != 0) goto error; - - // Get the public certificate block - certbuflen = util_to_cer(cert, &certbuf); - - // Compute the certificate key hash - util_sha384(certbuf, certbuflen, certhash); - - // Check if the certificate is trusted - for (j = 0; j < TrustedCertificatesCount; j++) if (memcmp(TrustedCertificates[j], certhash, 48) == 0) found = 1; - -error: - // Clean up - util_freecert(&cert); - if (certbuf != NULL) free(certbuf); - if (hashs != NULL) free(hashs); - if (pFile != NULL) fclose(pFile); - if (signatureblock != NULL) free(signatureblock); - if (found != 1 || ver == 0 || agentid == 0) return 0; - - // Compare version information - if (upgrade) return (ver >= MESH_AGENT_VERSION ? 1 : 0); // Debug: upgrades should normally be stricly better versions. - return (ver == MESH_AGENT_VERSION ? 1 : 0); -#endif -} diff --git a/meshcore/signcheck.h b/meshcore/signcheck.h deleted file mode 100644 index b49d39cbd..000000000 --- a/meshcore/signcheck.h +++ /dev/null @@ -1,19 +0,0 @@ -/* -Copyright 2006 - 2018 Intel Corporation - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#pragma once - -int signcheck_verifysign(char* filename, int upgrade); diff --git a/meshservice/ServiceMain.c b/meshservice/ServiceMain.c index f68a90272..544183f80 100644 --- a/meshservice/ServiceMain.c +++ b/meshservice/ServiceMain.c @@ -28,7 +28,6 @@ limitations under the License. #include #include #include "resource.h" -#include "meshcore/signcheck.h" #include "meshcore/meshdefines.h" #include "meshcore/meshinfo.h" #include "microstack/ILibParsers.h" @@ -921,7 +920,6 @@ int wmain(int argc, char* wargv[]) printf(" restart Restart the service.\r\n"); printf(" stop Stop the service.\r\n"); printf(" state Display the running state of the service.\r\n"); - printf(" -signcheck Perform self - check.\r\n"); printf(" -install Install the service from this location.\r\n"); printf(" -uninstall Remove the service from this location.\r\n"); printf(" -nodeid Return the current agent identifier.\r\n"); From 2a62865afd0828d65ff7644b16779522a13b911d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Chabowski?= Date: Tue, 18 Aug 2026 18:33:15 +0200 Subject: [PATCH 45/68] Minimize memory leaks when server is unreachable (#350) * close `HCERTSTORE` and `HCRYPTMSG` handles in `win-authenticode-opus` * Add missing call to `ILibDestructParserResults` * Remove redundant `ILibMemory_Free`, already cleared in `ILibLifeTime_Remove` via `DestroyPtr` * Add another explicit call to Duktape Garbage Collector * Cache Win32 authenticode check across reconnect cycles * Clean-up the authenticode cache code --- meshcore/agentcore.c | 39 +++++++++++++++++++++----------- meshcore/agentcore.h | 1 + modules/win-authenticode-opus.js | 14 ++++++++---- 3 files changed, 37 insertions(+), 17 deletions(-) diff --git a/meshcore/agentcore.c b/meshcore/agentcore.c index a3fbd3d0d..1d9ccbcec 100644 --- a/meshcore/agentcore.c +++ b/meshcore/agentcore.c @@ -3551,7 +3551,6 @@ void MeshServer_OnResponse(ILibWebClient_StateObject WebStateObject, int Interru if (agent->controlChannelRequest != NULL) { ILibLifeTime_Remove(ILibGetBaseTimer(agent->chain), agent->controlChannelRequest); - ILibMemory_Free(agent->controlChannelRequest); agent->controlChannelRequest = NULL; } @@ -4025,6 +4024,7 @@ void MeshServer_ConnectEx(MeshAgentHostContainer *agent) { printf("agentcore: DNS Lock[%s]: Unauthorized to connect to: %s\n", agent->DNS_LOCK, host); free(host); free(path); + ILibDestructParserResults(rs); ILibLifeTime_Add(ILibGetBaseTimer(agent->chain), agent, 5, MeshServer_ConnectEx_Lockout_Retry, NULL); return; } @@ -4102,6 +4102,7 @@ void MeshServer_ConnectEx(MeshAgentHostContainer *agent) { printf("agentcore: ServerID Lock: ServerID MISMATCH for: %s\n", host); free(host); free(path); + ILibDestructParserResults(rs); ILibLifeTime_Add(ILibGetBaseTimer(agent->chain), agent, 5, MeshServer_ConnectEx_Lockout_Retry, NULL); return; } @@ -4264,20 +4265,11 @@ void MeshServer_Agent_SelfTest(MeshAgentHostContainer *agent) duk_pop(agent->meshCoreCtx); } -void MeshServer_Connect(MeshAgentHostContainer *agent) +#ifdef WIN32 +static void MeshServer_CheckAuthenticode(MeshAgentHostContainer *agent) { - unsigned int timeout; + if (agent->authenticodeChecked != 0) return; - // If this is called while we are in any connection state, just leave now. - if (agent->serverConnectionState != 0) return; - - if (ILibSimpleDataStore_Get(agent->masterDb, "selfTest", NULL, 0) != 0) - { - MeshServer_Agent_SelfTest(agent); - return; - } - -#ifdef WIN32 duk_idx_t top = duk_get_top(agent->meshCoreCtx); if (duk_peval_string(agent->meshCoreCtx, "require('win-authenticode-opus')(process.execPath);") == 0) // [obj] { @@ -4301,6 +4293,26 @@ void MeshServer_Connect(MeshAgentHostContainer *agent) } } duk_set_top(agent->meshCoreCtx, top); // ... + duk_gc(agent->meshCoreCtx, 0); + agent->authenticodeChecked = 1; +} +#endif + +void MeshServer_Connect(MeshAgentHostContainer *agent) +{ + unsigned int timeout; + + // If this is called while we are in any connection state, just leave now. + if (agent->serverConnectionState != 0) return; + + if (ILibSimpleDataStore_Get(agent->masterDb, "selfTest", NULL, 0) != 0) + { + MeshServer_Agent_SelfTest(agent); + return; + } + +#ifdef WIN32 + MeshServer_CheckAuthenticode(agent); #endif util_random(sizeof(int), (char*)&timeout); @@ -4527,6 +4539,7 @@ MeshAgentHostContainer* MeshAgent_Create(MeshCommand_AuthInfo_CapabilitiesMask c retVal->shCore = NULL; } } + retVal->authenticodeChecked = 0; #endif retVal->agentID = (AgentIdentifiers)MESH_AGENTID; diff --git a/meshcore/agentcore.h b/meshcore/agentcore.h index ef24ae884..d762ca4cb 100644 --- a/meshcore/agentcore.h +++ b/meshcore/agentcore.h @@ -187,6 +187,7 @@ typedef struct MeshAgentHostContainer DpiAwarenessFunc dpiAwareness; char DNS_LOCK[255]; char ID_LOCK[255]; + int authenticodeChecked; #endif int showModuleNames; diff --git a/modules/win-authenticode-opus.js b/modules/win-authenticode-opus.js index 471e16ac2..82b4040c9 100644 --- a/modules/win-authenticode-opus.js +++ b/modules/win-authenticode-opus.js @@ -33,6 +33,8 @@ function read(path) crypt.CreateMethod('CryptQueryObject'); crypt.CreateMethod('CryptMsgGetParam'); crypt.CreateMethod('CryptDecodeObject'); + crypt.CreateMethod('CertCloseStore'); + crypt.CreateMethod('CryptMsgClose'); var dwEncoding = GM.CreateVariable(4); var dwContentType = GM.CreateVariable(4); @@ -40,7 +42,7 @@ function read(path) var hStore = GM.CreatePointer(); var hMsg = GM.CreatePointer(); var dwSignerInfo = GM.CreateVariable(4); - var n, result; + var n, result = null; if (crypt.CryptQueryObject(CERT_QUERY_OBJECT_FILE, GM.CreateVariable(path, { wide: true }), CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED_EMBED, @@ -87,15 +89,19 @@ function read(path) var opus = GM.CreateVariable(dwData.toBuffer().readUInt32LE()); if (crypt.CryptDecodeObject(ENCODING, GM.CreateVariable(SPC_SP_OPUS_INFO_OBJID), pb, cb, 0, opus, dwData).Val != 0) { - - return ({ description: opus.Deref().Val != 0 ? opus.Deref().Wide2UTF8 : null, url: opus.Deref(GM.PointerSize, GM.PointerSize).Deref().Val != 0 ? opus.Deref(GM.PointerSize, GM.PointerSize).Deref().Deref(GM.PointerSize, GM.PointerSize).Deref().Wide2UTF8.trim() : null }); + result = { description: opus.Deref().Val != 0 ? opus.Deref().Wide2UTF8 : null, url: opus.Deref(GM.PointerSize, GM.PointerSize).Deref().Val != 0 ? opus.Deref(GM.PointerSize, GM.PointerSize).Deref().Deref(GM.PointerSize, GM.PointerSize).Deref().Wide2UTF8.trim() : null }; } } + break; } } } } - return (null); + + if (hMsg.Deref().Val != 0) { crypt.CryptMsgClose(hMsg.Deref()); } + if (hStore.Deref().Val != 0) { crypt.CertCloseStore(hStore.Deref(), 0); } + + return (result); } function locked(uri) { From 1bebea716a52d052fffcc2d1cea72e0f0fa1e341 Mon Sep 17 00:00:00 2001 From: Simon Smith Date: Tue, 18 Aug 2026 17:39:53 +0100 Subject: [PATCH 46/68] Add macOS build workflow for MeshAgent This workflow defines jobs for building the MeshAgent for both arm64 and x86_64 architectures on macOS. It includes steps for checking out the code, building the agent, and uploading the artifacts. --- .github/workflows/mac-build.yml | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 .github/workflows/mac-build.yml diff --git a/.github/workflows/mac-build.yml b/.github/workflows/mac-build.yml new file mode 100644 index 000000000..d0301c275 --- /dev/null +++ b/.github/workflows/mac-build.yml @@ -0,0 +1,33 @@ +name: macOS Build +run-name: Build Windows versions of MeshAgent +on: + push: + pull_request: +jobs: + macos-build-arm64: + name: macOS arm64 (ARCHID=29) + runs-on: macos-15 + steps: + - name: Check out repository code + uses: actions/checkout@v7.0.0 + - name: Build meshagent (arm64, KVM enabled) + run: make -j4 macos ARCHID=29 + - name: Upload artifacts + uses: actions/upload-artifact@v7.0.1 + with: + name: meshagent-macos-arm64 + path: ${{ github.workspace }}/meshagent_* + + macos-build-x86_64: + name: macOS x86_64 (ARCHID=16) + runs-on: macos-15-intel + steps: + - name: Check out repository code + uses: actions/checkout@v7.0.0 + - name: Build meshagent (x86_64, KVM enabled) + run: make -j4 macos ARCHID=16 + - name: Upload artifacts + uses: actions/upload-artifact@v7.0.1 + with: + name: meshagent-macos-x86_64 + path: ${{ github.workspace }}/meshagent_* From 1922ee84293e9dc706b8c99c250cfbda48ed259a Mon Sep 17 00:00:00 2001 From: Simon Smith Date: Tue, 18 Aug 2026 17:53:48 +0100 Subject: [PATCH 47/68] Update workflow triggers for Linux build --- .github/workflows/linux-build.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/linux-build.yml b/.github/workflows/linux-build.yml index 72ce54709..913d5db92 100644 --- a/.github/workflows/linux-build.yml +++ b/.github/workflows/linux-build.yml @@ -1,6 +1,8 @@ name: Linux Build run-name: Build Linux versions of MeshAgent -on: [push] +on: + push: + pull_request: jobs: linux-build-x86: runs-on: ubuntu-24.04 From da8aed4c9e111f074cbe001ea65b3758477bdb17 Mon Sep 17 00:00:00 2001 From: Simon Smith Date: Tue, 18 Aug 2026 21:16:10 +0100 Subject: [PATCH 48/68] Update run-name for macOS build workflow --- .github/workflows/mac-build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/mac-build.yml b/.github/workflows/mac-build.yml index d0301c275..5363f5033 100644 --- a/.github/workflows/mac-build.yml +++ b/.github/workflows/mac-build.yml @@ -1,5 +1,5 @@ name: macOS Build -run-name: Build Windows versions of MeshAgent +run-name: Build MacOS versions of MeshAgent on: push: pull_request: From ca8d838e12101df9996c67db159b31b38787a20c Mon Sep 17 00:00:00 2001 From: Patrick Date: Thu, 20 Aug 2026 01:48:44 +1000 Subject: [PATCH 49/68] Add FreeBSD build workflow and pull request template (#384) - Introduced `.github/workflows/freebsd-build.yml` to enable FreeBSD binary builds inside a VM on a Linux runner, targeting x86_64 architecture. - Added `.github/PULL_REQUEST_TEMPLATE.md` for standardized pull request submissions with testing and documentation guidelines. --- .github/PULL_REQUEST_TEMPLATE.md | 58 +++++++++++++++++++++++++++++ .github/workflows/freebsd-build.yml | 28 ++++++++++++++ 2 files changed, 86 insertions(+) create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 .github/workflows/freebsd-build.yml diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 000000000..823def898 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,58 @@ + + +# Summary + +In this pull request, the following changes are made: + +- Foobar was changed to FooFoo, because ... + + + +- Relates to #issue-number +- Resolves #issue-number + +

+Please follow this checklist to avoid unnecessary back and forth (click to expand) + +- [ ] 🧠 I used LLMs/AI in this contribution and reviewed all generated content. + I understand that I am responsible for and able to explain every line of code I submit. +- [ ] 🛠️ I have self-reviewed my code and self-tested it against a MeshCentral server to ensure it works as expected. +- [ ] 🖥️ My change compiles on every platform it affects (Windows / Linux / macOS / FreeBSD), and I have considered + the impact on platforms and architectures I could not test. +- [ ] 📦 If I changed JavaScript modules under `modules/`, I re-embedded them so the compiled-in copies in + `microscript/ILibDuktape_Polyfills.c` match (the agent runs the embedded copies, not the files on disk). +- [ ] 🤖 I ran the agent self-test where appropriate (see "Self Test" in [readme.md](../readme.md)). +- [ ] 📄 Documentation updates are included (if applicable), e.g. the `.msh` options table in [readme.md](../readme.md). +- [ ] 🧰 Updates to vendored dependencies (OpenSSL, zlib, ...) are listed and explained. +- [ ] ⚠️ CI passes and is green (Windows / Linux / macOS / FreeBSD builds and CodeQL). + +
+ +## Testing + + + +| Platform (OS / distro / arch) | Tested | Result | +| ----------------------------- | ------ | ------ | +| e.g. Windows 11 x64 | ✅ | | +| e.g. Debian 13 x64 (Wayland) | ✅ | | + +## Screenshots for Visual Changes + + + +| Event | Before | After | +| ----- | --------------------- | -------------------- | +| | ![Before](image-link) | ![After](image-link) | diff --git a/.github/workflows/freebsd-build.yml b/.github/workflows/freebsd-build.yml new file mode 100644 index 000000000..81e91633e --- /dev/null +++ b/.github/workflows/freebsd-build.yml @@ -0,0 +1,28 @@ +name: FreeBSD Build +run-name: Build FreeBSD versions of MeshAgent +on: + push: + pull_request: +jobs: + freebsd-build-x86-64: + name: FreeBSD x86_64 (ARCHID=30) + # GitHub has no FreeBSD runners, so the build runs inside a FreeBSD VM on a Linux runner. + # Binaries built on an older FreeBSD release run on all newer ones, but not vice versa, + # so build on the oldest release CI can still support: 13.5 covers 13.x (TrueNAS CORE, + # older OPNsense/pfSense) through 15.x. FreeBSD 13 is EOL — if its pkg repo or VM image + # disappears and the "prepare" step starts failing, bump the release to 14.4. + runs-on: ubuntu-latest + steps: + - name: Check out repository code + uses: actions/checkout@v7.0.0 + - name: Build meshagent (x86_64) in FreeBSD VM + uses: vmactions/freebsd-vm@v1 + with: + release: "13.5" + prepare: pkg install -y gmake + run: gmake -j4 freebsd ARCHID=30 + - name: Upload artifacts + uses: actions/upload-artifact@v7.0.1 + with: + name: meshagent-freebsd-x86_64 + path: ${{ github.workspace }}/meshagent_* From ce8d73df7afdfcd8bc39526beabdb5c1dfef1e80 Mon Sep 17 00:00:00 2001 From: Patrick Date: Thu, 20 Aug 2026 03:27:44 +1000 Subject: [PATCH 50/68] Fix FreeBSD build workflow: install git and configure `safe.directory` to resolve missing header issue. (#385) --- .github/workflows/freebsd-build.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/freebsd-build.yml b/.github/workflows/freebsd-build.yml index 81e91633e..05c35ec62 100644 --- a/.github/workflows/freebsd-build.yml +++ b/.github/workflows/freebsd-build.yml @@ -19,7 +19,12 @@ jobs: uses: vmactions/freebsd-vm@v1 with: release: "13.5" - prepare: pkg install -y gmake + # The makefile generates ILibDuktape_Commit.h only when git works — without git the + # build fails on a missing header. safe.directory is needed because the rsynced + # repo is owned by the runner uid, not the VM user, so git refuses it otherwise. + prepare: | + pkg install -y gmake git + git config --global --add safe.directory '*' run: gmake -j4 freebsd ARCHID=30 - name: Upload artifacts uses: actions/upload-artifact@v7.0.1 From e0d78792e4ce76718cbeffca4ec67da0e73cf621 Mon Sep 17 00:00:00 2001 From: Patrick Date: Fri, 4 Sep 2026 20:25:37 +1000 Subject: [PATCH 51/68] Wayland and multimonitor support (#351) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add support for Wayland on Linux The Wayland support comes from changing the way input and output works: 1. Screen output is captured via DRM (Direct Rendering Manager) 2. Keyboard/Mouse input is injected via libevdev Both of these methods are lower level than the previous X11 code, so they're actually capable of becoming full replacements for the X11 mechanisms, should we ever want to do that. I've tried to make the changes minimally invasive to the existing code, instead of a big refactor into X11 vs DRM code paths. Known issues: 1. Logging out back to the greeter breaks the screen scraping. This is fixable, just requires work to figure some things out. 2. Cursor state is not reflected in the screen output To get the greeter working will require some more surgery. I haven't figured out how all of that session stuff works yet, but it is possible. It's largely just an issue of the system getting confused between Wayland/X11 states. One quite simple solution could be that once we detect Wayland, we remain in that state for the duration of the process life. I'm not sure if people care about dynamic switching between X11 and Wayland during a single boot - and I suspect not, so I think this would be a simple and robust solution to get the greeter working. If cursor state is necessary, then I can look into that. It just hasn't felt like a priority. I don't consider this work 100% finished. We still need to get the greeter working, and more testing/feedback. But if possible, I'd like to get this on a public branch so that I can start getting feedback. This work is sponsored by touchsource.com * Add new makefile linux package list for EGL/DRM * Fix signature of ValidateMeshServer This fixes a warning on modern compilers * Add a Wayland detection mechanism when there's no Xorg/X11 on the system Previously, we only worked on eg Ubuntu 24.04, where they still shipped Xorg/X11. Without this change the agent does not advertise desktop capability, and the "Desktop" tab in MeshCentral is unavailable. * Make wayland sticky This prevents us from switching back to X11 mode if we connect at the greeter screen. We may still be able to simplify the wayland detection to just the seat0 read. * Delete hacked-in polyfills.c code It was already in monitor-info.js * Add more logging and error checking to DRM/EGL code paths Aiming to find the reason why we're failing on i915 * Fix DRM capture breakage on screen blank, fix DRM handle leak * The screen capture now resumes automatically after a blank screen * Fixed leaking of framebuffer handle * Fixed spurious noisy logs on nvidia capture due to changing handles * Add rudimentary support for rotated wayland displays Unfortunately I haven't yet found a reliable universal way to detect display rotation on wayland, so I'm adding an env var override, eg For "portrait right": MESH_KVM_ROTATION=270 By setting MESH_KVM_ROTATION to anything besides zero, we force the treatment of the display as rotated by either 90,180,270 degrees. I split it into it's own .c file, because I forsee this getting a bit messy, having to support various compositors. * Improve DRM Wayland KVM multi-monitor layout handling Add multi-output DRM capture support and compose active scanout buffers into a single logical desktop frame. When running under KWin, read the session's logical output geometry and apply it to the DRM outputs so capture and input coordinates follow the desktop monitor arrangement, including scaled displays. Also make verbose DRM/EGL diagnostics opt-in through MESH_KVM_DRM_DEBUG to avoid repeated framebuffer logging during normal agent operation. * Require Wayland client support for Linux KVM builds Make Wayland client support mandatory for Linux KVM builds so release and CI builds cannot silently omit the generic xdg-output monitor layout path. The DRM backend now includes wayland-client directly, and the makefile fails early when the wayland-client development package is unavailable. This keeps Wayland monitor positioning and scaling behavior consistent between build servers and deployed agents. * Add DRM monitor selection support Populate the existing monitor list from DRM/Wayland logical outputs and advertise the normal multi-monitor display list in DRM mode. Allow MNG_KVM_SET_DISPLAY to select all monitors or an individual monitor, crop DRM capture to the selected output, and keep evdev absolute input mapped against the full virtual desktop so pointer control remains correct across non-origin displays. * Implement dynamic `dlopen` loading for libdrm, libEGL, and libGLESv2 Enable runtime loading of required libraries (libdrm, libEGL, and libGLESv2) using `dlopen` to allow the agent to function without a pre-installed GL/DRM stack. Refactor the makefile to remove hard library linking while retaining headers for build compatibility. Additionally, update Wayland integration to dynamically load libwayland-client and provide fallbacks for missing libraries. * Add display wake and broken-pipe handling improvements for DRM and KVM Introduce logic to nudge sleeping displays (DPMS) awake during DRM desktop layout calculations and retry within a timeout. Enhance KVM pipe cleanup by canceling timers and broken-pipe handlers to prevent errors from delayed memory access. Define `KVM_DRM_DISPLAY_WAKE_TIMEOUT_MS` and implement `kvm_events_evdev_wake` for pointer-based wake functionality. * Capture all GPUs in DRM KVM, not just one card Open every DRM card that has an active display and merge their outputs into one desktop, sorted by position. Each card gets its own EGL context pinned to its DRM node so a second GPU's frames aren't imported through the wrong driver and come out black. Also stops two cards with the same connector name (DP-1, etc.) from landing on the same monitor. * Update evdev pointer scaling logic to prevent double offset in single-monitor capture mode * Add Wayland clipboard support and improve evdev CapsLock handling Clipboard get/set only had the X11/xclip path, which cant reach the clipboard under Wayland. Added a wl-clipboard (wl-copy/wl-paste) backend that's used when a Wayland session is detected. Needs wl-clipboard installed on the target. The evdev key path dropped the Shift modifier on typed text, so shifted symbols came through wrong ($ became 4, _ became -, etc.), and it ignored Caps Lock so the case followed the remote Caps Lock state. Sync after each transition so Shift is held while the key is sent, and read the Caps Lock LED to keep the requested case for letters. * Update compressed clipboard module logic and source commit metadata * Fix DRM KVM black screening from lost GPU device access after a privilege drop The DRM capture child opens the card nodes as root, then drops to the logged-in user keeping only CAP_SYS_ADMIN. That also drops CAP_DAC_OVERRIDE, so from there access to /dev/dri/* comes down to plain group permissions. libEGL opens the render/card nodes itself during eglInitialize, which happens after the drop, so unless the session user was already in the render/video groups it failed with EACCES and the remote desktop came through black. The old X11 path never hit this because it goes through the X server socket and never touches the DRI nodes. Add the video and render groups to the session user's supplementary set during the drop, before the setuid, so GPU conversion works regardless of which groups the user is in or how mesa is packaged. Groups the distro doesn't define are skipped. Also mirror kvm_send_error() to stderr and move the evdev input-failure diagnostics off stdout. These only reached the MeshCentral viewer, or stdout which the systemd unit nulls, so permission failures like this were invisible in the agent's own logs. * Install libwayland-dev in the Linux build workflow The KVM builds need wayland-client (headers to compile linux_kvm_drm.c, and the makefile now hard-requires it), but the install step never pulled in libwayland-dev, so every KVM target failed at the wayland-client check before compiling anything. It's dlopen'd not linked, so the 64-bit dev package is enough for the -m32 build too. * Install libdrm/EGL/GLES dev headers in the Linux build workflow The DRM KVM path includes , and the libdrm headers directly (they're dlopen'd at runtime but still needed to compile), so the KVM builds failed on EGL/egl.h now that they get past the wayland-client check. Add libdrm-dev, libegl-dev and libgles-dev to both jobs. Headers only, nothing links them, so the 64-bit packages cover the -m32 build too. * Fix Wayland "Type" shift-drop on GNOME + re-embed stale clipboard modules The evdev unicode/Type path fired shift→key→release with no gap, and GNOME (via IBus) drops the modifier when events arrive that fast, so shifted chars lost their shift ($→4, _→-, |→\, caps→lowercase). Hold the key ~20ms with Shift held and pace characters out (same as ydotool on Wayland); tunable via MESH_KVM_KEY_DELAY_MS. KWin was unaffected. Also re-embedded the clipboard + monitor-info compressed modules, which were stale and missing the Wayland (wl-clipboard) code entirely. * Fix Wayland KVM multi-monitor layout (GNOME) and multi-plane (CCS) scanout - Multi-monitor 0,0 on GNOME: mutter names HDMI type-A "HDMI-" vs our "HDMI-A-", so the exact-strcmp connector match failed and the all-or-nothing xdg-output layout fell back to raw DRM 0,0. Add kvm_drm_connector_name_equal(). - Black screen on Intel CCS: two-plane (data+metadata) scanout were rejected; import all planes through EGL so the GPU decompresses during the blit. * Refactor Wayland session detection and Wayland greeter fallback - Updated `user-sessions.js` to handle case-insensitive matching for 'Display Manager', recognizing additional greeters (e.g., `_ldm`). - Enhanced `monitor-info.js` to detect Wayland sessions by introducing `kvmcheck_wayland_user` and implementing a fallback for greeter sessions (e.g., GDM/LightDM) to ensure detection before user login. - Re-embedded the updated compressed `monitor-info` and `user-sessions` modules. * Introduce graceful KVM session recovery during logout/user-switch - Added runtime-dir checks and grace periods to distinguish between transient display sleep and actual session teardown in the DRM path. - Implemented auto-recovery logic in capture child to handle unexpected exits, automatically re-derive active sessions, and re-fork capture processes, with burst-rate limiting to prevent fork storms. - Improved robustness in session user environment handling by avoiding restarts when X server properties are unavailable in Wayland environments. * Add rotation handling for Wayland DRM outputs and debug frame dumping - Implemented `kvm_drm_rotation` to account for rotation transforms for Wayland outputs and logical desktop alignment. - Added `kvm_drm_debug_dump_frame` to debug desktop orientation/layout issues by exporting PPM captures periodically. - Updated function signatures and Wayland transform handling to support output rotation, ensuring proper compositor synchronization. - Adjusted Makefile indentation for consistency. * Implement deadlock-safe writes to slave->master pipe in DRM mode - Introduced `kvm_drm_slave_write` for non-blocking, deadlock-safe writes, preventing session hangs under backpressure. - Replaced all direct `write` calls in DRM paths with the new draining writer to ensure stream consistency. - Added rotation handling for DRM planes via property queries, with fallback strategies for unsupported configurations. - Improved input message handling with buffered, real-time parsing to prevent interleaving issues. - Updated DRM initialization flow to enable universal planes and non-blocking pipes, supporting advanced configurations like plane rotation and multi-plane hardware scanouts. * Add XKB keymap support for Wayland sessions in KVM - Implemented `linux_kvm_xkb.c` to resolve Unicode codepoints to Wayland XKB keymap keystrokes, enabling input in non-US layouts and scripts. - Integrated XKB with the evdev input pipeline for seamless handling of Shift, AltGr, and CapsLock modifiers. - Updated `linux_events_evdev.c` with fallback to ASCII mapping when XKB is unavailable. * Refactor Wayland KVM implementation for improved compatibility and reliability - Replaced `wl_proxy_marshal_flags` with array marshallers for compatibility with libwayland < 1.20 on older systems (e.g., Debian 11 / Ubuntu 20.04). - Added deadline-bounded alternatives to `wl_display_roundtrip` to prevent session input/output stalls in hung compositors. - Enhanced DRM resource cleanup with `kvm_drm_close_frame_handles` to prevent GEM handle leaks. - Improved session user privilege drops with full cleanup of supplementary groups for security. - Introduced logging improvements for debugging Wayland and DRM behaviors. - Adjusted Makefile to validate required development headers, ensuring smoother build workflows. - Updated evdev F-key mappings and error output for consistent and readable diagnostic messages. * Enhance Wayland KVM fallback and input handling - Added fallback for compositors without `zxdg_output_manager_v1`, leveraging `wl_output` geometry and mode events as a minimal implementation for Greeter environments. - Improved lock state synchronization for evdev keyboards by adding `kvm_events_evdev_lock_state` and `kvm_events_evdev_wait_lock_state`, ensuring accurate CapsLock, NumLock, and ScrollLock state reporting. - Integrated Wayland active session UID derivation for display-manager greeters using `kvm_wayland_active_console_uid`. - Updated XKB keymap handling with group-aware lookup for precise input handling in multi-layout scenarios. - Introduced bounded timeouts for `wl-paste` and `wl-copy` to handle unresponsive compositor pipelines gracefully. - Optimized clipboard dispatch with lifetime caching of Wayland session state for reduced probe costs. * Improve session UID handling and environment inheritance in DRM path - Set `HOME` to the session user's directory to fix cache warnings in Mesa. - Trust `logind` for active session UID derivation, avoiding dead session binding. - Implement session handover detection with console UID mismatch checks. - Exit and re-fork on sustained UID mismatches during user switches or logouts. * Improve Wayland socket detection and error logging in DRM/XKB paths - Added `kvm_drm_wayland_socket_alive` to validate Wayland sockets with `connect()` checks, avoiding stale socket usage. - Improved error logging for `wl_display_connect` failures with additional context (`errno`, `XDG_RUNTIME_DIR`, `WAYLAND_DISPLAY`, etc.). - Updated environment preparation to scan for active Wayland sockets and prioritize live connections dynamically. - Enhanced fallback logic for `WAYLAND_DISPLAY` environment variable handling to improve robustness in session initialization. * Override inherited session environment variables for sudo scenarios - Updated `XDG_RUNTIME_DIR` and `DBUS_SESSION_BUS_ADDRESS` logic to prevent reuse of parent session values under sudo, addressing permission issues with root's runtime directory. - Added runtime directory existence checks to derive accurate session paths while retaining fallback for unsupported setups. --------- Co-authored-by: Ben Harper --- .github/workflows/linux-build.yml | 6 +- .gitignore | 3 + makefile | 86 +- meshcore/KVM/Linux/linux_events.c | 38 +- meshcore/KVM/Linux/linux_events.h | 10 + meshcore/KVM/Linux/linux_events_evdev.c | 1114 +++++++ meshcore/KVM/Linux/linux_kvm.c | 215 +- meshcore/KVM/Linux/linux_kvm.h | 14 + meshcore/KVM/Linux/linux_kvm_drm.c | 3637 +++++++++++++++++++++++ meshcore/KVM/Linux/linux_kvm_drm.h | 41 + meshcore/KVM/Linux/linux_kvm_drm_egl.c | 825 +++++ meshcore/KVM/Linux/linux_kvm_drm_egl.h | 79 + meshcore/KVM/Linux/linux_kvm_rotated.c | 170 ++ meshcore/KVM/Linux/linux_kvm_rotated.h | 34 + meshcore/KVM/Linux/linux_kvm_wayland.c | 186 ++ meshcore/KVM/Linux/linux_kvm_wayland.h | 34 + meshcore/KVM/Linux/linux_kvm_xkb.c | 697 +++++ meshcore/KVM/Linux/linux_kvm_xkb.h | 43 + meshcore/agentcore.c | 77 +- microscript/ILibDuktape_Polyfills.c | 6 +- modules/clipboard.js | 127 +- modules/monitor-info.js | 55 +- modules/user-sessions.js | 2 +- 23 files changed, 7404 insertions(+), 95 deletions(-) create mode 100644 meshcore/KVM/Linux/linux_events_evdev.c create mode 100644 meshcore/KVM/Linux/linux_kvm_drm.c create mode 100644 meshcore/KVM/Linux/linux_kvm_drm.h create mode 100644 meshcore/KVM/Linux/linux_kvm_drm_egl.c create mode 100644 meshcore/KVM/Linux/linux_kvm_drm_egl.h create mode 100644 meshcore/KVM/Linux/linux_kvm_rotated.c create mode 100644 meshcore/KVM/Linux/linux_kvm_rotated.h create mode 100644 meshcore/KVM/Linux/linux_kvm_wayland.c create mode 100644 meshcore/KVM/Linux/linux_kvm_wayland.h create mode 100644 meshcore/KVM/Linux/linux_kvm_xkb.c create mode 100644 meshcore/KVM/Linux/linux_kvm_xkb.h diff --git a/.github/workflows/linux-build.yml b/.github/workflows/linux-build.yml index 913d5db92..e54a5d56a 100644 --- a/.github/workflows/linux-build.yml +++ b/.github/workflows/linux-build.yml @@ -15,8 +15,8 @@ jobs: sudo apt clean all && sudo apt update && sudo apt-get install -y libx11-dev libxtst-dev libxext-dev libjpeg62-dev build-essential && sudo apt-get install -y linux-libc-dev:i386 libc6-dev-i386 libjpeg62-dev:i386 && - sudo apt-get install -y libc6-armel-cross libc6-dev-armel-cross binutils-arm-linux-gnueabi libncurses5-dev gcc-arm-linux-gnueabihf && - sudo apt-get install -y libxrandr-dev + sudo apt-get install -y libc6-armel-cross libc6-dev-armel-cross binutils-arm-linux-gnueabi libncurses5-dev gcc-arm-linux-gnueabihf && + sudo apt-get install -y libxrandr-dev libwayland-dev libdrm-dev libegl-dev libgles-dev - name: Build 32 Bit Linux run: make -j4 linux ARCHID=5 && make clean - name: Build 64 Bit Linux @@ -41,7 +41,7 @@ jobs: - name: Install Packages run: | sudo apt clean all && sudo apt update && - sudo apt-get install -y libx11-dev libxtst-dev libxext-dev libjpeg-dev libxrandr-dev build-essential + sudo apt-get install -y libx11-dev libxtst-dev libxext-dev libjpeg-dev libxrandr-dev libwayland-dev libdrm-dev libegl-dev libgles-dev build-essential - name: Build ARM64 Linux run: make -j4 linux ARCHID=26 && make clean - name: Upload Artifacts diff --git a/.gitignore b/.gitignore index 497721545..968585ad6 100644 --- a/.gitignore +++ b/.gitignore @@ -330,6 +330,9 @@ ASALocalRun/ # Klocwork .klocwork/ +# Generated module export workspace +modules_expanded/ + *.o ToolChains/ .DS_Store diff --git a/makefile b/makefile index d28f4c4a9..f6fa4cf9f 100644 --- a/makefile +++ b/makefile @@ -7,12 +7,12 @@ # Then do "make -j8" and get the resulting file /.libs/libturbojpeg.a # # -# To build MeshAgent2 on Linux you first got to download the dev libraries to compile the agent, we need x11, txt, ext and jpeg. To install, do this: +# To build MeshAgent2 on Linux you first got to download the dev libraries to compile the agent, we need x11, xtst, ext, xrandr, egl, glesv2, drm, wayland-client and jpeg. To install, do this: # Using APT: -# sudo apt-get install libx11-dev libxtst-dev libxext-dev libjpeg62-dev libxrandr-dev +# sudo apt-get install libx11-dev libxtst-dev libxext-dev libjpeg62-dev libxrandr-dev libegl1-mesa-dev libgles2-mesa-dev libdrm-dev libwayland-dev pkg-config # # Using YUM: -# sudo yum install libX11-devel libXtst-devel libXext-devel libjpeg-devel libXrandr-devel +# sudo yum install libX11-devel libXtst-devel libXext-devel libjpeg-devel libXrandr-devel mesa-libEGL-devel mesa-libGLES-devel libdrm-devel wayland-devel pkgconf # # NOTE: If you install headers for jpeg8, you need to put the compiled .a in the v80 folder, and specify JPEGVER=v80 when building MeshAgent # eg: make linux ARCHID=6 JPEGVER=v80 @@ -29,7 +29,7 @@ # make macos ARCHID=16 # macOS x86 64 bit # make macos ARCHID=29 # macOS ARM 64 bit # lipo -create -output meshagent_osx-universal-64 meshagent_osx-x86-64 meshagent_osx-arm-64 # Combine the two binaries into a universal binary -# +# # Special builds: # # make linux ARCHID=6 WEBLOG=1 KVM=0 # Linux x86 64 bit, with Web Logging, and KVM disabled @@ -547,29 +547,60 @@ endif ifeq ($(KVM),1) # Mesh Agent KVM, this is only included in builds that have KVM support -LINUXKVMSOURCES = meshcore/KVM/Linux/linux_kvm.c meshcore/KVM/Linux/linux_events.c meshcore/KVM/Linux/linux_tile.c meshcore/KVM/Linux/linux_compression.c +LINUXKVMSOURCES = meshcore/KVM/Linux/linux_kvm.c meshcore/KVM/Linux/linux_kvm_wayland.c meshcore/KVM/Linux/linux_kvm_drm.c meshcore/KVM/Linux/linux_kvm_drm_egl.c meshcore/KVM/Linux/linux_kvm_rotated.c meshcore/KVM/Linux/linux_kvm_xkb.c meshcore/KVM/Linux/linux_events.c meshcore/KVM/Linux/linux_events_evdev.c meshcore/KVM/Linux/linux_tile.c meshcore/KVM/Linux/linux_compression.c MACOSKVMSOURCES = meshcore/KVM/MacOS/mac_kvm.c meshcore/KVM/MacOS/mac_events.c meshcore/KVM/MacOS/mac_tile.c meshcore/KVM/Linux/linux_compression.c CFLAGS += -D_LINKVM - ifneq ($(JPEGVER),) - ifeq ($(LEGACY_LD),1) - LINUXFLAGS = lib-jpeg-turbo/linux/$(ARCHNAME)/$(JPEGVER)/libturbojpeg.a - else - LINUXFLAGS = -l:lib-jpeg-turbo/linux/$(ARCHNAME)/$(JPEGVER)/libturbojpeg.a - endif - MACOSFLAGS = ./lib-jpeg-turbo/macos/$(ARCHNAME)/$(JPEGVER)/libturbojpeg.a - else - ifeq ($(NOTURBOJPEG),1) - LINUXFLAGS = -ljpeg - else - ifeq ($(LEGACY_LD),1) - LINUXFLAGS = lib-jpeg-turbo/linux/$(ARCHNAME)/libturbojpeg.a - else - LINUXFLAGS = -l:lib-jpeg-turbo/linux/$(ARCHNAME)/libturbojpeg.a - endif - MACOSFLAGS = ./lib-jpeg-turbo/macos/$(ARCHNAME)/libturbojpeg.a - endif - endif - BSDFLAGS = /usr/local/lib/libjpeg.a +DRMLIBS = +# The DRM/Wayland header probes only make sense on Linux goals; macOS/BSD also set KVM=1 but a +# parse-time $(error) here would kill e.g. 'make macos' on hosts without wayland-client. +ifneq (,$(filter linux pi,$(MAKECMDGOALS))) + DRMCFLAGS = $(shell pkg-config --cflags libdrm egl glesv2 2>/dev/null) + # libdrm/libEGL/libGLESv2 are dlopen'd at runtime (linux_kvm_drm*.c), not linked, so they stay + # out of NEEDED and the agent runs without a DRM/GL stack. Headers still needed (DRMCFLAGS). + WAYLANDCLIENT = $(shell pkg-config --exists wayland-client 2>/dev/null && echo 1) + ifneq ($(strip $(DRMCFLAGS)),) + CFLAGS += $(DRMCFLAGS) + else + $(error Linux KVM builds require the libdrm, EGL and GLES development packages (pkg-config libdrm egl glesv2)) + endif + ifneq ($(WAYLANDCLIENT),1) + $(error Linux KVM builds require the wayland-client development package) + endif + CFLAGS += $(shell pkg-config --cflags wayland-client) + # libwayland-client is dlopen'd at runtime (linux_kvm_drm.c), not linked — headers only. + # If the system headers are jpeg8 (JPEG_LIB_VERSION >= 80) and a v80 lib exists, default to it + # so the linked lib matches the headers, else libjpeg aborts at runtime ("Wrong JPEG library + # version"). Skipped when JPEGVER is set explicitly or NOTURBOJPEG=1. + ifeq ($(JPEGVER),) + ifneq ($(NOTURBOJPEG),1) + JPEG_HDR_VERSION := $(shell $(CC) -include jpeglib.h -E -dM -xc - /dev/null | sed -n 's/.*JPEG_LIB_VERSION \([0-9][0-9]*\).*/\1/p' | head -n1) + ifeq ($(shell test "$(JPEG_HDR_VERSION)" -ge 80 2>/dev/null && test -f lib-jpeg-turbo/linux/$(ARCHNAME)/v80/libturbojpeg.a && echo yes),yes) + JPEGVER = v80 +$(info MeshAgent: system libjpeg is v$(JPEG_HDR_VERSION) (jpeg8); auto-selecting JPEGVER=v80) + endif + endif + endif +endif + ifneq ($(JPEGVER),) + ifeq ($(LEGACY_LD),1) + LINUXFLAGS = lib-jpeg-turbo/linux/$(ARCHNAME)/$(JPEGVER)/libturbojpeg.a + else + LINUXFLAGS = -l:lib-jpeg-turbo/linux/$(ARCHNAME)/$(JPEGVER)/libturbojpeg.a + endif + MACOSFLAGS = ./lib-jpeg-turbo/macos/$(ARCHNAME)/$(JPEGVER)/libturbojpeg.a + else + ifeq ($(NOTURBOJPEG),1) + LINUXFLAGS = -ljpeg + else + ifeq ($(LEGACY_LD),1) + LINUXFLAGS = lib-jpeg-turbo/linux/$(ARCHNAME)/libturbojpeg.a + else + LINUXFLAGS = -l:lib-jpeg-turbo/linux/$(ARCHNAME)/libturbojpeg.a + endif + MACOSFLAGS = ./lib-jpeg-turbo/macos/$(ARCHNAME)/libturbojpeg.a + endif + endif + BSDFLAGS = /usr/local/lib/libjpeg.a endif ifeq ($(LMS),0) @@ -791,11 +822,11 @@ $(LIBNAME): $(OBJECTS) $(SOURCES) # Compile on Raspberry Pi 2/3 with KVM pi: - $(MAKE) EXENAME="meshagent_pi" CFLAGS="-std=gnu99 -g -Wall -D_POSIX -DMICROSTACK_PROXY -DMICROSTACK_TLS_DETECT -D_LINKVM $(CWEBLOG) $(CWATCHDOG) -fno-strict-aliasing $(INCDIRS) -DMESH_AGENTID=25 -D_NOFSWATCHER -D_NOHECI" ADDITIONALSOURCES="$(LINUXKVMSOURCES)" LDFLAGS="-Lopenssl/libstatic/linux/pi -lrt $(LINUXSSL) $(LINUXFLAGS) $(LDFLAGS) $(LDEXTRA) -ldl" + $(MAKE) EXENAME="meshagent_pi" CFLAGS="-std=gnu99 -g -Wall -D_POSIX -DMICROSTACK_PROXY -DMICROSTACK_TLS_DETECT -D_LINKVM $(CWEBLOG) $(CWATCHDOG) -fno-strict-aliasing $(INCDIRS) -DMESH_AGENTID=25 -D_NOFSWATCHER -D_NOHECI" ADDITIONALSOURCES="$(LINUXKVMSOURCES)" LDFLAGS="-Lopenssl/libstatic/linux/pi -lrt $(LINUXSSL) $(LINUXFLAGS) $(LDFLAGS) $(LDEXTRA) $(DRMLIBS) -ldl" strip meshagent_pi linux: - $(MAKE) EXENAME="$(EXENAME)_$(ARCHNAME)$(EXENAME2)" AID="$(ARCHID)" ADDITIONALSOURCES="$(LINUXKVMSOURCES)" ADDITIONALFLAGS="-lrt -z noexecstack -z relro -z now" CFLAGS="-DJPEGMAXBUF=$(KVMMaxTile) -DMESH_AGENTID=$(ARCHID) $(CFLAGS) $(CEXTRA)" LDFLAGS="$(LINUXSSL) $(LINUXFLAGS) $(LDFLAGS) $(LDEXTRA) -ldl" + $(MAKE) EXENAME="$(EXENAME)_$(ARCHNAME)$(EXENAME2)" AID="$(ARCHID)" ADDITIONALSOURCES="$(LINUXKVMSOURCES)" ADDITIONALFLAGS="-lrt -z noexecstack -z relro -z now $(DRMLIBS)" CFLAGS="-DJPEGMAXBUF=$(KVMMaxTile) -DMESH_AGENTID=$(ARCHID) $(CFLAGS) $(CEXTRA)" LDFLAGS="$(LINUXSSL) $(LINUXFLAGS) $(LDFLAGS) $(LDEXTRA) -ldl" $(SYMBOLCP) $(STRIP) @@ -813,4 +844,3 @@ openbsd: $(MAKE) EXENAME="$(EXENAME)_$(ARCHNAME)$(EXENAME2)" ADDITIONALSOURCES="$(LINUXKVMSOURCES)" AID="$(ARCHID)" CFLAGS="-std=gnu99 -Wall -DJPEGMAXBUF=$(KVMMaxTile) -DMESH_AGENTID=$(ARCHID) -D_POSIX -D_FREEBSD -D_OPENBSD -D_NOHECI -D_NOILIBSTACKDEBUG -DMICROSTACK_PROXY -fno-strict-aliasing $(INCDIRS) $(CFLAGS) $(CEXTRA)" LDFLAGS="$(BSDSSL) $(BSDFLAGS) -L. -lpthread -lz -lutil $(LDFLAGS) $(LDEXTRA)" $(SYMBOLCP) $(STRIP) - diff --git a/meshcore/KVM/Linux/linux_events.c b/meshcore/KVM/Linux/linux_events.c index 4e2f35c22..17e613bcf 100644 --- a/meshcore/KVM/Linux/linux_events.c +++ b/meshcore/KVM/Linux/linux_events.c @@ -15,6 +15,7 @@ limitations under the License. */ #include "linux_events.h" +#include "linux_kvm_drm.h" #include "microstack/ILibParsers.h" #include "meshcore/meshdefines.h" @@ -137,6 +138,12 @@ static struct keymap_t g_keymap[] = { void MouseAction(double absX, double absY, int button, short wheel, Display *display) { + if (kvm_events_evdev_is_active()) + { + kvm_events_evdev_mouse_action(absX, absY, button, wheel); + return; + } + if (change_display) { return; } @@ -204,6 +211,22 @@ void KeyAction(unsigned char vk, int up, Display *display) unsigned int keycode = 0; if (up == 4) { up = 0; } + if (kvm_events_evdev_is_active()) + { + kvm_events_evdev_key_action(vk, up); + if (up && (vk == 0x14 || vk == 0x90 || vk == 0x91)) + { + // Mirror of the X11 block below: report the post-toggle lock state so the viewer's + // indicator follows. The compositor echoes the new state as EV_LED on our virtual + // keyboard; the bounded wait stands in for the X11 XSync round trip. + char ksbuf[5]; + ((unsigned short*)ksbuf)[0] = (unsigned short)htons((unsigned short)MNG_KVM_KEYSTATE); + ((unsigned short*)ksbuf)[1] = (unsigned short)htons((unsigned short)5); + ksbuf[4] = (char)kvm_events_evdev_wait_lock_state(100); + ignore_result(kvm_drm_slave_write(ksbuf, sizeof(ksbuf))); + } + return; + } if (up && (vk == 0x14 || vk == 0x90 || vk == 0x91)) { @@ -265,6 +288,12 @@ void KeyAction(unsigned char vk, int up, Display *display) } void KeyActionUnicode_UNMAP_ALL(Display *display) { + if (kvm_events_evdev_is_active()) + { + UNREFERENCED_PARAMETER(display); + return; + } + int i; for (i = 0; i < g_keyboardMapCount; ++i) { @@ -278,6 +307,13 @@ void KeyActionUnicode_UNMAP_ALL(Display *display) } void KeyActionUnicode(uint16_t unicode, int up, Display *display) { + if (kvm_events_evdev_is_active()) + { + UNREFERENCED_PARAMETER(display); + kvm_events_evdev_key_action_unicode(unicode, up); + return; + } + if (change_display) { return; } if (up == 0) @@ -313,4 +349,4 @@ void KeyActionUnicode(uint16_t unicode, int up, Display *display) } } } -} \ No newline at end of file +} diff --git a/meshcore/KVM/Linux/linux_events.h b/meshcore/KVM/Linux/linux_events.h index bcb0c414b..2213d0623 100644 --- a/meshcore/KVM/Linux/linux_events.h +++ b/meshcore/KVM/Linux/linux_events.h @@ -436,6 +436,16 @@ struct keymap_t { unsigned char vk; }; +extern int kvm_events_evdev_init(); +extern void kvm_events_evdev_shutdown(); +extern int kvm_events_evdev_lock_state(); +extern int kvm_events_evdev_wait_lock_state(int maxWaitMs); +extern int kvm_events_evdev_is_active(); +extern void kvm_events_evdev_mouse_action(double absX, double absY, int button, short wheel); +extern void kvm_events_evdev_key_action(unsigned char vk, int up); +extern void kvm_events_evdev_key_action_unicode(uint16_t unicode, int up); +extern void kvm_events_evdev_wake(); + extern void MouseAction(double absX, double absY, int button, short wheel, Display *display); extern void KeyAction(unsigned char vk, int up, Display *display); extern void KeyActionUnicode(uint16_t unicode, int up, Display *display); diff --git a/meshcore/KVM/Linux/linux_events_evdev.c b/meshcore/KVM/Linux/linux_events_evdev.c new file mode 100644 index 000000000..0bd0f18ea --- /dev/null +++ b/meshcore/KVM/Linux/linux_events_evdev.c @@ -0,0 +1,1114 @@ +/* +Copyright 2010 - 2011 Intel Corporation + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +#include "linux_events.h" +#include "linux_kvm_xkb.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(__linux__) + +#include + +struct libevdev; +struct libevdev_uinput; + +typedef struct libevdev *(*kvm_libevdev_new_fn)(void); +typedef void (*kvm_libevdev_free_fn)(struct libevdev *dev); +typedef int (*kvm_libevdev_set_name_fn)(struct libevdev *dev, const char *name); +typedef int (*kvm_libevdev_enable_event_type_fn)(struct libevdev *dev, unsigned int type); +typedef int (*kvm_libevdev_enable_event_code_fn)(struct libevdev *dev, unsigned int type, unsigned int code, const void *data); +typedef int (*kvm_libevdev_uinput_create_from_device_fn)(const struct libevdev *dev, int uinput_fd, struct libevdev_uinput **uinput_dev); +typedef void (*kvm_libevdev_uinput_destroy_fn)(struct libevdev_uinput *uinput_dev); +typedef int (*kvm_libevdev_uinput_write_event_fn)(const struct libevdev_uinput *uinput_dev, unsigned int type, unsigned int code, int value); +typedef int (*kvm_libevdev_uinput_get_fd_fn)(const struct libevdev_uinput *uinput_dev); +typedef const char *(*kvm_libevdev_strerror_fn)(int errcode); + +typedef struct kvm_evdev_exports +{ + void *library; + kvm_libevdev_new_fn libevdev_new; + kvm_libevdev_free_fn libevdev_free; + kvm_libevdev_set_name_fn libevdev_set_name; + kvm_libevdev_enable_event_type_fn libevdev_enable_event_type; + kvm_libevdev_enable_event_code_fn libevdev_enable_event_code; + kvm_libevdev_uinput_create_from_device_fn libevdev_uinput_create_from_device; + kvm_libevdev_uinput_destroy_fn libevdev_uinput_destroy; + kvm_libevdev_uinput_write_event_fn libevdev_uinput_write_event; + kvm_libevdev_uinput_get_fd_fn libevdev_uinput_get_fd; + kvm_libevdev_strerror_fn libevdev_strerror; +} kvm_evdev_exports; + +typedef struct kvm_evdev_state +{ + struct libevdev *dev; + struct libevdev_uinput *uinput; + int uinputFd; // only >= 0 on the explicit-open fallback; libevdev closes managed fds itself + int active; +} kvm_evdev_state; + +static kvm_evdev_exports g_kvm_evdev_exports = {0}; +static kvm_evdev_state g_kvm_evdev_state = {0}; +static int g_kvm_evdev_capslock = 0; +static int g_kvm_evdev_numlock = 0; +static int g_kvm_evdev_scrolllock = 0; + +extern int SCREEN_WIDTH; +extern int SCREEN_HEIGHT; +extern int VSCREEN_WIDTH; +extern int VSCREEN_HEIGHT; +extern int g_kvmBackendDRM; + +static const unsigned int g_kvm_evdev_alpha_keycodes[26] = { + KEY_A, KEY_B, KEY_C, KEY_D, KEY_E, KEY_F, KEY_G, KEY_H, KEY_I, KEY_J, KEY_K, KEY_L, KEY_M, + KEY_N, KEY_O, KEY_P, KEY_Q, KEY_R, KEY_S, KEY_T, KEY_U, KEY_V, KEY_W, KEY_X, KEY_Y, KEY_Z +}; +static const unsigned int g_kvm_evdev_digit_keycodes[10] = { + KEY_0, KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8, KEY_9 +}; +static const unsigned int g_kvm_evdev_numpad_keycodes[10] = { + KEY_KP0, KEY_KP1, KEY_KP2, KEY_KP3, KEY_KP4, KEY_KP5, KEY_KP6, KEY_KP7, KEY_KP8, KEY_KP9 +}; + +#define KVM_LIBEVDEV_UINPUT_OPEN_MANAGED -2 +#ifndef O_CLOEXEC +#define O_CLOEXEC 0 +#endif + +#ifndef KEY_BOOKMARKS +#define KEY_BOOKMARKS KEY_RESERVED +#endif +#ifndef KEY_HOMEPAGE +#define KEY_HOMEPAGE KEY_RESERVED +#endif +#ifndef KEY_MEDIA +#define KEY_MEDIA KEY_RESERVED +#endif +#ifndef KEY_PROG1 +#define KEY_PROG1 KEY_RESERVED +#endif +#ifndef KEY_PROG2 +#define KEY_PROG2 KEY_RESERVED +#endif +#ifndef KEY_BREAK +#define KEY_BREAK KEY_RESERVED +#endif +#ifndef KEY_OK +#define KEY_OK KEY_RESERVED +#endif +#ifndef KEY_KPCOMMA +#define KEY_KPCOMMA KEY_RESERVED +#endif +#ifndef KEY_PRINT +#define KEY_PRINT KEY_RESERVED +#endif + +void kvm_events_evdev_shutdown(); + +static int kvm_events_evdev_load_exports() +{ + if (g_kvm_evdev_exports.library != NULL) + { + return 1; + } + + g_kvm_evdev_exports.library = dlopen("libevdev.so.2", RTLD_NOW | RTLD_LOCAL); + if (g_kvm_evdev_exports.library == NULL) + { + g_kvm_evdev_exports.library = dlopen("libevdev.so", RTLD_NOW | RTLD_LOCAL); + if (g_kvm_evdev_exports.library == NULL) + { + return 0; + } + } + +#define KVM_DLSYM_REQ(name) \ + g_kvm_evdev_exports.name = (kvm_##name##_fn)dlsym(g_kvm_evdev_exports.library, #name); \ + if (g_kvm_evdev_exports.name == NULL) \ + { \ + dlclose(g_kvm_evdev_exports.library); \ + memset(&g_kvm_evdev_exports, 0, sizeof(g_kvm_evdev_exports)); \ + return 0; \ + } + + KVM_DLSYM_REQ(libevdev_new); + KVM_DLSYM_REQ(libevdev_free); + KVM_DLSYM_REQ(libevdev_set_name); + KVM_DLSYM_REQ(libevdev_enable_event_type); + KVM_DLSYM_REQ(libevdev_enable_event_code); + KVM_DLSYM_REQ(libevdev_uinput_create_from_device); + KVM_DLSYM_REQ(libevdev_uinput_destroy); + KVM_DLSYM_REQ(libevdev_uinput_write_event); + g_kvm_evdev_exports.libevdev_strerror = (kvm_libevdev_strerror_fn)dlsym(g_kvm_evdev_exports.library, "libevdev_strerror"); + g_kvm_evdev_exports.libevdev_uinput_get_fd = (kvm_libevdev_uinput_get_fd_fn)dlsym(g_kvm_evdev_exports.library, "libevdev_uinput_get_fd"); + +#undef KVM_DLSYM_REQ + return 1; +} + +static const char *kvm_events_evdev_error_string(int rc) +{ + int e = rc < 0 ? -rc : rc; + const char *ret = NULL; + + if (g_kvm_evdev_exports.libevdev_strerror != NULL) + { + ret = g_kvm_evdev_exports.libevdev_strerror(e); + } + if (ret == NULL) + { + ret = strerror(e); + } + return ret == NULL ? "unknown error" : ret; +} + +static int kvm_events_evdev_try_open_uinput() +{ + static const char *paths[] = { "/dev/uinput", "/dev/input/uinput", "/dev/misc/uinput" }; + size_t i = 0; + int fd = -1; + int lastErr = ENOENT; + + for (i = 0; i < (sizeof(paths) / sizeof(paths[0])); ++i) + { + fd = open(paths[i], O_RDWR | O_CLOEXEC); + if (fd >= 0) + { + return fd; + } + lastErr = errno; + } + errno = lastErr; + return -1; +} + +static unsigned int kvm_events_evdev_vk_to_keycode(unsigned char vk) +{ + if (vk >= VK_0 && vk <= VK_9) + { + return g_kvm_evdev_digit_keycodes[vk - VK_0]; + } + if (vk >= VK_A && vk <= VK_Z) + { + return g_kvm_evdev_alpha_keycodes[vk - VK_A]; + } + if (vk >= VK_NUMPAD0 && vk <= VK_NUMPAD9) + { + return g_kvm_evdev_numpad_keycodes[vk - VK_NUMPAD0]; + } + if (vk >= VK_F1 && vk <= VK_F24) + { + // Not KEY_F1 + n: Linux F-key codes are non-contiguous (F1-F10=59..68, then NUMLOCK/SCROLLLOCK, + // F11/F12=87/88, F13-F24=183..194), so the arithmetic form sent F11 as NumLock. + static const unsigned int fkeys[24] = { + KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, KEY_F6, KEY_F7, KEY_F8, KEY_F9, KEY_F10, + KEY_F11, KEY_F12, KEY_F13, KEY_F14, KEY_F15, KEY_F16, KEY_F17, KEY_F18, KEY_F19, KEY_F20, + KEY_F21, KEY_F22, KEY_F23, KEY_F24 + }; + return fkeys[vk - VK_F1]; + } + + switch (vk) + { + case VK_BACK: + return KEY_BACKSPACE; + case VK_TAB: + return KEY_TAB; + case VK_CLEAR: + return KEY_CLEAR; + case VK_RETURN: + return KEY_ENTER; + case VK_SHIFT: + return KEY_LEFTSHIFT; + case VK_CONTROL: + return KEY_LEFTCTRL; + case VK_MENU: + return KEY_LEFTALT; + case VK_PAUSE: + return KEY_PAUSE; + case VK_CAPITAL: + return KEY_CAPSLOCK; + // Same Japanese IME toggles the X11 keymap carries (XK_Kanji/XK_Kana_Shift). + case VK_KANA: + return KEY_KATAKANAHIRAGANA; + case VK_KANJI: + return KEY_ZENKAKUHANKAKU; + case VK_ESCAPE: + return KEY_ESC; + case VK_SPACE: + return KEY_SPACE; + case VK_PRIOR: + return KEY_PAGEUP; + case VK_NEXT: + return KEY_PAGEDOWN; + case VK_END: + return KEY_END; + case VK_HOME: + return KEY_HOME; + case VK_LEFT: + return KEY_LEFT; + case VK_UP: + return KEY_UP; + case VK_RIGHT: + return KEY_RIGHT; + case VK_DOWN: + return KEY_DOWN; + case VK_SELECT: + return KEY_SELECT; + case VK_PRINT: + return KEY_PRINT; + case VK_EXECUTE: + return KEY_OK; + case VK_SNAPSHOT: + return KEY_SYSRQ; + case VK_INSERT: + return KEY_INSERT; + case VK_DELETE: + return KEY_DELETE; + case VK_HELP: + return KEY_HELP; + case VK_CANCEL: + return KEY_BREAK; + case VK_LWIN: + return KEY_LEFTMETA; + case VK_RWIN: + return KEY_RIGHTMETA; + case VK_APPS: + return KEY_MENU; + case VK_SLEEP: + return KEY_SLEEP; + case VK_MULTIPLY: + return KEY_KPASTERISK; + case VK_ADD: + return KEY_KPPLUS; + case VK_SEPARATOR: + return KEY_KPCOMMA; + case VK_SUBTRACT: + return KEY_KPMINUS; + case VK_DECIMAL: + return KEY_KPDOT; + case VK_DIVIDE: + return KEY_KPSLASH; + case VK_NUMLOCK: + return KEY_NUMLOCK; + case VK_SCROLL: + return KEY_SCROLLLOCK; + case VK_LSHIFT: + return KEY_LEFTSHIFT; + case VK_RSHIFT: + return KEY_RIGHTSHIFT; + case VK_LCONTROL: + return KEY_LEFTCTRL; + case VK_RCONTROL: + return KEY_RIGHTCTRL; + case VK_LMENU: + return KEY_LEFTALT; + case VK_RMENU: + return KEY_RIGHTALT; + case VK_BROWSER_BACK: + return KEY_BACK; + case VK_BROWSER_FORWARD: + return KEY_FORWARD; + case VK_BROWSER_REFRESH: + return KEY_REFRESH; + case VK_BROWSER_STOP: + return KEY_STOP; + case VK_BROWSER_SEARCH: + return KEY_SEARCH; + case VK_BROWSER_FAVORITES: + return KEY_BOOKMARKS; + case VK_BROWSER_HOME: + return KEY_HOMEPAGE; + case VK_VOLUME_MUTE: + return KEY_MUTE; + case VK_VOLUME_DOWN: + return KEY_VOLUMEDOWN; + case VK_VOLUME_UP: + return KEY_VOLUMEUP; + case VK_MEDIA_NEXT_TRACK: + return KEY_NEXTSONG; + case VK_MEDIA_PREV_TRACK: + return KEY_PREVIOUSSONG; + case VK_MEDIA_STOP: + return KEY_STOPCD; + case VK_MEDIA_PLAY_PAUSE: + return KEY_PLAYPAUSE; + case VK_MEDIA_LAUNCH_MAIL: + return KEY_MAIL; + case VK_MEDIA_LAUNCH_MEDIA_SELECT: + return KEY_MEDIA; + case VK_MEDIA_LAUNCH_APP1: + return KEY_PROG1; + case VK_MEDIA_LAUNCH_APP2: + return KEY_PROG2; + case VK_OEM_1: + return KEY_SEMICOLON; + case VK_OEM_PLUS: + return KEY_EQUAL; + case VK_OEM_COMMA: + return KEY_COMMA; + case VK_OEM_MINUS: + return KEY_MINUS; + case VK_OEM_PERIOD: + return KEY_DOT; + case VK_OEM_2: + return KEY_SLASH; + case VK_OEM_3: + return KEY_GRAVE; + case VK_OEM_4: + return KEY_LEFTBRACE; + case VK_OEM_5: + return KEY_BACKSLASH; + case VK_OEM_6: + return KEY_RIGHTBRACE; + case VK_OEM_7: + return KEY_APOSTROPHE; + default: + return KEY_RESERVED; + } +} + +static int kvm_events_evdev_ascii_to_keycode(uint16_t unicode, unsigned int *keycode, int *needsShift) +{ + *needsShift = 0; + *keycode = KEY_RESERVED; + + if (unicode >= 'a' && unicode <= 'z') + { + *keycode = g_kvm_evdev_alpha_keycodes[unicode - 'a']; + return 1; + } + if (unicode >= 'A' && unicode <= 'Z') + { + *keycode = g_kvm_evdev_alpha_keycodes[unicode - 'A']; + *needsShift = 1; + return 1; + } + if (unicode >= '0' && unicode <= '9') + { + *keycode = g_kvm_evdev_digit_keycodes[unicode - '0']; + return 1; + } + + switch (unicode) + { + case ' ': + *keycode = KEY_SPACE; + return 1; + case '\t': + *keycode = KEY_TAB; + return 1; + case '\n': + case '\r': + *keycode = KEY_ENTER; + return 1; + case '\b': + *keycode = KEY_BACKSPACE; + return 1; + case '-': + *keycode = KEY_MINUS; + return 1; + case '_': + *keycode = KEY_MINUS; + *needsShift = 1; + return 1; + case '=': + *keycode = KEY_EQUAL; + return 1; + case '+': + *keycode = KEY_EQUAL; + *needsShift = 1; + return 1; + case '[': + *keycode = KEY_LEFTBRACE; + return 1; + case '{': + *keycode = KEY_LEFTBRACE; + *needsShift = 1; + return 1; + case ']': + *keycode = KEY_RIGHTBRACE; + return 1; + case '}': + *keycode = KEY_RIGHTBRACE; + *needsShift = 1; + return 1; + case '\\': + *keycode = KEY_BACKSLASH; + return 1; + case '|': + *keycode = KEY_BACKSLASH; + *needsShift = 1; + return 1; + case ';': + *keycode = KEY_SEMICOLON; + return 1; + case ':': + *keycode = KEY_SEMICOLON; + *needsShift = 1; + return 1; + case '\'': + *keycode = KEY_APOSTROPHE; + return 1; + case '"': + *keycode = KEY_APOSTROPHE; + *needsShift = 1; + return 1; + case ',': + *keycode = KEY_COMMA; + return 1; + case '<': + *keycode = KEY_COMMA; + *needsShift = 1; + return 1; + case '.': + *keycode = KEY_DOT; + return 1; + case '>': + *keycode = KEY_DOT; + *needsShift = 1; + return 1; + case '/': + *keycode = KEY_SLASH; + return 1; + case '?': + *keycode = KEY_SLASH; + *needsShift = 1; + return 1; + case '`': + *keycode = KEY_GRAVE; + return 1; + case '~': + *keycode = KEY_GRAVE; + *needsShift = 1; + return 1; + case '!': + *keycode = KEY_1; + *needsShift = 1; + return 1; + case '@': + *keycode = KEY_2; + *needsShift = 1; + return 1; + case '#': + *keycode = KEY_3; + *needsShift = 1; + return 1; + case '$': + *keycode = KEY_4; + *needsShift = 1; + return 1; + case '%': + *keycode = KEY_5; + *needsShift = 1; + return 1; + case '^': + *keycode = KEY_6; + *needsShift = 1; + return 1; + case '&': + *keycode = KEY_7; + *needsShift = 1; + return 1; + case '*': + *keycode = KEY_8; + *needsShift = 1; + return 1; + case '(': + *keycode = KEY_9; + *needsShift = 1; + return 1; + case ')': + *keycode = KEY_0; + *needsShift = 1; + return 1; + default: + return 0; + } +} + +static int kvm_events_evdev_write(unsigned int type, unsigned int code, int value) +{ + int r = 0; + if (g_kvm_evdev_state.active == 0 || g_kvm_evdev_state.uinput == NULL) + { + return -1; + } + + r = g_kvm_evdev_exports.libevdev_uinput_write_event(g_kvm_evdev_state.uinput, type, code, value); + if (r != 0) + { + kvm_events_evdev_shutdown(); + } + return r; +} + +static int kvm_events_evdev_sync() +{ + return kvm_events_evdev_write(EV_SYN, SYN_REPORT, 0); +} + +// The compositor mirrors the keyboard lock state onto every keyboard device, including ours, as +// EV_LED. Drain those updates so synthesized letters can honor the requested case instead of +// inverting under a remote CapsLock, and so the viewer's lock indicator can be kept current. +// State stays at 0 (no effect) if libevdev_uinput_get_fd is unavailable or no LED is delivered. +static void kvm_events_evdev_poll_leds() +{ + struct input_event ev; + struct pollfd pfd; + int fd; + + if (g_kvm_evdev_exports.libevdev_uinput_get_fd == NULL || g_kvm_evdev_state.uinput == NULL) { return; } + fd = g_kvm_evdev_exports.libevdev_uinput_get_fd(g_kvm_evdev_state.uinput); + if (fd < 0) { return; } + + pfd.fd = fd; + pfd.events = POLLIN; + pfd.revents = 0; + while (poll(&pfd, 1, 0) > 0 && (pfd.revents & POLLIN)) + { + if (read(fd, &ev, sizeof(ev)) != (ssize_t)sizeof(ev)) { break; } + if (ev.type == EV_LED && ev.code == LED_CAPSL) { g_kvm_evdev_capslock = ev.value ? 1 : 0; } + if (ev.type == EV_LED && ev.code == LED_NUML) { g_kvm_evdev_numlock = ev.value ? 1 : 0; } + if (ev.type == EV_LED && ev.code == LED_SCROLLL) { g_kvm_evdev_scrolllock = ev.value ? 1 : 0; } + pfd.revents = 0; + } +} + +// Wire bitmask for MNG_KVM_KEYSTATE: Num=bit0, Scroll=bit1, Caps=bit2. +int kvm_events_evdev_lock_state() +{ + kvm_events_evdev_poll_leds(); + return (g_kvm_evdev_numlock ? 1 : 0) | (g_kvm_evdev_scrolllock ? 2 : 0) | (g_kvm_evdev_capslock ? 4 : 0); +} + +// After injecting a lock key the compositor echoes the new state as EV_LED; wait (bounded) for that +// echo so the state reported to the viewer reflects the toggle that was just made. +int kvm_events_evdev_wait_lock_state(int maxWaitMs) +{ + int before = kvm_events_evdev_lock_state(); + int fd = -1; + int waited = 0; + + if (g_kvm_evdev_exports.libevdev_uinput_get_fd != NULL && g_kvm_evdev_state.uinput != NULL) + { + fd = g_kvm_evdev_exports.libevdev_uinput_get_fd(g_kvm_evdev_state.uinput); + } + if (fd < 0) { return before; } + + while (waited < maxWaitMs) + { + struct pollfd pfd; + int now; + int step = (maxWaitMs - waited) > 20 ? 20 : (maxWaitMs - waited); + pfd.fd = fd; + pfd.events = POLLIN; + pfd.revents = 0; + if (poll(&pfd, 1, step) <= 0) { waited += step; continue; } + now = kvm_events_evdev_lock_state(); + if (now != before) { return now; } + waited += 1; // events that changed nothing still count, so a chatty fd can't spin forever + } + return kvm_events_evdev_lock_state(); +} + +static int kvm_events_evdev_scale_axis(int value, int maxPixels) +{ + if (maxPixels <= 1) + { + if (value < 0) + { + return 0; + } + if (value > 65535) + { + return 65535; + } + return value; + } + + if (value < 0) + { + value = 0; + } + if (value >= maxPixels) + { + value = maxPixels - 1; + } + return (int)(((uint64_t)value * 65535ULL) / ((uint64_t)(maxPixels - 1))); +} + +int kvm_events_evdev_init() +{ + struct input_absinfo absInfo; + unsigned char vk = 0; + int keyEnabled[KEY_MAX + 1]; + unsigned int keycode = KEY_RESERVED; + int r = 0; + int createRc = 0; + int createManagedRc = 0; + int uinputFd = -1; + int uinputErrno = 0; + + if (g_kvm_evdev_state.active != 0) + { + return 1; + } + if (!kvm_events_evdev_load_exports()) + { + // stderr, not stdout: the systemd service runs with StandardOutput=null, so stdout logging is lost. + fprintf(stderr, "MeshAgent: Failed to load libevdev symbols\n"); fflush(stderr); + return 0; + } + + if (g_kvm_evdev_state.dev != NULL || g_kvm_evdev_state.uinput != NULL) + { + kvm_events_evdev_shutdown(); + } + memset(&g_kvm_evdev_state, 0, sizeof(g_kvm_evdev_state)); + g_kvm_evdev_state.uinputFd = -1; + + g_kvm_evdev_state.dev = g_kvm_evdev_exports.libevdev_new(); + if (g_kvm_evdev_state.dev == NULL) + { + return 0; + } + + ignore_result(g_kvm_evdev_exports.libevdev_set_name(g_kvm_evdev_state.dev, "MeshAgent Virtual Input")); + + r = g_kvm_evdev_exports.libevdev_enable_event_type(g_kvm_evdev_state.dev, EV_KEY); + if (r != 0) + { + fprintf(stderr, "MeshAgent: libevdev_enable_event_type(EV_KEY) failed: %d (%s)\n", r, kvm_events_evdev_error_string(r)); + goto error; + } + r = g_kvm_evdev_exports.libevdev_enable_event_type(g_kvm_evdev_state.dev, EV_REL); + if (r != 0) + { + fprintf(stderr, "MeshAgent: libevdev_enable_event_type(EV_REL) failed: %d (%s)\n", r, kvm_events_evdev_error_string(r)); + goto error; + } + r = g_kvm_evdev_exports.libevdev_enable_event_type(g_kvm_evdev_state.dev, EV_ABS); + if (r != 0) + { + fprintf(stderr, "MeshAgent: libevdev_enable_event_type(EV_ABS) failed: %d (%s)\n", r, kvm_events_evdev_error_string(r)); + goto error; + } + + memset(&absInfo, 0, sizeof(absInfo)); + absInfo.minimum = 0; + absInfo.maximum = 65535; + r = g_kvm_evdev_exports.libevdev_enable_event_code(g_kvm_evdev_state.dev, EV_ABS, ABS_X, &absInfo); + if (r != 0) + { + fprintf(stderr, "MeshAgent: libevdev_enable_event_code(EV_ABS, ABS_X) failed: %d (%s)\n", r, kvm_events_evdev_error_string(r)); + goto error; + } + r = g_kvm_evdev_exports.libevdev_enable_event_code(g_kvm_evdev_state.dev, EV_ABS, ABS_Y, &absInfo); + if (r != 0) + { + fprintf(stderr, "MeshAgent: libevdev_enable_event_code(EV_ABS, ABS_Y) failed: %d (%s)\n", r, kvm_events_evdev_error_string(r)); + goto error; + } + + r = g_kvm_evdev_exports.libevdev_enable_event_code(g_kvm_evdev_state.dev, EV_REL, REL_WHEEL, NULL); + if (r != 0) + { + fprintf(stderr, "MeshAgent: libevdev_enable_event_code(EV_REL, REL_WHEEL) failed: %d (%s)\n", r, kvm_events_evdev_error_string(r)); + goto error; + } + ignore_result(g_kvm_evdev_exports.libevdev_enable_event_code(g_kvm_evdev_state.dev, EV_REL, REL_HWHEEL, NULL)); + + // LED capability lets the compositor report the live lock states back to us (see poll_leds). + ignore_result(g_kvm_evdev_exports.libevdev_enable_event_type(g_kvm_evdev_state.dev, EV_LED)); + ignore_result(g_kvm_evdev_exports.libevdev_enable_event_code(g_kvm_evdev_state.dev, EV_LED, LED_CAPSL, NULL)); + ignore_result(g_kvm_evdev_exports.libevdev_enable_event_code(g_kvm_evdev_state.dev, EV_LED, LED_NUML, NULL)); + ignore_result(g_kvm_evdev_exports.libevdev_enable_event_code(g_kvm_evdev_state.dev, EV_LED, LED_SCROLLL, NULL)); + + memset(keyEnabled, 0, sizeof(keyEnabled)); + keyEnabled[BTN_LEFT] = g_kvm_evdev_exports.libevdev_enable_event_code(g_kvm_evdev_state.dev, EV_KEY, BTN_LEFT, NULL) == 0; + keyEnabled[BTN_RIGHT] = g_kvm_evdev_exports.libevdev_enable_event_code(g_kvm_evdev_state.dev, EV_KEY, BTN_RIGHT, NULL) == 0; + keyEnabled[BTN_MIDDLE] = g_kvm_evdev_exports.libevdev_enable_event_code(g_kvm_evdev_state.dev, EV_KEY, BTN_MIDDLE, NULL) == 0; + ignore_result(g_kvm_evdev_exports.libevdev_enable_event_code(g_kvm_evdev_state.dev, EV_KEY, BTN_SIDE, NULL)); + ignore_result(g_kvm_evdev_exports.libevdev_enable_event_code(g_kvm_evdev_state.dev, EV_KEY, BTN_EXTRA, NULL)); + + for (vk = 0; vk < 0xFF; ++vk) + { + keycode = kvm_events_evdev_vk_to_keycode(vk); + if (keycode != KEY_RESERVED && keycode <= KEY_MAX && !keyEnabled[keycode]) + { + if (g_kvm_evdev_exports.libevdev_enable_event_code(g_kvm_evdev_state.dev, EV_KEY, keycode, NULL) == 0) + { + keyEnabled[keycode] = 1; + } + } + } + keycode = kvm_events_evdev_vk_to_keycode((unsigned char)0xFF); + if (keycode != KEY_RESERVED && keycode <= KEY_MAX && !keyEnabled[keycode]) + { + ignore_result(g_kvm_evdev_exports.libevdev_enable_event_code(g_kvm_evdev_state.dev, EV_KEY, keycode, NULL)); + } + + // The XKB unicode path can resolve to any key a real keyboard has (KEY_102ND on ISO boards, + // KEY_RO/KEY_YEN on JIS, ...), so advertise the whole keyboard range, not just the VK map. + for (keycode = 1; keycode <= 255; ++keycode) + { + if (!keyEnabled[keycode] && g_kvm_evdev_exports.libevdev_enable_event_code(g_kvm_evdev_state.dev, EV_KEY, keycode, NULL) == 0) + { + keyEnabled[keycode] = 1; + } + } + + createManagedRc = g_kvm_evdev_exports.libevdev_uinput_create_from_device(g_kvm_evdev_state.dev, KVM_LIBEVDEV_UINPUT_OPEN_MANAGED, &g_kvm_evdev_state.uinput); + createRc = createManagedRc; + if (createRc != 0) + { + uinputFd = kvm_events_evdev_try_open_uinput(); + uinputErrno = errno; + if (uinputFd >= 0) + { + createRc = g_kvm_evdev_exports.libevdev_uinput_create_from_device(g_kvm_evdev_state.dev, uinputFd, &g_kvm_evdev_state.uinput); + if (createRc != 0) + { + close(uinputFd); + uinputFd = -1; + } + else + { + g_kvm_evdev_state.uinputFd = uinputFd; + } + } + if (createRc != 0) + { + int rwAccess = access("/dev/uinput", R_OK | W_OK); + fprintf(stderr, "MeshAgent: libevdev_uinput_create_from_device failed (managed=%d:%s, fallback=%d:%s, /dev/uinput access=%d errno=%d:%s, open_errno=%d:%s, uid=%d euid=%d)\n", + createManagedRc, kvm_events_evdev_error_string(createManagedRc), + createRc, kvm_events_evdev_error_string(createRc), + rwAccess, errno, strerror(errno), + uinputErrno, strerror(uinputErrno), + (int)getuid(), (int)geteuid()); + fflush(stderr); + goto error; + } + } + + printf("MeshAgent: evdev virtual input device created successfully\n"); + usleep(50000); + g_kvm_evdev_state.active = 1; + return 1; + +error: + fprintf(stderr, "MeshAgent: Failed to create evdev virtual input device\n"); fflush(stderr); + kvm_events_evdev_shutdown(); + return 0; +} + +void kvm_events_evdev_shutdown() +{ + kvm_xkb_shutdown(); + if (g_kvm_evdev_state.uinput != NULL) + { + g_kvm_evdev_exports.libevdev_uinput_destroy(g_kvm_evdev_state.uinput); + g_kvm_evdev_state.uinput = NULL; + } + if (g_kvm_evdev_state.uinputFd > 0) + { + close(g_kvm_evdev_state.uinputFd); + g_kvm_evdev_state.uinputFd = -1; + } + if (g_kvm_evdev_state.dev != NULL) + { + g_kvm_evdev_exports.libevdev_free(g_kvm_evdev_state.dev); + g_kvm_evdev_state.dev = NULL; + } + g_kvm_evdev_state.active = 0; +} + +int kvm_events_evdev_is_active() +{ + return g_kvm_evdev_state.active; +} + +void kvm_events_evdev_mouse_action(double absX, double absY, int button, short wheel) +{ + int x = (int)absX; + int y = (int)absY; + int maxX = SCREEN_WIDTH; + int maxY = SCREEN_HEIGHT; + unsigned int mouseCode = 0; + int mouseValue = 0; + + if (!kvm_events_evdev_is_active()) + { + return; + } + if (button == 0x88) + { + return; + } + + if (g_kvmBackendDRM != 0 && VSCREEN_WIDTH > 0 && VSCREEN_HEIGHT > 0) + { + maxX = VSCREEN_WIDTH; + maxY = VSCREEN_HEIGHT; + } + + if (kvm_events_evdev_write(EV_ABS, ABS_X, kvm_events_evdev_scale_axis(x, maxX)) != 0) + { + return; + } + if (kvm_events_evdev_write(EV_ABS, ABS_Y, kvm_events_evdev_scale_axis(y, maxY)) != 0) + { + return; + } + + if (button != 0) + { + switch (button) + { + case MOUSEEVENTF_LEFTDOWN: + mouseCode = BTN_LEFT; + mouseValue = 1; + break; + case MOUSEEVENTF_LEFTUP: + mouseCode = BTN_LEFT; + mouseValue = 0; + break; + case MOUSEEVENTF_RIGHTDOWN: + mouseCode = BTN_RIGHT; + mouseValue = 1; + break; + case MOUSEEVENTF_RIGHTUP: + mouseCode = BTN_RIGHT; + mouseValue = 0; + break; + case MOUSEEVENTF_MIDDLEDOWN: + mouseCode = BTN_MIDDLE; + mouseValue = 1; + break; + case MOUSEEVENTF_MIDDLEUP: + mouseCode = BTN_MIDDLE; + mouseValue = 0; + break; + default: + mouseCode = 0; + break; + } + if (mouseCode != 0) + { + if (kvm_events_evdev_write(EV_KEY, mouseCode, mouseValue) != 0) + { + return; + } + } + } + else if (wheel != 0) + { + if (kvm_events_evdev_write(EV_REL, REL_WHEEL, wheel > 0 ? 1 : -1) != 0) + { + return; + } + } + + ignore_result(kvm_events_evdev_sync()); +} + +// Net-zero scroll: pointer activity that wakes the displays (DPMS) without side effects. +void kvm_events_evdev_wake() +{ + if (g_kvm_evdev_state.active == 0) { return; } + if (kvm_events_evdev_write(EV_REL, REL_WHEEL, 1) != 0) { return; } + ignore_result(kvm_events_evdev_sync()); + if (kvm_events_evdev_write(EV_REL, REL_WHEEL, -1) != 0) { return; } + ignore_result(kvm_events_evdev_sync()); +} + +void kvm_events_evdev_key_action(unsigned char vk, int up) +{ + unsigned int keycode = kvm_events_evdev_vk_to_keycode(vk); + int value = up == 0 ? 1 : 0; + + if (!kvm_events_evdev_is_active()) + { + return; + } + if (up == 4) + { + value = 1; + } + if (keycode == KEY_RESERVED) + { + return; + } + + if (kvm_events_evdev_write(EV_KEY, keycode, value) != 0) + { + return; + } + ignore_result(kvm_events_evdev_sync()); +} + +// GNOME/IBus drops Shift when synthesized keys fire back-to-back; holding each key ~20ms (Shift still down) fixes it, same as ydotool. +static long kvm_events_evdev_key_delay_us() +{ + static long cached = -1; + if (cached < 0) + { + long ms = 20; + const char *env = getenv("MESH_KVM_KEY_DELAY_MS"); + if (env != NULL && *env != '\0') + { + char *end = NULL; + long v = strtol(env, &end, 10); + if (end != env && v >= 0) { ms = v; } + } + if (ms > 200) { ms = 200; } + cached = ms * 1000; + } + return cached; +} + +void kvm_events_evdev_key_action_unicode(uint16_t unicode, int up) +{ + unsigned int keycode = KEY_RESERVED; + int needsShift = 0; + int needsAltGr = 0; + int isAlpha = (unicode >= 'a' && unicode <= 'z') || (unicode >= 'A' && unicode <= 'Z'); + kvm_xkb_match xkbMatch; + long delayUs = 0; + + if (!kvm_events_evdev_is_active()) + { + return; + } + if (up != 0) + { + return; + } + + kvm_events_evdev_poll_leds(); + + // Resolve through the session's real XKB keymap first: it covers non-Latin and AltGr + // characters and remapped layouts (dvorak, azerty) that the fixed US-position table below + // cannot express, and its CapsLock interaction is exact. The ASCII table stays as the + // fallback whenever Wayland/libxkbcommon are unavailable or the codepoint isn't reachable. + if (kvm_xkb_lookup_unicode((uint32_t)unicode, g_kvm_evdev_capslock, &xkbMatch)) + { + keycode = xkbMatch.keycode; + needsShift = xkbMatch.shift; + needsAltGr = xkbMatch.altgr; + } + else if (kvm_events_evdev_ascii_to_keycode(unicode, &keycode, &needsShift)) + { + // An active CapsLock already swaps letter case, so flip the Shift decision to land on the requested case. + if (g_kvm_evdev_capslock && isAlpha) + { + needsShift = !needsShift; + } + } + else + { + return; + } + + delayUs = kvm_events_evdev_key_delay_us(); + if (needsAltGr) + { + if (kvm_events_evdev_write(EV_KEY, KEY_RIGHTALT, 1) != 0) { return; } + ignore_result(kvm_events_evdev_sync()); + } + if (needsShift) + { + if (kvm_events_evdev_write(EV_KEY, KEY_LEFTSHIFT, 1) != 0) { return; } + ignore_result(kvm_events_evdev_sync()); + } + if (kvm_events_evdev_write(EV_KEY, keycode, 1) != 0) { return; } + ignore_result(kvm_events_evdev_sync()); + if (delayUs > 0) { usleep(delayUs); } + if (kvm_events_evdev_write(EV_KEY, keycode, 0) != 0) { return; } + ignore_result(kvm_events_evdev_sync()); + if (needsShift) + { + if (kvm_events_evdev_write(EV_KEY, KEY_LEFTSHIFT, 0) != 0) { return; } + ignore_result(kvm_events_evdev_sync()); + } + if (needsAltGr) + { + if (kvm_events_evdev_write(EV_KEY, KEY_RIGHTALT, 0) != 0) { return; } + ignore_result(kvm_events_evdev_sync()); + } + if (delayUs > 0) { usleep(delayUs); } +} + +#else + +int kvm_events_evdev_init() +{ + return 0; +} + +void kvm_events_evdev_shutdown() +{ +} + +int kvm_events_evdev_is_active() +{ + return 0; +} + +void kvm_events_evdev_mouse_action(double absX, double absY, int button, short wheel) +{ + UNREFERENCED_PARAMETER(absX); + UNREFERENCED_PARAMETER(absY); + UNREFERENCED_PARAMETER(button); + UNREFERENCED_PARAMETER(wheel); +} + +void kvm_events_evdev_wake() +{ +} + +void kvm_events_evdev_key_action(unsigned char vk, int up) +{ + UNREFERENCED_PARAMETER(vk); + UNREFERENCED_PARAMETER(up); +} + +void kvm_events_evdev_key_action_unicode(uint16_t unicode, int up) +{ + UNREFERENCED_PARAMETER(unicode); + UNREFERENCED_PARAMETER(up); +} + +int kvm_events_evdev_lock_state() +{ + return 0; +} + +int kvm_events_evdev_wait_lock_state(int maxWaitMs) +{ + UNREFERENCED_PARAMETER(maxWaitMs); + return 0; +} + +#endif diff --git a/meshcore/KVM/Linux/linux_kvm.c b/meshcore/KVM/Linux/linux_kvm.c index 79c740889..26446b6b9 100644 --- a/meshcore/KVM/Linux/linux_kvm.c +++ b/meshcore/KVM/Linux/linux_kvm.c @@ -15,6 +15,8 @@ limitations under the License. */ #include "linux_kvm.h" +#include "linux_kvm_wayland.h" +#include "linux_kvm_drm.h" #include "meshcore/meshdefines.h" #include "microstack/ILibParsers.h" #include "microstack/ILibAsyncSocket.h" @@ -22,7 +24,10 @@ limitations under the License. #include "microstack/ILibProcessPipe.h" #include #include +#include #include +#include +#include #include #include @@ -132,8 +137,6 @@ int slave2master[2]; char CURRENT_XDISPLAY[256]; int CURRENT_DISPLAY_ID = -1; -typedef struct kvm_monitor_info { int id, x, y, width, height; } kvm_monitor_info; -#define KVM_MAX_MONITORS 16 kvm_monitor_info g_monitors[KVM_MAX_MONITORS]; int g_monitor_count = 0; int SCREEN_SEL = 0; // 0 = all monitors, 1..N = specific physical monitor @@ -147,6 +150,22 @@ FILE *logFile = NULL; int g_enableEvents = 0; extern int gRemoteMouseRenderDefault; +// In DRM mode the slave->master pipe is non-blocking and shared with the tile stream, so every +// sender must go through the draining writer in linux_kvm_drm.c: a raw write() could truncate a +// message on a full pipe (desyncing the stream) or, blocking, re-arm the master<->slave pipe +// deadlock that the draining writer exists to prevent. +static void kvm_slave_send(const void *buffer, size_t len) +{ + if (g_kvmBackendDRM != 0) + { + ignore_result(kvm_drm_slave_write(buffer, len)); + } + else + { + ignore_result(write(slave2master[1], buffer, len)); + } +} + int remoteMouseX = 0, remoteMouseY = 0; extern void* tilebuffer; @@ -294,10 +313,13 @@ void kvm_send_error(char *msg) int msgLen = strnlen_s(msg, 255); char buffer[512]; + // Otherwise this only reaches the MeshCentral viewer, so the error never shows in the agent's own log. + fprintf(stderr, "KVM error: %s\n", msg); fflush(stderr); + ((unsigned short*)buffer)[0] = (unsigned short)htons((unsigned short)MNG_ERROR); // Write the type ((unsigned short*)buffer)[1] = (unsigned short)htons((unsigned short)(msgLen + 4)); // Write the size memcpy_s(buffer + 4, msgLen, msg, msgLen); - ignore_result(write(slave2master[1], buffer, msgLen + 2)); + kvm_slave_send(buffer, msgLen + 4); } KVM_MouseCursors kvm_fetch_currentCursor(Display *cursordisplay) @@ -437,20 +459,18 @@ void kvm_send_resolution() ((unsigned short*)buffer)[2] = (unsigned short)htons((unsigned short)SCREEN_WIDTH); // X position ((unsigned short*)buffer)[3] = (unsigned short)htons((unsigned short)SCREEN_HEIGHT); // Y position - ignore_result(write(slave2master[1], buffer, sizeof(buffer))); + kvm_slave_send(buffer, sizeof(buffer)); } void kvm_send_display() { char buffer[6]; - unsigned short sel = (g_monitor_count > 0) - ? ((SCREEN_SEL == 0) ? (unsigned short)65535 : (unsigned short)SCREEN_SEL) - : (unsigned short)CURRENT_DISPLAY_ID; + unsigned short sel = (g_monitor_count > 0) ? ((SCREEN_SEL == 0) ? (unsigned short)65535 : (unsigned short)SCREEN_SEL) : (unsigned short)CURRENT_DISPLAY_ID; ((unsigned short*)buffer)[0] = (unsigned short)htons((unsigned short)MNG_KVM_SET_DISPLAY); // Write the type ((unsigned short*)buffer)[1] = (unsigned short)htons((unsigned short)6); // Write the size ((unsigned short*)buffer)[2] = (unsigned short)htons(sel); // Display selection - ignore_result(write(slave2master[1], buffer, sizeof(buffer))); + kvm_slave_send(buffer, sizeof(buffer)); } #define BUFSIZE 65535 @@ -469,6 +489,53 @@ int lockfileCheckFn(const struct dirent *ent) { return 0; } +void kvm_apply_monitor_selection() +{ + if (SCREEN_SEL > 0 && (SCREEN_SEL - 1) < g_monitor_count) + { + int idx = SCREEN_SEL - 1; + CAPTURE_X = g_monitors[idx].x; + CAPTURE_Y = g_monitors[idx].y; + SCREEN_WIDTH = g_monitors[idx].width; + SCREEN_HEIGHT = g_monitors[idx].height; + } + else + { + SCREEN_SEL = 0; + SCREEN_SEL_TARGET = 0; + CAPTURE_X = 0; + CAPTURE_Y = 0; + SCREEN_WIDTH = VSCREEN_WIDTH; + SCREEN_HEIGHT = VSCREEN_HEIGHT; + } +} + +void kvm_update_monitor_layout(kvm_monitor_info *monitors, int monitorCount, int virtualWidth, int virtualHeight) +{ + int i; + if (monitorCount < 0) { monitorCount = 0; } + if (monitorCount > KVM_MAX_MONITORS) { monitorCount = KVM_MAX_MONITORS; } + + g_monitor_count = 0; + for (i = 0; i < monitorCount; ++i) + { + if (monitors[i].width <= 0 || monitors[i].height <= 0) { continue; } + g_monitors[g_monitor_count] = monitors[i]; + g_monitors[g_monitor_count].id = g_monitor_count + 1; + g_monitor_count++; + } + + VSCREEN_WIDTH = virtualWidth; + VSCREEN_HEIGHT = virtualHeight; + if (g_monitor_count == 0 && (VSCREEN_WIDTH <= 0 || VSCREEN_HEIGHT <= 0)) + { + VSCREEN_WIDTH = SCREEN_WIDTH; + VSCREEN_HEIGHT = SCREEN_HEIGHT; + } + + kvm_apply_monitor_selection(); +} + // Enumerate physical monitors via XRandR into g_monitors[] and update capture region. // Falls back gracefully if XRandR is unavailable. static void kvm_enumerate_monitors() @@ -501,23 +568,7 @@ static void kvm_enumerate_monitors() xrandr_exports->XRRFreeScreenResources(res); } } - // Update the capture region based on current SCREEN_SEL - if (SCREEN_SEL > 0 && (SCREEN_SEL - 1) < g_monitor_count) - { - int idx = SCREEN_SEL - 1; - CAPTURE_X = g_monitors[idx].x; - CAPTURE_Y = g_monitors[idx].y; - SCREEN_WIDTH = g_monitors[idx].width; - SCREEN_HEIGHT = g_monitors[idx].height; - } - else - { - SCREEN_SEL = 0; - CAPTURE_X = 0; - CAPTURE_Y = 0; - SCREEN_WIDTH = VSCREEN_WIDTH; - SCREEN_HEIGHT = VSCREEN_HEIGHT; - } + kvm_apply_monitor_selection(); } // Send MNG_KVM_DISPLAY_INFO: per-monitor geometry (ID, X, Y, W, H) matching Windows format. @@ -540,7 +591,7 @@ void kvm_send_display_info() ((unsigned short*)buffer)[base + 3] = (unsigned short)htons((unsigned short)g_monitors[i].width); ((unsigned short*)buffer)[base + 4] = (unsigned short)htons((unsigned short)g_monitors[i].height); } - ignore_result(write(slave2master[1], buffer, ILibMemory_Size(buffer))); + kvm_slave_send(buffer, ILibMemory_Size(buffer)); ILibMemory_Free(buffer); } @@ -594,7 +645,7 @@ void kvm_send_display_list() currentSel = (unsigned short)CURRENT_DISPLAY_ID; ((unsigned short*)buffer)[i + 3] = (unsigned short)htons(currentSel); - ignore_result(write(slave2master[1], buffer, ILibMemory_Size(buffer))); + kvm_slave_send(buffer, ILibMemory_Size(buffer)); free(displays); } @@ -786,6 +837,9 @@ int kvm_init(int displayNo) void CheckDesktopSwitch(int checkres) { + UNREFERENCED_PARAMETER(checkres); + if (g_kvmBackendDRM != 0) { return; } + if (change_display) { if (logFile) { fprintf(logFile, "CheckDesktopSwitch: SCREEN_SEL_TARGET=%d CURRENT_DISPLAY_ID=%d\n", SCREEN_SEL_TARGET, CURRENT_DISPLAY_ID); fflush(logFile); } @@ -990,7 +1044,7 @@ void kvm_server_jpegerror(char *msg) ((unsigned short*)buffer)[1] = (unsigned short)htons((unsigned short)(msgLen + 4)); // Write the size memcpy_s(buffer + 4, msgLen, msg, msgLen); - ignore_result(write(slave2master[1], buffer, ILibMemory_Size(buffer))); + kvm_slave_send(buffer, ILibMemory_Size(buffer)); } #pragma pack(push, 1) @@ -1127,8 +1181,10 @@ void kvm_server_sighandler(int signum, siginfo_t *info, void *context) { g_shutdown = 1; } -void* kvm_server_mainloop(void* parm) + +void* kvm_server_mainloop_x11(void* parm) { + int sessionUid = (int)(intptr_t)parm; int maxsleep; Window rr, cr; int rx, ry, wx, wy, rs; @@ -1159,6 +1215,24 @@ void* kvm_server_mainloop(void* parm) unsigned short currentDisplayId = 0; + if (sessionUid != 0) + { + // Full drop, not bare setuid: keeping gid 0 / root's supplementary groups would leave the + // X11 slave more privileged than the session user, and continuing as root after a failed + // setuid (EAGAIN under RLIMIT_NPROC) must not happen. The DRM path does the same in + // kvm_drm_drop_to_session_uid_with_caps(). + struct passwd *pw = getpwuid((uid_t)sessionUid); + if (pw == NULL || + initgroups(pw->pw_name, pw->pw_gid) != 0 || + setgid(pw->pw_gid) != 0 || + setuid((uid_t)sessionUid) != 0) + { + fprintf(stderr, "KVM: privilege drop to uid %d failed (errno=%d); aborting capture child\n", sessionUid, errno); + kvm_send_error("KVM privilege drop failed"); + return (void *)-1; + } + } + if (logFile) { fprintf(logFile, "Checking $DISPLAY\n"); fflush(logFile); } for (char **env = environ; *env; ++env) { @@ -1545,6 +1619,18 @@ void* kvm_server_mainloop(void* parm) return (void*)0; } +void* kvm_server_mainloop(void* parm) +{ + int sessionUid = (int)(intptr_t)parm; + kvm_screenreader_mode_t screenreaderMode = kvm_screenreader_mode_for_uid(sessionUid); + if (screenreaderMode == KVM_SCREENREADER_MODE_DRM) + { + if (logFile) { fprintf(logFile, "Using DRM KVM backend\n"); fflush(logFile); } + return kvm_server_mainloop_drm(parm); + } + return kvm_server_mainloop_x11(parm); +} + void kvm_relay_readSink(ILibProcessPipe_Pipe sender, char *buffer, size_t bufferLen, size_t* bytesConsumed) { ILibKVM_WriteHandler writeHandler = (ILibKVM_WriteHandler)((void**)ILibMemory_Extra(sender))[0]; @@ -1582,8 +1668,55 @@ void kvm_relay_readSink(ILibProcessPipe_Pipe sender, char *buffer, size_t buffer #include "../../../microstack/ILibParsers.h" +// --- KVM capture auto-recovery (session handover) ----------------------------------------------- +// When a capture child exits unexpectedly (logout / user-switch / crash) the child's pipe breaks and +// kvm_relay_brokenPipeSink() runs (a deliberate viewer teardown clears this handler to NULL first, so +// it never runs then). Instead of only telling the viewer the child died, we ask the agent to +// re-derive the CURRENT console session uid and re-fork. Rate-limited so a genuinely unrecoverable +// child cannot storm-fork. +#define KVM_AUTORECOVER_DELAY_MS 1500 // let the session settle before re-deriving the uid +#define KVM_AUTORECOVER_MAX_BURST 5 // consecutive quick re-forks before we give up +#define KVM_AUTORECOVER_RESET_MS 30000 // a child that ran at least this long was healthy: reset the burst + +static uint64_t g_lastKvmForkMs = 0; // monotonic ms when the current child was forked + +// Implemented in agentcore.c: re-derive consoleUid()/X env and re-fork the capture child (reuses the +// same path as a live user-sessions 'changed' event). +extern void ILibDuktape_MeshAgent_RemoteDesktop_KvmAutoRecover(void *reservedPtrs); + +static uint64_t kvm_relay_now_ms(void) +{ + struct timespec ts; + if (clock_gettime(CLOCK_MONOTONIC, &ts) != 0) { return 0; } + return (((uint64_t)ts.tv_sec) * 1000ULL) + (((uint64_t)ts.tv_nsec) / 1000000ULL); +} + +// Decide whether an unexpected child exit should trigger an automatic re-fork. Reuses g_restartcount +// as a burst gate, cleared whenever the previous child ran long enough to be considered healthy. +static int kvm_relay_should_autorecover(void) +{ + uint64_t now = kvm_relay_now_ms(); + if (g_lastKvmForkMs != 0 && (now - g_lastKvmForkMs) >= KVM_AUTORECOVER_RESET_MS) + { + g_restartcount = 0; + } + if (g_restartcount >= KVM_AUTORECOVER_MAX_BURST) { return 0; } // give up; fall back to the viewer notice + g_restartcount++; + g_totalRestartCount++; + return 1; +} + +// Deferred off the broken-pipe callback (so we don't re-enter pipe teardown) to perform the recovery. +static void kvm_relay_autoRecoverSink(void *sender) +{ + if (!ILibMemory_CanaryOK(sender)) { return; } // pipe freed (deliberate teardown) before the timer fired + if (g_shutdown || g_slavekvm != 0) { return; } // shutting down, or a child is already running again + ILibDuktape_MeshAgent_RemoteDesktop_KvmAutoRecover(((void**)ILibMemory_Extra(sender))[1]); +} + void kvm_relay_brokenPipeSink_2(void *sender) { + if (!ILibMemory_CanaryOK(sender)) { return; } // pipe was freed before this 4s timer fired ILibKVM_WriteHandler writeHandler = (ILibKVM_WriteHandler)((void**)ILibMemory_Extra(sender))[0]; void *reserved = ((void**)ILibMemory_Extra(sender))[1]; char msg[] = "KVM Child process has unexpectedly exited"; @@ -1606,7 +1739,17 @@ void kvm_relay_brokenPipeSink(ILibProcessPipe_Pipe sender) g_slavekvm = 0; } - ILibLifeTime_AddEx(ILibGetBaseTimer(chain), sender, 4000, kvm_relay_brokenPipeSink_2, NULL); + // The child exited without a deliberate teardown (teardown clears this handler first). Try to + // auto-recover the session (logout / user-switch) rather than just reporting the child death. + // Gated by g_shutdown and a burst limit so an unrecoverable child can't fork-storm; on giving up + // we fall through to the original "child unexpectedly exited" viewer notice. + if (!g_shutdown && kvm_relay_should_autorecover()) + { + ILibLifeTime_AddEx(ILibGetBaseTimer(chain), sender, KVM_AUTORECOVER_DELAY_MS, kvm_relay_autoRecoverSink, NULL); + return; + } + + ILibLifeTime_AddEx(ILibGetBaseTimer(chain), sender, 4000, kvm_relay_brokenPipeSink_2, NULL); } void* kvm_relay_restart(int paused, void *processPipeMgr, ILibKVM_WriteHandler writeHandler, void *reserved, int uid, char* authToken, char *dispid) @@ -1615,7 +1758,7 @@ void* kvm_relay_restart(int paused, void *processPipeMgr, ILibKVM_WriteHandler w int count = 0; ILibProcessPipe_Pipe slave_out; - if (g_slavekvm != 0) + if (g_slavekvm != 0) { kill(g_slavekvm, SIGKILL); waitpid(g_slavekvm, &r, 0); @@ -1651,7 +1794,6 @@ void* kvm_relay_restart(int paused, void *processPipeMgr, ILibKVM_WriteHandler w close(master2slave[1]); if (SLAVELOG != 0) { logFile = fopen("/tmp/slave", "w"); } - if (uid != 0) { ignore_result(setuid(uid)); } if (g_ILibCrashDump_path != NULL) { @@ -1670,12 +1812,17 @@ void* kvm_relay_restart(int paused, void *processPipeMgr, ILibKVM_WriteHandler w if (authToken != NULL) { setenv("XAUTHORITY", authToken, 1); } if (dispid != NULL) { setenv("DISPLAY", dispid, 1); } - kvm_server_mainloop((void*)0); + kvm_server_mainloop((void*)(intptr_t)uid); exit(0); return(NULL); } - else + else { //master + // A child is (re)running now: clear any stale shutdown flag left by kvm_cleanup() on a restart + // path, and stamp the fork time so the auto-recovery burst gate can tell a healthy child (ran a + // while) from a fork storm (dies immediately). + g_shutdown = 0; + g_lastKvmForkMs = kvm_relay_now_ms(); close(slave2master[1]); close(master2slave[0]); logFile = fopen("/tmp/master", "w"); diff --git a/meshcore/KVM/Linux/linux_kvm.h b/meshcore/KVM/Linux/linux_kvm.h index b7c8af2cf..4dd9df5fb 100644 --- a/meshcore/KVM/Linux/linux_kvm.h +++ b/meshcore/KVM/Linux/linux_kvm.h @@ -40,11 +40,25 @@ limitations under the License. typedef ILibTransport_DoneState(*ILibKVM_WriteHandler)(char *buffer, int bufferLen, void *reserved); +#define KVM_MAX_MONITORS 16 +typedef struct kvm_monitor_info { int id, x, y, width, height; } kvm_monitor_info; + +extern kvm_monitor_info g_monitors[KVM_MAX_MONITORS]; +extern int g_monitor_count; +extern int SCREEN_SEL; +extern int SCREEN_SEL_TARGET; +extern int CAPTURE_X; +extern int CAPTURE_Y; +extern int VSCREEN_WIDTH; +extern int VSCREEN_HEIGHT; + void kvm_set_x11_locations(char *libx11, char *libx11tst, char *libx11ext, char *libxfixes, char *libx11kb); int kvm_relay_feeddata(char* buf, int len); void kvm_pause(int pause); void* kvm_relay_setup(void *processPipeMgr, ILibKVM_WriteHandler writeHandler, void *reserved, int uid, char *authToken, char *dispid); void kvm_relay_reset(); void kvm_cleanup(); +void kvm_update_monitor_layout(kvm_monitor_info *monitors, int monitorCount, int virtualWidth, int virtualHeight); +void kvm_apply_monitor_selection(); #endif /* LINUX_KVM_H_ */ diff --git a/meshcore/KVM/Linux/linux_kvm_drm.c b/meshcore/KVM/Linux/linux_kvm_drm.c new file mode 100644 index 000000000..7bcc80784 --- /dev/null +++ b/meshcore/KVM/Linux/linux_kvm_drm.c @@ -0,0 +1,3637 @@ +/* +Copyright 2010 - 2011 Intel Corporation + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +#include "linux_kvm_drm.h" +#include "linux_kvm_drm_egl.h" +#include "linux_kvm.h" +#include "linux_kvm_rotated.h" +#include "linux_kvm_wayland.h" +#include "linux_compression.h" +#include "linux_tile.h" +#include "meshcore/meshdefines.h" +#include "microstack/ILibParsers.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(__linux__) +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include + +// libdrm is dlopen'd rather than linked, so the agent still runs where it's absent (like libX11). +#define KVM_DRM_LIBDRM_SYMBOLS(_) \ + _(drmModeGetResources) _(drmModeFreeResources) \ + _(drmModeGetConnector) _(drmModeFreeConnector) \ + _(drmModeGetEncoder) _(drmModeFreeEncoder) \ + _(drmModeGetCrtc) _(drmModeFreeCrtc) \ + _(drmModeGetPlane) _(drmModeFreePlane) \ + _(drmModeGetPlaneResources) _(drmModeFreePlaneResources) \ + _(drmModeGetFB) _(drmModeFreeFB) \ + _(drmModeGetFB2) _(drmModeFreeFB2) \ + _(drmIoctl) _(drmPrimeHandleToFD) _(drmDropMaster) _(drmGetRenderDeviceNameFromFd) \ + _(drmModeObjectGetProperties) _(drmModeFreeObjectProperties) \ + _(drmModeGetProperty) _(drmModeFreeProperty) _(drmSetClientCap) + +#define KVM_DRM_DECL_PTR(s) static __typeof__(s) *p_##s = NULL; +KVM_DRM_LIBDRM_SYMBOLS(KVM_DRM_DECL_PTR) +#undef KVM_DRM_DECL_PTR + +static void *g_libdrm_handle = NULL; +static int kvm_drm_load_libdrm(void) +{ + void *h; + if (g_libdrm_handle != NULL) { return 1; } + if ((h = dlopen("libdrm.so.2", RTLD_NOW)) == NULL && (h = dlopen("libdrm.so", RTLD_NOW)) == NULL) + { + return 0; + } +#define KVM_DRM_LOAD_PTR(s) p_##s = (__typeof__(p_##s))dlsym(h, #s); if (p_##s == NULL) { dlclose(h); return 0; } + KVM_DRM_LIBDRM_SYMBOLS(KVM_DRM_LOAD_PTR) +#undef KVM_DRM_LOAD_PTR + g_libdrm_handle = h; + return 1; +} + +// Must follow the __typeof__ declarations above (they need the real prototypes). +#define drmModeGetResources p_drmModeGetResources +#define drmModeFreeResources p_drmModeFreeResources +#define drmModeGetConnector p_drmModeGetConnector +#define drmModeFreeConnector p_drmModeFreeConnector +#define drmModeGetEncoder p_drmModeGetEncoder +#define drmModeFreeEncoder p_drmModeFreeEncoder +#define drmModeGetCrtc p_drmModeGetCrtc +#define drmModeFreeCrtc p_drmModeFreeCrtc +#define drmModeGetPlane p_drmModeGetPlane +#define drmModeFreePlane p_drmModeFreePlane +#define drmModeGetPlaneResources p_drmModeGetPlaneResources +#define drmModeFreePlaneResources p_drmModeFreePlaneResources +#define drmModeGetFB p_drmModeGetFB +#define drmModeFreeFB p_drmModeFreeFB +#define drmModeGetFB2 p_drmModeGetFB2 +#define drmModeFreeFB2 p_drmModeFreeFB2 +#define drmIoctl p_drmIoctl +#define drmPrimeHandleToFD p_drmPrimeHandleToFD +#define drmDropMaster p_drmDropMaster +#define drmGetRenderDeviceNameFromFd p_drmGetRenderDeviceNameFromFd +#define drmModeObjectGetProperties p_drmModeObjectGetProperties +#define drmModeFreeObjectProperties p_drmModeFreeObjectProperties +#define drmModeGetProperty p_drmModeGetProperty +#define drmModeFreeProperty p_drmModeFreeProperty +#define drmSetClientCap p_drmSetClientCap + +// Old sysroots may predate these in drm.h/drm_mode.h; the values are kernel ABI. +#ifndef DRM_CLIENT_CAP_UNIVERSAL_PLANES +#define DRM_CLIENT_CAP_UNIVERSAL_PLANES 2 +#endif +#ifndef DRM_MODE_ROTATE_0 +#define DRM_MODE_ROTATE_0 (1<<0) +#define DRM_MODE_ROTATE_90 (1<<1) +#define DRM_MODE_ROTATE_180 (1<<2) +#define DRM_MODE_ROTATE_270 (1<<3) +#endif +#ifndef DRM_MODE_REFLECT_X +#define DRM_MODE_REFLECT_X (1<<4) +#define DRM_MODE_REFLECT_Y (1<<5) +#endif +#ifndef DRM_PLANE_TYPE_PRIMARY +#define DRM_PLANE_TYPE_PRIMARY 1 +#endif + +// Lets linux_kvm_drm_egl.c reach libdrm through the single dlopen here. +int kvm_drm_prime_handle_to_fd(int fd, unsigned int handle, unsigned int flags, int *prime_fd) +{ + return drmPrimeHandleToFD(fd, (uint32_t)handle, (uint32_t)flags, prime_fd); +} + +// Render-node path for a card fd, so the EGL layer can match an EGL device that only reports its +// render node (e.g. NVIDIA). Returns 0 if unavailable. +int kvm_drm_render_node_for_fd(int fd, char *out, size_t out_len) +{ + char *name = drmGetRenderDeviceNameFromFd(fd); + if (name == NULL) { return 0; } + snprintf(out, out_len, "%s", name); + free(name); + return 1; +} + +// libwayland-client is dlopen'd rather than linked, so the agent runs where it's absent. It's +// used only for the xdg-output layout query, which falls back to KWin/raw DRM positions. +// Array marshallers instead of wl_proxy_marshal_flags: flags needs libwayland >= 1.20 (2021), +// which would silently lose the xdg-output layout on Debian 11 / Ubuntu 20.04-era systems. +#define KVM_DRM_WAYLAND_SYMBOLS(_) \ + _(wl_display_connect) _(wl_display_disconnect) \ + _(wl_display_flush) _(wl_display_dispatch_pending) _(wl_display_prepare_read) \ + _(wl_display_read_events) _(wl_display_cancel_read) _(wl_display_get_fd) \ + _(wl_proxy_marshal_array) _(wl_proxy_marshal_array_constructor) _(wl_proxy_marshal_array_constructor_versioned) \ + _(wl_proxy_add_listener) _(wl_proxy_destroy) + +#define KVM_DRM_WL_DECL_PTR(s) static __typeof__(s) *p_##s = NULL; +KVM_DRM_WAYLAND_SYMBOLS(KVM_DRM_WL_DECL_PTR) +#undef KVM_DRM_WL_DECL_PTR + +static const struct wl_interface *p_wl_registry_interface = NULL; +static const struct wl_interface *p_wl_output_interface = NULL; +static const struct wl_interface *p_wl_callback_interface = NULL; +static void *g_libwayland_handle = NULL; + +#define wl_display_connect p_wl_display_connect +#define wl_display_disconnect p_wl_display_disconnect +#define wl_display_flush p_wl_display_flush +#define wl_display_dispatch_pending p_wl_display_dispatch_pending +#define wl_display_prepare_read p_wl_display_prepare_read +#define wl_display_read_events p_wl_display_read_events +#define wl_display_cancel_read p_wl_display_cancel_read +#define wl_display_get_fd p_wl_display_get_fd +#define wl_proxy_marshal_array p_wl_proxy_marshal_array +#define wl_proxy_marshal_array_constructor p_wl_proxy_marshal_array_constructor +#define wl_proxy_marshal_array_constructor_versioned p_wl_proxy_marshal_array_constructor_versioned +#define wl_proxy_add_listener p_wl_proxy_add_listener +#define wl_proxy_destroy p_wl_proxy_destroy + +// Hand-rolled versions of the inline wrappers; the originals bake in +// link-time wl_proxy_*/wl_registry_interface references that would keep libwayland in NEEDED. +static struct wl_registry *kvm_wl_display_get_registry(struct wl_display *display) +{ + union wl_argument args[1]; + args[0].o = NULL; + return (struct wl_registry *)wl_proxy_marshal_array_constructor((struct wl_proxy *)display, + 1 /*WL_DISPLAY_GET_REGISTRY*/, args, p_wl_registry_interface); +} +static int kvm_wl_registry_add_listener(struct wl_registry *registry, const struct wl_registry_listener *listener, void *data) +{ + return wl_proxy_add_listener((struct wl_proxy *)registry, (void (**)(void))listener, data); +} +static void *kvm_wl_registry_bind(struct wl_registry *registry, uint32_t name, const struct wl_interface *interface, uint32_t version) +{ + union wl_argument args[4]; + args[0].u = name; + args[1].s = interface->name; + args[2].u = version; + args[3].o = NULL; + return (void *)wl_proxy_marshal_array_constructor_versioned((struct wl_proxy *)registry, + 0 /*WL_REGISTRY_BIND*/, args, interface, version); +} +static int kvm_wl_output_add_listener(struct wl_output *output, const struct wl_output_listener *listener, void *data) +{ + return wl_proxy_add_listener((struct wl_proxy *)output, (void (**)(void))listener, data); +} + +static const struct wl_interface *kvm_xdg_output_types[]; // defined below; slot [3] patched at load +static int kvm_drm_load_wayland(void) +{ + void *h; + if (g_libwayland_handle != NULL) { return 1; } + if ((h = dlopen("libwayland-client.so.0", RTLD_NOW)) == NULL && (h = dlopen("libwayland-client.so", RTLD_NOW)) == NULL) + { + return 0; + } +#define KVM_DRM_WL_LOAD_PTR(s) p_##s = (__typeof__(p_##s))dlsym(h, #s); if (p_##s == NULL) { dlclose(h); return 0; } + KVM_DRM_WAYLAND_SYMBOLS(KVM_DRM_WL_LOAD_PTR) +#undef KVM_DRM_WL_LOAD_PTR + p_wl_registry_interface = (const struct wl_interface *)dlsym(h, "wl_registry_interface"); + p_wl_output_interface = (const struct wl_interface *)dlsym(h, "wl_output_interface"); + p_wl_callback_interface = (const struct wl_interface *)dlsym(h, "wl_callback_interface"); + if (p_wl_registry_interface == NULL || p_wl_output_interface == NULL || p_wl_callback_interface == NULL) { dlclose(h); return 0; } + kvm_xdg_output_types[3] = p_wl_output_interface; // get_xdg_output's wl_output arg type + g_libwayland_handle = h; + return 1; +} + +#ifndef O_CLOEXEC +#define KVM_DRM_O_CLOEXEC 0 +#else +#define KVM_DRM_O_CLOEXEC O_CLOEXEC +#endif +#endif + +#define KVM_DRM_MAX_ERROR 256 +#define KVM_DRM_MAX_OUTPUTS 16 +#define KVM_DRM_DISPLAY_WAKE_TIMEOUT_MS 10000 + +int g_kvmBackendDRM = 0; +static int drm_debug = 0; + +static void kvm_drm_init_debug() +{ + const char *value = getenv("MESH_KVM_DRM_DEBUG"); + if (value == NULL || value[0] == 0) + { + drm_debug = 0; + return; + } + drm_debug = atoi(value); + if (drm_debug < 0) { drm_debug = 0; } +} + +extern int SCREEN_NUM; +extern int SCREEN_WIDTH; +extern int SCREEN_HEIGHT; +extern int SCREEN_DEPTH; +extern int TILE_WIDTH; +extern int TILE_HEIGHT; +extern int TILE_WIDTH_COUNT; +extern int TILE_HEIGHT_COUNT; +extern int COMPRESSION_RATIO; +extern int FRAME_RATE_TIMER; +extern struct tileInfo_t **g_tileInfo; +extern int g_remotepause; +extern int g_pause; +extern int g_shutdown; +extern int change_display; +extern int master2slave[2]; +extern int slave2master[2]; +extern int CURRENT_DISPLAY_ID; +extern int g_enableEvents; +extern void *tilebuffer; +extern unsigned char *jpeg_buffer; +extern int jpeg_buffer_length; + +extern void kvm_send_error(char *msg); +extern void kvm_send_resolution(); +extern void kvm_send_display(); +extern void kvm_send_display_list(); +extern int kvm_server_inputdata(char *block, int blocklen); +extern void kvm_server_sighandler(int signum, siginfo_t *info, void *context); + +// Viewer input read off master2slave but not yet parsed. Parsing only happens between outbound +// packets (kvm_drm_process_pending_input): input handlers reply via kvm_send_* onto the same pipe, +// which would interleave into a half-written tile if run from inside kvm_drm_write_all. +static char g_drmInputBuf[262144]; +static int g_drmInputLen = 0; + +// Write one whole packet to the (non-blocking) slave->master pipe, draining viewer input while +// stalled. Under tunnel backpressure the master deliberately stops reading this pipe; a plain +// blocking write() here then also stopped our master2slave reads, the master's event thread +// blocked writing input into that second full pipe, and with the event loop dead the resume that +// would drain everything could never arrive: both processes deadlocked until killed. Keeping the +// input pipe drained while we wait keeps the master's event loop alive, so backpressure stays +// what it is meant to be - a stall, not a hang. +static int kvm_drm_write_all(int fd, const char *buffer, size_t len) +{ + size_t offset = 0; + + while (offset < len) + { + struct pollfd pfd[2]; + nfds_t nfds = 1; + int inputSlot = -1; + + if (g_shutdown) { return -1; } + + pfd[0].fd = fd; + pfd[0].events = POLLOUT; + pfd[0].revents = 0; + if (master2slave[0] > 0) + { + if (g_drmInputLen >= (int)sizeof(g_drmInputBuf)) + { + // Only reachable if the viewer streams input for minutes into one stalled write. + // Give up so the parent restarts the session instead of re-arming the deadlock. + return -1; + } + inputSlot = (int)nfds; + pfd[nfds].fd = master2slave[0]; + pfd[nfds].events = POLLIN; + pfd[nfds].revents = 0; + nfds++; + } + + if (poll(pfd, nfds, 1000) < 0) + { + if (errno == EINTR) { continue; } // SIGTERM lands here; g_shutdown is re-checked above + return -1; + } + + if (inputSlot >= 0 && (pfd[inputSlot].revents & (POLLIN | POLLHUP | POLLERR)) != 0) + { + ssize_t rd = read(master2slave[0], g_drmInputBuf + g_drmInputLen, sizeof(g_drmInputBuf) - (size_t)g_drmInputLen); + if (rd > 0) + { + g_drmInputLen += (int)rd; + } + else if (rd == 0) + { + g_shutdown = 1; // master closed its end: the session is going away + return -1; + } + else if (errno != EINTR && errno != EAGAIN && errno != EWOULDBLOCK) + { + g_shutdown = 1; + return -1; + } + } + + if ((pfd[0].revents & (POLLERR | POLLNVAL)) != 0) { return -1; } + if ((pfd[0].revents & POLLOUT) != 0) + { + ssize_t written = write(fd, buffer + offset, len - offset); + if (written < 0) + { + if (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK) { continue; } + return -1; + } + offset += (size_t)written; + } + } + return 0; +} + +// Entry point for the shared kvm_send_* helpers in linux_kvm.c: in DRM mode every write to the +// pipe must take the draining path above, both for the deadlock and because the pipe is left +// non-blocking for the slave's lifetime (a raw write() could truncate and desync the stream). +int kvm_drm_slave_write(const void *buffer, size_t len) +{ + return kvm_drm_write_all(slave2master[1], (const char *)buffer, len); +} + +// Parse whatever complete input messages have accumulated. A handler's kvm_send_* reply re-enters +// the drain in kvm_drm_write_all and can grow g_drmInputLen mid-loop; appends land beyond +// 'consumed', so re-reading g_drmInputLen each pass stays correct and leftovers keep any partial +// trailing message intact for the next read to complete. +static void kvm_drm_process_pending_input(void) +{ + int consumed = 0; + int msgLen = 0; + + while ((msgLen = kvm_server_inputdata(g_drmInputBuf + consumed, g_drmInputLen - consumed)) != 0) + { + consumed += msgLen; + } + if (consumed > 0) + { + if (consumed < g_drmInputLen) + { + memmove(g_drmInputBuf, g_drmInputBuf + consumed, (size_t)(g_drmInputLen - consumed)); + } + g_drmInputLen -= consumed; + } +} + +static int kvm_drm_send_dirty_tiles(const unsigned char *rgbBuffer, size_t rgbSize, char **desktopBuffer, long long *desktopBufferSize) +{ + int r = 0; + int c = 0; + int x = 0; + int y = 0; + int width = 0; + int height = 0; + int paddedWidth = 0; + int paddedHeight = 0; + size_t rowBytes = 0; + size_t rowPaddedBytes = 0; + size_t requiredSize = 0; + + if (SCREEN_WIDTH <= 0 || SCREEN_HEIGHT <= 0 || TILE_WIDTH_COUNT <= 0 || TILE_HEIGHT_COUNT <= 0) + { + return 0; + } + + rowBytes = ((size_t)SCREEN_WIDTH) * 3u; + requiredSize = ((size_t)SCREEN_WIDTH) * ((size_t)SCREEN_HEIGHT) * 3u; + if (rgbBuffer == NULL || rgbSize < requiredSize) + { + return -1; + } + + paddedWidth = adjust_screen_size(SCREEN_WIDTH); + paddedHeight = adjust_screen_size(SCREEN_HEIGHT); + rowPaddedBytes = ((size_t)paddedWidth) * 3u; + requiredSize = ((size_t)paddedWidth) * ((size_t)paddedHeight) * 3u; + + if (*desktopBufferSize != (long long)requiredSize) + { + char *tmp = NULL; + if (*desktopBuffer != NULL) + { + free(*desktopBuffer); + *desktopBuffer = NULL; + } + tmp = (char *)malloc(requiredSize); + if (tmp == NULL) ILIBCRITICALEXIT(254); + *desktopBuffer = tmp; + *desktopBufferSize = (long long)requiredSize; + } + + for (y = 0; y < SCREEN_HEIGHT; ++y) + { + char *dst = *desktopBuffer + (((size_t)y) * rowPaddedBytes); + const char *src = (const char *)rgbBuffer + (((size_t)y) * rowBytes); + memcpy_s(dst, rowPaddedBytes, src, rowBytes); + if (rowPaddedBytes > rowBytes) + { + memset(dst + rowBytes, 0, rowPaddedBytes - rowBytes); + } + } + + if (paddedHeight > SCREEN_HEIGHT) + { + char *dst = *desktopBuffer + (((size_t)SCREEN_HEIGHT) * rowPaddedBytes); + size_t bytes = ((size_t)(paddedHeight - SCREEN_HEIGHT)) * rowPaddedBytes; + memset(dst, 0, bytes); + } + + for (r = 0; r < TILE_HEIGHT_COUNT; ++r) + { + for (c = 0; c < TILE_WIDTH_COUNT; ++c) + { + g_tileInfo[r][c].flag = TILE_TODO; +#ifdef KVM_ALL_TILES + g_tileInfo[r][c].crc = 0xFF; +#endif + } + } + + for (y = 0; y < TILE_HEIGHT_COUNT; ++y) + { + for (x = 0; x < TILE_WIDTH_COUNT; ++x) + { + void *tilePacket = NULL; + long long tilePacketSize = 0; + + height = TILE_HEIGHT * y; + width = TILE_WIDTH * x; + + if (g_tileInfo[y][x].flag == TILE_SENT || g_tileInfo[y][x].flag == TILE_DONT_SEND) + { + continue; + } + + getTileAt(width, height, &tilePacket, &tilePacketSize, *desktopBuffer, *desktopBufferSize, y, x); + if (tilePacket != NULL && tilePacketSize > 0) + { + if (kvm_drm_write_all(slave2master[1], (char *)tilePacket, (size_t)tilePacketSize) != 0) + { + free(tilePacket); + return -1; + } + free(tilePacket); + } + } + } + + return 0; +} + +#if defined(__linux__) + +typedef struct kvm_drm_output +{ + char device_path[64]; + char connector_name[32]; + uint32_t connector_id; + uint32_t crtc_id; + int crtc_index; + int x; + int y; + uint32_t width; + uint32_t height; + int device_index; + // Un-rotation that maps the panel-native scanout buffer back into this output's logical + // orientation (from the wl_output transform); width/height above stay logical. + kvm_drm_rotation rotation; +} kvm_drm_output; + +typedef struct kvm_drm_desktop_layout +{ + int min_x; + int min_y; + int max_x; + int max_y; + uint32_t width; + uint32_t height; +} kvm_drm_desktop_layout; + +typedef struct kvm_drm_frame_map +{ + uint32_t handle; + uint8_t *addr; + size_t size; + int dma_fd; + int drm_fd; +} kvm_drm_frame_map; + +#define KVM_DRM_MAX_DEVICES 8 + +// One open GPU. A multi-GPU desktop spans several of these; every output carries the +// device_index it belongs to. EGL and the CPU-readback map are per-device because a card's +// scanout buffers can only be imported/mapped through that same card's fd. +typedef struct kvm_drm_device +{ + int fd; + char path[64]; + kvm_drm_egl_context eglCtx; + kvm_drm_frame_map map; +} kvm_drm_device; + +typedef struct kvm_drm_scanout_frame +{ + uint32_t fb_id; + uint32_t width; + uint32_t height; + uint32_t pitch; + uint32_t offset; + uint32_t format; + uint32_t handle; + uint64_t modifier; + kvm_drm_rotation rotation; + // Extra planes for render-compressed scanout (e.g. Intel Y-tiled CCS = data plane + metadata + // plane). plane[0] mirrors handle/pitch/offset above; the GPU/EGL path imports every plane so + // the driver decompresses during the blit. The CPU/linear path only ever sees plane_count==1. + int plane_count; + uint32_t plane_handles[4]; + uint32_t plane_pitches[4]; + uint32_t plane_offsets[4]; +} kvm_drm_scanout_frame; + +static uint32_t kvm_drm_get_plane_fb_id(int fd, uint32_t crtc_id, int crtc_index); +static uint32_t kvm_drm_get_scanout_fb_id(int fd, uint32_t crtc_id, int crtc_index, bool *out_have_crtc, bool *out_used_plane_fb); + +static void kvm_drm_copy_error_message(char *dst, size_t dst_size, const char *src) +{ + if (dst == NULL || dst_size == 0) + { + return; + } + if (src == NULL) + { + dst[0] = 0; + return; + } + + size_t n = strnlen_s(src, dst_size - 1); + memcpy_s(dst, dst_size, src, n); + dst[n] = 0; +} + +static void kvm_drm_format_fourcc(char *dst, size_t dst_size, uint32_t format) +{ + char code[5]; + int i; + + if (dst == NULL || dst_size == 0) + { + return; + } + + for (i = 0; i < 4; ++i) + { + unsigned char ch = (unsigned char)((format >> (i * 8)) & 0xFFu); + code[i] = (char)((ch >= 32 && ch <= 126) ? ch : '.'); + } + code[4] = 0; + snprintf(dst, dst_size, "%s/0x%08X", code, format); +} + +static void kvm_drm_debug_log_scanout_frame(const char *prefix, const kvm_drm_scanout_frame *frame) +{ + char format[32]; + + if (!drm_debug || frame == NULL) + { + return; + } + + kvm_drm_format_fourcc(format, sizeof(format), frame->format); + fprintf(stderr, + "DRM: %s fb_id=%u size=%ux%u pitch=%u offset=%u format=%s modifier=0x%016" PRIx64 " handle=%u rotation=%s\n", + (prefix != NULL) ? prefix : "scanout", + frame->fb_id, + frame->width, + frame->height, + frame->pitch, + frame->offset, + format, + frame->modifier, + frame->handle, + kvm_drm_rotation_name(frame->rotation)); +} + +static void kvm_drm_close_gem_handle(int fd, uint32_t handle) +{ + struct drm_gem_close closeReq; + + if (fd < 0 || handle == 0) + { + return; + } + + memset(&closeReq, 0, sizeof(closeReq)); + closeReq.handle = handle; + if (drmIoctl(fd, DRM_IOCTL_GEM_CLOSE, &closeReq) != 0 && drm_debug) + { + fprintf(stderr, "DRM: DRM_IOCTL_GEM_CLOSE failed for handle=%u (errno=%d)\n", handle, errno); + } +} + +// Close each unique plane handle once (CCS data + metadata can share one GEM handle). Every +// drmModeGetFB/GetFB2 call creates fresh handle references that pin the underlying BO until +// closed; drmModeFreeFB/FreeFB2 only free the struct. +static void kvm_drm_close_frame_handles(int fd, kvm_drm_scanout_frame *frame) +{ + int pi, pj; + for (pi = 0; pi < frame->plane_count && pi < 4; ++pi) + { + uint32_t h = frame->plane_handles[pi]; + int dup = 0; + if (h == 0) { continue; } + for (pj = 0; pj < pi; ++pj) { if (frame->plane_handles[pj] == h) { dup = 1; break; } } + if (!dup) { kvm_drm_close_gem_handle(fd, h); } + } + for (pi = 0; pi < frame->plane_count && pi < 4; ++pi) { frame->plane_handles[pi] = 0; } + frame->handle = 0; +} + +static void kvm_drm_reset_logged_scanout_state(uint32_t *lastLoggedFbId, + uint32_t *lastLoggedWidth, + uint32_t *lastLoggedHeight, + uint32_t *lastLoggedPitch, + uint32_t *lastLoggedOffset, + uint32_t *lastLoggedFormat, + uint32_t *lastLoggedHandle, + uint64_t *lastLoggedModifier, + int *lastLoggedPath) +{ + if (lastLoggedFbId != NULL) { *lastLoggedFbId = 0; } + if (lastLoggedWidth != NULL) { *lastLoggedWidth = 0; } + if (lastLoggedHeight != NULL) { *lastLoggedHeight = 0; } + if (lastLoggedPitch != NULL) { *lastLoggedPitch = 0; } + if (lastLoggedOffset != NULL) { *lastLoggedOffset = 0; } + if (lastLoggedFormat != NULL) { *lastLoggedFormat = 0; } + if (lastLoggedHandle != NULL) { *lastLoggedHandle = 0; } + if (lastLoggedModifier != NULL) { *lastLoggedModifier = UINT64_MAX; } + if (lastLoggedPath != NULL) { *lastLoggedPath = -1; } +} + +static bool kvm_drm_is_transient_scanout_error(const char *err) +{ + if (err == NULL) + { + return false; + } + + return strcmp(err, "Active CRTC has no framebuffer") == 0 || + strcmp(err, "drmModeGetCrtc failed") == 0; +} + +static bool kvm_drm_is_expected_suspended_refresh_error(const char *err) +{ + static const char *noOutputPrefix = "No connected display with active CRTC on "; + + if (err == NULL) + { + return false; + } + + return strcmp(err, "No active DRM framebuffer available yet") == 0 || + strncmp(err, noOutputPrefix, strlen(noOutputPrefix)) == 0; +} + +static const char *kvm_drm_connector_type_name(uint32_t t) +{ + switch (t) + { + case DRM_MODE_CONNECTOR_Unknown: + return "Unknown"; + case DRM_MODE_CONNECTOR_VGA: + return "VGA"; + case DRM_MODE_CONNECTOR_DVII: + return "DVI-I"; + case DRM_MODE_CONNECTOR_DVID: + return "DVI-D"; + case DRM_MODE_CONNECTOR_DVIA: + return "DVI-A"; + case DRM_MODE_CONNECTOR_Composite: + return "Composite"; + case DRM_MODE_CONNECTOR_SVIDEO: + return "SVIDEO"; + case DRM_MODE_CONNECTOR_LVDS: + return "LVDS"; + case DRM_MODE_CONNECTOR_Component: + return "Component"; + case DRM_MODE_CONNECTOR_9PinDIN: + return "DIN"; + case DRM_MODE_CONNECTOR_DisplayPort: + return "DP"; + case DRM_MODE_CONNECTOR_HDMIA: + return "HDMI-A"; + case DRM_MODE_CONNECTOR_HDMIB: + return "HDMI-B"; + case DRM_MODE_CONNECTOR_TV: + return "TV"; + case DRM_MODE_CONNECTOR_eDP: + return "eDP"; + case DRM_MODE_CONNECTOR_VIRTUAL: + return "Virtual"; + case DRM_MODE_CONNECTOR_DSI: + return "DSI"; + default: + return "Connector"; + } +} + +static void kvm_drm_destroy_map(kvm_drm_frame_map *map) +{ + if (map->addr != NULL && map->size > 0) + { + munmap(map->addr, map->size); + } + if (map->dma_fd >= 0) + { + close(map->dma_fd); + } + if (map->handle != 0) + { + kvm_drm_close_gem_handle(map->drm_fd, map->handle); + } + map->handle = 0; + map->addr = NULL; + map->size = 0; + map->dma_fd = -1; + map->drm_fd = -1; +} + +static bool kvm_drm_map_framebuffer_handle(int fd, uint32_t handle, size_t min_size, kvm_drm_frame_map *map, char *out_error, size_t out_error_size) +{ + if (map->handle == handle && map->addr != NULL && map->size >= min_size) + { + return true; + } + + kvm_drm_destroy_map(map); + + struct drm_mode_map_dumb map_dumb; + memset(&map_dumb, 0, sizeof(map_dumb)); + map_dumb.handle = handle; + if (drmIoctl(fd, DRM_IOCTL_MODE_MAP_DUMB, &map_dumb) == 0) + { + void *ptr = mmap(NULL, min_size, PROT_READ, MAP_SHARED, fd, map_dumb.offset); + if (ptr != MAP_FAILED) + { + map->handle = handle; + map->addr = (uint8_t *)ptr; + map->size = min_size; + map->drm_fd = fd; + return true; + } + } + + int dma_fd = -1; + if (drmPrimeHandleToFD(fd, handle, DRM_CLOEXEC | DRM_RDWR, &dma_fd) == 0) + { + void *ptr = mmap(NULL, min_size, PROT_READ, MAP_SHARED, dma_fd, 0); + if (ptr != MAP_FAILED) + { + map->handle = handle; + map->addr = (uint8_t *)ptr; + map->size = min_size; + map->dma_fd = dma_fd; + map->drm_fd = fd; + return true; + } + close(dma_fd); + } + + kvm_drm_copy_error_message(out_error, out_error_size, + "Failed to map scanout buffer (requires mappable dumb/linear buffer and DRM access)"); + return false; +} + +static uint32_t kvm_drm_pick_crtc_for_connector(int fd, const drmModeRes *res, const drmModeConnector *conn) +{ + uint32_t crtc_id = 0; + int i; + if (conn->encoder_id != 0) + { + drmModeEncoder *enc = drmModeGetEncoder(fd, conn->encoder_id); + if (enc != NULL) + { + crtc_id = enc->crtc_id; + drmModeFreeEncoder(enc); + if (crtc_id != 0) + { + for (i = 0; i < res->count_crtcs; ++i) + { + if (res->crtcs[i] == crtc_id) + { + return crtc_id; + } + } + } + } + } + + for (i = 0; i < conn->count_encoders; ++i) + { + drmModeEncoder *enc = drmModeGetEncoder(fd, conn->encoders[i]); + if (enc == NULL) + { + continue; + } + crtc_id = enc->crtc_id; + drmModeFreeEncoder(enc); + if (crtc_id != 0) + { + int j; + for (j = 0; j < res->count_crtcs; ++j) + { + if (res->crtcs[j] == crtc_id) + { + return crtc_id; + } + } + } + } + + return 0; +} + +static int kvm_drm_output_index_by_crtc(kvm_drm_output *outputs, int output_count, uint32_t crtc_id) +{ + int i; + for (i = 0; i < output_count; ++i) + { + if (outputs[i].crtc_id == crtc_id) + { + return i; + } + } + return -1; +} + +static int kvm_drm_compare_outputs(const void *a, const void *b) +{ + const kvm_drm_output *oa = (const kvm_drm_output *)a; + const kvm_drm_output *ob = (const kvm_drm_output *)b; + if (oa->y != ob->y) { return oa->y < ob->y ? -1 : 1; } + if (oa->x != ob->x) { return oa->x < ob->x ? -1 : 1; } + if (oa->connector_id != ob->connector_id) { return oa->connector_id < ob->connector_id ? -1 : 1; } + // connector_id is per-card, so two GPUs can collide; device_index keeps the sort stable. + if (oa->device_index != ob->device_index) { return oa->device_index < ob->device_index ? -1 : 1; } + return 0; +} + +static bool kvm_drm_collect_active_outputs_on_fd(int fd, const char *path, kvm_drm_output *outputs, int max_outputs, int *out_count, bool require_scanout, bool logSelection, char *out_error, size_t out_error_size) +{ + drmModeRes *res = drmModeGetResources(fd); + if (res == NULL) + { + kvm_drm_copy_error_message(out_error, out_error_size, "drmModeGetResources failed"); + return false; + } + + int count = 0; + int connected = 0; + int i; + for (i = 0; i < res->count_connectors && count < max_outputs; ++i) + { + drmModeConnector *conn = drmModeGetConnector(fd, res->connectors[i]); + if (conn == NULL) + { + continue; + } + + if (conn->connection != DRM_MODE_CONNECTED || conn->count_modes <= 0) + { + drmModeFreeConnector(conn); + continue; + } + connected++; + + uint32_t crtc_id = kvm_drm_pick_crtc_for_connector(fd, res, conn); + if (crtc_id == 0) + { + drmModeFreeConnector(conn); + continue; + } + + int c; + int crtc_index = -1; + for (c = 0; c < res->count_crtcs; ++c) + { + if (res->crtcs[c] == crtc_id) + { + crtc_index = c; + break; + } + } + if (crtc_index < 0 || kvm_drm_output_index_by_crtc(outputs, count, crtc_id) >= 0) + { + drmModeFreeConnector(conn); + continue; + } + + drmModeCrtc *crtc = drmModeGetCrtc(fd, crtc_id); + if (crtc == NULL) + { + drmModeFreeConnector(conn); + continue; + } + + uint32_t fb_id = kvm_drm_get_scanout_fb_id(fd, crtc_id, crtc_index, NULL, NULL); + if (require_scanout && fb_id == 0) + { + drmModeFreeCrtc(crtc); + drmModeFreeConnector(conn); + continue; + } + + kvm_drm_output candidate; + memset(&candidate, 0, sizeof(candidate)); + snprintf(candidate.device_path, sizeof(candidate.device_path), "%s", path); + snprintf(candidate.connector_name, sizeof(candidate.connector_name), "%s-%u", kvm_drm_connector_type_name(conn->connector_type), conn->connector_type_id); + candidate.connector_id = conn->connector_id; + candidate.crtc_id = crtc_id; + candidate.crtc_index = crtc_index; + candidate.x = crtc->x; + candidate.y = crtc->y; + candidate.width = crtc->width; + candidate.height = crtc->height; + outputs[count++] = candidate; + + drmModeFreeCrtc(crtc); + drmModeFreeConnector(conn); + } + + drmModeFreeResources(res); + + if (count <= 0) + { + char err[KVM_DRM_MAX_ERROR]; + snprintf(err, sizeof(err), "%s on %s", + connected > 0 ? "No connected display with active scanout" : "No connected display with active CRTC", + path); + kvm_drm_copy_error_message(out_error, out_error_size, err); + return false; + } + + qsort(outputs, (size_t)count, sizeof(kvm_drm_output), kvm_drm_compare_outputs); + *out_count = count; + + if (drm_debug && logSelection) + { + fprintf(stderr, "DRM: Selected %d output(s) on %s\n", count, path); + for (i = 0; i < count; ++i) + { + fprintf(stderr, "DRM: output[%d] %s connector=%u crtc=%u index=%d pos=%d,%d size=%ux%u\n", + i, outputs[i].connector_name, outputs[i].connector_id, outputs[i].crtc_id, + outputs[i].crtc_index, outputs[i].x, outputs[i].y, outputs[i].width, outputs[i].height); + } + } + return true; +} + +static void kvm_drm_close_all_devices(kvm_drm_device *devices, int count) +{ + int i, j; + // A default-display fallback can hand the same EGLDisplay to multiple devices; EGL doesn't + // refcount eglTerminate, so detach duplicates and let only the first owner tear the display down. + for (i = 0; i < count; ++i) + { + for (j = 0; j < i; ++j) + { + if (devices[i].eglCtx.dpy != EGL_NO_DISPLAY && devices[i].eglCtx.dpy == devices[j].eglCtx.dpy) + { + devices[i].eglCtx.dpy = EGL_NO_DISPLAY; + break; + } + } + } + for (i = 0; i < count; ++i) + { + kvm_drm_egl_destroy_context(&devices[i].eglCtx); + kvm_drm_destroy_map(&devices[i].map); + if (devices[i].fd >= 0) { close(devices[i].fd); devices[i].fd = -1; } + } +} + +// Returns true only if the card contributed active outputs (not merely that it opened). +static bool kvm_drm_try_device(const char *path, kvm_drm_device *devices, int max_devices, int *device_count, + kvm_drm_output *outputs, int max_outputs, int *out_count, char *out_error, size_t out_error_size) +{ + int fd, collected = 0, base = *out_count, k; + + if (*device_count >= max_devices || base >= max_outputs) { return false; } + if ((fd = open(path, O_RDWR | KVM_DRM_O_CLOEXEC | O_NONBLOCK)) < 0) { return false; } + // Without this cap the kernel hides primary planes from GetPlaneResources, and the + // plane-rotation query (and the plane-fb fallback) would only ever see overlays. + drmSetClientCap(fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1); + if (!kvm_drm_collect_active_outputs_on_fd(fd, path, &outputs[base], max_outputs - base, &collected, true, true, out_error, out_error_size)) + { + close(fd); + return false; + } + + for (k = 0; k < collected; ++k) { outputs[base + k].device_index = *device_count; } + memset(&devices[*device_count], 0, sizeof(devices[*device_count])); + devices[*device_count].fd = fd; + devices[*device_count].map.dma_fd = -1; + devices[*device_count].map.drm_fd = -1; + snprintf(devices[*device_count].path, sizeof(devices[*device_count].path), "%s", path); + *out_count += collected; + (*device_count)++; + return true; +} + +// Merge every GPU's outputs so a multi-card desktop is one capture; sort by position for stable monitor numbering. +static bool kvm_drm_open_all_devices(const char *explicit_device, kvm_drm_device *devices, int max_devices, + int *out_device_count, kvm_drm_output *outputs, int max_outputs, int *out_count, char *out_error, size_t out_error_size) +{ + *out_device_count = 0; + *out_count = 0; + + if (explicit_device != NULL && explicit_device[0] != 0) + { + kvm_drm_try_device(explicit_device, devices, max_devices, out_device_count, outputs, max_outputs, out_count, out_error, out_error_size); + } + else + { + int i; + for (i = 0; i < 16; ++i) + { + char path[64]; + snprintf(path, sizeof(path), "/dev/dri/card%d", i); + kvm_drm_try_device(path, devices, max_devices, out_device_count, outputs, max_outputs, out_count, out_error, out_error_size); + } + } + + if (*out_device_count == 0) + { + kvm_drm_copy_error_message(out_error, out_error_size, "No usable /dev/dri/card* device with active connector/CRTC scanout"); + return false; + } + + qsort(outputs, (size_t)*out_count, sizeof(kvm_drm_output), kvm_drm_compare_outputs); + return true; +} + +// 1s refresh path: picks up resolution/hotplug changes without reopening; a card with no scanout is skipped, not fatal. +static bool kvm_drm_refresh_all_devices(kvm_drm_device *devices, int deviceCount, kvm_drm_output *outputs, + int max_outputs, int *out_count, char *out_error, size_t out_error_size) +{ + int di, k; + *out_count = 0; + out_error[0] = 0; // collect only writes this on failure; clear it so the empty-result check below is reliable + for (di = 0; di < deviceCount; ++di) + { + int collected = 0, base = *out_count; + if (base >= max_outputs) { break; } + if (!kvm_drm_collect_active_outputs_on_fd(devices[di].fd, devices[di].path, &outputs[base], max_outputs - base, &collected, true, false, out_error, out_error_size)) + { + continue; + } + for (k = 0; k < collected; ++k) { outputs[base + k].device_index = di; } + *out_count += collected; + } + if (*out_count == 0) + { + if (out_error[0] == 0) { kvm_drm_copy_error_message(out_error, out_error_size, "No active scanout on any device"); } + return false; + } + qsort(outputs, (size_t)*out_count, sizeof(kvm_drm_output), kvm_drm_compare_outputs); + return true; +} + +// We only read scanout state; holding DRM master can block the compositor from +// taking GPU ownership during greeter/user-session handoff. +static int kvm_drm_drop_master_if_held(int fd) +{ + if (fd < 0) { return 0; } + if (drmDropMaster(fd) == 0) { return 0; } + + // Not master, or driver doesn't implement master semantics for this fd. + if (errno == EINVAL || errno == ENOTTY || errno == ENOSYS) + { + return 0; + } + return -1; +} + +static uint32_t kvm_drm_get_plane_fb_id(int fd, uint32_t crtc_id, int crtc_index) +{ + drmModePlaneRes *pres = drmModeGetPlaneResources(fd); + if (pres == NULL) + { + return 0; + } + + uint32_t best_fb_id = 0; + uint64_t best_area = 0; + uint32_t i; + + for (i = 0; i < pres->count_planes; ++i) + { + drmModePlane *plane = drmModeGetPlane(fd, pres->planes[i]); + if (plane == NULL) + { + continue; + } + if (plane->crtc_id == crtc_id && plane->fb_id != 0 && + (plane->possible_crtcs & (1u << (uint32_t)crtc_index))) + { + drmModeFB *fb = drmModeGetFB(fd, plane->fb_id); + if (fb != NULL) + { + uint64_t area = ((uint64_t)fb->width) * ((uint64_t)fb->height); + if (area > best_area) + { + best_area = area; + best_fb_id = plane->fb_id; + } + // Only the fb_id is kept; release the handle reference GETFB just created, or this + // leaks one handle per plane per frame whenever the plane-fb fallback is active. + kvm_drm_close_gem_handle(fd, fb->handle); + drmModeFreeFB(fb); + } + } + drmModeFreePlane(plane); + } + + drmModeFreePlaneResources(pres); + return best_fb_id; +} + +static kvm_drm_rotation kvm_drm_get_scanout_rotation() +{ + kvm_drm_rotation forced = KVM_DRM_ROTATION_0; + if (kvm_drm_get_forced_rotation(&forced, drm_debug)) + { + return forced; + } + return KVM_DRM_ROTATION_0; +} + +static uint32_t kvm_drm_get_scanout_fb_id(int fd, uint32_t crtc_id, int crtc_index, bool *out_have_crtc, bool *out_used_plane_fb) +{ + drmModeCrtc *crtc = drmModeGetCrtc(fd, crtc_id); + uint32_t fb_id = 0; + + if (out_have_crtc != NULL) { *out_have_crtc = false; } + if (out_used_plane_fb != NULL) { *out_used_plane_fb = false; } + + if (crtc == NULL) + { + return 0; + } + + if (out_have_crtc != NULL) { *out_have_crtc = true; } + + fb_id = crtc->buffer_id; + drmModeFreeCrtc(crtc); + + if (fb_id == 0) + { + fb_id = kvm_drm_get_plane_fb_id(fd, crtc_id, crtc_index); + if (fb_id != 0 && out_used_plane_fb != NULL) + { + *out_used_plane_fb = true; + } + } + + return fb_id; +} + +static bool kvm_drm_get_scanout_frame(int fd, uint32_t crtc_id, int crtc_index, kvm_drm_scanout_frame *out, char *out_error, size_t out_error_size) +{ + bool have_crtc = false; + bool used_plane_fb = false; + uint32_t fb_id = kvm_drm_get_scanout_fb_id(fd, crtc_id, crtc_index, &have_crtc, &used_plane_fb); + + out->rotation = KVM_DRM_ROTATION_0; + + if (!have_crtc) + { + kvm_drm_copy_error_message(out_error, out_error_size, "drmModeGetCrtc failed"); + return false; + } + if (fb_id == 0) + { + kvm_drm_copy_error_message(out_error, out_error_size, "Active CRTC has no framebuffer"); + return false; + } + if (drm_debug && used_plane_fb) + { + fprintf(stderr, "DRM: CRTC %u has no direct buffer_id, using plane framebuffer %u\n", crtc_id, fb_id); + } + + bool have_fb2_meta = false; + drmModeFB2 *fb2 = drmModeGetFB2(fd, fb_id); + if (fb2 != NULL) + { + int planeCount = 1; + while (planeCount < 4 && + (fb2->handles[planeCount] != 0 || fb2->pitches[planeCount] != 0 || fb2->offsets[planeCount] != 0)) + { + ++planeCount; + } + + if (drm_debug >= 2) + { + char format[32]; + kvm_drm_format_fourcc(format, sizeof(format), fb2->pixel_format); + fprintf(stderr, + "DRM: FB2 fb_id=%u planes=%d size=%ux%u format=%s modifier=0x%016" PRIx64 + " handles=[%u,%u,%u,%u] pitches=[%u,%u,%u,%u] offsets=[%u,%u,%u,%u]\n", + fb_id, + planeCount, + fb2->width, + fb2->height, + format, + fb2->modifier, + fb2->handles[0], fb2->handles[1], fb2->handles[2], fb2->handles[3], + fb2->pitches[0], fb2->pitches[1], fb2->pitches[2], fb2->pitches[3], + fb2->offsets[0], fb2->offsets[1], fb2->offsets[2], fb2->offsets[3]); + } + + // Capture every plane. Render-compressed scanout (Intel Y-tiled CCS) presents a data plane + // plus a metadata plane; the EGL importer hands all planes to eglCreateImageKHR so the GPU + // decompresses during the blit. Rejecting planeCount>1 here is what turned CCS scanout black. + out->plane_count = planeCount; + for (int p = 0; p < planeCount && p < 4; ++p) + { + out->plane_handles[p] = fb2->handles[p]; + out->plane_pitches[p] = fb2->pitches[p]; + out->plane_offsets[p] = fb2->offsets[p]; + } + + out->width = fb2->width; + out->height = fb2->height; + out->pitch = fb2->pitches[0]; + out->offset = fb2->offsets[0]; + out->format = fb2->pixel_format; + out->modifier = fb2->modifier; + if (fb2->handles[0] != 0) + { + out->fb_id = fb_id; + out->handle = fb2->handles[0]; + out->rotation = kvm_drm_get_scanout_rotation(); + drmModeFreeFB2(fb2); + return true; + } + have_fb2_meta = true; + drmModeFreeFB2(fb2); + } + + drmModeFB *fb = drmModeGetFB(fd, fb_id); + if (fb == NULL) + { + kvm_drm_close_frame_handles(fd, out); // fb2 metadata may have carried handle references + kvm_drm_copy_error_message(out_error, out_error_size, "drmModeGetFB failed"); + return false; + } + + out->fb_id = fb_id; + if (!have_fb2_meta) + { + out->width = fb->width; + out->height = fb->height; + out->pitch = fb->pitch; + out->offset = 0; + out->format = DRM_FORMAT_XRGB8888; + out->modifier = DRM_FORMAT_MOD_LINEAR; + } + out->handle = fb->handle; + if (!have_fb2_meta) + { + out->plane_count = 1; + out->plane_handles[0] = fb->handle; + out->plane_pitches[0] = out->pitch; + out->plane_offsets[0] = out->offset; + } + out->rotation = kvm_drm_get_scanout_rotation(); + drmModeFreeFB(fb); + return true; +} + +static uint32_t kvm_drm_bytes_per_pixel(uint32_t format) +{ + switch (format) + { + case DRM_FORMAT_XRGB8888: + case DRM_FORMAT_ARGB8888: + case DRM_FORMAT_XBGR8888: + case DRM_FORMAT_ABGR8888: + case DRM_FORMAT_RGBX8888: + case DRM_FORMAT_RGBA8888: + case DRM_FORMAT_BGRX8888: + case DRM_FORMAT_BGRA8888: + case DRM_FORMAT_XRGB2101010: + case DRM_FORMAT_XBGR2101010: + case DRM_FORMAT_ARGB2101010: + case DRM_FORMAT_ABGR2101010: + case DRM_FORMAT_RGBX1010102: + case DRM_FORMAT_BGRX1010102: + case DRM_FORMAT_RGBA1010102: + case DRM_FORMAT_BGRA1010102: + return 4; + case DRM_FORMAT_RGB888: + case DRM_FORMAT_BGR888: + return 3; + case DRM_FORMAT_RGB565: + case DRM_FORMAT_BGR565: + return 2; + default: + return 0; + } +} + +static bool kvm_drm_convert_to_rgb24(const kvm_drm_scanout_frame *f, const uint8_t *src, uint8_t *rgb, size_t rgb_capacity, size_t *rgb_size_out, char *out_error, size_t out_error_size) +{ + static uint8_t expand5[32]; + static uint8_t expand6[64]; + static int expandTablesReady = 0; + uint32_t i; + + if (rgb_size_out != NULL) + { + *rgb_size_out = 0; + } + if (f->modifier != DRM_FORMAT_MOD_INVALID && f->modifier != DRM_FORMAT_MOD_LINEAR) + { + kvm_drm_copy_error_message(out_error, out_error_size, "Non-linear DRM modifier is not supported by CPU readback path"); + return false; + } + + uint32_t bpp = kvm_drm_bytes_per_pixel(f->format); + if (bpp == 0) + { + char err[KVM_DRM_MAX_ERROR]; + snprintf(err, sizeof(err), "Unsupported DRM pixel format: 0x%08X", f->format); + kvm_drm_copy_error_message(out_error, out_error_size, err); + return false; + } + + if (f->pitch < f->width * bpp) + { + kvm_drm_copy_error_message(out_error, out_error_size, "Invalid pitch for framebuffer"); + return false; + } + + size_t rgb_size = (size_t)f->width * (size_t)f->height * 3u; + if (rgb == NULL || rgb_capacity < rgb_size) + { + kvm_drm_copy_error_message(out_error, out_error_size, "Output RGB buffer too small"); + return false; + } + + uint32_t y; + if (expandTablesReady == 0) + { + for (i = 0; i < 32; ++i) { expand5[i] = (uint8_t)((i * 255u) / 31u); } + for (i = 0; i < 64; ++i) { expand6[i] = (uint8_t)((i * 255u) / 63u); } + expandTablesReady = 1; + } + + switch (f->format) + { + case DRM_FORMAT_XRGB8888: + case DRM_FORMAT_ARGB8888: + { + for (y = 0; y < f->height; ++y) + { + const uint8_t *s = src + ((size_t)y * (size_t)f->pitch); + uint8_t *d = rgb + ((size_t)y * (size_t)f->width * 3u); + uint32_t x = f->width; + while (x-- > 0) + { + d[0] = s[2]; + d[1] = s[1]; + d[2] = s[0]; + s += 4; + d += 3; + } + } + break; + } + case DRM_FORMAT_XBGR8888: + case DRM_FORMAT_ABGR8888: + { + for (y = 0; y < f->height; ++y) + { + const uint8_t *s = src + ((size_t)y * (size_t)f->pitch); + uint8_t *d = rgb + ((size_t)y * (size_t)f->width * 3u); + uint32_t x = f->width; + while (x-- > 0) + { + d[0] = s[0]; + d[1] = s[1]; + d[2] = s[2]; + s += 4; + d += 3; + } + } + break; + } + case DRM_FORMAT_RGBX8888: + case DRM_FORMAT_RGBA8888: + { + for (y = 0; y < f->height; ++y) + { + const uint8_t *s = src + ((size_t)y * (size_t)f->pitch); + uint8_t *d = rgb + ((size_t)y * (size_t)f->width * 3u); + uint32_t x = f->width; + while (x-- > 0) + { + d[0] = s[3]; + d[1] = s[2]; + d[2] = s[1]; + s += 4; + d += 3; + } + } + break; + } + case DRM_FORMAT_BGRX8888: + case DRM_FORMAT_BGRA8888: + { + for (y = 0; y < f->height; ++y) + { + const uint8_t *s = src + ((size_t)y * (size_t)f->pitch); + uint8_t *d = rgb + ((size_t)y * (size_t)f->width * 3u); + uint32_t x = f->width; + while (x-- > 0) + { + d[0] = s[1]; + d[1] = s[2]; + d[2] = s[3]; + s += 4; + d += 3; + } + } + break; + } + case DRM_FORMAT_XRGB2101010: + case DRM_FORMAT_ARGB2101010: + { + for (y = 0; y < f->height; ++y) + { + const uint8_t *s = src + ((size_t)y * (size_t)f->pitch); + uint8_t *d = rgb + ((size_t)y * (size_t)f->width * 3u); + uint32_t x = f->width; + while (x-- > 0) + { + uint32_t v = ((uint32_t)s[0]) | (((uint32_t)s[1]) << 8) | (((uint32_t)s[2]) << 16) | (((uint32_t)s[3]) << 24); + d[0] = (uint8_t)(((v >> 20) & 0x3FFu) >> 2); + d[1] = (uint8_t)(((v >> 10) & 0x3FFu) >> 2); + d[2] = (uint8_t)(((v >> 0) & 0x3FFu) >> 2); + s += 4; + d += 3; + } + } + break; + } + case DRM_FORMAT_XBGR2101010: + case DRM_FORMAT_ABGR2101010: + { + for (y = 0; y < f->height; ++y) + { + const uint8_t *s = src + ((size_t)y * (size_t)f->pitch); + uint8_t *d = rgb + ((size_t)y * (size_t)f->width * 3u); + uint32_t x = f->width; + while (x-- > 0) + { + uint32_t v = ((uint32_t)s[0]) | (((uint32_t)s[1]) << 8) | (((uint32_t)s[2]) << 16) | (((uint32_t)s[3]) << 24); + d[0] = (uint8_t)(((v >> 0) & 0x3FFu) >> 2); + d[1] = (uint8_t)(((v >> 10) & 0x3FFu) >> 2); + d[2] = (uint8_t)(((v >> 20) & 0x3FFu) >> 2); + s += 4; + d += 3; + } + } + break; + } + case DRM_FORMAT_RGBX1010102: + case DRM_FORMAT_RGBA1010102: + { + for (y = 0; y < f->height; ++y) + { + const uint8_t *s = src + ((size_t)y * (size_t)f->pitch); + uint8_t *d = rgb + ((size_t)y * (size_t)f->width * 3u); + uint32_t x = f->width; + while (x-- > 0) + { + uint32_t v = ((uint32_t)s[0]) | (((uint32_t)s[1]) << 8) | (((uint32_t)s[2]) << 16) | (((uint32_t)s[3]) << 24); + d[0] = (uint8_t)(((v >> 22) & 0x3FFu) >> 2); + d[1] = (uint8_t)(((v >> 12) & 0x3FFu) >> 2); + d[2] = (uint8_t)(((v >> 2) & 0x3FFu) >> 2); + s += 4; + d += 3; + } + } + break; + } + case DRM_FORMAT_BGRX1010102: + case DRM_FORMAT_BGRA1010102: + { + for (y = 0; y < f->height; ++y) + { + const uint8_t *s = src + ((size_t)y * (size_t)f->pitch); + uint8_t *d = rgb + ((size_t)y * (size_t)f->width * 3u); + uint32_t x = f->width; + while (x-- > 0) + { + uint32_t v = ((uint32_t)s[0]) | (((uint32_t)s[1]) << 8) | (((uint32_t)s[2]) << 16) | (((uint32_t)s[3]) << 24); + d[0] = (uint8_t)(((v >> 2) & 0x3FFu) >> 2); + d[1] = (uint8_t)(((v >> 12) & 0x3FFu) >> 2); + d[2] = (uint8_t)(((v >> 22) & 0x3FFu) >> 2); + s += 4; + d += 3; + } + } + break; + } + case DRM_FORMAT_RGB888: + { + for (y = 0; y < f->height; ++y) + { + const uint8_t *s = src + ((size_t)y * (size_t)f->pitch); + uint8_t *d = rgb + ((size_t)y * (size_t)f->width * 3u); + uint32_t x = f->width; + while (x-- > 0) + { + d[0] = s[2]; + d[1] = s[1]; + d[2] = s[0]; + s += 3; + d += 3; + } + } + break; + } + case DRM_FORMAT_BGR888: + { + for (y = 0; y < f->height; ++y) + { + const uint8_t *s = src + ((size_t)y * (size_t)f->pitch); + uint8_t *d = rgb + ((size_t)y * (size_t)f->width * 3u); + uint32_t x = f->width; + while (x-- > 0) + { + d[0] = s[0]; + d[1] = s[1]; + d[2] = s[2]; + s += 3; + d += 3; + } + } + break; + } + case DRM_FORMAT_RGB565: + { + for (y = 0; y < f->height; ++y) + { + const uint8_t *s = src + ((size_t)y * (size_t)f->pitch); + uint8_t *d = rgb + ((size_t)y * (size_t)f->width * 3u); + uint32_t x = f->width; + while (x-- > 0) + { + uint16_t v = ((uint16_t)s[0]) | (((uint16_t)s[1]) << 8); + d[0] = expand5[(v >> 11) & 0x1Fu]; + d[1] = expand6[(v >> 5) & 0x3Fu]; + d[2] = expand5[(v >> 0) & 0x1Fu]; + s += 2; + d += 3; + } + } + break; + } + case DRM_FORMAT_BGR565: + { + for (y = 0; y < f->height; ++y) + { + const uint8_t *s = src + ((size_t)y * (size_t)f->pitch); + uint8_t *d = rgb + ((size_t)y * (size_t)f->width * 3u); + uint32_t x = f->width; + while (x-- > 0) + { + uint16_t v = ((uint16_t)s[0]) | (((uint16_t)s[1]) << 8); + d[0] = expand5[(v >> 0) & 0x1Fu]; + d[1] = expand6[(v >> 5) & 0x3Fu]; + d[2] = expand5[(v >> 11) & 0x1Fu]; + s += 2; + d += 3; + } + } + break; + } + default: + { + char err[KVM_DRM_MAX_ERROR]; + snprintf(err, sizeof(err), "Unsupported DRM pixel format: 0x%08X", f->format); + kvm_drm_copy_error_message(out_error, out_error_size, err); + return false; + } + } + + if (rgb_size_out != NULL) + { + *rgb_size_out = rgb_size; + } + return true; +} + +static void kvm_drm_get_rotated_dimensions(const kvm_drm_scanout_frame *frame, uint32_t *out_width, uint32_t *out_height) +{ + *out_width = frame->width; + *out_height = frame->height; + if (frame->rotation == KVM_DRM_ROTATION_90 || frame->rotation == KVM_DRM_ROTATION_270) + { + *out_width = frame->height; + *out_height = frame->width; + } +} + +// Map a DRM plane "rotation" property bitmask to quarter turns in the same angular direction as +// the wl_output transform (both are specified counter-clockwise). Both reflections together are +// exactly an extra 180; a single-axis mirror is not expressible as a rotation, so reject it. +static int kvm_drm_plane_rotation_value_to_quarters(uint64_t value) +{ + int quarters; + uint64_t reflects = value & (DRM_MODE_REFLECT_X | DRM_MODE_REFLECT_Y); + if (value & DRM_MODE_ROTATE_0) { quarters = 0; } + else if (value & DRM_MODE_ROTATE_90) { quarters = 1; } + else if (value & DRM_MODE_ROTATE_180) { quarters = 2; } + else if (value & DRM_MODE_ROTATE_270) { quarters = 3; } + else { return -1; } + if (reflects == (DRM_MODE_REFLECT_X | DRM_MODE_REFLECT_Y)) { quarters = (quarters + 2) % 4; } + else if (reflects != 0) { return -1; } + return quarters; +} + +// Find the named property on a plane; returns the property id (0 if absent) and its current value. +static uint32_t kvm_drm_find_plane_prop(int fd, uint32_t plane_id, const char *name, uint64_t *out_value) +{ + uint32_t prop_id = 0; + uint32_t i; + drmModeObjectProperties *props = drmModeObjectGetProperties(fd, plane_id, DRM_MODE_OBJECT_PLANE); + if (props == NULL) { return 0; } + for (i = 0; i < props->count_props && prop_id == 0; ++i) + { + drmModePropertyRes *prop = drmModeGetProperty(fd, props->props[i]); + if (prop == NULL) { continue; } + if (strcmp(prop->name, name) == 0) + { + prop_id = prop->prop_id; + if (out_value != NULL) { *out_value = props->prop_values[i]; } + } + drmModeFreeProperty(prop); + } + drmModeFreeObjectProperties(props); + return prop_id; +} + +// Re-read the current value of a known property id on a plane. +static int kvm_drm_read_plane_prop_value(int fd, uint32_t plane_id, uint32_t prop_id, uint64_t *out_value) +{ + int found = 0; + uint32_t i; + drmModeObjectProperties *props = drmModeObjectGetProperties(fd, plane_id, DRM_MODE_OBJECT_PLANE); + if (props == NULL) { return 0; } + for (i = 0; i < props->count_props; ++i) + { + if (props->props[i] == prop_id) + { + *out_value = props->prop_values[i]; + found = 1; + break; + } + } + drmModeFreeObjectProperties(props); + return found; +} + +// The scanout plane feeding a CRTC and its "rotation" property id are stable across frames, so the +// per-frame cost is one plane fetch (rebind check) plus one property-values fetch. +typedef struct kvm_drm_plane_rotation_cache +{ + int fd; + uint32_t crtc_id; + uint32_t plane_id; + uint32_t prop_id; + int last_logged_quarters; +} kvm_drm_plane_rotation_cache; +static kvm_drm_plane_rotation_cache g_planeRotationCache[KVM_DRM_MAX_OUTPUTS]; +static int g_planeRotationCacheCount = 0; + +// Current rotation the scanout hardware applies to the buffer feeding crtc_id, in quarter turns; +// -1 when unknown (no matching plane, no "rotation" property, or a value we cannot express). +// Prefers the plane presenting fb_id (the buffer we actually captured), falling back to the +// CRTC's primary plane, so fullscreen direct scanout on an overlay plane resolves correctly. +static int kvm_drm_get_plane_rotation_quarters(int fd, uint32_t crtc_id, uint32_t fb_id) +{ + uint64_t value = 0; + int slot = -1; + int i; + kvm_drm_plane_rotation_cache *entry = NULL; + drmModePlaneRes *pres = NULL; + uint32_t match_plane = 0, match_prop = 0; + uint32_t primary_plane = 0, primary_prop = 0; + uint64_t match_value = 0, primary_value = 0; + + for (i = 0; i < g_planeRotationCacheCount; ++i) + { + if (g_planeRotationCache[i].fd == fd && g_planeRotationCache[i].crtc_id == crtc_id) + { + slot = i; + break; + } + } + + if (slot >= 0 && g_planeRotationCache[slot].plane_id != 0) + { + entry = &g_planeRotationCache[slot]; + drmModePlane *plane = drmModeGetPlane(fd, entry->plane_id); + if (plane != NULL && plane->crtc_id == crtc_id) + { + drmModeFreePlane(plane); + if (kvm_drm_read_plane_prop_value(fd, entry->plane_id, entry->prop_id, &value)) + { + return kvm_drm_plane_rotation_value_to_quarters(value); + } + } + else if (plane != NULL) + { + drmModeFreePlane(plane); + } + entry->plane_id = 0; // stale binding: rescan below + } + + pres = drmModeGetPlaneResources(fd); + if (pres == NULL) { return -1; } + for (i = 0; i < (int)pres->count_planes && match_plane == 0; ++i) + { + drmModePlane *plane = drmModeGetPlane(fd, pres->planes[i]); + if (plane == NULL) { continue; } + if (plane->crtc_id == crtc_id && plane->fb_id != 0) + { + uint64_t rot = 0, type = 0; + uint32_t prop = kvm_drm_find_plane_prop(fd, plane->plane_id, "rotation", &rot); + if (prop != 0) + { + if (fb_id != 0 && plane->fb_id == fb_id) + { + match_plane = plane->plane_id; + match_prop = prop; + match_value = rot; + } + else if (primary_plane == 0 && + kvm_drm_find_plane_prop(fd, plane->plane_id, "type", &type) != 0 && + type == DRM_PLANE_TYPE_PRIMARY) + { + primary_plane = plane->plane_id; + primary_prop = prop; + primary_value = rot; + } + } + } + drmModeFreePlane(plane); + } + drmModeFreePlaneResources(pres); + + if (match_plane == 0) + { + match_plane = primary_plane; + match_prop = primary_prop; + match_value = primary_value; + } + if (match_plane == 0) { return -1; } + + if (slot < 0 && g_planeRotationCacheCount < KVM_DRM_MAX_OUTPUTS) + { + slot = g_planeRotationCacheCount++; + g_planeRotationCache[slot].last_logged_quarters = -2; + } + if (slot >= 0) + { + g_planeRotationCache[slot].fd = fd; + g_planeRotationCache[slot].crtc_id = crtc_id; + g_planeRotationCache[slot].plane_id = match_plane; + g_planeRotationCache[slot].prop_id = match_prop; + } + return kvm_drm_plane_rotation_value_to_quarters(match_value); +} + +static kvm_drm_rotation kvm_drm_effective_output_rotation(int fd, const kvm_drm_output *output, const kvm_drm_scanout_frame *frame) +{ + if (output->rotation != KVM_DRM_ROTATION_0) + { + // The transform only says how the logical image relates to the panel, not who rotates it. + // When the compositor offloads the rotation to the plane hardware the scanout buffer stays + // in logical orientation (mutter does this for 180 on i915, which can't offload 90/270 + // here), so compose the plane's own rotation with the transform-derived un-rotation: + // whatever the hardware already turns must not be turned again in software. + int planeQuarters = kvm_drm_get_plane_rotation_quarters(fd, output->crtc_id, frame->fb_id); + if (planeQuarters >= 0) + { + kvm_drm_rotation effective = (kvm_drm_rotation)((((int)output->rotation) + planeQuarters) % 4); + if (drm_debug >= 2) + { + int i; + for (i = 0; i < g_planeRotationCacheCount; ++i) + { + if (g_planeRotationCache[i].fd == fd && g_planeRotationCache[i].crtc_id == output->crtc_id && + g_planeRotationCache[i].last_logged_quarters != planeQuarters) + { + fprintf(stderr, "DRM: CRTC %u plane %u rotation property=%d quarter(s); un-rotation %d -> effective %d\n", + output->crtc_id, g_planeRotationCache[i].plane_id, planeQuarters, + (int)output->rotation, (int)effective); + g_planeRotationCache[i].last_logged_quarters = planeQuarters; + break; + } + } + } + return effective; + } + } + if (output->rotation == KVM_DRM_ROTATION_90 || output->rotation == KVM_DRM_ROTATION_270) + { + // Fallback when the rotation property is unreadable: a 90/270 transform swaps the logical + // aspect relative to the scanout buffer. If the buffer orientation already matches the + // logical rect, the plane hardware is doing the rotation and the content needs no software + // pass. Square shapes give no signal; trust the transform then (compositors pre-rotate in + // the renderer on virtually all hardware). 180 has no aspect signal at all, which is why + // the property query above is the primary source. + if (frame->width != frame->height && output->width != output->height && + (frame->width > frame->height) == (output->width > output->height)) + { + return KVM_DRM_ROTATION_0; + } + } + return output->rotation; +} + +static bool kvm_drm_compute_desktop_layout(const kvm_drm_output *outputs, int output_count, kvm_drm_desktop_layout *layout) +{ + int i; + int min_x = INT_MAX; + int min_y = INT_MAX; + int max_x = INT_MIN; + int max_y = INT_MIN; + + if (outputs == NULL || output_count <= 0 || layout == NULL) + { + return false; + } + + for (i = 0; i < output_count; ++i) + { + int right = outputs[i].x + (int)outputs[i].width; + int bottom = outputs[i].y + (int)outputs[i].height; + if (outputs[i].width == 0 || outputs[i].height == 0) + { + continue; + } + if (outputs[i].x < min_x) { min_x = outputs[i].x; } + if (outputs[i].y < min_y) { min_y = outputs[i].y; } + if (right > max_x) { max_x = right; } + if (bottom > max_y) { max_y = bottom; } + } + + if (min_x == INT_MAX || min_y == INT_MAX || max_x <= min_x || max_y <= min_y) + { + return false; + } + + layout->min_x = min_x; + layout->min_y = min_y; + layout->max_x = max_x; + layout->max_y = max_y; + layout->width = (uint32_t)(max_x - min_x); + layout->height = (uint32_t)(max_y - min_y); + return true; +} + +static void kvm_drm_publish_monitor_layout(const kvm_drm_output *outputs, int output_count, const kvm_drm_desktop_layout *layout) +{ + kvm_monitor_info monitors[KVM_MAX_MONITORS]; + int i; + int monitorCount = output_count; + + if (outputs == NULL || layout == NULL) + { + kvm_update_monitor_layout(NULL, 0, 0, 0); + return; + } + if (monitorCount > KVM_MAX_MONITORS) { monitorCount = KVM_MAX_MONITORS; } + + memset(monitors, 0, sizeof(monitors)); + for (i = 0; i < monitorCount; ++i) + { + monitors[i].id = i + 1; + monitors[i].x = outputs[i].x - layout->min_x; + monitors[i].y = outputs[i].y - layout->min_y; + monitors[i].width = (int)outputs[i].width; + monitors[i].height = (int)outputs[i].height; + } + kvm_update_monitor_layout(monitors, monitorCount, (int)layout->width, (int)layout->height); +} + +static void kvm_drm_update_tile_geometry() +{ + TILE_HEIGHT_COUNT = SCREEN_HEIGHT / TILE_HEIGHT; + TILE_WIDTH_COUNT = SCREEN_WIDTH / TILE_WIDTH; + if (SCREEN_WIDTH % TILE_WIDTH) + { + TILE_WIDTH_COUNT++; + } + if (SCREEN_HEIGHT % TILE_HEIGHT) + { + TILE_HEIGHT_COUNT++; + } +} + +// mutter names an HDMI type-A connector "HDMI-", but the kernel, libdrm, and our own +// kvm_drm_connector_type_name() call it "HDMI-A-". Without tolerating that the xdg-output name +// never matches the DRM connector on GNOME, the whole layout is discarded, and every monitor falls +// back to 0,0. HDMI type-B stays "HDMI-B-" on both sides, so keep it out of the type-A fixup. +static int kvm_drm_connector_name_equal(const char *drmName, const char *wlName) +{ + if (drmName == NULL || wlName == NULL) { return 0; } + if (strcmp(drmName, wlName) == 0) { return 1; } + if (strncmp(drmName, "HDMI-A-", 7) == 0 && strncmp(wlName, "HDMI-", 5) == 0 && strncmp(wlName, "HDMI-B-", 7) != 0) + { + return strcmp(drmName + 7, wlName + 5) == 0; + } + return 0; +} + +static int kvm_drm_find_output_by_name(const kvm_drm_output *outputs, int output_count, const char *name, const bool *claimed) +{ + int i; + if (outputs == NULL || name == NULL || name[0] == 0) + { + return -1; + } + for (i = 0; i < output_count; ++i) + { + if (claimed != NULL && claimed[i]) { continue; } // a prior compositor entry already took this output + if (kvm_drm_connector_name_equal(outputs[i].connector_name, name)) + { + return i; + } + } + return -1; +} + +static int kvm_drm_apply_kwin_screen(kvm_drm_output *outputs, int output_count, const char *name, int enabled, int x, int y, uint32_t width, uint32_t height, kvm_drm_rotation rotation, int *matched, bool *claimed) +{ + int index; + if (enabled != 1 || width == 0 || height == 0) + { + return 0; + } + // connector_name is per-card, so two GPUs can both report e.g. "DP-1"; claimed[] stops two + // compositor entries from both landing on the same output (and leaving the other unplaced). + index = kvm_drm_find_output_by_name(outputs, output_count, name, claimed); + if (index < 0) + { + return 0; + } + + outputs[index].x = x; + outputs[index].y = y; + outputs[index].width = width; + outputs[index].height = height; + outputs[index].rotation = rotation; + if (claimed != NULL) { claimed[index] = true; } + if (matched != NULL) { (*matched)++; } + return 1; +} + +struct zxdg_output_manager_v1; +struct zxdg_output_v1; + +struct zxdg_output_v1_listener +{ + void (*logical_position)(void *data, struct zxdg_output_v1 *zxdg_output_v1, int32_t x, int32_t y); + void (*logical_size)(void *data, struct zxdg_output_v1 *zxdg_output_v1, int32_t width, int32_t height); + void (*done)(void *data, struct zxdg_output_v1 *zxdg_output_v1); + void (*name)(void *data, struct zxdg_output_v1 *zxdg_output_v1, const char *name); + void (*description)(void *data, struct zxdg_output_v1 *zxdg_output_v1, const char *description); +}; + +static const struct wl_interface zxdg_output_v1_interface; + +static const struct wl_interface *kvm_xdg_output_types[] = +{ + NULL, + NULL, + &zxdg_output_v1_interface, + NULL, /* wl_output_interface — patched in at load */ +}; + +static const struct wl_message zxdg_output_manager_v1_requests[] = +{ + { "destroy", "", kvm_xdg_output_types + 0 }, + { "get_xdg_output", "no", kvm_xdg_output_types + 2 }, +}; + +static const struct wl_interface zxdg_output_manager_v1_interface = +{ + "zxdg_output_manager_v1", 3, + 2, zxdg_output_manager_v1_requests, + 0, NULL, +}; + +static const struct wl_message zxdg_output_v1_requests[] = +{ + { "destroy", "", kvm_xdg_output_types + 0 }, +}; + +static const struct wl_message zxdg_output_v1_events[] = +{ + { "logical_position", "ii", kvm_xdg_output_types + 0 }, + { "logical_size", "ii", kvm_xdg_output_types + 0 }, + { "done", "", kvm_xdg_output_types + 0 }, + { "name", "2s", kvm_xdg_output_types + 0 }, + { "description", "2s", kvm_xdg_output_types + 0 }, +}; + +static const struct wl_interface zxdg_output_v1_interface = +{ + "zxdg_output_v1", 3, + 1, zxdg_output_v1_requests, + 5, zxdg_output_v1_events, +}; + +static struct zxdg_output_v1 *zxdg_output_manager_v1_get_xdg_output(struct zxdg_output_manager_v1 *manager, struct wl_output *output) +{ + union wl_argument args[2]; + args[0].o = NULL; + args[1].o = (struct wl_object *)output; + return (struct zxdg_output_v1 *)wl_proxy_marshal_array_constructor((struct wl_proxy *)manager, + 1 /*get_xdg_output*/, args, &zxdg_output_v1_interface); +} + +static void zxdg_output_manager_v1_destroy(struct zxdg_output_manager_v1 *manager) +{ + wl_proxy_marshal_array((struct wl_proxy *)manager, 0 /*destroy*/, NULL); + wl_proxy_destroy((struct wl_proxy *)manager); +} + +static int zxdg_output_v1_add_listener(struct zxdg_output_v1 *output, const struct zxdg_output_v1_listener *listener, void *data) +{ + return wl_proxy_add_listener((struct wl_proxy *)output, (void (**)(void))listener, data); +} + +static void zxdg_output_v1_destroy(struct zxdg_output_v1 *output) +{ + wl_proxy_marshal_array((struct wl_proxy *)output, 0 /*destroy*/, NULL); + wl_proxy_destroy((struct wl_proxy *)output); +} + +typedef struct kvm_drm_wayland_output +{ + struct wl_output *wl_output; + struct zxdg_output_v1 *xdg_output; + uint32_t global_name; + uint32_t version; + char name[64]; + int have_name; + int have_position; + int have_size; + int x; + int y; + uint32_t width; + uint32_t height; + int32_t transform; // WL_OUTPUT_TRANSFORM_* from wl_output.geometry + // Core-protocol fallback data for compositors without zxdg_output_manager_v1 (minimal greeter + // compositors): geometry position + current mode size describe the compositor space at scale 1. + int geom_x; + int geom_y; + int have_geometry; + uint32_t mode_width; + uint32_t mode_height; + int have_mode; +} kvm_drm_wayland_output; + +typedef struct kvm_drm_wayland_layout_context +{ + struct wl_display *display; + struct wl_registry *registry; + struct zxdg_output_manager_v1 *xdg_output_manager; + kvm_drm_wayland_output outputs[KVM_DRM_MAX_OUTPUTS]; + int output_count; +} kvm_drm_wayland_layout_context; + +static void kvm_drm_wl_output_geometry(void *data, struct wl_output *wl_output, int32_t x, int32_t y, int32_t physical_width, int32_t physical_height, int32_t subpixel, const char *make, const char *model, int32_t transform) +{ + kvm_drm_wayland_output *output = (kvm_drm_wayland_output *)data; + (void)wl_output; (void)physical_width; (void)physical_height; (void)subpixel; (void)make; (void)model; + if (output != NULL) + { + output->transform = transform; + output->geom_x = x; + output->geom_y = y; + output->have_geometry = 1; + } +} + +static void kvm_drm_wl_output_mode(void *data, struct wl_output *wl_output, uint32_t flags, int32_t width, int32_t height, int32_t refresh) +{ + kvm_drm_wayland_output *output = (kvm_drm_wayland_output *)data; + (void)wl_output; (void)refresh; + if (output != NULL && (flags & WL_OUTPUT_MODE_CURRENT) != 0 && width > 0 && height > 0) + { + output->mode_width = (uint32_t)width; + output->mode_height = (uint32_t)height; + output->have_mode = 1; + } +} + +static void kvm_drm_wl_output_done(void *data, struct wl_output *wl_output) +{ + (void)data; (void)wl_output; +} + +static void kvm_drm_wl_output_scale(void *data, struct wl_output *wl_output, int32_t factor) +{ + (void)data; (void)wl_output; (void)factor; +} + +static void kvm_drm_wl_output_name(void *data, struct wl_output *wl_output, const char *name) +{ + kvm_drm_wayland_output *output = (kvm_drm_wayland_output *)data; + (void)wl_output; + if (output != NULL && name != NULL && output->have_name == 0) + { + snprintf(output->name, sizeof(output->name), "%s", name); + output->have_name = 1; + } +} + +static void kvm_drm_wl_output_description(void *data, struct wl_output *wl_output, const char *description) +{ + (void)data; (void)wl_output; (void)description; +} + +static const struct wl_output_listener kvm_drm_wl_output_listener = +{ + kvm_drm_wl_output_geometry, + kvm_drm_wl_output_mode, + kvm_drm_wl_output_done, + kvm_drm_wl_output_scale, + kvm_drm_wl_output_name, + kvm_drm_wl_output_description, +}; + +static void kvm_drm_xdg_output_position(void *data, struct zxdg_output_v1 *xdg_output, int32_t x, int32_t y) +{ + kvm_drm_wayland_output *output = (kvm_drm_wayland_output *)data; + (void)xdg_output; + if (output == NULL) { return; } + output->x = x; + output->y = y; + output->have_position = 1; +} + +static void kvm_drm_xdg_output_size(void *data, struct zxdg_output_v1 *xdg_output, int32_t width, int32_t height) +{ + kvm_drm_wayland_output *output = (kvm_drm_wayland_output *)data; + (void)xdg_output; + if (output == NULL || width <= 0 || height <= 0) { return; } + output->width = (uint32_t)width; + output->height = (uint32_t)height; + output->have_size = 1; +} + +static void kvm_drm_xdg_output_done(void *data, struct zxdg_output_v1 *xdg_output) +{ + (void)data; (void)xdg_output; +} + +static void kvm_drm_xdg_output_name(void *data, struct zxdg_output_v1 *xdg_output, const char *name) +{ + kvm_drm_wayland_output *output = (kvm_drm_wayland_output *)data; + (void)xdg_output; + if (output != NULL && name != NULL) + { + snprintf(output->name, sizeof(output->name), "%s", name); + output->have_name = 1; + } +} + +static void kvm_drm_xdg_output_description(void *data, struct zxdg_output_v1 *xdg_output, const char *description) +{ + (void)data; (void)xdg_output; (void)description; +} + +static const struct zxdg_output_v1_listener kvm_drm_xdg_output_listener = +{ + kvm_drm_xdg_output_position, + kvm_drm_xdg_output_size, + kvm_drm_xdg_output_done, + kvm_drm_xdg_output_name, + kvm_drm_xdg_output_description, +}; + +static void kvm_drm_registry_global(void *data, struct wl_registry *registry, uint32_t name, const char *interface, uint32_t version) +{ + kvm_drm_wayland_layout_context *ctx = (kvm_drm_wayland_layout_context *)data; + if (ctx == NULL || interface == NULL) { return; } + + if (strcmp(interface, "wl_output") == 0) + { + kvm_drm_wayland_output *output; + uint32_t bind_version; + if (ctx->output_count >= KVM_DRM_MAX_OUTPUTS) { return; } + output = &ctx->outputs[ctx->output_count++]; + memset(output, 0, sizeof(*output)); + output->global_name = name; + output->version = version; + // Cap at v4 (name event); never bind above what the compositor advertises. + bind_version = version >= 4 ? 4 : version; + output->wl_output = (struct wl_output *)kvm_wl_registry_bind(registry, name, p_wl_output_interface, bind_version); + if (output->wl_output != NULL) + { + kvm_wl_output_add_listener(output->wl_output, &kvm_drm_wl_output_listener, output); + } + return; + } + + if (strcmp(interface, "zxdg_output_manager_v1") == 0) + { + uint32_t bind_version = version >= 3 ? 3 : version; + ctx->xdg_output_manager = (struct zxdg_output_manager_v1 *)kvm_wl_registry_bind(registry, name, &zxdg_output_manager_v1_interface, bind_version); + } +} + +static void kvm_drm_registry_global_remove(void *data, struct wl_registry *registry, uint32_t name) +{ + (void)data; (void)registry; (void)name; +} + +static const struct wl_registry_listener kvm_drm_registry_listener = +{ + kvm_drm_registry_global, + kvm_drm_registry_global_remove, +}; + +static void kvm_drm_wayland_layout_context_cleanup(kvm_drm_wayland_layout_context *ctx) +{ + int i; + if (ctx == NULL) { return; } + for (i = 0; i < ctx->output_count; ++i) + { + if (ctx->outputs[i].xdg_output != NULL) + { + zxdg_output_v1_destroy(ctx->outputs[i].xdg_output); + ctx->outputs[i].xdg_output = NULL; + } + if (ctx->outputs[i].wl_output != NULL) + { + wl_proxy_destroy((struct wl_proxy *)ctx->outputs[i].wl_output); + ctx->outputs[i].wl_output = NULL; + } + } + if (ctx->xdg_output_manager != NULL) + { + zxdg_output_manager_v1_destroy(ctx->xdg_output_manager); + ctx->xdg_output_manager = NULL; + } + if (ctx->registry != NULL) + { + wl_proxy_destroy((struct wl_proxy *)ctx->registry); + ctx->registry = NULL; + } + if (ctx->display != NULL) + { + wl_display_disconnect(ctx->display); + ctx->display = NULL; + } +} + +// Maps a wl_output transform onto the pass that brings the captured scanout buffer back into +// logical orientation. The compositor rotates the logical desktop counter-clockwise by the +// transform angle when rendering into the panel-native buffer (verified on mutter 43: with +// transform=1 the top bar lands on the buffer's left edge), so the un-rotation is the inverse, +// and kvm_drm_rotate_rgb24's ROTATION_90 pass is itself counter-clockwise — hence 1->270, 3->90. +// The flipped variants (4..7) also mirror, which kvm_drm_rotate_rgb24 can't express; use their +// rotation component so the image is at least oriented correctly. +static kvm_drm_rotation kvm_drm_rotation_from_wl_transform(int32_t transform) +{ + switch (transform & 3) + { + case 1: return KVM_DRM_ROTATION_270; + case 2: return KVM_DRM_ROTATION_180; + case 3: return KVM_DRM_ROTATION_90; + default: return KVM_DRM_ROTATION_0; + } +} + +static uint64_t kvm_drm_now_ms(); + +static void kvm_drm_on_sync_done(void *data, struct wl_callback *callback, uint32_t serial) +{ + (void)callback; (void)serial; + *(int *)data = 1; +} +static const struct wl_callback_listener kvm_drm_sync_listener = { kvm_drm_on_sync_done }; + +// Deadline-bounded wl_display_roundtrip replacement. The layout query runs on the capture thread +// (at startup and from the 1 Hz refresh); an unbounded roundtrip against a hung compositor would +// stop the master2slave input drain and re-arm the agent-wide pipe stall that kvm_drm_write_all +// exists to prevent. Returns 1 when the sync callback fired, 0 on timeout/error. +static int kvm_drm_wl_roundtrip_deadline(struct wl_display *display, uint64_t deadlineMs) +{ + union wl_argument args[1]; + struct wl_callback *cb; + int done = 0; + + args[0].o = NULL; + cb = (struct wl_callback *)wl_proxy_marshal_array_constructor((struct wl_proxy *)display, + 0 /*WL_DISPLAY_SYNC*/, args, p_wl_callback_interface); + if (cb == NULL) { return 0; } + wl_proxy_add_listener((struct wl_proxy *)cb, (void (**)(void))&kvm_drm_sync_listener, &done); + + while (!done && !g_shutdown) + { + struct pollfd pfd; + uint64_t now; + int pr; + + if (wl_display_dispatch_pending(display) < 0) { break; } + if (done) { break; } + while (wl_display_prepare_read(display) != 0) + { + if (wl_display_dispatch_pending(display) < 0) { goto out; } + } + wl_display_flush(display); + + now = kvm_drm_now_ms(); + pfd.fd = wl_display_get_fd(display); + pfd.events = POLLIN; + pfd.revents = 0; + pr = (now >= deadlineMs) ? 0 : poll(&pfd, 1, (int)(deadlineMs - now)); + if (pr <= 0) + { + int savedErrno = errno; + wl_display_cancel_read(display); + if (pr < 0 && savedErrno == EINTR && kvm_drm_now_ms() < deadlineMs) { continue; } + break; + } + if (wl_display_read_events(display) < 0) { break; } + } +out: + // Destroy before returning: the listener writes into this frame's 'done'. + wl_proxy_destroy((struct wl_proxy *)cb); + return done; +} + +#define KVM_DRM_XDG_QUERY_TIMEOUT_MS 1500 +#define KVM_DRM_XDG_BACKOFF_MS 30000 + +static bool kvm_drm_apply_xdg_output_layout(kvm_drm_output *outputs, int output_count, bool logSelection) +{ + // After a roundtrip timeout, skip the query for a while: the 1 Hz refresh must not pay the + // full timeout every second against a wedged compositor. + static uint64_t backoffUntilMs = 0; + kvm_drm_wayland_layout_context ctx; + kvm_drm_output tmp[KVM_DRM_MAX_OUTPUTS]; + bool claimed[KVM_DRM_MAX_OUTPUTS] = { false }; + uint64_t deadline; + int rtFailed = 0; + int matched = 0; + int i; + + if (outputs == NULL || output_count <= 0 || output_count > KVM_DRM_MAX_OUTPUTS) + { + return false; + } + if (backoffUntilMs != 0 && kvm_drm_now_ms() < backoffUntilMs) + { + return false; + } + + if (!kvm_drm_load_wayland()) + { + return false; // no libwayland → caller falls back to KWin/raw positions + } + + memset(&ctx, 0, sizeof(ctx)); + memcpy_s(tmp, sizeof(tmp), outputs, sizeof(kvm_drm_output) * (size_t)output_count); + + ctx.display = wl_display_connect(NULL); + if (ctx.display == NULL) + { + if (drm_debug) + { + fprintf(stderr, "DRM: xdg-output query: wl_display_connect(NULL) failed (errno=%d, WAYLAND_DISPLAY=%s, XDG_RUNTIME_DIR=%s, euid=%d)\n", + errno, + getenv("WAYLAND_DISPLAY") ? getenv("WAYLAND_DISPLAY") : "(unset)", + getenv("XDG_RUNTIME_DIR") ? getenv("XDG_RUNTIME_DIR") : "(unset)", + (int)geteuid()); + } + return false; + } + ctx.registry = kvm_wl_display_get_registry(ctx.display); + if (ctx.registry == NULL) + { + kvm_drm_wayland_layout_context_cleanup(&ctx); + return false; + } + kvm_wl_registry_add_listener(ctx.registry, &kvm_drm_registry_listener, &ctx); + deadline = kvm_drm_now_ms() + KVM_DRM_XDG_QUERY_TIMEOUT_MS; + rtFailed = !kvm_drm_wl_roundtrip_deadline(ctx.display, deadline); + if (rtFailed || ctx.output_count <= 0) + { + if (drm_debug) { fprintf(stderr, "DRM: xdg-output query: registry roundtrip failed or no wl_outputs (rtFailed=%d wl_outputs=%d)\n", rtFailed, ctx.output_count); } + if (rtFailed) { backoffUntilMs = kvm_drm_now_ms() + KVM_DRM_XDG_BACKOFF_MS; } + kvm_drm_wayland_layout_context_cleanup(&ctx); + return false; + } + if (ctx.xdg_output_manager == NULL && drm_debug) + { + fprintf(stderr, "DRM: compositor has no zxdg_output_manager_v1; using wl_output geometry fallback\n"); + } + + if (ctx.xdg_output_manager != NULL) + { + for (i = 0; i < ctx.output_count; ++i) + { + if (ctx.outputs[i].wl_output == NULL) { continue; } + ctx.outputs[i].xdg_output = zxdg_output_manager_v1_get_xdg_output(ctx.xdg_output_manager, ctx.outputs[i].wl_output); + if (ctx.outputs[i].xdg_output != NULL) + { + zxdg_output_v1_add_listener(ctx.outputs[i].xdg_output, &kvm_drm_xdg_output_listener, &ctx.outputs[i]); + } + } + } + + // Also needed without the xdg manager: the wl_output geometry/mode/name events for outputs + // bound during the registry dispatch only arrive on a further roundtrip. + for (i = 0; i < 3; ++i) + { + if (!kvm_drm_wl_roundtrip_deadline(ctx.display, deadline)) + { + backoffUntilMs = kvm_drm_now_ms() + KVM_DRM_XDG_BACKOFF_MS; + kvm_drm_wayland_layout_context_cleanup(&ctx); + return false; + } + } + backoffUntilMs = 0; + + for (i = 0; i < ctx.output_count; ++i) + { + if (drm_debug) + { + fprintf(stderr, "DRM: xdg-output query: wl-output[%d] name='%s' have_name=%d have_pos=%d(%d,%d) have_size=%d(%ux%u) geom=%d(%d,%d) mode=%d(%ux%u) transform=%d\n", + i, ctx.outputs[i].name, ctx.outputs[i].have_name, ctx.outputs[i].have_position, + ctx.outputs[i].x, ctx.outputs[i].y, ctx.outputs[i].have_size, ctx.outputs[i].width, ctx.outputs[i].height, + ctx.outputs[i].have_geometry, ctx.outputs[i].geom_x, ctx.outputs[i].geom_y, + ctx.outputs[i].have_mode, ctx.outputs[i].mode_width, ctx.outputs[i].mode_height, + ctx.outputs[i].transform); + } + if (ctx.xdg_output_manager != NULL) + { + if (ctx.outputs[i].have_name == 0 || ctx.outputs[i].have_position == 0 || ctx.outputs[i].have_size == 0) + { + continue; + } + kvm_drm_apply_kwin_screen(tmp, output_count, ctx.outputs[i].name, 1, ctx.outputs[i].x, ctx.outputs[i].y, ctx.outputs[i].width, ctx.outputs[i].height, + kvm_drm_rotation_from_wl_transform(ctx.outputs[i].transform), &matched, claimed); + } + else if (ctx.outputs[i].have_geometry && ctx.outputs[i].have_mode) + { + // No xdg-output: geometry position + current-mode size describe the compositor space at + // scale 1 (greeters). A 90/270 transform swaps the output's extent in compositor space, + // which the panel-native mode size does not reflect. + uint32_t fw = ctx.outputs[i].mode_width; + uint32_t fh = ctx.outputs[i].mode_height; + if ((ctx.outputs[i].transform & 1) != 0) { uint32_t t = fw; fw = fh; fh = t; } + if (ctx.outputs[i].have_name) + { + kvm_drm_apply_kwin_screen(tmp, output_count, ctx.outputs[i].name, 1, + ctx.outputs[i].geom_x, ctx.outputs[i].geom_y, fw, fh, + kvm_drm_rotation_from_wl_transform(ctx.outputs[i].transform), &matched, claimed); + } + else if (ctx.output_count == 1 && output_count == 1 && !claimed[0]) + { + // wl_output v3 and older has no name event; with one output on both sides the + // pairing is unambiguous anyway. + tmp[0].x = ctx.outputs[i].geom_x; + tmp[0].y = ctx.outputs[i].geom_y; + tmp[0].width = fw; + tmp[0].height = fh; + tmp[0].rotation = kvm_drm_rotation_from_wl_transform(ctx.outputs[i].transform); + claimed[0] = true; + matched++; + } + } + } + + if (matched != output_count) + { + if (drm_debug) { fprintf(stderr, "DRM: xdg-output query: matched %d of %d DRM output(s) by name -> discarding xdg layout\n", matched, output_count); } + kvm_drm_wayland_layout_context_cleanup(&ctx); + return false; + } + + memcpy_s(outputs, sizeof(kvm_drm_output) * (size_t)output_count, tmp, sizeof(kvm_drm_output) * (size_t)output_count); + qsort(outputs, (size_t)output_count, sizeof(kvm_drm_output), kvm_drm_compare_outputs); + if (drm_debug && logSelection) + { + fprintf(stderr, "DRM: Using Wayland xdg-output logical layout\n"); + for (i = 0; i < output_count; ++i) + { + fprintf(stderr, "DRM: xdg-output[%d] %s pos=%d,%d size=%ux%u rotation=%s\n", + i, outputs[i].connector_name, outputs[i].x, outputs[i].y, outputs[i].width, outputs[i].height, + kvm_drm_rotation_name(outputs[i].rotation)); + } + } + + kvm_drm_wayland_layout_context_cleanup(&ctx); + return true; +} + +static bool kvm_drm_apply_kwin_layout(kvm_drm_output *outputs, int output_count, bool logSelection) +{ + FILE *pipe; + char line[256]; + kvm_drm_output tmp[KVM_DRM_MAX_OUTPUTS]; + bool claimed[KVM_DRM_MAX_OUTPUTS] = { false }; + int in_screens = 0; + int have_screen = 0; + char name[32]; + int enabled = -1; + int x = 0; + int y = 0; + uint32_t width = 0; + uint32_t height = 0; + int matched = 0; + int i; + + if (outputs == NULL || output_count <= 0 || output_count > KVM_DRM_MAX_OUTPUTS) + { + return false; + } + + memcpy_s(tmp, sizeof(tmp), outputs, sizeof(kvm_drm_output) * (size_t)output_count); + memset(name, 0, sizeof(name)); + + pipe = popen("(qdbus6 org.kde.KWin /KWin org.kde.KWin.supportInformation 2>/dev/null || qdbus org.kde.KWin /KWin org.kde.KWin.supportInformation 2>/dev/null)", "r"); + if (pipe == NULL) + { + return false; + } + + while (fgets(line, sizeof(line), pipe) != NULL) + { + if (!in_screens) + { + if (strncmp(line, "Screens", 7) == 0) + { + in_screens = 1; + } + continue; + } + if (strncmp(line, "Compositing", 11) == 0) + { + break; + } + if (strncmp(line, "Screen ", 7) == 0) + { + if (have_screen) + { + // supportInformation exposes no transform; a rotated output keeps rotation 0 here. + kvm_drm_apply_kwin_screen(tmp, output_count, name, enabled, x, y, width, height, KVM_DRM_ROTATION_0, &matched, claimed); + } + have_screen = 1; + name[0] = 0; + enabled = -1; + x = y = 0; + width = height = 0; + continue; + } + if (!have_screen) + { + continue; + } + if (sscanf(line, "Name: %31s", name) == 1) + { + continue; + } + if (sscanf(line, "Enabled: %d", &enabled) == 1) + { + continue; + } + if (sscanf(line, "Geometry: %d,%d,%ux%u", &x, &y, &width, &height) == 4) + { + continue; + } + } + if (have_screen) + { + kvm_drm_apply_kwin_screen(tmp, output_count, name, enabled, x, y, width, height, KVM_DRM_ROTATION_0, &matched, claimed); + } + pclose(pipe); + + if (matched != output_count) + { + return false; + } + + memcpy_s(outputs, sizeof(kvm_drm_output) * (size_t)output_count, tmp, sizeof(kvm_drm_output) * (size_t)output_count); + qsort(outputs, (size_t)output_count, sizeof(kvm_drm_output), kvm_drm_compare_outputs); + if (drm_debug && logSelection) + { + fprintf(stderr, "DRM: Using KWin logical output layout\n"); + for (i = 0; i < output_count; ++i) + { + fprintf(stderr, "DRM: kwin[%d] %s pos=%d,%d size=%ux%u\n", + i, outputs[i].connector_name, outputs[i].x, outputs[i].y, outputs[i].width, outputs[i].height); + } + } + return true; +} + +// A socket FILE existing does not mean a compositor is behind it: a crashed/previous session can +// leave a stale wayland-0 while the live one listens on wayland-1. Only a successful connect() is +// proof of life. +static int kvm_drm_wayland_socket_alive(const char *runtimeDir, const char *name) +{ + struct sockaddr_un addr; + int fd, r, len; + + memset(&addr, 0, sizeof(addr)); + addr.sun_family = AF_UNIX; + len = snprintf(addr.sun_path, sizeof(addr.sun_path), "%s/%s", runtimeDir, name); + if (len <= 0 || len >= (int)sizeof(addr.sun_path)) { return 0; } + if ((fd = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0)) < 0) { return 0; } + r = connect(fd, (struct sockaddr *)&addr, sizeof(addr)); + close(fd); + return r == 0 ? 1 : 0; +} + +static void kvm_drm_prepare_session_environment(int sessionUid) +{ + char runtimeDir[64]; + char busAddress[96]; + char *envDisplay; + DIR *dir = NULL; + struct dirent *ent = NULL; + if (sessionUid <= 0) + { + return; + } + snprintf(runtimeDir, sizeof(runtimeDir), "/run/user/%d", sessionUid); + snprintf(busAddress, sizeof(busAddress), "unix:path=/run/user/%d/bus", sessionUid); + // Override, don't fill in: inherited values describe the PARENT's session, never the captured + // one — under sudo, Fedora's pam session exports root's XDG_RUNTIME_DIR=/run/user/0, which sent + // every wl_display_connect into root's 0700 runtime dir (EACCES) while the socket scan below, + // using the constructed path, found the right socket. Keep inherited values only for exotic + // setups where the session has no /run/user/ at all. + if (access(runtimeDir, F_OK) == 0) + { + setenv("XDG_RUNTIME_DIR", runtimeDir, 1); + setenv("DBUS_SESSION_BUS_ADDRESS", busAddress, 1); + } + else + { + if (getenv("XDG_RUNTIME_DIR") == NULL) { setenv("XDG_RUNTIME_DIR", runtimeDir, 1); } + if (getenv("DBUS_SESSION_BUS_ADDRESS") == NULL) { setenv("DBUS_SESSION_BUS_ADDRESS", busAddress, 1); } + } + + envDisplay = getenv("WAYLAND_DISPLAY"); + if (envDisplay != NULL && kvm_drm_wayland_socket_alive(runtimeDir, envDisplay)) + { + return; + } + if (envDisplay != NULL && drm_debug) + { + fprintf(stderr, "DRM: WAYLAND_DISPLAY=%s does not accept connections in %s; scanning for a live socket\n", envDisplay, runtimeDir); + } + dir = opendir(runtimeDir); + if (dir != NULL) + { + while ((ent = readdir(dir)) != NULL) + { + if (strncmp(ent->d_name, "wayland-", 8) == 0 && strstr(ent->d_name, ".lock") == NULL && + kvm_drm_wayland_socket_alive(runtimeDir, ent->d_name)) + { + if (drm_debug) { fprintf(stderr, "DRM: using live Wayland socket %s/%s\n", runtimeDir, ent->d_name); } + setenv("WAYLAND_DISPLAY", ent->d_name, 1); + break; + } + } + closedir(dir); + } +} + +static void kvm_drm_copy_frame_to_desktop(const unsigned char *src, uint32_t src_width, uint32_t src_height, unsigned char *dst, uint32_t dst_width, uint32_t dst_height, int dst_x, int dst_y, uint32_t output_width, uint32_t output_height) +{ + uint32_t y; + if (src == NULL || dst == NULL || src_width == 0 || src_height == 0 || dst_width == 0 || dst_height == 0 || output_width == 0 || output_height == 0) + { + return; + } + + if (src_width == output_width && src_height == output_height) + { + for (y = 0; y < src_height; ++y) + { + int target_y = dst_y + (int)y; + if (target_y < 0 || target_y >= (int)dst_height) + { + continue; + } + + int copy_x = dst_x; + uint32_t src_x = 0; + uint32_t copy_width = src_width; + if (copy_x < 0) + { + src_x = (uint32_t)(-copy_x); + if (src_x >= copy_width) { continue; } + copy_width -= src_x; + copy_x = 0; + } + if (copy_x >= (int)dst_width) + { + continue; + } + if (copy_width > dst_width - (uint32_t)copy_x) + { + copy_width = dst_width - (uint32_t)copy_x; + } + + memcpy_s(dst + ((((size_t)target_y * (size_t)dst_width) + (size_t)copy_x) * 3u), + ((size_t)(dst_width - (uint32_t)copy_x)) * 3u, + src + ((((size_t)y * (size_t)src_width) + (size_t)src_x) * 3u), + ((size_t)copy_width) * 3u); + } + return; + } + + for (y = 0; y < output_height; ++y) + { + int target_y = dst_y + (int)y; + if (target_y < 0 || target_y >= (int)dst_height) + { + continue; + } + + uint32_t x; + uint32_t src_y = (uint32_t)(((uint64_t)y * (uint64_t)src_height) / (uint64_t)output_height); + for (x = 0; x < output_width; ++x) + { + int target_x = dst_x + (int)x; + if (target_x < 0 || target_x >= (int)dst_width) + { + continue; + } + uint32_t src_x = (uint32_t)(((uint64_t)x * (uint64_t)src_width) / (uint64_t)output_width); + const unsigned char *s = src + ((((size_t)src_y * (size_t)src_width) + (size_t)src_x) * 3u); + unsigned char *d = dst + ((((size_t)target_y * (size_t)dst_width) + (size_t)target_x) * 3u); + d[0] = s[0]; + d[1] = s[1]; + d[2] = s[2]; + } + } +} + +static uint64_t kvm_drm_now_ms() +{ + struct timespec tsNow; + if (clock_gettime(CLOCK_MONOTONIC, &tsNow) != 0) + { + return 0; + } + return (((uint64_t)tsNow.tv_sec) * 1000ULL) + (((uint64_t)tsNow.tv_nsec) / 1000000ULL); +} + +// MESH_KVM_DRM_DUMP= writes the composed desktop as a PPM (P6) about every 2 seconds, so +// orientation/layout problems can be inspected without a viewer attached. +static void kvm_drm_debug_dump_frame(const unsigned char *rgb, uint32_t width, uint32_t height) +{ + static const char *path = NULL; + static int initialized = 0; + static uint64_t lastDumpMs = 0; + char tmpPath[512]; + uint64_t nowMs; + int fd; + FILE *f; + + if (!initialized) + { + path = getenv("MESH_KVM_DRM_DUMP"); + if (path != NULL && path[0] == 0) { path = NULL; } + initialized = 1; + } + if (path == NULL || rgb == NULL || width == 0 || height == 0) + { + return; + } + nowMs = kvm_drm_now_ms(); + if (lastDumpMs != 0 && nowMs - lastDumpMs < 2000) + { + return; + } + lastDumpMs = nowMs; + + if (snprintf(tmpPath, sizeof(tmpPath), "%s.tmp", path) >= (int)sizeof(tmpPath)) + { + return; + } + fd = open(tmpPath, O_WRONLY | O_CREAT | O_TRUNC | O_NOFOLLOW | O_CLOEXEC, 0600); + if (fd < 0) + { + return; + } + f = fdopen(fd, "wb"); + if (f == NULL) + { + close(fd); + return; + } + fprintf(f, "P6\n%u %u\n255\n", width, height); + fwrite(rgb, 1, (size_t)width * (size_t)height * 3u, f); + fclose(f); + ignore_result(rename(tmpPath, path)); +} + +// How long scanout must stay unavailable before we treat it as a real session teardown rather than +// a momentary display sleep. The child freezes the last frame (no error to the viewer) during this +// window, then exits so the root parent can re-fork against the current session. +#define KVM_DRM_SESSION_LOST_GRACE_MS 3000 + +// True while the captured session's XDG runtime dir still exists. On logout/user-switch systemd +// tears down /run/user/ entirely, so its disappearance is our definitive "this session ended" +// signal. A display merely in DPMS sleep keeps its runtime dir, so we do not mistake sleep for +// logout. For uid<=0 (greeter/root/unknown) we can't use this signal, so report "present". +static int kvm_drm_session_runtime_present(int sessionUid) +{ + char path[64]; + if (sessionUid <= 0) { return 1; } + if (snprintf(path, sizeof(path), "/run/user/%d", sessionUid) <= 0) { return 1; } + return access(path, F_OK) == 0 ? 1 : 0; +} + +static int kvm_drm_set_only_sys_admin_cap() +{ + struct __user_cap_header_struct header; + struct __user_cap_data_struct data[2]; + int cap = CAP_SYS_ADMIN; + + memset(&header, 0, sizeof(header)); + memset(data, 0, sizeof(data)); + + header.version = _LINUX_CAPABILITY_VERSION_3; + header.pid = 0; + + data[cap / 32].permitted = (1u << (cap % 32)); + data[cap / 32].effective = (1u << (cap % 32)); + data[cap / 32].inheritable = 0; + + return syscall(SYS_capset, &header, data); +} + +// After the setuid below we lose CAP_DAC_OVERRIDE, so opening /dev/dri/* (root:video/root:render, 0660) needs real +// group membership. libEGL opens those nodes itself, so add the groups now (root-only) or GPU capture comes out black. +static void kvm_drm_add_dri_supplementary_groups(void) +{ + static const char *names[] = { "video", "render" }; + long maxGroups = sysconf(_SC_NGROUPS_MAX); + gid_t *groups; + int count; + int changed = 0; + size_t ni; + + if (maxGroups < 0 || maxGroups > 65536) { maxGroups = 65536; } + groups = (gid_t *)malloc(sizeof(gid_t) * (size_t)(maxGroups + (long)(sizeof(names) / sizeof(names[0])))); + if (groups == NULL) { return; } + + count = getgroups((int)maxGroups, groups); + if (count < 0) { count = 0; } + + for (ni = 0; ni < sizeof(names) / sizeof(names[0]); ++ni) + { + struct group *gr = getgrnam(names[ni]); + int present = 0, k; + if (gr == NULL) { continue; } + for (k = 0; k < count; ++k) { if (groups[k] == gr->gr_gid) { present = 1; break; } } + if (!present) { groups[count++] = gr->gr_gid; changed = 1; } + } + + if (changed) { ignore_result(setgroups((size_t)count, groups)); } + free(groups); +} + +// Dropping caps with our DRM screen capture method requires more work than a simple setuid, because we need to +// retain CAP_SYS_ADMIN in order to scrape the screen. +static int kvm_drm_drop_to_session_uid_with_caps(int sessionUid, char *err, size_t errLen) +{ + struct passwd *pw = NULL; + uid_t targetUid = (uid_t)sessionUid; + uid_t currentUid = getuid(); + uid_t currentEuid = geteuid(); + + if (sessionUid == 0) { return 0; } + if (sessionUid < 0) + { + snprintf(err, errLen, "Invalid target uid: %d", sessionUid); + return -1; + } + if (targetUid == currentUid && currentEuid != 0) + { + // If we are already the requested user (eg, started directly from a shell), don't call + // initgroups()/setgid()/setuid() as those are root-only. Best-effort trim to CAP_SYS_ADMIN. + if (kvm_drm_set_only_sys_admin_cap() != 0) + { + snprintf(err, errLen, "capset(CAP_SYS_ADMIN) warning (errno=%d)", errno); + } + return 0; + } + if (currentEuid != 0) + { + snprintf(err, errLen, "Need root to switch to uid %d from uid %d", sessionUid, (int)currentUid); + return -1; + } + + pw = getpwuid(targetUid); + if (pw == NULL) + { + snprintf(err, errLen, "Unable to resolve passwd entry for uid %d (errno=%d)", sessionUid, errno); + return -1; + } + + if (prctl(PR_SET_KEEPCAPS, 1L, 0L, 0L, 0L) != 0) + { + snprintf(err, errLen, "PR_SET_KEEPCAPS failed (errno=%d)", errno); + return -1; + } + if (initgroups(pw->pw_name, pw->pw_gid) != 0) + { + snprintf(err, errLen, "initgroups(%s,%d) failed (errno=%d)", pw->pw_name, (int)pw->pw_gid, errno); + return -1; + } + kvm_drm_add_dri_supplementary_groups(); // initgroups() replaced our set with the user's; re-add video/render for DRI access + if (setgid(pw->pw_gid) != 0) + { + snprintf(err, errLen, "setgid(%d) failed (errno=%d)", (int)pw->pw_gid, errno); + return -1; + } + if (setuid(targetUid) != 0) + { + snprintf(err, errLen, "setuid(%d) failed (errno=%d)", sessionUid, errno); + return -1; + } + if (kvm_drm_set_only_sys_admin_cap() != 0) + { + snprintf(err, errLen, "capset(CAP_SYS_ADMIN) failed (errno=%d)", errno); + return -1; + } + + ignore_result(prctl(PR_SET_KEEPCAPS, 0L, 0L, 0L, 0L)); + // HOME is inherited from the root service; point it at the session user so Mesa's shader + // cache works instead of warning about /root ("Failed to create /root/.cache ... denied"). + if (pw->pw_dir != NULL && pw->pw_dir[0] != 0) { setenv("HOME", pw->pw_dir, 1); } + return 0; +} + +#endif + +void *kvm_server_mainloop_drm(void *parm) +{ + int sessionUid = (int)(intptr_t)parm; + ssize_t cbBytesRead = 0; + int r = 0; + struct sigaction action; + int displayListSent = 0; + uint64_t lastFrameTimeMs = 0; + int lastCaptureError = 0; + int scanoutSuspended = 0; + int forceTileReset = 0; + uint64_t captureLostSinceMs = 0; // when scanout first went unavailable (0 = capturing normally) + int reportedScreenWidth = 0; + int reportedScreenHeight = 0; + int reportedScreenSel = -1; + uint64_t lastOutputRefreshMs = 0; + uint64_t lastRefreshFailureLogMs = 0; + int consoleUidMismatch = 0; + char lastRefreshFailure[KVM_DRM_MAX_ERROR]; + + kvm_drm_init_debug(); + g_kvmBackendDRM = 1; + { + // Trust logind's notion of the console over the uid the master derived. The master passes + // uid 0 at a display-manager greeter (consoleUid() only reports sessions at or above the + // login uid floor), and right after a logout it can still see the dying user session and + // pass THAT uid — either way this child would point at a runtime dir with no compositor, + // so the logical-layout and keymap queries fail: monitors pile up at 0,0 and unicode input + // turns ASCII-only. When logind cannot answer, keep whatever the master passed. + int derivedUid = kvm_wayland_active_console_uid(); + if (derivedUid > 0 && derivedUid != sessionUid) + { + if (drm_debug) { fprintf(stderr, "DRM: using logind seat0 active uid %d (master passed %d)\n", derivedUid, sessionUid); } + sessionUid = derivedUid; + } + } + // Non-blocking for the slave's lifetime: kvm_drm_write_all() relies on it to multiplex tile + // writes against master2slave input drains, and every sender routes through there in DRM mode. + fcntl(slave2master[1], F_SETFL, fcntl(slave2master[1], F_GETFL, 0) | O_NONBLOCK); + g_enableEvents = kvm_events_evdev_init(); + if (!g_enableEvents) + { + kvm_send_error("evdev input injection unavailable"); + } + else + { + // Initial lock state for the viewer indicator (the X11 path does this in kvm_init). The + // compositor pushed the current LED state while evdev init's post-create settle ran. + char ksbuf[5]; + ((unsigned short*)ksbuf)[0] = (unsigned short)htons((unsigned short)MNG_KVM_KEYSTATE); + ((unsigned short*)ksbuf)[1] = (unsigned short)htons((unsigned short)5); + ksbuf[4] = (char)kvm_events_evdev_lock_state(); + ignore_result(kvm_drm_slave_write(ksbuf, sizeof(ksbuf))); + } + CURRENT_DISPLAY_ID = 0; + SCREEN_NUM = 0; + SCREEN_DEPTH = 24; + TILE_WIDTH = 32; + TILE_HEIGHT = 32; + COMPRESSION_RATIO = 50; + FRAME_RATE_TIMER = 33; + g_shutdown = 0; + + memset(&action, 0, sizeof(action)); + action.sa_sigaction = kvm_server_sighandler; + sigemptyset(&action.sa_mask); + action.sa_flags = SA_SIGINFO; + ignore_result(sigaction(SIGTERM, &action, NULL)); + +#if !defined(__linux__) + kvm_send_error("DRM capture backend is only supported on Linux"); + kvm_events_evdev_shutdown(); + g_enableEvents = 0; + g_kvmBackendDRM = 0; + return (void *)-1; +#else + kvm_drm_device devices[KVM_DRM_MAX_DEVICES]; + int deviceCount = 0; + char err[KVM_DRM_MAX_ERROR]; + kvm_drm_output outputs[KVM_DRM_MAX_OUTPUTS]; + int outputCount = 0; + kvm_drm_desktop_layout layout; + unsigned char *rgbBuffer = NULL; + size_t rgbBufferSize = 0; + unsigned char *rgbRotatedBuffer = NULL; + size_t rgbRotatedBufferSize = 0; + unsigned char *desktopRgbBuffer = NULL; + size_t desktopRgbBufferSize = 0; + char *desktopBuffer = NULL; + long long desktopBufferSize = 0; + uint32_t lastLoggedFbId = 0; + uint32_t lastLoggedWidth = 0; + uint32_t lastLoggedHeight = 0; + uint32_t lastLoggedPitch = 0; + uint32_t lastLoggedOffset = 0; + uint32_t lastLoggedFormat = 0; + uint32_t lastLoggedHandle = 0; + uint64_t lastLoggedModifier = UINT64_MAX; + int lastLoggedPath = -1; + int lastLoggedRotation = -1; + memset(outputs, 0, sizeof(outputs)); + memset(&layout, 0, sizeof(layout)); + memset(devices, 0, sizeof(devices)); + memset(lastRefreshFailure, 0, sizeof(lastRefreshFailure)); + + if (!kvm_drm_load_libdrm()) + { + kvm_send_error("libdrm is not installed; DRM capture backend unavailable"); + kvm_events_evdev_shutdown(); + g_enableEvents = 0; + g_kvmBackendDRM = 0; + return (void *)-1; + } + + char *explicitDevice = getenv("MESH_KVM_DRM_DEVICE"); + int haveLayout = kvm_drm_open_all_devices(explicitDevice, devices, KVM_DRM_MAX_DEVICES, &deviceCount, outputs, KVM_DRM_MAX_OUTPUTS, &outputCount, err, sizeof(err)) && + kvm_drm_compute_desktop_layout(outputs, outputCount, &layout); + if (!haveLayout) + { + // No scanout usually means the displays are in DPMS sleep; nudge them awake and retry. + uint64_t wakeStartMs = kvm_drm_now_ms(); + if (drm_debug) { fprintf(stderr, "DRM: no active scanout (%s); nudging displays awake and retrying\n", err[0] ? err : "displays asleep?"); } + while (!haveLayout && !g_shutdown && (kvm_drm_now_ms() - wakeStartMs) < KVM_DRM_DISPLAY_WAKE_TIMEOUT_MS) + { + if (g_enableEvents) { kvm_events_evdev_wake(); } + usleep(500 * 1000); + kvm_drm_close_all_devices(devices, deviceCount); + deviceCount = 0; + haveLayout = kvm_drm_open_all_devices(explicitDevice, devices, KVM_DRM_MAX_DEVICES, &deviceCount, outputs, KVM_DRM_MAX_OUTPUTS, &outputCount, err, sizeof(err)) && + kvm_drm_compute_desktop_layout(outputs, outputCount, &layout); + } + } + if (!haveLayout) + { + kvm_send_error(err[0] ? err : "Unable to compute DRM desktop layout"); + kvm_drm_close_all_devices(devices, deviceCount); + kvm_events_evdev_shutdown(); + g_enableEvents = 0; + g_kvmBackendDRM = 0; + return (void *)-1; + } + for (int di = 0; di < deviceCount; ++di) + { + if (kvm_drm_drop_master_if_held(devices[di].fd) != 0) + { + snprintf(err, sizeof(err), "drmDropMaster failed on %s (errno=%d)", devices[di].path, errno); + kvm_send_error(err); + kvm_drm_close_all_devices(devices, deviceCount); + kvm_events_evdev_shutdown(); + g_enableEvents = 0; + g_kvmBackendDRM = 0; + return (void *)-1; + } + } + + if (kvm_drm_drop_to_session_uid_with_caps(sessionUid, err, sizeof(err)) != 0) + { + fprintf(stderr, "DRM privilege setup failed: %s\n", err); + kvm_send_error(err); + kvm_drm_close_all_devices(devices, deviceCount); + kvm_events_evdev_shutdown(); + g_enableEvents = 0; + g_kvmBackendDRM = 0; + return (void *)-1; + } + kvm_drm_prepare_session_environment(sessionUid); + if (kvm_drm_apply_xdg_output_layout(outputs, outputCount, true) || kvm_drm_apply_kwin_layout(outputs, outputCount, true)) + { + if (!kvm_drm_compute_desktop_layout(outputs, outputCount, &layout)) + { + kvm_send_error("Unable to compute Wayland DRM desktop layout"); + kvm_drm_close_all_devices(devices, deviceCount); + kvm_events_evdev_shutdown(); + g_enableEvents = 0; + g_kvmBackendDRM = 0; + return (void *)-1; + } + } + kvm_drm_publish_monitor_layout(outputs, outputCount, &layout); + kvm_drm_update_tile_geometry(); + + while (!g_shutdown) + { + struct timeval tv; + fd_set readset; + fd_set errorset; + fd_set writeset; + int selectResult = 0; + + FD_ZERO(&readset); + FD_ZERO(&errorset); + FD_ZERO(&writeset); + tv.tv_sec = 0; + tv.tv_usec = 20000; + FD_SET(master2slave[0], &readset); + + selectResult = select(master2slave[0] + 1, &readset, &writeset, &errorset, &tv); + if (selectResult < 0) + { + if (errno == EINTR) + { + continue; + } + g_shutdown = 1; + break; + } + + if (selectResult > 0 && FD_ISSET(master2slave[0], &readset) && g_drmInputLen < (int)sizeof(g_drmInputBuf)) + { + cbBytesRead = read(master2slave[0], g_drmInputBuf + g_drmInputLen, sizeof(g_drmInputBuf) - (size_t)g_drmInputLen); + if (cbBytesRead <= 0) + { + g_shutdown = 1; + break; + } + g_drmInputLen += (int)cbBytesRead; + } + // Also covers input drained into the buffer while a frame write was stalled: those bytes + // don't wake select() again, so parse whenever anything is pending. + kvm_drm_process_pending_input(); + + if (change_display) + { + SCREEN_SEL = SCREEN_SEL_TARGET; + kvm_apply_monitor_selection(); + change_display = 0; + forceTileReset = 1; + displayListSent = 0; + } + + uint64_t nowMs = kvm_drm_now_ms(); + uint64_t frameInterval = FRAME_RATE_TIMER < 20 ? 20 : (uint64_t)FRAME_RATE_TIMER; + if (nowMs == 0 || (lastFrameTimeMs != 0 && nowMs - lastFrameTimeMs < frameInterval)) + { + continue; + } + lastFrameTimeMs = nowMs; + + if (g_pause || g_remotepause) + { + continue; + } + + if (lastOutputRefreshMs == 0 || nowMs - lastOutputRefreshMs >= 1000) + { + // Session handover while capture keeps working (logout -> greeter, user switch): the + // runtime-dir check in the capturedOutputs<=0 block only runs when scanout is lost, but + // DRM captures straight across a handover, so this child would stay bound to the dead + // session's uid/env forever. Exit for re-fork once logind consistently reports a + // different console owner; consecutive checks filter the flapping mid-transition. + int liveConsoleUid = kvm_wayland_active_console_uid(); + if (liveConsoleUid > 0 && liveConsoleUid != sessionUid) + { + if (++consoleUidMismatch >= 3) + { + if (drm_debug) { fprintf(stderr, "DRM: console session uid changed %d -> %d; exiting for re-fork\n", sessionUid, liveConsoleUid); } + g_shutdown = 1; + break; + } + } + else + { + consoleUidMismatch = 0; + } + kvm_drm_output refreshed[KVM_DRM_MAX_OUTPUTS]; + kvm_drm_desktop_layout refreshedLayout; + int refreshedCount = 0; + char refreshErr[KVM_DRM_MAX_ERROR]; + memset(refreshed, 0, sizeof(refreshed)); + memset(&refreshedLayout, 0, sizeof(refreshedLayout)); + if (kvm_drm_refresh_all_devices(devices, deviceCount, refreshed, KVM_DRM_MAX_OUTPUTS, &refreshedCount, refreshErr, sizeof(refreshErr))) + { + if (!kvm_drm_apply_xdg_output_layout(refreshed, refreshedCount, false)) + { + ignore_result(kvm_drm_apply_kwin_layout(refreshed, refreshedCount, false)); + } + if (kvm_drm_compute_desktop_layout(refreshed, refreshedCount, &refreshedLayout)) + { + if (refreshedCount != outputCount || + memcmp(outputs, refreshed, sizeof(kvm_drm_output) * (size_t)refreshedCount) != 0 || + memcmp(&layout, &refreshedLayout, sizeof(layout)) != 0) + { + memcpy_s(outputs, sizeof(outputs), refreshed, sizeof(kvm_drm_output) * (size_t)refreshedCount); + outputCount = refreshedCount; + layout = refreshedLayout; + kvm_drm_publish_monitor_layout(outputs, outputCount, &layout); + forceTileReset = 1; + displayListSent = 0; + // Keep each device's EGL context across a layout change (same GPU; the convert + // resizes its own readback target). Only the framebuffer maps need resetting. + for (int di = 0; di < deviceCount; ++di) + { + kvm_drm_destroy_map(&devices[di].map); + } + kvm_drm_reset_logged_scanout_state(&lastLoggedFbId, &lastLoggedWidth, &lastLoggedHeight, + &lastLoggedPitch, &lastLoggedOffset, &lastLoggedFormat, &lastLoggedHandle, + &lastLoggedModifier, &lastLoggedPath); + lastLoggedRotation = -1; + if (drm_debug) + { + fprintf(stderr, "DRM: Refreshed desktop layout: %d output(s), origin=%d,%d size=%ux%u\n", + outputCount, layout.min_x, layout.min_y, layout.width, layout.height); + } + } + lastRefreshFailure[0] = 0; + lastRefreshFailureLogMs = 0; + } + } + else if (drm_debug && !kvm_drm_is_expected_suspended_refresh_error(refreshErr) && + (lastRefreshFailure[0] == 0 || + strcmp(lastRefreshFailure, refreshErr) != 0 || + nowMs - lastRefreshFailureLogMs >= 5000)) + { + fprintf(stderr, "DRM: Output refresh failed: %s\n", refreshErr); + kvm_drm_copy_error_message(lastRefreshFailure, sizeof(lastRefreshFailure), refreshErr); + lastRefreshFailureLogMs = nowMs; + } + lastOutputRefreshMs = nowMs; + } + + size_t desktopRgbSize = (size_t)SCREEN_WIDTH * (size_t)SCREEN_HEIGHT * 3u; + if (desktopRgbBufferSize < desktopRgbSize) + { + unsigned char *tmp = (unsigned char *)realloc(desktopRgbBuffer, desktopRgbSize); + if (tmp == NULL) ILIBCRITICALEXIT(254); + desktopRgbBuffer = tmp; + desktopRgbBufferSize = desktopRgbSize; + } + memset(desktopRgbBuffer, 0, desktopRgbSize); + + int capturedOutputs = 0; + int outputIndex = 0; + for (outputIndex = 0; outputIndex < outputCount; ++outputIndex) + { + kvm_drm_scanout_frame frame; + size_t rgbSize = 0; + bool converted = false; + uint32_t effectiveWidth = 0; + uint32_t effectiveHeight = 0; + kvm_drm_device *dev = &devices[outputs[outputIndex].device_index]; + memset(&frame, 0, sizeof(frame)); + + if (!kvm_drm_get_scanout_frame(dev->fd, outputs[outputIndex].crtc_id, outputs[outputIndex].crtc_index, &frame, err, sizeof(err))) + { + // Scanout acquisition failing mid-session is the logout / display-sleep symptom. Freeze + // the last frame quietly instead of pushing a fatal error to the viewer; the grace + + // runtime-dir check in the capturedOutputs<=0 block below distinguishes a transient + // display sleep (keep waiting) from a real session teardown (exit so the parent re-forks). + if (!kvm_drm_is_transient_scanout_error(err) && drm_debug) + { + fprintf(stderr, "DRM: scanout acquisition failed (%s); suspending\n", err); + } + scanoutSuspended = 1; + forceTileReset = 1; + if (captureLostSinceMs == 0) { captureLostSinceMs = nowMs; } + continue; + } + + if (frame.handle == 0 || frame.width == 0 || frame.height == 0) + { + kvm_drm_close_frame_handles(dev->fd, &frame); + // No readable framebuffer handle: same handover/sleep symptom as above, suspend quietly. + scanoutSuspended = 1; + forceTileReset = 1; + if (captureLostSinceMs == 0) { captureLostSinceMs = nowMs; } + continue; + } + + { + // On a rotated output the compositor pre-rotates the logical desktop into the + // panel-native buffer, so undo that per output. MESH_KVM_ROTATION (already applied + // by kvm_drm_get_scanout_frame) stays a global manual override, including "0". + kvm_drm_rotation forcedRotation = KVM_DRM_ROTATION_0; + if (!kvm_drm_get_forced_rotation(&forcedRotation, 0)) + { + frame.rotation = kvm_drm_effective_output_rotation(dev->fd, &outputs[outputIndex], &frame); + } + } + + if (drm_debug >= 2 && + (frame.width != lastLoggedWidth || + frame.height != lastLoggedHeight || + frame.pitch != lastLoggedPitch || + frame.offset != lastLoggedOffset || + frame.format != lastLoggedFormat || + frame.modifier != lastLoggedModifier || + (int)frame.rotation != lastLoggedRotation)) + { + fprintf(stderr, "DRM: Output %s at %d,%d\n", outputs[outputIndex].connector_name, outputs[outputIndex].x, outputs[outputIndex].y); + kvm_drm_debug_log_scanout_frame("Using scanout framebuffer", &frame); + lastLoggedWidth = frame.width; + lastLoggedHeight = frame.height; + lastLoggedPitch = frame.pitch; + lastLoggedOffset = frame.offset; + lastLoggedFormat = frame.format; + lastLoggedModifier = frame.modifier; + lastLoggedRotation = (int)frame.rotation; + } + + rgbSize = (size_t)frame.width * (size_t)frame.height * 3u; + if (rgbBufferSize < rgbSize) + { + unsigned char *tmp = (unsigned char *)realloc(rgbBuffer, rgbSize); + if (tmp == NULL) ILIBCRITICALEXIT(254); + rgbBuffer = tmp; + rgbBufferSize = rgbSize; + } + + // Multi-plane framebuffers (CCS) must take the GPU path even if the modifier looked linear; + // the CPU readback below only understands a single contiguous plane. + if (frame.plane_count > 1 || (frame.modifier != DRM_FORMAT_MOD_INVALID && frame.modifier != DRM_FORMAT_MOD_LINEAR)) + { + if (drm_debug >= 2 && lastLoggedPath != 1) + { + fprintf(stderr, "DRM: Using GPU-assisted conversion for modifier 0x%016" PRIx64 " (%d plane(s))\n", frame.modifier, frame.plane_count); + lastLoggedPath = 1; + } + + converted = kvm_drm_egl_convert_to_rgb24_gpu(&dev->eglCtx, dev->fd, frame.width, frame.height, + frame.plane_count, frame.plane_handles, frame.plane_pitches, frame.plane_offsets, + frame.format, frame.modifier, + rgbBuffer, rgbBufferSize, &rgbSize, err, sizeof(err)); + kvm_drm_close_frame_handles(dev->fd, &frame); + } + else + { + size_t required_bytes = (size_t)frame.offset + ((size_t)frame.pitch * (size_t)frame.height); + if (!kvm_drm_map_framebuffer_handle(dev->fd, frame.handle, required_bytes, &dev->map, err, sizeof(err))) + { + kvm_drm_close_gem_handle(dev->fd, frame.handle); + // "Failed to map scanout buffer" is the classic post-logout symptom: the session's + // buffers / DRM access are gone. Suspend quietly (freeze last frame) and let the + // grace + runtime-dir check decide, rather than spamming a fatal error during handover. + scanoutSuspended = 1; + forceTileReset = 1; + if (captureLostSinceMs == 0) { captureLostSinceMs = nowMs; } + continue; + } + else + { + if (drm_debug >= 2 && lastLoggedPath != 0) + { + char format[32]; + kvm_drm_format_fourcc(format, sizeof(format), frame.format); + fprintf(stderr, "DRM: Using CPU readback conversion for format %s\n", format); + lastLoggedPath = 0; + } + + const uint8_t *src = dev->map.addr + frame.offset; + converted = kvm_drm_convert_to_rgb24(&frame, src, rgbBuffer, rgbBufferSize, &rgbSize, err, sizeof(err)); + } + } + + if (!converted) + { + if (lastCaptureError == 0) + { + kvm_send_error(err); + lastCaptureError = 1; + } + continue; + } + + const unsigned char *rgbFrame = rgbBuffer; + kvm_drm_get_rotated_dimensions(&frame, &effectiveWidth, &effectiveHeight); + if (frame.rotation != KVM_DRM_ROTATION_0) + { + if (rgbRotatedBufferSize < rgbSize) + { + unsigned char *tmp = (unsigned char *)realloc(rgbRotatedBuffer, rgbSize); + if (tmp == NULL) ILIBCRITICALEXIT(254); + rgbRotatedBuffer = tmp; + rgbRotatedBufferSize = rgbSize; + } + kvm_drm_rotate_rgb24(rgbBuffer, frame.width, frame.height, frame.rotation, rgbRotatedBuffer); + rgbFrame = rgbRotatedBuffer; + } + + kvm_drm_copy_frame_to_desktop(rgbFrame, effectiveWidth, effectiveHeight, desktopRgbBuffer, (uint32_t)SCREEN_WIDTH, (uint32_t)SCREEN_HEIGHT, + outputs[outputIndex].x - layout.min_x - CAPTURE_X, outputs[outputIndex].y - layout.min_y - CAPTURE_Y, + outputs[outputIndex].width, outputs[outputIndex].height); + capturedOutputs++; + } + + if (capturedOutputs <= 0) + { + // Scanout has been unavailable on every output for longer than the grace period. If the + // captured session's runtime dir is also gone, the user has logged out / switched away: + // exit cleanly so the (still-root) parent re-forks against the CURRENT active session uid. + // If the runtime dir is still present the display is only asleep (DPMS) — keep waiting. + if (captureLostSinceMs != 0 && + (kvm_drm_now_ms() - captureLostSinceMs) >= KVM_DRM_SESSION_LOST_GRACE_MS && + !kvm_drm_session_runtime_present(sessionUid)) + { + if (drm_debug) + { + fprintf(stderr, "DRM: session uid %d runtime dir gone; exiting for re-derive/re-fork\n", sessionUid); + } + g_shutdown = 1; // leave the loop; the parent detects the child exit and re-forks + break; + } + if (scanoutSuspended && drm_debug) + { + fprintf(stderr, "DRM: Scanout unavailable on all outputs, waiting for display resume\n"); + } + continue; + } + scanoutSuspended = 0; + lastCaptureError = 0; + captureLostSinceMs = 0; // captured a frame again; clear the session-loss grace timer + kvm_drm_debug_dump_frame(desktopRgbBuffer, (uint32_t)SCREEN_WIDTH, (uint32_t)SCREEN_HEIGHT); + + if (SCREEN_WIDTH != reportedScreenWidth || SCREEN_HEIGHT != reportedScreenHeight || SCREEN_SEL != reportedScreenSel) + { + int oldTileHeightCount = TILE_HEIGHT_COUNT; + kvm_drm_update_tile_geometry(); + kvm_send_resolution(); + kvm_send_display(); + reset_tile_info(oldTileHeightCount); + forceTileReset = 0; + reportedScreenWidth = SCREEN_WIDTH; + reportedScreenHeight = SCREEN_HEIGHT; + reportedScreenSel = SCREEN_SEL; + } + + if (!displayListSent) + { + kvm_send_display_list(); + displayListSent = 1; + } + + if (g_tileInfo == NULL) + { + reset_tile_info(0); + forceTileReset = 0; + } + else if (forceTileReset) + { + reset_tile_info(TILE_HEIGHT_COUNT); + forceTileReset = 0; + } + + if (kvm_drm_send_dirty_tiles(desktopRgbBuffer, desktopRgbSize, &desktopBuffer, &desktopBufferSize) != 0) + { + g_shutdown = 1; + } + } + + if (desktopBuffer != NULL) + { + free(desktopBuffer); + desktopBuffer = NULL; + desktopBufferSize = 0; + } + if (jpeg_buffer != NULL) + { + free(jpeg_buffer); + jpeg_buffer = NULL; + jpeg_buffer_length = 0; + } + + if (rgbBuffer != NULL) + { + free(rgbBuffer); + rgbBuffer = NULL; + } + if (rgbRotatedBuffer != NULL) + { + free(rgbRotatedBuffer); + rgbRotatedBuffer = NULL; + } + if (desktopRgbBuffer != NULL) + { + free(desktopRgbBuffer); + desktopRgbBuffer = NULL; + } + kvm_drm_close_all_devices(devices, deviceCount); + + close(slave2master[1]); + close(master2slave[0]); + slave2master[1] = 0; + master2slave[0] = 0; + + if (g_tileInfo != NULL) + { + for (r = 0; r < TILE_HEIGHT_COUNT; r++) + { + free(g_tileInfo[r]); + } + free(g_tileInfo); + g_tileInfo = NULL; + } + if (tilebuffer != NULL) + { + free(tilebuffer); + tilebuffer = NULL; + } + kvm_events_evdev_shutdown(); + g_enableEvents = 0; + g_kvmBackendDRM = 0; + + return (void *)0; +#endif +} diff --git a/meshcore/KVM/Linux/linux_kvm_drm.h b/meshcore/KVM/Linux/linux_kvm_drm.h new file mode 100644 index 000000000..950941906 --- /dev/null +++ b/meshcore/KVM/Linux/linux_kvm_drm.h @@ -0,0 +1,41 @@ +/* +Copyright 2010 - 2011 Intel Corporation + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +#ifndef LINUX_KVM_DRM_H_ +#define LINUX_KVM_DRM_H_ + +#include + +// The DRM screen capture system uses the Linux DRM (Direct Rendering Manager) subsystem to capture the screen. +// This is used when running under Wayland, as a catch-all mechanism that operates at a lower level than +// the screen compositor. + +extern int g_kvmBackendDRM; + +void* kvm_server_mainloop_drm(void* parm); + +// Deadlock-safe write of one whole message to the slave->master pipe: waits out backpressure while +// draining viewer input, instead of block-writing into a pipe the master may have paused. All +// slave-side senders must use this in DRM mode (the pipe is non-blocking for the slave's lifetime). +int kvm_drm_slave_write(const void *buffer, size_t len); + +// Reaches libdrm's drmPrimeHandleToFD via the single dlopen in linux_kvm_drm.c. +int kvm_drm_prime_handle_to_fd(int fd, unsigned int handle, unsigned int flags, int *prime_fd); + +// Render-node path for a card fd (libdrm via the same dlopen). Returns 0 if unavailable. +int kvm_drm_render_node_for_fd(int fd, char *out, size_t out_len); + +#endif diff --git a/meshcore/KVM/Linux/linux_kvm_drm_egl.c b/meshcore/KVM/Linux/linux_kvm_drm_egl.c new file mode 100644 index 000000000..f8007cee3 --- /dev/null +++ b/meshcore/KVM/Linux/linux_kvm_drm_egl.c @@ -0,0 +1,825 @@ +/* +Copyright 2010 - 2011 Intel Corporation + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +#include "linux_kvm_drm_egl.h" +#include "linux_kvm_drm.h" +#include "meshcore/meshdefines.h" +#include "microstack/ILibParsers.h" + +#include +#include +#include +#include +#include + +#if defined(__linux__) +#include +#include +#include +#include +#include +#include +#endif + +#if defined(__linux__) +#ifndef O_CLOEXEC +#define KVM_DRM_EGL_CLOEXEC 0 +#else +#define KVM_DRM_EGL_CLOEXEC O_CLOEXEC +#endif +#endif + +#if defined(__linux__) +#include + +// libEGL/libGLESv2 are dlopen'd rather than linked, so the agent runs without a GL stack. +// The *KHR/*OES extension entry points come from eglGetProcAddress, not this list. +#define KVM_DRM_EGL_SYMBOLS(_) \ + _(eglGetProcAddress) _(eglGetDisplay) _(eglGetError) _(eglInitialize) _(eglTerminate) \ + _(eglChooseConfig) _(eglCreateContext) _(eglDestroyContext) _(eglCreatePbufferSurface) \ + _(eglDestroySurface) _(eglMakeCurrent) _(eglBindAPI) _(eglQueryString) +#define KVM_DRM_GLES_SYMBOLS(_) \ + _(glActiveTexture) _(glAttachShader) _(glBindBuffer) _(glBindFramebuffer) _(glBindTexture) \ + _(glBufferData) _(glCheckFramebufferStatus) _(glCompileShader) _(glCreateProgram) _(glCreateShader) \ + _(glDeleteBuffers) _(glDeleteFramebuffers) _(glDeleteProgram) _(glDeleteShader) _(glDeleteTextures) \ + _(glDisableVertexAttribArray) _(glDrawArrays) _(glEnableVertexAttribArray) _(glFinish) \ + _(glFramebufferTexture2D) _(glGenBuffers) _(glGenFramebuffers) _(glGenTextures) _(glGetAttribLocation) \ + _(glGetError) _(glGetProgramiv) _(glGetShaderInfoLog) _(glGetShaderiv) _(glGetUniformLocation) \ + _(glLinkProgram) _(glReadPixels) _(glShaderSource) _(glTexImage2D) _(glTexParameteri) \ + _(glUniform1i) _(glUseProgram) _(glVertexAttribPointer) _(glViewport) + +#define KVM_DRM_EGL_DECL_PTR(s) static __typeof__(s) *p_##s = NULL; +KVM_DRM_EGL_SYMBOLS(KVM_DRM_EGL_DECL_PTR) +KVM_DRM_GLES_SYMBOLS(KVM_DRM_EGL_DECL_PTR) +#undef KVM_DRM_EGL_DECL_PTR + +static void *g_libEGL_handle = NULL; +static void *g_libGLES_handle = NULL; +static int kvm_drm_egl_load_libs(void) +{ + void *e, *g; + if (g_libEGL_handle != NULL && g_libGLES_handle != NULL) { return 1; } + if ((e = dlopen("libEGL.so.1", RTLD_NOW)) == NULL && (e = dlopen("libEGL.so", RTLD_NOW)) == NULL) { return 0; } + if ((g = dlopen("libGLESv2.so.2", RTLD_NOW)) == NULL && (g = dlopen("libGLESv2.so", RTLD_NOW)) == NULL) { dlclose(e); return 0; } +#define KVM_DRM_EGL_LOAD_PTR(s) p_##s = (__typeof__(p_##s))dlsym(e, #s); if (p_##s == NULL) { dlclose(e); dlclose(g); return 0; } + KVM_DRM_EGL_SYMBOLS(KVM_DRM_EGL_LOAD_PTR) +#undef KVM_DRM_EGL_LOAD_PTR +#define KVM_DRM_GLES_LOAD_PTR(s) p_##s = (__typeof__(p_##s))dlsym(g, #s); if (p_##s == NULL) { dlclose(e); dlclose(g); return 0; } + KVM_DRM_GLES_SYMBOLS(KVM_DRM_GLES_LOAD_PTR) +#undef KVM_DRM_GLES_LOAD_PTR + g_libEGL_handle = e; + g_libGLES_handle = g; + return 1; +} + +#define eglGetProcAddress p_eglGetProcAddress +#define eglGetDisplay p_eglGetDisplay +#define eglGetError p_eglGetError +#define eglInitialize p_eglInitialize +#define eglTerminate p_eglTerminate +#define eglChooseConfig p_eglChooseConfig +#define eglCreateContext p_eglCreateContext +#define eglDestroyContext p_eglDestroyContext +#define eglCreatePbufferSurface p_eglCreatePbufferSurface +#define eglDestroySurface p_eglDestroySurface +#define eglMakeCurrent p_eglMakeCurrent +#define eglBindAPI p_eglBindAPI +#define eglQueryString p_eglQueryString +#define glActiveTexture p_glActiveTexture +#define glAttachShader p_glAttachShader +#define glBindBuffer p_glBindBuffer +#define glBindFramebuffer p_glBindFramebuffer +#define glBindTexture p_glBindTexture +#define glBufferData p_glBufferData +#define glCheckFramebufferStatus p_glCheckFramebufferStatus +#define glCompileShader p_glCompileShader +#define glCreateProgram p_glCreateProgram +#define glCreateShader p_glCreateShader +#define glDeleteBuffers p_glDeleteBuffers +#define glDeleteFramebuffers p_glDeleteFramebuffers +#define glDeleteProgram p_glDeleteProgram +#define glDeleteShader p_glDeleteShader +#define glDeleteTextures p_glDeleteTextures +#define glDisableVertexAttribArray p_glDisableVertexAttribArray +#define glDrawArrays p_glDrawArrays +#define glEnableVertexAttribArray p_glEnableVertexAttribArray +#define glFinish p_glFinish +#define glFramebufferTexture2D p_glFramebufferTexture2D +#define glGenBuffers p_glGenBuffers +#define glGenFramebuffers p_glGenFramebuffers +#define glGenTextures p_glGenTextures +#define glGetAttribLocation p_glGetAttribLocation +#define glGetError p_glGetError +#define glGetProgramiv p_glGetProgramiv +#define glGetShaderInfoLog p_glGetShaderInfoLog +#define glGetShaderiv p_glGetShaderiv +#define glGetUniformLocation p_glGetUniformLocation +#define glLinkProgram p_glLinkProgram +#define glReadPixels p_glReadPixels +#define glShaderSource p_glShaderSource +#define glTexImage2D p_glTexImage2D +#define glTexParameteri p_glTexParameteri +#define glUniform1i p_glUniform1i +#define glUseProgram p_glUseProgram +#define glVertexAttribPointer p_glVertexAttribPointer +#define glViewport p_glViewport +#endif // __linux__ + +static void kvm_drm_egl_copy_error_message(char *dst, size_t dst_size, const char *src) +{ + if (dst == NULL || dst_size == 0) { return; } + if (src == NULL) + { + dst[0] = '\0'; + return; + } + + size_t n = strlen(src); + if (n >= dst_size) { n = dst_size - 1; } + memcpy(dst, src, n); + dst[n] = '\0'; +} + +#if defined(__linux__) + +static void kvm_drm_egl_format_fourcc(char *dst, size_t dst_size, uint32_t format) +{ + char code[5]; + int i; + + if (dst == NULL || dst_size == 0) + { + return; + } + + for (i = 0; i < 4; ++i) + { + unsigned char ch = (unsigned char)((format >> (i * 8)) & 0xFFu); + code[i] = (char)((ch >= 32 && ch <= 126) ? ch : '.'); + } + code[4] = '\0'; + snprintf(dst, dst_size, "%s/0x%08X", code, format); +} + +static void kvm_drm_egl_format_egl_error(char *dst, size_t dst_size, const char *prefix, EGLint err) +{ + snprintf(dst, dst_size, "%s: 0x%04x", prefix, (unsigned int)err); +} + +static const char *kvm_drm_egl_gl_error_name(GLenum err) +{ + switch (err) + { + case GL_INVALID_ENUM: + return "GL_INVALID_ENUM"; + case GL_INVALID_VALUE: + return "GL_INVALID_VALUE"; + case GL_INVALID_OPERATION: + return "GL_INVALID_OPERATION"; + case GL_INVALID_FRAMEBUFFER_OPERATION: + return "GL_INVALID_FRAMEBUFFER_OPERATION"; + case GL_OUT_OF_MEMORY: + return "GL_OUT_OF_MEMORY"; + default: + return "GL_UNKNOWN_ERROR"; + } +} + +static bool kvm_drm_egl_check_gl_error(const char *stage, char *out_error, size_t out_error_size) +{ + GLenum err = glGetError(); + if (err == GL_NO_ERROR) + { + return true; + } + + snprintf(out_error, out_error_size, "%s failed: %s (0x%04x)", + stage, + kvm_drm_egl_gl_error_name(err), + (unsigned int)err); + while (glGetError() != GL_NO_ERROR) {} + return false; +} + +static bool kvm_drm_egl_fail_with_persistent_error(kvm_drm_egl_context *g, char *out_error, size_t out_error_size, const char *msg) +{ + g->permanently_failed = true; + kvm_drm_egl_copy_error_message(g->fail_reason, sizeof(g->fail_reason), msg); + kvm_drm_egl_copy_error_message(out_error, out_error_size, msg); + return false; +} + +static GLuint kvm_drm_egl_compile_shader(GLenum type, const char *src, char *log_out, size_t log_size) +{ + GLuint shader = glCreateShader(type); + if (shader == 0) { return 0; } + + glShaderSource(shader, 1, &src, NULL); + glCompileShader(shader); + + GLint ok = GL_FALSE; + glGetShaderiv(shader, GL_COMPILE_STATUS, &ok); + if (ok != GL_TRUE) + { + if (log_out != NULL && log_size > 0) + { + GLint info_len = 0; + glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &info_len); + if (info_len > 1) + { + GLint read_len = info_len; + if ((size_t)read_len >= log_size) { read_len = (GLint)(log_size - 1); } + glGetShaderInfoLog(shader, read_len, NULL, log_out); + log_out[read_len] = '\0'; + } + else + { + kvm_drm_egl_copy_error_message(log_out, log_size, "Shader compilation failed"); + } + } + + glDeleteShader(shader); + return 0; + } + + return shader; +} + +// Pin EGL to the GPU we capture from (by DRM node) so the loader uses the vendor that can import +// its buffers (NVIDIA) instead of falling back to Mesa/swrast, which imports the tiles as black. +// Sets *out_gpu_mismatch when our GPU exists but isn't an EGL device while others are, so the caller +// fails instead of routing this card through a foreign vendor. +static EGLDisplay kvm_drm_egl_open_device_display(int drm_fd, bool *out_gpu_mismatch) +{ + PFNEGLQUERYDEVICESEXTPROC queryDevices = (PFNEGLQUERYDEVICESEXTPROC)eglGetProcAddress("eglQueryDevicesEXT"); + PFNEGLQUERYDEVICESTRINGEXTPROC queryDeviceString = (PFNEGLQUERYDEVICESTRINGEXTPROC)eglGetProcAddress("eglQueryDeviceStringEXT"); + PFNEGLGETPLATFORMDISPLAYEXTPROC getPlatformDisplay = (PFNEGLGETPLATFORMDISPLAYEXTPROC)eglGetProcAddress("eglGetPlatformDisplayEXT"); + EGLDeviceEXT devices[16]; + EGLDeviceEXT chosen = EGL_NO_DEVICE_EXT; + EGLDeviceEXT firstHardware = EGL_NO_DEVICE_EXT; + EGLint count = 0; + struct stat cardSt, renderSt; + char renderPath[64]; + int haveCard, haveRender; + int i; + + if (out_gpu_mismatch != NULL) { *out_gpu_mismatch = false; } + if (queryDevices == NULL || queryDeviceString == NULL || getPlatformDisplay == NULL) { return EGL_NO_DISPLAY; } + if (!queryDevices((EGLint)(sizeof(devices) / sizeof(devices[0])), devices, &count) || count <= 0) { return EGL_NO_DISPLAY; } + + // The capture fd is a card node; an EGL device may report only its card node (Mesa) or only its + // render node (NVIDIA), so match against either by device-number. + haveCard = (drm_fd >= 0 && fstat(drm_fd, &cardSt) == 0) ? 1 : 0; + haveRender = (drm_fd >= 0 && kvm_drm_render_node_for_fd(drm_fd, renderPath, sizeof(renderPath)) && stat(renderPath, &renderSt) == 0) ? 1 : 0; + for (i = 0; i < count; ++i) + { + const char *cardNode = queryDeviceString(devices[i], EGL_DRM_DEVICE_FILE_EXT); + const char *renderNode = queryDeviceString(devices[i], EGL_DRM_RENDER_NODE_FILE_EXT); + struct stat st; + if (cardNode == NULL && renderNode == NULL) { continue; } // software device: no DRM node + if (firstHardware == EGL_NO_DEVICE_EXT) { firstHardware = devices[i]; } + if (haveCard && cardNode != NULL && stat(cardNode, &st) == 0 && st.st_rdev == cardSt.st_rdev) { chosen = devices[i]; break; } + if (haveRender && renderNode != NULL && stat(renderNode, &st) == 0 && st.st_rdev == renderSt.st_rdev) { chosen = devices[i]; break; } + } + if (chosen == EGL_NO_DEVICE_EXT) + { + // Identified our GPU but no EGL device matched it. If another hardware EGL device exists, the + // default display would import this card's buffers through the wrong vendor (black) — flag it + // so the caller fails. Only guess firstHardware when our GPU was never identified at all. + if (haveCard || haveRender) + { + if (firstHardware != EGL_NO_DEVICE_EXT && out_gpu_mismatch != NULL) { *out_gpu_mismatch = true; } + if (getenv("MESH_KVM_DRM_DEBUG") != NULL && atoi(getenv("MESH_KVM_DRM_DEBUG")) > 0) { fprintf(stderr, "DRM EGL: no EGL device matched the capture GPU's DRM node\n"); } + return EGL_NO_DISPLAY; + } + chosen = firstHardware; + } + if (chosen == EGL_NO_DEVICE_EXT) { return EGL_NO_DISPLAY; } + return getPlatformDisplay(EGL_PLATFORM_DEVICE_EXT, chosen, NULL); +} + +static bool kvm_drm_egl_init_gpu_readback(kvm_drm_egl_context *g, int drm_fd, char *out_error, size_t out_error_size) +{ + if (g->initialized) { return true; } + if (g->permanently_failed) + { + kvm_drm_egl_copy_error_message(out_error, out_error_size, g->fail_reason); + return false; + } + + if (!kvm_drm_egl_load_libs()) + { + return kvm_drm_egl_fail_with_persistent_error(g, out_error, out_error_size, + "libEGL/libGLESv2 not installed; GPU-assisted DRM conversion unavailable"); + } + + bool gpuMismatch = false; + g->dpy = kvm_drm_egl_open_device_display(drm_fd, &gpuMismatch); + if (g->dpy == EGL_NO_DISPLAY && gpuMismatch) + { + // This card's tiled buffers would read back black through another GPU's vendor; fail cleanly + // (its outputs can't be GPU-converted) rather than corrupting a multi-GPU desktop. + return kvm_drm_egl_fail_with_persistent_error(g, out_error, out_error_size, + "capture GPU has no matching EGL device on a multi-GPU system"); + } + if (g->dpy == EGL_NO_DISPLAY) + { + PFNEGLGETPLATFORMDISPLAYEXTPROC eglGetPlatformDisplayEXTFn = + (PFNEGLGETPLATFORMDISPLAYEXTPROC)eglGetProcAddress("eglGetPlatformDisplayEXT"); + if (eglGetPlatformDisplayEXTFn != NULL) + { + g->dpy = eglGetPlatformDisplayEXTFn(EGL_PLATFORM_SURFACELESS_MESA, EGL_DEFAULT_DISPLAY, NULL); + } + } + if (g->dpy == EGL_NO_DISPLAY) + { + g->dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY); + } + if (g->dpy == EGL_NO_DISPLAY) + { + return kvm_drm_egl_fail_with_persistent_error(g, out_error, out_error_size, "Failed to acquire EGL display"); + } + + EGLint major = 0; + EGLint minor = 0; + if (!eglInitialize(g->dpy, &major, &minor)) + { + char err[KVM_DRM_EGL_MAX_ERROR]; + kvm_drm_egl_format_egl_error(err, sizeof(err), "eglInitialize failed", eglGetError()); + return kvm_drm_egl_fail_with_persistent_error(g, out_error, out_error_size, err); + } + if (getenv("MESH_KVM_DRM_DEBUG") != NULL && atoi(getenv("MESH_KVM_DRM_DEBUG")) > 0) + { + fprintf(stderr, "DRM EGL: Initialized EGL %d.%d vendor=%s version=%s\n", + (int)major, + (int)minor, + eglQueryString(g->dpy, EGL_VENDOR) != NULL ? eglQueryString(g->dpy, EGL_VENDOR) : "unknown", + eglQueryString(g->dpy, EGL_VERSION) != NULL ? eglQueryString(g->dpy, EGL_VERSION) : "unknown"); + } + + if (!eglBindAPI(EGL_OPENGL_ES_API)) + { + char err[KVM_DRM_EGL_MAX_ERROR]; + kvm_drm_egl_format_egl_error(err, sizeof(err), "eglBindAPI(EGL_OPENGL_ES_API) failed", eglGetError()); + return kvm_drm_egl_fail_with_persistent_error(g, out_error, out_error_size, err); + } + + const EGLint cfg_attribs[] = { + EGL_SURFACE_TYPE, EGL_PBUFFER_BIT, + EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, + EGL_RED_SIZE, 8, + EGL_GREEN_SIZE, 8, + EGL_BLUE_SIZE, 8, + EGL_ALPHA_SIZE, 8, + EGL_NONE + }; + EGLint num_cfg = 0; + if (!eglChooseConfig(g->dpy, cfg_attribs, &g->cfg, 1, &num_cfg) || num_cfg != 1) + { + return kvm_drm_egl_fail_with_persistent_error(g, out_error, out_error_size, "eglChooseConfig failed"); + } + + const EGLint ctx_attribs[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE }; + g->ctx = eglCreateContext(g->dpy, g->cfg, EGL_NO_CONTEXT, ctx_attribs); + if (g->ctx == EGL_NO_CONTEXT) + { + char err[KVM_DRM_EGL_MAX_ERROR]; + kvm_drm_egl_format_egl_error(err, sizeof(err), "eglCreateContext failed", eglGetError()); + return kvm_drm_egl_fail_with_persistent_error(g, out_error, out_error_size, err); + } + + const EGLint surf_attribs[] = { EGL_WIDTH, 1, EGL_HEIGHT, 1, EGL_NONE }; + g->surf = eglCreatePbufferSurface(g->dpy, g->cfg, surf_attribs); + if (g->surf == EGL_NO_SURFACE) + { + char err[KVM_DRM_EGL_MAX_ERROR]; + kvm_drm_egl_format_egl_error(err, sizeof(err), "eglCreatePbufferSurface failed", eglGetError()); + return kvm_drm_egl_fail_with_persistent_error(g, out_error, out_error_size, err); + } + g->surf_w = 1; + g->surf_h = 1; + + if (!eglMakeCurrent(g->dpy, g->surf, g->surf, g->ctx)) + { + char err[KVM_DRM_EGL_MAX_ERROR]; + kvm_drm_egl_format_egl_error(err, sizeof(err), "eglMakeCurrent failed", eglGetError()); + return kvm_drm_egl_fail_with_persistent_error(g, out_error, out_error_size, err); + } + + g->eglCreateImageKHRFn = (PFNEGLCREATEIMAGEKHRPROC)eglGetProcAddress("eglCreateImageKHR"); + g->eglDestroyImageKHRFn = (PFNEGLDESTROYIMAGEKHRPROC)eglGetProcAddress("eglDestroyImageKHR"); + g->glEGLImageTargetTexture2DOESFn = + (PFNGLEGLIMAGETARGETTEXTURE2DOESPROC)eglGetProcAddress("glEGLImageTargetTexture2DOES"); + if (g->eglCreateImageKHRFn == NULL || g->eglDestroyImageKHRFn == NULL || g->glEGLImageTargetTexture2DOESFn == NULL) + { + return kvm_drm_egl_fail_with_persistent_error(g, out_error, out_error_size, + "Missing required EGL/GLES extension entrypoints for dma-buf import"); + } + + const char *vs_src = "attribute vec2 aPos;\n" + "attribute vec2 aTex;\n" + "varying vec2 vTex;\n" + "void main(){ gl_Position=vec4(aPos,0.0,1.0); vTex=aTex; }\n"; + const char *fs_src = "precision mediump float;\n" + "varying vec2 vTex;\n" + "uniform sampler2D uTex;\n" + "void main(){ gl_FragColor = texture2D(uTex, vTex); }\n"; + + char vs_log[128] = { 0 }; + char fs_log[128] = { 0 }; + GLuint vs = kvm_drm_egl_compile_shader(GL_VERTEX_SHADER, vs_src, vs_log, sizeof(vs_log)); + GLuint fs = kvm_drm_egl_compile_shader(GL_FRAGMENT_SHADER, fs_src, fs_log, sizeof(fs_log)); + if (vs == 0 || fs == 0) + { + if (vs != 0) { glDeleteShader(vs); } + if (fs != 0) { glDeleteShader(fs); } + + char err[512] = { 0 }; + if (vs_log[0] != '\0' && fs_log[0] != '\0') + { + snprintf(err, sizeof(err), "Failed to compile GLES shaders [VS: %s] [FS: %s]", vs_log, fs_log); + } + else if (vs_log[0] != '\0') + { + snprintf(err, sizeof(err), "Failed to compile GLES shaders [VS: %s]", vs_log); + } + else if (fs_log[0] != '\0') + { + snprintf(err, sizeof(err), "Failed to compile GLES shaders [FS: %s]", fs_log); + } + else + { + kvm_drm_egl_copy_error_message(err, sizeof(err), "Failed to compile GLES shaders"); + } + + return kvm_drm_egl_fail_with_persistent_error(g, out_error, out_error_size, err); + } + + g->program = glCreateProgram(); + glAttachShader(g->program, vs); + glAttachShader(g->program, fs); + glLinkProgram(g->program); + glDeleteShader(vs); + glDeleteShader(fs); + + GLint linked = GL_FALSE; + glGetProgramiv(g->program, GL_LINK_STATUS, &linked); + if (linked != GL_TRUE) + { + return kvm_drm_egl_fail_with_persistent_error(g, out_error, out_error_size, "Failed to link GLES program"); + } + + g->attr_pos = glGetAttribLocation(g->program, "aPos"); + g->attr_tex = glGetAttribLocation(g->program, "aTex"); + g->u_tex = glGetUniformLocation(g->program, "uTex"); + if (g->attr_pos < 0 || g->attr_tex < 0 || g->u_tex < 0) + { + return kvm_drm_egl_fail_with_persistent_error(g, out_error, out_error_size, + "Failed to resolve shader attribute/uniform locations"); + } + + const GLfloat quad[] = { + -1.0f, -1.0f, 0.0f, 1.0f, + 1.0f, -1.0f, 1.0f, 1.0f, + -1.0f, 1.0f, 0.0f, 0.0f, + 1.0f, 1.0f, 1.0f, 0.0f + }; + glGenBuffers(1, &g->vbo); + glBindBuffer(GL_ARRAY_BUFFER, g->vbo); + glBufferData(GL_ARRAY_BUFFER, sizeof(quad), quad, GL_STATIC_DRAW); + + glGenFramebuffers(1, &g->fbo); + glGenTextures(1, &g->out_tex); + + g->initialized = true; + return true; +} + +static bool kvm_drm_egl_ensure_gpu_target_size(kvm_drm_egl_context *g, int width, int height, char *out_error, size_t out_error_size) +{ + if (g->surf_w == width && g->surf_h == height) { return true; } + + if (g->surf != EGL_NO_SURFACE) + { + eglDestroySurface(g->dpy, g->surf); + g->surf = EGL_NO_SURFACE; + } + + const EGLint surf_attribs[] = { EGL_WIDTH, width, EGL_HEIGHT, height, EGL_NONE }; + g->surf = eglCreatePbufferSurface(g->dpy, g->cfg, surf_attribs); + if (g->surf == EGL_NO_SURFACE) + { + char err[KVM_DRM_EGL_MAX_ERROR]; + // Also reset the cached size: a stale surf_w/h would make the next call at the old size + // short-circuit "true" with no surface at all. + g->surf_w = 0; + g->surf_h = 0; + kvm_drm_egl_format_egl_error(err, sizeof(err), "eglCreatePbufferSurface(size) failed", eglGetError()); + kvm_drm_egl_copy_error_message(out_error, out_error_size, err); + return false; + } + g->surf_w = width; + g->surf_h = height; + + if (!eglMakeCurrent(g->dpy, g->surf, g->surf, g->ctx)) + { + char err[KVM_DRM_EGL_MAX_ERROR]; + g->surf_w = 0; + g->surf_h = 0; + kvm_drm_egl_format_egl_error(err, sizeof(err), "eglMakeCurrent(size) failed", eglGetError()); + kvm_drm_egl_copy_error_message(out_error, out_error_size, err); + return false; + } + + glBindTexture(GL_TEXTURE_2D, g->out_tex); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); + + glBindFramebuffer(GL_FRAMEBUFFER, g->fbo); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, g->out_tex, 0); + if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) + { + kvm_drm_egl_copy_error_message(out_error, out_error_size, "GPU readback framebuffer is incomplete"); + return false; + } + + return true; +} + +#endif + +bool kvm_drm_egl_convert_to_rgb24_gpu(kvm_drm_egl_context *ctx, int drm_fd, uint32_t width, uint32_t height, + int plane_count, const uint32_t *plane_handles, const uint32_t *plane_pitches, const uint32_t *plane_offsets, + uint32_t format, uint64_t modifier, uint8_t *rgb, + size_t rgb_capacity, size_t *rgb_size_out, char *out_error, size_t out_error_size) +{ +#if !defined(__linux__) + UNREFERENCED_PARAMETER(ctx); + UNREFERENCED_PARAMETER(drm_fd); + UNREFERENCED_PARAMETER(width); + UNREFERENCED_PARAMETER(height); + UNREFERENCED_PARAMETER(plane_count); + UNREFERENCED_PARAMETER(plane_handles); + UNREFERENCED_PARAMETER(plane_pitches); + UNREFERENCED_PARAMETER(plane_offsets); + UNREFERENCED_PARAMETER(format); + UNREFERENCED_PARAMETER(modifier); + UNREFERENCED_PARAMETER(rgb); + UNREFERENCED_PARAMETER(rgb_capacity); + UNREFERENCED_PARAMETER(rgb_size_out); + kvm_drm_egl_copy_error_message(out_error, out_error_size, "DRM EGL GPU conversion is not supported on this platform"); + return false; +#else + if (ctx == NULL) + { + kvm_drm_egl_copy_error_message(out_error, out_error_size, "kvm_drm_egl context is null"); + return false; + } + + if (rgb_size_out != NULL) { *rgb_size_out = 0; } + + if (width == 0 || height == 0) + { + kvm_drm_egl_copy_error_message(out_error, out_error_size, "Invalid frame dimensions"); + return false; + } + if (width > (uint32_t)INT_MAX || height > (uint32_t)INT_MAX) + { + kvm_drm_egl_copy_error_message(out_error, out_error_size, "Frame dimensions are too large"); + return false; + } + + if (!kvm_drm_egl_init_gpu_readback(ctx, drm_fd, out_error, out_error_size)) { return false; } + // Each GPU has its own context; bind this one before any GL/EGL for this frame so a + // multi-GPU desktop doesn't issue card B's work against card A's still-current context. + if (!eglMakeCurrent(ctx->dpy, ctx->surf, ctx->surf, ctx->ctx)) + { + kvm_drm_egl_format_egl_error(out_error, out_error_size, "eglMakeCurrent failed", eglGetError()); + return false; + } + if (!kvm_drm_egl_ensure_gpu_target_size(ctx, (int)width, (int)height, out_error, out_error_size)) { return false; } + + static const EGLint planeFdAttr[4] = { EGL_DMA_BUF_PLANE0_FD_EXT, EGL_DMA_BUF_PLANE1_FD_EXT, EGL_DMA_BUF_PLANE2_FD_EXT, EGL_DMA_BUF_PLANE3_FD_EXT }; + static const EGLint planeOffsetAttr[4] = { EGL_DMA_BUF_PLANE0_OFFSET_EXT, EGL_DMA_BUF_PLANE1_OFFSET_EXT, EGL_DMA_BUF_PLANE2_OFFSET_EXT, EGL_DMA_BUF_PLANE3_OFFSET_EXT }; + static const EGLint planePitchAttr[4] = { EGL_DMA_BUF_PLANE0_PITCH_EXT, EGL_DMA_BUF_PLANE1_PITCH_EXT, EGL_DMA_BUF_PLANE2_PITCH_EXT, EGL_DMA_BUF_PLANE3_PITCH_EXT }; + static const EGLint planeModLoAttr[4] = { EGL_DMA_BUF_PLANE0_MODIFIER_LO_EXT, EGL_DMA_BUF_PLANE1_MODIFIER_LO_EXT, EGL_DMA_BUF_PLANE2_MODIFIER_LO_EXT, EGL_DMA_BUF_PLANE3_MODIFIER_LO_EXT }; + static const EGLint planeModHiAttr[4] = { EGL_DMA_BUF_PLANE0_MODIFIER_HI_EXT, EGL_DMA_BUF_PLANE1_MODIFIER_HI_EXT, EGL_DMA_BUF_PLANE2_MODIFIER_HI_EXT, EGL_DMA_BUF_PLANE3_MODIFIER_HI_EXT }; + + int planes = plane_count; + if (planes < 1) { planes = 1; } + if (planes > 4) { planes = 4; } + + int dmabuf_fd[4] = { -1, -1, -1, -1 }; + EGLint attrs[48]; + int a = 0; + attrs[a++] = EGL_WIDTH; + attrs[a++] = (EGLint)width; + attrs[a++] = EGL_HEIGHT; + attrs[a++] = (EGLint)height; + attrs[a++] = EGL_LINUX_DRM_FOURCC_EXT; + attrs[a++] = (EGLint)format; + for (int p = 0; p < planes; ++p) + { + // Export each plane's GEM handle to its own dma-buf fd. Render-compressed scanout (CCS) + // splits the image into a data plane + a metadata plane; every plane carries the same + // framebuffer modifier so EGL/Mesa can decompress it while sampling. + if (kvm_drm_prime_handle_to_fd(drm_fd, plane_handles[p], KVM_DRM_EGL_CLOEXEC | DRM_RDWR, &dmabuf_fd[p]) != 0 || dmabuf_fd[p] < 0) + { + char msg[KVM_DRM_EGL_MAX_ERROR]; + int q; + snprintf(msg, sizeof(msg), "drmPrimeHandleToFD failed for GPU path (plane=%d handle=%u errno=%d)", p, plane_handles[p], errno); + for (q = 0; q < p; ++q) { if (dmabuf_fd[q] >= 0) { close(dmabuf_fd[q]); } } + kvm_drm_egl_copy_error_message(out_error, out_error_size, msg); + return false; + } + attrs[a++] = planeFdAttr[p]; + attrs[a++] = dmabuf_fd[p]; + attrs[a++] = planeOffsetAttr[p]; + attrs[a++] = (EGLint)plane_offsets[p]; + attrs[a++] = planePitchAttr[p]; + attrs[a++] = (EGLint)plane_pitches[p]; + if (modifier != DRM_FORMAT_MOD_INVALID) + { + attrs[a++] = planeModLoAttr[p]; + attrs[a++] = (EGLint)(modifier & 0xFFFFFFFFu); + attrs[a++] = planeModHiAttr[p]; + attrs[a++] = (EGLint)((modifier >> 32) & 0xFFFFFFFFu); + } + } + attrs[a++] = EGL_NONE; + + EGLImageKHR image = ctx->eglCreateImageKHRFn(ctx->dpy, EGL_NO_CONTEXT, EGL_LINUX_DMA_BUF_EXT, NULL, attrs); + for (int p = 0; p < planes; ++p) { if (dmabuf_fd[p] >= 0) { close(dmabuf_fd[p]); } } + if (image == EGL_NO_IMAGE_KHR) + { + char err[KVM_DRM_EGL_MAX_ERROR]; + char formatName[32]; + kvm_drm_egl_format_fourcc(formatName, sizeof(formatName), format); + snprintf(err, sizeof(err), + "eglCreateImageKHR(dma-buf) failed for %s modifier=0x%016" PRIx64 ": 0x%04x", + formatName, + modifier, + (unsigned int)eglGetError()); + kvm_drm_egl_copy_error_message(out_error, out_error_size, err); + return false; + } + + GLuint src_tex = 0; + glGenTextures(1, &src_tex); + glBindTexture(GL_TEXTURE_2D, src_tex); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + ctx->glEGLImageTargetTexture2DOESFn(GL_TEXTURE_2D, (GLeglImageOES)image); + if (!kvm_drm_egl_check_gl_error("glEGLImageTargetTexture2DOES", out_error, out_error_size)) + { + ctx->eglDestroyImageKHRFn(ctx->dpy, image); + glDeleteTextures(1, &src_tex); + return false; + } + + glBindFramebuffer(GL_FRAMEBUFFER, ctx->fbo); + if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) + { + ctx->eglDestroyImageKHRFn(ctx->dpy, image); + glDeleteTextures(1, &src_tex); + kvm_drm_egl_copy_error_message(out_error, out_error_size, "GPU readback framebuffer became incomplete"); + return false; + } + glViewport(0, 0, (GLsizei)width, (GLsizei)height); + glUseProgram(ctx->program); + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, src_tex); + glUniform1i(ctx->u_tex, 0); + glBindBuffer(GL_ARRAY_BUFFER, ctx->vbo); + glEnableVertexAttribArray((GLuint)ctx->attr_pos); + glEnableVertexAttribArray((GLuint)ctx->attr_tex); + glVertexAttribPointer((GLuint)ctx->attr_pos, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(GLfloat), (void*)(0)); + glVertexAttribPointer((GLuint)ctx->attr_tex, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(GLfloat), (void*)(2 * sizeof(GLfloat))); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + glDisableVertexAttribArray((GLuint)ctx->attr_pos); + glDisableVertexAttribArray((GLuint)ctx->attr_tex); + glFinish(); + if (!kvm_drm_egl_check_gl_error("GPU draw/readback pass", out_error, out_error_size)) + { + ctx->eglDestroyImageKHRFn(ctx->dpy, image); + glDeleteTextures(1, &src_tex); + return false; + } + + const size_t rgba_size = (size_t)width * (size_t)height * 4u; + if (ctx->rgba_readback_cap < rgba_size) + { + uint8_t *tmp = (uint8_t*)realloc(ctx->rgba_readback, rgba_size); + if (tmp == NULL) + { + ctx->eglDestroyImageKHRFn(ctx->dpy, image); + glDeleteTextures(1, &src_tex); + kvm_drm_egl_copy_error_message(out_error, out_error_size, "Failed to allocate temporary RGBA readback buffer"); + return false; + } + ctx->rgba_readback = tmp; + ctx->rgba_readback_cap = rgba_size; + } + + glReadPixels(0, 0, (GLsizei)width, (GLsizei)height, GL_RGBA, GL_UNSIGNED_BYTE, ctx->rgba_readback); + if (!kvm_drm_egl_check_gl_error("glReadPixels", out_error, out_error_size)) + { + ctx->eglDestroyImageKHRFn(ctx->dpy, image); + glDeleteTextures(1, &src_tex); + return false; + } + + ctx->eglDestroyImageKHRFn(ctx->dpy, image); + glDeleteTextures(1, &src_tex); + + const size_t rgb_size = (size_t)width * (size_t)height * 3u; + if (rgb == NULL) + { + kvm_drm_egl_copy_error_message(out_error, out_error_size, "Output RGB pointer is null"); + return false; + } + if (rgb_capacity < rgb_size) + { + char msg[KVM_DRM_EGL_MAX_ERROR]; + snprintf(msg, sizeof(msg), "Output RGB buffer too small: need=%zu have=%zu", rgb_size, rgb_capacity); + kvm_drm_egl_copy_error_message(out_error, out_error_size, msg); + return false; + } + + for (uint32_t y = 0; y < height; ++y) + { + const uint8_t *src_row = ctx->rgba_readback + ((size_t)(height - 1u - y) * (size_t)width * 4u); + uint8_t *dst = rgb + ((size_t)y * (size_t)width * 3u); + for (uint32_t x = 0; x < width; ++x) + { + dst[0] = src_row[0]; + dst[1] = src_row[1]; + dst[2] = src_row[2]; + dst += 3; + src_row += 4; + } + } + + if (rgb_size_out != NULL) { *rgb_size_out = rgb_size; } + + return true; +#endif +} + +void kvm_drm_egl_destroy_context(kvm_drm_egl_context *ctx) +{ + if (ctx == NULL) { return; } + + free(ctx->rgba_readback); + ctx->rgba_readback = NULL; + ctx->rgba_readback_cap = 0; + +#if defined(__linux__) + // dpy is nulled on a device sharing another's EGLDisplay, so only the owner terminates it (and + // frees the GL objects, which live on dpy); bind this context first since multi-GPU teardown can + // leave another card's context current. + if (ctx->dpy != EGL_NO_DISPLAY) + { + if (ctx->ctx != EGL_NO_CONTEXT) { eglMakeCurrent(ctx->dpy, ctx->surf, ctx->surf, ctx->ctx); } + if (ctx->program != 0) { glDeleteProgram(ctx->program); ctx->program = 0; } + if (ctx->vbo != 0) { glDeleteBuffers(1, &ctx->vbo); ctx->vbo = 0; } + if (ctx->fbo != 0) { glDeleteFramebuffers(1, &ctx->fbo); ctx->fbo = 0; } + if (ctx->out_tex != 0) { glDeleteTextures(1, &ctx->out_tex); ctx->out_tex = 0; } + eglMakeCurrent(ctx->dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + if (ctx->ctx != EGL_NO_CONTEXT) { eglDestroyContext(ctx->dpy, ctx->ctx); ctx->ctx = EGL_NO_CONTEXT; } + if (ctx->surf != EGL_NO_SURFACE) { eglDestroySurface(ctx->dpy, ctx->surf); ctx->surf = EGL_NO_SURFACE; } + eglTerminate(ctx->dpy); + ctx->dpy = EGL_NO_DISPLAY; + } + + ctx->cfg = (EGLConfig)0; + ctx->surf_w = 0; + ctx->surf_h = 0; + ctx->eglCreateImageKHRFn = NULL; + ctx->eglDestroyImageKHRFn = NULL; + ctx->glEGLImageTargetTexture2DOESFn = NULL; + ctx->attr_pos = 0; + ctx->attr_tex = 0; + ctx->u_tex = 0; +#endif + + ctx->initialized = false; +} diff --git a/meshcore/KVM/Linux/linux_kvm_drm_egl.h b/meshcore/KVM/Linux/linux_kvm_drm_egl.h new file mode 100644 index 000000000..d39401f1c --- /dev/null +++ b/meshcore/KVM/Linux/linux_kvm_drm_egl.h @@ -0,0 +1,79 @@ +/* +Copyright 2010 - 2011 Intel Corporation + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +#ifndef LINUX_KVM_DRM_EGL_H_ +#define LINUX_KVM_DRM_EGL_H_ + +#include +#include +#include + +#if defined(__linux__) +#include +#include +#include +#include +#endif + +// What does this EGL code have to do with DRM screen capture? +// All we're doing here is blitting the entire screen from the GPU-native memory layout into +// a simple linear RGB buffer. At the point where we capture the frame via DRM, the memory +// can be in a GPU-native tiled memory layout. Instead of trying to cater for every possible +// GPU memory layout in present and future, we rather just use EGL to perform a full screen +// copy for us. +// This is not always required. Sometimes the DRM buffer is already in a linear format, +// in which case we skip this, and just perform pixel format conversion. + +#define KVM_DRM_EGL_MAX_ERROR 256 + +typedef struct kvm_drm_egl_context +{ + bool initialized; + bool permanently_failed; + char fail_reason[KVM_DRM_EGL_MAX_ERROR]; + +#if defined(__linux__) + EGLDisplay dpy; + EGLContext ctx; + EGLSurface surf; + EGLConfig cfg; + int surf_w; + int surf_h; + + PFNEGLCREATEIMAGEKHRPROC eglCreateImageKHRFn; + PFNEGLDESTROYIMAGEKHRPROC eglDestroyImageKHRFn; + PFNGLEGLIMAGETARGETTEXTURE2DOESPROC glEGLImageTargetTexture2DOESFn; + + GLuint program; + GLuint vbo; + GLuint fbo; + GLuint out_tex; + GLint attr_pos; + GLint attr_tex; + GLint u_tex; +#endif + + uint8_t *rgba_readback; + size_t rgba_readback_cap; +} kvm_drm_egl_context; + +bool kvm_drm_egl_convert_to_rgb24_gpu(kvm_drm_egl_context *ctx, int drm_fd, uint32_t width, uint32_t height, + int plane_count, const uint32_t *plane_handles, const uint32_t *plane_pitches, const uint32_t *plane_offsets, + uint32_t format, uint64_t modifier, uint8_t *rgb, + size_t rgb_capacity, size_t *rgb_size_out, char *out_error, size_t out_error_size); +void kvm_drm_egl_destroy_context(kvm_drm_egl_context *ctx); + +#endif diff --git a/meshcore/KVM/Linux/linux_kvm_rotated.c b/meshcore/KVM/Linux/linux_kvm_rotated.c new file mode 100644 index 000000000..71d1cb92b --- /dev/null +++ b/meshcore/KVM/Linux/linux_kvm_rotated.c @@ -0,0 +1,170 @@ +/* +Copyright 2010 - 2011 Intel Corporation + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Detecting rotation on Wayland turns out to be really platform-specific. +// I tried first reading the data via the official DRM APIs, but that didn't +// work on a Raspberry Pi or a qemu VM, so I gave up on that. It seems like +// the only practical solution is to support the various Wayland compositors, +// and read their state out directly. +// So right now the only way to get screen rotation to work on Wayland +// is to specify it via an env var, with 0,90,180,270, eg: +// For portrait-right: +// MESH_KVM_ROTATION=270 + +#include "linux_kvm_rotated.h" + +#include +#include +#include + +extern void kvm_send_error(char *msg); + +const char *kvm_drm_rotation_name(kvm_drm_rotation rotation) +{ + switch (rotation) + { + case KVM_DRM_ROTATION_90: + return "90"; + case KVM_DRM_ROTATION_180: + return "180"; + case KVM_DRM_ROTATION_270: + return "270"; + case KVM_DRM_ROTATION_0: + default: + return "0"; + } +} + +int kvm_drm_get_forced_rotation(kvm_drm_rotation *out_rotation, int log_enabled) +{ + static int initialized = 0; + static int have_forced = 0; + static kvm_drm_rotation forced_rotation = KVM_DRM_ROTATION_0; + + if (!initialized) + { + const char *value = getenv("MESH_KVM_ROTATION"); + static kvm_drm_rotation fromenv = (kvm_drm_rotation) -1; + initialized = 1; + if (value != NULL && value[0] != 0) + { + if (strcmp(value, "0") == 0) + { + fromenv = KVM_DRM_ROTATION_0; + } + else if (strcmp(value, "90") == 0) + { + fromenv = KVM_DRM_ROTATION_90; + } + else if (strcmp(value, "180") == 0) + { + fromenv = KVM_DRM_ROTATION_180; + } + else if (strcmp(value, "270") == 0) + { + fromenv = KVM_DRM_ROTATION_270; + } + + if (fromenv != (kvm_drm_rotation) -1) + { + have_forced = 1; + forced_rotation = fromenv; + if (log_enabled) + { + fprintf(stderr, "DRM: forced rotation enabled via MESH_KVM_ROTATION=%s\n", value); + } + } + else if (log_enabled) + { + fprintf(stderr, "DRM: invalid MESH_KVM_ROTATION value '%s' (expected 0/90/180/270)\n", value); + } + } + } + + if (!have_forced) + { + return 0; + } + + *out_rotation = forced_rotation; + return 1; +} + +void kvm_drm_rotate_rgb24(const uint8_t *src, uint32_t src_width, uint32_t src_height, kvm_drm_rotation rotation, uint8_t *dst) +{ + size_t src_stride = ((size_t)src_width) * 3u; + size_t dst_stride = ((size_t)((rotation == KVM_DRM_ROTATION_90 || rotation == KVM_DRM_ROTATION_270) ? src_height : src_width)) * 3u; + uint32_t x; + uint32_t y; + + if (src == NULL || dst == NULL) + { + kvm_send_error("Invalid RGB rotation buffer"); + return; + } + + switch (rotation) + { + case KVM_DRM_ROTATION_90: + for (y = 0; y < src_height; ++y) + { + const uint8_t *s = src + (((size_t)y) * src_stride); + uint8_t *d = dst + (((size_t)(src_width - 1u)) * dst_stride) + (((size_t)y) * 3u); + for (x = 0; x < src_width; ++x) + { + d[0] = s[0]; + d[1] = s[1]; + d[2] = s[2]; + s += 3; + d -= dst_stride; + } + } + break; + case KVM_DRM_ROTATION_180: + for (y = 0; y < src_height; ++y) + { + const uint8_t *s = src + (((size_t)y) * src_stride); + uint8_t *d = dst + (((size_t)(src_height - 1u - y)) * dst_stride) + (((size_t)(src_width - 1u)) * 3u); + for (x = 0; x < src_width; ++x) + { + d[0] = s[0]; + d[1] = s[1]; + d[2] = s[2]; + s += 3; + d -= 3; + } + } + break; + case KVM_DRM_ROTATION_270: + for (y = 0; y < src_height; ++y) + { + const uint8_t *s = src + (((size_t)y) * src_stride); + uint8_t *d = dst + (((size_t)(src_height - 1u - y)) * 3u); + for (x = 0; x < src_width; ++x) + { + d[0] = s[0]; + d[1] = s[1]; + d[2] = s[2]; + s += 3; + d += dst_stride; + } + } + break; + case KVM_DRM_ROTATION_0: + default: + break; + } +} diff --git a/meshcore/KVM/Linux/linux_kvm_rotated.h b/meshcore/KVM/Linux/linux_kvm_rotated.h new file mode 100644 index 000000000..a60ceff57 --- /dev/null +++ b/meshcore/KVM/Linux/linux_kvm_rotated.h @@ -0,0 +1,34 @@ +/* +Copyright 2010 - 2011 Intel Corporation + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +#ifndef LINUX_KVM_ROTATED_H_ +#define LINUX_KVM_ROTATED_H_ + +#include + +typedef enum kvm_drm_rotation +{ + KVM_DRM_ROTATION_0 = 0, + KVM_DRM_ROTATION_90 = 1, + KVM_DRM_ROTATION_180 = 2, + KVM_DRM_ROTATION_270 = 3 +} kvm_drm_rotation; + +const char *kvm_drm_rotation_name(kvm_drm_rotation rotation); +int kvm_drm_get_forced_rotation(kvm_drm_rotation *out_rotation, int log_enabled); +void kvm_drm_rotate_rgb24(const uint8_t *src, uint32_t src_width, uint32_t src_height, kvm_drm_rotation rotation, uint8_t *dst); + +#endif diff --git a/meshcore/KVM/Linux/linux_kvm_wayland.c b/meshcore/KVM/Linux/linux_kvm_wayland.c new file mode 100644 index 000000000..cb08fd53d --- /dev/null +++ b/meshcore/KVM/Linux/linux_kvm_wayland.c @@ -0,0 +1,186 @@ +/* +Copyright 2010 - 2011 Intel Corporation + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +#include "linux_kvm_wayland.h" + +#include +#include +#include +#include +#include +#include +#include + +// The "are we running under Wayland" detection is made more complicated by the fact that +// meshagent is usually running as a root daemon. If simply running in the context of a +// regular user in a desktop session, then you could just check one or two environment +// variables. + +// Once the agent has positively identified a Wayland-backed console, keep using the +// DRM/libevdev path for the remainder of the process lifetime. +// +// Without this stickyness, the following sequence ends up erroneously switching us back to X11: +// 1. Login as userX +// 2. Connect mesh remote desktop +// 3. Logout from userX (switching back to greeter) +// 4. Disconnect mesh, and reconnect mesh remote desktop. +// 5. Agent is now in X11 mode... +// The above sequence was reproducible on Ubuntu 25.10 +static int g_kvmWaylandSticky = 0; + +static int kvm_read_systemd_value(const char *path, const char *key, char *value, size_t valueLen) +{ + FILE *f = NULL; + char line[512]; + size_t keyLen = 0; + + if (path == NULL || key == NULL || value == NULL || valueLen == 0) { return 0; } + f = fopen(path, "r"); + if (f == NULL) { return 0; } + keyLen = strlen(key); + while (fgets(line, sizeof(line), f) != NULL) + { + if (strncmp(line, key, keyLen) == 0) + { + char *tmp = line + keyLen; + tmp[strcspn(tmp, "\r\n")] = 0; + snprintf(value, valueLen, "%s", tmp); + fclose(f); + return 1; + } + } + fclose(f); + return 0; +} + +static int kvm_active_seat0_session_is_wayland(void) +{ + char activeSession[64]; + char type[64]; + char seatPath[PATH_MAX]; + int len = 0; + + memset(activeSession, 0, sizeof(activeSession)); + memset(type, 0, sizeof(type)); + if (!kvm_read_systemd_value("/run/systemd/seats/seat0", "ACTIVE=", activeSession, sizeof(activeSession))) { return 0; } + if (activeSession[0] == 0) { return 0; } + + len = snprintf(seatPath, sizeof(seatPath), "/run/systemd/sessions/%s", activeSession); + if (len <= 0 || len >= (int)sizeof(seatPath)) { return 0; } + if (!kvm_read_systemd_value(seatPath, "TYPE=", type, sizeof(type))) { return 0; } + + return strcasecmp(type, "wayland") == 0 ? 1 : 0; +} + +// Uid of seat0's active logind session, greeter sessions included; -1 when unknown. The JS-side +// consoleUid() only reports sessions with uid >= the login floor, so at a display-manager greeter +// the master hands the capture child uid 0 — this recovers the real (system-uid) session owner. +int kvm_wayland_active_console_uid(void) +{ + char activeSession[64]; + char uidStr[32]; + char sessionPath[PATH_MAX]; + int len = 0; + + memset(activeSession, 0, sizeof(activeSession)); + memset(uidStr, 0, sizeof(uidStr)); + if (!kvm_read_systemd_value("/run/systemd/seats/seat0", "ACTIVE=", activeSession, sizeof(activeSession))) { return -1; } + if (activeSession[0] == 0) { return -1; } + len = snprintf(sessionPath, sizeof(sessionPath), "/run/systemd/sessions/%s", activeSession); + if (len <= 0 || len >= (int)sizeof(sessionPath)) { return -1; } + if (!kvm_read_systemd_value(sessionPath, "UID=", uidStr, sizeof(uidStr))) { return -1; } + if (uidStr[0] < '0' || uidStr[0] > '9') { return -1; } + return atoi(uidStr); +} + +static int kvm_wayland_socket_exists(const char *runtimeDir, const char *socketName) +{ + char socketPath[PATH_MAX]; + struct stat st; + int len = 0; + + if (runtimeDir == NULL || runtimeDir[0] == 0 || socketName == NULL || socketName[0] == 0) { return 0; } + len = snprintf(socketPath, sizeof(socketPath), "%s/%s", runtimeDir, socketName); + if (len <= 0 || len >= (int)sizeof(socketPath)) { return 0; } + if (stat(socketPath, &st) != 0) { return 0; } + return S_ISSOCK(st.st_mode) ? 1 : 0; +} + +int kvm_is_wayland_session_for_uid(int uid) +{ + char *sessionType = getenv("XDG_SESSION_TYPE"); + char *waylandDisplay = getenv("WAYLAND_DISPLAY"); + char *runtimeDir = getenv("XDG_RUNTIME_DIR"); + char fallbackRuntimeDir[64]; + int len = 0; + int fallbackUid = uid; + + if (fallbackUid < 0) + { + fallbackUid = (int)getuid(); + } + + if (g_kvmWaylandSticky != 0) + { + return 1; + } + + if ((sessionType != NULL && strcasecmp(sessionType, "wayland") == 0) || + (waylandDisplay != NULL && waylandDisplay[0] != 0)) + { + g_kvmWaylandSticky = 1; + return 1; + } + + if (kvm_active_seat0_session_is_wayland()) + { + g_kvmWaylandSticky = 1; + return 1; + } + + if (runtimeDir != NULL) + { + if (waylandDisplay != NULL && kvm_wayland_socket_exists(runtimeDir, waylandDisplay)) { g_kvmWaylandSticky = 1; return 1; } + if (kvm_wayland_socket_exists(runtimeDir, "wayland-0") || kvm_wayland_socket_exists(runtimeDir, "wayland-1")) { g_kvmWaylandSticky = 1; return 1; } + } + + len = snprintf(fallbackRuntimeDir, sizeof(fallbackRuntimeDir), "/run/user/%d", fallbackUid); + if (len > 0 && len < (int)sizeof(fallbackRuntimeDir)) + { + if (waylandDisplay != NULL && kvm_wayland_socket_exists(fallbackRuntimeDir, waylandDisplay)) { g_kvmWaylandSticky = 1; return 1; } + if (kvm_wayland_socket_exists(fallbackRuntimeDir, "wayland-0") || kvm_wayland_socket_exists(fallbackRuntimeDir, "wayland-1")) { g_kvmWaylandSticky = 1; return 1; } + } + + return 0; +} + +kvm_screenreader_mode_t kvm_screenreader_mode() +{ + return kvm_screenreader_mode_for_uid(-1); +} + +kvm_screenreader_mode_t kvm_screenreader_mode_for_uid(int uid) +{ + // stderr, not stdout: the service nulls stdout, and the picked backend is the first clue when a screen comes up black. + if (kvm_is_wayland_session_for_uid(uid)) + { + fprintf(stderr, "Using DRM/libevdev mode\n"); fflush(stderr); + return KVM_SCREENREADER_MODE_DRM; + } + + fprintf(stderr, "Using X11 mode\n"); fflush(stderr); + return KVM_SCREENREADER_MODE_X11; +} diff --git a/meshcore/KVM/Linux/linux_kvm_wayland.h b/meshcore/KVM/Linux/linux_kvm_wayland.h new file mode 100644 index 000000000..73f09a469 --- /dev/null +++ b/meshcore/KVM/Linux/linux_kvm_wayland.h @@ -0,0 +1,34 @@ +/* +Copyright 2010 - 2011 Intel Corporation + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +#ifndef LINUX_KVM_WAYLAND_H_ +#define LINUX_KVM_WAYLAND_H_ + +typedef enum kvm_screenreader_mode_t +{ + KVM_SCREENREADER_MODE_X11 = 0, + KVM_SCREENREADER_MODE_DRM = 1 +} kvm_screenreader_mode_t; + +kvm_screenreader_mode_t kvm_screenreader_mode(); +kvm_screenreader_mode_t kvm_screenreader_mode_for_uid(int uid); +int kvm_is_wayland_session_for_uid(int uid); + +// Uid of seat0's active logind session (greeters included); -1 when unknown. Lets the DRM capture +// child recover the session owner when the master could only pass uid 0 (display-manager greeter). +int kvm_wayland_active_console_uid(void); + +#endif diff --git a/meshcore/KVM/Linux/linux_kvm_xkb.c b/meshcore/KVM/Linux/linux_kvm_xkb.c new file mode 100644 index 000000000..f4042ed4a --- /dev/null +++ b/meshcore/KVM/Linux/linux_kvm_xkb.c @@ -0,0 +1,697 @@ +/* +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +#include "linux_kvm_xkb.h" + +#if defined(__linux__) + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +// ---- libwayland-client via dlopen (same pattern as linux_kvm_drm.c: the header's inline request +// wrappers would bake in link-time wl_proxy_* references and keep libwayland in NEEDED) ----------- + +// The array marshallers instead of wl_proxy_marshal_flags: flags only exists in libwayland >= 1.20 +// (2021), which would silently disable this whole path on Debian 11 / Ubuntu 20.04-era systems. +#define KVM_XKB_WAYLAND_SYMBOLS(_) \ + _(wl_display_connect) _(wl_display_disconnect) \ + _(wl_display_flush) _(wl_display_dispatch_pending) _(wl_display_prepare_read) \ + _(wl_display_read_events) _(wl_display_cancel_read) _(wl_display_get_error) _(wl_display_get_fd) \ + _(wl_proxy_marshal_array_constructor) _(wl_proxy_marshal_array_constructor_versioned) \ + _(wl_proxy_add_listener) _(wl_proxy_destroy) + +#define KVM_XKB_WL_DECL_PTR(s) static __typeof__(s) *x_##s = NULL; +KVM_XKB_WAYLAND_SYMBOLS(KVM_XKB_WL_DECL_PTR) +#undef KVM_XKB_WL_DECL_PTR + +static const struct wl_interface *x_wl_registry_interface = NULL; +static const struct wl_interface *x_wl_seat_interface = NULL; +static const struct wl_interface *x_wl_keyboard_interface = NULL; +static const struct wl_interface *x_wl_callback_interface = NULL; +static void *g_xkb_libwayland = NULL; + +static int kvm_xkb_load_wayland(void) +{ + void *h; + if (g_xkb_libwayland != NULL) { return 1; } + if ((h = dlopen("libwayland-client.so.0", RTLD_NOW)) == NULL && (h = dlopen("libwayland-client.so", RTLD_NOW)) == NULL) + { + return 0; + } +#define KVM_XKB_WL_LOAD_PTR(s) x_##s = (__typeof__(x_##s))dlsym(h, #s); if (x_##s == NULL) { dlclose(h); return 0; } + KVM_XKB_WAYLAND_SYMBOLS(KVM_XKB_WL_LOAD_PTR) +#undef KVM_XKB_WL_LOAD_PTR + x_wl_registry_interface = (const struct wl_interface *)dlsym(h, "wl_registry_interface"); + x_wl_seat_interface = (const struct wl_interface *)dlsym(h, "wl_seat_interface"); + x_wl_keyboard_interface = (const struct wl_interface *)dlsym(h, "wl_keyboard_interface"); + x_wl_callback_interface = (const struct wl_interface *)dlsym(h, "wl_callback_interface"); + if (x_wl_registry_interface == NULL || x_wl_seat_interface == NULL || x_wl_keyboard_interface == NULL || x_wl_callback_interface == NULL) + { + dlclose(h); + return 0; + } + g_xkb_libwayland = h; + return 1; +} + +static struct wl_registry *kvm_xkb_wl_display_get_registry(struct wl_display *display) +{ + union wl_argument args[1]; + args[0].o = NULL; + return (struct wl_registry *)x_wl_proxy_marshal_array_constructor((struct wl_proxy *)display, + 1 /*WL_DISPLAY_GET_REGISTRY*/, args, x_wl_registry_interface); +} +static void *kvm_xkb_wl_registry_bind(struct wl_registry *registry, uint32_t name, const struct wl_interface *interface, uint32_t version) +{ + union wl_argument args[4]; + args[0].u = name; + args[1].s = interface->name; + args[2].u = version; + args[3].o = NULL; + return (void *)x_wl_proxy_marshal_array_constructor_versioned((struct wl_proxy *)registry, + 0 /*WL_REGISTRY_BIND*/, args, interface, version); +} +static struct wl_keyboard *kvm_xkb_wl_seat_get_keyboard(struct wl_seat *seat) +{ + union wl_argument args[1]; + args[0].o = NULL; + return (struct wl_keyboard *)x_wl_proxy_marshal_array_constructor((struct wl_proxy *)seat, + 1 /*WL_SEAT_GET_KEYBOARD*/, args, x_wl_keyboard_interface); +} + +// ---- libxkbcommon via dlopen (hand-declared API: build hosts need no libxkbcommon-dev) ---------- + +struct xkb_context; +struct xkb_keymap; +struct xkb_state; +typedef uint32_t kvm_xkb_keycode_t; +typedef uint32_t kvm_xkb_mod_index_t; +typedef uint32_t kvm_xkb_mod_mask_t; +typedef uint32_t kvm_xkb_layout_index_t; +#define KVM_XKB_MOD_INVALID 0xFFFFFFFFu +#define KVM_XKB_KEYMAP_FORMAT_TEXT_V1 1 + +typedef struct kvm_xkb_exports +{ + struct xkb_context *(*context_new)(int flags); + void (*context_unref)(struct xkb_context *ctx); + struct xkb_keymap *(*keymap_new_from_string)(struct xkb_context *ctx, const char *str, int format, int flags); + void (*keymap_unref)(struct xkb_keymap *keymap); + kvm_xkb_keycode_t (*keymap_min_keycode)(struct xkb_keymap *keymap); + kvm_xkb_keycode_t (*keymap_max_keycode)(struct xkb_keymap *keymap); + kvm_xkb_layout_index_t (*keymap_num_layouts)(struct xkb_keymap *keymap); + kvm_xkb_mod_index_t (*keymap_mod_get_index)(struct xkb_keymap *keymap, const char *name); + struct xkb_state *(*state_new)(struct xkb_keymap *keymap); + void (*state_unref)(struct xkb_state *state); + int (*state_update_mask)(struct xkb_state *state, kvm_xkb_mod_mask_t depressed, kvm_xkb_mod_mask_t latched, kvm_xkb_mod_mask_t locked, + kvm_xkb_layout_index_t layoutDepressed, kvm_xkb_layout_index_t layoutLatched, kvm_xkb_layout_index_t layoutLocked); + uint32_t (*state_key_get_utf32)(struct xkb_state *state, kvm_xkb_keycode_t key); +} kvm_xkb_exports; + +static kvm_xkb_exports g_xkbFn; +static void *g_xkb_libxkbcommon = NULL; + +static int kvm_xkb_load_xkbcommon(void) +{ + void *h; + if (g_xkb_libxkbcommon != NULL) { return 1; } + if ((h = dlopen("libxkbcommon.so.0", RTLD_NOW)) == NULL && (h = dlopen("libxkbcommon.so", RTLD_NOW)) == NULL) + { + return 0; + } +#define KVM_XKB_LOAD(field, sym) g_xkbFn.field = (__typeof__(g_xkbFn.field))dlsym(h, sym); if (g_xkbFn.field == NULL) { dlclose(h); return 0; } + KVM_XKB_LOAD(context_new, "xkb_context_new") + KVM_XKB_LOAD(context_unref, "xkb_context_unref") + KVM_XKB_LOAD(keymap_new_from_string, "xkb_keymap_new_from_string") + KVM_XKB_LOAD(keymap_unref, "xkb_keymap_unref") + KVM_XKB_LOAD(keymap_min_keycode, "xkb_keymap_min_keycode") + KVM_XKB_LOAD(keymap_max_keycode, "xkb_keymap_max_keycode") + KVM_XKB_LOAD(keymap_num_layouts, "xkb_keymap_num_layouts") + KVM_XKB_LOAD(keymap_mod_get_index, "xkb_keymap_mod_get_index") + KVM_XKB_LOAD(state_new, "xkb_state_new") + KVM_XKB_LOAD(state_unref, "xkb_state_unref") + KVM_XKB_LOAD(state_update_mask, "xkb_state_update_mask") + KVM_XKB_LOAD(state_key_get_utf32, "xkb_state_key_get_utf32") +#undef KVM_XKB_LOAD + g_xkb_libxkbcommon = h; + return 1; +} + +// ---- reverse lookup tables ---------------------------------------------------------------------- + +typedef struct kvm_xkb_entry +{ + uint32_t codepoint; + uint16_t keycode; // evdev + uint8_t shift; + uint8_t altgr; + uint8_t group; // layout index the mapping belongs to +} kvm_xkb_entry; + +typedef struct kvm_xkb_table +{ + kvm_xkb_entry *entries; + int count; + int capacity; +} kvm_xkb_table; + +static kvm_xkb_table g_xkbCapsOff; +static kvm_xkb_table g_xkbCapsOn; +static int g_xkbTablesReady = 0; + +static struct wl_display *g_xkbDisplay = NULL; +static struct wl_registry *g_xkbRegistry = NULL; +static struct wl_seat *g_xkbSeat = NULL; +static struct wl_keyboard *g_xkbKeyboard = NULL; +static uint32_t g_xkbSeatCaps = 0; +static int g_xkbLibsUnavailable = 0; +static uint64_t g_xkbLastAttemptMs = 0; +#define KVM_XKB_RETRY_MS 10000 + +static int kvm_xkb_debug(void) +{ + static int level = -1; + if (level < 0) + { + const char *env = getenv("MESH_KVM_DRM_DEBUG"); + level = (env != NULL && *env != '\0') ? atoi(env) : 0; + if (level < 0) { level = 0; } + } + return level; +} + +static uint64_t kvm_xkb_now_ms(void) +{ + struct timespec ts; + if (clock_gettime(CLOCK_MONOTONIC, &ts) != 0) { return 0; } + return (((uint64_t)ts.tv_sec) * 1000ULL) + (((uint64_t)ts.tv_nsec) / 1000000ULL); +} + +static int kvm_xkb_table_find(const kvm_xkb_table *table, uint32_t codepoint) +{ + int lo = 0; + int hi = table->count - 1; + while (lo <= hi) + { + int mid = lo + ((hi - lo) / 2); + if (table->entries[mid].codepoint == codepoint) { return mid; } + if (table->entries[mid].codepoint < codepoint) { lo = mid + 1; } + else { hi = mid - 1; } + } + return -1; +} + +// Unsorted linear check during build; tables are sorted once at the end. One entry per +// (codepoint, group) so lookup can prefer the group the user actually has active. +static int kvm_xkb_table_contains(const kvm_xkb_table *table, uint32_t codepoint, uint8_t group) +{ + int i; + for (i = 0; i < table->count; ++i) + { + if (table->entries[i].codepoint == codepoint && table->entries[i].group == group) { return 1; } + } + return 0; +} + +static int kvm_xkb_table_add(kvm_xkb_table *table, uint32_t codepoint, uint16_t keycode, uint8_t shift, uint8_t altgr, uint8_t group) +{ + if (table->count == table->capacity) + { + int newCap = table->capacity == 0 ? 256 : table->capacity * 2; + kvm_xkb_entry *tmp = (kvm_xkb_entry *)realloc(table->entries, ((size_t)newCap) * sizeof(kvm_xkb_entry)); + if (tmp == NULL) { return 0; } + table->entries = tmp; + table->capacity = newCap; + } + table->entries[table->count].codepoint = codepoint; + table->entries[table->count].keycode = keycode; + table->entries[table->count].shift = shift; + table->entries[table->count].altgr = altgr; + table->entries[table->count].group = group; + table->count++; + return 1; +} + +static void kvm_xkb_table_reset(kvm_xkb_table *table) +{ + free(table->entries); + table->entries = NULL; + table->count = 0; + table->capacity = 0; +} + +// Order: codepoint, then modifier cost (plain before Shift before AltGr), then group — so within a +// codepoint's run, the first entry is the overall cheapest and the first entry of any group is that +// group's cheapest. +static int kvm_xkb_entry_compare(const void *a, const void *b) +{ + const kvm_xkb_entry *ea = (const kvm_xkb_entry *)a; + const kvm_xkb_entry *eb = (const kvm_xkb_entry *)b; + int costa, costb; + if (ea->codepoint < eb->codepoint) { return -1; } + if (ea->codepoint > eb->codepoint) { return 1; } + costa = (int)ea->shift + 2 * (int)ea->altgr; + costb = (int)eb->shift + 2 * (int)eb->altgr; + if (costa != costb) { return costa < costb ? -1 : 1; } + if (ea->group != eb->group) { return ea->group < eb->group ? -1 : 1; } + return 0; +} + +// Build both tables by asking libxkbcommon what every (group, modifier, caps, keycode) combination +// produces - the same computation the compositor will run against our injected events, so the +// result is exact for any script with no case-mapping heuristics. First hit wins, iterating +// modifiers before groups, so the mapping with the fewest synthesized modifiers is preferred. +// The group carrying the codepoint is assumed active: a user typing that character switched the +// remote layout to it (the codepoint is unreachable otherwise, and was dropped entirely before). +int kvm_xkb_build_from_keymap_string(const char *keymapText) +{ + static struct xkb_context *ctx = NULL; + struct xkb_keymap *keymap = NULL; + struct xkb_state *state = NULL; + kvm_xkb_mod_index_t idx; + kvm_xkb_mod_mask_t shiftMask = 0, altgrMask = 0, capsMask = 0; + kvm_xkb_mod_mask_t scenarioMasks[4]; + kvm_xkb_layout_index_t numLayouts, group; + kvm_xkb_keycode_t minKc, maxKc, kc; + int scenario, caps; + + if (keymapText == NULL || !kvm_xkb_load_xkbcommon()) { return 0; } + if (ctx == NULL && (ctx = g_xkbFn.context_new(0)) == NULL) { return 0; } + + keymap = g_xkbFn.keymap_new_from_string(ctx, keymapText, KVM_XKB_KEYMAP_FORMAT_TEXT_V1, 0); + if (keymap == NULL) { return 0; } + state = g_xkbFn.state_new(keymap); + if (state == NULL) + { + g_xkbFn.keymap_unref(keymap); + return 0; + } + + if ((idx = g_xkbFn.keymap_mod_get_index(keymap, "Shift")) != KVM_XKB_MOD_INVALID) { shiftMask = 1u << idx; } + if ((idx = g_xkbFn.keymap_mod_get_index(keymap, "Mod5")) != KVM_XKB_MOD_INVALID) { altgrMask = 1u << idx; } // AltGr = ISO_Level3_Shift = Mod5 on real keymaps + if ((idx = g_xkbFn.keymap_mod_get_index(keymap, "Lock")) != KVM_XKB_MOD_INVALID) { capsMask = 1u << idx; } + scenarioMasks[0] = 0; + scenarioMasks[1] = shiftMask; + scenarioMasks[2] = altgrMask; + scenarioMasks[3] = shiftMask | altgrMask; + + kvm_xkb_table_reset(&g_xkbCapsOff); + kvm_xkb_table_reset(&g_xkbCapsOn); + g_xkbTablesReady = 0; + + numLayouts = g_xkbFn.keymap_num_layouts(keymap); + if (numLayouts > 4) { numLayouts = 4; } + minKc = g_xkbFn.keymap_min_keycode(keymap); + maxKc = g_xkbFn.keymap_max_keycode(keymap); + if (maxKc > 255 + 8) { maxKc = 255 + 8; } // evdev keyboard range; the uinput device enables 1..255 + + for (scenario = 0; scenario < 4; ++scenario) + { + if (scenario >= 2 && altgrMask == 0) { break; } // keymap has no AltGr modifier: scenarios 2/3 duplicate 0/1 + for (group = 0; group < numLayouts; ++group) + { + for (caps = 0; caps < 2; ++caps) + { + kvm_xkb_table *table = caps ? &g_xkbCapsOn : &g_xkbCapsOff; + g_xkbFn.state_update_mask(state, scenarioMasks[scenario], 0, caps ? capsMask : 0, 0, 0, group); + for (kc = minKc; kc <= maxKc; ++kc) + { + uint32_t cp = g_xkbFn.state_key_get_utf32(state, kc); + if (cp < 0x20 || cp == 0x7F || kc < 8) { continue; } + if (kvm_xkb_table_contains(table, cp, (uint8_t)group)) { continue; } + if (!kvm_xkb_table_add(table, cp, (uint16_t)(kc - 8), (uint8_t)(scenario & 1), (uint8_t)((scenario >> 1) & 1), (uint8_t)group)) + { + kvm_xkb_table_reset(&g_xkbCapsOff); + kvm_xkb_table_reset(&g_xkbCapsOn); + g_xkbFn.state_unref(state); + g_xkbFn.keymap_unref(keymap); + return 0; + } + } + } + } + } + + g_xkbFn.state_unref(state); + g_xkbFn.keymap_unref(keymap); + qsort(g_xkbCapsOff.entries, (size_t)g_xkbCapsOff.count, sizeof(kvm_xkb_entry), kvm_xkb_entry_compare); + qsort(g_xkbCapsOn.entries, (size_t)g_xkbCapsOn.count, sizeof(kvm_xkb_entry), kvm_xkb_entry_compare); + g_xkbTablesReady = 1; + if (kvm_xkb_debug()) + { + fprintf(stderr, "XKB: keymap tables built: %u layout(s), %d codepoint(s)\n", numLayouts, g_xkbCapsOff.count); + } + return 1; +} + +// ---- wl_seat / wl_keyboard plumbing ------------------------------------------------------------- + +static void kvm_xkb_on_keymap(void *data, struct wl_keyboard *keyboard, uint32_t format, int32_t fd, uint32_t size) +{ + void *mapped; + char *text; + if (format != WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1 || size == 0) + { + close(fd); + return; + } + mapped = mmap(NULL, size, PROT_READ, MAP_PRIVATE, fd, 0); + close(fd); + if (mapped == MAP_FAILED) { return; } + // wl_keyboard delivers the keymap with a terminating NUL inside size, but don't rely on it. + text = (char *)malloc((size_t)size + 1); + if (text != NULL) + { + memcpy(text, mapped, size); + text[size] = 0; + } + munmap(mapped, size); + if (text == NULL) { return; } + kvm_xkb_build_from_keymap_string(text); + free(text); +} +static void kvm_xkb_on_kb_enter(void *data, struct wl_keyboard *keyboard, uint32_t serial, struct wl_surface *surface, struct wl_array *keys) { } +static void kvm_xkb_on_kb_leave(void *data, struct wl_keyboard *keyboard, uint32_t serial, struct wl_surface *surface) { } +static void kvm_xkb_on_kb_key(void *data, struct wl_keyboard *keyboard, uint32_t serial, uint32_t time, uint32_t key, uint32_t state) { } +// Compositors that broadcast modifier state to unfocused keyboards keep us informed of the active +// layout group (Alt+Shift switches land here); ones that don't leave the group at 0 and lookup +// falls back to its cheapest-entry order, which is the pre-group-tracking behavior. +static uint32_t g_xkbActiveGroup = 0; +static void kvm_xkb_on_kb_modifiers(void *data, struct wl_keyboard *keyboard, uint32_t serial, uint32_t depressed, uint32_t latched, uint32_t locked, uint32_t group) +{ + (void)data; (void)keyboard; (void)serial; (void)depressed; (void)latched; (void)locked; + g_xkbActiveGroup = group; +} +static void kvm_xkb_on_kb_repeat_info(void *data, struct wl_keyboard *keyboard, int32_t rate, int32_t delay) { } + +static const struct wl_keyboard_listener g_xkbKeyboardListener = +{ + kvm_xkb_on_keymap, + kvm_xkb_on_kb_enter, + kvm_xkb_on_kb_leave, + kvm_xkb_on_kb_key, + kvm_xkb_on_kb_modifiers, + kvm_xkb_on_kb_repeat_info +}; + +static void kvm_xkb_on_seat_capabilities(void *data, struct wl_seat *seat, uint32_t capabilities) +{ + g_xkbSeatCaps = capabilities; +} +static void kvm_xkb_on_seat_name(void *data, struct wl_seat *seat, const char *name) { } + +static const struct wl_seat_listener g_xkbSeatListener = +{ + kvm_xkb_on_seat_capabilities, + kvm_xkb_on_seat_name +}; + +static void kvm_xkb_on_global(void *data, struct wl_registry *registry, uint32_t name, const char *interface, uint32_t version) +{ + if (g_xkbSeat == NULL && interface != NULL && strcmp(interface, "wl_seat") == 0) + { + g_xkbSeat = (struct wl_seat *)kvm_xkb_wl_registry_bind(registry, name, x_wl_seat_interface, 1); + if (g_xkbSeat != NULL) + { + x_wl_proxy_add_listener((struct wl_proxy *)g_xkbSeat, (void (**)(void))&g_xkbSeatListener, NULL); + } + } +} +static void kvm_xkb_on_global_remove(void *data, struct wl_registry *registry, uint32_t name) { } + +static const struct wl_registry_listener g_xkbRegistryListener = +{ + kvm_xkb_on_global, + kvm_xkb_on_global_remove +}; + +// Tears down the Wayland connection only; existing lookup tables survive so typing keeps working +// with the last known keymap if the compositor connection drops. +static void kvm_xkb_disconnect(void) +{ + if (g_xkbKeyboard != NULL) { x_wl_proxy_destroy((struct wl_proxy *)g_xkbKeyboard); g_xkbKeyboard = NULL; } + if (g_xkbSeat != NULL) { x_wl_proxy_destroy((struct wl_proxy *)g_xkbSeat); g_xkbSeat = NULL; } + if (g_xkbRegistry != NULL) { x_wl_proxy_destroy((struct wl_proxy *)g_xkbRegistry); g_xkbRegistry = NULL; } + if (g_xkbDisplay != NULL) { x_wl_display_disconnect(g_xkbDisplay); g_xkbDisplay = NULL; } + g_xkbSeatCaps = 0; +} + +// Non-blocking drain of pending events so keymap changes (layout added/removed) are picked up +// between keystrokes without ever stalling input injection on a hung compositor. +static void kvm_xkb_pump(void) +{ + struct pollfd pfd; + if (g_xkbDisplay == NULL) { return; } + while (x_wl_display_prepare_read(g_xkbDisplay) != 0) + { + x_wl_display_dispatch_pending(g_xkbDisplay); + } + x_wl_display_flush(g_xkbDisplay); + pfd.fd = x_wl_display_get_fd(g_xkbDisplay); + pfd.events = POLLIN; + pfd.revents = 0; + if (poll(&pfd, 1, 0) > 0 && (pfd.revents & POLLIN) != 0) + { + x_wl_display_read_events(g_xkbDisplay); + } + else + { + x_wl_display_cancel_read(g_xkbDisplay); + } + x_wl_display_dispatch_pending(g_xkbDisplay); + if (x_wl_display_get_error(g_xkbDisplay) != 0) + { + if (kvm_xkb_debug()) { fprintf(stderr, "XKB: Wayland connection error; keeping last keymap tables\n"); } + kvm_xkb_disconnect(); + } +} + +static void kvm_xkb_on_sync_done(void *data, struct wl_callback *callback, uint32_t serial) +{ + (void)callback; (void)serial; + *(int *)data = 1; +} +static const struct wl_callback_listener g_xkbSyncListener = { kvm_xkb_on_sync_done }; + +// Deadline-bounded stand-in for wl_display_roundtrip. This runs on the slave's only thread; an +// unbounded roundtrip against a hung compositor would stop the master2slave drain and re-arm the +// agent-wide pipe stall that kvm_drm_write_all exists to prevent. Returns 1 when the sync +// callback fired, 0 on timeout or connection error (caller disconnects; ASCII fallback remains). +static int kvm_xkb_roundtrip_deadline(uint64_t deadlineMs) +{ + union wl_argument args[1]; + struct wl_callback *cb; + int done = 0; + + if (g_xkbDisplay == NULL) { return 0; } + args[0].o = NULL; + cb = (struct wl_callback *)x_wl_proxy_marshal_array_constructor((struct wl_proxy *)g_xkbDisplay, + 0 /*WL_DISPLAY_SYNC*/, args, x_wl_callback_interface); + if (cb == NULL) { return 0; } + x_wl_proxy_add_listener((struct wl_proxy *)cb, (void (**)(void))&g_xkbSyncListener, &done); + + while (!done) + { + struct pollfd pfd; + uint64_t now; + int pr; + + if (x_wl_display_dispatch_pending(g_xkbDisplay) < 0) { break; } + if (done) { break; } + while (x_wl_display_prepare_read(g_xkbDisplay) != 0) + { + if (x_wl_display_dispatch_pending(g_xkbDisplay) < 0) { goto out; } + } + x_wl_display_flush(g_xkbDisplay); + + now = kvm_xkb_now_ms(); + pfd.fd = x_wl_display_get_fd(g_xkbDisplay); + pfd.events = POLLIN; + pfd.revents = 0; + pr = (now >= deadlineMs) ? 0 : poll(&pfd, 1, (int)(deadlineMs - now)); + if (pr <= 0) + { + int savedErrno = errno; + x_wl_display_cancel_read(g_xkbDisplay); + if (pr < 0 && savedErrno == EINTR && kvm_xkb_now_ms() < deadlineMs) { continue; } + break; + } + if (x_wl_display_read_events(g_xkbDisplay) < 0) { break; } + } +out: + // Destroy before returning: the listener writes into this frame's 'done', so a late-arriving + // event dispatched by a future pump must find the proxy already dead. + x_wl_proxy_destroy((struct wl_proxy *)cb); + return done; +} + +#define KVM_XKB_CONNECT_TIMEOUT_MS 2000 + +static int kvm_xkb_try_connect(void) +{ + uint64_t deadline; + if (!kvm_xkb_load_wayland() || !kvm_xkb_load_xkbcommon()) + { + g_xkbLibsUnavailable = 1; + if (kvm_xkb_debug()) { fprintf(stderr, "XKB: libwayland-client/libxkbcommon unavailable; unicode limited to ASCII\n"); } + return 0; + } + + g_xkbDisplay = x_wl_display_connect(NULL); + if (g_xkbDisplay == NULL) + { + if (kvm_xkb_debug()) + { + fprintf(stderr, "XKB: wl_display_connect failed (errno=%d, WAYLAND_DISPLAY=%s, XDG_RUNTIME_DIR=%s)\n", + errno, + getenv("WAYLAND_DISPLAY") ? getenv("WAYLAND_DISPLAY") : "unset", + getenv("XDG_RUNTIME_DIR") ? getenv("XDG_RUNTIME_DIR") : "unset"); + } + return 0; + } + g_xkbRegistry = kvm_xkb_wl_display_get_registry(g_xkbDisplay); + if (g_xkbRegistry == NULL) + { + kvm_xkb_disconnect(); + return 0; + } + x_wl_proxy_add_listener((struct wl_proxy *)g_xkbRegistry, (void (**)(void))&g_xkbRegistryListener, NULL); + deadline = kvm_xkb_now_ms() + KVM_XKB_CONNECT_TIMEOUT_MS; + if (!kvm_xkb_roundtrip_deadline(deadline) || // globals: binds the seat + !kvm_xkb_roundtrip_deadline(deadline)) // seat capabilities + { + if (kvm_xkb_debug()) { fprintf(stderr, "XKB: Wayland roundtrip timed out/failed during connect\n"); } + kvm_xkb_disconnect(); + return 0; + } + if (g_xkbSeat == NULL || (g_xkbSeatCaps & WL_SEAT_CAPABILITY_KEYBOARD) == 0) + { + if (kvm_xkb_debug()) { fprintf(stderr, "XKB: no wl_seat with keyboard capability\n"); } + kvm_xkb_disconnect(); + return 0; + } + g_xkbKeyboard = kvm_xkb_wl_seat_get_keyboard(g_xkbSeat); + if (g_xkbKeyboard == NULL) + { + kvm_xkb_disconnect(); + return 0; + } + x_wl_proxy_add_listener((struct wl_proxy *)g_xkbKeyboard, (void (**)(void))&g_xkbKeyboardListener, NULL); + if (!kvm_xkb_roundtrip_deadline(deadline)) // keymap event -> tables + { + if (kvm_xkb_debug()) { fprintf(stderr, "XKB: Wayland roundtrip timed out/failed waiting for keymap\n"); } + kvm_xkb_disconnect(); + return 0; + } + if (!g_xkbTablesReady) + { + if (kvm_xkb_debug()) { fprintf(stderr, "XKB: no usable keymap received\n"); } + kvm_xkb_disconnect(); + return 0; + } + return 1; +} + +static int kvm_xkb_ensure_ready(void) +{ + uint64_t now; + if (g_xkbLibsUnavailable) { return g_xkbTablesReady; } + if (g_xkbDisplay != NULL) + { + kvm_xkb_pump(); + return g_xkbTablesReady; + } + now = kvm_xkb_now_ms(); + if (g_xkbLastAttemptMs != 0 && (now - g_xkbLastAttemptMs) < KVM_XKB_RETRY_MS) { return g_xkbTablesReady; } + g_xkbLastAttemptMs = now; + kvm_xkb_try_connect(); + return g_xkbTablesReady; +} + +int kvm_xkb_lookup_unicode(uint32_t codepoint, int capslockOn, kvm_xkb_match *match) +{ + const kvm_xkb_table *table; + int i; + if (match == NULL || !kvm_xkb_ensure_ready()) { return 0; } + table = capslockOn ? &g_xkbCapsOn : &g_xkbCapsOff; + i = kvm_xkb_table_find(table, codepoint); + if (i < 0) + { + if (kvm_xkb_debug() >= 2) { fprintf(stderr, "XKB: U+%04X not reachable on the session keymap\n", codepoint); } + return 0; + } + // The search landed somewhere in the codepoint's run; walk to its start (overall cheapest + // entry), then prefer the active group's cheapest so shared characters (digits, punctuation) + // inject on the layout the compositor will actually interpret them under. + while (i > 0 && table->entries[i - 1].codepoint == codepoint) { i--; } + { + int best = i; + int scan; + for (scan = i; scan < table->count && table->entries[scan].codepoint == codepoint; ++scan) + { + if ((uint32_t)table->entries[scan].group == g_xkbActiveGroup) { best = scan; break; } + } + i = best; + } + match->keycode = table->entries[i].keycode; + match->shift = table->entries[i].shift; + match->altgr = table->entries[i].altgr; + if (kvm_xkb_debug() >= 2) + { + fprintf(stderr, "XKB: U+%04X -> keycode %u shift=%d altgr=%d caps=%d group=%u(active=%u)\n", + codepoint, match->keycode, match->shift, match->altgr, capslockOn ? 1 : 0, + (unsigned)table->entries[i].group, (unsigned)g_xkbActiveGroup); + } + return 1; +} + +void kvm_xkb_shutdown(void) +{ + kvm_xkb_disconnect(); + kvm_xkb_table_reset(&g_xkbCapsOff); + kvm_xkb_table_reset(&g_xkbCapsOn); + g_xkbTablesReady = 0; + g_xkbLastAttemptMs = 0; +} + +#else + +int kvm_xkb_lookup_unicode(uint32_t codepoint, int capslockOn, kvm_xkb_match *match) +{ + (void)codepoint; + (void)capslockOn; + (void)match; + return 0; +} + +int kvm_xkb_build_from_keymap_string(const char *keymapText) +{ + (void)keymapText; + return 0; +} + +void kvm_xkb_shutdown(void) +{ +} + +#endif diff --git a/meshcore/KVM/Linux/linux_kvm_xkb.h b/meshcore/KVM/Linux/linux_kvm_xkb.h new file mode 100644 index 000000000..09199d088 --- /dev/null +++ b/meshcore/KVM/Linux/linux_kvm_xkb.h @@ -0,0 +1,43 @@ +/* +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +#ifndef LINUX_KVM_XKB_H_ +#define LINUX_KVM_XKB_H_ + +#include + +// Resolves unicode codepoints to evdev key strokes through the Wayland session's real XKB keymap +// (wl_seat/wl_keyboard + libxkbcommon, both dlopen'd), so the uinput injector can type characters +// that exist in any configured layout instead of only US-position ASCII. Everything degrades to +// "not found" when Wayland or libxkbcommon is unavailable; callers keep their ASCII fallback. + +typedef struct kvm_xkb_match +{ + unsigned int keycode; // evdev keycode (KEY_*) + int shift; + int altgr; +} kvm_xkb_match; + +// 1 = codepoint reachable on the session keymap; fills *match. capslockOn selects the table built +// with CapsLock locked, so caps interaction is exact for every script. Lazily connects to the +// session's Wayland display on first use (privileges must already be dropped to the session user). +int kvm_xkb_lookup_unicode(uint32_t codepoint, int capslockOn, kvm_xkb_match *match); + +// Builds the lookup tables directly from an XKB keymap text (xkb_v1). Used by the wl_keyboard +// keymap event internally; exposed so tests can exercise the resolver without a Wayland session. +int kvm_xkb_build_from_keymap_string(const char *keymapText); + +void kvm_xkb_shutdown(void); + +#endif diff --git a/meshcore/agentcore.c b/meshcore/agentcore.c index 1d9ccbcec..15497bf08 100644 --- a/meshcore/agentcore.c +++ b/meshcore/agentcore.c @@ -45,6 +45,7 @@ limitations under the License. #ifdef _POSIX #include #include +#include #endif #ifdef _OPENBSD @@ -57,13 +58,14 @@ int gRemoteMouseRenderDefault = 0; #ifdef WIN32 #include "KVM/Windows/kvm.h" #endif - #ifdef _POSIX - #ifndef __APPLE__ - #include "KVM/Linux/linux_kvm.h" - #else - #include "KVM/MacOS/mac_kvm.h" + #ifdef _POSIX + #ifndef __APPLE__ + #include "KVM/Linux/linux_kvm.h" + #include "KVM/Linux/linux_kvm_wayland.h" + #else + #include "KVM/MacOS/mac_kvm.h" + #endif #endif - #endif #endif #if defined(WIN32) && !defined(_WIN32_WCE) && !defined(_MINCORE) @@ -977,7 +979,13 @@ void ILibDuktape_MeshAgent_RemoteDesktop_EndSink(ILibDuktape_DuplexStream *strea duk_del_prop_string(ptrs->ctx, -1, REMOTE_DESKTOP_STREAM); duk_pop(ptrs->ctx); // ... #if defined(_LINKVM) && defined(_POSIX) && !defined(__APPLE__) - if (ptrs->kvmPipe != NULL) { ILibProcessPipe_FreePipe(ptrs->kvmPipe); } + if (ptrs->kvmPipe != NULL) + { + // Cancel the pending broken-pipe timer before freeing, else it fires ~4s later on freed memory. + ILibLifeTime_Remove(ILibGetBaseTimer(duk_ctx_chain(ptrs->ctx)), ptrs->kvmPipe); + ILibProcessPipe_Pipe_SetBrokenPipeHandler(ptrs->kvmPipe, NULL); + ILibProcessPipe_FreePipe(ptrs->kvmPipe); + } #endif memset(ptrs, 0, sizeof(RemoteDesktop_Ptrs)); } @@ -1039,7 +1047,13 @@ duk_ret_t ILibDuktape_MeshAgent_RemoteDesktop_Finalizer(duk_context *ctx) duk_pop(ptrs->ctx); // ... #ifdef _LINKVM #if defined(_POSIX) && !defined(__APPLE__) - if (ptrs->kvmPipe != NULL) { ILibProcessPipe_FreePipe(ptrs->kvmPipe); } + if (ptrs->kvmPipe != NULL) + { + // Cancel the pending broken-pipe timer before freeing, else it fires ~4s later on freed memory. + ILibLifeTime_Remove(ILibGetBaseTimer(duk_ctx_chain(ptrs->ctx)), ptrs->kvmPipe); + ILibProcessPipe_Pipe_SetBrokenPipeHandler(ptrs->kvmPipe, NULL); + ILibProcessPipe_FreePipe(ptrs->kvmPipe); + } #endif kvm_cleanup(); #endif @@ -1195,6 +1209,11 @@ duk_ret_t ILibDuktape_MeshAgent_userChanged(duk_context *ctx) { ILibLifeTime_Remove(ILibGetBaseTimer(duk_ctx_chain(ctx)), ptrs->kvmPipe); ILibProcessPipe_Pipe_SetBrokenPipeHandler(ptrs->kvmPipe, NULL); + // Free the old pipe object like the EndSink teardown does; the restart below allocates a + // new one, and auto-recovery made this path fire on every child crash/logout, so the leak + // was no longer a rare manual-restart cost. + ILibProcessPipe_FreePipe(ptrs->kvmPipe); + ptrs->kvmPipe = NULL; kvm_cleanup(); duk_peval_string(ctx, "require('user-sessions').consoleUid()"); @@ -1203,9 +1222,20 @@ duk_ret_t ILibDuktape_MeshAgent_userChanged(duk_context *ctx) duk_get_prop_string(ctx, -1, "getXInfo"); //[uid][monitor-info][getXInfo] duk_swap_top(ctx, -2); //[uid][getXInfo][this] duk_dup(ctx, -3); //[uid][getXInfo][this][uid] - if (duk_pcall_method(ctx, 1) != 0) { duk_eval_string(ctx, "console.log('error');"); return(0); } //[uid][xinfo] - x = Duktape_GetStringPropertyValue(ctx, -1, "xauthority", NULL); - d = Duktape_GetStringPropertyValue(ctx, -1, "display", NULL); + if (duk_pcall_method(ctx, 1) != 0) //[uid][xinfo|error] + { + // getXInfo() has no X server to query on a Wayland/greeter session and throws. The DRM + // backend does not need XAUTHORITY/DISPLAY, so don't abort the restart (that is what left + // the session dead until a manual restart). + Duktape_Console_LogEx(ctx, ILibDuktape_LogType_Info1, "userChanged: getXInfo failed (%s); restarting without X env", duk_safe_to_string(ctx, -1)); + x = NULL; + d = NULL; + } + else + { + x = Duktape_GetStringPropertyValue(ctx, -1, "xauthority", NULL); + d = Duktape_GetStringPropertyValue(ctx, -1, "display", NULL); + } duk_push_heapptr(ctx, s); // [stream] @@ -1217,6 +1247,18 @@ duk_ret_t ILibDuktape_MeshAgent_userChanged(duk_context *ctx) } return(0); } + +// Called (deferred, on the microstack thread) by the KVM parent in linux_kvm.c when a capture child +// exits unexpectedly (logout / user-switch / crash). Re-derives the current console session and +// re-forks the capture child by reusing the exact same recovery as a live user-sessions 'changed' +// event, so the DRM/Wayland and X11 backends share one restart path. +void ILibDuktape_MeshAgent_RemoteDesktop_KvmAutoRecover(void *reservedPtrs) +{ + RemoteDesktop_Ptrs *ptrs = (RemoteDesktop_Ptrs*)reservedPtrs; + if (ptrs == NULL || !ILibMemory_CanaryOK(ptrs) || ptrs->ctx == NULL) { return; } // stream torn down + if (!duk_ctx_is_alive(ptrs->ctx)) { return; } + duk_peval_string_noresult(ptrs->ctx, "try { require('user-sessions').emit('changed'); } catch (e) {}"); +} #endif duk_ret_t ILibDuktape_MeshAgent_getRemoteDesktop(duk_context *ctx) @@ -1351,12 +1393,12 @@ duk_ret_t ILibDuktape_MeshAgent_getRemoteDesktop(duk_context *ctx) // For Linux, we need to determine where the XAUTHORITY is: char *updateXAuth = NULL; char *updateDisplay = NULL; - char *xdm = NULL; + int waylandSession = kvm_is_wayland_session_for_uid(console_uid); int needPop = 0; duk_eval_string(ctx, "require('user-sessions').Self()"); int self = duk_get_int(ctx, -1); duk_pop(ctx); - if (self==0 || getenv("XAUTHORITY") == NULL || getenv("DISPLAY") == NULL) + if (!waylandSession && (self == 0 || getenv("XAUTHORITY") == NULL || getenv("DISPLAY") == NULL)) { if (duk_peval_string(ctx, "require('monitor-info').getXInfo") == 0) { @@ -1367,15 +1409,6 @@ duk_ret_t ILibDuktape_MeshAgent_getRemoteDesktop(duk_context *ctx) { updateXAuth = Duktape_GetStringPropertyValue(ctx, -1, "xauthority", NULL); updateDisplay = Duktape_GetStringPropertyValue(ctx, -1, "display", NULL); - xdm = Duktape_GetStringPropertyValue(ctx, -1, "xdm", ""); - - if (strcmp(xdm, "xwayland") == 0) - { - ILibDuktape_MeshAgent_RemoteDesktop_SendError(ptrs, "This platform is configured to use Xwayland"); - ILibDuktape_MeshAgent_RemoteDesktop_SendError(ptrs, "please modify config to use Xorg"); - duk_pop(ctx); - return(1); - } if (console_uid != 0 && updateXAuth == NULL) { diff --git a/microscript/ILibDuktape_Polyfills.c b/microscript/ILibDuktape_Polyfills.c index 82519e00a..4af111131 100644 --- a/microscript/ILibDuktape_Polyfills.c +++ b/microscript/ILibDuktape_Polyfills.c @@ -2491,7 +2491,7 @@ void ILibDuktape_Polyfills_JS_Init(duk_context *ctx) duk_peval_string_noresult(ctx, "addCompressedModule('_agentStatus', Buffer.from('eJydVk1v2zgQvQfwf+CNFOoqQZOTvdkimwbYLLpOt01P9cJQpJFNL02qJOXECPzfO6T1QcmO064O/iDfvJnhvBlqcLJONCm0WnED5JJo+F5yDYxWSzQaDzxEqgx4FiJmyRykneD6bUYjVgN5kX5K7AKRSJGCMXEhEpsrvSKXl4Q+cnn+jpL3hNEpPvF0WvACplNK3tQ+3hD69sPV7adrGpERYTVN+pixyG2eVpvocHCSlzK1XEmSJTb5M5GZAM3SRSn/iwYnz4MTgo8LS4Ac7/7xnOwAMa7NMdLfyEVEnoldcBOX0ix4biuGMWZrSy3HZNvaMjTD7HYUGpLs66205+8+3rCzKCK/k5D7Z3jbGF0KDbMRPAV2MXSRY9YX0bgFFslGqMRVQ5ZCVBtWb3Y/qqzd0wL/+nI3iYtEG2DOTWzVF6u5nLOoJq5STBObLgiDaI/MJ1LpIp5pWDJ6K9eJwJJ9BlMoiQr6DCnwNWS0ZnVPlWzHzaFoT0/7LgyrMsCDNqWw77t/R7Tj5zXroUcczvepm2+/3q4AKJTXa1vXDS0QhofrqLaBTr+XoDdXrnWYelgOsUtgjZ/YMl3B4qG5+sJj3Z2soWCYzhAByyYEl6zvTTNuFpZ+YYkB1BkjZTxDp7jxTNJVNiLUR0OH6FGUMCJucxv0iQvOta2T2b4gHF8qOKYSzgUJlkZxip1h4VpJCT5o9uxzHPnPmhLHQD0uqo1tTzcVf4wENN2RYbTtSUQtOgisEYMzc3JHm2A+hD46UJDZS+wHPLzQE6lQptcAXlG7eRUuuTK7YvxR5jnoOEca5vvU+Nbk+YbVJYv6dM72ocxb60QIlXrdLWuB9kwQHj9qbqEZWDXSyXtIzvoGyzhVxYah3bCdP53MPZ0DhLvbXoeBMHBcO05mh+uuYaXWcCXER24sSNCmKugLOjmEd1U9Iqvj+uiBjyjkkP5eVUZPFf9XEb+ohl9SwosqCI5mTwfbduJUkPAdw7YDCS8GN8+sM9x2LnRjE21ZOxSx/Y0SEAs1Z/QfN7fwRMjfYBbEj1NnYCGO4+aA50I9JCKeuY3SWHwBIQbsPV+BKi3bK2JQwI6vrzJ5EECscss2SW3gNHTnnvplZQZP3LLmNIbk/OzsrK11cAnUYw0jwbFpFyD7g74F7AfqhrSf/dWMxsG+uwrot8ndPbm+m0xuru9vPvxLm3eYvfyCI6xcQYbZ4u2AakC2/aucsDCBDEyqeWGVNrQTbZP+Xl7r41mF4a1D9524D7xjdAOzWGlsm1z9dFju/HrOD8Acql9oB/OvEq/jaqWvVFaiH3gqlLbGX8pe86Pd13CnklEgFrybfwDySlmh', 'base64'), '2026-05-23T15:21:45.000+00:00');"); duk_peval_string_noresult(ctx, "addCompressedModule('agent-installer', Buffer.from('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', 'base64'), '2026-05-23T16:21:45.000+01:00');"); duk_peval_string_noresult(ctx, "addCompressedModule('child-container', Buffer.from('eJzVGmtz28bxu2b0Hzb8EIAxBVKyJzOl4nQUio7ZKJSHpOpmRI0GBI4kbBBAcAfRquL/3t3Dg3gcQMp12xQfJAK3t7e379u97nfHRwM/eAyd1VrAWe+sByNPMBcGfhj4oSkc3zs+Oj66cizmcWZD5NksBLFmcBGYFv5LRjrwdxZyhIYzowc6AbSSoVb7/Pjo0Y9gYz6C5wuIOEMMDoel4zJgnywWCHA8sPxN4DqmZzHYOmItV0lwGMdHvyUY/IUwEdhE8ADflnkwMAVRC/ishQj63e52uzVMSanhh6uuG8Px7tVoMBxPhydILc248VzGOYTs98gJcZuLRzADJMYyF0iia27BD8FchQzHhE/EbkNHON6qA9xfiq0ZsuMj2+EidBaRKPApJQ33mwdATpketC6mMJq24KeL6WjaOT56P5q9vb6ZwfuLyeRiPBsNp3A9gcH1+HI0G12P8e0NXIx/g19G48sOMOQSrsI+BSFRjyQ6xEFmI7umjBWWX/oxOTxglrN0LNyUt4rMFYOV/8BCD/cCAQs3DicpciTOPj5ynY0jpBLw6o5wke+6xLzjo2XkWQQF1tpx7YHvkYhYqLePj55icZC8jfvrxQdmidElvAZNgp5YKax2ngO0QmYKhlA7xPKL7geSmHYMm+Cmx1mC/k0yCn/8AelvwzURxVrxydj4doTCVY0wsfZt1YgZrngbnpDK0N+Cro28B9N1bHhnhibOQhPQ2ufwOVVCeh5MFEtgkVmtWHheHgqZwH0+QbJQP/0Bn893gIle6hp7YJ7ANYwh/RiidHBNwzJdV0dEHRBhxNq7efQkzJQTdA1/249aI8gGdQn1ohmIfXJEBcK07V8l63QNVR1F66G0tc5OinppxlPxlR6cxX2XGa6/0rXLDEusWfD6R619Xp0Ua5eFqu8Jg3m2Xgb63EBqut88nRu+2k+qXJXTck/kuzZoMn3IoUPViFgfEBeu/wyCJG/z1Fi+XZaqipzwsfpRAVdPerJwQjetWiVcEq8Qmymstf7P9sEUdLswejcgr0ghIZEys8mfwpaBl3havo6E7W896XhowpSF6K46NIZej5RRDsXqsQz9DazRsaE3a9j4PdqjYbk+ZxVFUWyvSVTEwryoJBn3mVO7p/Ez3V982C8+6cHyipz3M2Pk0SDlUeJiygjImyD/1uhOfoqWS/QL6BZ8S3/VLjid9LF3cMQ2/W/T67FB8Qm5t3yUNKuYszYo8rEb9Gcvz66Gum24zFthtH4Br/aappyqrw+Es6tGk/sQxxLDZkvk9LvQx+AlHmMv2LIZt0InEH6IgjJtU5itTpnnnIl+zsYeDpNQVUA5sqvLIo8flMLa4QpC39phordD8eReC5xBHkgVx0lZ4PAYuuvEhccmhKqfQRoBJjCekBPEeYKmitDwPV2TdlN06in1MRaDYVhKI8R5TNoO13ZNSZ9eClQlbhN30sh7b7NFtCLT//ZbyD7uIip88xq8yHXL8ssFXdyXYmKFn8zlbL8S5LFm7BUuBeUVQ5tHBk/QnfqbBEzXTnu9HjJM+ws+lfBVoiFl9TtTkCFrc3yM+TxwAjafC5N/nDAbV5ScP9HQ6GpSC3oqAUGxnUy0LuamzMNwEODK/QIdHZnsUiZ84bp9mWOo48IC1etj8/5knAD90yHWph8u7RoccsVCQkG6NAxDP+zDjSeTewwkC8eTwYaUzMLw4THcZpG5qu0m/ItCtAH8f0goyVlsMQ2MDb7kklsF2gdvR1eX3ensYjJDLcpUr5xHo5XHgULXWoUt4EsLJ7bahvCn0s/r2sLk7PtXmsp7oLFbhD5GhnLI27zvJdFI5/VWHKfyyjDL1T6u7lBQwJh4mcTp4iy+Hwoda+rhaLQ0QUZOpKD0mY5MOo1t6MCXx5oqZnyE4PuVOdlfPtmiLEJO32VcT+DhKaLftNTt5s4goA584HsBE6X6XDhLqLgkM0GicY93Kr4pNhUfk/I7islRk1o4iHUgPnY1g0qQDtA5rBGQABQbP2jTXMY5Gilm4fvFTMpiXTFPwW4KaVaaK/0Ar+h0qRMsctAy6FiWpVS9dht+hBQ4i66Rx9fOUiAd54nbqU0DrQ1ldzKjw82i/VkGp9KH/qoj6cu5AGWSx7eOdNOIx0iE+wyHiz5ldwzqq4HoSTKeWBqF3GF3hiIKpC7VOWB6VHEnezBBNCNXNNBRN/2zKm2WciSx/dAgoYTbktXVZL0SO6vJU3JMz8GV0ihlhlTviguB5GTx/Sv2iVkyxMU+okxRTVgrcARPcNPATI5m0nHnycuoiziGHkzdKLNFsRqBawr0rBt4jf5+63gvz7SGEHJACoN0vHFCLgiYojiVF9873skMsyW1eUS5hJDIqzHX6LZ3J6nEsIkiplmRwaNFfEjSTzv4mhj0CZzWH8qE/5F5PJ4duCTe+VxZxpCHAgmc4sVs5yx/DnSSepNkKnHRFDWnQQnxOln79vROsRzmqFRJzYB6d8qDotwC8lK6+jhAab8yvr7BFYjHaKW0WF/+7SRY+8n/DpCmvZM5ZaoB6RfpxqMNVbT6cKtSyztl5MpSH9SeE6KMcm8Mp0SMTu8q3ionrZiQk9T7QpszwshT1giU6GzmMsEkxiImNYbazFGVM1dqK0+VOcUPaBa4PtD6MLXWjGIsisfksDQdl2q+1SQIfdCGFFXrDmA6eDu7mP4yhe5gMryYDaH7BrqzMeQ3Bt3pAK7HAxyczqDX6/d6UM7ZYpwvXqP2dic3UrgF1/ACP1UYlJ80m0BrPm/RxLIG0WQcAoXq0FBLq5Y+ZHiMa4lQzKHvE+woSML1Bs+perag93BLosazl3YXr8of8cC0eXk2n1OMwhloB7eS7rvybiR6gwubhWFdboG2VYkL2Tw/Es+ftzUdMcRDuF5lwn+OARr+1v4kDMB5jpfUkrSdOk9uxhVFnodzr6KEjVguh1dDtVEQLip+NOAsiCYdyll9sRLxVKPB92mrAB1z2U/mAzDGi5oaSY2z545dE510GssrDpnwCWdx0yj2qO9ilbne4gFujG4106HAsTHxRARtiqq9Z9WK3zMMFgzQHctOFXqxK98y3anUQfUsorch6ciXk4hFOHJyqqCpgS56CpIwxGPAmuxKJkwzBOLG+9H46vrn63FN3qoI6fRUa1TPplFuNr/1hsz6i3d3Mx1ODt+Z4pN6o40KsvU9TcACNSWp6yTHmEQ9YXTJZXsBg6H1kcY35kcGPEK92lbUSzaoUVfrdSvlCo/tK1bsfGuQR8ulY8kixa6zSuviMtkSZEA1KVx98YieNKV3vKV/WikDYQTl1K/H/C7rLFJwLFf5k35qxU01I29CWVCZCmJZXSKNeV70yTLG2/KnJKVuMvS/UrTSAKntIvLAD/R2B7J0E8NJkmx2iupeS7q6dtUqMalVO71QbK8D2hv08iI6wyNn/kRfjYgFxM+Mwru5NOlLu5PqBkFHthkbGz05vVfkzMloXGtMesW5ewO6E1jjaLNgYfXOQNKZf06pPUaVIy7rJw7SaqSy5TLIqqhZhT1dubDXErr6suUhNwJoygFXAr5Kv/9P10Q/pDN7Gpf/9tKYa81movnfdmcl3V+vPbtTuL0d2jLolzRpY8WM3T7K6CkVcrWzVF5TOiBq31QakIUK13AyuZ50h/8YzUbjn0kgaXi4Z3HWTavIKwjL3O0By6T8IXUiGKdpKDbADmUIm4gLIAQdTDIsk+pMPl3A2jpcZhBbx3XhAwHRFQRMKPzIs6lKgzYaGs2b2nNZRtVZqW/GFnfbU8WDDMP/S5n7T1vo3vVxGkrMGZCeFbSTNs7u/UMl48g/TTXumJCk99JABXHMX3zIBand6nETpomCWG1DxiOXAhIius1Nl273zqBbk/LySH5n8tbcPszStIs+u6DMOcv9d7j03L7EV29IxGTc5y7INZBScxsO9dkwDGVZsbAJ1VW459Ep434Tr1SXztKn4UiakXivujRSP6/mWBwTLE2ZlbOdAkVNCCpu8/mM+6+0jLIXKvp8jm/gxuaLRhL4oaCKkMe2ldu45/8Co+Q1ew==', 'base64'), '2026-05-23T15:21:45.000+00:00');"); - duk_peval_string_noresult(ctx, "addCompressedModule('clipboard', Buffer.from('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', 'base64'), '2026-05-23T15:21:45.000+00:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('clipboard', Buffer.from('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', 'base64'), '2026-08-17T08:58:53.000+10:00');"); duk_peval_string_noresult(ctx, "addCompressedModule('crc32-stream', Buffer.from('eJyNVNFu2jAUfY+Uf7jiBaiygNgbVTWxtNOiVVARuqpPk3FugrdgZ7bTFCH+fdchtKTdpPnF2Pfk3HOOrxhd+F6kyp0W+cbCZDwZQywtFhApXSrNrFDS93zvVnCUBlOoZIoa7AZhVjJOW1sJ4DtqQ2iYhGMYOECvLfWGl763UxVs2Q6kslAZJAZhIBMFAj5zLC0ICVxty0IwyRFqYTdNl5Yj9L3HlkGtLSMwI3hJp+wcBsw6tUBrY205HY3qug5ZozRUOh8VR5wZ3cbRzTy5+UBq3Rf3skBjQOPvSmiyud4BK0kMZ2uSWLAalAaWa6SaVU5srYUVMg/AqMzWTKPvpcJYLdaV7eR0kkZ+zwGUFJPQmyUQJz34PEviJPC9h3j1dXG/gofZcjmbr+KbBBZLiBbz63gVL+Z0+gKz+SN8i+fXASClRF3wudROPUkULkFMKa4EsdM+U0c5pkQuMsHJlMwrliPk6gm1JC9Qot4K417RkLjU9wqxFbYZAvPeETW5GLnwnpiGB4qjyerqFOKgT2aRbfvD8FS8dGjfyyrJHSdwqlsc0DxEy+jjhA99b398PUep0RKbxPqFfHAsurV//emWew2cwgvzgG8q+SuArKjMZtjFvvnULTeN4Q9eaY3SNT2eG1ERfCKdnNSdODvgIUyP5b9XL9/3aiQN3lYOQfecCcmKc0P/6eQf7K/Hw6lG8Z5bHp9ft86v4OVpKAWrKyS3GSsMtuDF+idyG6ZIcvFOKxoguxsQRQD9J1ZU2A9gDznacydDuiJIpaX7n+ikBYeOvgZCu7s6uMnZqrQqMKSBV9oa0rdvZ2ja7nAg6B/4IHJ3', 'base64'), '2026-05-23T15:21:45.000+00:00');"); duk_peval_string_noresult(ctx, "addCompressedModule('daemon', Buffer.from('eJyVVU1v2zgQvQvQf5jNoZYKVU6zaA8OcnBTdyu0dRa2u0VPC0Ya2wRkUktScYLA/70z+rbjXWB1oTScr/fmkRq/9r1bXTwZudk6uLq8uoREOczhVptCG+GkVr7ne19lispiBqXK0IDbIkwLkdLS7ETwFxpL3nAVX0LADhfN1kV47XtPuoSdeAKlHZQWKYO0sJY5Aj6mWDiQClK9K3IpVIqwl25bVWlyxL73s8mg750gZ0HuBX2th24gHHcL9GydKybj8X6/j0XVaazNZpzXfnb8NbmdzZezN9QtR3xXOVoLBv8ppSGY908gCmomFffUYi72oA2IjUHac5qb3RvppNpEYPXa7YVB38ukdUbel+6Ip7Y1wjt0IKaEgovpEpLlBXyYLpNl5Hs/ktXnu+8r+DFdLKbzVTJbwt0Cbu/mH5NVcjenr08wnf+EL8n8YwRILFEVfCwMd08tSmYQM6JriXhUfq3rdmyBqVzLlECpTSk2CBv9gEYRFijQ7KTlKVpqLvO9XO6kq0RgXyKiIq/HTJ7vrUuVshdYl+nSfabgHE2Qhr73XI9DrlkU0sYFUaVcu+iiSh7XcSE8Q2F0SmAaS8w0IyW6hoPvHQaV8FH2dXSG/16qrZEaYbcLtE4YB69eAUfBbzdwzpezh3W6Jis/D4II2BVwA1WSE0BuG8EJRLFDR8ciOleDT0WbeLidbmWeUQkqVL//l1/zAUcomoBDvWBu8QWSYSKkGQejTCschX3o4WSujLfGOMTVYjkivzHCzQ2oMs95qp0Jng/XbWcD34rwMwGNHS67IJ6BQbZ1TpP2hXtz2wmc9jkZvMOhwdic9WCED8SCHYXxjF9mxAb5xanI84AK0exMiWFPHekIhcPK+YQ2co8t3aS1LKnFnr/OGgxFzugC1vbZBLHFfE1ZyHrdM9bGFrlwdKh3LOHRXqrfr0bD1FoFo2Xyx2q2+DaKThKHHZtsbwXXEVIZ/m4SES/4iOknuqrPzJ/jT/Tcpey12QPoN5vzzW1mwgnq8ejueJmNttGY/xHAnkwweQ4ui4FfaRTwiNl0LHe6Fmm4vapZdMJsWL8tv/T50KTindjy3wKDtxG8bUs0h6abNaZ/VgSyf0SjGl5Ik0pmdacTeP/u/Ts4hDVYVljUS+m8gDoMO52VOdIG/b5ddeCgKVAtUY1tUi8kvF/A95P8', 'base64'), '2026-05-23T15:21:45.000+00:00');"); duk_peval_string_noresult(ctx, "addCompressedModule('default_route', Buffer.from('eJztVttu4zYQfTfgf5gawUpKHDl2sgs0rltkc6vQxFnESRaLpghoaWQTK5NakoqcJvn3DmV5fY3bvvWhfLBM8nDmzBlyyMZ2tXIs0yfFB0MDrb3mjxAIgwkcS5VKxQyXolqpVi54iEJjBJmIUIEZIhylLKRPOVOHO1Sa0NDy98C1gFo5VfPa1cqTzGDEnkBIA5lGssA1xDxBwHGIqQEuIJSjNOFMhAg5N8PCS2nDr1a+lBZk3zACM4Kn1IvnYcCMZQvUhsakh41Gnuc+K5j6Ug0ayQSnGxfB8Wm3d7pLbO2KW5Gg1qDwW8YVhdl/ApYSmZD1iWLCcpAK2EAhzRlpyeaKGy4GddAyNjlTWK1EXBvF+5lZ0GlKjeKdB5BSTEDtqAdBrwYfj3pBr16tfA5ufr26vYHPR9fXR92b4LQHV9dwfNU9CW6Cqy71zuCo+wV+C7ondUBSibzgOFWWPVHkVkGMSK4e4oL7WE7o6BRDHvOQghKDjA0QBvIRlaBYIEU14tpmURO5qFpJ+IibYhPo1YjIyXbDihdnIrQYypqIZK4fIoxZlphrSZG6XrXyPEnJI1OksIEOiCxJ2rPB80saK7V3nYdzFKh4eMmUHrLE8Upk8IlQ55f+sUJmsEu0HvGTkuMn1wnSYZKylPtRMo8voZdohjJynXM0QXomFWUrurGJLaAzGpr/ifMu7pjiFuYeeO35CDTFRjiyv2LR3asXZurQnK7hsTtZ4t+xBDodaLZa3mSq1GVq2RSbbR0Ba9I38mMWx6hcz6fZ6JYO6n7r4tT1pp5s28yu8LDCcC3LPW82OcdzyhUF7WTU5Kiw6Z+gwthGf+C9TbS9akfJfGl0sUfb1rU43tlr859Kr+2dHe4t4pYoFlLIfIneAeyAy2Eb3n/w6vanvbqKx+DSyn8W0LJQG9jY1mjAyeRoQHE21qMsgx/sOXl5scfFHyEFHcLPMKO1/2EzrzWUNtAqxCrO5TNVNoMqZiEezrlr/o27Okw4Hv4LivC6RnzbXleHl4bmuuXf8kNBZEpQ/tDY1L4uFKeEi2y8qTSFQ55E84WoGHhIlQypujqej2MMz+jKcp1Gn4uGHjp1+N2hzx/TjVSs8LWhSql8KVwnYoYR6jsJN/RI5NcVPNGhjyLvjtNeHH7bjL1Di1U7HQhJ6R7lQAzomK1xwIVvbyzizlPKEkUPL0D3WQqlItRl+Ve4d55tLYCtZqdTK6dq8O4dbB0UA481sK5T8mRg6z25gtd7517gmJt74Sz6zRk3pzTx/eRPE7Qct0/MR5Pj5DjwS3E/wOHidnxjzWzvNSdhL2a9r6P/c+4INJrucdgl8XdjUtVWl7fSX+a2e/afzKymp2E4dMsM+WnCDN0Ro1laQ0avHYeeIvst53BWKUYyyugioLeSVMbeW+seK3MlqU/l6mt73mRRQDaaXC0xGw3G9Jyk/Tk1ORmMmCJmG90s7+k1Tgqp/gL2YXjV', 'base64'), '2026-05-23T15:21:45.000+00:00');"); @@ -2509,7 +2509,7 @@ void ILibDuktape_Polyfills_JS_Init(duk_context *ctx) duk_peval_string_noresult(ctx, "addCompressedModule('mac-powerutil', Buffer.from('eJztVk1v00AQvVvyfxjlYgdSp+qRiENog7BAiVQXEKIIbdaTeMHeNbvjuhHqf2fWcdMUAhISHxLCF9uzzzNv3r5ZefwgDE5NvbFqXRCcHJ8cQ6oJSzg1tjZWkDI6DMLghZKoHebQ6BwtUIEwrYXkW78ygldoHaPhJDmG2AMG/dJgOAmDjWmgEhvQhqBxyBmUg5UqEfBaYk2gNEhT1aUSWiK0ioquSp8jCYM3fQazJMFgwfCa31b7MBDk2QJfBVH9aDxu2zYRHdPE2PW43OLc+EV6OptnsyNm6794qUt0Dix+apTlNpcbEDWTkWLJFEvRgrEg1hZ5jYwn21pFSq9H4MyKWmExDHLlyKplQ/d0uqXG/e4DWCmhYTDNIM0G8GSapdkoDF6nF88WLy/g9fT8fDq/SGcZLM7hdDE/Sy/SxZzfnsJ0/gaep/OzESCrxFXwuraePVNUXkHMWa4M8V75ldnScTVKtVKSm9LrRqwR1uYKreZeoEZbKed30TG5PAxKVSnqTOC+7YiLPBh78VaNlh4DtWnRNqTKeBgGn7f74Dc6eb9YfkBJ6Rk8hqgS8miHjCa3G9YBXYlYM2iXsgv4dB7Sp/TXlbAgC1Xmk7uYY9fIAuLaGsl6JHUpiNuuhneQvQz+koKViXJhW6WjR/fXunVfgen0voijLvC+LxANE7xG+ZRdHEfjpdJjV0QjeBvx7d1w8p10iaPcNMQ369WIJvfDRsdMiAQn2okQy6LRH4fwuReJv3z4GLpgQiZjT+l1PJzAzQ+LorWHivrw7yuqdOInhQUyTjhpFY/6EcJlxIdMeTtjXb1BtnGEFcyuUJMb+DHrNv8yutR4rehSR9+v1ApFMwbFhyBLi+LjV/EcV6Ip6cCeU2FNC3HUO687sfxYYcW8toPbHV637jrI6uuSN9vHmz2r88iSsLRv9j70U3b/7/bDRf+y213RcIethiPLDmr/tHl3Tvpt9t01uH9Y97H/5/U/5eDibzj4zku/2sI3/o+jMnlTIvuB/3LJscYa2/3/l8kX1l4yWQ==', 'base64'), '2026-05-23T15:21:45.000+00:00');"); duk_peval_string_noresult(ctx, "addCompressedModule('message-box', Buffer.from('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', 'base64'), '2026-05-23T15:21:45.000+00:00');"); duk_peval_string_noresult(ctx, "addCompressedModule('monitor-border', Buffer.from('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', 'base64'), '2026-05-23T16:21:45.000+01:00');"); - duk_peval_string_noresult(ctx, "addCompressedModule('monitor-info', Buffer.from('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', 'base64'), '2026-05-23T15:21:45.000+00:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('monitor-info', Buffer.from('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', 'base64'), '2022-04-02T20:22:49.000-07:00');"); char *_notifybardesktop = ILibMemory_Allocate(28421, 0, NULL, NULL); memcpy_s(_notifybardesktop + 0, 28420, "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", 16000); @@ -2533,7 +2533,7 @@ void ILibDuktape_Polyfills_JS_Init(duk_context *ctx) duk_peval_string_noresult(ctx, "addCompressedModule('task-scheduler', Buffer.from('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', 'base64'), '2026-05-23T16:21:45.000+01:00');"); duk_peval_string_noresult(ctx, "addCompressedModule('toaster', Buffer.from('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', 'base64'), '2026-05-23T15:21:45.000+00:00');"); duk_peval_string_noresult(ctx, "addCompressedModule('update-helper', Buffer.from('eJytVd9v2zYQfheg/+GaF8mdK2d5jNEHL00xY4UzREmDdhgCWjrJzGSSI6m6XuD/fUdRtiX/QPcwvYgi77777rs7avQ2DG6kWmteLixcXV5dwlRYrOBGaiU1s1yKMAiDTzxDYTCHWuSowS4QJopl9GpPhvAZtSFruEouIXYGF+3RxWAcBmtZw5KtQUgLtUFC4AYKXiHg9wyVBS4gk0tVcSYyhBW3iyZKi5GEwZcWQc4tI2NG5oq+iq4ZMOvYAj0La9X1aLRarRLWME2kLkeVtzOjT9Ob21l6+47YOo9HUaExoPHvmmtKc74GpohMxuZEsWIrkBpYqZHOrHRkV5pbLsohGFnYFdMYBjk3VvN5bXs6balRvl0DUooJuJikME0v4JdJOk2HYfA0ffj17vEBnib395PZw/Q2hbt7uLmbfZg+TO9m9PURJrMv8Nt09mEISCpRFPyutGNPFLlTEHOSK0XshS+kp2MUZrzgGSUlypqVCKX8hlpQLqBQL7lxVTRELg+Dii+5bZrAHGdEQd6OnHjfmAalJbkivN9qGEftVuTKHwZFLTIHBMYybeNa5czi78wuBmHw6kvmcDRawhC42iLGO8eYkhySwcsAXpv+SZ5pp4loxruNl2bjZQwbF9fB8gLiNztW/3D1TiOjXKJBws1XrrpcHDRRaJDjwdita92EtvS18YCtActPJN2Dd4su+vi0f0Kiin2ez95jgRXVIyZAhfnAe7ZCbcVS/7dUW7l80MTNp0kqFCVN45v38PNgb9ah4h7VAMbRo6BuxMx1eCbpJhHWuGkhwGbao24k97SRskoS/+7hZr/EyuDZwFav+xsH555cjsZ2y1QYKk9GNbD4RIOMqaX1slMr+Ami51p4etGQZCwqVppriFbzqC/YAVv3ZMxmC4hx8ENqZ/M/EBZPnW27U/2Ajs8/cW1CIqjxyVPPhM794rSRFHHUcCVJ9t2267KDbPymC7sbqCPlWpcSbVuDbu/9cfnnIFFcYezjn2mQIx02rfAHkxUfj1GvfQ7q0++WWlRc/JWuRXZipE+7uD/UR8rjwOmwt/4r3EkGfbAzAjX92GvHo1TtmT7z2p7V3Rc2yqXYz/ZOfR92Lz92rtcmlG+H3a24v2rDYOP2lzKvK0zoSpHauvvr1f8+rv0LNmT4L6QVhQk=', 'base64'), '2026-05-23T15:21:45.000+00:00');"); - duk_peval_string_noresult(ctx, "addCompressedModule('user-sessions', Buffer.from('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', 'base64'), '2026-05-23T15:21:45.000+00:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('user-sessions', Buffer.from('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', 'base64'), '2022-03-29T11:33:55.000-07:00');"); duk_peval_string_noresult(ctx, "addCompressedModule('util-agentlog', Buffer.from('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', 'base64'), '2026-05-23T15:21:45.000+00:00');"); duk_peval_string_noresult(ctx, "addCompressedModule('util-descriptors', Buffer.from('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', 'base64'), '2026-05-23T15:21:45.000+00:00');"); duk_peval_string_noresult(ctx, "addCompressedModule('util-dns', Buffer.from('eJzdV2uT2jYU/c4M/+HWbWN747V3SSZNlzIZso+UZsNmAkkmAyQVtgyaNZIrycuSLfntvQKzmH0AmWYmnfoDNtJ9nHuudGwFO+XSoUgnkg2GGip7lX1ocE0TOBQyFZJoJni5VC6dspByRSPIeEQl6CGFekpCvOUzHryjUqE1VPw9cIyBlU9ZbrVcmogMRmQCXGjIFMUITEHMEgr0MqSpBsYhFKM0YYSHFMZMD2dZ8hh+ufQhjyD6mqAxQfMU/8VFMyDaoAW8hlqnB0EwHo99MkPqCzkIkrmdCk4bh8fN1vEuojUeb3lClQJJ/8qYxDL7EyApgglJHyEmZAxCAhlIinNaGLBjyTTjAw+UiPWYSFouRUxpyfqZXuFpAQ3rLRogU4SDVW9Bo2XB83qr0fLKpfeN9u9nb9vwvv7mTb3Zbhy34OwNHJ41jxrtxlkT/51AvfkBXjaaRx5QZAmz0MtUGvQIkRkGaYR0tShdSR+LORyV0pDFLMSi+CAjAwoDcUElx1ogpXLElOmiQnBRuZSwEdOzRaBuV4RJdgJDXpzx0Nhg13gkxupTxJXjlktX805cEInEaqhBp1ddDrEUR3LCHfvTC8qpZOErItWQJLbrH0pKNG1i9gv6WorLiWM30mGSkpT5UYIWeSyW5qavqB6KyLFfUN2keizk+WsiyUjNLJd5I6LJNpnfEclM9539vcpjtwA8ofyr/K+d0dHX4nkWx1Q6rm9WEH2L2+1R5fT4OkteVAwOFnazFMeA90wg139HEqjVYM+de+RkX1fJ1SmuNgRqXPwjKmnsrMH8WjDc97LFPlMT9Sk8g8ovFTiAypOnHjx+uoRmrkgsnwuJzYWd9tNMDZ0cwVel9mD/iVvkSIsW7hg+cNwFieaawnhopMNxCmWupNvz1jWokNHNHdylIxY7Z/cHw26edjq/YXWZ5IDlaDMzLSz+hPHs8o6lHyLUqLhgZgOfUilC3LSIhl7S8ATLceygz3ighrYHHRtvvUXymYevdCQyjTeJ0Wy7ujosuGObVqPzNSQndOFqJrUzr4c1CAuMVmF6KwGV8u5IJtBtc8bnq9ixQqIhoDoMUIlEcuGHgsfwN6BipsDJiCoqUWVwBHHYXW6D/aeN/8j4HHZPzLNt3R/dvrLXTOLo0fFpzbKqG6xSrFvHYHU2WqJYOqy2X2W/NU+qDx8yd4P9JnyzHe38xL4EH38MDJVID749Moo9sN0Nnp9rCkVdo7vX9ixAnrbK9rlWq8CDB9Du7PdqNWvZBGtTNdsVVCD0Z9XtdvNfy8NmeO1OpbcFzEXrvI0dMVtwg8mm+QXa3tpk1nTtSuxyesk0LuBVmzFh+hgnnMWwlpNbujwXD+eP1lnTT1GMqHNzY/u4NUeodTdUBzdXOHTobaVfyFGnV/CYrryTRyQUd72R/2eydG87VZhplsDuLlJwvyB9Z0W6+m6KBF8g+Njtqh3Y6Xb1zpKZbrfT2dv9tdcLvplc1AtCdvZyWym7oTPznwNYPFme4doDjNh51Jvf9/+z2jPdSnv+lfrcrz9m2+vZgaYGW4hQ9ZZyzZz9czpRzjeQKIWHvHAITi45fpoQjct8tNSpkODBxZ59WNkHxaEYD2J9FS0GzTUSUYbg8CwkpFZY4fX3WKGOPn6Zn1eLkfDI8qiyNk7hULM2UkQkmq4Nda3F9wSKaEyyRK8LsSp9RXJhekdUJPof7kamjA==', 'base64'), '2026-05-23T15:21:45.000+00:00');"); diff --git a/modules/clipboard.js b/modules/clipboard.js index 0aba3bb50..80b0de952 100644 --- a/modules/clipboard.js +++ b/modules/clipboard.js @@ -142,7 +142,7 @@ function dispatchRead(sid) id = sid; } - if (id == 0 || process.platform == 'darwin' || process.platform == 'freebsd' || (process.platform == 'linux' && require('clipboard').xclip)) + if (id == 0 || process.platform == 'darwin' || process.platform == 'freebsd' || (process.platform == 'linux' && (require('clipboard').xclip || lin_wayland_active()))) { return (module.exports.read()); } @@ -202,7 +202,7 @@ function dispatchWrite(data, sid) id = sid; } - if (id == 0 || process.platform == 'darwin' || process.platform == 'freebsd' || (process.platform == 'linux' && require('clipboard').xclip)) + if (id == 0 || process.platform == 'darwin' || process.platform == 'freebsd' || (process.platform == 'linux' && (require('clipboard').xclip || lin_wayland_active()))) { return(module.exports(data)); } @@ -242,6 +242,108 @@ function dispatchWrite(data, sid) } } +var _waylandActive = { sticky: false, value: false, at: 0 }; +function lin_wayland_active() +{ + // The probe spawns several shell children (consoleUid + display-manager checks), which is far + // too heavy to run on every clipboard dispatch. Positive results stick for the process + // lifetime (mirrors the C-side latch in linux_kvm_wayland.c); negatives re-probe on a TTL. + if (_waylandActive.sticky) { return (true); } + var now = Date.now(); + if (_waylandActive.at != 0 && (now - _waylandActive.at) < 10000) { return (_waylandActive.value); } + var mi = require('monitor-info'); + var v = (mi._kvmcheck_wayland && mi._kvmcheck_wayland()) ? true : false; + _waylandActive.value = v; + _waylandActive.at = now; + if (v) { _waylandActive.sticky = true; } + return (v); +} + +function lin_whereis(name) +{ + var child = require('child_process').execFile('/bin/sh', ['sh']); + child.stdout.str = ''; child.stdout.on('data', function (c) { this.str += c.toString(); }); + child.stdin.write("whereis " + name + " | awk '{ print $2; }'\nexit\n"); + child.waitExit(); + return (child.stdout.str.trim() != '' ? child.stdout.str.trim() : null); +} + +function lin_wayland_env(uid) +{ + var fs = require('fs'); + var runtimeDir = '/run/user/' + uid; + var disp = process.env['WAYLAND_DISPLAY']; + if (!(disp && fs.existsSync(runtimeDir + '/' + disp))) + { + disp = fs.existsSync(runtimeDir + '/wayland-1') ? 'wayland-1' : 'wayland-0'; + } + return ({ WAYLAND_DISPLAY: disp, XDG_RUNTIME_DIR: runtimeDir }); +} + +function lin_wl_readtext(ret) +{ + var wl = require('clipboard').wlclipboard; + if (!wl) { ret._rej('wl-clipboard (wl-paste) required for clipboard on Wayland'); return (ret); } + + var id; + try { id = require('user-sessions').consoleUid(); } + catch (e) { ret._rej(e); return (ret); } + + ret.child = require('child_process').execFile(wl.paste, ['wl-paste', '--no-newline'], { uid: id, env: lin_wayland_env(id) }); + ret.child.promise = ret; + ret.child.stdout.str = ''; ret.child.stdout.on('data', function (c) { this.str += c.toString(); }); + ret.child.stderr.str = ''; ret.child.stderr.on('data', function (c) { this.str += c.toString(); }); + // A dead/hung compositor socket otherwise leaves this child and the promise pending forever. + var pasteChild = ret.child; + ret.child.timeoutHandle = setTimeout(function () { pasteChild.timedout = true; try { pasteChild.kill(); } catch (e) { } }, 5000); + ret.child.on('exit', function () + { + clearTimeout(this.timeoutHandle); + if (this.timedout) + { + this.promise._rej('wl-paste timed out (compositor unreachable?)'); + return; + } + // wl-paste reports an empty clipboard on stderr with a non-zero exit; surface that as empty, not an error. + if (this.stdout.str.length == 0 && this.stderr.str.trim() != '' && this.stderr.str.indexOf('Nothing is copied') < 0) + { + this.promise._rej(this.stderr.str.trim()); + } + else + { + this.promise._res(this.stdout.str); + } + }); + return (ret); +} + +function lin_wl_copy(txt) +{ + var ret = new promise(function (res, rej) { this._res = res; this._rej = rej; }); + var wl = require('clipboard').wlclipboard; + if (!wl) { ret._rej('wl-clipboard (wl-copy) required for clipboard on Wayland'); return (ret); } + + var id; + try { id = require('user-sessions').consoleUid(); } + catch (e) { ret._rej(e); return (ret); } + + // wl-copy forks a background process to keep owning the selection until another client replaces it, + // so the foreground child exits as soon as the text is read; that lingering owner is expected. + ret.child = require('child_process').execFile(wl.copy, ['wl-copy'], { uid: id, env: lin_wayland_env(id) }); + ret.child.promise = ret; + ret.child.stderr.on('data', function (c) { console.log(c.toString()); }); + var copyChild = ret.child; + ret.child.timeoutHandle = setTimeout(function () { copyChild.timedout = true; try { copyChild.kill(); } catch (e) { } }, 5000); + ret.child.on('exit', function () + { + clearTimeout(this.timeoutHandle); + if (this.timedout) { this.promise._rej('wl-copy timed out (compositor unreachable?)'); return; } + this.promise._res(); + }); + ret.child.stdin.write(txt, function () { this.end(); }); + return (ret); +} + function lin_xclip_readtext(ret) { var id; @@ -295,6 +397,11 @@ function lin_readtext() return (ret); } + if (lin_wayland_active()) + { + return (lin_wl_readtext(ret)); + } + var X11 = require('monitor-info')._X11; if (!X11) { @@ -454,6 +561,11 @@ function lin_xclip_copy(txt) function lin_copytext(txt) { + if (lin_wayland_active()) + { + return (lin_wl_copy(txt)); + } + var X11 = require('monitor-info')._X11; if (!X11) { @@ -656,6 +768,17 @@ switch(process.platform) return (child.stdout.str.trim() != "" ? child.stdout.str.trim() : null); } }); + Object.defineProperty(module.exports, "wlclipboard", + { + get: function () + { + if (this._wlclipboard !== undefined) { return (this._wlclipboard); } + var copy = lin_whereis('wl-copy'); + var paste = lin_whereis('wl-paste'); + Object.defineProperty(this, "_wlclipboard", { value: (copy && paste) ? { copy: copy, paste: paste } : null }); + return (this._wlclipboard); + } + }); break; case 'freebsd': if (require('fs').existsSync('/usr/local/bin/xclip')) diff --git a/modules/monitor-info.js b/modules/monitor-info.js index ec4f65a7b..2ad8d36f8 100644 --- a/modules/monitor-info.js +++ b/modules/monitor-info.js @@ -317,9 +317,62 @@ function monitorinfo() MWM_FUNC_CLOSE : (1 << 5) }; this._xtries = 0; + this._kvmcheck_wayland_user = function _kvmcheck_wayland_user(uid) + { + try + { + var fs = require('fs'); + if (uid != null && uid > 0) + { + var runtimeDir = '/run/user/' + uid; + var waylandDisplay = process.env['WAYLAND_DISPLAY']; + + if (waylandDisplay && fs.existsSync(runtimeDir + '/' + waylandDisplay)) { return true; } + if (fs.existsSync(runtimeDir + '/wayland-0') || fs.existsSync(runtimeDir + '/wayland-1')) { return true; } + } + } + catch (e) + { + } + return false; + }; + this._kvmcheck_wayland = function _kvmcheck_wayland() + { + if (process.platform != 'linux') { return false; } + try + { + var uid = 0; + + try + { + uid = require('user-sessions').consoleUid({ active: true }); + if (Array.isArray(uid)) { uid = (uid.length > 0 ? parseInt(uid[0]) : 0); } + } + catch (z) { } + if (uid == null || uid <= 0) { try { uid = require('user-sessions').consoleUid(); } catch (zz) { uid = 0; } } + + if (this._kvmcheck_wayland_user(uid)) { return true; } + + // Fall back to the display-manager (greeter) session so the Wayland login screen + // is detected before any user logs in (e.g. GDM/LightDM Wayland greeter). + var dmUid = 0; + try { dmUid = require('user-sessions').gdmUid; } catch (zz) { dmUid = 0; } + if (dmUid != null && dmUid > 0 && dmUid != uid && this._kvmcheck_wayland_user(dmUid)) { return true; } + } + catch (e) + { + } + return false; + }; this._kvmcheck = function _kvmcheck() { var retry = false; + if (this._kvmcheck_wayland()) + { + this.kvm_x11_serverFound = true; + this.emit('kvmSupportDetected', true); + return; + } if (!(this.Location_X11LIB && this.Location_X11TST && this.Location_X11EXT)) { this._check(); @@ -397,7 +450,7 @@ function monitorinfo() if (ch.stdout.str.trim() != '') { // X Server found - Object.defineProperty(this, 'kvm_x11_serverFound', { value: true }); + this.kvm_x11_serverFound = true; this.emit('kvmSupportDetected', true); } else diff --git a/modules/user-sessions.js b/modules/user-sessions.js index 5d3291d02..19ce2bdc5 100644 --- a/modules/user-sessions.js +++ b/modules/user-sessions.js @@ -508,7 +508,7 @@ function UserSessions() while(uids.length>0) { var tst = uids.pop(); - if (pwd[tst].desc.indexOf('Display Manager') >= 0 || pwd[tst].user == 'gdm' || pwd[tst].user == 'lightdm' || pwd[tst].user == 'sddm') + if (pwd[tst].desc.toLowerCase().indexOf('display manager') >= 0 || pwd[tst].user == 'gdm' || pwd[tst].user == 'lightdm' || pwd[tst].user == 'sddm' || pwd[tst].user == '_ldm') { if (parseInt(tst) < min) { From 365c8bce0893cfb23f95af30dc98863e80a2b494 Mon Sep 17 00:00:00 2001 From: PTR <47147771+PTR-inc@users.noreply.github.com> Date: Fri, 4 Sep 2026 12:29:18 +0200 Subject: [PATCH 52/68] linux_kvm.c securityfix: put /tmp/master behind SLAVELOG option (#401) /tmp/master is unguarded. It runs every relay start as root Guard it like /tmp/slave on line 1653 --- meshcore/KVM/Linux/linux_kvm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meshcore/KVM/Linux/linux_kvm.c b/meshcore/KVM/Linux/linux_kvm.c index 26446b6b9..3f2e33812 100644 --- a/meshcore/KVM/Linux/linux_kvm.c +++ b/meshcore/KVM/Linux/linux_kvm.c @@ -1825,7 +1825,7 @@ void* kvm_relay_restart(int paused, void *processPipeMgr, ILibKVM_WriteHandler w g_lastKvmForkMs = kvm_relay_now_ms(); close(slave2master[1]); close(master2slave[0]); - logFile = fopen("/tmp/master", "w"); + if (SLAVELOG != 0) { logFile = fopen("/tmp/master", "w"); } char tmp[255]; sprintf_s(tmp, sizeof(tmp), "Child KVM (pid=%d)", g_slavekvm); From 09cd98faf2cdf2709a6d93acbe21ff2f85c620aa Mon Sep 17 00:00:00 2001 From: PTR <47147771+PTR-inc@users.noreply.github.com> Date: Fri, 4 Sep 2026 12:34:25 +0200 Subject: [PATCH 53/68] Fix stream mode on windows (#399) fs defaulted to "r" and "w", which on windows is a text stream. Node has no text mode, and on posix text and binary streams are identical, so a mode string without b or t should open binary. A text stream expands every written \n to \r\n, and a read stops at the first 0x1A byte, which it reads as an end of file. ILibDuktape_fs_openSyncEx/readFileSync now appends b when the called without b or t. createReadStream/createWriteStream also default to "rb"/"wb", even though openSyncEx already forces it. --- microscript/ILibDuktape_fs.c | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/microscript/ILibDuktape_fs.c b/microscript/ILibDuktape_fs.c index 467fc9d9d..0e5d54708 100644 --- a/microscript/ILibDuktape_fs.c +++ b/microscript/ILibDuktape_fs.c @@ -307,6 +307,9 @@ int ILibDuktape_fs_openSyncEx(duk_context *ctx, char *path, char *flags, char *m int retVal; FILE *f; char *key = ILibScratchPad; +#ifdef WIN32 + char binFlags[8]; +#endif duk_push_this(ctx); // [fs] duk_get_prop_string(ctx, -1, FS_NextFD); // [fs][fd] @@ -315,6 +318,12 @@ int ILibDuktape_fs_openSyncEx(duk_context *ctx, char *path, char *flags, char *m sprintf_s(ILibScratchPad, sizeof(ILibScratchPad), "%d", retVal); #ifdef WIN32 + // node has no text mode, so force binary on Windows, as it's default mode is text. + if (strchr(flags, 'b') == NULL && strchr(flags, 't') == NULL) + { + sprintf_s(binFlags, sizeof(binFlags), "%.6sb", flags); + flags = binFlags; + } _wfopen_s(&f, (const wchar_t*)ILibDuktape_String_UTF8ToWide(ctx, path), (const wchar_t*)ILibDuktape_String_UTF8ToWide(ctx, flags)); #else f = fopen(path, flags); @@ -1111,7 +1120,7 @@ duk_ret_t ILibDuktape_fs_createWriteStream(duk_context *ctx) #else char *path = ILibDuktape_fs_fixLinuxPath((char*)duk_require_string(ctx, 0)); #endif - char *flags = "w"; + char *flags = "wb"; int fd = 0; FILE *f; ILibDuktape_fs_writeStreamData *data; @@ -1284,7 +1293,7 @@ duk_ret_t ILibDuktape_fs_createReadStream(duk_context *ctx) #else char *path = ILibDuktape_fs_fixLinuxPath((char*)duk_require_string(ctx, 0)); #endif - char *flags = "r"; + char *flags = "rb"; int fd = 0; FILE *f; ILibDuktape_fs_readStreamData *data; @@ -1296,7 +1305,7 @@ duk_ret_t ILibDuktape_fs_createReadStream(duk_context *ctx) if (nargs > 1) { fd = Duktape_GetIntPropertyValue(ctx, 1, "fd", 0); - flags = Duktape_GetStringPropertyValue(ctx, 1, "flags", "r"); + flags = Duktape_GetStringPropertyValue(ctx, 1, "flags", "rb"); if (duk_has_prop_string(ctx, 1, "autoClose")) { duk_get_prop_string(ctx, 1, "autoClose"); @@ -2448,6 +2457,9 @@ duk_ret_t ILibDuktape_fs_readFileSync(duk_context *ctx) char *filePath = (char*)duk_require_string(ctx, 0); FILE *f; long fileLen; +#ifdef WIN32 + char binFlags[8]; +#endif #ifdef WIN32 char *flags = "rbN"; @@ -2461,6 +2473,12 @@ duk_ret_t ILibDuktape_fs_readFileSync(duk_context *ctx) } #ifdef WIN32 + // An options object can replace the "rbN" default above, force binary + if (strchr(flags, 'b') == NULL && strchr(flags, 't') == NULL) + { + sprintf_s(binFlags, sizeof(binFlags), "%.6sb", flags); + flags = binFlags; + } _wfopen_s(&f, (const wchar_t*)ILibDuktape_String_UTF8ToWide(ctx, filePath), (const wchar_t*)ILibDuktape_String_UTF8ToWide(ctx, flags)); #else f = fopen(filePath, flags); From ef4b9e6fef9bee3267e3f99489dac930592b9f74 Mon Sep 17 00:00:00 2001 From: PTR <47147771+PTR-inc@users.noreply.github.com> Date: Fri, 4 Sep 2026 12:39:36 +0200 Subject: [PATCH 54/68] Fix process.on(SIGNAL, ...) never firing on SPARC/MIPS (#398) The sigtable array index was used directly as the OS signal number, but sparc/mips linux don't share the generic numbering, so sigaction() hooked the wrong signal (e.g. SIGCHLD silently hooked SIGSTOP on sparc64). Replaced the string array with a signal map of name/number pairs generated from the target's real macros at compile time, so it's always correct for the compiled target. The Windows table is just the generic Linux numbers used to fill process.SIGTABLE, since Windows doesn't do POSIX signals. --- microscript/ILibDuktape_ScriptContainer.c | 142 ++++++++++------------ 1 file changed, 63 insertions(+), 79 deletions(-) diff --git a/microscript/ILibDuktape_ScriptContainer.c b/microscript/ILibDuktape_ScriptContainer.c index b206cf010..6807d2ba6 100644 --- a/microscript/ILibDuktape_ScriptContainer.c +++ b/microscript/ILibDuktape_ScriptContainer.c @@ -143,40 +143,49 @@ char exeJavaScriptGuid[] = "B996015880544A19B7F7E9BE44914C18"; }; #endif - char *SIGTABLE[] = - { - "INVALID" , - "SIGHUP" , - "SIGINT" , - "SIGQUIT" , - "SIGILL" , - "SIGTRAP" , - "SIGIOT" , - "SIGBUS" , - "SIGFPE" , - "SIGKILL" , - "SIGUSR1" , - "SIGSEGV" , - "SIGUSR2" , - "SIGPIPE" , - "SIGALRM" , - "SIGTERM" , - "SIGSTKFLT" , - "SIGCHLD" , - "SIGCONTv" , - "SIGSTOP" , - "SIGTSTP" , - "SIGTTIN" , - "SIGTTOU" , - "SIGURG" , - "SIGXCPU" , - "SIGXFSZ" , - "SIGVTALRM" , - "SIGPROF" , - "SIGWINCH" , - "SIGIO" , - "SIGPWR" + // Map signalname to number through the target's headerfile so it's correct on every architecture + // The old static sigtable was based on generic linux, e.g. SPARC/MIPS use SunOS layout, where the old table mapped SIGCHLD onto the uncatchable SIGSTOP. + typedef struct ILib_SigMapEntry { const char *name; int num; } ILib_SigMapEntry; +#ifdef WIN32 + // Windows never delivers POSIX signals. The names only exist so scripts can register the events + static const ILib_SigMapEntry ILib_SigMap[] = + { + { "SIGHUP", 1 }, { "SIGINT", 2 }, { "SIGQUIT", 3 }, { "SIGILL", 4 }, { "SIGTRAP", 5 }, + { "SIGABRT", 6 }, { "SIGBUS", 7 }, { "SIGFPE", 8 }, { "SIGKILL", 9 }, { "SIGUSR1", 10 }, + { "SIGSEGV", 11 }, { "SIGUSR2", 12 }, { "SIGPIPE", 13 }, { "SIGALRM", 14 }, { "SIGTERM", 15 }, + { "SIGSTKFLT", 16 }, { "SIGCHLD", 17 }, { "SIGCONT", 18 }, { "SIGSTOP", 19 }, { "SIGTSTP", 20 }, + { "SIGTTIN", 21 }, { "SIGTTOU", 22 }, { "SIGURG", 23 }, { "SIGXCPU", 24 }, { "SIGXFSZ", 25 }, + { "SIGVTALRM", 26 }, { "SIGPROF", 27 }, { "SIGWINCH", 28 }, { "SIGIO", 29 }, { "SIGPWR", 30 }, + { "SIGSYS", 31 } }; +#else + static const ILib_SigMapEntry ILib_SigMap[] = + { + { "SIGHUP", SIGHUP }, { "SIGINT", SIGINT }, { "SIGQUIT", SIGQUIT }, { "SIGILL", SIGILL }, { "SIGTRAP", SIGTRAP }, + { "SIGABRT", SIGABRT }, +#ifdef SIGIOT + { "SIGIOT", SIGIOT }, +#endif + { "SIGBUS", SIGBUS }, { "SIGFPE", SIGFPE }, { "SIGKILL", SIGKILL }, { "SIGUSR1", SIGUSR1 }, + { "SIGSEGV", SIGSEGV }, { "SIGUSR2", SIGUSR2 }, { "SIGPIPE", SIGPIPE }, { "SIGALRM", SIGALRM }, { "SIGTERM", SIGTERM }, +#ifdef SIGSTKFLT + { "SIGSTKFLT", SIGSTKFLT }, +#endif + { "SIGCHLD", SIGCHLD }, { "SIGCONT", SIGCONT }, { "SIGSTOP", SIGSTOP }, { "SIGTSTP", SIGTSTP }, + { "SIGTTIN", SIGTTIN }, { "SIGTTOU", SIGTTOU }, { "SIGURG", SIGURG }, { "SIGXCPU", SIGXCPU }, { "SIGXFSZ", SIGXFSZ }, + { "SIGVTALRM", SIGVTALRM }, { "SIGPROF", SIGPROF }, { "SIGWINCH", SIGWINCH }, { "SIGIO", SIGIO }, +#ifdef SIGPOLL + { "SIGPOLL", SIGPOLL }, +#endif +#ifdef SIGPWR + { "SIGPWR", SIGPWR }, +#endif + { "SIGSYS", SIGSYS } + }; +#endif +#define ILib_SigMapLen (sizeof(ILib_SigMap) / sizeof(ILib_SigMap[0])) + // number to name. Returns "SIG" if not found (e.g. "SIG34") + static const char* ILib_SigName(int num, char *scratch, size_t scratchLen) { size_t i; for (i = 0; i < ILib_SigMapLen; ++i) { if (ILib_SigMap[i].num == num) { return(ILib_SigMap[i].name); } } sprintf_s(scratch, scratchLen, "SIG%d", num); return((const char*)scratch); } extern void ILibDuktape_MemoryStream_Init(duk_context *ctx); extern void ILibDuktape_NetworkMonitor_Init(duk_context *ctx); @@ -960,6 +969,8 @@ duk_ret_t ILibDuktape_ScriptContainer_Process_SignalListener_Immediate(duk_conte char *sigbuffer = Duktape_GetBuffer(ctx, 0, &bufferLen); void *h = ILibDuktape_GetProcessObject(ctx); int s = 0; + char signame_scratch[16]; + const char *signame = ILib_SigName(((int*)sigbuffer)[1], signame_scratch, sizeof(signame_scratch)); switch (((int*)sigbuffer)[1]) { @@ -967,7 +978,7 @@ duk_ret_t ILibDuktape_ScriptContainer_Process_SignalListener_Immediate(duk_conte s = 0; waitpid(((pid_t*)sigbuffer)[2], &s, 0); ILibDuktape_EventEmitter_SetupEmit(ctx, h, "SIGCHLD"); // [emit][this][SIGCHLD] - duk_push_string(ctx, SIGTABLE[((int*)sigbuffer)[1]]); // [emit][this][SIGTERM][name] + duk_push_string(ctx, signame); // [emit][this][SIGTERM][name] duk_push_int(ctx, s); // [emit][this][SIGCHLD][name][code] duk_push_int(ctx, ((pid_t*)sigbuffer)[2]); // [emit][this][SIGCHLD][name][code][pid] duk_push_uint(ctx, ((uid_t*)sigbuffer)[3]); // [emit][this][SIGCHLD][name][code][pid][uid] @@ -975,9 +986,9 @@ duk_ret_t ILibDuktape_ScriptContainer_Process_SignalListener_Immediate(duk_conte duk_pop(ctx); break; default: - ILibDuktape_EventEmitter_SetupEmit(ctx, h, SIGTABLE[((int*)sigbuffer)[1]]); // [emit][this][SIGTERM] - duk_push_string(ctx, SIGTABLE[((int*)sigbuffer)[1]]); // [emit][this][SIGTERM][name] - if (duk_pcall_method(ctx, 2) != 0) { ILibDuktape_Process_UncaughtExceptionEx(ctx, "Error Emitting %s: ", SIGTABLE[((int*)sigbuffer)[1]]); } + ILibDuktape_EventEmitter_SetupEmit(ctx, h, signame); // [emit][this][SIGTERM] + duk_push_string(ctx, signame); // [emit][this][SIGTERM][name] + if (duk_pcall_method(ctx, 2) != 0) { ILibDuktape_Process_UncaughtExceptionEx(ctx, "Error Emitting %s: ", signame); } duk_pop(ctx); break; } @@ -1154,18 +1165,18 @@ duk_ret_t ILibDuktape_ScriptContainer_removeListenerSink(duk_context *ctx) char *name = (char*)duk_require_string(ctx, 0); duk_push_this(ctx); // [process] - for (i = 1; i < (sizeof(SIGTABLE) / sizeof(char*)); ++i) + for (i = 0; i < (int)ILib_SigMapLen; ++i) { - if (strcmp(name, SIGTABLE[i]) == 0) + if (strcmp(name, ILib_SigMap[i].name) == 0) { - if (ILibDuktape_EventEmitter_HasListenersEx(ctx, -1, SIGTABLE[i]) == 0) + if (ILibDuktape_EventEmitter_HasListenersEx(ctx, -1, (char*)ILib_SigMap[i].name) == 0) { // No more listeners, so we can unhook the sighandler memset(&action, 0, sizeof(action)); sigemptyset(&action.sa_mask); action.sa_flags = 0; action.sa_handler = SIG_DFL; - if (sigaction(i, &action, NULL) == 0) {} + if (sigaction(ILib_SigMap[i].num, &action, NULL) == 0) {} } } } @@ -1229,9 +1240,9 @@ duk_ret_t ILibDuktape_Process_SignalHooks(duk_context *ctx) char *eventname = (char*)duk_require_string(ctx, 0); ILibDuktape_EventEmitter *emitter = ILibDuktape_EventEmitter_GetEmitter_fromThis(ctx); - for (i = 1; i < (sizeof(SIGTABLE) / sizeof(char*)); ++i) + for (i = 0; i < (int)ILib_SigMapLen; ++i) { - if (strcmp(eventname, SIGTABLE[i]) == 0) + if (strcmp(eventname, ILib_SigMap[i].name) == 0) { if (ILibDuktape_EventEmitter_HasListeners2(emitter, eventname, 0) == 0) { @@ -1241,7 +1252,7 @@ duk_ret_t ILibDuktape_Process_SignalHooks(duk_context *ctx) action.sa_sigaction = ILibDuktape_ScriptContainer_Process_SignalListener; sigemptyset(&action.sa_mask); action.sa_flags = SA_SIGINFO; - if (sigaction(i, &action, NULL) == 0) {} + if (sigaction(ILib_SigMap[i].num, &action, NULL) == 0) {} } break; } @@ -1286,39 +1297,12 @@ void ILibDuktape_ScriptContainer_Process_Init(duk_context *ctx, char **argList) duk_put_prop_string(ctx, -2, "RLIMITS"); #endif duk_push_object(ctx); - duk_push_int(ctx, 0); duk_put_prop_string(ctx, -2, "UNKNOWN" ); - duk_push_int(ctx, 1); duk_put_prop_string(ctx, -2, "SIGHUP" ); - duk_push_int(ctx, 2); duk_put_prop_string(ctx, -2, "SIGINT" ); - duk_push_int(ctx, 3); duk_put_prop_string(ctx, -2, "SIGQUIT" ); - duk_push_int(ctx, 4); duk_put_prop_string(ctx, -2, "SIGILL" ); - duk_push_int(ctx, 5); duk_put_prop_string(ctx, -2, "SIGTRAP" ); - duk_push_int(ctx, 6); duk_put_prop_string(ctx, -2, "SIGABRT" ); - duk_push_int(ctx, 7); duk_put_prop_string(ctx, -2, "SIGBUS" ); - duk_push_int(ctx, 8); duk_put_prop_string(ctx, -2, "SIGFPE" ); - duk_push_int(ctx, 9); duk_put_prop_string(ctx, -2, "SIGKILL" ); - duk_push_int(ctx, 10); duk_put_prop_string(ctx, -2, "SIGUSR1" ); - duk_push_int(ctx, 11); duk_put_prop_string(ctx, -2, "SIGEGV" ); - duk_push_int(ctx, 12); duk_put_prop_string(ctx, -2, "SIGUSR2" ); - duk_push_int(ctx, 13); duk_put_prop_string(ctx, -2, "SIGPIPE" ); - duk_push_int(ctx, 14); duk_put_prop_string(ctx, -2, "SIGALRM" ); - duk_push_int(ctx, 15); duk_put_prop_string(ctx, -2, "SIGTERM" ); - duk_push_int(ctx, 16); duk_put_prop_string(ctx, -2, "SIGSTKFLT"); - duk_push_int(ctx, 17); duk_put_prop_string(ctx, -2, "SIGCHLD" ); - duk_push_int(ctx, 18); duk_put_prop_string(ctx, -2, "SIGCONT" ); - duk_push_int(ctx, 19); duk_put_prop_string(ctx, -2, "SIGSTOP" ); - duk_push_int(ctx, 20); duk_put_prop_string(ctx, -2, "SIGTSTP" ); - duk_push_int(ctx, 21); duk_put_prop_string(ctx, -2, "SIGTTIN" ); - duk_push_int(ctx, 22); duk_put_prop_string(ctx, -2, "SIGTTOU" ); - duk_push_int(ctx, 23); duk_put_prop_string(ctx, -2, "SIGURG" ); - duk_push_int(ctx, 24); duk_put_prop_string(ctx, -2, "SIGXCPU" ); - duk_push_int(ctx, 25); duk_put_prop_string(ctx, -2, "SIGXFSZ" ); - duk_push_int(ctx, 26); duk_put_prop_string(ctx, -2, "SIGVTALRM"); - duk_push_int(ctx, 27); duk_put_prop_string(ctx, -2, "SIGPROF" ); - duk_push_int(ctx, 28); duk_put_prop_string(ctx, -2, "SIGWINCH" ); - duk_push_int(ctx, 29); duk_put_prop_string(ctx, -2, "SIGIO" ); - duk_push_int(ctx, 29); duk_put_prop_string(ctx, -2, "SIGPOLL" ); - duk_push_int(ctx, 30); duk_put_prop_string(ctx, -2, "SIGPWR" ); - duk_push_int(ctx, 31); duk_put_prop_string(ctx, -2, "SIGSYS" ); + duk_push_int(ctx, 0); duk_put_prop_string(ctx, -2, "UNKNOWN"); + { + // Use the generated signal map + size_t sigi; + for (sigi = 0; sigi < ILib_SigMapLen; ++sigi) { duk_push_int(ctx, ILib_SigMap[sigi].num); duk_put_prop_string(ctx, -2, ILib_SigMap[sigi].name); } + } duk_put_prop_string(ctx, -2, "SIGTABLE"); duk_push_object(ctx); @@ -1433,9 +1417,9 @@ void ILibDuktape_ScriptContainer_Process_Init(duk_context *ctx, char **argList) ILibDuktape_CreateProperty_InstanceMethod(ctx, "_exit", ILibDuktape_ScriptContainer_Process_ExitEx, DUK_VARARGS); ILibDuktape_EventEmitter_CreateEventEx(emitter, "uncaughtException"); - for (i = 1; i < 31; ++i) + for (i = 0; i < (int)ILib_SigMapLen; ++i) { - ILibDuktape_EventEmitter_CreateEventEx(emitter, SIGTABLE[i]); + ILibDuktape_EventEmitter_CreateEventEx(emitter, (char*)ILib_SigMap[i].name); } ILibDuktape_EventEmitter_AddOnEx(ctx, -1, "newListener", ILibDuktape_Process_SignalHooks); ILibDuktape_EventEmitter_AddOnEx(ctx, -1, "removeListener", ILibDuktape_ScriptContainer_removeListenerSink); From f1d86dbacafc29dff8320d71e4a343483760f5ac Mon Sep 17 00:00:00 2001 From: PTR <47147771+PTR-inc@users.noreply.github.com> Date: Fri, 4 Sep 2026 12:45:19 +0200 Subject: [PATCH 55/68] Name the control channel commands in the controlChannelDebug trace (#395) ProcessCommand and BinaryCommand now print the MeshCommands_Binary name next to the number. The enum and the name switch get generated from one #define list, so future changes to the command list stay in sync. Also cleaned up the debug output: - trailing newlines removed from .log entries, missing ones added to printf. - All controlChannelDebug tracemessages now go to both console and log. - No duplicate output lines - Fixed one unreachable log line. --- meshcore/agentcore.c | 76 +++++++++++++++++++++++++++----------------- meshcore/agentcore.h | 38 ++++++++++++---------- 2 files changed, 68 insertions(+), 46 deletions(-) diff --git a/meshcore/agentcore.c b/meshcore/agentcore.c index 15497bf08..9d61fe47b 100644 --- a/meshcore/agentcore.c +++ b/meshcore/agentcore.c @@ -649,7 +649,7 @@ void UDPSocket_OnData(ILibAsyncUDPSocket_SocketModule socketModule, char* buffer if (agentHost->controlChannelDebug != 0) { printf("Received encrypted discovery response...\n"); - ILIBLOGMESSAGEX("Received encrypted discovery response...\n"); + ILIBLOGMESSAGEX("Received encrypted discovery response..."); } } else @@ -662,7 +662,7 @@ void UDPSocket_OnData(ILibAsyncUDPSocket_SocketModule socketModule, char* buffer if (agentHost->controlChannelDebug != 0) { printf("Received unencrypted discovery response...\n"); - ILIBLOGMESSAGEX("Received unencrypted discovery response...\n"); + ILIBLOGMESSAGEX("Received unencrypted discovery response..."); } } @@ -679,7 +679,7 @@ void UDPSocket_OnData(ILibAsyncUDPSocket_SocketModule socketModule, char* buffer if (agentHost->controlChannelDebug != 0) { printf("FoundServer: %s\n", agentHost->multicastServerUrl); - ILIBLOGMESSAGEX("FoundServer: %s\n", agentHost->multicastServerUrl); + ILIBLOGMESSAGEX("FoundServer: %s", agentHost->multicastServerUrl); } if (agentHost->serverConnectionState == 0) { MeshServer_ConnectEx(agentHost); } @@ -689,7 +689,7 @@ void UDPSocket_OnData(ILibAsyncUDPSocket_SocketModule socketModule, char* buffer if (agentHost->controlChannelDebug != 0) { printf("Failed to parse response...\n"); - ILIBLOGMESSAGEX("Failed to parse response...\n"); + ILIBLOGMESSAGEX("Failed to parse response..."); } } } @@ -2793,7 +2793,7 @@ void MeshServer_selfupdate_continue(MeshAgentHostContainer *agent) // Windows Console Mode updater if (duk_peval_string(agent->meshCoreCtx, "require('agent-installer').consoleUpdate();") != 0) { - printf("%s", duk_safe_to_string(agent->meshCoreCtx, -1)); + printf("%s\n", duk_safe_to_string(agent->meshCoreCtx, -1)); } } else @@ -2891,7 +2891,19 @@ duk_ret_t MeshServer_selfupdate_unzip_error(duk_context *ctx) return(0); } -// Process MeshCentral server commands. +// The MeshCommands_Binary identifier for a control channel command number, minus its MeshCommand_ prefix, generated from the MESH_COMMANDS list in agentcore.h +static const char* MeshCommand_Name(unsigned short command) +{ + switch (command) + { +#define MESH_COMMAND_NAME(id, value) case id: return(&#id[sizeof("MeshCommand_") - 1]); + MESH_COMMANDS(MESH_COMMAND_NAME) +#undef MESH_COMMAND_NAME + default: return((command & 0xFF00) == 0x7B00 ? "JSON" : "unknown"); + } +} + +// Process MeshCentral server commands. void MeshServer_ProcessCommand(ILibWebClient_StateObject WebStateObject, MeshAgentHostContainer *agent, char *cmd, int cmdLen) { unsigned short command = ntohs(((unsigned short*)cmd)[0]); @@ -2899,8 +2911,8 @@ void MeshServer_ProcessCommand(ILibWebClient_StateObject WebStateObject, MeshAge if (agent->controlChannelDebug != 0) { - printf("ProcessCommand(%u)...\n", command); - ILIBLOGMESSAGEX("ProcessCommand(%u)...", command); + printf("ProcessCommand (%u) %s\n", command, MeshCommand_Name(command)); + ILIBLOGMESSAGEX("ProcessCommand (%u) %s", command, MeshCommand_Name(command)); } #ifndef MICROSTACK_NOTLS @@ -2914,7 +2926,7 @@ void MeshServer_ProcessCommand(ILibWebClient_StateObject WebStateObject, MeshAge case MeshCommand_AuthRequest: // This is basic authentication information from the server, we need to sign this and return the signature. if (cmdLen == sizeof(MeshCommand_BinaryPacket_AuthRequest)) { - if (agent->controlChannelDebug != 0) { ILIBLOGMESSAGEX("Processing Authentication Request..."); } + if (agent->controlChannelDebug != 0) { printf("Processing Authentication Request...\n"); ILIBLOGMESSAGEX("Processing Authentication Request..."); } MeshCommand_BinaryPacket_AuthRequest *AuthRequest = (MeshCommand_BinaryPacket_AuthRequest*)cmd; int signLen; SHA512_CTX c; @@ -2989,7 +3001,7 @@ void MeshServer_ProcessCommand(ILibWebClient_StateObject WebStateObject, MeshAge case MeshCommand_AuthVerify: // This is the signature from the server. We need to check everything is ok. if (cmdLen > 8) { - if (agent->controlChannelDebug != 0) { ILIBLOGMESSAGEX("Processing Authentication Verification..."); } + if (agent->controlChannelDebug != 0) { printf("Processing Authentication Verification...\n"); ILIBLOGMESSAGEX("Processing Authentication Verification..."); } MeshCommand_BinaryPacket_AuthVerify_Header *avh = (MeshCommand_BinaryPacket_AuthVerify_Header*)cmd; #ifdef WIN32 @@ -3019,8 +3031,9 @@ void MeshServer_ProcessCommand(ILibWebClient_StateObject WebStateObject, MeshAge X509_pubkey_digest(serverCert, EVP_sha256(), (unsigned char*)ILibScratchPad, (unsigned int*)&hashlen); // OpenSSL 1.1, SHA256 (For older .mshx policy file) if (memcmp(ILibScratchPad, agent->serverHash, UTIL_SHA256_HASHSIZE) != 0) { - printf("Server certificate mismatch\r\n"); break; // TODO: Disconnect + printf("Server certificate mismatch\r\n"); // TODO: Disconnect if (agent->controlChannelDebug != 0) { ILIBLOGMESSAGEX("Server certificate mismatch"); } + break; } } @@ -3161,8 +3174,8 @@ void MeshServer_ProcessCommand(ILibWebClient_StateObject WebStateObject, MeshAge if (agent->controlChannelDebug != 0) { - printf("BinaryCommand(%u, %u)...\n", command, requestid); - ILIBLOGMESSAGEX("BinaryCommand(%u, %u)...", command, requestid); + printf("BinaryCommand (%u) %s, request %u\n", command, MeshCommand_Name(command), requestid); + ILIBLOGMESSAGEX("BinaryCommand (%u) %s, request %u", command, MeshCommand_Name(command), requestid); } @@ -3297,8 +3310,8 @@ void MeshServer_ProcessCommand(ILibWebClient_StateObject WebStateObject, MeshAge } case MeshCommand_CoreOk: // Message from the server indicating our meshcore is ok. No update needed. { - printf("Server verified meshcore..."); - + printf("Server verified meshcore...\n"); + if (agent->controlChannelDebug != 0) { ILIBLOGMESSAGEX("Server verified meshcore..."); } duk_eval_string(agent->meshCoreCtx, "_MSH().setuid;"); if (duk_is_null_or_undefined(agent->meshCoreCtx, -1) == 0) { @@ -3538,7 +3551,7 @@ void MeshServer_ControlChannel_IdleTimeout_PongTimeout(void *object) if (agent->controlChannelDebug != 0) { printf("AgentCore/MeshServer_ControlChannel_IdleTimeout(): PONG TIMEOUT\n"); - ILIBLOGMESSAGEX("AgentCore/MeshServer_ControlChannel_IdleTimeout(): PONG TIMEOUT\n"); + ILIBLOGMESSAGEX("AgentCore/MeshServer_ControlChannel_IdleTimeout(): PONG TIMEOUT"); } ILibWebClient_Disconnect(agent->controlChannel); agent->controlChannel = NULL; @@ -3550,7 +3563,7 @@ void MeshServer_ControlChannel_IdleTimeout(ILibWebClient_StateObject WebStateObj if (agent->controlChannelDebug != 0) { printf("AgentCore/MeshServer_ControlChannel_IdleTimeout(): Sending Ping\n"); - ILIBLOGMESSAGEX("AgentCore/MeshServer_ControlChannel_IdleTimeout(): Sending Ping\n"); + ILIBLOGMESSAGEX("AgentCore/MeshServer_ControlChannel_IdleTimeout(): Sending Ping"); } ILibLifeTime_Add(ILibGetBaseTimer(agent->chain), Agent2PingData(agent), 5, MeshServer_ControlChannel_IdleTimeout_PongTimeout, NULL); @@ -3569,7 +3582,7 @@ void MeshServer_ControlChannel_PongSink(ILibWebClient_StateObject WebStateObject if (agent->controlChannelDebug != 0) { printf("AgentCore/MeshServer_ControlChannel_IdleTimeout(): Pong Received\n"); - ILIBLOGMESSAGEX("AgentCore/MeshServer_ControlChannel_IdleTimeout(): Pong Received\n"); + ILIBLOGMESSAGEX("AgentCore/MeshServer_ControlChannel_IdleTimeout(): Pong Received"); } #ifdef _REMOTELOGGING @@ -4179,8 +4192,10 @@ void MeshServer_ConnectEx(MeshAgentHostContainer *agent) if (useproxy != 0 || meshServer.sin6_family != AF_UNSPEC) { if (useproxy == 0) { strcpy_s(agent->serverip, sizeof(agent->serverip), ILibRemoteLogging_ConvertAddress((struct sockaddr*)&meshServer)); } - printf("Connecting %sto: %s\n", useproxy!=0?"(via proxy) ":"", agent->serveruri); - if (agent->logUpdate != 0 || agent->controlChannelDebug != 0) { ILIBLOGMESSAGEX("Connecting %sto: %s", useproxy != 0 ? "(via proxy) " : "", agent->serveruri); } + printf("Connecting %sto: %s\n", useproxy != 0 ? "(via proxy) " : "", agent->serveruri); + if (agent->logUpdate != 0 || agent->controlChannelDebug != 0) { + ILIBLOGMESSAGEX("Connecting %sto: %s", useproxy != 0 ? "(via proxy) " : "", agent->serveruri); + } ILibWebClient_AddWebSocketRequestHeaders(req, 65535, MeshServer_OnSendOK); @@ -4292,7 +4307,7 @@ void MeshServer_Agent_SelfTest(MeshAgentHostContainer *agent) if (duk_peval_string(agent->meshCoreCtx, "require('agent-selftest')();") != 0) { - printf(" -> Loading Test Script.................[FAILED] %s", duk_safe_to_string(agent->meshCoreCtx, -1)); + printf(" -> Loading Test Script.................[FAILED] %s\n", duk_safe_to_string(agent->meshCoreCtx, -1)); exit(1); } duk_pop(agent->meshCoreCtx); @@ -4365,16 +4380,17 @@ void MeshServer_Connect(MeshAgentHostContainer *agent) SLAVELOG = ILibSimpleDataStore_Get(agent->masterDb, "slaveKvmLog", NULL, 0); #endif - if (agent->logUpdate != 0) { ILIBLOGMESSAGEX("PLATFORM_TYPE: %d", agent->platformType); } - if (agent->logUpdate != 0) { ILIBLOGMESSAGEX("Running as Service: %d", agent->JSRunningAsService); } + if (agent->logUpdate != 0) + { + ILIBLOGMESSAGEX("PLATFORM_TYPE: %d", agent->platformType); + ILIBLOGMESSAGEX("Running as Service: %d", agent->JSRunningAsService); + } - if (agent->logUpdate != 0) { ILIBLOGMESSSAGE("Attempting to connect to Server..."); } - if (agent->controlChannelDebug != 0) + if (agent->logUpdate != 0 || agent->controlChannelDebug != 0) { - ILIBLOGMESSSAGE("Attempting to connect to Server..."); printf("Attempting to connect to Server...\n"); + ILIBLOGMESSSAGE("Attempting to connect to Server..."); } - else if (agent->logUpdate != 0) { ILIBLOGMESSSAGE("Attempting to connect to Server..."); } if (agent->retryTime == 0) { @@ -4679,7 +4695,7 @@ void MeshAgent_AgentMode_IPAddressChanged_Handler(ILibIPAddressMonitor sender, v if (agentHost->controlChannelDebug != 0) { printf("MeshAgent_AgentMode_IPAddressChanged_Handler(%d)\n", agentHost->serverConnectionState); - ILIBLOGMESSAGEX("MeshAgent_AgentMode_IPAddressChanged_Handler(%d)\n", agentHost->serverConnectionState); + ILIBLOGMESSAGEX("MeshAgent_AgentMode_IPAddressChanged_Handler(%d)", agentHost->serverConnectionState); } if (agentHost->multicastDiscovery != NULL) @@ -4687,7 +4703,7 @@ void MeshAgent_AgentMode_IPAddressChanged_Handler(ILibIPAddressMonitor sender, v if (agentHost->controlChannelDebug != 0) { printf("Resetting MulticastSocketv4\n"); - ILIBLOGMESSAGEX("Resetting MulticastSocketv4\n"); + ILIBLOGMESSAGEX("Resetting MulticastSocketv4"); } ILibMulticastSocket_ResetMulticast(agentHost->multicastDiscovery, 0); } @@ -4696,7 +4712,7 @@ void MeshAgent_AgentMode_IPAddressChanged_Handler(ILibIPAddressMonitor sender, v if (agentHost->controlChannelDebug != 0) { printf("Resetting MulticastSocketv6\n"); - ILIBLOGMESSAGEX("Resetting MulticastSocketv6\n"); + ILIBLOGMESSAGEX("Resetting MulticastSocketv6"); } ILibMulticastSocket_ResetMulticast(agentHost->multicastDiscovery2, 0); } diff --git a/meshcore/agentcore.h b/meshcore/agentcore.h index d762ca4cb..d731eb4c1 100644 --- a/meshcore/agentcore.h +++ b/meshcore/agentcore.h @@ -104,24 +104,30 @@ typedef enum AgentIdentifiers // Commands 0 to 9 are reserved for client/server authentication, once authenticated they can't be used and must not be processed. // Commands 10 and above must only be processed if the server is authenticated. All these commands have 2 bytes commandid + 2 bytes requestid. // Commands with an id that starts with '{' (123, 0x7B) are reserved for JSON commands, that is commands 31488 (0x7B00) to 31743 (0x7BFF) +// The MeshCommands_Binary enum below and the name switch in MeshCommand_Name() in agentcore.c are generated from this list, so adding a command here updates both. + +#define MESH_COMMANDS(X) \ + X(MeshCommand_AuthRequest, 1) /* Server web certificate public key sha384 hash + agent or server nonce */ \ + X(MeshCommand_AuthVerify, 2) /* Agent or server signature */ \ + X(MeshCommand_AuthInfo, 3) /* Agent information */ \ + X(MeshCommand_AuthConfirm, 4) /* Server confirm to the agent that is it authenticated */ \ + X(MeshCommand_ServerId, 5) /* Optional, agent sends the expected serverid to the server. Useful if the server has many server certificates. */ \ + X(MeshCommand_CoreModule, 10) /* New core modules to be used instead of the old one, if empty, remove the core module */ \ + X(MeshCommand_CompressedCoreModule, 20) \ + X(MeshCommand_CoreModuleHash, 11) /* Request/return the SHA384 hash of the core module */ \ + X(MeshCommand_AgentCommitDate, 30) /* Commit Date that the agent was built with */ \ + X(MeshCommand_AgentHash, 12) /* Request/return the SHA384 hash of the agent executable */ \ + X(MeshCommand_AgentUpdate, 13) /* Indicate the start and end of the mesh agent binary transfer */ \ + X(MeshCommand_AgentUpdateBlock, 14) /* Part of the mesh agent sent from the server to the agent, confirmation/flowcontrol from agent to server */ \ + X(MeshCommand_AgentTag, 15) /* Send the mesh agent tag to the server */ \ + X(MeshCommand_CoreOk, 16) /* Sent by the server to indicate the meshcore is ok */ \ + X(MeshCommand_HostInfo, 31) /* Host OS and CPU Architecture */ + typedef enum MeshCommands_Binary { - MeshCommand_AuthRequest = 1, // Server web certificate public key sha384 hash + agent or server nonce - MeshCommand_AuthVerify = 2, // Agent or server signature - MeshCommand_AuthInfo = 3, // Agent information - MeshCommand_AuthConfirm = 4, // Server confirm to the agent that is it authenticated - MeshCommand_ServerId = 5, // Optional, agent sends the expected serverid to the server. Useful if the server has many server certificates. - MeshCommand_CoreModule = 10, // New core modules to be used instead of the old one, if empty, remove the core module - MeshCommand_CompressedCoreModule = 20, - MeshCommand_CoreModuleHash = 11, // Request/return the SHA384 hash of the core module - MeshCommand_AgentCommitDate = 30, // Commit Date that the agent was built with - MeshCommand_AgentHash = 12, // Request/return the SHA384 hash of the agent executable - MeshCommand_AgentUpdate = 13, // Indicate the start and end of the mesh agent binary transfer - MeshCommand_AgentUpdateBlock = 14, // Part of the mesh agent sent from the server to the agent, confirmation/flowcontrol from agent to server - MeshCommand_AgentTag = 15, // Send the mesh agent tag to the server - MeshCommand_CoreOk = 16, // Sent by the server to indicate the meshcore is ok - MeshCommand_HostInfo = 31, // Host OS and CPU Architecture - +#define MESH_COMMAND_ENUM(id, value) id = value, + MESH_COMMANDS(MESH_COMMAND_ENUM) +#undef MESH_COMMAND_ENUM } MeshCommands_Binary; #pragma pack(push,1) From c6d80881c48b348556d63691e8b78d8b6e43b585 Mon Sep 17 00:00:00 2001 From: Patrick Date: Fri, 4 Sep 2026 20:49:45 +1000 Subject: [PATCH 56/68] Handle root-level capture for display-manager greeters in Linux KVM (#394) Ensure remote desktop capture works at login screens by running the capture child as root when `consoleUid()` matches the display manager's uid, addressing issues with root-owned X server cookies. Applied in both initial capture and re-fork paths for logout/user-switch scenarios. --- meshcore/agentcore.c | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/meshcore/agentcore.c b/meshcore/agentcore.c index 9d61fe47b..d1ec9bd46 100644 --- a/meshcore/agentcore.c +++ b/meshcore/agentcore.c @@ -1218,6 +1218,23 @@ duk_ret_t ILibDuktape_MeshAgent_userChanged(duk_context *ctx) duk_peval_string(ctx, "require('user-sessions').consoleUid()"); int id = duk_to_int(ctx, -1); + + // Same greeter case as getRemoteDesktop, on the logout/user-switch re-fork: the login screen's + // X server and cookie are root-owned, so capture as root rather than the DM's own uid. + if (id != 0) + { + int gdmuid = -1; + if (duk_peval_string(ctx, "require('user-sessions').gdmUid") == 0 && duk_is_number(ctx, -1)) { gdmuid = duk_get_int(ctx, -1); } + duk_pop(ctx); + if (gdmuid == id) + { + id = 0; + // getXInfo() below reads its uid arg off the stack top, so swap consoleUid()'s result for id + duk_pop(ctx); + duk_push_int(ctx, id); + } + } + duk_eval_string(ctx, "require('monitor-info')"); //[uid][monitor-info] duk_get_prop_string(ctx, -1, "getXInfo"); //[uid][monitor-info][getXInfo] duk_swap_top(ctx, -2); //[uid][getXInfo][this] @@ -1372,6 +1389,24 @@ duk_ret_t ILibDuktape_MeshAgent_getRemoteDesktop(duk_context *ctx) } } } + + // At a DM greeter the X server and its Xauthority are root-owned (e.g. LightDM's + // /var/run/lightdm/root/:0, mode 0600). consoleUid() returns the DM's own service uid here, so + // the capture child setuid()s to it and can no longer read that cookie: XOpenDisplay fails and + // the child exits. Capture as root instead; getXInfo(0) already resolves the root server's + // cookie. gdmUid==console_uid only holds at the greeter (a real login is uid>=1000). + if (TSID == -1 && console_uid != 0) + { + int gdmuid = -1; + if (duk_peval_string(ctx, "require('user-sessions').gdmUid") == 0 && duk_is_number(ctx, -1)) { gdmuid = duk_get_int(ctx, -1); } + duk_pop(ctx); + if (gdmuid == console_uid) + { + Duktape_Console_LogEx(ctx, ILibDuktape_LogType_Info1, "No user logged in; capturing display-manager greeter as root (was uid %d)", console_uid); + console_uid = 0; + } + } + duk_push_int(ctx, console_uid); duk_put_prop_string(ctx, -2, REMOTE_DESKTOP_UID); duk_push_this(ctx); // [MeshAgent] if (!duk_has_prop_string(ctx, -1, MESH_USER_CHANGED_CB)) From 658d2b709d5befc6c53faf02536d975c7a299492 Mon Sep 17 00:00:00 2001 From: PTR <47147771+PTR-inc@users.noreply.github.com> Date: Fri, 4 Sep 2026 12:56:15 +0200 Subject: [PATCH 57/68] Fix ppc64le link failure: WebSocket ratio functions using long double (#396) Under clang/compiler-rt toolchain this failed to link on ppc64le with undefined symbol __gcc_qsub / __gcc_qmul. ILibDuktape_WebSocket_bytesSent_ratio/bytesReceived_ratio calculated the ratio with long doubles. Long double is not a strict defined type per platform, making it less portable. The proper 'long double' precision would be __float128. But it's just a ratio calculation which doesn't need this high precision at all, and in the end it returns the floored value as a JS number. This is the only place in the source where long doubles were used. --- microscript/ILibDuktape_HttpStream.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/microscript/ILibDuktape_HttpStream.c b/microscript/ILibDuktape_HttpStream.c index e62869042..08b0a936f 100644 --- a/microscript/ILibDuktape_HttpStream.c +++ b/microscript/ILibDuktape_HttpStream.c @@ -4976,9 +4976,9 @@ duk_ret_t ILibDuktape_WebSocket_bytesSent_ratio(duk_context *ctx) duk_get_prop_string(ctx, -1, ILibDuktape_WSDEC2WS); // [WebSocket_Decoded][WebSocket] ws = (ILibDuktape_WebSocket_State*)Duktape_GetBufferProperty(ctx, -1, ILibDuktape_WebSocket_StatePtr); - long double ratio = (long double)ws->actualSent / (long double)ws->uncompressedSent; + double ratio = (double)ws->actualSent / (double)ws->uncompressedSent; ratio = (1 - ratio) * 100; - duk_push_number(ctx, floor((double)ratio)); + duk_push_number(ctx, floor(ratio)); return(1); } @@ -4989,9 +4989,9 @@ duk_ret_t ILibDuktape_WebSocket_bytesReceived_ratio(duk_context *ctx) duk_get_prop_string(ctx, -1, ILibDuktape_WSDEC2WS); // [WebSocket_Decoded][WebSocket] ws = (ILibDuktape_WebSocket_State*)Duktape_GetBufferProperty(ctx, -1, ILibDuktape_WebSocket_StatePtr); - long double ratio = (long double)ws->actualReceived / (long double)ws->uncompressedReceived; + double ratio = (double)ws->actualReceived / (double)ws->uncompressedReceived; ratio = (1 - ratio) * 100; - duk_push_number(ctx, floor((double)ratio)); + duk_push_number(ctx, floor(ratio)); return(1); } From 9216b7899787d133b560f645c1a42186b04c2888 Mon Sep 17 00:00:00 2001 From: PTR <47147771+PTR-inc@users.noreply.github.com> Date: Fri, 4 Sep 2026 13:02:54 +0200 Subject: [PATCH 58/68] Un-macro ILibMemory_Init_Size and ILibMemory_Size_Validate for LTCG (#393) Done because MSVC x86 (x64 has no issue) link-time code generation (v143 and v145, v142 verified unaffected) drops the conditional part (extraLen > 0 ? header + roundup : 0) of the ILibMemory_Init_Size macro when the sizes are not constants. So the first block with a non-zero extraLen got 44 bytes instead of 88, and every x86 Release build died at startup with 0xC0000374 (STATUS_HEAP_CORRUPTION). The same LTCG build also dropped two of the four ILibMemory_Size_Validate checks. Both are now static inline functions for runtime sizes. The macros stay for the constant-size callers. Other solution would be disabling LTCG, but this costs nothing performance-wise and makes it independent of the LTCG option and prevents future issues. --- microstack/ILibParsers.c | 4 ++-- microstack/ILibParsers.h | 25 ++++++++++++++++++++++--- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/microstack/ILibParsers.c b/microstack/ILibParsers.c index 0f5ebd16c..159a1af23 100644 --- a/microstack/ILibParsers.c +++ b/microstack/ILibParsers.c @@ -1041,11 +1041,11 @@ void* ILibMemory_SmartReAllocate(void *ptr, size_t len) { if (ILibMemory_CanaryOK(ptr)) { - size_t originalRawSize = ILibMemory_Init_Size(ILibMemory_Size(ptr), ILibMemory_ExtraSize(ptr)); + size_t originalRawSize = ILibMemory_Init_SizeEx(ILibMemory_Size(ptr), ILibMemory_ExtraSize(ptr)); size_t originalSize = ILibMemory_Size(ptr); size_t originalExtraSize = ILibMemory_ExtraSize(ptr); if (originalExtraSize) { len = (len + sizeof(void *) - 1) & ~(sizeof(void *) - 1); } - size_t newRawSize = ILibMemory_Init_Size(len, originalExtraSize); + size_t newRawSize = ILibMemory_Init_SizeEx(len, originalExtraSize); if (newRawSize < originalRawSize && originalExtraSize > 0) { diff --git a/microstack/ILibParsers.h b/microstack/ILibParsers.h index 00da0fd54..6e95109ed 100644 --- a/microstack/ILibParsers.h +++ b/microstack/ILibParsers.h @@ -479,11 +479,30 @@ int ILibIsRunningOnChainThread(void* chain); #define ILibMemory_Extra(ptr) (ILibMemory_ExtraSize(ptr)>0?((char*)(ptr) + ILibMemory_Size((ptr)) + sizeof(ILibMemory_Header)):NULL) #define ILibMemory_FromRaw(ptr) ((char*)(ptr) + sizeof(ILibMemory_Header)) - #define ILibMemory_Size_Validate(primaryLen, extraLen) (((size_t)(primaryLen)<(UINT32_MAX - (size_t)(extraLen)))&&((size_t)(extraLen)<(UINT32_MAX-(size_t)(primaryLen)))&&((size_t)((primaryLen) + (extraLen))<(UINT32_MAX - sizeof(ILibMemory_Header)))&&((extraLen)==0 || ((size_t)((primaryLen)+(extraLen)+sizeof(ILibMemory_Header))<(UINT32_MAX-sizeof(ILibMemory_Header))))) + // Un-macro'd for the same reason as ILibMemory_Init_SizeEx below: MSVC x86 LTCG miscompiles a conditional built from runtime-sized values when it determines a malloc size. + // An oversized length would reach malloc uncaught. + static inline int ILibMemory_Size_ValidateEx(size_t primaryLen, size_t extraLen) + { + if (primaryLen >= (UINT32_MAX - extraLen)) { return(0); } + if (extraLen >= (UINT32_MAX - primaryLen)) { return(0); } + if ((primaryLen + extraLen) >= (UINT32_MAX - sizeof(ILibMemory_Header))) { return(0); } + if (extraLen > 0 && ((primaryLen + extraLen + sizeof(ILibMemory_Header)) >= (UINT32_MAX - sizeof(ILibMemory_Header)))) { return(0); } + return(1); + } + // The macro form stays under this name so code outside this tree that still calls it keeps working. + #define ILibMemory_Size_Validate(primaryLen, extraLen) ILibMemory_Size_ValidateEx((size_t)(primaryLen), (size_t)(extraLen)) #define ILibMemory_Init_Size(primaryLen, extraLen) (primaryLen + extraLen + sizeof(ILibMemory_Header) + (extraLen>0?sizeof(ILibMemory_Header) + (((primaryLen + sizeof(ILibMemory_Header)) + sizeof(void *) - 1) & ~(sizeof(void *) - 1)):0)) + // Un-macro'd because with non-constant sizes, MSVC x86 LTCG (v143 and v145, v142 verified unaffected) drops the macro's conditional part (extraLen > 0 ? header + roundup : 0). + // So the first block with a non-zero extraLen got 44 bytes instead of 88. This gave a 0xC0000374 (STATUS_HEAP_CORRUPTION) error at startup. + static inline size_t ILibMemory_Init_SizeEx(size_t primaryLen, size_t extraLen) + { + size_t total = primaryLen + extraLen + sizeof(ILibMemory_Header); + if (extraLen > 0) { total += sizeof(ILibMemory_Header) + (((primaryLen + sizeof(ILibMemory_Header)) + sizeof(void *) - 1) & ~(sizeof(void *) - 1)); } + return(total); + } void* ILibMemory_Init(void *ptr, size_t primarySize, size_t extraSize, ILibMemory_Types memType); - #define ILibMemory_SmartAllocate(len) ILibMemory_InitEx(ILibMemory_Size_Validate(len,0)?malloc(ILibMemory_Init_Size(len, 0)):NULL, (int)len, 0, ILibMemory_Types_HEAP) - #define ILibMemory_SmartAllocateEx(primaryLen, extraLen) ILibMemory_InitEx(ILibMemory_Size_Validate(primaryLen,extraLen)?malloc(ILibMemory_Init_Size(primaryLen, extraLen)):NULL, (int)primaryLen, (int)extraLen, ILibMemory_Types_HEAP) + #define ILibMemory_SmartAllocate(len) ILibMemory_InitEx(ILibMemory_Size_ValidateEx((size_t)(len),0)?malloc(ILibMemory_Init_Size(len, 0)):NULL, (int)len, 0, ILibMemory_Types_HEAP) + #define ILibMemory_SmartAllocateEx(primaryLen, extraLen) ILibMemory_InitEx(ILibMemory_Size_ValidateEx((size_t)(primaryLen),(size_t)(extraLen))?malloc(ILibMemory_Init_SizeEx((size_t)(primaryLen), (size_t)(extraLen))):NULL, (int)primaryLen, (int)extraLen, ILibMemory_Types_HEAP) #define ILibMemory_SmartAllocate_FromString(str) ILibMemory_SmartAllocate_FromStringEx(str, 0) char* ILibMemory_SmartAllocate_FromStringEx(char *str, size_t strLen); void* ILibMemory_SmartReAllocate(void *ptr, size_t len); From bc3ad916baf0ed0fc208c6ba02814bfffaf98f8a Mon Sep 17 00:00:00 2001 From: PTR <47147771+PTR-inc@users.noreply.github.com> Date: Fri, 4 Sep 2026 13:23:23 +0200 Subject: [PATCH 59/68] Fix unaligned scalar access on strict-alignment CPUs (#392) Replace ((type*)ptr)[n] pointer casts with memcpy-based ILibUnaligned_Read/Write16/32/64 helpers to avoid SIGBUS on MIPS/ARMv5/RISC-V/SPARC. --- meshcore/KVM/Linux/linux_kvm.c | 26 ++++----- meshcore/KVM/Linux/linux_tile.c | 17 +++--- meshcore/agentcore.c | 22 ++++---- microscript/ILibDuktape_GenericMarshal.c | 12 ++-- microscript/ILibDuktape_HttpStream.c | 22 ++++---- microscript/ILibDuktape_Polyfills.c | 10 ++-- microscript/ILibDuktape_ScriptContainer.c | 16 +++--- microstack/ILibParsers.c | 18 +++--- microstack/ILibParsers.h | 17 +++++- microstack/ILibRemoteLogging.c | 4 +- microstack/ILibRemoteLogging.h | 4 +- microstack/ILibSimpleDataStore.c | 25 +++++---- microstack/ILibWebClient.c | 10 ++-- microstack/ILibWebRTC.c | 67 ++++++++++++----------- microstack/ILibWebServer.c | 16 +++--- microstack/ILibWrapperWebRTC.c | 16 +++--- 16 files changed, 161 insertions(+), 141 deletions(-) diff --git a/meshcore/KVM/Linux/linux_kvm.c b/meshcore/KVM/Linux/linux_kvm.c index 3f2e33812..c84a46b2a 100644 --- a/meshcore/KVM/Linux/linux_kvm.c +++ b/meshcore/KVM/Linux/linux_kvm.c @@ -897,8 +897,8 @@ int kvm_server_inputdata(char* block, int blocklen) // Decode the block header if (blocklen < 4) return 0; - type = ntohs(((unsigned short*)(block))[0]); - size = ntohs(((unsigned short*)(block))[1]); + type = ntohs(ILibUnaligned_Read16(block)); + size = ntohs(ILibUnaligned_Read16(block + 2)); if (size > blocklen) return 0; switch (type) @@ -927,9 +927,9 @@ int kvm_server_inputdata(char* block, int blocklen) if (size == 10 || size == 12) { // Client sends coords relative to the captured region; translate to absolute screen coords - x = ((int)ntohs(((unsigned short*)(block))[3])) + CAPTURE_X; - y = ((int)ntohs(((unsigned short*)(block))[4])) + CAPTURE_Y; - if (size == 12) w = ((short)ntohs(((short*)(block))[5])); + x = ((int)ntohs(ILibUnaligned_Read16(block + 6))) + CAPTURE_X; + y = ((int)ntohs(ILibUnaligned_Read16(block + 8))) + CAPTURE_Y; + if (size == 12) w = ((short)ntohs(ILibUnaligned_Read16(block + 10))); if (logFile) { fprintf(logFile, "RemoteMouseMove: (%d, %d)\n", x, y); } // printf("x:%d, y:%d, b:%d, w:%d\n", x, y, block[5], w); if (g_enableEvents) @@ -942,8 +942,8 @@ int kvm_server_inputdata(char* block, int blocklen) } case MNG_KVM_COMPRESSION: // Compression { - if (size >= 10) { int fr = ((int)ntohs(((unsigned short*)(block + 8))[0])); if (fr >= 20 && fr <= 5000) FRAME_RATE_TIMER = fr; } - if (size >= 8) { int ns = ((int)ntohs(((unsigned short*)(block + 6))[0])); if (ns >= 64 && ns <= 4096) SCALING_FACTOR_NEW = ns; } + if (size >= 10) { int fr = ((int)ntohs(ILibUnaligned_Read16(block + 8))); if (fr >= 20 && fr <= 5000) FRAME_RATE_TIMER = fr; } + if (size >= 8) { int ns = ((int)ntohs(ILibUnaligned_Read16(block + 6))); if (ns >= 64 && ns <= 4096) SCALING_FACTOR_NEW = ns; } if (size >= 6) { set_tile_compression((int)block[4], (int)block[5]); } COMPRESSION_RATIO = 100; break; @@ -976,7 +976,7 @@ int kvm_server_inputdata(char* block, int blocklen) } case MNG_KVM_FRAME_RATE_TIMER: { - int fr = ((int)ntohs(((unsigned short*)(block))[2])); + int fr = ((int)ntohs(ILibUnaligned_Read16(block + 4))); if (fr >= 20 && fr <= 5000) FRAME_RATE_TIMER = fr; break; } @@ -987,7 +987,7 @@ int kvm_server_inputdata(char* block, int blocklen) } case MNG_KVM_SET_DISPLAY: { - unsigned short newval = ntohs(((unsigned short*)(block))[2]); + unsigned short newval = ntohs(ILibUnaligned_Read16(block + 4)); if (g_monitor_count > 0) { // XRandR mode: 65535 = all monitors, 1..N = specific physical monitor @@ -1639,13 +1639,13 @@ void kvm_relay_readSink(ILibProcessPipe_Pipe sender, char *buffer, size_t buffer if (bufferLen > 4) { - if (ntohs(((unsigned short*)(buffer))[0]) == (unsigned short)MNG_JUMBO) + if (ntohs(ILibUnaligned_Read16(buffer)) == (unsigned short)MNG_JUMBO) { if (bufferLen > 8) { - if (bufferLen >= (8 + (int)ntohl(((unsigned int*)(buffer))[1]))) + if (bufferLen >= (8 + (int)ntohl(ILibUnaligned_Read32(buffer + 4)))) { - *bytesConsumed = 8 + (int)ntohl(((unsigned int*)(buffer))[1]); + *bytesConsumed = 8 + (int)ntohl(ILibUnaligned_Read32(buffer + 4)); writeHandler(buffer, *bytesConsumed, reserved); return; } @@ -1653,7 +1653,7 @@ void kvm_relay_readSink(ILibProcessPipe_Pipe sender, char *buffer, size_t buffer } else { - size = ntohs(((unsigned short*)(buffer))[1]); + size = ntohs(ILibUnaligned_Read16(buffer + 2)); if (size <= bufferLen) { *bytesConsumed = size; diff --git a/meshcore/KVM/Linux/linux_tile.c b/meshcore/KVM/Linux/linux_tile.c index 923a7d2a3..ed2576a67 100644 --- a/meshcore/KVM/Linux/linux_tile.c +++ b/meshcore/KVM/Linux/linux_tile.c @@ -143,23 +143,26 @@ void dump32bit (const XImage * input) int util_crc(int x, int y, long long bufferSize, void *desktop, long long desktopsize, int tilewidth, int tileheight) { int hval = 0; - int *bp = NULL; - int *be = NULL; + char *bp = NULL; + char *be = NULL; int height = 0; + // Walked as bytes: the row stride is 3 bytes per pixel, so these 32 bit reads land on + // arbitrary addresses and must not be issued through an int* (SIGBUS on MIPS/ARMv5). for (height = y; height < y + tileheight; height++) { - bp = (int *)(((char *)desktop) + (3 * ((height * adjust_screen_size(SCREEN_WIDTH)) + x))); - be = (int *)(((char *)desktop) + (3 * ((height * adjust_screen_size(SCREEN_WIDTH)) + x + tilewidth))); - while ((bp + 1) <= be) + bp = ((char *)desktop) + (3 * ((height * adjust_screen_size(SCREEN_WIDTH)) + x)); + be = ((char *)desktop) + (3 * ((height * adjust_screen_size(SCREEN_WIDTH)) + x + tilewidth)); + while ((bp + 4) <= be) { // hval *= 0x01000193; hval += (hval << 1) + (hval << 4) + (hval << 7) + (hval << 8) + (hval << 24); - hval ^= *bp++; + hval ^= (int)ILibUnaligned_Read32(bp); + bp += 4; } if (be - bp >= 0) { hval += (hval << 1) + (hval << 4) + (hval << 7) + (hval << 8) + (hval << 24); - hval ^= (*(int *)(((char *)be) - 3)); + hval ^= (int)ILibUnaligned_Read32(be - 3); } } diff --git a/meshcore/agentcore.c b/meshcore/agentcore.c index d1ec9bd46..6854de61e 100644 --- a/meshcore/agentcore.c +++ b/meshcore/agentcore.c @@ -896,7 +896,7 @@ ILibTransport_DoneState ILibDuktape_MeshAgent_RemoteDesktop_KVM_WriteSink(char * } #endif - if ((buffer != NULL) && (bufferLen > 4) && (ntohs(((unsigned short*)buffer)[0]) == MNG_DEBUG)) + if ((buffer != NULL) && (bufferLen > 4) && (ntohs(ILibUnaligned_Read16(buffer)) == MNG_DEBUG)) { Duktape_Console_LogEx(ptrs->ctx, ILibDuktape_LogType_Info1, "%s", buffer + 4); } @@ -1130,7 +1130,7 @@ duk_ret_t ILibDuktape_MeshAgent_getRemoteDesktop_DomainIPC_DataSink(duk_context // We need to properly frame the data before we propagate it up if (bufferLen > 4) { - size = ntohs(((unsigned short*)(buffer))[1]); + size = ntohs(ILibUnaligned_Read16(buffer + 2)); if (size <= bufferLen) { // We have all the data, to be able to frame it @@ -2656,13 +2656,13 @@ int GenerateSHA384FileHash(char *filePath, char *fileHash) if (checkSumIndex != 0) { bytesRead = fread(ILibScratchPad, 1, checkSumIndex + 4, tmpFile); - ((unsigned int*)(ILibScratchPad + checkSumIndex))[0] = 0; + ILibUnaligned_Write32(ILibScratchPad + checkSumIndex, 0); SHA384_Update(&ctx, ILibScratchPad, bytesRead); if (endIndex > 0) { bytesLeft -= (unsigned int)bytesRead; } bytesRead = fread(ILibScratchPad, 1, tableIndex + 8 - (checkSumIndex + 4), tmpFile); - ((unsigned int*)(ILibScratchPad + bytesRead - 8))[0] = 0; - ((unsigned int*)(ILibScratchPad + bytesRead - 8))[1] = 0; + ILibUnaligned_Write32(ILibScratchPad + bytesRead - 8, 0); + ILibUnaligned_Write32(ILibScratchPad + bytesRead - 4, 0); SHA384_Update(&ctx, ILibScratchPad, bytesRead); if (endIndex > 0) { bytesLeft -= (unsigned int)bytesRead; } } @@ -2941,7 +2941,7 @@ static const char* MeshCommand_Name(unsigned short command) // Process MeshCentral server commands. void MeshServer_ProcessCommand(ILibWebClient_StateObject WebStateObject, MeshAgentHostContainer *agent, char *cmd, int cmdLen) { - unsigned short command = ntohs(((unsigned short*)cmd)[0]); + unsigned short command = ntohs(ILibUnaligned_Read16(cmd)); unsigned short requestid; if (agent->controlChannelDebug != 0) @@ -3205,7 +3205,7 @@ void MeshServer_ProcessCommand(ILibWebClient_StateObject WebStateObject, MeshAge // All these commands must have both a commandid and a requestid if (cmdLen < 4) return; - requestid = ntohs(((unsigned short*)cmd)[1]); + requestid = ntohs(ILibUnaligned_Read16(cmd + 2)); if (agent->controlChannelDebug != 0) { @@ -4567,7 +4567,7 @@ int importSettings(MeshAgentHostContainer *agent, char* fileName) } else { - if (valLen > 2 && ntohs(((unsigned short*)val)[0]) == HEX_IDENTIFIER) + if (valLen > 2 && ntohs(ILibUnaligned_Read16(val)) == HEX_IDENTIFIER) { // HEX value ILibSimpleDataStore_PutEx(agent->masterDb, key, keyLen, ILibScratchPad2, util_hexToBuf(val + 2, valLen - 2, ILibScratchPad2)); @@ -5981,7 +5981,7 @@ void MeshAgent_ScriptMode(MeshAgentHostContainer *agentHost, int argc, char **ar else if (strncmp(argv[i], "--script-flags", 14) == 0 && ((i + 1) < argc)) { // JS Permissions (see .h for values) - if (ntohs(((unsigned short*)argv[i + 1])[0]) == HEX_IDENTIFIER) + if (ntohs(ILibUnaligned_Read16(argv[i + 1])) == HEX_IDENTIFIER) { int xlen = (int)strnlen_s(argv[i + 1], 32); if (xlen <= 10) @@ -6187,7 +6187,9 @@ int MeshAgent_System(char *cmd) int MeshAgent_Start(MeshAgentHostContainer *agentHost, int paramLen, char **param) { char *startParms = NULL; - char _exedata[ILibMemory_Init_Size(1024, sizeof(void*))]; + // void* element type guarantees the pointer alignment ILibMemory blocks require (a plain + // char array only guarantees alignment 1, and ILibMemory_CanaryOK rejects misaligned blocks) + void *_exedata[(ILibMemory_Init_Size(1024, sizeof(void*)) + sizeof(void*) - 1) / sizeof(void*)]; char *exePath = ILibMemory_Init(_exedata, 1024, sizeof(void*), ILibMemory_Types_STACK); ((void**)ILibMemory_Extra(exePath))[0] = agentHost; diff --git a/microscript/ILibDuktape_GenericMarshal.c b/microscript/ILibDuktape_GenericMarshal.c index 54704697f..c348f1185 100644 --- a/microscript/ILibDuktape_GenericMarshal.c +++ b/microscript/ILibDuktape_GenericMarshal.c @@ -489,10 +489,10 @@ duk_ret_t ILibDuktape_GenericMarshal_Variable_Val_SET(duk_context *ctx) switch (size) { case 2: - ((unsigned short*)ptr)[0] = (unsigned short)duk_require_int(ctx, 0); + ILibUnaligned_Write16(ptr, (unsigned short)duk_require_int(ctx, 0)); break; case 4: - ((unsigned int*)ptr)[0] = (unsigned int)duk_require_int(ctx, 0); + ILibUnaligned_Write32(ptr, (unsigned int)duk_require_int(ctx, 0)); break; default: return(ILibDuktape_Error(ctx, "Unsupported VAL size, with integral type")); @@ -568,10 +568,10 @@ duk_ret_t ILibDuktape_GenericMarshal_Variable_GetEx(duk_context *ctx) switch (varSize) { case 2: - duk_push_int(ctx, (int)((unsigned short*)ptr)[0]); + duk_push_int(ctx, (int)ILibUnaligned_Read16(ptr)); break; case 4: - duk_push_int(ctx, (int)((unsigned int*)ptr)[0]); + duk_push_int(ctx, (int)ILibUnaligned_Read32(ptr)); break; default: return(ILibDuktape_Error(ctx, "Invalid Variable")); @@ -595,10 +595,10 @@ duk_ret_t ILibDuktape_GenericMarshal_Variable_SetEx(duk_context *ctx) switch (varSize) { case 2: - ((unsigned short*)ptr)[0] = (unsigned short)newVal; + ILibUnaligned_Write16(ptr, (unsigned short)newVal); break; case 4: - ((unsigned int*)ptr)[0] = (unsigned int)newVal; + ILibUnaligned_Write32(ptr, (unsigned int)newVal); break; default: return(ILibDuktape_Error(ctx, "Invalid Variable")); diff --git a/microscript/ILibDuktape_HttpStream.c b/microscript/ILibDuktape_HttpStream.c index 08b0a936f..ac0663bbc 100644 --- a/microscript/ILibDuktape_HttpStream.c +++ b/microscript/ILibDuktape_HttpStream.c @@ -4099,7 +4099,7 @@ duk_ret_t ILibDuktape_httpStream_parseUri(duk_context *ctx) ILibTransport_DoneState ILibDuktape_httpStream_webSocket_WriteWebSocketPacket(ILibDuktape_WebSocket_State *state, int opcode, char *_buffer, int _bufferLen, ILibWebClient_WebSocket_FragmentFlags _bufferFragment) { char header[10]; - int maskKeyInt; + uint32_t maskKeyInt; int headerLen = 0; unsigned short flags = state->noMasking == 0 ? WEBSOCKET_MASK : 0; @@ -4198,13 +4198,13 @@ ILibTransport_DoneState ILibDuktape_httpStream_webSocket_WriteWebSocketPacket(IL // Mask the payload util_random(4, maskKey); - maskKeyInt = ((int*)(maskKey))[0]; - if (bufferLen > 0) + maskKeyInt = ILibUnaligned_Read32(maskKey); + if (bufferLen > 0) { int x; - // Note that the line below will cause a SegFault on Linux when compiled with GCC -O3, the fault happens at the XOR (^) operation. - // Compiling with -O2 works also, doing the masking operating byte-by-byte also works with -O3. - for (x = 0; x < (bufferLen >> 2); ++x) { ((int*)(dataFrame+headerLen+4))[x] = ((int*)buffer)[x] ^ (int)maskKeyInt; } // Mask 4 bytes at a time (SegFaults with -O3). + // maskKey/dataFrame/buffer all sit at runtime offsets, so the 4-byte-at-a-time masking below + // must not be done through pointer casts (it faulted with GCC -O3, and traps on MIPS/ARMv5). + for (x = 0; x < (bufferLen >> 2); ++x) { ILibUnaligned_Write32(dataFrame + headerLen + 4 + (x << 2), ILibUnaligned_Read32(buffer + (x << 2)) ^ maskKeyInt); } // Mask 4 bytes at a time for (x = (x << 2); x < bufferLen; ++x) { dataFrame[x + headerLen + 4] = buffer[x] ^ maskKey[x % 4]; } // Mask the reminder } retVal = ILibDuktape_DuplexStream_WriteData(state->encodedStream, dataFrame, headerLen + 4 + bufferLen) == 0 ? ILibTransport_DoneState_COMPLETE : ILibTransport_DoneState_INCOMPLETE; @@ -4342,7 +4342,7 @@ ILibTransport_DoneState ILibDuktape_httpStream_webSocket_EncodedWriteSink(ILibDu return(ILibDuktape_httpStream_webSocket_EncodedWriteSink_DispatchUnshift(stream, buffer, bufferLen)); } - hdr = ntohs(((unsigned short*)(buffer))[0]); + hdr = ntohs(ILibUnaligned_Read16(buffer)); FIN = (hdr & WEBSOCKET_FIN) != 0; OPCODE = (hdr & WEBSOCKET_OPCODE) >> 8; RSV = (hdr & WEBSOCKET_RSV) >> 8; @@ -4359,7 +4359,7 @@ ILibTransport_DoneState ILibDuktape_httpStream_webSocket_EncodedWriteSink(ILibDu if (plen == 126) { if (bufferLen < 4) { return(ILibDuktape_httpStream_webSocket_EncodedWriteSink_DispatchUnshift(stream, buffer, bufferLen)); } // We need at least 4 bytes to read enough of the headers - plen = (unsigned short)ntohs(((unsigned short*)(buffer))[1]); + plen = (unsigned short)ntohs(ILibUnaligned_Read16(buffer + 2)); i += 2; } else if (plen == 127) @@ -4370,7 +4370,7 @@ ILibTransport_DoneState ILibDuktape_httpStream_webSocket_EncodedWriteSink(ILibDu } else { - unsigned long long v = ILibNTOHLL(((unsigned long long*)(buffer + 2))[0]); + unsigned long long v = ILibNTOHLL(ILibUnaligned_Read64(buffer + 2)); if (v > 0x7FFFFFFFUL) { // this value is too big to store in a 32 bit signed variable, so disconnect the websocket. @@ -4396,10 +4396,10 @@ ILibTransport_DoneState ILibDuktape_httpStream_webSocket_EncodedWriteSink(ILibDu // Unmask the data i += 4; // Move ptr to start of data - int maskKeyInt = ((int*)(maskingKey))[0]; + uint32_t maskKeyInt = ILibUnaligned_Read32(maskingKey); if (plen > 0) { - for (x = 0; x < (plen >> 2); ++x) { ((int*)(buffer+i))[x] = ((int*)(buffer+i))[x] ^ (int)maskKeyInt; } // Mask 4 bytes at a time + for (x = 0; x < (plen >> 2); ++x) { ILibUnaligned_Write32(buffer + i + (x << 2), ILibUnaligned_Read32(buffer + i + (x << 2)) ^ maskKeyInt); } // Mask 4 bytes at a time for (x = (x << 2); x < plen; ++x) { buffer[x + i] = buffer[x + i] ^ maskingKey[x % 4]; } // Mask the reminder } } diff --git a/microscript/ILibDuktape_Polyfills.c b/microscript/ILibDuktape_Polyfills.c index 4af111131..bd4278a08 100644 --- a/microscript/ILibDuktape_Polyfills.c +++ b/microscript/ILibDuktape_Polyfills.c @@ -285,7 +285,7 @@ duk_ret_t ILibDuktape_Polyfills_Buffer_readInt32BE(duk_context *ctx) duk_push_this(ctx); buffer = Duktape_GetBuffer(ctx, -1, &bufferLen); - duk_push_int(ctx, ntohl(((int*)(buffer + offset))[0])); + duk_push_int(ctx, ntohl((int)ILibUnaligned_Read32(buffer + offset))); return(1); } duk_ret_t ILibDuktape_Polyfills_Buffer_alloc(duk_context *ctx) @@ -1072,7 +1072,7 @@ duk_ret_t ILibDuktape_ntohl(duk_context *ctx) int offset = duk_require_int(ctx, 1); if ((int)bufferLen < (4 + offset)) { return(ILibDuktape_Error(ctx, "buffer too small")); } - duk_push_int(ctx, ntohl(((unsigned int*)(buffer + offset))[0])); + duk_push_int(ctx, ntohl(ILibUnaligned_Read32(buffer + offset))); return 1; } duk_ret_t ILibDuktape_ntohs(duk_context *ctx) @@ -1082,7 +1082,7 @@ duk_ret_t ILibDuktape_ntohs(duk_context *ctx) int offset = duk_require_int(ctx, 1); if ((int)bufferLen < 2 + offset) { return(ILibDuktape_Error(ctx, "buffer too small")); } - duk_push_int(ctx, ntohs(((unsigned short*)(buffer + offset))[0])); + duk_push_int(ctx, ntohs(ILibUnaligned_Read16(buffer + offset))); return 1; } duk_ret_t ILibDuktape_htonl(duk_context *ctx) @@ -1093,7 +1093,7 @@ duk_ret_t ILibDuktape_htonl(duk_context *ctx) unsigned int val = (unsigned int)duk_require_int(ctx, 2); if ((int)bufferLen < (4 + offset)) { return(ILibDuktape_Error(ctx, "buffer too small")); } - ((unsigned int*)(buffer + offset))[0] = htonl(val); + ILibUnaligned_Write32(buffer + offset, htonl(val)); return 0; } duk_ret_t ILibDuktape_htons(duk_context *ctx) @@ -1104,7 +1104,7 @@ duk_ret_t ILibDuktape_htons(duk_context *ctx) unsigned int val = (unsigned int)duk_require_int(ctx, 2); if ((int)bufferLen < (2 + offset)) { return(ILibDuktape_Error(ctx, "buffer too small")); } - ((unsigned short*)(buffer + offset))[0] = htons(val); + ILibUnaligned_Write16(buffer + offset, htons((unsigned short)val)); return 0; } void ILibDuktape_Polyfills_byte_ordering(duk_context *ctx) diff --git a/microscript/ILibDuktape_ScriptContainer.c b/microscript/ILibDuktape_ScriptContainer.c index 6807d2ba6..10f7517c1 100644 --- a/microscript/ILibDuktape_ScriptContainer.c +++ b/microscript/ILibDuktape_ScriptContainer.c @@ -3073,7 +3073,7 @@ void ILibDuktape_ScriptContainer_Slave_ProcessCommands(ILibDuktape_ScriptContain } - duk_push_lstring(codec, buffer + 4, ((int*)buffer)[0] - 4); + duk_push_lstring(codec, buffer + 4, (int)ILibUnaligned_Read32(buffer) - 4); duk_json_decode(codec, -1); cmd = (SCRIPT_ENGINE_COMMAND)Duktape_GetIntPropertyValue(codec, -1, "command", SCRIPT_ENGINE_COMMAND_UNKNOWN); @@ -3333,7 +3333,7 @@ void ILibDuktape_ScriptContainer_Slave_OnReadStdIn(ILibProcessPipe_Pipe sender, if (!ILibMemory_CanaryOK(sender)) { return; } ILibDuktape_ScriptContainer_Slave *slave = (ILibDuktape_ScriptContainer_Slave*)((void**)ILibMemory_Extra(sender))[0]; - if (bufferLen < 4 || bufferLen < (size_t)((int*)buffer)[0]) { return; } + if (bufferLen < 4 || bufferLen < (size_t)(int)ILibUnaligned_Read32(buffer)) { return; } ILibRemoteLogging_printf(ILibChainGetLogger(slave->chain), ILibRemoteLogging_Modules_Microstack_Generic, ILibRemoteLogging_Flags_VerbosityLevel_1, "Slave read: %d bytes", bufferLen); #ifdef WIN32 @@ -3346,7 +3346,7 @@ void ILibDuktape_ScriptContainer_Slave_OnReadStdIn(ILibProcessPipe_Pipe sender, ILibDuktape_ScriptContainer_Slave_ProcessCommands(slave, buffer, sender); #endif - *bytesConsumed = ((int*)buffer)[0]; + *bytesConsumed = (int)ILibUnaligned_Read32(buffer); } int ILibDuktape_ScriptContainer_StartSlave(void *chain, ILibProcessPipe_Manager manager) @@ -3480,7 +3480,7 @@ duk_ret_t ILibDuktape_ScriptContainer_Exit(duk_context *ctx) duk_json_encode(ctx, -1); buffer = (char*)duk_get_lstring(ctx, -1, &bufferLen); - ((int*)header)[0] = (int)bufferLen + 4; + ILibUnaligned_Write32(header, (uint32_t)((int)bufferLen + 4)); ILibProcessPipe_Process_WriteStdIn(master->child, header, 4, ILibTransport_MemoryOwnership_USER); ILibProcessPipe_Process_WriteStdIn(master->child, buffer, (int)bufferLen, ILibTransport_MemoryOwnership_USER); //if (master->child != NULL) { ILibProcessPipe_Process_SoftKill(master->child); } @@ -3624,7 +3624,7 @@ void ILibDuktape_ScriptContainer_StdErrSink_MicrostackThread(void *chain, void * { ILibDuktape_ScriptContainer_Master *master = (ILibDuktape_ScriptContainer_Master*)((void**)user)[0]; char *buffer = (char*)((void**)user)[1]; - int bufferLen = ((int*)buffer)[0]; + int bufferLen = (int)ILibUnaligned_Read32(buffer); void *ptr; int i; duk_context *ctx = master->ctx; @@ -3721,9 +3721,9 @@ void ILibDuktape_ScriptContainer_StdErrSink(ILibProcessPipe_Process sender, char { ILibDuktape_ScriptContainer_Master* master = (ILibDuktape_ScriptContainer_Master*)user; - if (bufferLen < 4 || bufferLen < (size_t)((int*)buffer)[0]) { return; } + if (bufferLen < 4 || bufferLen < (size_t)(int)ILibUnaligned_Read32(buffer)) { return; } - *bytesConsumed = ((int*)buffer)[0]; + *bytesConsumed = (int)ILibUnaligned_Read32(buffer); #ifdef WIN32 if (ILibMemory_CanaryOK(sender)) { @@ -4158,7 +4158,7 @@ duk_ret_t ILibDuktape_ScriptContainer_Create(duk_context *ctx) duk_swap_top(ctx, -2); // [json][container] - ((int*)header)[0] = (int)bufferLen + 4; + ILibUnaligned_Write32(header, (uint32_t)((int)bufferLen + 4)); ILibProcessPipe_Process_AddHandlers(master->child, SCRIPT_ENGINE_PIPE_BUFFER_SIZE, ILibDuktape_ScriptContainer_ExitSink, ILibDuktape_ScriptContainer_StdOutSink, ILibDuktape_ScriptContainer_StdErrSink, ILibDuktape_ScriptContainer_SendOkSink, master); ILibProcessPipe_Process_WriteStdIn(master->child, header, sizeof(header), ILibTransport_MemoryOwnership_USER); ILibProcessPipe_Process_WriteStdIn(master->child, buffer, (int)bufferLen, ILibTransport_MemoryOwnership_USER); diff --git a/microstack/ILibParsers.c b/microstack/ILibParsers.c index 159a1af23..1baf59bfe 100644 --- a/microstack/ILibParsers.c +++ b/microstack/ILibParsers.c @@ -8598,7 +8598,7 @@ int ILibHashtable_DefaultBucketizer(int value) unsigned char tmp[4]; int retVal = 0; - ((unsigned int*)tmp)[0] = value; + ILibUnaligned_Write32(tmp, (uint32_t)value); retVal = (int)(tmp[0] ^ tmp[1] ^ tmp[2] ^ tmp[3]); //Klocwork is being retarded, and doesn't realize an unsigned int is 4 bytes return retVal; @@ -8616,32 +8616,32 @@ int ILibHashtable_DefaultHashFunc(void* Key1, char* Key2, int Key2Len) { if (Key2Len < 5) { - ((int*)tmp)[0] = 0; + ILibUnaligned_Write32(tmp, 0); for (i = 0; i < Key2Len; ++i) { tmp[i] = Key2[i]; } - retVal ^= ((int*)tmp)[0]; + retVal ^= (int)ILibUnaligned_Read32(tmp); } - + if (Key2Len > 4) { - ((int*)tmp)[0] = 0; + ILibUnaligned_Write32(tmp, 0); for (i = 0; i < 4; ++i) { tmp[i] = Key2[Key2Len - 1 - i]; } - retVal ^= ((int*)tmp)[0]; - + retVal ^= (int)ILibUnaligned_Read32(tmp); + if (Key2Len > 12) { int x = Key2Len / 2; - ((int*)tmp)[0] = 0; + ILibUnaligned_Write32(tmp, 0); for (i = 0; i < 4; ++i) { tmp[i] = Key2[i + x]; } - retVal ^= ((int*)tmp)[0]; + retVal ^= (int)ILibUnaligned_Read32(tmp); } } } diff --git a/microstack/ILibParsers.h b/microstack/ILibParsers.h index 6e95109ed..8a2838f49 100644 --- a/microstack/ILibParsers.h +++ b/microstack/ILibParsers.h @@ -173,6 +173,16 @@ void ILibDispatchSemaphore_post(sem_t* s); #include static inline void ignore_result(uintptr_t result) { (void)result; } +// Alignment-safe scalar access. Strict-alignment CPUs (MIPS, ARMv5/v6, RISC-V, SPARC) raise +// SIGBUS when a 16/32/64 bit load or store is issued against an unaligned address, so any wide +// access into a byte buffer at a runtime offset must go through these instead of a pointer cast. +static inline uint16_t ILibUnaligned_Read16(const void *src) { uint16_t v; memcpy(&v, src, sizeof(v)); return(v); } +static inline uint32_t ILibUnaligned_Read32(const void *src) { uint32_t v; memcpy(&v, src, sizeof(v)); return(v); } +static inline uint64_t ILibUnaligned_Read64(const void *src) { uint64_t v; memcpy(&v, src, sizeof(v)); return(v); } +static inline void ILibUnaligned_Write16(void *dst, uint16_t v) { memcpy(dst, &v, sizeof(v)); } +static inline void ILibUnaligned_Write32(void *dst, uint32_t v) { memcpy(dst, &v, sizeof(v)); } +static inline void ILibUnaligned_Write64(void *dst, uint64_t v) { memcpy(dst, &v, sizeof(v)); } + #if defined(_DEBUG) #define PRINTERROR() printf("ERROR in %s, line %d\r\n", __FILE__, __LINE__); #else @@ -463,13 +473,16 @@ int ILibIsRunningOnChainThread(void* chain); #define ILibChain_Link_SetMetadata(chainLink, value) if((chainLink)!=NULL) { ILibMemory_Free(((ILibChain_Link*)chainLink)->MetaData); ((ILibChain_Link*)chainLink)->MetaData = value; } #define ILibChain_Link_GetMetadata(chainLink) ((chainLink)==NULL?"":(((ILibChain_Link*)chainLink)->MetaData)) - #define ILibMemory_Canary (((int*)((char*)(const char*)"broe"))[0]) + #define ILibMemory_Canary ((int)ILibUnaligned_Read32("broe")) #define ILibMemory_RawPtr(ptr) ((char*)(ptr) - sizeof(ILibMemory_Header)) #define ILibMemory_RawSize(ptr) (ILibMemory_Size((ptr)) + ILibMemory_ExtraSize((ptr)) + sizeof(ILibMemory_Header)) #define ILibMemory_MemType(ptr) (((ILibMemory_Header*)ILibMemory_RawPtr((ptr)))->memoryType) #define ILibMemory_Size(ptr) (((ILibMemory_Header*)ILibMemory_RawPtr((ptr)))->size) #define ILibMemory_ExtraSize(ptr) (((ILibMemory_Header*)ILibMemory_RawPtr((ptr)))->extraSize) - #define ILibMemory_Ex_CanaryOK(ptr) ((ptr)==NULL?0:((((ILibMemory_Header*)ILibMemory_RawPtr((ptr)))->CANARY) == ILibMemory_Canary)) + // The canary is probed against pointers that may not be ILibMemory blocks at all (duktape + // buffers, list nodes). Every real one is malloc/alloca + sizeof(ILibMemory_Header), so a + // misaligned candidate can be rejected outright rather than faulted on (SIGBUS on MIPS). + #define ILibMemory_Ex_CanaryOK(ptr) (((ptr)==NULL || ((((uintptr_t)(ptr)) & (sizeof(void*) - 1)) != 0))?0:((((ILibMemory_Header*)ILibMemory_RawPtr((ptr)))->CANARY) == ILibMemory_Canary)) #ifdef WIN32 int ILibMemory_CanaryOK(void *ptr); #else diff --git a/microstack/ILibRemoteLogging.c b/microstack/ILibRemoteLogging.c index bc6cd5352..35e788c5e 100644 --- a/microstack/ILibRemoteLogging.c +++ b/microstack/ILibRemoteLogging.c @@ -635,8 +635,8 @@ void ILibRemoteLogging_FileTransport_CommandSink(ILibRemoteLogging sender, ILibR { if (dataLen == 4 && ft->logFile != NULL) { - unsigned short newModules = ntohs(((unsigned short*)data)[0]); - unsigned short newFlags = ntohs(((unsigned short*)data)[1]); + unsigned short newModules = ntohs(ILibUnaligned_Read16(data)); + unsigned short newFlags = ntohs(ILibUnaligned_Read16((char*)data + 2)); obj->Sessions[i].Flags = (newFlags & 0x3F) << 16; obj->Sessions[i].Flags |= (unsigned int)newModules; diff --git a/microstack/ILibRemoteLogging.h b/microstack/ILibRemoteLogging.h index 9a310701b..75e529b71 100644 --- a/microstack/ILibRemoteLogging.h +++ b/microstack/ILibRemoteLogging.h @@ -78,8 +78,8 @@ char* ILibRemoteLogging_ConvertAddress(struct sockaddr* addr); void ILibRemoteLogging_DeleteUserContext(ILibRemoteLogging logger, void *userContext); void ILibRemoteLogging_RegisterCommandSink(ILibRemoteLogging logger, ILibRemoteLogging_Modules module, ILibRemoteLogging_OnCommand sink); int ILibRemoteLogging_Dispatch(ILibRemoteLogging loggingModule, char* data, int dataLen, void *userContext); - #define ILibRemoteLogging_ReadModuleType(data) ((ILibRemoteLogging_Modules)ntohs(((unsigned short*)data)[0])) - #define ILibRemoteLogging_ReadFlags(data) ((ILibRemoteLogging_Flags)ntohs(((unsigned short*)data)[1])) + #define ILibRemoteLogging_ReadModuleType(data) ((ILibRemoteLogging_Modules)ntohs(ILibUnaligned_Read16((char*)(data)))) + #define ILibRemoteLogging_ReadFlags(data) ((ILibRemoteLogging_Flags)ntohs(ILibUnaligned_Read16(((char*)(data)) + 2))) int ILibRemoteLogging_IsModuleSet(ILibRemoteLogging loggingModule, ILibRemoteLogging_Modules module); void ILibRemoteLogging_Forward(ILibRemoteLogging loggingModule, char* data, int dataLen); #else diff --git a/microstack/ILibSimpleDataStore.c b/microstack/ILibSimpleDataStore.c index acb92eba3..0ddb2debb 100644 --- a/microstack/ILibSimpleDataStore.c +++ b/microstack/ILibSimpleDataStore.c @@ -69,7 +69,8 @@ Variable - Key Variable - Value ------------------------------------------ */ -#define ILibSimpleDataStore_RecordHeader_ValueOffset(h) (((uint64_t*)(((char*)h) - sizeof(uint64_t)))[0]) +#define ILibSimpleDataStore_RecordHeader_ValueOffset(h) ILibUnaligned_Read64(((char*)(h)) - sizeof(uint64_t)) +#define ILibSimpleDataStore_RecordHeader_SetValueOffset(h, v) ILibUnaligned_Write64(((char*)(h)) - sizeof(uint64_t), (v)) #pragma pack(push, 1) typedef struct ILibSimpleDataStore_RecordHeader_NG @@ -132,7 +133,7 @@ void ILibSimpleDataStore_CachedEx(ILibSimpleDataStore dataStore, char* key, size // This is a compresed entry char *tmpkey = (char*)ILibMemory_SmartAllocate(keyLen + sizeof(uint32_t)); memcpy_s(tmpkey, ILibMemory_Size(tmpkey), key, keyLen); - ((uint32_t*)(tmpkey + keyLen))[0] = crc32c(0, (unsigned char*)key, (uint32_t)keyLen); + ILibUnaligned_Write32(tmpkey + keyLen, crc32c(0, (unsigned char*)key, (uint32_t)keyLen)); key = tmpkey; keyLen = (int)ILibMemory_Size(key); } @@ -192,7 +193,7 @@ void ILibSimpleDataStore_Cached_GetValues_sink(ILibHashtable sender, void *Key1, // check if this is a compressed record if (Key2Len > sizeof(uint32_t)) { - if (((uint32_t*)(Key2 + Key2Len - sizeof(uint32_t)))[0] == crc32c(0, (unsigned char*)Key2, Key2Len - sizeof(uint32_t))) + if (ILibUnaligned_Read32(Key2 + Key2Len - sizeof(uint32_t)) == crc32c(0, (unsigned char*)Key2, Key2Len - sizeof(uint32_t))) { Key2Len -= sizeof(uint32_t); ILibInflate(entry->value, entry->valueLength, NULL, &tmpbufferLen, 0); @@ -308,7 +309,7 @@ ILibSimpleDataStore_RecordHeader_NG* ILibSimpleDataStore_ReadNextRecord(ILibSimp node->nodeSize = (int)ntohl(node->nodeSize); node->keyLen = (int)ntohl(node->keyLen); node->valueLength = (int)ntohl(node->valueLength); - ILibSimpleDataStore_RecordHeader_ValueOffset(node) = (uint64_t)((uint64_t)ILibSimpleDataStore_GetPosition(root->dataFile) + (uint64_t)node->keyLen); + ILibSimpleDataStore_RecordHeader_SetValueOffset(node, (uint64_t)((uint64_t)ILibSimpleDataStore_GetPosition(root->dataFile) + (uint64_t)node->keyLen)); if (node->keyLen > (int)((sizeof(ILibScratchPad) - nodeSize - sizeof(uint64_t)))) { @@ -345,7 +346,7 @@ ILibSimpleDataStore_RecordHeader_NG* ILibSimpleDataStore_ReadNextRecord(ILibSimp // Before we assume this is a bad hash check, we need to verify it's not a compressed node if (node->keyLen > sizeof(uint32_t)) { - if (crc32c(0, (unsigned char*)node->key, node->keyLen - sizeof(uint32_t)) == ((uint32_t*)(node->key + node->keyLen - sizeof(uint32_t)))[0]) + if (crc32c(0, (unsigned char*)node->key, node->keyLen - sizeof(uint32_t)) == ILibUnaligned_Read32(node->key + node->keyLen - sizeof(uint32_t))) { return(node); } @@ -676,7 +677,7 @@ __EXPORT_TYPE int ILibSimpleDataStore_PutEx2(ILibSimpleDataStore dataStore, char char *tmpkey = (char*)ILibMemory_SmartAllocate(keyLen + sizeof(int)); keyAllocated = 1; memcpy_s(tmpkey, ILibMemory_Size(tmpkey), key, keyLen); - ((uint32_t*)(tmpkey + keyLen))[0] = crc32c(0, (unsigned char*)tmpkey, (uint32_t)keyLen); // No dataloss, capped to INT32_MAX + ILibUnaligned_Write32(tmpkey + keyLen, crc32c(0, (unsigned char*)tmpkey, (uint32_t)keyLen)); // No dataloss, capped to INT32_MAX key = tmpkey; keyLen = (int)ILibMemory_Size(key); memcpy_s(hash, sizeof(hash), vhash, SHA384HASHSIZE); @@ -778,7 +779,7 @@ __EXPORT_TYPE int ILibSimpleDataStore_GetEx(ILibSimpleDataStore dataStore, char* size_t tmplen = 0; char *tmpkey = (char*)ILibMemory_SmartAllocate(keyLen + sizeof(uint32_t)); memcpy_s(tmpkey, ILibMemory_Size(tmpkey), key, keyLen); - ((uint32_t*)(tmpkey + keyLen))[0] = crc32c(0, (unsigned char*)key, (uint32_t)keyLen); // No dataloss, capped to INT32_MAX + ILibUnaligned_Write32(tmpkey + keyLen, crc32c(0, (unsigned char*)key, (uint32_t)keyLen)); // No dataloss, capped to INT32_MAX centry = (ILibSimpleDataStore_CacheEntry*)ILibHashtable_Get(root->cacheTable, NULL, tmpkey, (int)ILibMemory_Size(tmpkey)); if (centry != NULL) { @@ -817,7 +818,7 @@ __EXPORT_TYPE int ILibSimpleDataStore_GetEx(ILibSimpleDataStore dataStore, char* // Before returning an error, check if this is a compressed record char *tmpkey = (char*)ILibMemory_SmartAllocate(keyLen + sizeof(uint32_t)); memcpy_s(tmpkey, ILibMemory_Size(tmpkey), key, keyLen); - ((uint32_t*)(tmpkey + keyLen))[0] = crc32c(0, (unsigned char*)tmpkey, (uint32_t)keyLen); // no dataloss, capped to INT32_MAX + ILibUnaligned_Write32(tmpkey + keyLen, crc32c(0, (unsigned char*)tmpkey, (uint32_t)keyLen)); // no dataloss, capped to INT32_MAX entry = (ILibSimpleDataStore_TableEntry*)ILibHashtable_Get(root->keyTable, NULL, tmpkey, (int)ILibMemory_Size(tmpkey)); ILibMemory_Free(tmpkey); if (entry != NULL) { isCompressed = 1; } @@ -881,7 +882,7 @@ __EXPORT_TYPE char* ILibSimpleDataStore_GetHashEx(ILibSimpleDataStore dataStore, // Let's check if this is a compressed record entry char *tmpkey = (char*)ILibMemory_SmartAllocate(keyLen + sizeof(uint32_t)); memcpy_s(tmpkey, ILibMemory_Size(tmpkey), key, keyLen); - ((uint32_t*)(tmpkey + keyLen))[0] = crc32c(0, (unsigned char*)key, (uint32_t)keyLen); // no dataloss, capped to INT32_MAX + ILibUnaligned_Write32(tmpkey + keyLen, crc32c(0, (unsigned char*)key, (uint32_t)keyLen)); // no dataloss, capped to INT32_MAX centry = (ILibSimpleDataStore_CacheEntry*)ILibHashtable_Get(root->cacheTable, NULL, tmpkey, (int)ILibMemory_Size(tmpkey)); ILibMemory_Free(tmpkey); if (centry != NULL) @@ -901,7 +902,7 @@ __EXPORT_TYPE char* ILibSimpleDataStore_GetHashEx(ILibSimpleDataStore dataStore, // Before we return an error, let's check if this is a compressed record char* tmpkey = (char*)ILibMemory_SmartAllocate(keyLen + sizeof(uint32_t)); memcpy_s(tmpkey, ILibMemory_Size(tmpkey), key, keyLen); - ((uint32_t*)(tmpkey + keyLen))[0] = crc32c(0, (unsigned char*)key, (uint32_t)keyLen); + ILibUnaligned_Write32(tmpkey + keyLen, crc32c(0, (unsigned char*)key, (uint32_t)keyLen)); entry = (ILibSimpleDataStore_TableEntry*)ILibHashtable_Get(root->keyTable, NULL, tmpkey, (int)ILibMemory_Size(tmpkey)); ILibMemory_Free(tmpkey); } @@ -928,7 +929,7 @@ __EXPORT_TYPE int ILibSimpleDataStore_DeleteEx(ILibSimpleDataStore dataStore, ch // Check to see if this is a compressed record, before we return an error char *tmpkey = (char*)ILibMemory_SmartAllocate(keyLen + sizeof(uint32_t)); memcpy_s(tmpkey, ILibMemory_Size(tmpkey), key, keyLen); - ((uint32_t*)(tmpkey + keyLen))[0] = crc32c(0, (unsigned char*)key, (uint32_t)keyLen); // no dataloss, capped to INT32_MAX + ILibUnaligned_Write32(tmpkey + keyLen, crc32c(0, (unsigned char*)key, (uint32_t)keyLen)); // no dataloss, capped to INT32_MAX entry = (ILibSimpleDataStore_TableEntry*)ILibHashtable_Remove(root->keyTable, NULL, tmpkey, (int)ILibMemory_Size(tmpkey)); if (entry != NULL) { @@ -1036,7 +1037,7 @@ void ILibSimpleDataStore_EnumerateKeysSink(ILibHashtable sender, void *Key1, cha if (Key2Len > sizeof(uint32_t)) { // Check if this is a compressed entry - if (crc32c(0, (unsigned char*)Key2, Key2Len - sizeof(uint32_t)) == ((uint32_t*)(Key2 + Key2Len - sizeof(uint32_t)))[0]) + if (crc32c(0, (unsigned char*)Key2, Key2Len - sizeof(uint32_t)) == ILibUnaligned_Read32(Key2 + Key2Len - sizeof(uint32_t))) { Key2Len -= sizeof(uint32_t); } diff --git a/microstack/ILibWebClient.c b/microstack/ILibWebClient.c index c68dd1d91..093c546f0 100644 --- a/microstack/ILibWebClient.c +++ b/microstack/ILibWebClient.c @@ -1229,7 +1229,7 @@ ILibAsyncSocket_SendStatus ILibWebClient_WebSocket_Send(ILibWebClient_StateObjec char dataFrame[WEBSOCKET_MAX_OUTPUT_FRAMESIZE]; char header[10]; char maskKey[4]; - int maskKeyInt; + uint32_t maskKeyInt; int headerLen; unsigned short flags = WEBSOCKET_MASK; ILibAsyncSocket_SendStatus RetVal = ILibAsyncSocket_SEND_ON_CLOSED_SOCKET_ERROR; @@ -1287,10 +1287,10 @@ ILibAsyncSocket_SendStatus ILibWebClient_WebSocket_Send(ILibWebClient_StateObjec { // Mask the payload util_random(4, maskKey); - maskKeyInt = ((int*)maskKey)[0]; + maskKeyInt = ILibUnaligned_Read32(maskKey); if (bufferLen > 0) { int x; - for (x = 0; x < (bufferLen >> 2); ++x) { ((int*)dataFrame)[x] = ((int*)buffer)[x] ^ (int)maskKeyInt; } // Mask 4 bytes at a time + for (x = 0; x < (bufferLen >> 2); ++x) { ILibUnaligned_Write32(dataFrame + (x << 2), ILibUnaligned_Read32(buffer + (x << 2)) ^ maskKeyInt); } // Mask 4 bytes at a time for (x = (x << 2); x < bufferLen; ++x) { dataFrame[x] = buffer[x] ^ maskKey[x % 4]; } // Mask the reminder //for (x = 0; x < bufferLen; ++x) { dataFrame[x] = buffer[x] ^ maskKey[x % 4]; } // This is the slower version } @@ -1342,7 +1342,7 @@ int ILibWebClient_ProcessWebSocketData(char* buffer, int offset, int length, ILi if (length < 2) { return(offset); } // We need at least 2 bytes to read enough of the headers to know how long the frame is state = (ILibWebClient_WebSocketState*)wr->Buffer[0]; - hdr = ntohs(((unsigned short*)(buffer + offset))[0]); + hdr = ntohs(ILibUnaligned_Read16(buffer + offset)); FIN = (hdr & WEBSOCKET_FIN) != 0; OPCODE = (hdr & WEBSOCKET_OPCODE) >> 8; @@ -1350,7 +1350,7 @@ int ILibWebClient_ProcessWebSocketData(char* buffer, int offset, int length, ILi if (plen == 126) { if (length < 4) { return(offset); } // We need at least 4 bytes to read enough of the headers - plen = (unsigned short)ntohs(((unsigned short*)(buffer + offset))[1]); + plen = (unsigned short)ntohs(ILibUnaligned_Read16(buffer + offset + 2)); i += 2; } else if (plen == 127) diff --git a/microstack/ILibWebRTC.c b/microstack/ILibWebRTC.c index 64f45ad53..221998851 100644 --- a/microstack/ILibWebRTC.c +++ b/microstack/ILibWebRTC.c @@ -1510,7 +1510,7 @@ int ILibStun_WebRTC_UpdateOfferResponse(struct ILibStun_IceState *iceState, char if ((*answer = (char*)malloc(rlen + turnRecordSize)) == NULL) ILIBCRITICALEXIT(254); ((unsigned short*)(*answer))[0] = 1; // Block version number - ((unsigned int*)(*answer + 2))[0] = htonl(BlockFlags); // Block flags + ILibUnaligned_Write32(*answer + 2, htonl(BlockFlags)); // Block flags memcpy_s(*answer + 6, rlen + turnRecordSize - 6, iceState->userAndKey, 42); (*answer)[48] = (char)(iceState->parentStunModule->CertThumbprintLength); @@ -1518,8 +1518,8 @@ int ILibStun_WebRTC_UpdateOfferResponse(struct ILibStun_IceState *iceState, char (*answer)[49 + 32] = (char)LocalInterfaceListV4Len; for (i = 0; i < LocalInterfaceListV4Len; i++) { - ((int*)(*answer + 49 + 33 + (i * 6)))[0] = LocalInterfaceListV4[i].sin_addr.s_addr; - ((short*)(*answer + 49 + 33 + (i * 6) + 4))[0] = ((struct sockaddr_in*)(&(iceState->parentStunModule->LocalIf)))->sin_port; + ILibUnaligned_Write32(*answer + 49 + 33 + (i * 6), (uint32_t)LocalInterfaceListV4[i].sin_addr.s_addr); + ILibUnaligned_Write16(*answer + 49 + 33 + (i * 6) + 4, (uint16_t)((struct sockaddr_in*)(&(iceState->parentStunModule->LocalIf)))->sin_port); } if (LocalInterfaceListV4 != NULL) free(LocalInterfaceListV4); if (turnRecordSize > 0) @@ -2868,7 +2868,7 @@ int ILibStun_SetIceOffer2(void *StunModule, char* iceOffer, int iceOfferLen, cha memcpy_s(state->offerblock, iceOfferLen + candidateCount + 1, iceOffer, iceOfferLen); memset(state->offerblock + iceOfferLen, 0, candidateCount + 1); state->blockversion = ntohs(((unsigned short*)(state->offerblock))[0]); - state->blockflags = ntohl(((unsigned int*)(state->offerblock + 2))[0]); + state->blockflags = ntohl(ILibUnaligned_Read32(state->offerblock + 2)); state->rusernamelen = state->offerblock[6]; state->rusername = state->offerblock + 7; state->rkeylen = state->offerblock[7 + state->rusernamelen]; @@ -3136,14 +3136,15 @@ ILibTransport_DoneState ILibStun_SendSctpPacket(struct ILibStun_Module *obj, int { if (bufferLength < 12) return ILibTransport_DoneState_ERROR; - // Setup the header - ((unsigned short*)buffer)[0] = htons(obj->dTlsSessions[session]->inport); // Source port - ((unsigned short*)buffer)[1] = htons(obj->dTlsSessions[session]->outport); // Destination port - ((unsigned int*)buffer)[1] = obj->dTlsSessions[session]->tag; // Tag + // Setup the header. Callers pass rpacket->Data - 12, which is 2 mod 4 (packed struct), so + // the 32 bit header fields must not be stored through pointer casts. + ILibUnaligned_Write16(buffer, htons(obj->dTlsSessions[session]->inport)); // Source port + ILibUnaligned_Write16(buffer + 2, htons(obj->dTlsSessions[session]->outport)); // Destination port + ILibUnaligned_Write32(buffer + 4, obj->dTlsSessions[session]->tag); // Tag // Compute and put the CRC at the right place - ((unsigned int*)buffer)[2] = 0; - ((unsigned int*)buffer)[2] = crc32c(0, (unsigned char*)buffer, (uint32_t)bufferLength); + ILibUnaligned_Write32(buffer + 8, 0); + ILibUnaligned_Write32(buffer + 8, crc32c(0, (unsigned char*)buffer, (uint32_t)bufferLength)); ILibRemoteLogging_printf(ILibChainGetLogger(obj->ChainLink.ParentChain), ILibRemoteLogging_Modules_WebRTC_SCTP, ILibRemoteLogging_Flags_VerbosityLevel_4, "SCTP[%d] (%d): Send", session, bufferLength); @@ -3164,9 +3165,9 @@ ILibTransport_DoneState ILibStun_SendSctpPacket(struct ILibStun_Module *obj, int } if ((buffer + i)[0] == 0) { - ILibRemoteLogging_printf(ILibChainGetLogger(obj->ChainLink.ParentChain), ILibRemoteLogging_Modules_WebRTC_SCTP, ILibRemoteLogging_Flags_VerbosityLevel_4, "... TSN: %u", ntohl(((ILibSCTP_DataPayload*)(buffer + i))->TSN)); + ILibRemoteLogging_printf(ILibChainGetLogger(obj->ChainLink.ParentChain), ILibRemoteLogging_Modules_WebRTC_SCTP, ILibRemoteLogging_Flags_VerbosityLevel_4, "... TSN: %u", ntohl(ILibUnaligned_Read32(buffer + i + 4))); } - utmp = ntohs(((uint16_t*)(buffer + i))[1]); + utmp = ntohs(ILibUnaligned_Read16(buffer + i + 2)); i += utmp; if (utmp == 0) @@ -3178,7 +3179,7 @@ ILibTransport_DoneState ILibStun_SendSctpPacket(struct ILibStun_Module *obj, int ILibRemoteLogging_printf(ILibChainGetLogger(obj->ChainLink.ParentChain), ILibRemoteLogging_Modules_WebRTC_SCTP, ILibRemoteLogging_Flags_VerbosityLevel_5, "... Source: %u , Destination: %u", obj->dTlsSessions[session]->inport, obj->dTlsSessions[session]->outport); ILibRemoteLogging_printf(ILibChainGetLogger(obj->ChainLink.ParentChain), ILibRemoteLogging_Modules_WebRTC_SCTP, ILibRemoteLogging_Flags_VerbosityLevel_5, "... TAG: %u", obj->dTlsSessions[session]->tag); - ILibRemoteLogging_printf(ILibChainGetLogger(obj->ChainLink.ParentChain), ILibRemoteLogging_Modules_WebRTC_SCTP, ILibRemoteLogging_Flags_VerbosityLevel_5, "... Checksum: %u", ((unsigned int*)buffer)[2]); + ILibRemoteLogging_printf(ILibChainGetLogger(obj->ChainLink.ParentChain), ILibRemoteLogging_Modules_WebRTC_SCTP, ILibRemoteLogging_Flags_VerbosityLevel_5, "... Checksum: %u", ILibUnaligned_Read32(buffer + 8)); #ifdef _REMOTELOGGING ILibSctp_DebugSctpPacket(ILibChainGetLogger(obj->ChainLink.ParentChain), buffer, bufferLength, "ILibStun_SendSctpPacket"); @@ -3666,7 +3667,7 @@ void ILibStun_SctpProcessStreamData(struct ILibStun_Module *obj, int session, un unsigned short offset = ((ILibSCTP_PendingTSN_Data*)((char*)&o->pendingReconfigPacket))->Data.StreamIdOffset; int streamIdCount = (offset / 2) - 2; - if(((unsigned int*)(o->rpacket + o->rpacketsize - offset))[0] <= o->userTSN) + if(ILibUnaligned_Read32(o->rpacket + o->rpacketsize - offset) <= o->userTSN) { // The LastTSN specified by the peer has passed, so we can continue with the ChannelClose operation // Let's locally initiate a ChannelClose... We'll propagate the close in the response handler @@ -4014,7 +4015,7 @@ void ILibStun_SctpResent(struct ILibStun_dTlsSession *obj) ILibStun_SendSctpPacket(obj->parent, obj->sessionId, rpacket->Data - 12, rpacket->PacketSize); #ifdef _WEBRTCDEBUG //if (obj->onSendRetry != NULL) { obj->onSendRetry(obj, "OnSendRetry", ((unsigned short*)(rpacket->Data + sizeof(char*)))[0]); } - if (obj->onSendRetry != NULL) { obj->onSendRetry(obj, "OnSendRetry", ntohl(((unsigned int*)rpacket->Data)[1])); } + if (obj->onSendRetry != NULL) { obj->onSendRetry(obj, "OnSendRetry", ntohl(ILibUnaligned_Read32(rpacket->Data + 4))); } if (obj->onRetryPacket != NULL) { char *tmp = ILibMemory_AllocateA(rpacket->PacketSize + 14); @@ -4532,7 +4533,7 @@ void ILibStun_ProcessSctpPacket(struct ILibStun_Module *obj, int session, char* pending.Data.StreamIdOffset = (4 + (2*streamCount)); // We are going to store the TSN followed by the StreamIds - ((int*)(o->rpacket + o->rpacketsize - pending.Data.StreamIdOffset))[0] = lastTSN; + ILibUnaligned_Write32(o->rpacket + o->rpacketsize - pending.Data.StreamIdOffset, (uint32_t)lastTSN); for(i = 0; i < streamCount; ++i) { ((unsigned short*)(o->rpacket + o->rpacketsize - pending.Data.StreamIdOffset))[i+2] = ntohs(req->Streams[i]); @@ -5205,7 +5206,7 @@ void ILibStun_ProcessSctpPacket(struct ILibStun_Module *obj, int session, char* ILibStun_SctpDisconnect(obj, session); return; case RCTP_CHUNK_TYPE_COOKIEECHO: - o->SRTT = (int)(ILibGetUptime() - *((long long*)(buffer + ptr + 4))); + o->SRTT = (int)(ILibGetUptime() - (long long)ILibUnaligned_Read64(buffer + ptr + 4)); o->RTTVAR = o->SRTT / 2; o->RTO = o->SRTT + 4 * o->RTTVAR; o->SSTHRESH = 4 * ILibRUDP_StartMTU; @@ -6689,7 +6690,7 @@ void ILibTURN_ProcessChannelData(struct ILibTURN_TurnClientObject *turn, unsigne STUN_TYPE ILibTURN_GetMethodType(char* buffer, int offset, int length) { UNREFERENCED_PARAMETER(length); - return ((STUN_TYPE)ntohs(((unsigned short*)(buffer + offset))[0])); + return ((STUN_TYPE)ntohs(ILibUnaligned_Read16(buffer + offset))); } char* ILibTURN_GetTransactionID(char* buffer, int offset, int length) @@ -6717,7 +6718,7 @@ char* ILibTURN_GetErrorReason(char* buffer, int length) int ILibTURN_GetAttributeValue(char* buffer, int offset, int length, STUN_ATTRIBUTES attribute, int index, char** value) { - unsigned short messageLength = 20 + ntohs(((unsigned short*)(buffer + offset))[1]); + unsigned short messageLength = 20 + ntohs(ILibUnaligned_Read16(buffer + offset + 2)); int i = 0; UNREFERENCED_PARAMETER(length); @@ -6725,8 +6726,8 @@ int ILibTURN_GetAttributeValue(char* buffer, int offset, int length, STUN_ATTRIB offset += 20; while (offset + 4 <= messageLength) // Decode each attribute one at a time { - STUN_ATTRIBUTES current = (STUN_ATTRIBUTES)ntohs(((unsigned short*)(buffer + offset))[0]); - int attrLength = ntohs(((unsigned short*)(buffer + offset))[1]); + STUN_ATTRIBUTES current = (STUN_ATTRIBUTES)ntohs(ILibUnaligned_Read16(buffer + offset)); + int attrLength = ntohs(ILibUnaligned_Read16(buffer + offset + 2)); if (offset + 4 + attrLength > messageLength) return 0; if (attribute == current) @@ -6752,7 +6753,7 @@ int ILibTURN_GetAttributeStartLocation(char *buffer, int offset, int length, STU int ILibTURN_GetAttributeCount(char* buffer, int offset, int length, STUN_ATTRIBUTES attribute) { - unsigned short messageLength = 20 + ntohs(((unsigned short*)(buffer + offset))[1]); + unsigned short messageLength = 20 + ntohs(ILibUnaligned_Read16(buffer + offset + 2)); int retVal = 0; UNREFERENCED_PARAMETER(length); @@ -6760,8 +6761,8 @@ int ILibTURN_GetAttributeCount(char* buffer, int offset, int length, STUN_ATTRIB offset += 20; while (offset + 4 <= messageLength) // Decode each attribute one at a time { - STUN_ATTRIBUTES current = (STUN_ATTRIBUTES)ntohs(((unsigned short*)(buffer + offset))[0]); - int attrLength = ntohs(((unsigned short*)(buffer + offset))[1]); + STUN_ATTRIBUTES current = (STUN_ATTRIBUTES)ntohs(ILibUnaligned_Read16(buffer + offset)); + int attrLength = ntohs(ILibUnaligned_Read16(buffer + offset + 2)); if (offset + 4 + attrLength > messageLength) return 0; if (attribute == current) { ++retVal; } @@ -6816,7 +6817,7 @@ int ILibTURN_IsPacketAuthenticated(struct ILibTURN_TurnClientObject *turn, char* if (fingerprintLen > 0) { fingerprintIndex = ILibTURN_GetAttributeValue(buffer, offset, length, STUN_ATTRIB_FINGERPRINT, 0, NULL); - actual = 0x5354554e ^ ntohl(((unsigned int*)fingerprint)[0]); + actual = 0x5354554e ^ ntohl(ILibUnaligned_Read32(fingerprint)); calculated = ILibStun_CRC32(buffer + offset, fingerprintIndex); if (calculated != actual) { return 0; } } @@ -6824,15 +6825,15 @@ int ILibTURN_IsPacketAuthenticated(struct ILibTURN_TurnClientObject *turn, char* // Fix Length if there is a fingerprint if (fingerprintLen > 0) { - tempVal = ntohs(((unsigned short*)(buffer + offset))[1]); - ((unsigned short*)(buffer + offset))[1] = htons(tempVal - 8); + tempVal = ntohs(ILibUnaligned_Read16(buffer + offset + 2)); + ILibUnaligned_Write16(buffer + offset + 2, htons(tempVal - 8)); } ILibTURN_GenerateIntegrityKey(turn->username, turn->currentRealm, turn->password, integrityKey); ILibTURN_CalculateMessageIntegrity(buffer, offset, MessageIntegrityPtr, integrityKey, 16, integrity); // Put Length Back if we had to adjust the value due to fingerprint - if (fingerprintLen > 0) { ((unsigned short*)(buffer + offset))[1] = htons(tempVal); } + if (fingerprintLen > 0) { ILibUnaligned_Write16(buffer + offset + 2, htons(tempVal)); } if (MessageIntegrityValueLen == 20 && memcmp(MessageIntegrityValue, integrity, 20) == 0) { return 1; } @@ -7098,8 +7099,8 @@ void ILibTURN_ProcessStunFormattedPacket(struct ILibTURN_TurnClientObject *turn, int ILibTURN_GetStunPacketLength(char* buffer, int offset, int length) { - unsigned short messageLength = 20 + ntohs(((unsigned short*)(buffer + offset))[1]); - int magic = ntohl(((unsigned int*)(buffer + offset))[1]); + unsigned short messageLength = 20 + ntohs(ILibUnaligned_Read16(buffer + offset + 2)); + int magic = ntohl(ILibUnaligned_Read32(buffer + offset + 4)); if (messageLength > length || magic != 0x2112A442) // Check the length and magic string { return 0; @@ -7117,11 +7118,11 @@ void ILibTURN_TCP_OnData(ILibAsyncSocket_SocketModule socketModule, char* buffer if (endPointer >= 4) { - if (ntohs(((unsigned short*)(buffer + *p_beginPointer))[0]) >> 14 == 1) + if (ntohs(ILibUnaligned_Read16(buffer + *p_beginPointer)) >> 14 == 1) { // This is Channel Data - unsigned short ChannelNumber = (unsigned short)((int)ntohs(((unsigned short*)(buffer + *p_beginPointer))[0]) ^ (int)0x4000); - unsigned short ChannelDataLength = ntohs(((unsigned short*)(buffer + *p_beginPointer))[1]); + unsigned short ChannelNumber = (unsigned short)((int)ntohs(ILibUnaligned_Read16(buffer + *p_beginPointer)) ^ (int)0x4000); + unsigned short ChannelDataLength = ntohs(ILibUnaligned_Read16(buffer + *p_beginPointer + 2)); if (endPointer >= (4 + FOURBYTEBOUNDARY(ChannelDataLength))) { ILibTURN_ProcessChannelData(turn, ChannelNumber, buffer, *p_beginPointer + 4, ChannelDataLength); diff --git a/microstack/ILibWebServer.c b/microstack/ILibWebServer.c index dd0089571..d039e64ce 100644 --- a/microstack/ILibWebServer.c +++ b/microstack/ILibWebServer.c @@ -572,7 +572,7 @@ int ILibWebServer_ProcessWebSocketData(struct ILibWebServer_Session *ws, char* b if (length < 2) { return(offset); } // We need at least 2 bytes to read enough of the headers to know how long the frame is - hdr = ntohs(((unsigned short*)(buffer + offset))[0]); + hdr = ntohs(ILibUnaligned_Read16(buffer + offset)); FIN = (hdr & WEBSOCKET_FIN) != 0; OPCODE = (hdr & WEBSOCKET_OPCODE) >> 8; @@ -580,7 +580,7 @@ int ILibWebServer_ProcessWebSocketData(struct ILibWebServer_Session *ws, char* b if (plen == 126) { if (length < 4) { return(offset); } // We need at least 4 bytes to read enough of the headers - plen = (unsigned short)ntohs(((unsigned short*)(buffer + offset))[1]); + plen = (unsigned short)ntohs(ILibUnaligned_Read16(buffer + offset + 2)); i += 2; } else if (plen == 127) @@ -591,7 +591,7 @@ int ILibWebServer_ProcessWebSocketData(struct ILibWebServer_Session *ws, char* b } else { - unsigned long long v = ILibNTOHLL(((unsigned long long*)(buffer + offset + 2))[0]); + unsigned long long v = ILibNTOHLL(ILibUnaligned_Read64(buffer + offset + 2)); if(v > 0x7FFFFFFFUL) { // this value is too big to store in a 32 bit signed variable, so disconnect the websocket. @@ -1470,21 +1470,21 @@ int ILibWebServer_WebSocket_CreateHeader(char* header, unsigned short FLAGS, uns { retVal = 2; header1 |= payloadLength; - ((unsigned short*)header)[0] = htons(header1); + ILibUnaligned_Write16(header, htons(header1)); } else if (payloadLength <= 0xFFFF) { retVal = 4; header1 |= 126; - ((unsigned short*)header)[0] = htons(header1); - ((unsigned short*)header)[1] = htons((unsigned short)payloadLength); + ILibUnaligned_Write16(header, htons(header1)); + ILibUnaligned_Write16(header + 2, htons((unsigned short)payloadLength)); } else { retVal = 10; header1 |= 127; - ((unsigned short*)header)[0] = htons(header1); - ((unsigned long long*)(header + 2))[0] = ILibHTONLL((uint64_t)payloadLength); + ILibUnaligned_Write16(header, htons(header1)); + ILibUnaligned_Write64(header + 2, ILibHTONLL((uint64_t)payloadLength)); } return retVal; diff --git a/microstack/ILibWrapperWebRTC.c b/microstack/ILibWrapperWebRTC.c index 97b89e771..d97adacf0 100644 --- a/microstack/ILibWrapperWebRTC.c +++ b/microstack/ILibWrapperWebRTC.c @@ -136,11 +136,11 @@ void ILibWrapper_InitializeDataChannel_Transport(ILibWrapper_WebRTC_DataChannel short ILibWrapper_ReadShort(char* buffer, int offset) { - return(ntohs(((short*)(buffer+offset))[0])); + return(ntohs((short)ILibUnaligned_Read16(buffer+offset))); } int ILibWrapper_ReadInt(char* buffer, int offset) { - return(ntohl(((int*)(buffer+offset))[0])); + return(ntohl((int)ILibUnaligned_Read32(buffer+offset))); } char* ILibWrapper_ReadString(char* buffer, int offset, int length) { @@ -246,7 +246,7 @@ char* ILibWrapper_SdpToBlock(char* sdp, int sdpLen, int *isActive, char **userna pr3->FirstResult->NextResult->NextResult->NextResult->data[pr3->FirstResult->NextResult->NextResult->NextResult->datalength] = 0; candidateData[3] = (char)ILib_atoi2_int16(pr3->FirstResult->NextResult->NextResult->NextResult->data, pr3->FirstResult->NextResult->NextResult->NextResult->datalength); - ((unsigned short*)candidateData)[2] = htons(port); + ILibUnaligned_Write16(candidateData + 4, htons(port)); candidateData[6] = 0; ILibPushStack(&candidates, candidateData); @@ -277,10 +277,10 @@ char* ILibWrapper_SdpToBlock(char* sdp, int sdpLen, int *isActive, char **userna retVal = (char*)ILibMemory_SmartAllocateEx(blockLen, sizeof(int)); ptr = 0; - ((unsigned short*)(retVal+ptr))[0] = htons(1); + ILibUnaligned_Write16(retVal + ptr, htons(1)); ptr += 2; - ((unsigned int*)(retVal + ptr))[0] = htonl(BlockFlags); + ILibUnaligned_Write32(retVal + ptr, htonl(BlockFlags)); ptr += 4; (retVal)[ptr] = (char)usernameLen; @@ -399,18 +399,18 @@ int ILibWrapper_BlockToSDPEx(char* block, int blockLen, char** username, char** util_random(4, junk); - x = sprintf_s(*sdp, sdpLen, sdpTemplate1, ((unsigned int*)junk)[0]%1000000, *username, *password, dtlshash, isActive==0?"passive":"actpass"); + x = sprintf_s(*sdp, sdpLen, sdpTemplate1, ILibUnaligned_Read32(junk)%1000000, *username, *password, dtlshash, isActive==0?"passive":"actpass"); for(c = 1; c <= 2; ++c) { for (i = 0; i < candidatecount; i++) { ptr = i*6; - x += sprintf_s(*sdp+x, sdpLen-x, sdpTemplateLocalCand, i, c, 2128609535-i, (unsigned char)candidates[ptr], (unsigned char)candidates[ptr+1], (unsigned char)candidates[ptr+2], (unsigned char)candidates[ptr+3], ntohs(((unsigned short*)(candidates+ptr+4))[0])); + x += sprintf_s(*sdp+x, sdpLen-x, sdpTemplateLocalCand, i, c, 2128609535-i, (unsigned char)candidates[ptr], (unsigned char)candidates[ptr+1], (unsigned char)candidates[ptr+2], (unsigned char)candidates[ptr+3], ntohs(ILibUnaligned_Read16(candidates+ptr+4))); } if(serverReflexiveCandidateAddress!=NULL) { - x += sprintf_s(*sdp+x, sdpLen-x, sdpTemplateSrflxCand, i, c, 2128609535-i, serverReflexiveCandidateAddress, serverReflexiveCandidatePort, (unsigned char)candidates[0], (unsigned char)candidates[1], (unsigned char)candidates[2], (unsigned char)candidates[3], ntohs(((unsigned short*)(candidates+4))[0])); + x += sprintf_s(*sdp+x, sdpLen-x, sdpTemplateSrflxCand, i, c, 2128609535-i, serverReflexiveCandidateAddress, serverReflexiveCandidatePort, (unsigned char)candidates[0], (unsigned char)candidates[1], (unsigned char)candidates[2], (unsigned char)candidates[3], ntohs(ILibUnaligned_Read16(candidates+4))); ++i; } if(relayEndPoint!=NULL) From d216616549de54deb643575daccc332f8eb81ee8 Mon Sep 17 00:00:00 2001 From: Finn Hoffhenke <26007800+Finnlife@users.noreply.github.com> Date: Fri, 4 Sep 2026 13:28:31 +0200 Subject: [PATCH 60/68] Add an optional mTLS client certificate for server connections (#389) * Add optional mTLS client certificate for the server connection * Document the ClientCertPem option * Use the mTLS client certificate for relay tunnels as well --- meshcore/agentcore.c | 41 ++++++++++++++++++++++++++++++++++- meshcore/agentcore.h | 1 + microscript/ILibDuktape_net.c | 17 ++++++++++++++- microscript/ILibDuktape_net.h | 6 +++++ readme.md | 1 + 5 files changed, 64 insertions(+), 2 deletions(-) diff --git a/meshcore/agentcore.c b/meshcore/agentcore.c index 6854de61e..bf9e7989d 100644 --- a/meshcore/agentcore.c +++ b/meshcore/agentcore.c @@ -2496,6 +2496,39 @@ int agent_VerifyMeshCertificates(MeshAgentHostContainer *agent) if (i != 1) { return 1; } // Bad certificates return 0; } + +// Load the optional mTLS client certificate. This is only used for the outgoing connection to +// the server, it does not replace the agent certificate and has no effect on the NodeID. +// The PEM file has to hold the private key first, followed by the certificate. +void agent_LoadClientCertificate(MeshAgentHostContainer *agent) +{ + char certfile[1024]; + int len; + + agent->clientcert.flags = 0; + agent->clientcert.x509 = NULL; + agent->clientcert.pkey = NULL; + + if (agent->masterDb == NULL) { return; } + len = ILibSimpleDataStore_Get(agent->masterDb, "ClientCertPem", NULL, 0); + if (len <= 0 || len >= (int)sizeof(certfile)) { return; } + + ILibSimpleDataStore_Get(agent->masterDb, "ClientCertPem", certfile, (int)sizeof(certfile)); + certfile[sizeof(certfile) - 1] = 0; + + if (util_from_pem(certfile, &(agent->clientcert)) == -1) + { + // util_from_pem does not clean up after itself, so the key may be set even on failure + if (agent->clientcert.pkey != NULL) { EVP_PKEY_free(agent->clientcert.pkey); agent->clientcert.pkey = NULL; } + agent->clientcert.x509 = NULL; + ILIBLOGMESSAGEX("Unable to load mTLS client certificate: %s", certfile); + return; + } + + // Also hand it to the script engine, the relay tunnels are opened from there + ILibDuktape_ClientCert = &(agent->clientcert); + ILIBLOGMESSAGEX("Loaded mTLS client certificate: %s", certfile); +} #endif @@ -5455,7 +5488,11 @@ int MeshAgent_AgentMode(MeshAgentHostContainer *agentHost, int paramLen, char ** #endif #ifndef MICROSTACK_NOTLS - if (agentHost->selftlscert.x509 == NULL) { + agent_LoadClientCertificate(agentHost); + if (agentHost->clientcert.x509 != NULL) { + // An mTLS client certificate was configured, use that one instead. + ILibWebClient_EnableHTTPS(agentHost->httpClientManager, &(agentHost->clientcert), NULL, ValidateMeshServer, agentHost); + } else if (agentHost->selftlscert.x509 == NULL) { // We don't have a TLS certificate, so setup the client without one. ILibWebClient_EnableHTTPS(agentHost->httpClientManager, NULL, NULL, ValidateMeshServer, agentHost); } else { @@ -6444,6 +6481,8 @@ int MeshAgent_Start(MeshAgentHostContainer *agentHost, int paramLen, char **para void MeshAgent_Destroy(MeshAgentHostContainer* agent) { #ifndef MICROSTACK_NOTLS + ILibDuktape_ClientCert = NULL; + util_freecert(&agent->clientcert); util_freecert(&agent->selftlscert); util_freecert(&agent->selfcert); #endif diff --git a/meshcore/agentcore.h b/meshcore/agentcore.h index d731eb4c1..56bc1e73b 100644 --- a/meshcore/agentcore.h +++ b/meshcore/agentcore.h @@ -231,6 +231,7 @@ typedef struct MeshAgentHostContainer #endif struct util_cert selfcert; struct util_cert selftlscert; + struct util_cert clientcert; // Optional mTLS client cert, set with the "ClientCertPem" setting char serverWebHash[UTIL_SHA384_HASHSIZE]; #endif diff --git a/microscript/ILibDuktape_net.c b/microscript/ILibDuktape_net.c index 252d7183c..7dc783ade 100644 --- a/microscript/ILibDuktape_net.c +++ b/microscript/ILibDuktape_net.c @@ -87,6 +87,12 @@ typedef struct ILibDuktape_net_server_session int ILibDuktape_TLS_ctx2socket = -1; int ILibDuktape_TLS_ctx2server = -1; +#ifndef MICROSTACK_NOTLS +// Optional mTLS client certificate, set by the agent when "ClientCertPem" is configured. +// Only used for outgoing TLS connections, see ILibDuktape_TLS_connect(). +struct util_cert *ILibDuktape_ClientCert = NULL; +#endif + #ifdef WIN32 #define ILibDuktape_net_IPC_BUFFERSIZE 4096 typedef struct ILibDuktape_net_WindowsIPC @@ -2451,7 +2457,16 @@ duk_ret_t ILibDuktape_TLS_connect(duk_context *ctx) { return(ILibDuktape_Error(ctx, "Invalid SecureContext Object")); } - SSL_CTX_set_verify(data->ssl_ctx, SSL_VERIFY_PEER, ILibDuktape_TLS_verify); /* Ask for authentication */ + SSL_CTX_set_verify(data->ssl_ctx, SSL_VERIFY_PEER, ILibDuktape_TLS_verify); /* Ask for authentication */ + + // If the agent has an mTLS client certificate, present it on outgoing connections. The caller + // can still supply its own certificate with "pfx", in that case we leave it alone. + if ((ILibDuktape_ClientCert != NULL) && (ILibDuktape_ClientCert->x509 != NULL) && (duk_has_prop_string(ctx, 0, "pfx") == 0)) + { + SSL_CTX_use_certificate(data->ssl_ctx, ILibDuktape_ClientCert->x509); + SSL_CTX_use_PrivateKey(data->ssl_ctx, ILibDuktape_ClientCert->pkey); + } + if (duk_has_prop_string(ctx, 0, "ALPNProtocols")) { duk_uarridx_t i; diff --git a/microscript/ILibDuktape_net.h b/microscript/ILibDuktape_net.h index 471945260..542be9ba1 100644 --- a/microscript/ILibDuktape_net.h +++ b/microscript/ILibDuktape_net.h @@ -28,6 +28,12 @@ limitations under the License. #define ILibDuktape_SOCKET2OPTIONS "\xFF_NET_SOCKET2OPTIONS" void ILibDuktape_net_init(duk_context *ctx, void *chain); +#ifndef MICROSTACK_NOTLS +// Optional mTLS client certificate used for outgoing TLS connections made from the script engine +struct util_cert; +extern struct util_cert *ILibDuktape_ClientCert; +#endif + typedef struct ILibDuktape_globalTunnel_data { struct sockaddr_in6 proxyServer; diff --git a/readme.md b/readme.md index 37b83586b..2849a7cb6 100644 --- a/readme.md +++ b/readme.md @@ -38,6 +38,7 @@ Here is a list of the possible keys that are currently supported by the agent. N |---|---| | `AgentCapabilities` | Bitmask specifying supported agent capabilities. | | `agentName` | If set, sent to the server instead of the hostname. | +| `ClientCertPem` | Path to a PEM file holding a private key followed by a certificate. If set, this certificate is presented as the TLS client certificate on the control channel and on relay tunnels, for example when the server sits behind a reverse proxy that requires mTLS. Does not affect the agent identity certificate or the NodeID. | | `compactDirtyMinimum` | Minimum dirty bytes threshold for the `db.compact()` operation. | | `consoleTextMaxRate` | Rate limit for `sendConsoleText`. Default is 10 messages per second. | | `controlChannelDebug` | If set, logs/displays control channel messages (except JSON messages). | From 121233e472e3b66ecc78e43dc1cb7edc96f4d13e Mon Sep 17 00:00:00 2001 From: PTR <47147771+PTR-inc@users.noreply.github.com> Date: Fri, 4 Sep 2026 13:41:39 +0200 Subject: [PATCH 61/68] Drop the libutil dependency in FreeBSD and OpenBSD (#387) Fixes 'ld-elf.so.1: Shared object "libutil.so.9" not found, required by "meshagent"' libutil's SONAME is not stable across FreeBSD releases (.so.9 on 14.x vs .so.10 on 15.x), so a binary linked against one fails to load on the other. Meshagent needed libutil for only one symbol: forkpty() - Reimplement forkpty() locally from libc POSIX primitives instead of linking -lutil. --- makefile | 4 +-- microstack/ILibProcessPipe.c | 69 +++++++++++++++++++++++++++++++++--- 2 files changed, 66 insertions(+), 7 deletions(-) diff --git a/makefile b/makefile index f6fa4cf9f..351a7a370 100644 --- a/makefile +++ b/makefile @@ -836,11 +836,11 @@ macos: $(STRIP) freebsd: - $(MAKE) EXENAME="$(EXENAME)_$(ARCHNAME)$(EXENAME2)" ADDITIONALSOURCES="$(LINUXKVMSOURCES)" AID="$(ARCHID)" CFLAGS="-std=gnu99 -Wall -DJPEGMAXBUF=$(KVMMaxTile) -DMESH_AGENTID=$(ARCHID) -D_POSIX -D_FREEBSD -D_NOHECI -D_NOILIBSTACKDEBUG -DMICROSTACK_PROXY -fno-strict-aliasing $(INCDIRS) $(CFLAGS) $(CEXTRA)" LDFLAGS="$(BSDSSL) $(BSDFLAGS) -L. -lpthread -ldl -lz -lutil $(LDFLAGS) $(LDEXTRA)" + $(MAKE) EXENAME="$(EXENAME)_$(ARCHNAME)$(EXENAME2)" ADDITIONALSOURCES="$(LINUXKVMSOURCES)" AID="$(ARCHID)" CFLAGS="-std=gnu99 -Wall -DJPEGMAXBUF=$(KVMMaxTile) -DMESH_AGENTID=$(ARCHID) -D_POSIX -D_FREEBSD -D_NOHECI -D_NOILIBSTACKDEBUG -DMICROSTACK_PROXY -fno-strict-aliasing $(INCDIRS) $(CFLAGS) $(CEXTRA)" LDFLAGS="$(BSDSSL) $(BSDFLAGS) -L. -lpthread -ldl -lz $(filter-out -lutil,$(LDFLAGS)) $(LDEXTRA)" $(SYMBOLCP) $(STRIP) openbsd: - $(MAKE) EXENAME="$(EXENAME)_$(ARCHNAME)$(EXENAME2)" ADDITIONALSOURCES="$(LINUXKVMSOURCES)" AID="$(ARCHID)" CFLAGS="-std=gnu99 -Wall -DJPEGMAXBUF=$(KVMMaxTile) -DMESH_AGENTID=$(ARCHID) -D_POSIX -D_FREEBSD -D_OPENBSD -D_NOHECI -D_NOILIBSTACKDEBUG -DMICROSTACK_PROXY -fno-strict-aliasing $(INCDIRS) $(CFLAGS) $(CEXTRA)" LDFLAGS="$(BSDSSL) $(BSDFLAGS) -L. -lpthread -lz -lutil $(LDFLAGS) $(LDEXTRA)" + $(MAKE) EXENAME="$(EXENAME)_$(ARCHNAME)$(EXENAME2)" ADDITIONALSOURCES="$(LINUXKVMSOURCES)" AID="$(ARCHID)" CFLAGS="-std=gnu99 -Wall -DJPEGMAXBUF=$(KVMMaxTile) -DMESH_AGENTID=$(ARCHID) -D_POSIX -D_FREEBSD -D_OPENBSD -D_NOHECI -D_NOILIBSTACKDEBUG -DMICROSTACK_PROXY -fno-strict-aliasing $(INCDIRS) $(CFLAGS) $(CEXTRA)" LDFLAGS="$(BSDSSL) $(BSDFLAGS) -L. -lpthread -lz $(filter-out -lutil,$(LDFLAGS)) $(LDEXTRA)" $(SYMBOLCP) $(STRIP) diff --git a/microstack/ILibProcessPipe.c b/microstack/ILibProcessPipe.c index f74b83824..96efeaaac 100644 --- a/microstack/ILibProcessPipe.c +++ b/microstack/ILibProcessPipe.c @@ -41,12 +41,12 @@ limitations under the License. #if defined(__APPLE__) #include #else + // open/freebsd #include -#ifdef _OPENBSD - #include -#else - #include -#endif + // added for ILibProcessPipe_ForkPTY_BSD() + #include + #include + #include #endif #endif #endif @@ -595,6 +595,65 @@ void ILibProcessPipe_Process_HardKill(ILibProcessPipe_Process p) +#if defined(_FREEBSD) +// Local replacement for libutil's forkpty() +// Same interface as the real forkpty(): opens a pty pair, forks, and in the child makes the slave +// side its controlling terminal on fd 0/1/2. Returns the child's pid to the parent +// (with *amaster set to the master fd, matching forkpty()'s out-param), 0 to the +// child, or -1 with errno set on failure. +static pid_t ILibProcessPipe_ForkPTY_BSD(int *amaster, struct termios *termp, struct winsize *winp) +{ + int master, slave; + char slaveName[128]; + pid_t pid; + + if ((master = posix_openpt(O_RDWR | O_NOCTTY)) < 0) { return(-1); } + if (grantpt(master) != 0 || unlockpt(master) != 0) { close(master); return(-1); } +#ifdef _OPENBSD + // OpenBSD has no ptsname_r() -- libc exports only ptsname(), and + // declares just "char *ptsname(int)". It returns a pointer to static storage, + // which is safe here only because the name is copied out immediately below, + // before anything else can call ptsname() on this thread. + { + char *nm = ptsname(master); + if (nm == NULL) { close(master); return(-1); } + if (strnlen_s(nm, sizeof(slaveName)) >= sizeof(slaveName)) { close(master); errno = ENAMETOOLONG; return(-1); } + strcpy_s(slaveName, sizeof(slaveName), nm); + } +#else + if (ptsname_r(master, slaveName, sizeof(slaveName)) != 0) { close(master); return(-1); } +#endif + if ((slave = open(slaveName, O_RDWR | O_NOCTTY)) < 0) { close(master); return(-1); } + + if ((pid = fork()) < 0) + { + int e = errno; + close(slave); close(master); + errno = e; + return(-1); + } + if (pid == 0) + { + // Child: master is of no use here, only the slave side is inherited. + close(master); + if (setsid() < 0) { _exit(1); } + if (ioctl(slave, TIOCSCTTY, (char*)NULL) < 0) { _exit(1); } + if (termp != NULL) { tcsetattr(slave, TCSANOW, termp); } + if (winp != NULL) { ioctl(slave, TIOCSWINSZ, winp); } + dup2(slave, STDIN_FILENO); + dup2(slave, STDOUT_FILENO); + dup2(slave, STDERR_FILENO); + if (slave > STDERR_FILENO) { close(slave); } + return(0); + } + // Parent: the slave is only needed by the child. + close(slave); + *amaster = master; + return(pid); +} +#define forkpty(amaster, name, termp, winp) ILibProcessPipe_ForkPTY_BSD(amaster, termp, winp) +#endif + ILibProcessPipe_Process ILibProcessPipe_Manager_SpawnProcessEx4(ILibProcessPipe_Manager pipeManager, char* target, char* const* parameters, ILibProcessPipe_SpawnTypes spawnType, void *sid, void *envvars, int extraMemorySize) { ILibProcessPipe_Process_Object* retVal = NULL; From 8939b7a754cce9e0b33e54dcb9f4423f0c8000d8 Mon Sep 17 00:00:00 2001 From: denis Date: Fri, 4 Sep 2026 14:47:12 +0300 Subject: [PATCH 62/68] Fix agent failover getting stuck on one MeshServer entry with no proxy (#388) Co-authored-by: denis --- meshcore/agentcore.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/meshcore/agentcore.c b/meshcore/agentcore.c index bf9e7989d..5e11dd632 100644 --- a/meshcore/agentcore.c +++ b/meshcore/agentcore.c @@ -4125,6 +4125,10 @@ void MeshServer_ConnectEx(MeshAgentHostContainer *agent) useproxy = len; } } + else + { + agent->triedNoProxy_Index = agent->serverIndex; + } #ifndef MICROSTACK_NOTLS ILibParseUriResult result = ILibParseUri(serverUrl, &host, &port, &path, useproxy ? NULL : &meshServer); #else From 469d885e4aeefbb46419e90198d18224337eeba6 Mon Sep 17 00:00:00 2001 From: PTR <47147771+PTR-inc@users.noreply.github.com> Date: Fri, 4 Sep 2026 13:51:57 +0200 Subject: [PATCH 63/68] makefile: build the Alpine agent with musl when cross-compiling (#378) ARCHID 33 set no CC, so it fell through to the default "CC = gcc" and the agent was compiled against glibc. Every other musl target already names its compiler explicitly; this one was the exception. With CC set the same way the OpenSSL archive is built, the agent comes out native musl: -idirafter rather than -I is deliberate and required: musl-gcc drives the host gcc with -nostdinc, so kernel headers are not on the include path and is not found. Appending the system directories after musl's lets musl win for everything it provides while linux/* and asm/* come from the host; -I would shadow musl's headers with glibc's. --- makefile | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/makefile b/makefile index 351a7a370..c3a392abb 100644 --- a/makefile +++ b/makefile @@ -218,6 +218,20 @@ OBJECTS = $(patsubst %.c,%.o, $(SOURCES)) CC = gcc STRIP = strip +# Compiler for the Alpine / musl x86-64 target (ARCHID 33) +# Building natively on Alpine it resolves to the host gcc, which is already musl. +# For cross-compile: apt install musl-tools. +# musl-gcc drives the host gcc with -nostdinc and musl's own include path, so +# the kernel headers are not on it and cannot be found. +# -idirafter appends the system directories AFTER musl's, so musl still wins +# for everything it provides and only linux/* and asm/* come from the host. +# Do not use -I here - that would shadow musl's headers with glibc's. +# On Alpine none of that applies: musl-gcc does not exist there and +# /usr/include/x86_64-linux-gnu is a Debian path, so detect a musl host +# compiler and use it as-is. Override with "make MUSL_CC=..." for any other +# musl toolchain. +MUSL_CC ?= $(shell gcc -dumpmachine 2>/dev/null | grep -q musl && echo gcc || echo musl-gcc -idirafter /usr/include/x86_64-linux-gnu -idirafter /usr/include) + # Need to be separate for dependency generation INCDIRS = -I. -Iopenssl/include -Imicrostack -Imicroscript -Imeshcore -Imeshconsole @@ -253,6 +267,7 @@ endif ifeq ($(ARCHID),33) ARCHNAME = alpine-x86-64 +CC = $(MUSL_CC) KVM=0 CRASH_HANDLER=0 endif From afb0dfe26ff300fa06375011d23f22c1f991e410 Mon Sep 17 00:00:00 2001 From: Simon Smith Date: Fri, 4 Sep 2026 13:07:05 +0100 Subject: [PATCH 64/68] Add musl-tools to Linux build workflow Added musl-tools to the list of installed packages for the build process. --- .github/workflows/linux-build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/linux-build.yml b/.github/workflows/linux-build.yml index e54a5d56a..31232d670 100644 --- a/.github/workflows/linux-build.yml +++ b/.github/workflows/linux-build.yml @@ -13,7 +13,7 @@ jobs: run: | sudo dpkg --add-architecture i386 && sudo apt clean all && sudo apt update && - sudo apt-get install -y libx11-dev libxtst-dev libxext-dev libjpeg62-dev build-essential && + sudo apt-get install -y libx11-dev libxtst-dev libxext-dev libjpeg62-dev build-essential musl-tools && sudo apt-get install -y linux-libc-dev:i386 libc6-dev-i386 libjpeg62-dev:i386 && sudo apt-get install -y libc6-armel-cross libc6-dev-armel-cross binutils-arm-linux-gnueabi libncurses5-dev gcc-arm-linux-gnueabihf && sudo apt-get install -y libxrandr-dev libwayland-dev libdrm-dev libegl-dev libgles-dev From fb8ae4a438a97fd47030ae42f302f40d5d24759f Mon Sep 17 00:00:00 2001 From: Juan Pablo Tamayo Date: Fri, 4 Sep 2026 08:12:07 -0400 Subject: [PATCH 65/68] =?UTF-8?q?Fix=20#359:=20macOS=2026=20(Tahoe)=20KVM?= =?UTF-8?q?=20relay=20crash=20=E2=80=94=20continues=20#362=20with=20review?= =?UTF-8?q?=20feedback=20+=20working=20macOS=20CI=20(#380)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * SafeDuktape_CallMethod: guard pcall against stale stream heapptrs When a heap-stashed object (e.g. state->writeStream) has been closed, GC'd, or replaced between the moment its heapptr was captured and the moment we call one of its methods, the old code went: duk_get_prop_string(ctx, -1, "write"); // returns undefined ... duk_pcall_method(ctx, N); // TypeError: ... of undefined Because the failure originates from a native callback, the error cannot be reached by a JS try/catch. Duktape then promotes it to a fatal, and ILibDuktape_ScriptContainer_Engine_fatal exits the process with ILIBCRITICALEXITMSG(254, ...). This is the dominant crash mode on macOS 26 (Tahoe) when the KVM LaunchAgent (`meshagent-launchagent`) restarts faster than the daemon can clean up the relay socket (see issue #359). Add ILibDuktape_SafePcallMethod: a thin wrapper that: - Verifies the callable is actually a function (the Duktape pcall_method layout puts the callable at -(nargs + 2) and `this` at -(nargs + 1)). - If not, drops the (callable, this, args) from the stack and routes to Process_UncaughtExceptionEx so the engine keeps running. - Otherwise behaves exactly like duk_pcall_method, but also routes any pcall error to Process_UncaughtExceptionEx (consistent with the existing idiom used 100+ times in this codebase). Apply at the four hot spots that have caused fatal-promotion crashes in the field: ILibDuktape_HttpStream.c (server response write paths, including chunked transfer encoding) and ILibDuktape_ReadableStream.c (pipe chain dispatch). (cherry picked from commit f2bfaf25798918dfbea978c9a3b12fd6037d722d) * mac_kvm: validate peer + cap retries on Tahoe LaunchAgent socket (fix #359) After PR #349 (a20c31f) introduced the user-LaunchAgent relay path (/tmp/meshagent-kvm-.sock) for macOS Tahoe, the daemon's kvm_relay_setup() wraps an AF_UNIX fd in ILibProcessPipe_Pipe and returns it to the JS engine. The engine then takes the JS-side stream's heapptr, calls .write() on it later from a native callback, and if anything has closed the underlying pipe since the connect(), the next .write() raises 'cannot read property "write" of undefined' on the C side. That error originates from a native callback, so no JS try/catch can catch it, and Duktape promotes it to a fatal that calls ILibDuktape_ScriptContainer_Engine_fatal -> ILIBCRITICALEXITMSG(254). Every 1-12 minutes the agent exits 254, launchd relaunches it, and Remote Desktop never renders. Companion SIGSEGV (KERN_INVALID_ADDRESS at 0x40) is the same family with the heapptr dereferenced unchecked. The actual root cause: stat() reports the socket file as present even after a LaunchAgent crash leaves a stale entry in /tmp, and connect() can return 0 briefly when the agent is mid-shutdown. We then wrap a phantom pipe. Two fixes, layered: 1. Peer credential validation (the actual root cause fix). Immediately after a successful connect(), use getpeereid() to check the peer's uid matches the one we were told to connect as, and getsockopt(SOL_LOCAL, LOCAL_PEERPID) to fetch the peer's pid (Apple-specific since 10.4; a small fallback define guards older SDKs). If the peer doesn't look like the LaunchAgent, close the fd, treat as transient, and retry. The path that caused #359 was a peer that was about to die — its pid was still resolvable but its pipe would not survive the first .write(). 2. Retry hardening. - maxRetries 5 -> 8 (total budget ~3.65s vs ~1.55s; the LaunchAgent can take a couple of seconds to rebind after a session change). - Replace 'usleep(50000 << attempt)' with a small static backoff table capped at 800ms. On 32-bit int, the shift would silently wrap to small sleeps past attempt=4. Not the proximate cause of #359, but the symptom was that high-attempt retries were happening back-to-back with no real backoff, increasing the chance of connecting to a phantom peer. - Add explicit 'giving up' log with the last connect() errno so future debugging doesn't have to reverse-engineer why the socket path returned NULL. - Treat ILibProcessPipe_Pipe_CreateFromExisting returning NULL as a transient retry rather than a hard failure that would fall through to a half-initialized pipe. NOT changed (deliberately): the 'socket exists but unreachable -> return NULL' policy from PR #349. Falling back to fork-exec on Tahoe lands the helper in the wrong audit session and produces black-screen / dead-input. Returning NULL and letting the caller surface the error to MeshCentral is the correct behavior; the improvement here is that, with peer validation, we no longer return NULL *after* having wrapped a phantom pipe. Bump MESH_VER 194 -> 195 (makefile:195) per the protocol-visible- change policy. The peer-validation step is local to the daemon and does not change the wire format, but the LaunchAgent fallback semantics and retry budget do affect the agent's lifecycle behavior and are worth flagging on the wire. Files: - meshcore/KVM/MacOS/mac_kvm.c: includes, new helper kvm_relay_socket_validate_peer(), modified kvm_relay_setup(). - makefile: MESH_VER 194 -> 195. Verification: read-only review on Linux host. Build for macOS ('make macos ARCHID=16|29') requires Xcode SDK and cannot run on this host. Reviewer must run a Mac build + a Tahoe KVM session-replay test before merge. Companion commit: f2bfaf2 (ILibDuktape_SafePcallMethod) which turns the fatal-promotion crash from a hard exit(254) into a soft uncaughtException on the rare paths where the heapptr goes stale anyway. (cherry picked from commit 2c68429e5dc398269250092e9c2fe19e098fc3f1) * ci: add macOS build smoke test for #359 Triggered on push to the fix branch and on PRs to master that touch any of the files modified by the fix. Builds ARCHID=16 (x86_64) on macos-13 and ARCHID=29 (arm64) on macos-14 with 'make macos', uploads the binaries as artifacts. Intentionally narrow: it does not start the agent or attempt to reproduce the runtime crash; the build itself is the evidence that the new kvm_relay_socket_validate_peer() helper, the modified kvm_relay_setup() retry loop, and the B-side ILibDuktape_SafePcallMethod changes compile and link on real Apple toolchains. (cherry picked from commit eb44059367ea831f46908e967c8524fe7ff0a69d) * ci: switch x86_64 macos runner to macos-13-large (macos-13 queue saturated) The previous macos-13 job for the x86_64 build remained queued for 30+ minutes after the arm64 (macos-14) job had already finished in under a minute. macos-13 is the last Intel-based image and its runner pool is more constrained than the Apple Silicon pool. Switch to macos-13-large (same OS, more resources, often a different runner pool) to unblock the workflow. (cherry picked from commit 41001617cc914b01f5791c5da73aa7bfe9228051) * ci(macos): use GitHub-hosted macos-13 (not macos-13-large) macos-13-large is a self-hosted-only label; jobs requesting it on a GH-hosted fork stay queued forever (observed: 30+ min on x86_64 job of run 2, runner_id never assigned). Switch back to the standard macos-13 GitHub-hosted label. If the standard macos-13 queue is ever saturated in the future, the only valid alternative for x86_64 is to switch to a self-hosted runner (documented inline). (cherry picked from commit b02635cba96bebd53f961bcdc547e1b37fd15b86) * ci(macos): address review on #362 and unblock the x86_64 job Two changes, both CI-only. No functional change to the fix itself. 1. Review feedback from @si458 on #362: drop `paths` and the branch-pinned `push` trigger, leaving just `pull_request: branches: [master]`, so the workflow matches the other build workflows in this repo and Actions rebuilds a binary on every push to a PR (the `pull_request` event re-fires on `synchronize`). 2. The x86_64 job could never have produced that binary: it targeted `macos-13`, the last Intel image, which GitHub is retiring. Jobs requesting it are not assigned a runner and get cancelled by the 24h queue timeout -- in @fsmw's fork that job was cancelled exactly 24h after it started, and upstream this PR has zero check runs to this day. It now cross-compiles from an Apple silicon runner, which the makefile already supports: ARCHID=16 builds with `CC = gcc -arch x86_64`, and both third-party dependencies are checked in per architecture (lib-jpeg-turbo/macos/osx-x86-64/libturbojpeg.a and openssl/libstatic/macos/osx-x86-64), so nothing in the build depends on the runner's own architecture. The previous comment in the workflow said a self-hosted runner was the only alternative; it is not, and the comment is corrected. * Remove macOS PR build/test workflow per reviewer request (#380) --------- Co-authored-by: Fernando --- makefile | 2 +- meshcore/KVM/MacOS/mac_kvm.c | 137 +++++++++++++++++++++-- microscript/ILibDuktape_Helpers.c | 48 ++++++++ microscript/ILibDuktape_Helpers.h | 16 +++ microscript/ILibDuktape_HttpStream.c | 8 +- microscript/ILibDuktape_ReadableStream.c | 2 +- 6 files changed, 199 insertions(+), 14 deletions(-) diff --git a/makefile b/makefile index c3a392abb..24601ac6a 100644 --- a/makefile +++ b/makefile @@ -192,7 +192,7 @@ SOURCES += $(ADDITIONALSOURCES) SOURCES += meshcore/agentcore.c meshconsole/main.c meshcore/meshinfo.c # Mesh Agent settings -MESH_VER = 194 +MESH_VER = 195 EXENAME = meshagent # Cross-compiler paths diff --git a/meshcore/KVM/MacOS/mac_kvm.c b/meshcore/KVM/MacOS/mac_kvm.c index 6d576904c..04394338a 100644 --- a/meshcore/KVM/MacOS/mac_kvm.c +++ b/meshcore/KVM/MacOS/mac_kvm.c @@ -34,6 +34,22 @@ limitations under the License. #include #include +#include +#include + +// Some macOS SDKs (notably older Xcode / SDK 10.x) did not export +// LOCAL_PEERPID in even though the kernel supports it. +// Define it here as a fallback so we can always query the connected +// peer's pid via getsockopt(). This is the macOS-specific way to +// validate that the daemon's IPC peer really is the user-LaunchAgent +// meshagent process (and not, e.g., a stale socket file from a +// crashed helper that was re-bound by an unrelated process). See +// issue #359: stale /tmp/meshagent-kvm-.sock files used to +// cause the daemon to wrap a phantom socket in ILibProcessPipe_Pipe +// and then crash on the first .write() with "of undefined". +#ifndef LOCAL_PEERPID +#define LOCAL_PEERPID 0x102 +#endif int KVM_Listener_FD = -1; // Socket path used when kvm_server_mainloop runs in socket-listener @@ -956,6 +972,56 @@ static void kvm_relay_socket_BrokenHandler(ILibProcessPipe_Pipe sender) kvm_relay_socket_ResetState(0); } +// Validate that the connected peer of an AF_UNIX socket really is the +// meshagent LaunchAgent we expect (i.e. an agent running as the same +// uid we were asked to connect to, and owned by the current user, not +// a stale socket file from a crashed helper or a symlink to something +// else). +// +// Returns 1 if the peer credentials look right, 0 otherwise. On +// platforms / builds that lack getpeereid() (extremely rare on +// macOS — it's been there since 10.4) we conservatively return 1 +// rather than blocking the socket path. The crash-class of #359 +// happens AFTER a connect() that returns 0, so the validation only +// fires for sockets that would otherwise be accepted; we are not +// adding a new failure mode. +static int kvm_relay_socket_validate_peer(int fd, int expectedUid, const char *socketPath) +{ +#if defined(__APPLE__) + uid_t peerUid = (uid_t)-1; + gid_t peerGid = (gid_t)-1; + if (getpeereid(fd, &peerUid, &peerGid) != 0) + { + fprintf(stderr, "meshagent: kvm-relay: getpeereid() failed on %s: %s (errno=%d) — treating as untrusted peer\n", + socketPath, strerror(errno), errno); + return(0); + } + if ((int)peerUid != expectedUid) + { + fprintf(stderr, "meshagent: kvm-relay: peer uid=%d on %s does not match expected uid=%d — refusing to attach\n", + (int)peerUid, socketPath, expectedUid); + return(0); + } + // Also ask the kernel for the peer's pid (Apple-specific + // LOCAL_PEERPID option). If the peer exists but reports an + // unplausible pid (0, -1) we treat that as a hint the peer + // is a phantom and bail out. + pid_t peerPid = -1; + socklen_t plen = sizeof(peerPid); + if (getsockopt(fd, 0, LOCAL_PEERPID, &peerPid, &plen) == 0 && peerPid <= 0) + { + fprintf(stderr, "meshagent: kvm-relay: peer pid=%d on %s is unplausible — refusing to attach\n", + (int)peerPid, socketPath); + return(0); + } + return(1); +#else + UNREFERENCED_PARAMETER(fd); + UNREFERENCED_PARAMETER(expectedUid); + UNREFERENCED_PARAMETER(socketPath); + return(1); +#endif +} // Setup the KVM session. Return 1 if ok, 0 if it could not be setup. void* kvm_relay_setup(char *exePath, void *processPipeMgr, ILibKVM_WriteHandler writeHandler, void *reserved, int uid) { @@ -994,23 +1060,75 @@ void* kvm_relay_setup(char *exePath, void *processPipeMgr, ILibKVM_WriteHandler { int fd = -1; int attempt; - for (attempt = 0; attempt < 5; attempt++) + const int maxRetries = 8; + // Per-attempt backoff in microseconds. Capped at 800ms so + // that even at the high end we stay well under one second + // per attempt; the previous `50000 << attempt` would have + // shifted into the millions on a 32-bit int and silently + // wrapped to a very small sleep once attempt >= 4. + static const int backoffUs[8] = { + 50000, 100000, 200000, 400000, 800000, 800000, 800000, 800000 + }; + int lastConnectErrno = 0; + for (attempt = 0; attempt < maxRetries; attempt++) { fd = socket(AF_UNIX, SOCK_STREAM, 0); - if (fd < 0) break; + if (fd < 0) + { + lastConnectErrno = errno; + fprintf(stderr, "meshagent: kvm-relay: socket() failed on attempt %d: %s (errno=%d)\n", + attempt, strerror(errno), errno); + break; + } struct sockaddr_un addr; memset(&addr, 0, sizeof(addr)); addr.sun_family = AF_UNIX; strncpy(addr.sun_path, socketPath, sizeof(addr.sun_path) - 1); if (connect(fd, (struct sockaddr*)&addr, SUN_LEN(&addr)) == 0) { - // Agent is up. Wrap the connected socket in a Pipe so - // the daemon's existing Pipe_Write / read-handler paths - // work without changes elsewhere in the codebase. + // Connected. Before wrapping the fd in a Pipe, confirm + // the peer is actually the user-LaunchAgent we expect. + // This blocks a whole class of crashes where a stale + // /tmp/meshagent-kvm-.sock (left behind by a + // crashed helper) gets re-bound by an unrelated + // process, the daemon connects, and the very first + // .write() through ILibProcessPipe_Pipe becomes a + // "cannot read property 'write' of undefined" that + // promotes to ILIBCRITICALEXITMSG(254). See #359. + if (!kvm_relay_socket_validate_peer(fd, uid, socketPath)) + { + fprintf(stderr, "meshagent: kvm-relay: peer validation failed on %s (attempt %d) — closing and retrying\n", + socketPath, attempt); + close(fd); + fd = -1; + // Treat the bad peer as transient; the agent + // may rebind the socket correctly on the next + // pass. We still want to fall back to fork-exec + // if it never recovers. + lastConnectErrno = ECONNREFUSED; + usleep((useconds_t)backoffUs[attempt]); + continue; + } g_kvmSocketFD = fd; g_kvmSocketWriteHandler = writeHandler; g_kvmSocketReserved = reserved; g_kvmSocketPipe = ILibProcessPipe_Pipe_CreateFromExisting((ILibProcessPipe_Manager)processPipeMgr, fd); + if (g_kvmSocketPipe == NULL) + { + // CreateFromExisting can fail if the fd is in a + // weird state, the manager is full, or memory is + // exhausted. Don't leak the fd or return a half- + // initialized pipe — close it and retry, just + // like a transient connect() failure. + fprintf(stderr, "meshagent: kvm-relay: Pipe_CreateFromExisting returned NULL on %s (attempt %d) — closing and retrying\n", + socketPath, attempt); + close(fd); + g_kvmSocketFD = -1; + fd = -1; + lastConnectErrno = ECONNREFUSED; + usleep((useconds_t)backoffUs[attempt]); + continue; + } ILibProcessPipe_Pipe_AddPipeReadHandler(g_kvmSocketPipe, 65535, &kvm_relay_socket_ReadHandler); ILibProcessPipe_Pipe_SetBrokenPipeHandler(g_kvmSocketPipe, &kvm_relay_socket_BrokenHandler); ILibProcessPipe_Pipe_ResetMetadata(g_kvmSocketPipe, "KVM user-LaunchAgent socket"); @@ -1018,17 +1136,20 @@ void* kvm_relay_setup(char *exePath, void *processPipeMgr, ILibKVM_WriteHandler ILibMemory_Free(user); // not used in socket mode return(g_kvmSocketPipe); } + lastConnectErrno = errno; close(fd); fd = -1; // Transient failure (ECONNREFUSED on agent re-accept, - // or similar). Back off briefly: 50ms, 100ms, 200ms, - // 400ms, 800ms — total ~1.55s before giving up. - usleep(50000 << attempt); + // or similar). Back off briefly. Capped table above; + // total budget across 8 attempts is ~3.65s. + usleep((useconds_t)backoffUs[attempt]); } // Socket exists but unreachable after retries. Don't fall // back to fork-exec — that path is broken on Tahoe and // would produce black-screen / dead-input. Return NULL // to let the caller surface the error to MeshCentral. + fprintf(stderr, "meshagent: kvm-relay: giving up on %s after %d attempts (last errno=%d: %s)\n", + socketPath, maxRetries, lastConnectErrno, strerror(lastConnectErrno)); ILibMemory_Free(user); return(NULL); } diff --git a/microscript/ILibDuktape_Helpers.c b/microscript/ILibDuktape_Helpers.c index d8eae706e..bf3bec671 100644 --- a/microscript/ILibDuktape_Helpers.c +++ b/microscript/ILibDuktape_Helpers.c @@ -762,6 +762,54 @@ void ILibDuktape_Process_UncaughtExceptionEx(duk_context *ctx, char *format, ... duk_pop(emitter->ctx); // ... } } +// Safe wrapper around duk_pcall_method for callbacks that operate on a +// heap-stashed object (e.g. state->writeStream). Without this guard, when +// the object has been closed, GC'd, or replaced since the heapptr was +// captured, duk_get_prop_string(..., "write") returns undefined, the +// following duk_pcall_method raises "cannot read property 'write' of +// undefined", and because the call originates from a native callback the +// error cannot reach a JS try/catch -> Duktape promotes it to a fatal -> +// the engine calls Engine_fatal and the process exits with code 254. +// +// Usage: replace +// duk_get_prop_string(ctx, -1, "write"); // [..., this, write] +// if (duk_pcall_method(ctx, N) != 0) { ... } +// with +// duk_get_prop_string(ctx, -1, "write"); // [..., this, write] +// if (ILibDuktape_SafePcallMethod(ctx, N, "module.fn() ") != 0) { ... } +// +// Stack contract: +// - On entry: the top of stack holds the last argument pushed, and below +// it, in order, the remaining nargs-1 arguments, then `this`, then the +// callable (Duktape pcall_method layout). +// - On success: the callable, `this`, and all args are popped; the return +// value (if any) is on top of the stack. +// - On missing/non-function callable: the callable, `this`, and the args +// are popped; no return value is left on the stack. +// - On pcall error: the error object is on top; we pop it after routing +// to Process_UncaughtExceptionEx. +int ILibDuktape_SafePcallMethod(duk_context *ctx, int nargs, const char *where) +{ + if (ctx == NULL || !duk_ctx_is_alive(ctx) || duk_ctx_shutting_down(ctx)) { return(-1); } + // In Duktape's pcall_method layout [..., callable, this, arg1, ..., argN], + // `callable` is at index -(nargs + 2) and `this` at -(nargs + 1). + if (!duk_is_function(ctx, -(nargs + 2))) + { + // The "callable" is not a function. This is the bug-shape that used + // to crash the engine. Pop the (callable, this, arg1..argN) and + // surface a soft error via the normal uncaughtException sink. + duk_pop_n(ctx, nargs + 2); + ILibDuktape_Process_UncaughtExceptionEx(ctx, "SafePcallMethod: target not callable (%s)", where ? where : "?"); + return(-1); + } + int rc = duk_pcall_method(ctx, nargs); + if (rc != 0) + { + ILibDuktape_Process_UncaughtExceptionEx(ctx, "%s", where ? where : "SafePcallMethod"); + duk_pop(ctx); + } + return(rc); +} // Error MUST be at top of stack when calling this method void ILibDuktape_Process_UncaughtException(duk_context *ctx) { diff --git a/microscript/ILibDuktape_Helpers.h b/microscript/ILibDuktape_Helpers.h index 4cbbc9fc4..9bae01202 100644 --- a/microscript/ILibDuktape_Helpers.h +++ b/microscript/ILibDuktape_Helpers.h @@ -181,6 +181,22 @@ void ILibDuktape_SetNativeUncaughtExceptionHandler(duk_context *ctx, ILibDuktape void ILibDuktape_Process_UncaughtException(duk_context *ctx); void ILibDuktape_Process_UncaughtExceptionEx(duk_context *ctx, char *format, ...); +// Safe wrapper around duk_pcall_method for invocations where the target method +// is fetched from a heap-stash pointer that may have become stale (stream was +// closed, GC moved it, etc.). Verifies the callable is a function before the +// pcall, and routes any resulting error to Process_UncaughtExceptionEx instead +// of leaving an unhandled exception on the Duktape stack (which Duktape would +// then promote to a fatal, triggering ILIBCRITICALEXITMSG(254, ...)). +// +// Stack on entry: [..., callable, this, arg1, ..., argN] (Duktape pcall_method layout) +// Stack on success: same depth minus (nargs + 2); return value of callable on top. +// Stack on missing callable: same depth minus (nargs + 2); no return value. +// Stack on pcall error: same depth as success minus 1 (error is consumed by sink). +// +// Returns 0 on success, non-zero if the callable was missing/non-function or +// the pcall itself threw. The caller does NOT need to pop anything extra. +int ILibDuktape_SafePcallMethod(duk_context *ctx, int nargs, const char *where); + duk_ret_t ILibDuktape_Error(duk_context *ctx, char *format, ...); typedef void(*ILibDuktape_IndependentFinalizerHandler)(duk_context *ctx, void *object); int ILibDuktape_Process_GetExitCode(duk_context *ctx); diff --git a/microscript/ILibDuktape_HttpStream.c b/microscript/ILibDuktape_HttpStream.c index ac0663bbc..8154a5357 100644 --- a/microscript/ILibDuktape_HttpStream.c +++ b/microscript/ILibDuktape_HttpStream.c @@ -2248,7 +2248,7 @@ void ILibDuktape_HttpStream_ServerResponse_WriteImplicitHeaders(void *chain, voi // We can just directly write the data duk_config_buffer(state->ctx, -3, state->buffer, state->bufferLen); duk_push_buffer_object(state->ctx, -3, 0, state->bufferLen, DUK_BUFOBJ_NODEJS_BUFFER); // [ext][write][this][buffer] - retVal = duk_pcall_method(state->ctx, 1); + retVal = ILibDuktape_SafePcallMethod(state->ctx, 1, "http.serverResponse.writeImplicitHeaders(): stream.write() "); duk_pop_2(state->ctx); // ... } else @@ -2306,14 +2306,14 @@ void ILibDuktape_HttpStream_ServerResponse_WriteSink_Chain(void *chain, void *us int tmpLen = sprintf_s(tmp, sizeof(tmp), "%X\r\n", (int)state->bufferLen); duk_config_buffer(state->ctx, -4, tmp, tmpLen); duk_push_buffer_object(state->ctx, -4, 0, tmpLen, DUK_BUFOBJ_NODEJS_BUFFER); // [ext][stream][write][this][buffer] - if (duk_pcall_method(state->ctx, 1) != 0) { duk_pop_2(state->ctx); return; } + if (ILibDuktape_SafePcallMethod(state->ctx, 1, "http.serverResponse.WriteSink_Chain: stream.write(chunkHeader) ") != 0) { duk_pop_2(state->ctx); return; } duk_pop(state->ctx); // [ext][stream] duk_get_prop_string(state->ctx, -1, "write"); // [ext][stream][write] duk_dup(state->ctx, -2); // [ext][stream][write][this] } duk_config_buffer(state->ctx, -4, state->buffer, state->bufferLen); duk_push_buffer_object(state->ctx, -4, 0, state->bufferLen, DUK_BUFOBJ_NODEJS_BUFFER); // [ext][stream][write][this][buffer] - if (duk_pcall_method(state->ctx, 1) != 0) { duk_pop_2(state->ctx); return; } + if (ILibDuktape_SafePcallMethod(state->ctx, 1, "http.serverResponse.WriteSink_Chain: stream.write(body) ") != 0) { duk_pop_2(state->ctx); return; } noDrain = duk_get_int(state->ctx, -1); duk_pop(state->ctx); // [ext][stream] if (state->chunk) @@ -2324,7 +2324,7 @@ void ILibDuktape_HttpStream_ServerResponse_WriteSink_Chain(void *chain, void *us duk_config_buffer(state->ctx, -4, tmp, 2); duk_push_buffer_object(state->ctx, -4, 0, state->bufferLen, DUK_BUFOBJ_NODEJS_BUFFER);// [ext][stream][write][this][buffer] - if (duk_pcall_method(state->ctx, 1) != 0) { duk_pop_2(state->ctx); return; } + if (ILibDuktape_SafePcallMethod(state->ctx, 1, "http.serverResponse.WriteSink_Chain: stream.write(chunkTrailer) ") != 0) { duk_pop_2(state->ctx); return; } noDrain = duk_get_int(state->ctx, -1); duk_pop(state->ctx); // [ext][stream] } diff --git a/microscript/ILibDuktape_ReadableStream.c b/microscript/ILibDuktape_ReadableStream.c index c9cdfe39b..865566f69 100644 --- a/microscript/ILibDuktape_ReadableStream.c +++ b/microscript/ILibDuktape_ReadableStream.c @@ -247,7 +247,7 @@ int ILibDuktape_readableStream_WriteDataEx_Chain_Dispatch(ILibDuktape_readableSt duk_push_c_function(stream->ctx, ILibDuktape_readableStream_WriteDataEx_Flush, DUK_VARARGS);// [ext][write][this][buffer][flush] duk_push_pointer(stream->ctx, stream); // [ext][write][this][buffer][flush][ptr] duk_put_prop_string(stream->ctx, -2, "\xFF_STREAM"); // [ext][write][this][buffer][flush] - if (duk_pcall_method(stream->ctx, 2) != 0) // [ext][...] + if (ILibDuktape_SafePcallMethod(stream->ctx, 2, "readableStream.WriteDataEx_Chain: ws.write(buffer, flush) ") != 0) // [ext][...] { ILibDuktape_Process_UncaughtExceptionEx(stream->ctx, "readable.write(): Error Piping "); if (ILibDuktape_readableStream_WriteData_Flush(NULL, stream)) { retVal = 2; } From a37277a69bec0a22729eb20fc5af48d7e849c1d8 Mon Sep 17 00:00:00 2001 From: PTR <47147771+PTR-inc@users.noreply.github.com> Date: Fri, 4 Sep 2026 14:17:34 +0200 Subject: [PATCH 66/68] Fix GCing of pending setTimeout/setInterval timers (#373) Only setImmediate was pinned in the heap stash, so setTimeout/setInterval objects the caller didn't retain/reference could be GC'd and silently cancelled by their finalizer. This made unreferenced setTimout/setIntervals unreliable. Fix: Root all timers at init and release on elapse/clear. --- microscript/ILibDuktape_Polyfills.c | 32 ++++++++++++++--------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/microscript/ILibDuktape_Polyfills.c b/microscript/ILibDuktape_Polyfills.c index bd4278a08..277a452ad 100644 --- a/microscript/ILibDuktape_Polyfills.c +++ b/microscript/ILibDuktape_Polyfills.c @@ -1183,12 +1183,10 @@ void ILibDuktape_Polyfills_timer_elapsed(void *obj) } else { - if (ptrs->timerType == ILibDuktape_Timer_Type_IMMEDIATE) - { - duk_push_heap_stash(ctx); - duk_del_prop_string(ctx, -1, Duktape_GetStashKey(ptrs->object)); - duk_pop(ctx); - } + // setTimeout/setImmediate: release reference now it has fired. + duk_push_heap_stash(ctx); + duk_del_prop_string(ctx, -1, Duktape_GetStashKey(ptrs->object)); + duk_pop(ctx); duk_del_prop_string(ctx, -2, "\xFF_callback"); duk_del_prop_string(ctx, -2, "\xFF_argArray"); @@ -1236,11 +1234,6 @@ duk_ret_t ILibDuktape_Polyfills_timer_set(duk_context *ctx) case ILibDuktape_Timer_Type_IMMEDIATE: ILibDuktape_WriteID(ctx, "Timers.immediate"); metadata = "setImmediate()"; - // We're only saving a reference for immediates - duk_push_heap_stash(ctx); //[retVal][stash] - duk_dup(ctx, -2); //[retVal][stash][immediate] - duk_put_prop_string(ctx, -2, Duktape_GetStashKey(duk_get_heapptr(ctx, -1))); //[retVal][stash] - duk_pop(ctx); //[retVal] break; case ILibDuktape_Timer_Type_INTERVAL: ILibDuktape_WriteID(ctx, "Timers.interval"); @@ -1251,6 +1244,13 @@ duk_ret_t ILibDuktape_Polyfills_timer_set(duk_context *ctx) metadata = "setTimeout()"; break; } + + // save all timer references so they can't be GC'd while running + duk_push_heap_stash(ctx); //[retVal][stash] + duk_dup(ctx, -2); //[retVal][stash][timer] + duk_put_prop_string(ctx, -2, Duktape_GetStashKey(duk_get_heapptr(ctx, -1))); //[retVal][stash] + duk_pop(ctx); //[retVal] + ILibDuktape_CreateFinalizer(ctx, ILibDuktape_Polyfills_timer_finalizer); ptrs = (ILibDuktape_Timer*)Duktape_PushBuffer(ctx, sizeof(ILibDuktape_Timer)); //[retVal][ptrs] @@ -1309,12 +1309,10 @@ duk_ret_t ILibDuktape_Polyfills_timer_clear(duk_context *ctx) duk_get_prop_string(ctx, 0, ILibDuktape_Timer_Ptrs); ptrs = (ILibDuktape_Timer*)Duktape_GetBuffer(ctx, -1, NULL); - if (ptrs->timerType == ILibDuktape_Timer_Type_IMMEDIATE) - { - duk_push_heap_stash(ctx); - duk_del_prop_string(ctx, -1, Duktape_GetStashKey(ptrs->object)); - duk_pop(ctx); - } + // release timer reference so it can be GC'd + duk_push_heap_stash(ctx); + duk_del_prop_string(ctx, -1, Duktape_GetStashKey(ptrs->object)); + duk_pop(ctx); ILibLifeTime_Remove(ILibGetBaseTimer(Duktape_GetChain(ctx)), ptrs); return 0; From a611a36ffa71026dce33db54712f0be93d547d92 Mon Sep 17 00:00:00 2001 From: PTR <47147771+PTR-inc@users.noreply.github.com> Date: Fri, 4 Sep 2026 14:34:49 +0200 Subject: [PATCH 67/68] ILibCrypto: Build system tls store more robust and only once (#379) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Build the system TLS trust store once per process, lazy where possible, shared with every SSL_CTX. Robust certpath lookup instead of shelling out to openssl for every context. The vendor OpenSSL's compiled-in path is /usr/local/ssl, which no distribution normally uses. Every util_load_system_certs() call therefore found X509_get_default_cert_dir() pointing at a missing directory and fell back to popen("openssl version -d") — a shell, resolved through $PATH, once per SSL_CTX. The original code even carried a comment calling this a security risk. macOS now reads the Keychain anchors directly (Security.framework), just like Windows reading the system ROOT store (default anchor set only; admin trust overrides are not consulted). Linux has no standard mechanism, so the unofficial one is implemented: SSL_CERT_FILE/SSL_CERT_DIR env vars first well-known rehashed cert directories, validated, registered lazily well-known CA bundles (loaded in full) last resort: 'openssl version -d' via execve from absolute paths - no shell, minimal env, 3s timeout - then OpenSSL's own defaults. Side note: stock agent to server TLS never consults this store (the server is pinned; meshcore.js disables chain verification everywhere), so even total failure isn't fatal. It only matters for custom scripts verifying against public CAs. The real gain is one store, built once, shared by reference. On Windows (lazy by-subject ROOT-store lookup) and Linux with a rehashed dir it stays empty until a handshake requests an issuer. MacOS and bundle-only systems load all, once. Previously every SSL_CTX built its own: a full system-store copy on Windows, the shell-out on Linux/macOS. * Make macos 10.12 (Sierra) the minimum Needed for functions used --- makefile | 2 +- microstack/ILibCrypto.c | 472 +++++++++++++++++++++++++++++++++++----- 2 files changed, 414 insertions(+), 60 deletions(-) diff --git a/makefile b/makefile index 24601ac6a..e04fe5cb2 100644 --- a/makefile +++ b/makefile @@ -331,7 +331,7 @@ ifeq ($(ARCHID),16) ARCHNAME = osx-x86-64 KVM = 1 LMS = 0 -MACOSARCH = -mmacosx-version-min=10.5 +MACOSARCH = -mmacosx-version-min=10.12 CC = gcc -arch x86_64 endif diff --git a/microstack/ILibCrypto.c b/microstack/ILibCrypto.c index 0fc294b36..498e3cdff 100644 --- a/microstack/ILibCrypto.c +++ b/microstack/ILibCrypto.c @@ -34,8 +34,24 @@ limitations under the License. #include #include #include -#ifdef _POSIX +#if defined(_POSIX) || defined(__APPLE__) #include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef __APPLE__ +#include +#include +#endif #endif #else #ifdef WIN32 @@ -522,68 +538,406 @@ void __fastcall util_openssl_uninit() #endif } -int __fastcall util_load_system_certs(SSL_CTX *ctx) +// In milliseconds +#ifndef ILibCrypto_OPENSSL_SUBPROCESS_TIMEOUT +#define ILibCrypto_OPENSSL_SUBPROCESS_TIMEOUT 3000 +#endif + +// OS/Distro CA bundles, checked after the directories +#ifndef ILibCrypto_KNOWN_CERT_FILES +#define ILibCrypto_KNOWN_CERT_FILES \ + "/etc/ssl/certs/ca-certificates.crt", \ + "/etc/pki/tls/certs/ca-bundle.crt", \ + "/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem", \ + "/etc/ssl/ca-bundle.pem", \ + "/etc/ssl/cert.pem", \ + "/private/etc/ssl/cert.pem", \ + "/usr/local/share/certs/ca-root-nss.crt" +#endif + +// Well-known CA certificate directories, checked in order +#ifndef ILibCrypto_KNOWN_CERT_DIRS +#define ILibCrypto_KNOWN_CERT_DIRS \ + "/etc/ssl/certs", \ + "/etc/pki/tls/certs", \ + "/usr/local/etc/openssl/certs", \ + "/etc/openssl/certs", \ + "/System/Library/OpenSSL/certs", \ + "/usr/local/ssl/certs" +#endif + +// Absolute paths for the openssl binary, anti path-hijack measure +#ifndef ILibCrypto_OPENSSL_BINDIRS +#define ILibCrypto_OPENSSL_BINDIRS \ + "/usr/bin/openssl", \ + "/bin/openssl", \ + "/usr/local/bin/openssl", \ + "/usr/sbin/openssl" +#endif + +// Built once and use for every SSL_CTX +static X509_STORE *g_ILibCrypto_certStore = NULL; + +#ifdef WIN32 +static INIT_ONCE g_ILibCrypto_certStoreOnce = INIT_ONCE_STATIC_INIT; +static HCERTSTORE g_ILibCrypto_winRoot = NULL; +static CRITICAL_SECTION g_ILibCrypto_winRootLock; + +// windows variant for a lazy CApath lookup. The same subject can appear more than once in the +// ROOT store (renewed roots keep the subject but change the key), so walk every match and cache +// them all in the store -- like OpenSSL's own hash_dir lookup -- and let the verifier pick by key. +static int ILibCrypto_WinGetBySubject(X509_LOOKUP *lu, X509_LOOKUP_TYPE type, X509_NAME *name, X509_OBJECT *ret) +{ + const unsigned char *der = NULL; + size_t derLen = 0; + CERT_NAME_BLOB blob; + const CERT_CONTEXT *wctx = NULL; + X509_STORE *cache = X509_LOOKUP_get_store(lu); + X509 *x, *keep = NULL; + int ok = 0; + + if (type != X509_LU_X509 || name == NULL || g_ILibCrypto_winRoot == NULL) { return 0; } + if (X509_NAME_get0_der(name, &der, &derLen) != 1 || der == NULL) { return 0; } + + blob.cbData = (DWORD)derLen; + blob.pbData = (BYTE*)der; + + // A store handle is not documented as safe for concurrent use, so lock as this store is shared by every SSL_CTX + EnterCriticalSection(&g_ILibCrypto_winRootLock); + while ((wctx = CertFindCertificateInStore(g_ILibCrypto_winRoot, X509_ASN_ENCODING, 0, CERT_FIND_SUBJECT_NAME, &blob, wctx)) != NULL) + { + const unsigned char *p = wctx->pbCertEncoded; + if ((x = d2i_X509(NULL, &p, wctx->cbCertEncoded)) != NULL) + { + if (cache != NULL) { X509_STORE_add_cert(cache, x); } // takes its own reference + if (keep != NULL) { X509_free(keep); } + keep = x; + } + } + // the failing find call already released the last context + LeaveCriticalSection(&g_ILibCrypto_winRootLock); + + if (keep != NULL) + { + ok = X509_OBJECT_set1_X509(ret, keep); // takes its own reference + X509_free(keep); + } + return ok; +} + +// Build the trust store used process-wide +static BOOL CALLBACK ILibCrypto_BuildCertStore(PINIT_ONCE once, PVOID param, PVOID *context) +{ + X509_STORE *store; + X509_LOOKUP_METHOD *method; + const CERT_CONTEXT *wctx = NULL; + BIO *in; + X509 *x; + + UNREFERENCED_PARAMETER(once); + UNREFERENCED_PARAMETER(param); + UNREFERENCED_PARAMETER(context); + + if ((store = X509_STORE_new()) == NULL) { return TRUE; } + InitializeCriticalSection(&g_ILibCrypto_winRootLock); + if ((g_ILibCrypto_winRoot = CertOpenSystemStoreW(0, L"ROOT")) == NULL) + { + g_ILibCrypto_certStore = store; + return TRUE; + } + + // Prefer on-demand lookups + if ((method = X509_LOOKUP_meth_new("windows-root-store")) != NULL) + { + if (X509_LOOKUP_meth_set_get_by_subject(method, ILibCrypto_WinGetBySubject) == 1 && + X509_STORE_add_lookup(store, method) != NULL) + { + g_ILibCrypto_certStore = store; + return TRUE; + } + X509_LOOKUP_meth_free(method); + } + + // Fallback: copy the whole store in, as before. + for (;;) + { + if ((wctx = CertEnumCertificatesInStore(g_ILibCrypto_winRoot, wctx)) == NULL) { break; } + if ((in = BIO_new_mem_buf(wctx->pbCertEncoded, wctx->cbCertEncoded)) == NULL) { continue; } + if ((x = d2i_X509_bio(in, NULL)) != NULL) + { + X509_STORE_add_cert(store, x); + X509_free(x); + } + BIO_free(in); + } + CertCloseStore(g_ILibCrypto_winRoot, 0); + g_ILibCrypto_winRoot = NULL; + g_ILibCrypto_certStore = store; + return TRUE; +} +#else +static pthread_once_t g_ILibCrypto_certStoreOnce = PTHREAD_ONCE_INIT; + +// Check location by parsing into tmp store so nothing is retained +static int ILibCrypto_ProbeCerts(const char *file) +{ + X509_STORE *tmp = X509_STORE_new(); + int n = 0; + + if (tmp == NULL) { return 0; } + if (X509_STORE_load_locations(tmp, file, NULL) == 1) + { + n = sk_X509_OBJECT_num(X509_STORE_get0_objects(tmp)); + } + X509_STORE_free(tmp); + return n > 0; +} + +// A valid certdir has hash entries from 'openssl rehash'. Max 5 attempts for a valid one. +// A valid dir is lazy registered, so new certs are picked up and saves on resources +static int ILibCrypto_TryCertDir(X509_STORE *store, const char *dir) +{ + struct stat st; + DIR *d; + struct dirent *e; + char sample[PATH_MAX]; + int tried = 0, found = 0; + + // Must be absolute: the store is built lazily and must not depend on cwd + if (dir == NULL || dir[0] != '/' || stat(dir, &st) != 0 || !S_ISDIR(st.st_mode)) { return 0; } + if ((d = opendir(dir)) == NULL) { return 0; } + while (found == 0 && tried < 5 && (e = readdir(d)) != NULL) + { + const char *p = e->d_name; + int i; + for (i = 0; i < 8 && ((p[i] >= '0' && p[i] <= '9') || (p[i] >= 'a' && p[i] <= 'f') || (p[i] >= 'A' && p[i] <= 'F')); ++i) { } + if (i != 8 || p[8] != '.' || p[9] == 0) { continue; } + for (i = 9; p[i] >= '0' && p[i] <= '9'; ++i) { } + if (p[i] != 0) { continue; } + if (sprintf_s(sample, sizeof(sample), "%s/%s", dir, p) < 0) { break; } // truncated: no entry in this dir can fit + ++tried; + found = ILibCrypto_ProbeCerts(sample); + } + closedir(d); + + return found != 0 && X509_STORE_load_locations(store, NULL, dir) == 1; +} + +// Millisecond monotonic clock for the subprocess deadline, so a wall-clock step (NTP) cannot +// stretch or collapse the timeout. Needs macOS 10.12+ +static long long ILibCrypto_Now(void) +{ + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + return (long long)ts.tv_sec * 1000LL + ts.tv_nsec / 1000000; +} + +// use 'openssl version -d' to get the configurated path. Use execve with a timer, minimal env instead of popen. +static int ILibCrypto_QueryOpenSSLCertDir(X509_STORE *store, const char *opensslPath) +{ + int pipefd[2]; + pid_t pid; + char buf[256]; // openssl output buffer + ssize_t total = 0, r; + long long deadline; + char *tokenized; + int i, found = 0; + + if (pipe(pipefd) != 0) { return 0; } + // Close-on-exec, so another thread's concurrent fork+exec cannot inherit the write end and + // keep EOF from ever arriving. Our own child re-opens stdout via dup2, which clears the flag. + fcntl(pipefd[0], F_SETFD, FD_CLOEXEC); + fcntl(pipefd[1], F_SETFD, FD_CLOEXEC); + + if ((pid = fork()) == 0) + { + // child: put us in our own process group so the group can be killed + ignore_result(setpgid(0, 0)); + close(pipefd[0]); + dup2(pipefd[1], STDOUT_FILENO); + close(pipefd[1]); + + char *childArgv[] = { (char*)opensslPath, (char*)"version", (char*)"-d", NULL }; + char *childEnvp[] = { (char*)"PATH=/usr/bin:/bin", NULL }; + execve(opensslPath, childArgv, childEnvp); // replace process image with openssl, success ends here, else _exit + _exit(127); + } + if (pid < 0) { close(pipefd[0]); close(pipefd[1]); return 0; } + + // also in parent to be sure the group exists + ignore_result(setpgid(pid, pid)); + + close(pipefd[1]); + deadline = ILibCrypto_Now() + ILibCrypto_OPENSSL_SUBPROCESS_TIMEOUT * 1000LL; // timeout is in seconds, the clock in ms + + // read childprocess output into buf + for (;;) + { + long remaining = (long)(deadline - ILibCrypto_Now()); + struct pollfd pfd; + int pr; + + if (remaining <= 0 || total >= (ssize_t)sizeof(buf) - 1) { break; } + + pfd.fd = pipefd[0]; + pfd.events = POLLIN; + pfd.revents = 0; + // poll() is never restarted by SA_RESTART, and this process installs signal handlers without SA_RESTART + // (and our own child exiting raises SIGCHLD), so EINTR is expected here + pr = poll(&pfd, 1, (int)remaining); + if (pr < 0) { if (errno == EINTR) { continue; } break; } + if (pr == 0) { break; } // timed out + + r = read(pipefd[0], buf + total, sizeof(buf) - 1 - total); + if (r < 0) { if (errno == EINTR) { continue; } break; } + if (r == 0) { break; } // EOF, child output finished + total += r; + } + close(pipefd[0]); + buf[total] = 0; // 0-terminate the output + + // Kill now, wait for the pid after parsing the output + kill(-pid, SIGKILL); + kill(pid, SIGKILL); + + // Output looks like: OPENSSLDIR: "/usr/lib/ssl" + char *save = NULL; + for (tokenized = strtok_r(buf, "\"", &save); tokenized != NULL; tokenized = strtok_r(NULL, "\"", &save)) + { + size_t tlen, off; + + // must be absolute and at least one segment + if (tokenized[0] != '/' || tokenized[1] == '\0') { continue; } + + // Append "/certs" in place + tlen = strnlen_s(tokenized, sizeof(buf)); + off = (size_t)(tokenized - buf) + tlen; + if (off + 7 <= sizeof(buf)) + { + memcpy_s(tokenized + tlen, sizeof(buf) - off, "/certs", 7); + found = ILibCrypto_TryCertDir(store, tokenized); + tokenized[tlen] = 0; // restore -> bare directory + } + if (found == 0) { found = ILibCrypto_TryCertDir(store, tokenized); } + break; + } + + // Should already be gone. Bounded reap: EINTR is expected here (see above), and a child wedged + // in uninterruptible sleep would otherwise stall every thread waiting on pthread_once. + for (i = 0; i < 200; ++i) + { + pid_t w = waitpid(pid, NULL, WNOHANG); + if (w == pid || (w < 0 && errno != EINTR)) { break; } + { struct timespec ts = { 0, 1000000 }; nanosleep(&ts, NULL); } // 1ms + } + + return found; +} + +#ifdef __APPLE__ +// Use keychain as trusted store. Fallback to static file (/etc/ssl/cert.pem on macos) +// TODO: add admin installed root/distrust +static int ILibCrypto_MacLoadAnchors(X509_STORE *store) +{ + CFArrayRef anchors = NULL; + CFIndex i, n; + + if (SecTrustCopyAnchorCertificates(&anchors) != errSecSuccess || anchors == NULL) { return 0; } + n = CFArrayGetCount(anchors); + for (i = 0; i < n; ++i) + { + SecCertificateRef cert = (SecCertificateRef)CFArrayGetValueAtIndex(anchors, i); + const unsigned char *p; + CFDataRef der; + X509 *x; + + if (cert == NULL || (der = SecCertificateCopyData(cert)) == NULL) { continue; } + p = CFDataGetBytePtr(der); + if ((x = d2i_X509(NULL, &p, (long)CFDataGetLength(der))) != NULL) + { + X509_STORE_add_cert(store, x); // takes its own reference + X509_free(x); + } + CFRelease(der); + } + CFRelease(anchors); + return sk_X509_OBJECT_num(X509_STORE_get0_objects(store)) > 0; +} +#endif + +// Build the process-wide trust store +static void ILibCrypto_BuildCertStore(void) +{ + static const char * const known_cert_files[] = { ILibCrypto_KNOWN_CERT_FILES, NULL }; + static const char * const known_cert_dirs[] = { ILibCrypto_KNOWN_CERT_DIRS, NULL }; + static const char * const openssl_bins[] = { ILibCrypto_OPENSSL_BINDIRS, NULL }; + const char *envFile = getenv(X509_get_default_cert_file_env()); + const char *envDir = getenv(X509_get_default_cert_dir_env()); + X509_STORE *store = X509_STORE_new(); + char absFile[PATH_MAX], absDir[PATH_MAX]; + struct stat bs; + int i, loaded = 0; + + if (store == NULL) { return; } + g_ILibCrypto_certStore = store; + + // 1: if SSL_CERT_FILE or SSL_CERT_DIR are defined, use those. Relative paths are resolved + // first; realpath() returns NULL on failure, which the checks below treat as unset. + if (envFile != NULL && envFile[0] != 0 && envFile[0] != '/') { envFile = realpath(envFile, absFile); } + if (envDir != NULL && envDir[0] != 0 && envDir[0] != '/') { envDir = realpath(envDir, absDir); } + + if (envFile != NULL && envFile[0] == '/' && X509_STORE_load_locations(store, envFile, NULL) == 1) { loaded = 1; } + if (ILibCrypto_TryCertDir(store, envDir)) { loaded = 1; } + if (loaded != 0) { return; } + +#ifdef __APPLE__ + // 2a: explicit SSL_CERT_* overrides the keychain + if (ILibCrypto_MacLoadAnchors(store)) { return; } +#endif + + // 2b: try for a rehashed directory, lazy registered so cheaper than 3 + for (i = 0; known_cert_dirs[i] != NULL; ++i) + { + if (ILibCrypto_TryCertDir(store, known_cert_dirs[i])) { return; } + } + + // 3: try to load a bundle, loads all certs, more resource intensive + for (i = 0; known_cert_files[i] != NULL; ++i) + { + if (X509_STORE_load_locations(store, known_cert_files[i], NULL) == 1) { return; } + } + + // Last resort: openssl at fixed absolute paths, root owned and non-group writable + for (i = 0; openssl_bins[i] != NULL; ++i) + { + if (stat(openssl_bins[i], &bs) == 0 && S_ISREG(bs.st_mode) && bs.st_uid == 0 && + (bs.st_mode & (S_IWGRP | S_IWOTH)) == 0) + { + if (ILibCrypto_QueryOpenSSLCertDir(store, openssl_bins[i])) { return; } + break; + } + } + + X509_STORE_set_default_paths(store); +} +#endif + +int __fastcall util_load_system_certs(SSL_CTX *ctx) { #ifdef WIN32 - X509_STORE *xs = SSL_CTX_get_cert_store(ctx); - HCERTSTORE s = CertOpenSystemStoreW(0, L"ROOT"); - BIO *in; - X509 *x; - const CERT_CONTEXT *wctx = NULL; - for (;;) { - wctx = CertEnumCertificatesInStore(s, wctx); - if (!wctx) - break; - in = BIO_new_mem_buf(wctx->pbCertEncoded, wctx->cbCertEncoded); - x = d2i_X509_bio(in, NULL); - X509_STORE_add_cert(xs, x); - X509_free(x); - BIO_free(in); - } - - CertFreeCertificateContext(wctx); - CertCloseStore(s, 0); + InitOnceExecuteOnce(&g_ILibCrypto_certStoreOnce, ILibCrypto_BuildCertStore, NULL, NULL); #else - const char *cert_dir = X509_get_default_cert_dir(); - struct stat s; - int err = stat(cert_dir, &s); - // The system we are on uses a different SSL dir than our statically included openssl. Try to grab it from the locally installed openssl distribution. - if (err == -1) { - char buf[1024] = {0}; - char dest[1024] = {0}; - - FILE *output; - // Running "openssl version -d" should give us the directory of the locally installed openssl. We can then use that directory to load the certs from that distribution. - // However, this could be a security risk as we are running "openssl" as root. - if ((output = popen("openssl version -d", "r")) == NULL) { - return -1; - } - char *tokenized; - while (fgets(buf, 1024, output) != NULL) { - tokenized = strtok(buf, "\""); - while(tokenized != NULL) { - if (tokenized[0] == '/') { - strcat_s(dest, sizeof(dest), tokenized); - strcat_s(dest, sizeof(dest), "/certs"); - // Some systems use a /certs dir, some don't. Test for both. - err = stat(dest, &s); - if (err) { - SSL_CTX_load_verify_locations(ctx, NULL, tokenized); - } else { - SSL_CTX_load_verify_locations(ctx, NULL, dest); - } - break; - } - tokenized = strtok(NULL, "\""); - } - } - if (pclose(output)) { - return -1; - } - } else { - SSL_CTX_set_default_verify_paths(ctx); - } + pthread_once(&g_ILibCrypto_certStoreOnce, ILibCrypto_BuildCertStore); #endif + + if (g_ILibCrypto_certStore != NULL && X509_STORE_up_ref(g_ILibCrypto_certStore) == 1) + { + SSL_CTX_set_cert_store(ctx, g_ILibCrypto_certStore); + } + else + { + SSL_CTX_set_default_verify_paths(ctx); + } return 0; } From 124f45ab75627910c719d02aea46d130cfa9b549 Mon Sep 17 00:00:00 2001 From: Simon Smith Date: Fri, 4 Sep 2026 13:59:17 +0100 Subject: [PATCH 68/68] Add Security framework to macOS build flags --- makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/makefile b/makefile index e04fe5cb2..cc4db5321 100644 --- a/makefile +++ b/makefile @@ -846,7 +846,7 @@ linux: $(STRIP) macos: - $(MAKE) $(MAKEFILE) EXENAME="$(EXENAME)_$(ARCHNAME)" ADDITIONALSOURCES="$(MACOSKVMSOURCES)" CFLAGS="$(MACOSARCH) -std=gnu99 -Wall -DJPEGMAXBUF=$(KVMMaxTile) -DMESH_AGENTID=$(ARCHID) -D_POSIX -D_NOILIBSTACKDEBUG -D_NOHECI -DMICROSTACK_PROXY -D__APPLE__ $(CWEBLOG) -fno-strict-aliasing $(INCDIRS) $(CFLAGS) $(CEXTRA)" LDFLAGS="$(MACSSL) $(MACOSFLAGS) -L. -lpthread -ldl -lz -lutil -framework IOKit -framework ApplicationServices -framework SystemConfiguration -framework CoreServices -framework CoreGraphics -framework CoreFoundation -fconstant-cfstrings $(LDFLAGS) $(LDEXTRA)" + $(MAKE) $(MAKEFILE) EXENAME="$(EXENAME)_$(ARCHNAME)" ADDITIONALSOURCES="$(MACOSKVMSOURCES)" CFLAGS="$(MACOSARCH) -std=gnu99 -Wall -DJPEGMAXBUF=$(KVMMaxTile) -DMESH_AGENTID=$(ARCHID) -D_POSIX -D_NOILIBSTACKDEBUG -D_NOHECI -DMICROSTACK_PROXY -D__APPLE__ $(CWEBLOG) -fno-strict-aliasing $(INCDIRS) $(CFLAGS) $(CEXTRA)" LDFLAGS="$(MACSSL) $(MACOSFLAGS) -L. -lpthread -ldl -lz -lutil -framework IOKit -framework ApplicationServices -framework SystemConfiguration -framework CoreServices -framework CoreGraphics -framework CoreFoundation -framework Security -fconstant-cfstrings $(LDFLAGS) $(LDEXTRA)" $(SYMBOLCP) $(STRIP)