https://git.reactos.org/?p=reactos.git;a=commitdiff;h=36051d30650f0d89975fb1...
commit 36051d30650f0d89975fb18e08a9794f5fda1f03 Author: Timo Kreuzer timo.kreuzer@reactos.org AuthorDate: Sat Mar 17 14:23:34 2018 +0100 Commit: Timo Kreuzer timo.kreuzer@reactos.org CommitDate: Mon Aug 20 22:10:04 2018 +0200
[SYSSETUP] Fix handling of the status message window
This fixes a race condition, where the message thread was still running when InstallReactOS returned and syssetup.dll was unloaded by the caller (setup.exe). --- dll/win32/syssetup/install.c | 45 +++++++++++++++++++++++++------------------- 1 file changed, 26 insertions(+), 19 deletions(-)
diff --git a/dll/win32/syssetup/install.c b/dll/win32/syssetup/install.c index 63fa4a28e9..fa1d52b8a1 100644 --- a/dll/win32/syssetup/install.c +++ b/dll/win32/syssetup/install.c @@ -552,9 +552,9 @@ static DWORD WINAPI ShowStatusMessageThread( IN LPVOID lpParameter) { - HWND *phWnd = (HWND *)lpParameter; HWND hWnd, hItem; MSG Msg; + UNREFERENCED_PARAMETER(lpParameter);
hWnd = CreateDialogParam(hDllInstance, MAKEINTRESOURCE(IDD_STATUSWINDOW_DLG), @@ -563,7 +563,6 @@ ShowStatusMessageThread( (LPARAM)NULL); if (!hWnd) return 0; - *phWnd = hWnd;
ShowWindow(hWnd, SW_SHOW);
@@ -580,6 +579,8 @@ ShowStatusMessageThread( DispatchMessage(&Msg); }
+ EndDialog(hWnd, 0); + return 0; }
@@ -667,7 +668,8 @@ cleanup: static BOOL CommonInstall(VOID) { - HWND hWnd = NULL; + HANDLE hThread = NULL; + BOOL bResult = FALSE;
hSysSetupInf = SetupOpenInfFileW(L"syssetup.inf", NULL, @@ -682,49 +684,54 @@ CommonInstall(VOID) if (!InstallSysSetupInfDevices()) { FatalError("InstallSysSetupInfDevices() failed!\n"); - goto error; + goto Exit; }
if(!InstallSysSetupInfComponents()) { FatalError("InstallSysSetupInfComponents() failed!\n"); - goto error; + goto Exit; }
if (!IsConsoleBoot()) { - HANDLE hThread; - hThread = CreateThread(NULL, 0, ShowStatusMessageThread, - (LPVOID)&hWnd, + NULL, 0, NULL); - if (hThread) - CloseHandle(hThread); }
if (!EnableUserModePnpManager()) { FatalError("EnableUserModePnpManager() failed!\n"); - goto error; + goto Exit; }
if (CMP_WaitNoPendingInstallEvents(INFINITE) != WAIT_OBJECT_0) { FatalError("CMP_WaitNoPendingInstallEvents() failed!\n"); - goto error; + goto Exit; }
- EndDialog(hWnd, 0); - return TRUE; + bResult = TRUE;
-error: - if (hWnd) - EndDialog(hWnd, 0); - SetupCloseInfFile(hSysSetupInf); - return FALSE; +Exit: + + if (bResult == FALSE) + { + SetupCloseInfFile(hSysSetupInf); + } + + if (hThread != NULL) + { + PostThreadMessage(GetThreadId(hThread), WM_QUIT, 0, 0); + WaitForSingleObject(hThread, INFINITE); + CloseHandle(hThread); + } + + return bResult; }
/* Install a section of a .inf file