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…
	
	Add table
		Add a link
		
	
		Reference in a new issue