diff --git a/dll/win32/shell32/dialogs/drive.cpp b/dll/win32/shell32/dialogs/drive.cpp index 4742c50e20..91aaa03565 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); @@ -28,6 +29,7 @@ typedef struct WCHAR Drive; UINT Options; UINT Result; + BOOL bFormattingNow; } FORMAT_DRIVE_CONTEXT, *PFORMAT_DRIVE_CONTEXT; EXTERN_C HPSXA WINAPI SHCreatePropSheetExtArrayEx(HKEY hKey, LPCWSTR pszSubKey, UINT max_iface, IDataObject *pDataObj); @@ -577,6 +579,33 @@ 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); + pContext->bFormattingNow = FALSE; + + delete pParams; + return 0; +} + static INT_PTR CALLBACK FormatDriveDlg(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { @@ -592,20 +621,40 @@ 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) + pContext = (PFORMAT_DRIVE_CONTEXT)GetWindowLongPtr(hwndDlg, DWLP_USER); + if (pContext->bFormattingNow) + break; + + 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); + pContext->bFormattingNow = TRUE; + + 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: pContext = (PFORMAT_DRIVE_CONTEXT)GetWindowLongPtr(hwndDlg, DWLP_USER); + if (pContext->bFormattingNow) + break; + EndDialog(hwndDlg, pContext->Result); break; case 28677: // filesystem combo if (HIWORD(wParam) == CBN_SELENDOK) { pContext = (PFORMAT_DRIVE_CONTEXT)GetWindowLongPtr(hwndDlg, DWLP_USER); + if (pContext->bFormattingNow) + break; + InsertDefaultClusterSizeForFs(hwndDlg, pContext); } break; @@ -629,10 +678,10 @@ SHFormatDrive(HWND hwnd, UINT drive, UINT fmtID, UINT options) Context.Drive = drive; Context.Options = options; + Context.Result = FALSE; + Context.bFormattingNow = FALSE; result = DialogBoxParamW(shell32_hInstance, MAKEINTRESOURCEW(IDD_FORMAT_DRIVE), hwnd, FormatDriveDlg, (LPARAM)&Context); return result; } - -