*/
#include "precomp.h"
+#include <process.h>
WINE_DEFAULT_DEBUG_CHANNEL(shell);
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);
}
}
+struct FORMAT_DRIVE_PARAMS
+{
+ HWND hwndDlg;
+ PFORMAT_DRIVE_CONTEXT pContext;
+};
+
+static unsigned __stdcall DoFormatDrive(void *args)
+{
+ FORMAT_DRIVE_PARAMS *pParams = reinterpret_cast<FORMAT_DRIVE_PARAMS *>(args);
+ HWND hwndDlg = pParams->hwndDlg;
+ PFORMAT_DRIVE_CONTEXT pContext = pParams->pContext;
+
+ HMENU hSysMenu = GetSystemMenu(hwndDlg, FALSE);
+ EnableMenuItem(hSysMenu, SC_CLOSE, MF_BYCOMMAND | MF_GRAYED);
+ 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);
+ EnableMenuItem(hSysMenu, SC_CLOSE, MF_BYCOMMAND | MF_ENABLED);
+ pContext->bFormattingNow = FALSE;
+
+ delete pParams;
+ return 0;
+}
+
static INT_PTR CALLBACK
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;
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;
}
-
-