diff --git a/dll/win32/shell32/dialogs/drive.cpp b/dll/win32/shell32/dialogs/drive.cpp index 4742c50e20..73d2de1153 100644 --- a/dll/win32/shell32/dialogs/drive.cpp +++ b/dll/win32/shell32/dialogs/drive.cpp @@ -20,6 +20,7 @@ */ #include "precomp.h" +#include WINE_DEFAULT_DEBUG_CHANNEL(shell); @@ -577,6 +578,32 @@ FormatDrive(HWND hwndDlg, PFORMAT_DRIVE_CONTEXT pContext) } } +struct FORMAT_DRIVE_PARAMS +{ + HWND hwndDlg; + PFORMAT_DRIVE_CONTEXT pContext; +}; + +static unsigned __stdcall DoFormatDrive(void *args) +{ + FORMAT_DRIVE_PARAMS *pParams = reinterpret_cast(args); + HWND hwndDlg = pParams->hwndDlg; + PFORMAT_DRIVE_CONTEXT pContext = pParams->pContext; + + EnableWindow(GetDlgItem(hwndDlg, IDOK), FALSE); + EnableWindow(GetDlgItem(hwndDlg, IDCANCEL), FALSE); + EnableWindow(GetDlgItem(hwndDlg, 28677), FALSE); + + FormatDrive(hwndDlg, pContext); + + EnableWindow(GetDlgItem(hwndDlg, IDOK), TRUE); + EnableWindow(GetDlgItem(hwndDlg, IDCANCEL), TRUE); + EnableWindow(GetDlgItem(hwndDlg, 28677), TRUE); + + delete pParams; + return 0; +} + static INT_PTR CALLBACK FormatDriveDlg(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { @@ -592,10 +619,20 @@ FormatDriveDlg(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) switch(LOWORD(wParam)) { case IDOK: - if (ShellMessageBoxW(shell32_hInstance, hwndDlg, MAKEINTRESOURCEW(IDS_FORMAT_WARNING), MAKEINTRESOURCEW(IDS_FORMAT_TITLE), MB_OKCANCEL | MB_ICONWARNING) == IDOK) + if (ShellMessageBoxW(shell32_hInstance, hwndDlg, + MAKEINTRESOURCEW(IDS_FORMAT_WARNING), + MAKEINTRESOURCEW(IDS_FORMAT_TITLE), + MB_OKCANCEL | MB_ICONWARNING) == IDOK) { pContext = (PFORMAT_DRIVE_CONTEXT)GetWindowLongPtr(hwndDlg, DWLP_USER); - FormatDrive(hwndDlg, pContext); + + FORMAT_DRIVE_PARAMS *pParams = new FORMAT_DRIVE_PARAMS; + pParams->hwndDlg = hwndDlg; + pParams->pContext = pContext; + + unsigned tid; + HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, DoFormatDrive, pParams, 0, &tid); + CloseHandle(hThread); } break; case IDCANCEL: