From d97a1be9722fb356d374b860555e710897e627b8 Mon Sep 17 00:00:00 2001 From: Whindmar Saksit Date: Tue, 25 Jun 2024 03:33:45 +0200 Subject: [PATCH] [SHLWAPI][EXPLORER] Implement OS_SERVERADMINUI --- base/shell/explorer/explorer.cpp | 37 ++++++++++++++++++++++++++++++++ dll/win32/shlwapi/ordinal.c | 13 +++++++++++ 2 files changed, 50 insertions(+) diff --git a/base/shell/explorer/explorer.cpp b/base/shell/explorer/explorer.cpp index 140a1e93ffa..9576f995d5b 100644 --- a/base/shell/explorer/explorer.cpp +++ b/base/shell/explorer/explorer.cpp @@ -49,6 +49,41 @@ static VOID InitializeAtlModule(HINSTANCE hInstance, BOOL bInitialize) } } +static BOOL +GetServerAdminUIDefault() +{ + BOOL server; + DWORD value = 0, size = sizeof(value); + LPCWSTR rosregpath = L"SYSTEM\\CurrentControlSet\\Control\\ReactOS\\Settings\\Version"; + if (SHGetValueW(HKEY_LOCAL_MACHINE, rosregpath, L"ReportAsWorkstation", NULL, &value, &size) == NO_ERROR) + server = value == 0; + else + server = IsOS(OS_ANYSERVER); + return server && IsUserAnAdmin(); +} + +static void +InitializeServerAdminUI() +{ + HKEY hKey = SHGetShellKey(SHKEY_Root_HKCU | SHKEY_Key_Explorer, L"Advanced", TRUE); + if (hKey) + { + DWORD value, size = sizeof(value), type; + DWORD error = SHGetValueW(hKey, NULL, L"ServerAdminUI", &type, &value, &size); + if (error || type != REG_DWORD || size != sizeof(value)) + { + value = GetServerAdminUIDefault(); + if (value) + { + // TODO: Apply registry tweaks with RegInstallW; RegServerAdmin in the REGINST resource in shell32. + SystemParametersInfo(SPI_SETKEYBOARDCUES, 0, IntToPtr(TRUE), SPIF_SENDCHANGE | SPIF_UPDATEINIFILE); + } + SHSetValueW(hKey, NULL, L"ServerAdminUI", REG_DWORD, &value, sizeof(value)); + } + RegCloseKey(hKey); + } +} + #if !WIN7_DEBUG_MODE static BOOL SetShellReadyEvent(IN LPCWSTR lpEventName) @@ -199,6 +234,8 @@ StartWithDesktop(IN HINSTANCE hInstance) if (!SetShellReadyEvent(L"msgina: ShellReadyEvent")) SetShellReadyEvent(L"Global\\msgina: ShellReadyEvent"); + InitializeServerAdminUI(); + if (DoStartStartupItems(Tray)) { ProcessStartupItems(); diff --git a/dll/win32/shlwapi/ordinal.c b/dll/win32/shlwapi/ordinal.c index 3646c54153c..1aa73bc16c2 100644 --- a/dll/win32/shlwapi/ordinal.c +++ b/dll/win32/shlwapi/ordinal.c @@ -4225,8 +4225,21 @@ BOOL WINAPI IsOS(DWORD feature) FIXME("(OS_TABLETPC) What should we return here?\n"); return FALSE; case OS_SERVERADMINUI: +#ifdef __REACTOS__ + { + DWORD value = FALSE, size = sizeof(value); + HKEY hKey = SHGetShellKey(SHKEY_Root_HKCU | SHKEY_Key_Explorer, L"Advanced", FALSE); + if (hKey) + { + SHQueryValueExW(hKey, L"ServerAdminUI", NULL, NULL, &value, &size); + RegCloseKey(hKey); + } + ISOS_RETURN(value); + } +#else FIXME("(OS_SERVERADMINUI) What should we return here?\n"); return FALSE; +#endif case OS_MEDIACENTER: FIXME("(OS_MEDIACENTER) What should we return here?\n"); return FALSE;