https://git.reactos.org/?p=reactos.git;a=commitdiff;h=4d25869e0e7853179c13e4...
commit 4d25869e0e7853179c13e4e28e5178289c3e3f06 Author: Hervé Poussineau hpoussin@reactos.org AuthorDate: Wed Apr 7 19:26:06 2021 +0200 Commit: Hervé Poussineau hpoussin@reactos.org CommitDate: Wed Apr 7 19:35:50 2021 +0200
[SYSSETUP] Manually start PlugPlay service, and wait for it before continuing
That way, class installers are already registered before installing devices.
CORE-17538 --- boot/bootdata/hivesys.inf | 2 +- dll/win32/syssetup/install.c | 33 ++++++++++++++++++++++++++++++++- 2 files changed, 33 insertions(+), 2 deletions(-)
diff --git a/boot/bootdata/hivesys.inf b/boot/bootdata/hivesys.inf index 7dc2c1141fd..fc218fed6a6 100644 --- a/boot/bootdata/hivesys.inf +++ b/boot/bootdata/hivesys.inf @@ -1995,7 +1995,7 @@ HKLM,"SYSTEM\CurrentControlSet\Services\PlugPlay","ErrorControl",0x00010001,0x00 HKLM,"SYSTEM\CurrentControlSet\Services\PlugPlay","Group",0x00000000,"PlugPlay" HKLM,"SYSTEM\CurrentControlSet\Services\PlugPlay","ImagePath",0x00020000,"%SystemRoot%\system32\svchost.exe -k DcomLaunch" HKLM,"SYSTEM\CurrentControlSet\Services\PlugPlay","ObjectName",0x00000000,"LocalSystem" -HKLM,"SYSTEM\CurrentControlSet\Services\PlugPlay","Start",0x00010001,0x00000002 +HKLM,"SYSTEM\CurrentControlSet\Services\PlugPlay","Start",0x00010001,0x00000003 HKLM,"SYSTEM\CurrentControlSet\Services\PlugPlay","Type",0x00010001,0x00000020 HKLM,"SYSTEM\CurrentControlSet\Services\PlugPlay\Parameters","ServiceDll",0x00020000,"%SystemRoot%\system32\umpnpmgr.dll"
diff --git a/dll/win32/syssetup/install.c b/dll/win32/syssetup/install.c index f0ce192f498..ba8fd226b64 100644 --- a/dll/win32/syssetup/install.c +++ b/dll/win32/syssetup/install.c @@ -486,7 +486,9 @@ EnableUserModePnpManager(VOID) { SC_HANDLE hSCManager = NULL; SC_HANDLE hService = NULL; + SERVICE_STATUS_PROCESS ServiceStatus; BOOL bRet = FALSE; + DWORD BytesNeeded, WaitTime;
hSCManager = OpenSCManagerW(NULL, NULL, SC_MANAGER_ENUMERATE_SERVICE); if (hSCManager == NULL) @@ -498,7 +500,7 @@ EnableUserModePnpManager(VOID)
hService = OpenServiceW(hSCManager, L"PlugPlay", - SERVICE_CHANGE_CONFIG | SERVICE_START); + SERVICE_CHANGE_CONFIG | SERVICE_START | SERVICE_QUERY_STATUS); if (hService == NULL) { DPRINT1("Unable to open PlugPlay service\n"); @@ -524,6 +526,35 @@ EnableUserModePnpManager(VOID) goto cleanup; }
+ while (TRUE) + { + bRet = QueryServiceStatusEx(hService, + SC_STATUS_PROCESS_INFO, + (LPBYTE)&ServiceStatus, + sizeof(ServiceStatus), + &BytesNeeded); + if (!bRet) + { + DPRINT1("QueryServiceStatusEx() failed for PlugPlay service (error 0x%x)\n", GetLastError()); + goto cleanup; + } + + if (ServiceStatus.dwCurrentState != SERVICE_START_PENDING) + break; + + WaitTime = ServiceStatus.dwWaitHint / 10; + if (WaitTime < 1000) WaitTime = 1000; + else if (WaitTime > 10000) WaitTime = 10000; + Sleep(WaitTime); + }; + + if (ServiceStatus.dwCurrentState != SERVICE_RUNNING) + { + bRet = FALSE; + DPRINT1("Failed to start PlugPlay service\n"); + goto cleanup; + } + bRet = TRUE;
cleanup: