mirror of
https://github.com/pbatard/rufus.git
synced 2024-08-14 23:57:05 +00:00
[ui] added cancellation and control greyout during format
* also prevent application close during format
This commit is contained in:
parent
99951cdb27
commit
23b1f55338
2 changed files with 65 additions and 30 deletions
17
resource.h
17
resource.h
|
@ -10,15 +10,14 @@
|
||||||
#define IDC_DEVICE 1001
|
#define IDC_DEVICE 1001
|
||||||
#define IDC_FILESYSTEM 1002
|
#define IDC_FILESYSTEM 1002
|
||||||
#define IDC_START 1003
|
#define IDC_START 1003
|
||||||
#define IDC_CLOSE 1004
|
#define IDC_CAPACITY 1004
|
||||||
#define IDC_CAPACITY 1005
|
#define IDC_ALLOCSIZE 1005
|
||||||
#define IDC_ALLOCSIZE 1006
|
#define IDC_STATUS 1006
|
||||||
#define IDC_STATUS 1009
|
#define IDC_ABOUT 1007
|
||||||
#define IDC_ABOUT 1010
|
#define IDC_LABEL 1008
|
||||||
#define IDC_LABEL 1011
|
#define IDC_QUICKFORMAT 1009
|
||||||
#define IDC_QUICKFORMAT 1012
|
#define IDC_DOSSTARTUP 1010
|
||||||
#define IDC_DOSSTARTUP 1013
|
#define IDC_PROGRESS 1011
|
||||||
#define IDC_PROGRESS 1014
|
|
||||||
#define IDC_ABOUT_LICENSE 1030
|
#define IDC_ABOUT_LICENSE 1030
|
||||||
#define IDC_ABOUT_ICON 1031
|
#define IDC_ABOUT_ICON 1031
|
||||||
#define IDC_RUFUS_BOLD 1032
|
#define IDC_RUFUS_BOLD 1032
|
||||||
|
|
78
rufus.c
78
rufus.c
|
@ -405,7 +405,7 @@ static BOOL PopulateProperties(int ComboIndex)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL WriteSectors(HANDLE hDrive, size_t SectorSize, size_t StartSector, size_t nSectors, void* Buf, size_t BufSize)
|
static BOOL WriteSectors(HANDLE hDrive, size_t SectorSize, size_t StartSector, size_t nSectors, void* Buf, size_t BufSize)
|
||||||
{
|
{
|
||||||
LARGE_INTEGER ptr;
|
LARGE_INTEGER ptr;
|
||||||
DWORD Size;
|
DWORD Size;
|
||||||
|
@ -429,7 +429,7 @@ BOOL WriteSectors(HANDLE hDrive, size_t SectorSize, size_t StartSector, size_t n
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL ReadSectors(HANDLE hDrive, size_t SectorSize, size_t StartSector, size_t nSectors, void* Buf, size_t BufSize)
|
static BOOL ReadSectors(HANDLE hDrive, size_t SectorSize, size_t StartSector, size_t nSectors, void* Buf, size_t BufSize)
|
||||||
{
|
{
|
||||||
LARGE_INTEGER ptr;
|
LARGE_INTEGER ptr;
|
||||||
DWORD size;
|
DWORD size;
|
||||||
|
@ -456,7 +456,7 @@ BOOL ReadSectors(HANDLE hDrive, size_t SectorSize, size_t StartSector, size_t nS
|
||||||
/*
|
/*
|
||||||
* Create a partition table
|
* Create a partition table
|
||||||
*/
|
*/
|
||||||
BOOL CreatePartition(HANDLE hDrive)
|
static BOOL CreatePartition(HANDLE hDrive)
|
||||||
{
|
{
|
||||||
BYTE layout[sizeof(DRIVE_LAYOUT_INFORMATION_EX) + 3*sizeof(PARTITION_INFORMATION_EX)] = {0};
|
BYTE layout[sizeof(DRIVE_LAYOUT_INFORMATION_EX) + 3*sizeof(PARTITION_INFORMATION_EX)] = {0};
|
||||||
PDRIVE_LAYOUT_INFORMATION_EX DriveLayoutEx = (PDRIVE_LAYOUT_INFORMATION_EX)layout;
|
PDRIVE_LAYOUT_INFORMATION_EX DriveLayoutEx = (PDRIVE_LAYOUT_INFORMATION_EX)layout;
|
||||||
|
@ -503,11 +503,13 @@ BOOL CreatePartition(HANDLE hDrive)
|
||||||
/*
|
/*
|
||||||
* FormatEx callback. Return FALSE to halt operations
|
* FormatEx callback. Return FALSE to halt operations
|
||||||
*/
|
*/
|
||||||
BOOLEAN __stdcall FormatExCallback(FILE_SYSTEM_CALLBACK_COMMAND Command, DWORD Action, PVOID Data)
|
static BOOLEAN __stdcall FormatExCallback(FILE_SYSTEM_CALLBACK_COMMAND Command, DWORD Action, PVOID Data)
|
||||||
{
|
{
|
||||||
DWORD* percent;
|
DWORD* percent;
|
||||||
int task_number = 0;
|
int task_number = 0;
|
||||||
|
|
||||||
|
if (FormatErr != 0) return FALSE;
|
||||||
|
|
||||||
switch(Command) {
|
switch(Command) {
|
||||||
case FCC_PROGRESS:
|
case FCC_PROGRESS:
|
||||||
percent = (DWORD*)Data;
|
percent = (DWORD*)Data;
|
||||||
|
@ -520,8 +522,7 @@ BOOLEAN __stdcall FormatExCallback(FILE_SYSTEM_CALLBACK_COMMAND Command, DWORD A
|
||||||
case FCC_DONE:
|
case FCC_DONE:
|
||||||
if(*(BOOLEAN*)Data == FALSE) {
|
if(*(BOOLEAN*)Data == FALSE) {
|
||||||
uprintf("Error while formatting.\n");
|
uprintf("Error while formatting.\n");
|
||||||
if (FormatErr == 0)
|
FormatErr = FCC_DONE;
|
||||||
FormatErr = FCC_DONE;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case FCC_INCOMPATIBLE_FILE_SYSTEM:
|
case FCC_INCOMPATIBLE_FILE_SYSTEM:
|
||||||
|
@ -580,7 +581,7 @@ BOOLEAN __stdcall FormatExCallback(FILE_SYSTEM_CALLBACK_COMMAND Command, DWORD A
|
||||||
/*
|
/*
|
||||||
* Call on fmifs.dll's FormatEx() to format the drive
|
* Call on fmifs.dll's FormatEx() to format the drive
|
||||||
*/
|
*/
|
||||||
BOOL FormatDrive(char DriveLetter)
|
static BOOL FormatDrive(char DriveLetter)
|
||||||
{
|
{
|
||||||
BOOL r = FALSE;
|
BOOL r = FALSE;
|
||||||
PF_DECL(FormatEx);
|
PF_DECL(FormatEx);
|
||||||
|
@ -601,11 +602,9 @@ BOOL FormatDrive(char DriveLetter)
|
||||||
IsChecked(IDC_QUICKFORMAT), 4096, FormatExCallback);
|
IsChecked(IDC_QUICKFORMAT), 4096, FormatExCallback);
|
||||||
if (FormatErr == 0) {
|
if (FormatErr == 0) {
|
||||||
uprintf("Format completed.\n");
|
uprintf("Format completed.\n");
|
||||||
StatusPrintf("Done.");
|
|
||||||
r = TRUE;
|
r = TRUE;
|
||||||
} else {
|
} else {
|
||||||
uprintf("Format error: 0x%02x\n", FormatErr);
|
uprintf("Format error: 0x%02x\n", FormatErr);
|
||||||
StatusPrintf("FAILED.");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
@ -615,7 +614,7 @@ out:
|
||||||
/*
|
/*
|
||||||
* Create a separate thread for the formatting operation
|
* Create a separate thread for the formatting operation
|
||||||
*/
|
*/
|
||||||
void __cdecl FormatThread(void* param)
|
static void __cdecl FormatThread(void* param)
|
||||||
{
|
{
|
||||||
DWORD num = (DWORD)(uintptr_t)param;
|
DWORD num = (DWORD)(uintptr_t)param;
|
||||||
HANDLE hDrive;
|
HANDLE hDrive;
|
||||||
|
@ -774,6 +773,21 @@ static BOOL GetUSBDevices(void)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Toggle controls according to operation */
|
||||||
|
static void EnableControls(BOOL bEnable)
|
||||||
|
{
|
||||||
|
EnableWindow(GetDlgItem(hMainDialog, IDC_DEVICE), bEnable);
|
||||||
|
EnableWindow(GetDlgItem(hMainDialog, IDC_CAPACITY), bEnable);
|
||||||
|
EnableWindow(GetDlgItem(hMainDialog, IDC_FILESYSTEM), bEnable);
|
||||||
|
EnableWindow(GetDlgItem(hMainDialog, IDC_ALLOCSIZE), bEnable);
|
||||||
|
EnableWindow(GetDlgItem(hMainDialog, IDC_LABEL), bEnable);
|
||||||
|
EnableWindow(GetDlgItem(hMainDialog, IDC_QUICKFORMAT), bEnable);
|
||||||
|
EnableWindow(GetDlgItem(hMainDialog, IDC_DOSSTARTUP), bEnable);
|
||||||
|
EnableWindow(GetDlgItem(hMainDialog, IDC_ABOUT), bEnable);
|
||||||
|
EnableWindow(GetDlgItem(hMainDialog, IDC_START), bEnable);
|
||||||
|
SetDlgItemTextA(hMainDialog, IDCANCEL, bEnable?"Close":"Cancel");
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Main dialog callback
|
* Main dialog callback
|
||||||
*/
|
*/
|
||||||
|
@ -791,8 +805,8 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
|
||||||
switch (message) {
|
switch (message) {
|
||||||
|
|
||||||
case WM_DEVICECHANGE:
|
case WM_DEVICECHANGE:
|
||||||
// TODO: also prevent detect during format
|
if ( (format_thid == -1L) &&
|
||||||
if ((wParam == DBT_DEVICEARRIVAL) || (wParam == DBT_DEVICEREMOVECOMPLETE)) {
|
((wParam == DBT_DEVICEARRIVAL) || (wParam == DBT_DEVICEREMOVECOMPLETE)) ) {
|
||||||
GetUSBDevices();
|
GetUSBDevices();
|
||||||
return (INT_PTR)TRUE;
|
return (INT_PTR)TRUE;
|
||||||
}
|
}
|
||||||
|
@ -840,6 +854,19 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
|
||||||
switch(LOWORD(wParam)) {
|
switch(LOWORD(wParam)) {
|
||||||
case IDOK: // close application
|
case IDOK: // close application
|
||||||
case IDCANCEL:
|
case IDCANCEL:
|
||||||
|
if (format_thid != -1L) {
|
||||||
|
// TODO: destroy MessageBox if operation completed while waiting
|
||||||
|
if (MessageBoxA(hMainDialog, "Cancelling may leave the device in an UNUSABLE state.\r\n"
|
||||||
|
"If you are sure you want to cancel, click YES. Otherwise, click NO.",
|
||||||
|
"Do you want to cancel?", MB_YESNO|MB_ICONWARNING) == IDYES) {
|
||||||
|
// Operation may have completed
|
||||||
|
if (format_thid != -1L) {
|
||||||
|
FormatErr = -1;
|
||||||
|
StatusPrintf("Cancelling - please wait...");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (INT_PTR)TRUE;
|
||||||
|
}
|
||||||
PostQuitMessage(0);
|
PostQuitMessage(0);
|
||||||
StrArrayDestroy(&DriveID);
|
StrArrayDestroy(&DriveID);
|
||||||
StrArrayDestroy(&DriveLabel);
|
StrArrayDestroy(&DriveLabel);
|
||||||
|
@ -866,9 +893,11 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
|
||||||
nDeviceIndex = ComboBox_GetCurSel(hDeviceList);
|
nDeviceIndex = ComboBox_GetCurSel(hDeviceList);
|
||||||
if (nDeviceIndex != CB_ERR) {
|
if (nDeviceIndex != CB_ERR) {
|
||||||
GetWindowTextA(hDeviceList, tmp, sizeof(tmp));
|
GetWindowTextA(hDeviceList, tmp, sizeof(tmp));
|
||||||
safe_sprintf(str, sizeof(str), "WARNING: ALL DATA ON DEVICE %s\r\nWILL BE ERASED!\r\n"
|
safe_sprintf(str, sizeof(str), "WARNING: ALL DATA ON DEVICE %s\r\nWILL BE DESTROYED.\r\n"
|
||||||
"Do you want to continue with this operation?", tmp);
|
"To continue with this operation, click OK. To quit click CANCEL.", tmp);
|
||||||
if (MessageBoxA(hMainDialog, str, "Rufus", MB_OKCANCEL|MB_ICONWARNING) == IDOK) {
|
if (MessageBoxA(hMainDialog, str, "Rufus", MB_OKCANCEL|MB_ICONWARNING) == IDOK) {
|
||||||
|
// Disable all controls except cancel
|
||||||
|
EnableControls(FALSE);
|
||||||
// Handle marquee progress bar on quickformat
|
// Handle marquee progress bar on quickformat
|
||||||
SetWindowLongPtr(hProgress, GWL_STYLE, ProgressStyle | (IsChecked(IDC_QUICKFORMAT)?PBS_MARQUEE:0));
|
SetWindowLongPtr(hProgress, GWL_STYLE, ProgressStyle | (IsChecked(IDC_QUICKFORMAT)?PBS_MARQUEE:0));
|
||||||
if (IsChecked(IDC_QUICKFORMAT)) {
|
if (IsChecked(IDC_QUICKFORMAT)) {
|
||||||
|
@ -889,6 +918,9 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
|
||||||
return (INT_PTR)TRUE;
|
return (INT_PTR)TRUE;
|
||||||
|
|
||||||
case WM_CLOSE:
|
case WM_CLOSE:
|
||||||
|
if (format_thid != -1L) {
|
||||||
|
return (INT_PTR)TRUE;
|
||||||
|
}
|
||||||
PostQuitMessage(0);
|
PostQuitMessage(0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -898,14 +930,18 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
|
||||||
|
|
||||||
case UM_FORMAT_COMPLETED:
|
case UM_FORMAT_COMPLETED:
|
||||||
format_thid = -1L;
|
format_thid = -1L;
|
||||||
if (IsChecked(IDC_QUICKFORMAT))
|
if (IsChecked(IDC_QUICKFORMAT)) {
|
||||||
SendMessage(hProgress, PBM_SETMARQUEE, FALSE, 0);
|
SendMessage(hProgress, PBM_SETMARQUEE, FALSE, 0);
|
||||||
SetWindowLongPtr(hProgress, GWL_STYLE, ProgressStyle);
|
SetWindowLongPtr(hProgress, GWL_STYLE, ProgressStyle);
|
||||||
// This is the only way to achieve instantenous progress transition
|
// This is the only way to achieve instantenous progress transition
|
||||||
SendMessage(hProgress, PBM_SETRANGE, 0, 101<<16);
|
SendMessage(hProgress, PBM_SETRANGE, 0, 101<<16);
|
||||||
SendMessage(hProgress, PBM_SETPOS, 101, 0);
|
SendMessage(hProgress, PBM_SETPOS, 101, 0);
|
||||||
SendMessage(hProgress, PBM_SETRANGE, 0, 100<<16);
|
SendMessage(hProgress, PBM_SETRANGE, 0, 100<<16);
|
||||||
SendMessage(hProgress, PBM_SETPOS, 100, 0);
|
}
|
||||||
|
SendMessage(hProgress, PBM_SETPOS, FormatErr?0:100, 0);
|
||||||
|
// TODO: report cancelled status
|
||||||
|
StatusPrintf(FormatErr?"FAILED":"DONE");
|
||||||
|
EnableControls(TRUE);
|
||||||
return (INT_PTR)TRUE;
|
return (INT_PTR)TRUE;
|
||||||
}
|
}
|
||||||
return (INT_PTR)FALSE;
|
return (INT_PTR)FALSE;
|
||||||
|
|
Loading…
Reference in a new issue