mirror of
				https://github.com/pbatard/rufus.git
				synced 2024-08-14 23:57:05 +00:00 
			
		
		
		
	[misc] move drive related functions into their own source
This commit is contained in:
		
							parent
							
								
									79f3e78ec3
								
							
						
					
					
						commit
						2390b305c8
					
				
					 10 changed files with 226 additions and 162 deletions
				
			
		|  | @ -147,6 +147,7 @@ | |||
|   </ItemDefinitionGroup> | ||||
|   <ItemGroup> | ||||
|     <ClCompile Include="..\br.c" /> | ||||
|     <ClCompile Include="..\drive.c" /> | ||||
|     <ClCompile Include="..\fat12.c" /> | ||||
|     <ClCompile Include="..\fat16.c" /> | ||||
|     <ClCompile Include="..\fat32.c" /> | ||||
|  |  | |||
|  | @ -13,7 +13,7 @@ | |||
|       <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier> | ||||
|       <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav</Extensions> | ||||
|     </Filter> | ||||
|     <Filter Include="Header Files\inc"> | ||||
|     <Filter Include="Header Files\ms-sys inc"> | ||||
|       <UniqueIdentifier>{ecff9fec-41c4-4ce8-b725-27ee39754cb7}</UniqueIdentifier> | ||||
|     </Filter> | ||||
|   </ItemGroup> | ||||
|  | @ -48,6 +48,9 @@ | |||
|     <ClCompile Include="..\format.c"> | ||||
|       <Filter>Source Files</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\drive.c"> | ||||
|       <Filter>Source Files</Filter> | ||||
|     </ClCompile> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|     <ClInclude Include="..\rufus.h"> | ||||
|  | @ -66,88 +69,88 @@ | |||
|       <Filter>Header Files</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\inc\br.h"> | ||||
|       <Filter>Header Files\inc</Filter> | ||||
|       <Filter>Header Files\ms-sys inc</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\inc\br_fat12_0x0.h"> | ||||
|       <Filter>Header Files\inc</Filter> | ||||
|       <Filter>Header Files\ms-sys inc</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\inc\br_fat12_0x3e.h"> | ||||
|       <Filter>Header Files\inc</Filter> | ||||
|       <Filter>Header Files\ms-sys inc</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\inc\br_fat16_0x0.h"> | ||||
|       <Filter>Header Files\inc</Filter> | ||||
|       <Filter>Header Files\ms-sys inc</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\inc\br_fat16_0x3e.h"> | ||||
|       <Filter>Header Files\inc</Filter> | ||||
|       <Filter>Header Files\ms-sys inc</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\inc\br_fat16fd_0x3e.h"> | ||||
|       <Filter>Header Files\inc</Filter> | ||||
|       <Filter>Header Files\ms-sys inc</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\inc\br_fat32_0x0.h"> | ||||
|       <Filter>Header Files\inc</Filter> | ||||
|       <Filter>Header Files\ms-sys inc</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\inc\br_fat32_0x3f0.h"> | ||||
|       <Filter>Header Files\inc</Filter> | ||||
|       <Filter>Header Files\ms-sys inc</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\inc\br_fat32_0x52.h"> | ||||
|       <Filter>Header Files\inc</Filter> | ||||
|       <Filter>Header Files\ms-sys inc</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\inc\br_fat32fd_0x3f0.h"> | ||||
|       <Filter>Header Files\inc</Filter> | ||||
|       <Filter>Header Files\ms-sys inc</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\inc\br_fat32fd_0x52.h"> | ||||
|       <Filter>Header Files\inc</Filter> | ||||
|       <Filter>Header Files\ms-sys inc</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\inc\br_fat32nt_0x0.h"> | ||||
|       <Filter>Header Files\inc</Filter> | ||||
|       <Filter>Header Files\ms-sys inc</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\inc\br_fat32nt_0x3f0.h"> | ||||
|       <Filter>Header Files\inc</Filter> | ||||
|       <Filter>Header Files\ms-sys inc</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\inc\br_fat32nt_0x52.h"> | ||||
|       <Filter>Header Files\inc</Filter> | ||||
|       <Filter>Header Files\ms-sys inc</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\inc\br_fat32nt_0x1800.h"> | ||||
|       <Filter>Header Files\inc</Filter> | ||||
|       <Filter>Header Files\ms-sys inc</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\inc\fat12.h"> | ||||
|       <Filter>Header Files\inc</Filter> | ||||
|       <Filter>Header Files\ms-sys inc</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\inc\fat16.h"> | ||||
|       <Filter>Header Files\inc</Filter> | ||||
|       <Filter>Header Files\ms-sys inc</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\inc\fat32.h"> | ||||
|       <Filter>Header Files\inc</Filter> | ||||
|       <Filter>Header Files\ms-sys inc</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\inc\file.h"> | ||||
|       <Filter>Header Files\inc</Filter> | ||||
|       <Filter>Header Files\ms-sys inc</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\inc\label_11_char.h"> | ||||
|       <Filter>Header Files\inc</Filter> | ||||
|       <Filter>Header Files\ms-sys inc</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\inc\mbr_95b.h"> | ||||
|       <Filter>Header Files\inc</Filter> | ||||
|       <Filter>Header Files\ms-sys inc</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\inc\mbr_2000.h"> | ||||
|       <Filter>Header Files\inc</Filter> | ||||
|       <Filter>Header Files\ms-sys inc</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\inc\mbr_dos.h"> | ||||
|       <Filter>Header Files\inc</Filter> | ||||
|       <Filter>Header Files\ms-sys inc</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\inc\mbr_dos_f2.h"> | ||||
|       <Filter>Header Files\inc</Filter> | ||||
|       <Filter>Header Files\ms-sys inc</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\inc\mbr_syslinux.h"> | ||||
|       <Filter>Header Files\inc</Filter> | ||||
|       <Filter>Header Files\ms-sys inc</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\inc\mbr_vista.h"> | ||||
|       <Filter>Header Files\inc</Filter> | ||||
|       <Filter>Header Files\ms-sys inc</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\inc\mbr_win7.h"> | ||||
|       <Filter>Header Files\inc</Filter> | ||||
|       <Filter>Header Files\ms-sys inc</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\inc\mbr_zero.h"> | ||||
|       <Filter>Header Files\inc</Filter> | ||||
|       <Filter>Header Files\ms-sys inc</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\format.h"> | ||||
|       <Filter>Header Files</Filter> | ||||
|  |  | |||
|  | @ -28,6 +28,7 @@ SOURCES=rufus.c  \ | |||
|         stdio.c  \ | ||||
|         stdlg.c  \ | ||||
|         msdos.c  \ | ||||
|         drive.c  \ | ||||
|         file.c   \ | ||||
|         br.c     \ | ||||
|         fat12.c  \ | ||||
|  |  | |||
							
								
								
									
										2
									
								
								Makefile
									
										
									
									
									
								
							
							
						
						
									
										2
									
								
								Makefile
									
										
									
									
									
								
							|  | @ -17,7 +17,7 @@ | |||
| # along with this program; if not, see <http://www.gnu.org/licenses/>.
 | ||||
| #
 | ||||
| 
 | ||||
| OBJECTS   = fat12.o fat16.o fat32.o br.o file.o msdos.o format.o stdio.o stdlg.o rufus.o   | ||||
| OBJECTS   = fat12.o fat16.o fat32.o br.o file.o drive.o msdos.o format.o stdio.o stdlg.o rufus.o   | ||||
| TARGET    = rufus | ||||
| 
 | ||||
| CC        = gcc | ||||
|  |  | |||
							
								
								
									
										157
									
								
								drive.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										157
									
								
								drive.c
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,157 @@ | |||
| /*
 | ||||
|  * Rufus: The Resourceful USB Formatting Utility | ||||
|  * Drive access function calls | ||||
|  * Copyright (c) 2011 Pete Batard <pete@akeo.ie> | ||||
|  * | ||||
|  * 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 | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | ||||
|  */ | ||||
| #ifdef _CRTDBG_MAP_ALLOC | ||||
| #include <stdlib.h> | ||||
| #include <crtdbg.h> | ||||
| #endif | ||||
| 
 | ||||
| #include <windows.h> | ||||
| #include <stdio.h> | ||||
| #include <string.h> | ||||
| #include <ctype.h> | ||||
| 
 | ||||
| #include "msapi_utf8.h" | ||||
| #include "rufus.h" | ||||
| #include "resource.h" | ||||
| 
 | ||||
| /*
 | ||||
|  * Globals | ||||
|  */ | ||||
| RUFUS_DRIVE_INFO SelectedDrive; | ||||
| 
 | ||||
| /*
 | ||||
|  * Open a drive or volume with optional write and lock access | ||||
|  * Returns INVALID_HANDLE_VALUE (/!\ which is DIFFERENT from NULL /!\) on failure. | ||||
|  * This call is quite risky (left unchecked, inadvertently passing 0 as index would | ||||
|  * return a handle to C:, which we might then proceed to unknowingly repartition!), | ||||
|  * so we apply the following mitigation factors: | ||||
|  * - Valid indexes must belong to a specific range [DRIVE_INDEX_MIN; DRIVE_INDEX_MAX] | ||||
|  * - When opening for write access, we lock the volume. If that fails, which would | ||||
|  *   typically be the case on C:\ or any other drive in use, we report failure | ||||
|  * - We report the full path of any drive that was successfully opened for write acces | ||||
|  */ | ||||
| HANDLE GetDriveHandle(DWORD DriveIndex, char* DriveLetter, BOOL bWriteAccess, BOOL bLockDrive) | ||||
| { | ||||
| 	BOOL r; | ||||
| 	DWORD size; | ||||
| 	HANDLE hDrive = INVALID_HANDLE_VALUE; | ||||
| 	STORAGE_DEVICE_NUMBER_REDEF device_number = {0}; | ||||
| 	char drives[26*4];	/* "D:\", "E:\", etc. */ | ||||
| 	char *drive = drives; | ||||
| 	char logical_drive[] = "\\\\.\\#:"; | ||||
| 	char physical_drive[24]; | ||||
| 
 | ||||
| 	if ((DriveIndex < DRIVE_INDEX_MIN) || (DriveIndex > DRIVE_INDEX_MAX)) { | ||||
| 		uprintf("WARNING: Bad index value. Please check the code!\n"); | ||||
| 	} | ||||
| 	DriveIndex -= DRIVE_INDEX_MIN; | ||||
| 
 | ||||
| 	// If no drive letter is requested, open a phyical drive
 | ||||
| 	if (DriveLetter == NULL) { | ||||
| 		safe_sprintf(physical_drive, sizeof(physical_drive), "\\\\.\\PHYSICALDRIVE%d", DriveIndex); | ||||
| 		hDrive = CreateFileA(physical_drive, GENERIC_READ|(bWriteAccess?GENERIC_WRITE:0), | ||||
| 			FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0); | ||||
| 		if (hDrive == INVALID_HANDLE_VALUE) { | ||||
| 			uprintf("Could not open drive %s: %s\n", physical_drive, WindowsErrorString()); | ||||
| 			goto out; | ||||
| 		} | ||||
| 		if (bWriteAccess) { | ||||
| 			uprintf("Caution: Opened %s drive for write access\n", physical_drive); | ||||
| 		} | ||||
| 	} else { | ||||
| 		*DriveLetter = ' '; | ||||
| 		size = GetLogicalDriveStringsA(sizeof(drives), drives); | ||||
| 		if (size == 0) { | ||||
| 			uprintf("GetLogicalDriveStrings failed: %s\n", WindowsErrorString()); | ||||
| 			goto out; | ||||
| 		} | ||||
| 		if (size > sizeof(drives)) { | ||||
| 			uprintf("GetLogicalDriveStrings: buffer too small (required %d vs %d)\n", size, sizeof(drives)); | ||||
| 			goto out; | ||||
| 		} | ||||
| 
 | ||||
| 		hDrive = INVALID_HANDLE_VALUE; | ||||
| 		for ( ;*drive; drive += safe_strlen(drive)+1) { | ||||
| 			if (!isalpha(*drive)) | ||||
| 				continue; | ||||
| 			*drive = (char)toupper((int)*drive); | ||||
| 			if (*drive < 'C') { | ||||
| 				continue; | ||||
| 			} | ||||
| 			safe_sprintf(logical_drive, sizeof(logical_drive), "\\\\.\\%c:", drive[0]); | ||||
| 			hDrive = CreateFileA(logical_drive, GENERIC_READ|(bWriteAccess?GENERIC_WRITE:0), | ||||
| 				FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0); | ||||
| 			if (hDrive == INVALID_HANDLE_VALUE) { | ||||
| 				uprintf("Warning: could not open drive %c: %s\n", drive[0], WindowsErrorString()); | ||||
| 				continue; | ||||
| 			} | ||||
| 
 | ||||
| 			r = DeviceIoControl(hDrive, IOCTL_STORAGE_GET_DEVICE_NUMBER, NULL, | ||||
| 				0, &device_number, sizeof(device_number), &size, NULL); | ||||
| 			if ((!r) || (size <= 0)) { | ||||
| 				uprintf("IOCTL_STORAGE_GET_DEVICE_NUMBER failed for device %s: %s\n", | ||||
| 					logical_drive, WindowsErrorString()); | ||||
| 			} else if (device_number.DeviceNumber == DriveIndex) { | ||||
| 				break; | ||||
| 			} | ||||
| 			safe_closehandle(hDrive); | ||||
| 		} | ||||
| 		if (hDrive == INVALID_HANDLE_VALUE) { | ||||
| 			goto out; | ||||
| 		} | ||||
| 		if (bWriteAccess) { | ||||
| 			uprintf("Caution: Opened %s drive for write access\n", logical_drive); | ||||
| 		} | ||||
| 		*DriveLetter = *drive?*drive:' '; | ||||
| 	} | ||||
| 
 | ||||
| 	if ((bLockDrive) && (!DeviceIoControl(hDrive, FSCTL_LOCK_VOLUME, NULL, 0, NULL, 0, &size, NULL))) { | ||||
| 		uprintf("Could not get exclusive access to %s: %s\n", logical_drive, WindowsErrorString()); | ||||
| 		safe_closehandle(hDrive); | ||||
| 		goto out; | ||||
| 	} | ||||
| 
 | ||||
| out: | ||||
| 	return hDrive; | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * Return the drive letter and volume label | ||||
|  */ | ||||
| BOOL GetDriveLabel(DWORD DriveIndex, char* letter, char** label) | ||||
| { | ||||
| 	HANDLE hDrive; | ||||
| 	char DrivePath[] = "#:\\"; | ||||
| 	static char volume_label[MAX_PATH+1]; | ||||
| 
 | ||||
| 	*label = STR_NO_LABEL; | ||||
| 
 | ||||
| 	hDrive = GetDriveHandle(DriveIndex, DrivePath, FALSE, FALSE); | ||||
| 	if (hDrive == INVALID_HANDLE_VALUE) | ||||
| 		return FALSE; | ||||
| 	safe_closehandle(hDrive); | ||||
| 	*letter = DrivePath[0]; | ||||
| 
 | ||||
| 	if (GetVolumeInformationA(DrivePath, volume_label, sizeof(volume_label), | ||||
| 		NULL, NULL, NULL, NULL, 0) && *volume_label) { | ||||
| 		*label = volume_label; | ||||
| 	} | ||||
| 
 | ||||
| 	return TRUE; | ||||
| } | ||||
							
								
								
									
										7
									
								
								format.c
									
										
									
									
									
								
							
							
						
						
									
										7
									
								
								format.c
									
										
									
									
									
								
							|  | @ -27,7 +27,7 @@ | |||
| #include <string.h> | ||||
| #include <stdlib.h> | ||||
| #include <process.h> | ||||
| // #include <ctype.h>
 | ||||
| #include <stddef.h> | ||||
| 
 | ||||
| #include "msapi_utf8.h" | ||||
| #include "rufus.h" | ||||
|  | @ -38,6 +38,11 @@ | |||
| #include "file.h" | ||||
| #include "format.h" | ||||
| 
 | ||||
| /*
 | ||||
|  * Globals | ||||
|  */ | ||||
| DWORD FormatStatus; | ||||
| 
 | ||||
| /*
 | ||||
|  * FormatEx callback. Return FALSE to halt operations | ||||
|  */ | ||||
|  |  | |||
							
								
								
									
										131
									
								
								rufus.c
									
										
									
									
									
								
							
							
						
						
									
										131
									
								
								rufus.c
									
										
									
									
									
								
							|  | @ -30,7 +30,6 @@ | |||
| #include <stdlib.h> | ||||
| #include <stdio.h> | ||||
| #include <string.h> | ||||
| #include <ctype.h> | ||||
| #include <math.h> | ||||
| #include <commctrl.h> | ||||
| #include <setupapi.h> | ||||
|  | @ -71,14 +70,9 @@ static const char* ClusterSizeLabel[] = { "512 bytes", "1024 bytes","2048 bytes" | |||
| HINSTANCE hMainInstance; | ||||
| HWND hMainDialog; | ||||
| char szFolderPath[MAX_PATH]; | ||||
| HWND hStatus; | ||||
| float fScale = 1.0f; | ||||
| int default_fs; | ||||
| ULONG default_clutersize; | ||||
| RUFUS_DRIVE_INFO SelectedDrive; | ||||
| BOOL bBootable; | ||||
| BOOL bQuickFormat; | ||||
| DWORD FormatStatus; | ||||
| HWND hDeviceList, hCapacity, hFileSystem, hClusterSize, hLabel; | ||||
| static HWND hDeviceTooltip = NULL, hFSTooltip = NULL; | ||||
| 
 | ||||
|  | @ -98,124 +92,6 @@ static const char* GetPartitionType(BYTE Type) | |||
| 	return "Unknown"; | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * Open a drive with optional write access - returns a drive HANDLE and the drive letter | ||||
|  * or INVALID_HANDLE_VALUE (/!\ which is DIFFERENT from NULL /!\) on failure | ||||
|  * This call is quite risky (left unchecked, inadvertently passing 0 as index would | ||||
|  * return a handle to C:, which we might then proceed to unknowingly repartition!), | ||||
|  * so we apply the following mitigation factors: | ||||
|  * - Valid indexes must belong to a specific range [DRIVE_INDEX_MIN; DRIVE_INDEX_MAX] | ||||
|  * - When opening for write access, we lock the volume. If that fails, which would | ||||
|  *   typically be the case on C:\ or any other drive in use, we report failure | ||||
|  * - We report the full path of any drive that was successfully opened for write acces | ||||
|  */ | ||||
| HANDLE GetDriveHandle(DWORD DriveIndex, char* DriveLetter, BOOL bWriteAccess, BOOL bLockDrive) | ||||
| { | ||||
| 	BOOL r; | ||||
| 	DWORD size; | ||||
| 	HANDLE hDrive = INVALID_HANDLE_VALUE; | ||||
| 	STORAGE_DEVICE_NUMBER_REDEF device_number = {0}; | ||||
| 	char drives[26*4];	/* "D:\", "E:\", etc. */ | ||||
| 	char *drive = drives; | ||||
| 	char logical_drive[] = "\\\\.\\#:"; | ||||
| 	char physical_drive[24]; | ||||
| 
 | ||||
| 	if ((DriveIndex < DRIVE_INDEX_MIN) || (DriveIndex > DRIVE_INDEX_MAX)) { | ||||
| 		uprintf("WARNING: Bad index value. Please check the code!\n"); | ||||
| 	} | ||||
| 	DriveIndex -= DRIVE_INDEX_MIN; | ||||
| 
 | ||||
| 	// If no drive letter is requested, open a phyical drive
 | ||||
| 	if (DriveLetter == NULL) { | ||||
| 		safe_sprintf(physical_drive, sizeof(physical_drive), "\\\\.\\PHYSICALDRIVE%d", DriveIndex); | ||||
| 		hDrive = CreateFileA(physical_drive, GENERIC_READ|(bWriteAccess?GENERIC_WRITE:0), | ||||
| 			FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0); | ||||
| 		if (hDrive == INVALID_HANDLE_VALUE) { | ||||
| 			uprintf("Could not open drive %s: %s\n", physical_drive, WindowsErrorString()); | ||||
| 			goto out; | ||||
| 		} | ||||
| 		if (bWriteAccess) { | ||||
| 			uprintf("Caution: Opened %s drive for write access\n", physical_drive); | ||||
| 		} | ||||
| 	} else { | ||||
| 		*DriveLetter = ' '; | ||||
| 		size = GetLogicalDriveStringsA(sizeof(drives), drives); | ||||
| 		if (size == 0) { | ||||
| 			uprintf("GetLogicalDriveStrings failed: %s\n", WindowsErrorString()); | ||||
| 			goto out; | ||||
| 		} | ||||
| 		if (size > sizeof(drives)) { | ||||
| 			uprintf("GetLogicalDriveStrings: buffer too small (required %d vs %d)\n", size, sizeof(drives)); | ||||
| 			goto out; | ||||
| 		} | ||||
| 
 | ||||
| 		hDrive = INVALID_HANDLE_VALUE; | ||||
| 		for ( ;*drive; drive += safe_strlen(drive)+1) { | ||||
| 			if (!isalpha(*drive)) | ||||
| 				continue; | ||||
| 			*drive = (char)toupper((int)*drive); | ||||
| 			if (*drive < 'C') { | ||||
| 				continue; | ||||
| 			} | ||||
| 			safe_sprintf(logical_drive, sizeof(logical_drive), "\\\\.\\%c:", drive[0]); | ||||
| 			hDrive = CreateFileA(logical_drive, GENERIC_READ|(bWriteAccess?GENERIC_WRITE:0), | ||||
| 				FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0); | ||||
| 			if (hDrive == INVALID_HANDLE_VALUE) { | ||||
| 				uprintf("Warning: could not open drive %c: %s\n", drive[0], WindowsErrorString()); | ||||
| 				continue; | ||||
| 			} | ||||
| 
 | ||||
| 			r = DeviceIoControl(hDrive, IOCTL_STORAGE_GET_DEVICE_NUMBER, NULL, | ||||
| 				0, &device_number, sizeof(device_number), &size, NULL); | ||||
| 			if ((!r) || (size <= 0)) { | ||||
| 				uprintf("IOCTL_STORAGE_GET_DEVICE_NUMBER failed for device %s: %s\n", logical_drive, WindowsErrorString()); | ||||
| 			} else if (device_number.DeviceNumber == DriveIndex) { | ||||
| 				break; | ||||
| 			} | ||||
| 			safe_closehandle(hDrive); | ||||
| 		} | ||||
| 		if (hDrive == INVALID_HANDLE_VALUE) { | ||||
| 			goto out; | ||||
| 		} | ||||
| 		if (bWriteAccess) { | ||||
| 			uprintf("Caution: Opened %s drive for write access\n", logical_drive); | ||||
| 		} | ||||
| 		*DriveLetter = *drive?*drive:' '; | ||||
| 	} | ||||
| 
 | ||||
| 	if ((bLockDrive) && (!DeviceIoControl(hDrive, FSCTL_LOCK_VOLUME, NULL, 0, NULL, 0, &size, NULL))) { | ||||
| 		uprintf("Could not get exclusive access to %s: %s\n", logical_drive, WindowsErrorString()); | ||||
| 		safe_closehandle(hDrive); | ||||
| 		goto out; | ||||
| 	} | ||||
| 
 | ||||
| out: | ||||
| 	return hDrive; | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * Return the drive letter and volume label | ||||
|  */ | ||||
| static BOOL GetDriveLabel(DWORD DriveIndex, char* letter, char** label) | ||||
| { | ||||
| 	HANDLE hDrive; | ||||
| 	char DrivePath[] = "#:\\"; | ||||
| 	static char volume_label[MAX_PATH+1]; | ||||
| 
 | ||||
| 	*label = STR_NO_LABEL; | ||||
| 
 | ||||
| 	hDrive = GetDriveHandle(DriveIndex, DrivePath, FALSE, FALSE); | ||||
| 	if (hDrive == INVALID_HANDLE_VALUE) | ||||
| 		return FALSE; | ||||
| 	safe_closehandle(hDrive); | ||||
| 	*letter = DrivePath[0]; | ||||
| 
 | ||||
| 	if (GetVolumeInformationA(DrivePath, volume_label, sizeof(volume_label), NULL, NULL, NULL, NULL, 0) && *volume_label) { | ||||
| 		*label = volume_label; | ||||
| 	} | ||||
| 
 | ||||
| 	return TRUE; | ||||
| } | ||||
| 
 | ||||
| #define KB          1024LL | ||||
| #define MB       1048576LL | ||||
|  | @ -316,6 +192,9 @@ out: | |||
| #undef GB | ||||
| #undef TB | ||||
| 
 | ||||
| /*
 | ||||
|  * Populate the Allocation unit size field | ||||
|  */ | ||||
| static BOOL SetClusterSizes(int FSType) | ||||
| { | ||||
| 	char szDefault[64]; | ||||
|  | @ -689,7 +568,9 @@ static BOOL GetUSBDevices(void) | |||
| 	return TRUE; | ||||
| } | ||||
| 
 | ||||
| /* Toggle controls according to operation */ | ||||
| /* 
 | ||||
|  * Toggle controls according to operation | ||||
|  */ | ||||
| static void EnableControls(BOOL bEnable) | ||||
| { | ||||
| 	EnableWindow(GetDlgItem(hMainDialog, IDC_DEVICE), bEnable); | ||||
|  |  | |||
							
								
								
									
										11
									
								
								rufus.h
									
										
									
									
									
								
							
							
						
						
									
										11
									
								
								rufus.h
									
										
									
									
									
								
							|  | @ -136,6 +136,7 @@ extern BOOL ExtractMSDOS(const char* path); | |||
| extern void __cdecl FormatThread(void* param); | ||||
| extern BOOL CreatePartition(HANDLE hDrive); | ||||
| extern HANDLE GetDriveHandle(DWORD DriveIndex, char* DriveLetter, BOOL bWriteAccess, BOOL bLockDrive); | ||||
| extern BOOL GetDriveLabel(DWORD DriveIndex, char* letter, char** label); | ||||
| 
 | ||||
| __inline static BOOL UnlockDrive(HANDLE hDrive) | ||||
| { | ||||
|  | @ -155,6 +156,16 @@ extern void StrArrayAdd(StrArray* arr, const char* str); | |||
| extern void StrArrayClear(StrArray* arr); | ||||
| extern void StrArrayDestroy(StrArray* arr); | ||||
| 
 | ||||
| /* Clang/MinGW32 has an issue with intptr_t */ | ||||
| #ifndef _UINTPTR_T_DEFINED | ||||
| #define _UINTPTR_T_DEFINED | ||||
| #ifdef _WIN64 | ||||
|   typedef unsigned __int64 uintptr_t; | ||||
| #else | ||||
|   typedef unsigned int uintptr_t; | ||||
| #endif | ||||
| #endif | ||||
| 
 | ||||
| /* We need a redef of this MS structure */ | ||||
| typedef struct { | ||||
| 	DWORD DeviceType; | ||||
|  |  | |||
							
								
								
									
										12
									
								
								rufus.rc
									
										
									
									
									
								
							
							
						
						
									
										12
									
								
								rufus.rc
									
										
									
									
									
								
							|  | @ -63,7 +63,7 @@ BEGIN | |||
|     DEFPUSHBUTTON   "OK",IDOK,231,175,50,14,WS_GROUP | ||||
|     CONTROL         "<a href=""https://github.com/pbatard/rufus/wiki/Rufus"">https://github.com/pbatard/rufus</a>",IDC_ABOUT_RUFUS_URL, | ||||
|                     "SysLink",WS_TABSTOP,46,47,114,9 | ||||
|     LTEXT           "Version 1.0.0 (Build 58)",IDC_STATIC,46,19,78,8 | ||||
|     LTEXT           "Version 1.0.0 (Build 59)",IDC_STATIC,46,19,78,8 | ||||
|     PUSHBUTTON      "License...",IDC_ABOUT_LICENSE,46,175,50,14,WS_GROUP | ||||
|     EDITTEXT        IDC_ABOUT_COPYRIGHTS,46,107,235,63,ES_MULTILINE | ES_READONLY | WS_VSCROLL | ||||
|     LTEXT           "Report bugs or request enhancements at:",IDC_STATIC,46,66,187,8 | ||||
|  | @ -162,8 +162,8 @@ END | |||
| // | ||||
| 
 | ||||
| VS_VERSION_INFO VERSIONINFO | ||||
|  FILEVERSION 1,0,0,58 | ||||
|  PRODUCTVERSION 1,0,0,58 | ||||
|  FILEVERSION 1,0,0,59 | ||||
|  PRODUCTVERSION 1,0,0,59 | ||||
|  FILEFLAGSMASK 0x3fL | ||||
| #ifdef _DEBUG | ||||
|  FILEFLAGS 0x1L | ||||
|  | @ -180,13 +180,13 @@ BEGIN | |||
|         BEGIN | ||||
|             VALUE "CompanyName", "akeo.ie" | ||||
|             VALUE "FileDescription", "Rufus" | ||||
|             VALUE "FileVersion", "1.0.0.58" | ||||
|             VALUE "FileVersion", "1.0.0.59" | ||||
|             VALUE "InternalName", "Rufus" | ||||
|             VALUE "LegalCopyright", "© 2011 Pete Batard (GPL v3)" | ||||
|             VALUE "LegalTrademarks", "http://www.gnu.org/copyleft/gpl.html" | ||||
|             VALUE "OriginalFilename", "rufus.exe" | ||||
|             VALUE "ProductName", "Rufus" | ||||
|             VALUE "ProductVersion", "1.0.0.58" | ||||
|             VALUE "ProductVersion", "1.0.0.59" | ||||
|         END | ||||
|     END | ||||
|     BLOCK "VarFileInfo" | ||||
|  | @ -212,7 +212,7 @@ IDI_ICON                ICON                    "rufus.ico" | |||
| 
 | ||||
| STRINGTABLE | ||||
| BEGIN | ||||
|     IDS_VERSION             "Rufus v1.0.0.58" | ||||
|     IDS_VERSION             "Rufus v1.0.0.59" | ||||
| END | ||||
| 
 | ||||
| #endif    // English resources | ||||
|  |  | |||
							
								
								
									
										5
									
								
								stdio.c
									
										
									
									
									
								
							
							
						
						
									
										5
									
								
								stdio.c
									
										
									
									
									
								
							|  | @ -31,6 +31,11 @@ | |||
| #include "rufus.h" | ||||
| #include "resource.h" | ||||
| 
 | ||||
| /*
 | ||||
|  * Globals | ||||
|  */ | ||||
| HWND hStatus; | ||||
| 
 | ||||
| #ifdef RUFUS_DEBUG | ||||
| void _uprintf(const char *format, ...) | ||||
| { | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue