mirror of
				https://github.com/pbatard/rufus.git
				synced 2024-08-14 23:57:05 +00:00 
			
		
		
		
	[core] add a cheat mode to reset the current USB device (cycle port)
* Will not work on Vista, Windows 7 or Server 2008 * Also update Windows version info
This commit is contained in:
		
							parent
							
								
									13ba3e75b3
								
							
						
					
					
						commit
						8286a0f63a
					
				
					 6 changed files with 103 additions and 30 deletions
				
			
		
							
								
								
									
										60
									
								
								src/dev.c
									
										
									
									
									
								
							
							
						
						
									
										60
									
								
								src/dev.c
									
										
									
									
									
								
							|  | @ -1,7 +1,7 @@ | ||||||
| /*
 | /*
 | ||||||
|  * Rufus: The Reliable USB Formatting Utility |  * Rufus: The Reliable USB Formatting Utility | ||||||
|  * Device detection and enumeration |  * Device detection and enumeration | ||||||
|  * Copyright © 2014-2017 Pete Batard <pete@akeo.ie> |  * Copyright © 2014-2017 Pete Batard <pete@akeo.ie> | ||||||
|  * |  * | ||||||
|  * This program is free software: you can redistribute it and/or modify |  * This program is free software: you can redistribute it and/or modify | ||||||
|  * it under the terms of the GNU General Public License as published by |  * it under the terms of the GNU General Public License as published by | ||||||
|  | @ -42,7 +42,8 @@ | ||||||
| #include "drive.h" | #include "drive.h" | ||||||
| #include "dev.h" | #include "dev.h" | ||||||
| 
 | 
 | ||||||
| extern StrArray DriveID, DriveLabel; | extern StrArray DriveID, DriveLabel, DriveHub; | ||||||
|  | extern uint32_t DrivePort[MAX_DRIVES]; | ||||||
| extern BOOL enable_HDDs, use_fake_units, enable_vmdk, usb_debug, list_non_usb_removable_drives; | extern BOOL enable_HDDs, use_fake_units, enable_vmdk, usb_debug, list_non_usb_removable_drives; | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  | @ -123,6 +124,51 @@ out: | ||||||
| 	return r; | 	return r; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /*
 | ||||||
|  |  * Cycle port (reset) the selected device | ||||||
|  |  */ | ||||||
|  | BOOL ResetDevice(int index) | ||||||
|  | { | ||||||
|  | 	static uint64_t LastReset = 0; | ||||||
|  | 	BOOL r = FALSE; | ||||||
|  | 	HANDLE handle = INVALID_HANDLE_VALUE; | ||||||
|  | 	DWORD size; | ||||||
|  | 	USB_CYCLE_PORT_PARAMS cycle_port; | ||||||
|  | 
 | ||||||
|  | 	// Wait at least 10 secs between resets
 | ||||||
|  | 	if (_GetTickCount64() < LastReset + 10000ULL) { | ||||||
|  | 		uprintf("You must wait at least 10 seconds before trying to reset a device"); | ||||||
|  | 		return FALSE; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (DriveHub.String[index] == NULL) | ||||||
|  | 		return FALSE; | ||||||
|  | 
 | ||||||
|  | 	LastReset = _GetTickCount64(); | ||||||
|  | 
 | ||||||
|  | 	handle = CreateFileA(DriveHub.String[index], GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); | ||||||
|  | 	if (handle == INVALID_HANDLE_VALUE) { | ||||||
|  | 		uprintf("Could not open %s: %s", DriveHub.String[index], WindowsErrorString()); | ||||||
|  | 		goto out; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	memset(&cycle_port, 0, sizeof(cycle_port)); | ||||||
|  | 	size = sizeof(cycle_port); | ||||||
|  | 	cycle_port.ConnectionIndex = DrivePort[index]; | ||||||
|  | 	uprintf("Cycling port %d (reset) on %s", DrivePort[index], DriveHub.String[index]); | ||||||
|  | 	// As per https://msdn.microsoft.com/en-us/library/windows/hardware/ff537340.aspx
 | ||||||
|  | 	// IOCTL_USB_HUB_CYCLE_PORT is not supported on Windows 7, Windows Vista, and Windows Server 2008
 | ||||||
|  | 	if (!DeviceIoControl(handle, IOCTL_USB_HUB_CYCLE_PORT, &cycle_port, size, &cycle_port, size, &size, NULL)) { | ||||||
|  | 		uprintf("  Failed to cycle port: %s", WindowsErrorString()); | ||||||
|  | 		goto out; | ||||||
|  | 	} | ||||||
|  | 	r = TRUE; | ||||||
|  | 
 | ||||||
|  | out: | ||||||
|  | 	safe_closehandle(handle); | ||||||
|  | 	return r; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static __inline BOOL IsVHD(const char* buffer) | static __inline BOOL IsVHD(const char* buffer) | ||||||
| { | { | ||||||
| 	int i; | 	int i; | ||||||
|  | @ -319,12 +365,13 @@ BOOL GetDevices(DWORD devnum) | ||||||
| 	LONG maxwidth = 0; | 	LONG maxwidth = 0; | ||||||
| 	int s, score, drive_number, remove_drive; | 	int s, score, drive_number, remove_drive; | ||||||
| 	char drive_letters[27], *device_id, *devid_list = NULL, entry_msg[128]; | 	char drive_letters[27], *device_id, *devid_list = NULL, entry_msg[128]; | ||||||
| 	char *p, *label, *entry, buffer[MAX_PATH], str[MAX_PATH], *method_str; | 	char *p, *label, *entry, buffer[MAX_PATH], str[MAX_PATH], *method_str, *hub_path; | ||||||
| 	usb_device_props props; | 	usb_device_props props; | ||||||
| 
 | 
 | ||||||
| 	IGNORE_RETVAL(ComboBox_ResetContent(hDeviceList)); | 	IGNORE_RETVAL(ComboBox_ResetContent(hDeviceList)); | ||||||
| 	StrArrayClear(&DriveID); | 	StrArrayClear(&DriveID); | ||||||
| 	StrArrayClear(&DriveLabel); | 	StrArrayClear(&DriveLabel); | ||||||
|  | 	StrArrayClear(&DriveHub); | ||||||
| 	StrArrayCreate(&dev_if_path, 128); | 	StrArrayCreate(&dev_if_path, 128); | ||||||
| 	// Add a dummy for string index zero, as this is what non matching hashes will point to
 | 	// Add a dummy for string index zero, as this is what non matching hashes will point to
 | ||||||
| 	StrArrayAdd(&dev_if_path, "", TRUE); | 	StrArrayAdd(&dev_if_path, "", TRUE); | ||||||
|  | @ -452,6 +499,7 @@ BOOL GetDevices(DWORD devnum) | ||||||
| 		memset(buffer, 0, sizeof(buffer)); | 		memset(buffer, 0, sizeof(buffer)); | ||||||
| 		memset(&props, 0, sizeof(props)); | 		memset(&props, 0, sizeof(props)); | ||||||
| 		method_str = ""; | 		method_str = ""; | ||||||
|  | 		hub_path = NULL; | ||||||
| 		if (!SetupDiGetDeviceRegistryPropertyA(dev_info, &dev_info_data, SPDRP_ENUMERATOR_NAME, | 		if (!SetupDiGetDeviceRegistryPropertyA(dev_info, &dev_info_data, SPDRP_ENUMERATOR_NAME, | ||||||
| 				&datatype, (LPBYTE)buffer, sizeof(buffer), &size)) { | 				&datatype, (LPBYTE)buffer, sizeof(buffer), &size)) { | ||||||
| 			uprintf("SetupDiGetDeviceRegistryProperty (Enumerator Name) failed: %s\n", WindowsErrorString()); | 			uprintf("SetupDiGetDeviceRegistryProperty (Enumerator Name) failed: %s\n", WindowsErrorString()); | ||||||
|  | @ -584,8 +632,10 @@ BOOL GetDevices(DWORD devnum) | ||||||
| 				if ((uintptr_t)htab_devid.table[j].data > 0) { | 				if ((uintptr_t)htab_devid.table[j].data > 0) { | ||||||
| 					uuprintf("  Matched with Hub[%d]: '%s'", (uintptr_t)htab_devid.table[j].data, | 					uuprintf("  Matched with Hub[%d]: '%s'", (uintptr_t)htab_devid.table[j].data, | ||||||
| 							dev_if_path.String[(uintptr_t)htab_devid.table[j].data]); | 							dev_if_path.String[(uintptr_t)htab_devid.table[j].data]); | ||||||
| 					if (GetUSBProperties(dev_if_path.String[(uintptr_t)htab_devid.table[j].data], device_id, &props)) | 					if (GetUSBProperties(dev_if_path.String[(uintptr_t)htab_devid.table[j].data], device_id, &props)) { | ||||||
| 						method_str = ""; | 						method_str = ""; | ||||||
|  | 						hub_path = dev_if_path.String[(uintptr_t)htab_devid.table[j].data]; | ||||||
|  | 					} | ||||||
| #ifdef FORCED_DEVICE | #ifdef FORCED_DEVICE | ||||||
| 					props.vid = FORCED_VID; | 					props.vid = FORCED_VID; | ||||||
| 					props.pid = FORCED_PID; | 					props.pid = FORCED_PID; | ||||||
|  | @ -769,6 +819,8 @@ BOOL GetDevices(DWORD devnum) | ||||||
| 				// Must ensure that the combo box is UNSORTED for indexes to be the same
 | 				// Must ensure that the combo box is UNSORTED for indexes to be the same
 | ||||||
| 				StrArrayAdd(&DriveID, buffer, TRUE); | 				StrArrayAdd(&DriveID, buffer, TRUE); | ||||||
| 				StrArrayAdd(&DriveLabel, label, TRUE); | 				StrArrayAdd(&DriveLabel, label, TRUE); | ||||||
|  | 				if ((hub_path != NULL) && (StrArrayAdd(&DriveHub, hub_path, TRUE) >= 0)) | ||||||
|  | 					DrivePort[DriveHub.Index - 1] = props.port; | ||||||
| 
 | 
 | ||||||
| 				IGNORE_RETVAL(ComboBox_SetItemData(hDeviceList, ComboBox_AddStringU(hDeviceList, entry), drive_index)); | 				IGNORE_RETVAL(ComboBox_SetItemData(hDeviceList, ComboBox_AddStringU(hDeviceList, entry), drive_index)); | ||||||
| 				maxwidth = max(maxwidth, GetEntryWidth(hDeviceList, entry)); | 				maxwidth = max(maxwidth, GetEntryWidth(hDeviceList, entry)); | ||||||
|  |  | ||||||
							
								
								
									
										10
									
								
								src/dev.h
									
										
									
									
									
								
							
							
						
						
									
										10
									
								
								src/dev.h
									
										
									
									
									
								
							|  | @ -1,7 +1,7 @@ | ||||||
| /*
 | /*
 | ||||||
|  * Rufus: The Reliable USB Formatting Utility |  * Rufus: The Reliable USB Formatting Utility | ||||||
|  * Device listing |  * Device listing | ||||||
|  * Copyright © 2014-2016 Pete Batard <pete@akeo.ie> |  * Copyright © 2014-2016 Pete Batard <pete@akeo.ie> | ||||||
|  * |  * | ||||||
|  * This program is free software: you can redistribute it and/or modify |  * This program is free software: you can redistribute it and/or modify | ||||||
|  * it under the terms of the GNU General Public License as published by |  * it under the terms of the GNU General Public License as published by | ||||||
|  | @ -106,9 +106,12 @@ DECLSPEC_IMPORT CONFIGRET WINAPI CM_Get_Sibling(PDEVINST pdnDevInst, DEVINST dnD | ||||||
| // This last one is unknown from MinGW32 and needs to be fetched from the DLL
 | // This last one is unknown from MinGW32 and needs to be fetched from the DLL
 | ||||||
| PF_TYPE_DECL(WINAPI, CONFIGRET, CM_Get_DevNode_Registry_PropertyA, (DEVINST, ULONG, PULONG, PVOID, PULONG, ULONG)); | PF_TYPE_DECL(WINAPI, CONFIGRET, CM_Get_DevNode_Registry_PropertyA, (DEVINST, ULONG, PULONG, PVOID, PULONG, ULONG)); | ||||||
| 
 | 
 | ||||||
|  | #define USB_HUB_CYCLE_PORT                        273 | ||||||
| #define USB_GET_NODE_CONNECTION_INFORMATION_EX    274 | #define USB_GET_NODE_CONNECTION_INFORMATION_EX    274 | ||||||
| #define USB_GET_NODE_CONNECTION_INFORMATION_EX_V2 279 | #define USB_GET_NODE_CONNECTION_INFORMATION_EX_V2 279 | ||||||
| 
 | 
 | ||||||
|  | #define IOCTL_USB_HUB_CYCLE_PORT \ | ||||||
|  |   CTL_CODE(FILE_DEVICE_USB, USB_HUB_CYCLE_PORT, METHOD_BUFFERED, FILE_ANY_ACCESS) | ||||||
| #define IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX \ | #define IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX \ | ||||||
|   CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_INFORMATION_EX, METHOD_BUFFERED, FILE_ANY_ACCESS) |   CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_INFORMATION_EX, METHOD_BUFFERED, FILE_ANY_ACCESS) | ||||||
| #define IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX_V2 \ | #define IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX_V2 \ | ||||||
|  | @ -172,6 +175,11 @@ typedef struct _USB_NODE_CONNECTION_INFORMATION_EX_V2 { | ||||||
| 	USB_NODE_CONNECTION_INFORMATION_EX_V2_FLAGS Flags; | 	USB_NODE_CONNECTION_INFORMATION_EX_V2_FLAGS Flags; | ||||||
| } USB_NODE_CONNECTION_INFORMATION_EX_V2, *PUSB_NODE_CONNECTION_INFORMATION_EX_V2; | } USB_NODE_CONNECTION_INFORMATION_EX_V2, *PUSB_NODE_CONNECTION_INFORMATION_EX_V2; | ||||||
| 
 | 
 | ||||||
|  | typedef struct { | ||||||
|  | 	ULONG ConnectionIndex; | ||||||
|  | 	ULONG StatusReturned; | ||||||
|  | } USB_CYCLE_PORT_PARAMS; | ||||||
|  | 
 | ||||||
| #pragma pack(pop) | #pragma pack(pop) | ||||||
| 
 | 
 | ||||||
| const GUID _GUID_DEVINTERFACE_DISK = | const GUID _GUID_DEVINTERFACE_DISK = | ||||||
|  |  | ||||||
							
								
								
									
										30
									
								
								src/rufus.c
									
										
									
									
									
								
							
							
						
						
									
										30
									
								
								src/rufus.c
									
										
									
									
									
								
							|  | @ -114,7 +114,8 @@ uint16_t rufus_version[3], embedded_sl_version[2]; | ||||||
| char embedded_sl_version_str[2][12] = { "?.??", "?.??" }; | char embedded_sl_version_str[2][12] = { "?.??", "?.??" }; | ||||||
| char embedded_sl_version_ext[2][32]; | char embedded_sl_version_ext[2][32]; | ||||||
| RUFUS_UPDATE update = { {0,0,0}, {0,0}, NULL, NULL}; | RUFUS_UPDATE update = { {0,0,0}, {0,0}, NULL, NULL}; | ||||||
| StrArray DriveID, DriveLabel, BlockingProcess; | StrArray DriveID, DriveLabel, DriveHub, BlockingProcess; | ||||||
|  | uint32_t DrivePort[MAX_DRIVES]; | ||||||
| extern char* szStatusMessage; | extern char* szStatusMessage; | ||||||
| 
 | 
 | ||||||
| static HANDLE format_thid = NULL, dialog_handle = NULL; | static HANDLE format_thid = NULL, dialog_handle = NULL; | ||||||
|  | @ -1828,9 +1829,10 @@ static void InitDialog(HWND hDlg) | ||||||
| 	} | 	} | ||||||
| 	IGNORE_RETVAL(ComboBox_SetCurSel(hDiskID, 0)); | 	IGNORE_RETVAL(ComboBox_SetCurSel(hDiskID, 0)); | ||||||
| 
 | 
 | ||||||
| 	// Create the string array
 | 	// Create the string arrays
 | ||||||
| 	StrArrayCreate(&DriveID, MAX_DRIVES); | 	StrArrayCreate(&DriveID, MAX_DRIVES); | ||||||
| 	StrArrayCreate(&DriveLabel, MAX_DRIVES); | 	StrArrayCreate(&DriveLabel, MAX_DRIVES); | ||||||
|  | 	StrArrayCreate(&DriveHub, MAX_DRIVES); | ||||||
| 	StrArrayCreate(&BlockingProcess, 16); | 	StrArrayCreate(&BlockingProcess, 16); | ||||||
| 	// Set various checkboxes
 | 	// Set various checkboxes
 | ||||||
| 	CheckDlgButton(hDlg, IDC_QUICKFORMAT, BST_CHECKED); | 	CheckDlgButton(hDlg, IDC_QUICKFORMAT, BST_CHECKED); | ||||||
|  | @ -2351,6 +2353,7 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA | ||||||
| 			PostQuitMessage(0); | 			PostQuitMessage(0); | ||||||
| 			StrArrayDestroy(&DriveID); | 			StrArrayDestroy(&DriveID); | ||||||
| 			StrArrayDestroy(&DriveLabel); | 			StrArrayDestroy(&DriveLabel); | ||||||
|  | 			StrArrayDestroy(&DriveHub); | ||||||
| 			StrArrayDestroy(&BlockingProcess); | 			StrArrayDestroy(&BlockingProcess); | ||||||
| 			DestroyAllTooltips(); | 			DestroyAllTooltips(); | ||||||
| 			DestroyWindow(hLogDlg); | 			DestroyWindow(hLogDlg); | ||||||
|  | @ -3351,7 +3354,7 @@ relaunch: | ||||||
| 
 | 
 | ||||||
| 	// Do our own event processing and process "magic" commands
 | 	// Do our own event processing and process "magic" commands
 | ||||||
| 	while(GetMessage(&msg, NULL, 0, 0)) { | 	while(GetMessage(&msg, NULL, 0, 0)) { | ||||||
| 		// ** *****  **** ** ******** *
 | 		// ** *****  **** ** **********
 | ||||||
| 		// .,ABCDEFGHIJKLMNOPQRSTUVWXYZ
 | 		// .,ABCDEFGHIJKLMNOPQRSTUVWXYZ
 | ||||||
| 
 | 
 | ||||||
| 		// Ctrl-A => Select the log data
 | 		// Ctrl-A => Select the log data
 | ||||||
|  | @ -3359,6 +3362,7 @@ relaunch: | ||||||
| 			(msg.message == WM_KEYDOWN) && (msg.wParam == 'A') ) { | 			(msg.message == WM_KEYDOWN) && (msg.wParam == 'A') ) { | ||||||
| 			// Might also need ES_NOHIDESEL property if you want to select when not active
 | 			// Might also need ES_NOHIDESEL property if you want to select when not active
 | ||||||
| 			Edit_SetSel(hLog, 0, -1); | 			Edit_SetSel(hLog, 0, -1); | ||||||
|  | 			continue; | ||||||
| 		} | 		} | ||||||
| 		// Alt-. => Enable USB enumeration debug
 | 		// Alt-. => Enable USB enumeration debug
 | ||||||
| 		if ((msg.message == WM_SYSKEYDOWN) && (msg.wParam == VK_OEM_PERIOD)) { | 		if ((msg.message == WM_SYSKEYDOWN) && (msg.wParam == VK_OEM_PERIOD)) { | ||||||
|  | @ -3385,12 +3389,12 @@ relaunch: | ||||||
| 			PrintStatusTimeout(lmprintf(MSG_256), detect_fakes); | 			PrintStatusTimeout(lmprintf(MSG_256), detect_fakes); | ||||||
| 			continue; | 			continue; | ||||||
| 		} | 		} | ||||||
| 		// Alt C => Force the update check to be successful
 | 		// Alt-C => Cycle USB port for currently selected device
 | ||||||
| 		// This will set the reported current version of Rufus to 0.0.0.0 when performing an update
 |  | ||||||
| 		// check, so that it always succeeds. This is useful for translators.
 |  | ||||||
| 		if ((msg.message == WM_SYSKEYDOWN) && (msg.wParam == 'C')) { | 		if ((msg.message == WM_SYSKEYDOWN) && (msg.wParam == 'C')) { | ||||||
| 			force_update = !force_update; | 			int index = ComboBox_GetCurSel(hDeviceList); | ||||||
| 			PrintStatusTimeout(lmprintf(MSG_259), force_update); | 			if (index < 0) | ||||||
|  | 				break; | ||||||
|  | 			ResetDevice(index); | ||||||
| 			continue; | 			continue; | ||||||
| 		} | 		} | ||||||
| 		// Alt-D => Delete the NoDriveTypeAutorun key on exit (useful if the app crashed)
 | 		// Alt-D => Delete the NoDriveTypeAutorun key on exit (useful if the app crashed)
 | ||||||
|  | @ -3473,7 +3477,6 @@ relaunch: | ||||||
| 			PrintStatusTimeout(lmprintf(MSG_290), !disable_file_indexing); | 			PrintStatusTimeout(lmprintf(MSG_290), !disable_file_indexing); | ||||||
| 			continue; | 			continue; | ||||||
| 		} | 		} | ||||||
| 
 |  | ||||||
| 		// Alt-R => Remove all the registry keys that may have been created by Rufus
 | 		// Alt-R => Remove all the registry keys that may have been created by Rufus
 | ||||||
| 		if ((msg.message == WM_SYSKEYDOWN) && (msg.wParam == 'R')) { | 		if ((msg.message == WM_SYSKEYDOWN) && (msg.wParam == 'R')) { | ||||||
| 			PrintStatus(2000, DeleteRegistryKey(REGKEY_HKCU, COMPANY_NAME "\\" APPLICATION_NAME)?MSG_248:MSG_249); | 			PrintStatus(2000, DeleteRegistryKey(REGKEY_HKCU, COMPANY_NAME "\\" APPLICATION_NAME)?MSG_248:MSG_249); | ||||||
|  | @ -3525,11 +3528,20 @@ relaunch: | ||||||
| 			SHDeleteDirectoryExU(NULL, tmp_path, FOF_SILENT | FOF_NOERRORUI | FOF_NOCONFIRMATION); | 			SHDeleteDirectoryExU(NULL, tmp_path, FOF_SILENT | FOF_NOERRORUI | FOF_NOCONFIRMATION); | ||||||
| 			continue; | 			continue; | ||||||
| 		} | 		} | ||||||
|  | 		// Alt Y => Force the update check to be successful
 | ||||||
|  | 		// This will set the reported current version of Rufus to 0.0.0.0 when performing an update
 | ||||||
|  | 		// check, so that it always succeeds. This is useful for translators.
 | ||||||
|  | 		if ((msg.message == WM_SYSKEYDOWN) && (msg.wParam == 'Y')) { | ||||||
|  | 			force_update = !force_update; | ||||||
|  | 			PrintStatusTimeout(lmprintf(MSG_259), force_update); | ||||||
|  | 			continue; | ||||||
|  | 		} | ||||||
| 		// Alt-Z => Zero the drive
 | 		// Alt-Z => Zero the drive
 | ||||||
| 		if ((msg.message == WM_SYSKEYDOWN) && (msg.wParam == 'Z')) { | 		if ((msg.message == WM_SYSKEYDOWN) && (msg.wParam == 'Z')) { | ||||||
| 			zero_drive = TRUE; | 			zero_drive = TRUE; | ||||||
| 			// Simulate a button click for Start
 | 			// Simulate a button click for Start
 | ||||||
| 			PostMessage(hDlg, WM_COMMAND, (WPARAM)IDC_START, 0); | 			PostMessage(hDlg, WM_COMMAND, (WPARAM)IDC_START, 0); | ||||||
|  | 			continue; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		// Hazardous cheat modes require Ctrl + Alt
 | 		// Hazardous cheat modes require Ctrl + Alt
 | ||||||
|  |  | ||||||
							
								
								
									
										11
									
								
								src/rufus.h
									
										
									
									
									
								
							
							
						
						
									
										11
									
								
								src/rufus.h
									
										
									
									
									
								
							|  | @ -369,11 +369,11 @@ enum WindowsVersion { | ||||||
| 	WINDOWS_UNDEFINED = -1, | 	WINDOWS_UNDEFINED = -1, | ||||||
| 	WINDOWS_UNSUPPORTED = 0, | 	WINDOWS_UNSUPPORTED = 0, | ||||||
| 	WINDOWS_XP = 0x51, | 	WINDOWS_XP = 0x51, | ||||||
| 	WINDOWS_2003 = 0x52,	// Also XP x64
 | 	WINDOWS_2003 = 0x52,	// Also XP_64
 | ||||||
| 	WINDOWS_VISTA = 0x60, | 	WINDOWS_VISTA = 0x60,	// Also 2008
 | ||||||
| 	WINDOWS_7 = 0x61, | 	WINDOWS_7 = 0x61,		// Also 2008_R2
 | ||||||
| 	WINDOWS_8 = 0x62, | 	WINDOWS_8 = 0x62,		// Also 2012
 | ||||||
| 	WINDOWS_8_1 = 0x63, | 	WINDOWS_8_1 = 0x63,		// Also 2012_R2
 | ||||||
| 	WINDOWS_10_PREVIEW1 = 0x64, | 	WINDOWS_10_PREVIEW1 = 0x64, | ||||||
| 	WINDOWS_10 = 0xA0, | 	WINDOWS_10 = 0xA0, | ||||||
| 	WINDOWS_MAX | 	WINDOWS_MAX | ||||||
|  | @ -460,6 +460,7 @@ extern DWORD GetResourceSize(HMODULE module, char* name, char* type, const char* | ||||||
| extern DWORD RunCommand(const char* cmdline, const char* dir, BOOL log); | extern DWORD RunCommand(const char* cmdline, const char* dir, BOOL log); | ||||||
| extern BOOL CompareGUID(const GUID *guid1, const GUID *guid2); | extern BOOL CompareGUID(const GUID *guid1, const GUID *guid2); | ||||||
| extern BOOL GetDevices(DWORD devnum); | extern BOOL GetDevices(DWORD devnum); | ||||||
|  | extern BOOL ResetDevice(int index); | ||||||
| extern BOOL GetOpticalMedia(IMG_SAVE* img_save); | extern BOOL GetOpticalMedia(IMG_SAVE* img_save); | ||||||
| extern BOOL SetLGP(BOOL bRestore, BOOL* bExistingKey, const char* szPath, const char* szPolicy, DWORD dwValue); | extern BOOL SetLGP(BOOL bRestore, BOOL* bExistingKey, const char* szPath, const char* szPolicy, DWORD dwValue); | ||||||
| extern LONG GetEntryWidth(HWND hDropDown, const char* entry); | extern LONG GetEntryWidth(HWND hDropDown, const char* entry); | ||||||
|  |  | ||||||
							
								
								
									
										10
									
								
								src/rufus.rc
									
										
									
									
									
								
							
							
						
						
									
										10
									
								
								src/rufus.rc
									
										
									
									
									
								
							|  | @ -33,7 +33,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL | ||||||
| IDD_DIALOG DIALOGEX 12, 12, 242, 376 | IDD_DIALOG DIALOGEX 12, 12, 242, 376 | ||||||
| STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU | STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU | ||||||
| EXSTYLE WS_EX_ACCEPTFILES | EXSTYLE WS_EX_ACCEPTFILES | ||||||
| CAPTION "Rufus 2.18.1200" | CAPTION "Rufus 2.18.1201" | ||||||
| FONT 8, "Segoe UI Symbol", 400, 0, 0x0 | FONT 8, "Segoe UI Symbol", 400, 0, 0x0 | ||||||
| BEGIN | BEGIN | ||||||
|     LTEXT           "Device",IDS_DEVICE_TXT,9,6,200,8 |     LTEXT           "Device",IDS_DEVICE_TXT,9,6,200,8 | ||||||
|  | @ -366,8 +366,8 @@ END | ||||||
| // | // | ||||||
| 
 | 
 | ||||||
| VS_VERSION_INFO VERSIONINFO | VS_VERSION_INFO VERSIONINFO | ||||||
|  FILEVERSION 2,18,1200,0 |  FILEVERSION 2,18,1201,0 | ||||||
|  PRODUCTVERSION 2,18,1200,0 |  PRODUCTVERSION 2,18,1201,0 | ||||||
|  FILEFLAGSMASK 0x3fL |  FILEFLAGSMASK 0x3fL | ||||||
| #ifdef _DEBUG | #ifdef _DEBUG | ||||||
|  FILEFLAGS 0x1L |  FILEFLAGS 0x1L | ||||||
|  | @ -384,13 +384,13 @@ BEGIN | ||||||
|         BEGIN |         BEGIN | ||||||
|             VALUE "CompanyName", "Akeo Consulting (http://akeo.ie)" |             VALUE "CompanyName", "Akeo Consulting (http://akeo.ie)" | ||||||
|             VALUE "FileDescription", "Rufus" |             VALUE "FileDescription", "Rufus" | ||||||
|             VALUE "FileVersion", "2.18.1200" |             VALUE "FileVersion", "2.18.1201" | ||||||
|             VALUE "InternalName", "Rufus" |             VALUE "InternalName", "Rufus" | ||||||
|             VALUE "LegalCopyright", "© 2011-2017 Pete Batard (GPL v3)" |             VALUE "LegalCopyright", "© 2011-2017 Pete Batard (GPL v3)" | ||||||
|             VALUE "LegalTrademarks", "http://www.gnu.org/copyleft/gpl.html" |             VALUE "LegalTrademarks", "http://www.gnu.org/copyleft/gpl.html" | ||||||
|             VALUE "OriginalFilename", "rufus.exe" |             VALUE "OriginalFilename", "rufus.exe" | ||||||
|             VALUE "ProductName", "Rufus" |             VALUE "ProductName", "Rufus" | ||||||
|             VALUE "ProductVersion", "2.18.1200" |             VALUE "ProductVersion", "2.18.1201" | ||||||
|         END |         END | ||||||
|     END |     END | ||||||
|     BLOCK "VarFileInfo" |     BLOCK "VarFileInfo" | ||||||
|  |  | ||||||
							
								
								
									
										12
									
								
								src/stdfn.c
									
										
									
									
									
								
							
							
						
						
									
										12
									
								
								src/stdfn.c
									
										
									
									
									
								
							|  | @ -284,20 +284,20 @@ void GetWindowsVersion(void) | ||||||
| 			switch (nWindowsVersion) { | 			switch (nWindowsVersion) { | ||||||
| 			case 0x51: w = "XP"; | 			case 0x51: w = "XP"; | ||||||
| 				break; | 				break; | ||||||
| 			case 0x52: w = (!GetSystemMetrics(89)?"2003":"2003_R2"); | 			case 0x52: w = (!GetSystemMetrics(89)?"Server 2003":"Server 2003_R2"); | ||||||
| 				break; | 				break; | ||||||
| 			case 0x60: w = (ws?"Vista":"2008"); | 			case 0x60: w = (ws?"Vista":"Server 2008"); | ||||||
| 				break; | 				break; | ||||||
| 			case 0x61: w = (ws?"7":"2008_R2"); | 			case 0x61: w = (ws?"7":"Server 2008_R2"); | ||||||
| 				break; | 				break; | ||||||
| 			case 0x62: w = (ws?"8":"2012"); | 			case 0x62: w = (ws?"8":"Server 2012"); | ||||||
| 				break; | 				break; | ||||||
| 			case 0x63: w = (ws?"8.1":"2012_R2"); | 			case 0x63: w = (ws?"8.1":"Server 2012_R2"); | ||||||
| 				break; | 				break; | ||||||
| 			case 0x64: w = (ws?"10 (Preview 1)":"Server 10 (Preview 1)"); | 			case 0x64: w = (ws?"10 (Preview 1)":"Server 10 (Preview 1)"); | ||||||
| 				break; | 				break; | ||||||
| 			// Starting with Windows 10 Preview 2, the major is the same as the public-facing version
 | 			// Starting with Windows 10 Preview 2, the major is the same as the public-facing version
 | ||||||
| 			case 0xA0: w = (ws?"10":"Server 10"); | 			case 0xA0: w = (ws?"10":"Server 2016"); | ||||||
| 				break; | 				break; | ||||||
| 			default: | 			default: | ||||||
| 				if (nWindowsVersion < 0x51) | 				if (nWindowsVersion < 0x51) | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue