https://git.reactos.org/?p=reactos.git;a=commitdiff;h=eede1b9b7a258a9094caf…
commit eede1b9b7a258a9094cafef5615b9ed8c3877081
Author: Bișoc George <fraizeraust99(a)gmail.com>
AuthorDate: Wed Jun 19 17:51:11 2019 +0200
Commit: Hermès Bélusca-Maïto <hermes.belusca-maito(a)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(a)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,