https://git.reactos.org/?p=reactos.git;a=commitdiff;h=eede1b9b7a258a9094cafe...
commit eede1b9b7a258a9094cafef5615b9ed8c3877081 Author: Bișoc George fraizeraust99@gmail.com AuthorDate: Wed Jun 19 17:51:11 2019 +0200 Commit: Hermès Bélusca-Maïto hermes.belusca-maito@reactos.org CommitDate: Sun Jul 21 19:02:53 2019 +0200
[UMPNPMGR] Implement registry functions for SuppressUI and SuppressNewHWUI handling. (#1683) CORE-15897
Co-authored-by: Hermès Bélusca-Maïto hermes.belusca-maito@reactos.org --- base/services/umpnpmgr/install.c | 11 +++++- base/services/umpnpmgr/precomp.h | 8 +++- base/services/umpnpmgr/umpnpmgr.c | 81 ++++++++++++++++++++++++++++++++++++++- 3 files changed, 97 insertions(+), 3 deletions(-)
diff --git a/base/services/umpnpmgr/install.c b/base/services/umpnpmgr/install.c index 2f3bdfd1050..4c876e490ef 100644 --- a/base/services/umpnpmgr/install.c +++ b/base/services/umpnpmgr/install.c @@ -340,6 +340,15 @@ cleanup: }
+FORCEINLINE +BOOL +IsUISuppressionAllowed(VOID) +{ + /* Display the newdev.dll wizard UI only if it's allowed */ + return (g_IsUISuppressed || GetSuppressNewUIValue()); +} + + /* Loop to install all queued devices installations */ DWORD WINAPI @@ -368,7 +377,7 @@ DeviceInstallThread(LPVOID lpParameter) { ResetEvent(hNoPendingInstalls); Params = CONTAINING_RECORD(ListEntry, DeviceInstallParams, ListEntry); - InstallDevice(Params->DeviceIds, showWizard); + InstallDevice(Params->DeviceIds, showWizard && !IsUISuppressionAllowed()); HeapFree(GetProcessHeap(), 0, Params); } } diff --git a/base/services/umpnpmgr/precomp.h b/base/services/umpnpmgr/precomp.h index 3c51aa47b21..f7d7b4f9f72 100644 --- a/base/services/umpnpmgr/precomp.h +++ b/base/services/umpnpmgr/precomp.h @@ -39,7 +39,6 @@ typedef struct WCHAR DeviceIds[1]; } DeviceInstallParams;
- /* install.c */
extern HANDLE hUserToken; @@ -52,6 +51,10 @@ extern HANDLE hDeviceInstallListNotEmpty; BOOL SetupIsActive(VOID);
+FORCEINLINE +BOOL +IsUISuppressionAllowed(VOID); + DWORD WINAPI DeviceInstallThread( @@ -70,6 +73,9 @@ RpcServerThread(
extern HKEY hEnumKey; extern HKEY hClassKey; +extern BOOL g_IsUISuppressed;
+BOOL +GetSuppressNewUIValue(VOID);
#endif /* _UMPNPMGR_PCH_ */ \ No newline at end of file diff --git a/base/services/umpnpmgr/umpnpmgr.c b/base/services/umpnpmgr/umpnpmgr.c index 7aa64813c75..0195f73813c 100644 --- a/base/services/umpnpmgr/umpnpmgr.c +++ b/base/services/umpnpmgr/umpnpmgr.c @@ -43,7 +43,7 @@ static SERVICE_STATUS ServiceStatus;
HKEY hEnumKey = NULL; HKEY hClassKey = NULL; - +BOOL g_IsUISuppressed = FALSE;
/* FUNCTIONS *****************************************************************/
@@ -268,6 +268,77 @@ ServiceControlHandler(DWORD dwControl, } }
+static DWORD +GetBooleanRegValue( + IN HKEY hKey, + IN PCWSTR lpSubKey, + IN PCWSTR lpValue, + OUT PBOOL pValue) +{ + DWORD dwError, dwType, dwData; + DWORD cbData = sizeof(dwData); + HKEY hSubKey = NULL; + + /* Default value */ + *pValue = FALSE; + + dwError = RegOpenKeyExW(hKey, + lpSubKey, + 0, + KEY_READ, + &hSubKey); + if (dwError != ERROR_SUCCESS) + { + DPRINT("GetBooleanRegValue(): RegOpenKeyExW() has failed to open '%S' key! (Error: %lu)\n", + lpSubKey, dwError); + return dwError; + } + + dwError = RegQueryValueExW(hSubKey, + lpValue, + 0, + &dwType, + (PBYTE)&dwData, + &cbData); + if (dwError != ERROR_SUCCESS) + { + DPRINT("GetBooleanRegValue(): RegQueryValueExW() has failed to query '%S' value! (Error: %lu)\n", + lpValue, dwError); + goto Cleanup; + } + if (dwType != REG_DWORD) + { + DPRINT("GetBooleanRegValue(): The value is not of REG_DWORD type!\n"); + goto Cleanup; + } + + /* Return the value */ + *pValue = (dwData == 1); + +Cleanup: + RegCloseKey(hSubKey); + + return dwError; +} + +BOOL +GetSuppressNewUIValue(VOID) +{ + BOOL bSuppressNewHWUI = FALSE; + + /* + * Query the SuppressNewHWUI policy registry value. Don't cache it + * as we want to update our behaviour in consequence. + */ + GetBooleanRegValue(HKEY_LOCAL_MACHINE, + L"Software\Policies\Microsoft\Windows\DeviceInstall\Settings", + L"SuppressNewHWUI", + &bSuppressNewHWUI); + if (bSuppressNewHWUI) + DPRINT("GetSuppressNewUIValue(): newdev.dll's wizard UI won't be shown!\n"); + + return bSuppressNewHWUI; +}
VOID WINAPI ServiceMain(DWORD argc, LPTSTR *argv) @@ -363,6 +434,14 @@ InitializePnPManager(VOID)
InitializeSListHead(&DeviceInstallListHead);
+ /* Query the SuppressUI registry value and cache it for our whole lifetime */ + GetBooleanRegValue(HKEY_LOCAL_MACHINE, + L"System\CurrentControlSet\Services\PlugPlay\Parameters", + L"SuppressUI", + &g_IsUISuppressed); + if (g_IsUISuppressed) + DPRINT("UMPNPMGR: newdev.dll's wizard UI won't be shown!\n"); + dwError = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"System\CurrentControlSet\Enum", 0,