mirror of
				https://github.com/pbatard/rufus.git
				synced 2024-08-14 23:57:05 +00:00 
			
		
		
		
	[loc] add localization support
* This is a merge up to commit bd319269aa of the localization branch
* Also fixes Clang warnings
			
			
This commit is contained in:
		
							parent
							
								
									cf3964c8a3
								
							
						
					
					
						commit
						df06727416
					
				
					 26 changed files with 3024 additions and 491 deletions
				
			
		
							
								
								
									
										690
									
								
								res/localization/rufus.loc
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										690
									
								
								res/localization/rufus.loc
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,690 @@ | ||||||
|  | # This file should be saved as UTF-8, no-BOM | ||||||
|  | 
 | ||||||
|  | ################################################################################ | ||||||
|  | l "en_US" "English (US)" 0x0409, 0x0809, 0x0c09, 0x1009, 0x1409, 0x1809, 0x1c09, 0x2009, 0x2409, 0x2809, 0x2c09, 0x3009, 0x3409, 0x3809, 0x3c09, 0x4009, 0x4409, 0x4809 | ||||||
|  | g IDD_MESSAGES | ||||||
|  | t MSG_001 "Other instance detected" | ||||||
|  | t MSG_002 "Another Rufus application is running.\n" | ||||||
|  | 	"Please close the first application before running another one." | ||||||
|  | t MSG_003 "WARNING: ALL DATA ON DEVICE '%s' WILL BE DESTROYED.\n" | ||||||
|  | 	"To continue with this operation, click OK. To quit click CANCEL." | ||||||
|  | t MSG_004 "Rufus update policy" | ||||||
|  | t MSG_005 "Do you want to allow Rufus to check for application updates online?" | ||||||
|  | t MSG_006 "Close"	# Must be the same as IDD_DIALOG:IDCANCEL (i.e. "Close" - I know it's confusing) | ||||||
|  | t MSG_007 "Cancel" | ||||||
|  | t MSG_008 "Yes" | ||||||
|  | t MSG_009 "No" | ||||||
|  | t MSG_010 "Bad blocks found" | ||||||
|  | t MSG_011 "Check completed: %u bad block(s) found\n" | ||||||
|  | 	"  %d read error(s)\n  %d write error(s)\n  %d corruption error(s)\n" | ||||||
|  | # The following will contain the formatted message above as well as the name of the bad blocks logfile | ||||||
|  | t MSG_012 "%s\nA more detailed report can be found in:\n%s" | ||||||
|  | t MSG_013 "Disabled" | ||||||
|  | t MSG_014 "Daily" | ||||||
|  | t MSG_015 "Weekly" | ||||||
|  | t MSG_016 "Monthly" | ||||||
|  | t MSG_017 "Custom" | ||||||
|  | t MSG_018 "Your version: %d.%d.%d (Build %d)" | ||||||
|  | t MSG_019 "Latest version: %d.%d.%d (Build %d)" | ||||||
|  | # *Short* size names. These can be used as suffixes | ||||||
|  | t MSG_020 "bytes" | ||||||
|  | t MSG_021 "KB" | ||||||
|  | t MSG_022 "MB" | ||||||
|  | t MSG_023 "GB" | ||||||
|  | t MSG_024 "TB" | ||||||
|  | t MSG_025 "PB" | ||||||
|  | # *Long* size names, as they are displayed for the cluster size in the MS format dialog. | ||||||
|  | t MSG_026 "bytes"	# Yes, this is a repeat from MSG_020 | ||||||
|  | t MSG_027 "kilobytes" | ||||||
|  | t MSG_028 "megabytes" | ||||||
|  | t MSG_029 "Default" | ||||||
|  | # The following gets appended to the file system, cluster size, etc. | ||||||
|  | t MSG_030 "%s (Default)" | ||||||
|  | t MSG_031 "%s partition scheme for BIOS computer" | ||||||
|  | t MSG_032 "%s partition scheme for UEFI computer" | ||||||
|  | t MSG_033 "%s partition scheme for BIOS or UEFI computers" | ||||||
|  | # Number of bad block check passes (singular for 1 pass, plural for 2 or more passes) | ||||||
|  | t MSG_034 "%d Pass" | ||||||
|  | t MSG_035 "%d Passes" | ||||||
|  | t MSG_036 "ISO Image" | ||||||
|  | t MSG_037 "Application" | ||||||
|  | t MSG_038 "Abort" | ||||||
|  | t MSG_039 "Launch" | ||||||
|  | t MSG_040 "Download" | ||||||
|  | t MSG_041 "Operation cancelled by the user" | ||||||
|  | t MSG_042 "Error" | ||||||
|  | t MSG_043 "Error: %s" | ||||||
|  | t MSG_044 "File download" | ||||||
|  | t MSG_045 "USB Storage Device (Generic)" | ||||||
|  | t MSG_046 "%s (Disk %d)" | ||||||
|  | t MSG_047 "%s (%c:)" | ||||||
|  | t MSG_048 "Rufus - Flushing buffers" | ||||||
|  | t MSG_049 "Rufus - Cancellation" | ||||||
|  | 
 | ||||||
|  | # Error messages | ||||||
|  | t MSG_050 "Success." | ||||||
|  | t MSG_051 "Undetermined error while formatting." | ||||||
|  | t MSG_052 "Cannot use the selected file system for this media." | ||||||
|  | t MSG_053 "Access to the device is denied." | ||||||
|  | t MSG_054 "Media is write protected." | ||||||
|  | t MSG_055 "The device is in use by another process. " | ||||||
|  | 	"Please close any other process that may be accessing the device." | ||||||
|  | t MSG_056 "Quick format is not available for this device." | ||||||
|  | t MSG_057 "The volume label is invalid." | ||||||
|  | t MSG_058 "The device handle is invalid." | ||||||
|  | t MSG_059 "The selected cluster size is not valid for this device." | ||||||
|  | t MSG_060 "The volume size is invalid." | ||||||
|  | t MSG_061 "Please insert a media in drive." | ||||||
|  | t MSG_062 "An unsupported command was received." | ||||||
|  | t MSG_063 "Memory allocation error." | ||||||
|  | t MSG_064 "Read error." | ||||||
|  | t MSG_065 "Write error." | ||||||
|  | t MSG_066 "Installation failure" | ||||||
|  | t MSG_067 "Could not open media. It may be in use by another process. " | ||||||
|  | 	"Please re-plug the media and try again." | ||||||
|  | t MSG_068 "Error while partitioning drive." | ||||||
|  | t MSG_069 "Could not copy files to target drive." | ||||||
|  | t MSG_070 "Cancelled by user." | ||||||
|  | t MSG_071 "Unable to create formatting thread." | ||||||
|  | t MSG_072 "Bad blocks check didn't complete." | ||||||
|  | t MSG_073 "ISO image scan failure." | ||||||
|  | t MSG_074 "ISO image extraction failure." | ||||||
|  | t MSG_075 "Unable to remount volume." | ||||||
|  | t MSG_076 "Unable to patch/setup files for boot." | ||||||
|  | t MSG_077 "Unable to assign a drive letter." | ||||||
|  | t MSG_078 "Can't mount GUID volume." | ||||||
|  | 
 | ||||||
|  | t MSG_080 "Rufus detected that Windows is still flushing its internal buffers onto the USB device.\n\n" | ||||||
|  | 	"Depending on the speed of your USB device, this operation may take a long time to complete, " | ||||||
|  | 	"especially for large files.\n\nWe recommend that you let Windows finish, to avoid corruption. " | ||||||
|  | 	"But if you grow tired of waiting, you can just unplug the device..." | ||||||
|  | t MSG_081 "Unsupported ISO" | ||||||
|  | t MSG_082 "This version of Rufus only supports bootable ISOs based on bootmgr/WinPE, isolinux or EFI.\n" | ||||||
|  | 	"This ISO doesn't appear to use either..." | ||||||
|  | t MSG_083 "Replace %s?" | ||||||
|  | t MSG_084 "This ISO image seems to use an obsolete version of '%s'.\n" | ||||||
|  | 	"Boot menus may not display properly because of this.\n\n" | ||||||
|  | 	"A newer version can be downloaded by Rufus to fix this issue:\n" | ||||||
|  | 	"- Choose 'Yes' to connect to the internet and download the file\n" | ||||||
|  | 	"- Choose 'No' to leave the existing ISO file unmodified\n" | ||||||
|  | 	"If you don't know what to do, you should select 'Yes'.\n\n" | ||||||
|  | 	"Note: The new file will be downloaded in the current directory and once a " | ||||||
|  | 	"'%s' exists there, it will be reused automatically." | ||||||
|  | t MSG_085 "Downloading %s" | ||||||
|  | t MSG_086 "No ISO image selected" | ||||||
|  | # The content between the quotes below (\"Create a bootable disk\") should match | ||||||
|  | # the beginning of the IDC_BOOT text | ||||||
|  | t MSG_087 "Please click on the disc button to select a bootable ISO, " | ||||||
|  | 	"or uncheck the \"Create a bootable disk...\" checkbox." | ||||||
|  | t MSG_088 "ISO too big" | ||||||
|  | t MSG_089 "This ISO image is too big for the selected target." | ||||||
|  | t MSG_090 "Unsupported ISO" | ||||||
|  | t MSG_091 "When using UEFI Target Type, only EFI bootable ISO images are supported. " | ||||||
|  | 	"Please select an EFI bootable ISO or set the Target Type to BIOS." | ||||||
|  | t MSG_092 "Unsupported filesystem" | ||||||
|  | t MSG_093 "When using UEFI Target Type, only FAT/FAT32 is supported. " | ||||||
|  | 	"Please select FAT/FAT32 as the File system or set the Target Type to BIOS." | ||||||
|  | t MSG_094 "Non UEFI compatible ISO" | ||||||
|  | t MSG_095 "This ISO image contains a file larger than 4 GB and cannot be used to create an EFI bootable USB.\n" | ||||||
|  | 	"This is a limitation of UEFI/FAT32, not Rufus." | ||||||
|  | t MSG_096 "Only FAT/FAT32 is supported for this type of ISO. Please select FAT/FAT32 as the File system." | ||||||
|  | t MSG_097 "Only 'bootmgr' or 'WinPE' based ISO images can currently be used with NTFS." | ||||||
|  | t MSG_098 "FAT/FAT32 can only be used for isolinux based ISO images or when the Target Type is UEFI." | ||||||
|  | t MSG_099 "Filesystem limitation" | ||||||
|  | t MSG_100 "This iso image contains a file larger than 4GB file, which is more than the " | ||||||
|  | 	"maximum size allowed for a FAT or FAT32 file system." | ||||||
|  | t MSG_101 "Missing WIM support" | ||||||
|  | t MSG_102 "Your platform cannot extract files from WIM archives. WIM extraction " | ||||||
|  | 	"is required to create EFI bootable Windows 7 and Windows Vista USB drives. You can fix that " | ||||||
|  | 	"by installing a recent version of 7-Zip.\nDo you want to visit the 7-zip download page?" | ||||||
|  | t MSG_103 "Download %s?" | ||||||
|  | t MSG_104 "Syslinux v5.0 or later requires a '%s' file to be installed.\n" | ||||||
|  | 	"Because this file is more than 100 KB in size, and always present on Syslinux v5+ ISO images, " | ||||||
|  | 	"it is not embedded in Rufus.\n\nRufus can download the missing file for you:\n" | ||||||
|  | 	"- Select 'Yes' to connect to the internet and download the file\n" | ||||||
|  | 	"- Select 'No' if you want to manually copy this file on the drive later\n\n" | ||||||
|  | 	"Note: The file will be downloaded in the current directory and once a " | ||||||
|  | 	"'%s' exists there, it will be reused automatically.\n" | ||||||
|  | t MSG_105 "Cancelling may leave the device in an UNUSABLE state.\n" | ||||||
|  | 	"If you are sure you want to cancel, click YES. Otherwise, click NO." | ||||||
|  | t MSG_106 "Please select folder" | ||||||
|  | t MSG_107 "All files" | ||||||
|  | t MSG_108 "Rufus log" | ||||||
|  | t MSG_109 "0x%02X (Disk %d)" | ||||||
|  | 
 | ||||||
|  | # Tootips | ||||||
|  | # Partition Scheme and Target Type | ||||||
|  | t MSG_150 "Usually the safest choice. If you have an UEFI computer and want to install " | ||||||
|  | 	"an OS in EFI mode however, you should select one of the options below" | ||||||
|  | t MSG_151 "Use this if you want to install an OS in EFI mode, but need to access " | ||||||
|  | 	"the USB content from Windows XP" | ||||||
|  | t MSG_152 "The preferred option to install an OS in EFI mode and when " | ||||||
|  | 	"USB access is not required for Windows XP" | ||||||
|  | t MSG_153 "Test pattern: 0x%02X"	 | ||||||
|  | t MSG_154 "Test pattern: 0x%02X, 0x%02X"	 | ||||||
|  | t MSG_155 "Test pattern: 0x%02X, 0x%02X, 0x%02X" | ||||||
|  | t MSG_156 "Test pattern: 0x%02X, 0x%02X, 0x%02X, 0x%02X" | ||||||
|  | t MSG_157 "Sets the target filesystem" | ||||||
|  | t MSG_158 "Minimum size that a block of data will occupy in the filesystem" | ||||||
|  | t MSG_159 "Use this field to set the drive label\nInternational characters are accepted" | ||||||
|  | t MSG_160 "Toggle advanced options" | ||||||
|  | t MSG_161 "Check the device for bad blocks using a test pattern" | ||||||
|  | t MSG_162 "Uncheck this box to use the \"slow\" format method" | ||||||
|  | t MSG_163 "Check this box to make the USB drive bootable" | ||||||
|  | t MSG_164 "Method that will be used to make the drive bootable" | ||||||
|  | t MSG_165 "Click to select an ISO..." | ||||||
|  | t MSG_166 "Check this box to allow the display of international labels " | ||||||
|  | 	"and set a device icon (creates an autorun.inf)" | ||||||
|  | t MSG_167 "Install an MBR that allows boot selection and can masquerade the BIOS USB drive ID" | ||||||
|  | t MSG_168 "Try to masquerade first bootable USB drive (usually 0x80) as a different disk.\n" | ||||||
|  | 	"This should only be necessary if you install Windows XP and have more than one disk" | ||||||
|  | t MSG_169 "Create an extra hidden partition and try to align partitions boundaries.\n" | ||||||
|  | 	"This can improve boot detection for older BIOSes" | ||||||
|  | t MSG_170 "Enable detection for disks not normally detected by Rufus. USE AT YOUR OWN RISKS!!!" | ||||||
|  | t MSG_171 "Start the formatting operation.\nThis will DESTROY any data on the target!" | ||||||
|  | t MSG_172 "Licensing information and credits" | ||||||
|  | t MSG_173 "Click to select..." | ||||||
|  | # The following will appear in the about dialog | ||||||
|  | t MSG_174 "Rufus - The Reliable USB Formatting Utility" | ||||||
|  | t MSG_175 "Version %d.%d.%d (Build %d)" | ||||||
|  | t MSG_176 "" | ||||||
|  | t MSG_177 "Report bugs or request enhancements at:" | ||||||
|  | t MSG_178 "Additional Copyrights:" | ||||||
|  | t MSG_179 "Update Policy:" | ||||||
|  | t MSG_180 "If you choose to allow this program to check for application updates, " | ||||||
|  | 	"you agree that the following information may be collected on our server(s):" | ||||||
|  | t MSG_181 "Your operating system's architecture and version" | ||||||
|  | t MSG_182 "The version of the application you use" | ||||||
|  | t MSG_183 "Your IP address" | ||||||
|  | t MSG_184 "For the purpose of generating private usage statistics, we may keep the information collected, " | ||||||
|  | 	"\\b for at most a year\\b0 . However, we will not willingly disclose any of this individual data to third parties." | ||||||
|  | t MSG_185 "Update Process:" | ||||||
|  | t MSG_186 "Rufus does not install or run background services, therefore update checks are performed only when the main application is running.\\line\n" | ||||||
|  | 	"Internet access is of course required when checking for updates." | ||||||
|  | 
 | ||||||
|  | # Status messages - these messages will appear on the status bar | ||||||
|  | t MSG_201 "Cancelling - Please wait..." | ||||||
|  | t MSG_202 "Scanning ISO image..." | ||||||
|  | t MSG_203 "Failed to scan ISO image" | ||||||
|  | # Parameter: the name of an obsolete Syslinux .c32 module. eg: "Obsolete vesamenu.c32 detected" | ||||||
|  | t MSG_204 "Obsolete %s detected" | ||||||
|  | # Display the name of the ISO selected. eg: "Using ISO: en_win7_x64_sp1.iso" | ||||||
|  | t MSG_205 "Using ISO: %s" | ||||||
|  | # Typically "Missing ldlinux.c32 file" | ||||||
|  | t MSG_206 "Missing %s file" | ||||||
|  | # Same message, once for singular and plural ("1 device found", "2 devices found") | ||||||
|  | t MSG_208 "%d device found" | ||||||
|  | t MSG_209 "%d devices found" | ||||||
|  | t MSG_210 "DONE." | ||||||
|  | t MSG_211 "Cancelled." | ||||||
|  | t MSG_212 "FAILED." | ||||||
|  | # Used when a new update has been downloaded and lauched | ||||||
|  | t MSG_213 "Launching new application..." | ||||||
|  | t MSG_214 "Failed to launch new application" | ||||||
|  | # Open/Save file | ||||||
|  | t MSG_215 "Opened %s" | ||||||
|  | t MSG_216 "Saved %s" | ||||||
|  | # Formatting status (make sure you use a double % to print the percent sign) | ||||||
|  | t MSG_217 "Formatting: %0.1f%% completed" | ||||||
|  | t MSG_218 "Creating file system: Task %d/%d completed" | ||||||
|  | t MSG_219 "NTFS Fixup: %d%% completed" | ||||||
|  | t MSG_221 "Setting Label (This may take while)..." | ||||||
|  | # Parameter: the file system. eg. "Formatting (NTFS)..." | ||||||
|  | t MSG_222 "Formatting (%s)..." | ||||||
|  | t MSG_223 "NTFS Fixup (Checkdisk)..." | ||||||
|  | t MSG_224 "Clearing MBR/PBR/GPT structures..." | ||||||
|  | t MSG_225 "Requesting disk access..." | ||||||
|  | t MSG_226 "Analyzing existing boot records..." | ||||||
|  | t MSG_227 "Closing existing volume..." | ||||||
|  | t MSG_228 "Writing master boot record..." | ||||||
|  | t MSG_229 "Writing partition boot record..." | ||||||
|  | t MSG_230 "Copying DOS files..." | ||||||
|  | t MSG_231 "Copying ISO files..." | ||||||
|  | t MSG_232 "Win7 EFI boot setup (this may take a while)..." | ||||||
|  | t MSG_233 "Finalizing, please wait..." | ||||||
|  | # Takes the Syslinux version as paramete. eg. "Installing Syslinux v5..." | ||||||
|  | t MSG_234 "Installing Syslinux v%d..." | ||||||
|  | # Bad blocks status. eg: "Bad Blocks: PASS 1/2 - 12.34% (0/0/1 errors)" | ||||||
|  | t MSG_235 "Bad Blocks: PASS %d/%d - %0.2f%% (%d/%d/%d errors)" | ||||||
|  | t MSG_236 "Bad Blocks: Testing with random pattern" | ||||||
|  | t MSG_237 "Bad Blocks: Testing with pattern 0x%02X" | ||||||
|  | # eg. "Partitioning (MBR)..." | ||||||
|  | t MSG_238 "Partitioning (%s)..." | ||||||
|  | t MSG_239 "Deleting partitions..." | ||||||
|  | t MSG_240 "Downloading %s: Connecting..." | ||||||
|  | t MSG_241 "Downloading: %0.1f%%" | ||||||
|  | t MSG_242 "Failed to download file." | ||||||
|  | t MSG_243 "Checking for Rufus updates..." | ||||||
|  | t MSG_244 "Updates: Unable to connect to the internet" | ||||||
|  | t MSG_245 "Updates: Unable to acces version data" | ||||||
|  | t MSG_246 "A new version of Rufus is available!" | ||||||
|  | t MSG_247 "No new version of Rufus was found" | ||||||
|  | t MSG_248 "Application registry keys successfully deleted" | ||||||
|  | t MSG_249 "Failed to delete application registry keys" | ||||||
|  | # eg. "Fixed disk detection enabled" "ISO size check disabled" | ||||||
|  | t MSG_250 "%s enabled" | ||||||
|  | t MSG_251 "%s disabled" | ||||||
|  | t MSG_252 "Size checks" | ||||||
|  | t MSG_253 "Fixed disks detection" | ||||||
|  | t MSG_254 "Force large FAT32 formatting" | ||||||
|  | t MSG_255 "NoDriveTypeAutorun will be deleted on exit" | ||||||
|  | t MSG_256 "Fake drive detection" | ||||||
|  | t MSG_257 "Joliet support" | ||||||
|  | t MSG_258 "Rock Ridge support" | ||||||
|  | 
 | ||||||
|  | ################################################################################ | ||||||
|  | l "fr_FR" "French" 0x040c, 0x080c, 0x0c0c, 0x100c, 0x140c, 0x180c, 0x1c0c, 0x200c, 0x240c, 0x280c, 0x2c0c, 0x300c, 0x340c, 0x380c, 0xe40c | ||||||
|  | g IDD_DIALOG | ||||||
|  | t IDS_DEVICE_TXT "Periphérique" | ||||||
|  | t IDS_PARTITION_TYPE_TXT "Type de partition et système de destination" | ||||||
|  | t IDS_FILESYSTEM_TXT "Système de fichiers" | ||||||
|  | t IDS_CLUSTERSIZE_TXT "Taille de clusters" | ||||||
|  | t IDS_LABEL_TXT "Nouveau label" | ||||||
|  | t IDS_FORMAT_OPTIONS_GRP "Options de Formattage       " | ||||||
|  | t IDC_BADBLOCKS "Vérification de mauvais blocs:" | ||||||
|  | s IDC_BADBLOCKS +10,0 | ||||||
|  | m IDC_NBPASSES +5,0 | ||||||
|  | t IDC_QUICKFORMAT "Formattage rapide" | ||||||
|  | t IDC_BOOT "Disque de démarrage utilisant:" | ||||||
|  | s IDC_BOOT +5,0 | ||||||
|  | m IDC_BOOTTYPE +5,0 | ||||||
|  | m IDC_SELECT_ISO +3,0 | ||||||
|  | t IDC_SET_ICON "Ajouter un label étendu et une icône" | ||||||
|  | m IDC_ADVANCED +36,0 | ||||||
|  | t IDC_ABOUT "A propos..." | ||||||
|  | t IDCANCEL "Fermer" | ||||||
|  | t IDC_START "Démarrer" | ||||||
|  | t IDS_ADVANCED_OPTIONS_GRP "Options avancées" | ||||||
|  | t IDC_ENABLE_FIXED_DISKS "Lister les disques fixes ou non partitionés" | ||||||
|  | t IDC_EXTRA_PARTITION "Options de compatibilité avec anciens BIOS" | ||||||
|  | t IDC_RUFUS_MBR "Ajout du MBR Rufus, ID BIOS:" | ||||||
|  | m IDC_DISK_ID +5,0 | ||||||
|  | s IDC_DISK_ID -2,0 | ||||||
|  | 
 | ||||||
|  | g IDD_ABOUTBOX | ||||||
|  | t IDD_ABOUTBOX "A propos de Rufus" | ||||||
|  | t IDC_ABOUT_LICENSE "License" | ||||||
|  | t IDC_ABOUT_UPDATES "Mises à jour" | ||||||
|  | 
 | ||||||
|  | g IDD_LICENSE | ||||||
|  | t IDD_LICENSE "License Rufus" | ||||||
|  | 
 | ||||||
|  | g IDD_NOTIFICATION | ||||||
|  | t IDC_MORE_INFO "Plus d'info..." | ||||||
|  | t IDYES "Oui" | ||||||
|  | t IDNO "Non" | ||||||
|  | 
 | ||||||
|  | g IDD_LOG | ||||||
|  | t IDC_LOG_CLEAR "Effacer" | ||||||
|  | t IDC_LOG_SAVE "Enregistrer" | ||||||
|  | t IDCANCEL "Fermer" | ||||||
|  | 
 | ||||||
|  | g IDD_UPDATE_POLICY | ||||||
|  | s IDD_UPDATE_POLICY +30,0 | ||||||
|  | t IDD_UPDATE_POLICY "Paramètres de mises à jour" | ||||||
|  | s IDC_POLICY +30,0 | ||||||
|  | t IDS_UPDATE_SETTINGS_GRP "Options" | ||||||
|  | s IDS_UPDATE_SETTINGS_GRP +20,0 | ||||||
|  | t IDS_UPDATE_FREQUENCY_TXT "Recherche mises à jour:" | ||||||
|  | s IDS_UPDATE_FREQUENCY_TXT -3,0 | ||||||
|  | t IDS_INCLUDE_BETAS_TXT "Inclure les bétas:" | ||||||
|  | m IDC_UPDATE_FREQUENCY -3,0 | ||||||
|  | m IDC_INCLUDE_BETAS -3,0 | ||||||
|  | s IDC_UPDATE_FREQUENCY +25,0 | ||||||
|  | m IDS_CHECK_NOW_GRP 20,0 | ||||||
|  | s IDS_CHECK_NOW_GRP +10,0 | ||||||
|  | t IDC_CHECK_NOW "Chercher maintenant" | ||||||
|  | m IDC_CHECK_NOW 9,0 | ||||||
|  | s IDC_CHECK_NOW +31,0 | ||||||
|  | t IDCANCEL "Fermer" | ||||||
|  | m IDCANCEL 9,0 | ||||||
|  | 
 | ||||||
|  | g IDD_NEW_VERSION | ||||||
|  | t IDD_NEW_VERSION "Mise à jour de Rufus" | ||||||
|  | t IDS_NEW_VERSION_AVAIL_TXT "Une nouvelle version est disponible. Veuillez télécharger la nouvelle version !" | ||||||
|  | t IDC_WEBSITE "Cliquez ici pour aller sur le site de Rufus" | ||||||
|  | t IDS_NEW_VERSION_NOTES_GRP "Notes relatives à cette version" | ||||||
|  | t IDS_NEW_VERSION_DOWNLOAD_GRP "Téléchargement" | ||||||
|  | t IDC_DOWNLOAD ""Télécharger"" | ||||||
|  | t IDCANCEL "Fermer" | ||||||
|  | 
 | ||||||
|  | g IDD_ISO_EXTRACT | ||||||
|  | t IDD_ISO_EXTRACT "Copie des fichier ISO..." | ||||||
|  | t IDC_ISO_FILENAME "Ouverture de l'image - veuillez patienter..." | ||||||
|  | t IDC_ISO_ABORT "Annuler" | ||||||
|  | 
 | ||||||
|  | g IDD_MESSAGES | ||||||
|  | t MSG_001 "Autre instance detectée" | ||||||
|  | t MSG_002 "Une autre instance de Rufus est en cours d'exécution.\n" | ||||||
|  | 	"Veuillez fermer la première instance avant d'en lancer une seconde." | ||||||
|  | t MSG_003 "ATTENTION: TOUTES LES DONNEES DU VOLUME '%s' VONT ETRE EFFACEES.\n" | ||||||
|  | 	"Pour continuer cette operation, cliquez sur OK.\nPour quitter cliquez sur ANNULER." | ||||||
|  | t MSG_004 "Mises à jour" | ||||||
|  | t MSG_005 "Voulez-vous authoriser Rufus à chercher des mises à jour en ligne?" | ||||||
|  | t MSG_006 "Fermer" | ||||||
|  | t MSG_007 "Annuler" | ||||||
|  | t MSG_008 "Oui" | ||||||
|  | t MSG_009 "Non" | ||||||
|  | t MSG_010 "Blocs défectueux détectés" | ||||||
|  | t MSG_011 "Vérification complète: %u bloc(s) défectueux détecté(s)\n" | ||||||
|  | 	"  %d erreur(s) de lecture\n  %d erreur(s) d'écriture\n  %d erreur(s) de corruption\n" | ||||||
|  | t MSG_012 "%s\nUn rapport plus détaillé peut être obtenu à:\n%s" | ||||||
|  | t MSG_013 "Jamais" | ||||||
|  | t MSG_014 "Quotidienne" | ||||||
|  | t MSG_015 "Hebdomadaire" | ||||||
|  | t MSG_016 "Mensuelle" | ||||||
|  | t MSG_017 "Personalisée" | ||||||
|  | t MSG_018 "Votre version: %d.%d.%d (Build %d)" | ||||||
|  | t MSG_019 "Dernière version: %d.%d.%d (Build %d)" | ||||||
|  | t MSG_020 "octets" | ||||||
|  | t MSG_021 "Ko" | ||||||
|  | t MSG_022 "Mo" | ||||||
|  | t MSG_023 "Go" | ||||||
|  | t MSG_024 "To" | ||||||
|  | t MSG_025 "Po" | ||||||
|  | t MSG_026 "octets" | ||||||
|  | t MSG_027 "kilo-octets" | ||||||
|  | t MSG_028 "mega-octets" | ||||||
|  | t MSG_029 "Défaut" | ||||||
|  | t MSG_030 "%s (Défaut)" | ||||||
|  | t MSG_031 "Type de partition %s pour ordinateur BIOS" | ||||||
|  | t MSG_032 "Type de partition %s pour ordinateur UEFI" | ||||||
|  | t MSG_033 "Type de partition %s pour ordinateur BIOS ou UEFI" | ||||||
|  | t MSG_034 "%d passe" | ||||||
|  | t MSG_035 "%d passes" | ||||||
|  | t MSG_036 "Image ISO" | ||||||
|  | t MSG_037 "Application" | ||||||
|  | t MSG_038 "Annuler" | ||||||
|  | t MSG_039 "Lancer" | ||||||
|  | t MSG_040 "Télécharger" | ||||||
|  | t MSG_041 "Operation annulée par l'utilisateur" | ||||||
|  | t MSG_042 "Erreur" | ||||||
|  | t MSG_043 "Erreur: %s" | ||||||
|  | t MSG_044 "Téléchargement de fichier" | ||||||
|  | t MSG_045 "Pérpih. de stockage USB (Générique)" | ||||||
|  | t MSG_046 "%s (Disque %d)" | ||||||
|  | t MSG_047 "%s (%c:)" | ||||||
|  | t MSG_048 "Rufus - Flush de la mémoire tampon" | ||||||
|  | t MSG_049 "Rufus - Annulation" | ||||||
|  | 
 | ||||||
|  | # Error messages | ||||||
|  | t MSG_050 "Opération réussie." | ||||||
|  | t MSG_051 "Erreur indéterminéee lors du formatage." | ||||||
|  | t MSG_052 "Ce système de fichiers ne peut pas être utilisé ici." | ||||||
|  | t MSG_053 "L'accès au périphérique est refusé." | ||||||
|  | t MSG_054 "Le périphérique est protegé en écriture." | ||||||
|  | t MSG_055 "Le périphérique est en cours d'utilisation par une autre application. " | ||||||
|  | 	"Veuillez fermer toute autre application succeptible d'accéder au périphérique." | ||||||
|  | t MSG_056 "Le formatage rapide n'est pas disponible pour ce périphérique." | ||||||
|  | t MSG_057 "Le nom de volume est invalide." | ||||||
|  | t MSG_058 "Le handle de périphérique est invalide." | ||||||
|  | t MSG_059 "Cette taille de cluster n'est pas appliquable ici." | ||||||
|  | t MSG_060 "La taille du volume est invalide." | ||||||
|  | t MSG_061 "Veuillez insérer un média dans le lecteur." | ||||||
|  | t MSG_062 "Commande non supportée." | ||||||
|  | t MSG_063 "Erreur d'allocation mémoire." | ||||||
|  | t MSG_064 "Erreur de lecture." | ||||||
|  | t MSG_065 "Erreur d'écriture." | ||||||
|  | t MSG_066 "L'installation a échoué" | ||||||
|  | t MSG_067 "Impossible d'accéder au média. Il peut être en cours d'utilisation par une autre application. " | ||||||
|  | 	"Essayer de déconnecter le média et essayez à nouveau." | ||||||
|  | t MSG_068 "Erreur de partitionement." | ||||||
|  | t MSG_069 "Impossible de copier les fichiers sur le périphérique de detination." | ||||||
|  | t MSG_070 "Opération annulée par l'utilisateur." | ||||||
|  | t MSG_071 "Impossible de créer le thread de formattage." | ||||||
|  | t MSG_072 "La vérification de blocs défectueux a été interrompue." | ||||||
|  | t MSG_073 "Echec d'analyse de l'image ISO." | ||||||
|  | t MSG_074 "Echec d'extraction de l'image ISO." | ||||||
|  | t MSG_075 "Echec lors du remontage du volume." | ||||||
|  | t MSG_076 "Echec de modification des fichiers de démarrage." | ||||||
|  | t MSG_077 "Echec d'assignation d'une lettre de volume." | ||||||
|  | t MSG_078 "Impossible de monter le volume GUID." | ||||||
|  | 
 | ||||||
|  | t MSG_080 "Rufus a detecté que Windows est en train de finir de vider la mémoire tampon.\n\n" | ||||||
|  | 	"En fonction de la vitesse de votre périphérique, cette opération peut prendre beaucoup de temps, " | ||||||
|  | 	"surtout s'il s'agit d'un fichier volumineux.\n\nNous recommandons d'attendre que Windows " | ||||||
|  | 	"complète cette opération, afin d'éviter la corruption du périphérique. Mais si jamais cela prend " | ||||||
|  | 	"trop de temps, vous pouvez toujours essayer de déconnecter le média..." | ||||||
|  | t MSG_081 "Image ISO non supportée" | ||||||
|  | t MSG_082 "Cette version de Rufus supporte seulement les ISOs démarrables qui utilisent bootmgr/WinPE, isolinux ou EFI.\n" | ||||||
|  | 	"Cette image ISO ne semble pas utiliser une de ces options..." | ||||||
|  | t MSG_083 "Remplacer %s?" | ||||||
|  | t MSG_084 "Cette image ISO utilise une version obsolète du fichier '%s'.\n" | ||||||
|  | 	"A cause de cela, les menus de démarrage peuvent de pas fonctionner.\n\n" | ||||||
|  | 	"Une nouvelle version du fichier peut être téléchargée par Rufus pour addresser ce problème:\n" | ||||||
|  | 	"- Choisissez 'Oui' pour télécharger le fichier depuis Internet\n" | ||||||
|  | 	"- Choisissez 'Non' pour garder le fichier de l'image ISO\n" | ||||||
|  | 	"Si vous ne savez pas quoi faire, sélectionnez 'Oui'.\n\n" | ||||||
|  | 	"Note: Le nouveau fichier est téléchargé dans le répertoire courrant. Une fois qu'un fichier" | ||||||
|  | 	"'%s' existe à cet endroit, il sera réutilisé automatiquement." | ||||||
|  | t MSG_085 "Téléchargement de %s" | ||||||
|  | t MSG_086 "Aucune image ISO sélectionnée" | ||||||
|  | t MSG_087 "Veuillez cliquer sur le bouton avec un disque pour choisir une image ISO démarrable " | ||||||
|  | 	"ou décochez l'option \"Disque de démarrage...\"." | ||||||
|  | t MSG_088 "Image ISO trop large" | ||||||
|  | t MSG_089 "Cette ISO image est trop large pour le périphérique sélectionné." | ||||||
|  | t MSG_090 "Image ISO on supportée" | ||||||
|  | t MSG_091 "Quand UEFI est séelectionné, seules les images ISO basées sur EFI sont supportées. " | ||||||
|  | 	"Veuillez sélectionner une image ISO démarrable avec EFI ou sélectionner BIOS pour le système de destination." | ||||||
|  | t MSG_092 "Système de fichiers non supporté" | ||||||
|  | t MSG_093 "Quand UEFI est séelectionné, seul le système de fichiers FAT/FAT32 est supporté. " | ||||||
|  | 	"Veuillez sélectionner FAT/FAT32 comme système de fichiers ou sélectionner BIOS pour le système de destination." | ||||||
|  | t MSG_094 "Image ISO incompatible avec UEFI" | ||||||
|  | t MSG_095 "Cette image ISO contient un fichier de plus de 4 Go et ne peut pas être utilisée pour créer un USB démarrable par UEFI.\n" | ||||||
|  | 	"Ceci est une limitation de UEFI/FAT32, pas de Rufus." | ||||||
|  | t MSG_096 "Seul FAT/FAT32 est supporté avec ce type d'image ISO. Veuillez sélectionner FAT/FAT32 pour le système de fichiers." | ||||||
|  | t MSG_097 "Seules les images ISO utilisant 'bootmgr' ou 'WinPE' peuvent être utilisées avec NTFS." | ||||||
|  | t MSG_098 "FAT/FAT32 peut seulement être utilisé pour les images ISO utilisant 'isolinux' ou lorsque que le système de destination est UEFI." | ||||||
|  | t MSG_099 "Limitation du système de fichiers" | ||||||
|  | t MSG_100 "Cette image ISO contient un fichier de plus de 4 Go, ce qui est plus que la taille maximum " | ||||||
|  | 	"supportée par le système de fichiers FAT ou FAT32." | ||||||
|  | t MSG_101 "Support pour archives WIM non disponible" | ||||||
|  | t MSG_102 "Votre plateforme ne peut pas extraire les fichiers depuis les archives WIM. L'extraction de données WIM " | ||||||
|  | 	"est nécéssaire pour créer des médias USB démarrable avec EFI pour Windows 7/8 ou Windows Vista. Vous pouvez addresser " | ||||||
|  | 	"ce problème en téléchargeant une version récente de l'utilitaire 7-Zip.\nVoulez-vous visiter la page de téléchargements de 7-zip?" | ||||||
|  | t MSG_103 "Télécharger %s?" | ||||||
|  | t MSG_104 "Syslinux v5.0 ou plus récent requiert l'installtion d'un fichier '%s'.\n" | ||||||
|  | 	"Puisque ce fichier fait plus de 100 Ko et est toujours présent sur les images ISO à base de Syslinux v5+, " | ||||||
|  | 	"il n'est pas inclus dans l'application.\n\nRufus peut télécharger ce fichier pour vous:\n" | ||||||
|  | 	"- Choisissez 'Oui' pour télécharger le fichier depuis Internet\n" | ||||||
|  | 	"- Choisissez 'Non' si vous compter copier ce fichier manuellement\n" | ||||||
|  | 	"Note: Ce fichier est téléchargé dans le répertoire courrant. Une fois qu'un fichier" | ||||||
|  | 	"'%s' existe à cet endroit, il sera réutilisé automatiquement." | ||||||
|  | t MSG_105 "Annuler peut laisser le périphérique dans un état inutilisable.\n" | ||||||
|  | 	"Si vous êtes sûr de vouloir annuler, sélectionnez OUI. Sinon, sélectionnez NON." | ||||||
|  | t MSG_106 "Sélection de répertoire" | ||||||
|  | t MSG_107 "Tous les fichiers" | ||||||
|  | t MSG_108 "Log Rufus" | ||||||
|  | t MSG_109 "0x%02X (disque %d)" | ||||||
|  | 
 | ||||||
|  | # Tootips | ||||||
|  | t MSG_150 "Choix le plus sûr. Si toutefois vous possédez un ordinateur à base de UEFI et voulez installer " | ||||||
|  | 	"un Système d’exploitation en mode EFI, vous devriez plutôt sélectionner l’une des options ci-dessous" | ||||||
|  | t MSG_151 "Utilisez cette options si  vous comptez installer un Système d’exploitation en mode EFI " | ||||||
|  | 	"et avez aussi besoin d’accéder au contenu du média sous Windows XP" | ||||||
|  | t MSG_152 "Option préférée pour installer un Système d’exploitation en mode EFI, " | ||||||
|  | 	"quand l’accès au média depuis Windows XP n’est pas nécessaire" | ||||||
|  | t MSG_153 "Motif de test: 0x%02X"	 | ||||||
|  | t MSG_154 "Motif de test: 0x%02X, 0x%02X"	 | ||||||
|  | t MSG_155 "Motif de test: 0x%02X, 0x%02X, 0x%02X" | ||||||
|  | t MSG_156 "Motif de test: 0x%02X, 0x%02X, 0x%02X, 0x%02X" | ||||||
|  | t MSG_157 "Sélectionne le système de fichiers" | ||||||
|  | t MSG_158 "La taille minimum qu’un bloc de données occupera sur le système de fichiers" | ||||||
|  | t MSG_159 "Utilisez ce champ pour mettre à jour le nom du volume\n" | ||||||
|  | 	"Les caractères étendus et les accents sont acceptés " | ||||||
|  | t MSG_160 "Affiche/Cache les options avancées " | ||||||
|  | t MSG_161 "Détecte la présence de blocs défectueux en utilisant un motif de test" | ||||||
|  | t MSG_162 "Décochez cette case pour utiliser la méthode de formatage \"lente\" " | ||||||
|  | t MSG_163 "Cochez cette case pour rendre le périphérique démarrable" | ||||||
|  | t MSG_164 "Méthode à utiliser pour rendre le périphérique démarrable " | ||||||
|  | t MSG_165 "Cliquez ici pour sélectionner une image ISO..." | ||||||
|  | t MSG_166 "Cochez cette case pour permettre l’affichage des caractères  étendus/internationaux " | ||||||
|  | 	"et ajouter une icône (créé un fichier autorun.inf)" | ||||||
|  | t MSG_167 "Installe un MBR permettant la sélection du périphérique de démarrage. Peut aussi " | ||||||
|  | 	"camoufler l’ID de disque pour le BIOS " | ||||||
|  | t MSG_168 "Camoufle le premier disque USB démarrable (généralement 0x80) sous une ID différente.\n" | ||||||
|  | 	"Changez cette option si vous installez Windows XP avec plus d’un disque dur" | ||||||
|  | t MSG_169 "Créé une petite partition supplémentaire et essaye d’aligner les partitions.\n" | ||||||
|  | 	"Peut améliorer la détection USB pour les vieux BIOS" | ||||||
|  | t MSG_170 "Active la détection de disque non normalement listés par Rufus. UTILISEZ  A VOS PROPRES RISQUES !!! " | ||||||
|  | t MSG_171 "Lance le formatage. DETRUIT toutes les données existantes sur la cible !" | ||||||
|  | t MSG_172 "Licence d’utilisation et remerciements" | ||||||
|  | t MSG_173 "Cliquez pour sélectionner..." | ||||||
|  | t MSG_174 "Rufus - The Reliable USB Formatting Utility" | ||||||
|  | t MSG_175 "Version %d.%d.%d (Build %d)" | ||||||
|  | t MSG_176 "Traduction Française: Pete Batard" | ||||||
|  | t MSG_177 "Soumettre un bug ou une demande d'amélioration à:" | ||||||
|  | t MSG_178 "Copyrights supplémentaires:" | ||||||
|  | t MSG_179 "Politique de mises à jour:" | ||||||
|  | t MSG_180 "Si vous autorisez ce programme à chercher les mises à jour, vous acceptez " | ||||||
|  | 	"que les informations suivantes peuvent être collectées sur nos serveurs:" | ||||||
|  | t MSG_181 "L’architecture de votre système d’exploitation ainsi que sa version" | ||||||
|  | t MSG_182 "La version de l’application que vous utilisez" | ||||||
|  | t MSG_183 "Votre adresse IP" | ||||||
|  | t MSG_184 "Afin de générer des statistiques d’utilisation privées, il se peut que nous gardions " | ||||||
|  | 	"les informations ainsi obtenues \\b au plus un an\\b0 . A moins d’y être contraint par la loi, " | ||||||
|  | 	"nous nous engageons aussi à ne pas diffuser ces informations à de tierce parties." | ||||||
|  | t MSG_185 "Processus de mise à jour:" | ||||||
|  | t MSG_186 "Aucun service ou tâche de fond ne sont installés ou lancés par Rufus. Cela veut dire que les " | ||||||
|  | 	"test de mises à jour interviennent seulement lorsque l’application principale s'exécute.\\line\n" | ||||||
|  | 	"Bien entendu, un accès à internet est requis pour vérifier la disponibilité des mises à jour." | ||||||
|  | 
 | ||||||
|  | # Status messages | ||||||
|  | t MSG_201 "Annulation - Veuillez patienter..." | ||||||
|  | t MSG_202 "Analyse de l'image ISO..." | ||||||
|  | t MSG_203 "Echec d'analyse de l'image ISO" | ||||||
|  | t MSG_204 "Fichier %s obsolète detecté" | ||||||
|  | t MSG_205 "ISO utilisée: %s" | ||||||
|  | t MSG_206 "Fichier %s manquant" | ||||||
|  | t MSG_208 "%d périphérique détecté" | ||||||
|  | t MSG_209 "%d périphériques détectés" | ||||||
|  | t MSG_210 "Opération terminée." | ||||||
|  | t MSG_211 "Opération annulée." | ||||||
|  | t MSG_212 "ECHEC." | ||||||
|  | t MSG_213 "Lancement de la nouvelle application..." | ||||||
|  | t MSG_214 "Echec de lancement de l'application" | ||||||
|  | t MSG_215 "%s ouvert" | ||||||
|  | t MSG_216 "%s sauvegardé" | ||||||
|  | t MSG_217 "Formatage: %0.1f%% complet" | ||||||
|  | t MSG_218 "Création du système de fichiers: Tâche %d/%d complète" | ||||||
|  | t MSG_219 "Finalisation NTFS: %d%% complète" | ||||||
|  | t MSG_221 "Ecriture du label (peut prendre du temps)..." | ||||||
|  | t MSG_222 "Formatage (%s)..." | ||||||
|  | t MSG_223 "Finalisation NTFS (Checkdisk)..." | ||||||
|  | t MSG_224 "Effacement des structures MBR/PBR/GPT..." | ||||||
|  | t MSG_225 "Requête d'accès disque..." | ||||||
|  | t MSG_226 "Analyse des structures de boot existantes..." | ||||||
|  | t MSG_227 "Fermeture des volumes existants..." | ||||||
|  | t MSG_228 "Ecriture du MBR..." | ||||||
|  | t MSG_229 "Ecriture du PBR..." | ||||||
|  | t MSG_230 "Copie des fichiers DOS..." | ||||||
|  | t MSG_231 "Copie des fichiers ISO..." | ||||||
|  | t MSG_232 "Ecriture boot Win7 EFI (peut prendre du temps)..." | ||||||
|  | t MSG_233 "Finalisation, veuillez patienter..." | ||||||
|  | t MSG_234 "Installation de Syslinux v%d..." | ||||||
|  | t MSG_235 "Défauts: PASSE %d/%d - %0.2f%% (%d/%d/%d erreurs)" | ||||||
|  | t MSG_236 "Défauts: Test avec motif aléatoire" | ||||||
|  | t MSG_237 "Défauts: Test avec motif 0x%02X" | ||||||
|  | t MSG_238 "Partitionage (%s)..." | ||||||
|  | t MSG_239 "Effaçement des partitions..." | ||||||
|  | t MSG_240 "Télechargement de %s: Connection..." | ||||||
|  | t MSG_241 "Télechargement: %0.1f%%" | ||||||
|  | t MSG_242 "Echec de télechargement du fichier" | ||||||
|  | t MSG_243 "Recherche des mises à jour..." | ||||||
|  | t MSG_244 "MAJ: Impossible de se connecter" | ||||||
|  | t MSG_245 "MAJ: Pas d'accès aux données de mises à jour" | ||||||
|  | t MSG_246 "Une nouvelle version de Rufus est disponible !" | ||||||
|  | t MSG_247 "Pas de mise à jour" | ||||||
|  | t MSG_248 "Clés de registre supprimées" | ||||||
|  | t MSG_249 "Echec de suppression des clés registres" | ||||||
|  | t MSG_250 "%s activé" | ||||||
|  | t MSG_251 "%s désactivé" | ||||||
|  | t MSG_252 "Tests de dépassement de taille" | ||||||
|  | t MSG_253 "Détection de disques fixes" | ||||||
|  | t MSG_254 "Force 'large FAT32'" | ||||||
|  | t MSG_255 "NoDriveTypeAutorun sera effacé en sortie" | ||||||
|  | t MSG_256 "Test de contrefaçons" | ||||||
|  | t MSG_257 "Support Joliet" | ||||||
|  | t MSG_258 "Support Rock Ridge" | ||||||
|  | 
 | ||||||
|  | ################################################################################ | ||||||
|  | l "zh_CN" "Chinese (Traditional)" 0x0404, 0x0804, 0x0c04, 0x1004, 0x1404 | ||||||
|  | g IDD_DIALOG | ||||||
|  | t IDS_DEVICE_TXT "设备" | ||||||
|  | t IDS_PARTITION_TYPE_TXT "分区计划和目标系统类型" | ||||||
|  | t IDS_FILESYSTEM_TXT "文件系统" | ||||||
|  | t IDS_CLUSTERSIZE_TXT "簇的大小" | ||||||
|  | t IDS_LABEL_TXT "新卷标" | ||||||
|  | t IDS_FORMAT_OPTIONS_GRP "格式选项        " | ||||||
|  | t IDC_BADBLOCKS "检查设备的坏块:" | ||||||
|  | t IDC_QUICKFORMAT "快速格式化" | ||||||
|  | t IDC_BOOT "创建一个可启动的磁盘使用:" | ||||||
|  | s IDC_BOOT +10,0 | ||||||
|  | t IDC_SET_ICON "创建扩展标签和图标文件" | ||||||
|  | m IDC_ADVANCED -24,0 | ||||||
|  | m IDC_NBPASSES 8,0 | ||||||
|  | m IDC_BOOTTYPE 8,0 | ||||||
|  | m IDC_SELECT_ISO 6,0 | ||||||
|  | t IDC_ABOUT "关于..." | ||||||
|  | t IDC_LOG "日志" | ||||||
|  | m IDC_LOG -5,0 | ||||||
|  | s IDC_LOG +5,0 | ||||||
|  | t IDCANCEL "关闭" | ||||||
|  | t IDC_START "开始" | ||||||
|  | t IDS_ADVANCED_OPTIONS_GRP "高级选项" | ||||||
|  | t IDC_ENABLE_FIXED_DISKS "列表固定(非flash)或USB磁盘分区" | ||||||
|  | t IDC_EXTRA_PARTITION "添加修复旧的BIOS(额外的分区,校准等等)" | ||||||
|  | t IDC_RUFUS_MBR "使用 Rufus MBR BIOS ID:" | ||||||
|  | 
 | ||||||
|  | g IDD_ABOUTBOX | ||||||
|  | t IDD_ABOUTBOX "关于 Rufus" | ||||||
|  | t IDC_ABOUT_LICENSE "许可证" | ||||||
|  | t IDC_ABOUT_UPDATES "更新" | ||||||
|  | t IDOK "确定" | ||||||
|  | 
 | ||||||
|  | g IDD_LICENSE | ||||||
|  | t IDD_LICENSE "Rufus 许可证" | ||||||
|  | t IDOK "取消" | ||||||
|  | 
 | ||||||
|  | g IDD_NOTIFICATION | ||||||
|  | t IDD_NOTIFICATION "更新方案和设置" | ||||||
|  | t IDC_MORE_INFO "更多信息" | ||||||
|  | t IDYES "是" | ||||||
|  | t IDNO "否" | ||||||
|  | 
 | ||||||
|  | g IDD_LOG | ||||||
|  | t IDD_LOG "日志" | ||||||
|  | t IDC_LOG_CLEAR "清除日志" | ||||||
|  | t IDC_LOG_SAVE "保存日志" | ||||||
|  | t IDCANCEL "关闭日志" | ||||||
|  | 
 | ||||||
|  | g IDD_LICENSE | ||||||
|  | t IDOK "取消" | ||||||
|  | 
 | ||||||
|  | g IDD_UPDATE_POLICY | ||||||
|  | t IDD_UPDATE_POLICY "更新方案和设置" | ||||||
|  | t IDS_UPDATE_SETTINGS_GRP "设置" | ||||||
|  | t IDS_UPDATE_FREQUENCY_TXT "检查更新:" | ||||||
|  | t IDS_INCLUDE_BETAS_TXT "包括测试版本:" | ||||||
|  | t IDC_CHECK_NOW "立即检查" | ||||||
|  | t IDCANCEL "取消" | ||||||
|  | 
 | ||||||
|  | g IDD_NEW_VERSION | ||||||
|  | t IDD_NEW_VERSION "检查更新 - Rufus" | ||||||
|  | t IDS_NEW_VERSION_AVAIL_TXT "更新的版本可用。请下载最新版本!" | ||||||
|  | t IDC_WEBSITE "点击这里进入网站" | ||||||
|  | t IDS_NEW_VERSION_NOTES_GRP "发行说明" | ||||||
|  | t IDS_NEW_VERSION_DOWNLOAD_GRP "下载" | ||||||
|  | t IDC_DOWNLOAD "下载" | ||||||
|  | t IDCANCEL "取消" | ||||||
|  | 
 | ||||||
|  | g IDD_ISO_EXTRACT | ||||||
|  | t IDD_ISO_EXTRACT "复制ISO文件..." | ||||||
|  | t IDC_ISO_FILENAME "打开ISO映像 - 请稍候..." | ||||||
|  | t IDC_ISO_ABORT "取消" | ||||||
|  | 
 | ||||||
|  | g IDD_MESSAGES | ||||||
|  | t MSG_004 "更新方案和设置" | ||||||
|  | t MSG_005 "你要允許此應用程序檢查更新?" | ||||||
|  | t MSG_006 "关闭" | ||||||
|  | t MSG_007 "撤消" | ||||||
|  | @ -87,6 +87,7 @@ | ||||||
|       <AdditionalIncludeDirectories>..\msvc-missing;..\ms-sys\inc;..\syslinux\libinstaller;..\syslinux\libfat;..\libcdio;..\getopt;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> |       <AdditionalIncludeDirectories>..\msvc-missing;..\ms-sys\inc;..\syslinux\libinstaller;..\syslinux\libfat;..\libcdio;..\getopt;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> | ||||||
|       <CompileAs>CompileAsC</CompileAs> |       <CompileAs>CompileAsC</CompileAs> | ||||||
|       <MultiProcessorCompilation>true</MultiProcessorCompilation> |       <MultiProcessorCompilation>true</MultiProcessorCompilation> | ||||||
|  |       <ExceptionHandling>false</ExceptionHandling> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <Link> |     <Link> | ||||||
|       <AdditionalDependencies>setupapi.lib;comctl32.lib;wininet.lib;%(AdditionalDependencies)</AdditionalDependencies> |       <AdditionalDependencies>setupapi.lib;comctl32.lib;wininet.lib;%(AdditionalDependencies)</AdditionalDependencies> | ||||||
|  | @ -113,6 +114,7 @@ | ||||||
|       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> |       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> | ||||||
|       <CompileAs>CompileAsC</CompileAs> |       <CompileAs>CompileAsC</CompileAs> | ||||||
|       <MultiProcessorCompilation>true</MultiProcessorCompilation> |       <MultiProcessorCompilation>true</MultiProcessorCompilation> | ||||||
|  |       <ExceptionHandling>false</ExceptionHandling> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <Link> |     <Link> | ||||||
|       <AdditionalDependencies>setupapi.lib;comctl32.lib;wininet.lib;%(AdditionalDependencies)</AdditionalDependencies> |       <AdditionalDependencies>setupapi.lib;comctl32.lib;wininet.lib;%(AdditionalDependencies)</AdditionalDependencies> | ||||||
|  | @ -135,6 +137,7 @@ | ||||||
|       <AdditionalIncludeDirectories>..\msvc-missing;..\ms-sys\inc;..\syslinux\libinstaller;..\syslinux\libfat;..\libcdio;..\getopt;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> |       <AdditionalIncludeDirectories>..\msvc-missing;..\ms-sys\inc;..\syslinux\libinstaller;..\syslinux\libfat;..\libcdio;..\getopt;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> | ||||||
|       <CompileAs>CompileAsC</CompileAs> |       <CompileAs>CompileAsC</CompileAs> | ||||||
|       <MultiProcessorCompilation>true</MultiProcessorCompilation> |       <MultiProcessorCompilation>true</MultiProcessorCompilation> | ||||||
|  |       <ExceptionHandling>false</ExceptionHandling> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <Link> |     <Link> | ||||||
|       <AdditionalDependencies>setupapi.lib;comctl32.lib;wininet.lib;%(AdditionalDependencies)</AdditionalDependencies> |       <AdditionalDependencies>setupapi.lib;comctl32.lib;wininet.lib;%(AdditionalDependencies)</AdditionalDependencies> | ||||||
|  | @ -160,6 +163,7 @@ | ||||||
|       <AdditionalIncludeDirectories>..\msvc-missing;..\ms-sys\inc;..\syslinux\libinstaller;..\syslinux\libfat;..\libcdio;..\getopt;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> |       <AdditionalIncludeDirectories>..\msvc-missing;..\ms-sys\inc;..\syslinux\libinstaller;..\syslinux\libfat;..\libcdio;..\getopt;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> | ||||||
|       <CompileAs>CompileAsC</CompileAs> |       <CompileAs>CompileAsC</CompileAs> | ||||||
|       <MultiProcessorCompilation>true</MultiProcessorCompilation> |       <MultiProcessorCompilation>true</MultiProcessorCompilation> | ||||||
|  |       <ExceptionHandling>false</ExceptionHandling> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <Link> |     <Link> | ||||||
|       <AdditionalDependencies>setupapi.lib;comctl32.lib;wininet.lib;%(AdditionalDependencies)</AdditionalDependencies> |       <AdditionalDependencies>setupapi.lib;comctl32.lib;wininet.lib;%(AdditionalDependencies)</AdditionalDependencies> | ||||||
|  | @ -181,6 +185,7 @@ | ||||||
|     <ClCompile Include="..\dos.c" /> |     <ClCompile Include="..\dos.c" /> | ||||||
|     <ClCompile Include="..\icon.c" /> |     <ClCompile Include="..\icon.c" /> | ||||||
|     <ClCompile Include="..\iso.c" /> |     <ClCompile Include="..\iso.c" /> | ||||||
|  |     <ClCompile Include="..\localization.c" /> | ||||||
|     <ClCompile Include="..\net.c" /> |     <ClCompile Include="..\net.c" /> | ||||||
|     <ClCompile Include="..\parser.c" /> |     <ClCompile Include="..\parser.c" /> | ||||||
|     <ClCompile Include="..\rufus.c" /> |     <ClCompile Include="..\rufus.c" /> | ||||||
|  | @ -197,6 +202,8 @@ | ||||||
|     <ClInclude Include="..\libcdio\cdio\iso9660.h" /> |     <ClInclude Include="..\libcdio\cdio\iso9660.h" /> | ||||||
|     <ClInclude Include="..\libcdio\cdio\logging.h" /> |     <ClInclude Include="..\libcdio\cdio\logging.h" /> | ||||||
|     <ClInclude Include="..\libcdio\cdio\udf.h" /> |     <ClInclude Include="..\libcdio\cdio\udf.h" /> | ||||||
|  |     <ClInclude Include="..\localization.h" /> | ||||||
|  |     <ClInclude Include="..\localization_data.h" /> | ||||||
|     <ClInclude Include="..\msapi_utf8.h" /> |     <ClInclude Include="..\msapi_utf8.h" /> | ||||||
|     <ClInclude Include="..\dos.h" /> |     <ClInclude Include="..\dos.h" /> | ||||||
|     <ClInclude Include="..\registry.h" /> |     <ClInclude Include="..\registry.h" /> | ||||||
|  |  | ||||||
|  | @ -60,6 +60,9 @@ | ||||||
|     <ClCompile Include="..\stdfn.c"> |     <ClCompile Include="..\stdfn.c"> | ||||||
|       <Filter>Source Files</Filter> |       <Filter>Source Files</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\localization.c"> | ||||||
|  |       <Filter>Source Files</Filter> | ||||||
|  |     </ClCompile> | ||||||
|   </ItemGroup> |   </ItemGroup> | ||||||
|   <ItemGroup> |   <ItemGroup> | ||||||
|     <ClInclude Include="..\rufus.h"> |     <ClInclude Include="..\rufus.h"> | ||||||
|  | @ -101,6 +104,12 @@ | ||||||
|     <ClInclude Include="..\registry.h"> |     <ClInclude Include="..\registry.h"> | ||||||
|       <Filter>Header Files</Filter> |       <Filter>Header Files</Filter> | ||||||
|     </ClInclude> |     </ClInclude> | ||||||
|  |     <ClInclude Include="..\localization.h"> | ||||||
|  |       <Filter>Header Files</Filter> | ||||||
|  |     </ClInclude> | ||||||
|  |     <ClInclude Include="..\localization_data.h"> | ||||||
|  |       <Filter>Header Files</Filter> | ||||||
|  |     </ClInclude> | ||||||
|   </ItemGroup> |   </ItemGroup> | ||||||
|   <ItemGroup> |   <ItemGroup> | ||||||
|     <None Include="..\..\res\rufus.ico"> |     <None Include="..\..\res\rufus.ico"> | ||||||
|  |  | ||||||
|  | @ -36,6 +36,7 @@ SOURCES=rufus.c          \ | ||||||
|         stdlg.c          \ |         stdlg.c          \ | ||||||
|         icon.c           \ |         icon.c           \ | ||||||
|         parser.c         \ |         parser.c         \ | ||||||
|  |         localization.c   \ | ||||||
|         net.c            \ |         net.c            \ | ||||||
|         iso.c            \ |         iso.c            \ | ||||||
|         dos.c            \ |         dos.c            \ | ||||||
|  |  | ||||||
|  | @ -9,7 +9,7 @@ pkg_v_rc_0 = @echo "  RC     $@"; | ||||||
| %_rc.o: %.rc | %_rc.o: %.rc | ||||||
| 	$(pkg_v_rc)$(WINDRES) $(AM_RCFLAGS) -i $< -o $@ | 	$(pkg_v_rc)$(WINDRES) $(AM_RCFLAGS) -i $< -o $@ | ||||||
| 
 | 
 | ||||||
| rufus_SOURCES = drive.c icon.c parser.c iso.c net.c dos.c dos_locale.c badblocks.c syslinux.c vhd.c format.c stdio.c stdfn.c stdlg.c rufus.c | rufus_SOURCES = drive.c icon.c parser.c localization.c iso.c net.c dos.c dos_locale.c badblocks.c syslinux.c vhd.c format.c stdio.c stdfn.c stdlg.c rufus.c | ||||||
| rufus_CFLAGS = -I./ms-sys/inc -I./syslinux/libfat -I./syslinux/libinstaller -I./libcdio $(AM_CFLAGS) | rufus_CFLAGS = -I./ms-sys/inc -I./syslinux/libfat -I./syslinux/libinstaller -I./libcdio $(AM_CFLAGS) | ||||||
| rufus_LDFLAGS = $(AM_LDFLAGS) -mwindows | rufus_LDFLAGS = $(AM_LDFLAGS) -mwindows | ||||||
| rufus_LDADD = rufus_rc.o ms-sys/libmssys.a syslinux/libfat/libfat.a syslinux/libinstaller/libinstaller.a \ | rufus_LDADD = rufus_rc.o ms-sys/libmssys.a syslinux/libfat/libfat.a syslinux/libinstaller/libinstaller.a \ | ||||||
|  |  | ||||||
|  | @ -44,12 +44,13 @@ CONFIG_CLEAN_FILES = | ||||||
| CONFIG_CLEAN_VPATH_FILES = | CONFIG_CLEAN_VPATH_FILES = | ||||||
| PROGRAMS = $(noinst_PROGRAMS) | PROGRAMS = $(noinst_PROGRAMS) | ||||||
| am_rufus_OBJECTS = rufus-drive.$(OBJEXT) rufus-icon.$(OBJEXT) \
 | am_rufus_OBJECTS = rufus-drive.$(OBJEXT) rufus-icon.$(OBJEXT) \
 | ||||||
| 	rufus-parser.$(OBJEXT) rufus-iso.$(OBJEXT) rufus-net.$(OBJEXT) \
 | 	rufus-parser.$(OBJEXT) rufus-localization.$(OBJEXT) \
 | ||||||
| 	rufus-dos.$(OBJEXT) rufus-dos_locale.$(OBJEXT) \
 | 	rufus-iso.$(OBJEXT) rufus-net.$(OBJEXT) rufus-dos.$(OBJEXT) \
 | ||||||
| 	rufus-badblocks.$(OBJEXT) rufus-syslinux.$(OBJEXT) \
 | 	rufus-dos_locale.$(OBJEXT) rufus-badblocks.$(OBJEXT) \
 | ||||||
| 	rufus-vhd.$(OBJEXT) rufus-format.$(OBJEXT) \
 | 	rufus-syslinux.$(OBJEXT) rufus-vhd.$(OBJEXT) \
 | ||||||
| 	rufus-stdio.$(OBJEXT) rufus-stdfn.$(OBJEXT) \
 | 	rufus-format.$(OBJEXT) rufus-stdio.$(OBJEXT) \
 | ||||||
| 	rufus-stdlg.$(OBJEXT) rufus-rufus.$(OBJEXT) | 	rufus-stdfn.$(OBJEXT) rufus-stdlg.$(OBJEXT) \
 | ||||||
|  | 	rufus-rufus.$(OBJEXT) | ||||||
| rufus_OBJECTS = $(am_rufus_OBJECTS) | rufus_OBJECTS = $(am_rufus_OBJECTS) | ||||||
| rufus_DEPENDENCIES = rufus_rc.o ms-sys/libmssys.a \
 | rufus_DEPENDENCIES = rufus_rc.o ms-sys/libmssys.a \
 | ||||||
| 	syslinux/libfat/libfat.a syslinux/libinstaller/libinstaller.a \
 | 	syslinux/libfat/libfat.a syslinux/libinstaller/libinstaller.a \
 | ||||||
|  | @ -184,7 +185,7 @@ SUBDIRS = ms-sys syslinux/libfat syslinux/libinstaller libcdio/iso9660 libcdio/u | ||||||
| pkg_v_rc = $(pkg_v_rc_$(V)) | pkg_v_rc = $(pkg_v_rc_$(V)) | ||||||
| pkg_v_rc_ = $(pkg_v_rc_$(AM_DEFAULT_VERBOSITY)) | pkg_v_rc_ = $(pkg_v_rc_$(AM_DEFAULT_VERBOSITY)) | ||||||
| pkg_v_rc_0 = @echo "  RC     $@"; | pkg_v_rc_0 = @echo "  RC     $@"; | ||||||
| rufus_SOURCES = drive.c icon.c parser.c iso.c net.c dos.c dos_locale.c badblocks.c syslinux.c vhd.c format.c stdio.c stdfn.c stdlg.c rufus.c | rufus_SOURCES = drive.c icon.c parser.c localization.c iso.c net.c dos.c dos_locale.c badblocks.c syslinux.c vhd.c format.c stdio.c stdfn.c stdlg.c rufus.c | ||||||
| rufus_CFLAGS = -I./ms-sys/inc -I./syslinux/libfat -I./syslinux/libinstaller -I./libcdio $(AM_CFLAGS) | rufus_CFLAGS = -I./ms-sys/inc -I./syslinux/libfat -I./syslinux/libinstaller -I./libcdio $(AM_CFLAGS) | ||||||
| rufus_LDFLAGS = $(AM_LDFLAGS) -mwindows | rufus_LDFLAGS = $(AM_LDFLAGS) -mwindows | ||||||
| rufus_LDADD = rufus_rc.o ms-sys/libmssys.a syslinux/libfat/libfat.a syslinux/libinstaller/libinstaller.a \
 | rufus_LDADD = rufus_rc.o ms-sys/libmssys.a syslinux/libfat/libfat.a syslinux/libinstaller/libinstaller.a \
 | ||||||
|  | @ -269,6 +270,14 @@ rufus-parser.obj: parser.c | ||||||
| 	$(AM_V_CC) @AM_BACKSLASH@ | 	$(AM_V_CC) @AM_BACKSLASH@ | ||||||
| 	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rufus_CFLAGS) $(CFLAGS) -c -o rufus-parser.obj `if test -f 'parser.c'; then $(CYGPATH_W) 'parser.c'; else $(CYGPATH_W) '$(srcdir)/parser.c'; fi` | 	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rufus_CFLAGS) $(CFLAGS) -c -o rufus-parser.obj `if test -f 'parser.c'; then $(CYGPATH_W) 'parser.c'; else $(CYGPATH_W) '$(srcdir)/parser.c'; fi` | ||||||
| 
 | 
 | ||||||
|  | rufus-localization.o: localization.c | ||||||
|  | 	$(AM_V_CC) @AM_BACKSLASH@ | ||||||
|  | 	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rufus_CFLAGS) $(CFLAGS) -c -o rufus-localization.o `test -f 'localization.c' || echo '$(srcdir)/'`localization.c | ||||||
|  | 
 | ||||||
|  | rufus-localization.obj: localization.c | ||||||
|  | 	$(AM_V_CC) @AM_BACKSLASH@ | ||||||
|  | 	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rufus_CFLAGS) $(CFLAGS) -c -o rufus-localization.obj `if test -f 'localization.c'; then $(CYGPATH_W) 'localization.c'; else $(CYGPATH_W) '$(srcdir)/localization.c'; fi` | ||||||
|  | 
 | ||||||
| rufus-iso.o: iso.c | rufus-iso.o: iso.c | ||||||
| 	$(AM_V_CC) @AM_BACKSLASH@ | 	$(AM_V_CC) @AM_BACKSLASH@ | ||||||
| 	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rufus_CFLAGS) $(CFLAGS) -c -o rufus-iso.o `test -f 'iso.c' || echo '$(srcdir)/'`iso.c | 	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rufus_CFLAGS) $(CFLAGS) -c -o rufus-iso.o `test -f 'iso.c' || echo '$(srcdir)/'`iso.c | ||||||
|  |  | ||||||
|  | @ -45,6 +45,8 @@ | ||||||
| #include "badblocks.h" | #include "badblocks.h" | ||||||
| #include "file.h" | #include "file.h" | ||||||
| #include "msapi_utf8.h" | #include "msapi_utf8.h" | ||||||
|  | #include "resource.h" | ||||||
|  | #include "localization.h" | ||||||
| 
 | 
 | ||||||
| FILE* log_fd = NULL; | FILE* log_fd = NULL; | ||||||
| static const char* abort_msg = "Too many bad blocks, aborting test\n"; | static const char* abort_msg = "Too many bad blocks, aborting test\n"; | ||||||
|  | @ -326,12 +328,12 @@ static void print_status(void) | ||||||
| 	percent = calc_percent((unsigned long) currently_testing, | 	percent = calc_percent((unsigned long) currently_testing, | ||||||
| 					(unsigned long) num_blocks); | 					(unsigned long) num_blocks); | ||||||
| 	percent = (percent/2.0f) + ((cur_op==OP_READ)? 50.0f : 0.0f); | 	percent = (percent/2.0f) + ((cur_op==OP_READ)? 50.0f : 0.0f); | ||||||
| 	PrintStatus(0, FALSE, "Bad Blocks: PASS %d/%d - %0.2f%% (%d/%d/%d errors)", | 	PrintStatus(0, FALSE, lmprintf(MSG_235, | ||||||
| 				cur_pattern, nr_pattern, | 				cur_pattern, nr_pattern, | ||||||
| 				percent,  | 				percent, | ||||||
| 				num_read_errors, | 				num_read_errors, | ||||||
| 				num_write_errors, | 				num_write_errors, | ||||||
| 				num_corruption_errors); | 				num_corruption_errors)); | ||||||
| 	UpdateProgress(OP_BADBLOCKS, (((cur_pattern-1)*100.0f) + percent) / nr_pattern); | 	UpdateProgress(OP_BADBLOCKS, (((cur_pattern-1)*100.0f) + percent) / nr_pattern); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -357,7 +359,7 @@ static void pattern_fill(unsigned char *buffer, unsigned int pattern, | ||||||
| 		for (ptr = buffer; ptr < buffer + n; ptr++) { | 		for (ptr = buffer; ptr < buffer + n; ptr++) { | ||||||
| 			(*ptr) = rand() % (1 << (8 * sizeof(char))); | 			(*ptr) = rand() % (1 << (8 * sizeof(char))); | ||||||
| 		} | 		} | ||||||
| 		PrintStatus(3500, FALSE, "Bad Blocks: Testing with random pattern."); | 		PrintStatus(3500, FALSE, lmprintf(MSG_236)); | ||||||
| 	} else { | 	} else { | ||||||
| 		bpattern[0] = 0; | 		bpattern[0] = 0; | ||||||
| 		for (i = 0; i < sizeof(bpattern); i++) { | 		for (i = 0; i < sizeof(bpattern); i++) { | ||||||
|  | @ -374,7 +376,7 @@ static void pattern_fill(unsigned char *buffer, unsigned int pattern, | ||||||
| 			else | 			else | ||||||
| 				i--; | 				i--; | ||||||
| 		} | 		} | ||||||
| 		PrintStatus(3500, FALSE, "Bad Blocks: Testing with pattern 0x%02X.", bpattern[i]); | 		PrintStatus(3500, FALSE, lmprintf(MSG_237, bpattern[i])); | ||||||
| 		cur_pattern++; | 		cur_pattern++; | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | @ -427,7 +429,7 @@ static unsigned int test_rw(HANDLE hDrive, blk_t last_block, size_t block_size, | ||||||
| 	size_t blocks_at_once, int nb_passes) | 	size_t blocks_at_once, int nb_passes) | ||||||
| { | { | ||||||
| 	unsigned char *buffer = NULL, *read_buffer; | 	unsigned char *buffer = NULL, *read_buffer; | ||||||
| 	const unsigned int pattern[] = {0xaa, 0x55, 0xff, 0x00}; | 	const unsigned int pattern[] = BADBLOCK_PATTERNS; | ||||||
| 	int i, pat_idx; | 	int i, pat_idx; | ||||||
| 	unsigned int bb_count = 0; | 	unsigned int bb_count = 0; | ||||||
| 	blk_t got, tryout, recover_block = ~0, *blk_id; | 	blk_t got, tryout, recover_block = ~0, *blk_id; | ||||||
|  |  | ||||||
|  | @ -30,6 +30,7 @@ | ||||||
| #include "rufus.h" | #include "rufus.h" | ||||||
| #include "resource.h" | #include "resource.h" | ||||||
| #include "sys_types.h" | #include "sys_types.h" | ||||||
|  | #include "localization.h" | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  * Globals |  * Globals | ||||||
|  | @ -625,7 +626,7 @@ BOOL CreatePartition(HANDLE hDrive, int partition_style, int file_system, BOOL m | ||||||
| 	DWORD size; | 	DWORD size; | ||||||
| 	LONGLONG size_in_sectors; | 	LONGLONG size_in_sectors; | ||||||
| 
 | 
 | ||||||
| 	PrintStatus(0, TRUE, "Partitioning (%s)...",  PartitionTypeName[partition_style]); | 	PrintStatus(0, TRUE, lmprintf(MSG_238, PartitionTypeName[partition_style])); | ||||||
| 
 | 
 | ||||||
| 	if ((partition_style == PARTITION_STYLE_GPT) || (!IsChecked(IDC_EXTRA_PARTITION))) { | 	if ((partition_style == PARTITION_STYLE_GPT) || (!IsChecked(IDC_EXTRA_PARTITION))) { | ||||||
| 		// Go with the MS 1 MB wastage at the beginning...
 | 		// Go with the MS 1 MB wastage at the beginning...
 | ||||||
|  | @ -772,7 +773,7 @@ BOOL DeletePartitions(HANDLE hDrive) | ||||||
| 	DWORD size; | 	DWORD size; | ||||||
| 	CREATE_DISK CreateDisk = {PARTITION_STYLE_RAW, {{0}}}; | 	CREATE_DISK CreateDisk = {PARTITION_STYLE_RAW, {{0}}}; | ||||||
| 
 | 
 | ||||||
| 	PrintStatus(0, TRUE, "Deleting partitions..."); | 	PrintStatus(0, TRUE, lmprintf(MSG_239)); | ||||||
| 
 | 
 | ||||||
| 	size = sizeof(CreateDisk); | 	size = sizeof(CreateDisk); | ||||||
| 	r = DeviceIoControl(hDrive, IOCTL_DISK_CREATE_DISK, | 	r = DeviceIoControl(hDrive, IOCTL_DISK_CREATE_DISK, | ||||||
|  |  | ||||||
							
								
								
									
										64
									
								
								src/format.c
									
										
									
									
									
								
							
							
						
						
									
										64
									
								
								src/format.c
									
										
									
									
									
								
							|  | @ -43,6 +43,7 @@ | ||||||
| #include "file.h" | #include "file.h" | ||||||
| #include "format.h" | #include "format.h" | ||||||
| #include "badblocks.h" | #include "badblocks.h" | ||||||
|  | #include "localization.h" | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  * Globals |  * Globals | ||||||
|  | @ -68,16 +69,16 @@ static BOOLEAN __stdcall FormatExCallback(FILE_SYSTEM_CALLBACK_COMMAND Command, | ||||||
| 	switch(Command) { | 	switch(Command) { | ||||||
| 	case FCC_PROGRESS: | 	case FCC_PROGRESS: | ||||||
| 		percent = (DWORD*)pData; | 		percent = (DWORD*)pData; | ||||||
| 		PrintStatus(0, FALSE, "Formatting: %d%% completed.", *percent); | 		PrintStatus(0, FALSE, lmprintf(MSG_217, *percent)); | ||||||
| 		UpdateProgress(OP_FORMAT, 1.0f * (*percent)); | 		UpdateProgress(OP_FORMAT, 1.0f * (*percent)); | ||||||
| 		break; | 		break; | ||||||
| 	case FCC_STRUCTURE_PROGRESS:	// No progress on quick format
 | 	case FCC_STRUCTURE_PROGRESS:	// No progress on quick format
 | ||||||
| 		PrintStatus(0, TRUE, "Creating file system: Task %d/%d completed.", ++task_number, nb_steps[fs_index]); | 		PrintStatus(0, TRUE, lmprintf(MSG_218, ++task_number, nb_steps[fs_index])); | ||||||
| 		format_percent += 100.0f / (1.0f * nb_steps[fs_index]); | 		format_percent += 100.0f / (1.0f * nb_steps[fs_index]); | ||||||
| 		UpdateProgress(OP_CREATE_FS, format_percent); | 		UpdateProgress(OP_CREATE_FS, format_percent); | ||||||
| 		break; | 		break; | ||||||
| 	case FCC_DONE: | 	case FCC_DONE: | ||||||
| 		PrintStatus(0, TRUE, "Creating file system: Task %d/%d completed.", nb_steps[fs_index], nb_steps[fs_index]); | 		PrintStatus(0, TRUE, lmprintf(MSG_218, nb_steps[fs_index], nb_steps[fs_index])); | ||||||
| 		UpdateProgress(OP_CREATE_FS, 100.0f); | 		UpdateProgress(OP_CREATE_FS, 100.0f); | ||||||
| 		if(*(BOOLEAN*)pData == FALSE) { | 		if(*(BOOLEAN*)pData == FALSE) { | ||||||
| 			uprintf("Error while formatting.\n"); | 			uprintf("Error while formatting.\n"); | ||||||
|  | @ -152,7 +153,7 @@ static BOOLEAN __stdcall ChkdskCallback(FILE_SYSTEM_CALLBACK_COMMAND Command, DW | ||||||
| 	case FCC_PROGRESS: | 	case FCC_PROGRESS: | ||||||
| 	case FCC_CHECKDISK_PROGRESS: | 	case FCC_CHECKDISK_PROGRESS: | ||||||
| 		percent = (DWORD*)pData; | 		percent = (DWORD*)pData; | ||||||
| 		PrintStatus(0, FALSE, "NTFS Fixup: %d%% completed.", *percent); | 		PrintStatus(0, FALSE, lmprintf(MSG_219, *percent)); | ||||||
| 		break; | 		break; | ||||||
| 	case FCC_DONE: | 	case FCC_DONE: | ||||||
| 		if(*(BOOLEAN*)pData == FALSE) { | 		if(*(BOOLEAN*)pData == FALSE) { | ||||||
|  | @ -365,7 +366,8 @@ static BOOL FormatFAT32(DWORD DriveIndex) | ||||||
| 	// Debug temp vars
 | 	// Debug temp vars
 | ||||||
| 	ULONGLONG FatNeeded, ClusterCount; | 	ULONGLONG FatNeeded, ClusterCount; | ||||||
| 
 | 
 | ||||||
| 	PrintStatus(0, TRUE, "Formatting (Large FAT32)..."); | 	// TODO: use another lmsg for Large FAT32
 | ||||||
|  | 	PrintStatus(0, TRUE, lmprintf(MSG_222, "Large FAT32")); | ||||||
| 	VolumeId = GetVolumeID(); | 	VolumeId = GetVolumeID(); | ||||||
| 
 | 
 | ||||||
| 	// Open the drive and lock it
 | 	// Open the drive and lock it
 | ||||||
|  | @ -552,7 +554,7 @@ static BOOL FormatFAT32(DWORD DriveIndex) | ||||||
| 		if (GetTickCount() > LastRefresh + 25) { | 		if (GetTickCount() > LastRefresh + 25) { | ||||||
| 			LastRefresh = GetTickCount(); | 			LastRefresh = GetTickCount(); | ||||||
| 			format_percent = (100.0f*i)/(1.0f*(SystemAreaSize+BurstSize)); | 			format_percent = (100.0f*i)/(1.0f*(SystemAreaSize+BurstSize)); | ||||||
| 			PrintStatus(0, FALSE, "Formatting: %0.1f%% completed.", format_percent); | 			PrintStatus(0, FALSE, lmprintf(MSG_217, format_percent)); | ||||||
| 			UpdateProgress(OP_FORMAT, format_percent); | 			UpdateProgress(OP_FORMAT, format_percent); | ||||||
| 		} | 		} | ||||||
| 		if (IS_ERROR(FormatStatus)) goto out;	// For cancellation
 | 		if (IS_ERROR(FormatStatus)) goto out;	// For cancellation
 | ||||||
|  | @ -577,7 +579,7 @@ static BOOL FormatFAT32(DWORD DriveIndex) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// Must do it here, as have issues when trying to write the PBR after a remount
 | 	// Must do it here, as have issues when trying to write the PBR after a remount
 | ||||||
| 	PrintStatus(0, TRUE, "Writing partition boot record..."); | 	PrintStatus(0, TRUE, lmprintf(MSG_229)); | ||||||
| 	if (!WritePBR(hLogicalVolume)) { | 	if (!WritePBR(hLogicalVolume)) { | ||||||
| 		// Non fatal error, but the drive probably won't boot
 | 		// Non fatal error, but the drive probably won't boot
 | ||||||
| 		uprintf("Could not write partition boot record - drive may not boot...\n"); | 		uprintf("Could not write partition boot record - drive may not boot...\n"); | ||||||
|  | @ -586,7 +588,7 @@ static BOOL FormatFAT32(DWORD DriveIndex) | ||||||
| 	// Set the FAT32 volume label
 | 	// Set the FAT32 volume label
 | ||||||
| 	GetWindowTextW(hLabel, wLabel, ARRAYSIZE(wLabel)); | 	GetWindowTextW(hLabel, wLabel, ARRAYSIZE(wLabel)); | ||||||
| 	ToValidLabel(wLabel, TRUE); | 	ToValidLabel(wLabel, TRUE); | ||||||
| 	PrintStatus(0, TRUE, "Setting Label (This may take while)..."); | 	PrintStatus(0, TRUE, lmprintf(MSG_221)); | ||||||
| 	// Handle must be closed for SetVolumeLabel to work
 | 	// Handle must be closed for SetVolumeLabel to work
 | ||||||
| 	safe_closehandle(hLogicalVolume); | 	safe_closehandle(hLogicalVolume); | ||||||
| 	VolumeName = GetLogicalName(DriveIndex, TRUE, TRUE); | 	VolumeName = GetLogicalName(DriveIndex, TRUE, TRUE); | ||||||
|  | @ -617,17 +619,16 @@ static BOOL FormatDrive(DWORD DriveIndex) | ||||||
| { | { | ||||||
| 	BOOL r = FALSE; | 	BOOL r = FALSE; | ||||||
| 	PF_DECL(FormatEx); | 	PF_DECL(FormatEx); | ||||||
| 	char FSType[32], format_status[64]; | 	char FSType[32]; | ||||||
| 	char *locale, *VolumeName = NULL; | 	char *locale, *VolumeName = NULL; | ||||||
| 	WCHAR* wVolumeName = NULL; | 	WCHAR* wVolumeName = NULL; | ||||||
| 	WCHAR wFSType[32]; | 	WCHAR wFSType[64]; | ||||||
| 	WCHAR wLabel[64]; | 	WCHAR wLabel[64]; | ||||||
| 	ULONG ulClusterSize; | 	ULONG ulClusterSize; | ||||||
| 	size_t i; | 	size_t i; | ||||||
| 
 | 
 | ||||||
| 	GetWindowTextA(hFileSystem, FSType, ARRAYSIZE(FSType)); | 	GetWindowTextU(hFileSystem, FSType, ARRAYSIZE(FSType)); | ||||||
| 	safe_sprintf(format_status, ARRAYSIZE(format_status), "Formatting (%s)...", FSType); | 	PrintStatus(0, TRUE, lmprintf(MSG_222, FSType)); | ||||||
| 	PrintStatus(0, TRUE, format_status); |  | ||||||
| 	VolumeName = GetLogicalName(DriveIndex, FALSE, TRUE); | 	VolumeName = GetLogicalName(DriveIndex, FALSE, TRUE); | ||||||
| 	wVolumeName = utf8_to_wchar(VolumeName); | 	wVolumeName = utf8_to_wchar(VolumeName); | ||||||
| 	if (wVolumeName == NULL) { | 	if (wVolumeName == NULL) { | ||||||
|  | @ -689,7 +690,7 @@ static BOOL CheckDisk(char DriveLetter) | ||||||
| 	size_t i; | 	size_t i; | ||||||
| 
 | 
 | ||||||
| 	wDriveRoot[0] = (WCHAR)DriveLetter; | 	wDriveRoot[0] = (WCHAR)DriveLetter; | ||||||
| 	PrintStatus(0, TRUE, "NTFS Fixup (Checkdisk)..."); | 	PrintStatus(0, TRUE, lmprintf(MSG_223)); | ||||||
| 
 | 
 | ||||||
| 	PF_INIT_OR_OUT(Chkdsk, fmifs); | 	PF_INIT_OR_OUT(Chkdsk, fmifs); | ||||||
| 
 | 
 | ||||||
|  | @ -781,7 +782,7 @@ static BOOL ClearMBRGPT(HANDLE hPhysicalDrive, LONGLONG DiskSize, DWORD SectorSi | ||||||
| 	uint64_t i, last_sector = DiskSize/SectorSize; | 	uint64_t i, last_sector = DiskSize/SectorSize; | ||||||
| 	unsigned char* pBuf = (unsigned char*) calloc(SectorSize, 1); | 	unsigned char* pBuf = (unsigned char*) calloc(SectorSize, 1); | ||||||
| 
 | 
 | ||||||
| 	PrintStatus(0, TRUE, "Clearing MBR/PBR/GPT structures..."); | 	PrintStatus(0, TRUE, lmprintf(MSG_224)); | ||||||
| 	if (pBuf == NULL) { | 	if (pBuf == NULL) { | ||||||
| 		FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_NOT_ENOUGH_MEMORY; | 		FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_NOT_ENOUGH_MEMORY; | ||||||
| 		goto out; | 		goto out; | ||||||
|  | @ -1166,9 +1167,8 @@ DWORD WINAPI FormatThread(LPVOID param) | ||||||
| 	HANDLE hPhysicalDrive = INVALID_HANDLE_VALUE; | 	HANDLE hPhysicalDrive = INVALID_HANDLE_VALUE; | ||||||
| 	HANDLE hLogicalVolume = INVALID_HANDLE_VALUE; | 	HANDLE hLogicalVolume = INVALID_HANDLE_VALUE; | ||||||
| 	SYSTEMTIME lt; | 	SYSTEMTIME lt; | ||||||
| 	char* guid_volume = NULL; | 	char *bb_msg, *guid_volume = NULL; | ||||||
| 	char drive_name[] = "?:\\"; | 	char drive_name[] = "?:\\"; | ||||||
| 	char bb_msg[512]; |  | ||||||
| 	char logfile[MAX_PATH], *userdir; | 	char logfile[MAX_PATH], *userdir; | ||||||
| 	char wim_image[] = "?:\\sources\\install.wim"; | 	char wim_image[] = "?:\\sources\\install.wim"; | ||||||
| 	char efi_dst[] = "?:\\efi\\boot\\bootx64.efi"; | 	char efi_dst[] = "?:\\efi\\boot\\bootx64.efi"; | ||||||
|  | @ -1180,7 +1180,7 @@ DWORD WINAPI FormatThread(LPVOID param) | ||||||
| 	bt = GETBIOSTYPE((int)ComboBox_GetItemData(hPartitionScheme, ComboBox_GetCurSel(hPartitionScheme))); | 	bt = GETBIOSTYPE((int)ComboBox_GetItemData(hPartitionScheme, ComboBox_GetCurSel(hPartitionScheme))); | ||||||
| 	use_large_fat32 = (fs == FS_FAT32) && ((SelectedDrive.DiskSize > LARGE_FAT32_SIZE) || (force_large_fat32)); | 	use_large_fat32 = (fs == FS_FAT32) && ((SelectedDrive.DiskSize > LARGE_FAT32_SIZE) || (force_large_fat32)); | ||||||
| 
 | 
 | ||||||
| 	PrintStatus(0, TRUE, "Requesting disk access...\n"); | 	PrintStatus(0, TRUE, lmprintf(MSG_225)); | ||||||
| 	hPhysicalDrive = GetPhysicalHandle(DriveIndex, TRUE, TRUE); | 	hPhysicalDrive = GetPhysicalHandle(DriveIndex, TRUE, TRUE); | ||||||
| 	if (hPhysicalDrive == INVALID_HANDLE_VALUE) { | 	if (hPhysicalDrive == INVALID_HANDLE_VALUE) { | ||||||
| 		FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_OPEN_FAILED; | 		FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_OPEN_FAILED; | ||||||
|  | @ -1217,7 +1217,7 @@ DWORD WINAPI FormatThread(LPVOID param) | ||||||
| 	} | 	} | ||||||
| 	CHECK_FOR_USER_CANCEL; | 	CHECK_FOR_USER_CANCEL; | ||||||
| 
 | 
 | ||||||
| 	PrintStatus(0, TRUE, "Analyzing existing boot records...\n"); | 	PrintStatus(0, TRUE, lmprintf(MSG_226)); | ||||||
| 	AnalyzeMBR(hPhysicalDrive); | 	AnalyzeMBR(hPhysicalDrive); | ||||||
| 	if ((hLogicalVolume != NULL) && (hLogicalVolume != INVALID_HANDLE_VALUE)) { | 	if ((hLogicalVolume != NULL) && (hLogicalVolume != INVALID_HANDLE_VALUE)) { | ||||||
| 		AnalyzePBR(hLogicalVolume); | 		AnalyzePBR(hLogicalVolume); | ||||||
|  | @ -1267,19 +1267,15 @@ DWORD WINAPI FormatThread(LPVOID param) | ||||||
| 				report.num_read_errors, report.num_write_errors, report.num_corruption_errors); | 				report.num_read_errors, report.num_write_errors, report.num_corruption_errors); | ||||||
| 			r = IDOK; | 			r = IDOK; | ||||||
| 			if (report.bb_count) { | 			if (report.bb_count) { | ||||||
| 				safe_sprintf(bb_msg, sizeof(bb_msg), "Check completed: %u bad block%s found.\n" | 				bb_msg = lmprintf(MSG_011, report.num_read_errors, report.num_write_errors, | ||||||
| 					"  %d read errors\n  %d write errors\n  %d corruption errors\n", |  | ||||||
| 					report.bb_count, (report.bb_count==1)?"":"s", |  | ||||||
| 					report.num_read_errors, report.num_write_errors,  |  | ||||||
| 					report.num_corruption_errors); | 					report.num_corruption_errors); | ||||||
| 				fprintf(log_fd, "%s", bb_msg); | 				fprintf(log_fd, bb_msg); | ||||||
| 				GetLocalTime(<); | 				GetLocalTime(<); | ||||||
| 				fprintf(log_fd, APPLICATION_NAME " bad blocks check ended on: %04d.%02d.%02d %02d:%02d:%02d\n", | 				fprintf(log_fd, APPLICATION_NAME " bad blocks check ended on: %04d.%02d.%02d %02d:%02d:%02d\n", | ||||||
| 				lt.wYear, lt.wMonth, lt.wDay, lt.wHour, lt.wMinute, lt.wSecond); | 				lt.wYear, lt.wMonth, lt.wDay, lt.wHour, lt.wMinute, lt.wSecond); | ||||||
| 				fclose(log_fd); | 				fclose(log_fd); | ||||||
| 				safe_sprintf(&bb_msg[strlen(bb_msg)], sizeof(bb_msg)-strlen(bb_msg)-1, | 				r = MessageBoxU(hMainDialog, lmprintf(MSG_012, bb_msg, logfile), | ||||||
| 					"\nA more detailed report can be found in:\n%s\n", logfile); | 					lmprintf(MSG_010), MB_ABORTRETRYIGNORE|MB_ICONWARNING); | ||||||
| 				r = MessageBoxU(hMainDialog, bb_msg, "Bad blocks found", MB_ABORTRETRYIGNORE|MB_ICONWARNING); |  | ||||||
| 			} else { | 			} else { | ||||||
| 				// We didn't get any errors => delete the log file
 | 				// We didn't get any errors => delete the log file
 | ||||||
| 				fclose(log_fd); | 				fclose(log_fd); | ||||||
|  | @ -1293,7 +1289,7 @@ DWORD WINAPI FormatThread(LPVOID param) | ||||||
| 	} | 	} | ||||||
| 	// Close the (unmounted) volume before formatting
 | 	// Close the (unmounted) volume before formatting
 | ||||||
| 	if ((hLogicalVolume != NULL) && (hLogicalVolume != INVALID_HANDLE_VALUE)) { | 	if ((hLogicalVolume != NULL) && (hLogicalVolume != INVALID_HANDLE_VALUE)) { | ||||||
| 		PrintStatus(0, TRUE, "Closing existing volume...\n"); | 		PrintStatus(0, TRUE, lmprintf(MSG_227)); | ||||||
| 		if (!CloseHandle(hLogicalVolume)) { | 		if (!CloseHandle(hLogicalVolume)) { | ||||||
| 			uprintf("Could not close volume: %s\n", WindowsErrorString()); | 			uprintf("Could not close volume: %s\n", WindowsErrorString()); | ||||||
| 			FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_ACCESS_DENIED; | 			FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_ACCESS_DENIED; | ||||||
|  | @ -1339,7 +1335,7 @@ DWORD WINAPI FormatThread(LPVOID param) | ||||||
| 
 | 
 | ||||||
| 	// Thanks to Microsoft, we must fix the MBR AFTER the drive has been formatted
 | 	// Thanks to Microsoft, we must fix the MBR AFTER the drive has been formatted
 | ||||||
| 	if (pt == PARTITION_STYLE_MBR) { | 	if (pt == PARTITION_STYLE_MBR) { | ||||||
| 		PrintStatus(0, TRUE, "Writing master boot record..."); | 		PrintStatus(0, TRUE, lmprintf(MSG_228)); | ||||||
| 		if (!WriteMBR(hPhysicalDrive)) { | 		if (!WriteMBR(hPhysicalDrive)) { | ||||||
| 			if (!IS_ERROR(FormatStatus)) | 			if (!IS_ERROR(FormatStatus)) | ||||||
| 				FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_WRITE_FAULT; | 				FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_WRITE_FAULT; | ||||||
|  | @ -1386,7 +1382,7 @@ DWORD WINAPI FormatThread(LPVOID param) | ||||||
| 			} | 			} | ||||||
| 			// NB: if you unmount the logical volume here, XP will report error:
 | 			// NB: if you unmount the logical volume here, XP will report error:
 | ||||||
| 			// [0x00000456] The media in the drive may have changed
 | 			// [0x00000456] The media in the drive may have changed
 | ||||||
| 			PrintStatus(0, TRUE, "Writing partition boot record..."); | 			PrintStatus(0, TRUE, lmprintf(MSG_229)); | ||||||
| 			if (!WritePBR(hLogicalVolume)) { | 			if (!WritePBR(hLogicalVolume)) { | ||||||
| 				if (!IS_ERROR(FormatStatus)) | 				if (!IS_ERROR(FormatStatus)) | ||||||
| 					FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_WRITE_FAULT; | 					FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_WRITE_FAULT; | ||||||
|  | @ -1415,7 +1411,7 @@ DWORD WINAPI FormatThread(LPVOID param) | ||||||
| 	if (IsChecked(IDC_BOOT)) { | 	if (IsChecked(IDC_BOOT)) { | ||||||
| 		if ((dt == DT_WINME) || (dt == DT_FREEDOS)) { | 		if ((dt == DT_WINME) || (dt == DT_FREEDOS)) { | ||||||
| 			UpdateProgress(OP_DOS, -1.0f); | 			UpdateProgress(OP_DOS, -1.0f); | ||||||
| 			PrintStatus(0, TRUE, "Copying DOS files..."); | 			PrintStatus(0, TRUE, lmprintf(MSG_230)); | ||||||
| 			if (!ExtractDOS(drive_name)) { | 			if (!ExtractDOS(drive_name)) { | ||||||
| 				if (!IS_ERROR(FormatStatus)) | 				if (!IS_ERROR(FormatStatus)) | ||||||
| 					FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_CANNOT_COPY; | 					FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_CANNOT_COPY; | ||||||
|  | @ -1424,7 +1420,7 @@ DWORD WINAPI FormatThread(LPVOID param) | ||||||
| 		} else if (dt == DT_ISO) { | 		} else if (dt == DT_ISO) { | ||||||
| 			if (iso_path != NULL) { | 			if (iso_path != NULL) { | ||||||
| 				UpdateProgress(OP_DOS, 0.0f); | 				UpdateProgress(OP_DOS, 0.0f); | ||||||
| 				PrintStatus(0, TRUE, "Copying ISO files..."); | 				PrintStatus(0, TRUE, lmprintf(MSG_231)); | ||||||
| 				drive_name[2] = 0; | 				drive_name[2] = 0; | ||||||
| 				if (!ExtractISO(iso_path, drive_name, FALSE)) { | 				if (!ExtractISO(iso_path, drive_name, FALSE)) { | ||||||
| 					if (!IS_ERROR(FormatStatus)) | 					if (!IS_ERROR(FormatStatus)) | ||||||
|  | @ -1433,7 +1429,7 @@ DWORD WINAPI FormatThread(LPVOID param) | ||||||
| 				} | 				} | ||||||
| 				if ((bt == BT_UEFI) && (!iso_report.has_efi) && (iso_report.has_win7_efi)) { | 				if ((bt == BT_UEFI) && (!iso_report.has_efi) && (iso_report.has_win7_efi)) { | ||||||
| 					// TODO: (v1.4.0) check ISO with EFI only
 | 					// TODO: (v1.4.0) check ISO with EFI only
 | ||||||
| 					PrintStatus(0, TRUE, "Win7 EFI boot setup (this may take a while)..."); | 					PrintStatus(0, TRUE, lmprintf(MSG_232)); | ||||||
| 					wim_image[0] = drive_name[0]; | 					wim_image[0] = drive_name[0]; | ||||||
| 					efi_dst[0] = drive_name[0]; | 					efi_dst[0] = drive_name[0]; | ||||||
| 					efi_dst[sizeof(efi_dst) - sizeof("\\bootx64.efi")] = 0; | 					efi_dst[sizeof(efi_dst) - sizeof("\\bootx64.efi")] = 0; | ||||||
|  | @ -1456,7 +1452,7 @@ DWORD WINAPI FormatThread(LPVOID param) | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 		UpdateProgress(OP_FINALIZE, -1.0f); | 		UpdateProgress(OP_FINALIZE, -1.0f); | ||||||
| 		PrintStatus(0, TRUE, "Finalizing, please wait..."); | 		PrintStatus(0, TRUE, lmprintf(MSG_233)); | ||||||
| 		if (IsChecked(IDC_SET_ICON)) | 		if (IsChecked(IDC_SET_ICON)) | ||||||
| 			SetAutorun(drive_name); | 			SetAutorun(drive_name); | ||||||
| 		// Issue another complete remount before we exit, to ensure we're clean
 | 		// Issue another complete remount before we exit, to ensure we're clean
 | ||||||
|  |  | ||||||
							
								
								
									
										17
									
								
								src/iso.c
									
										
									
									
									
								
							
							
						
						
									
										17
									
								
								src/iso.c
									
										
									
									
									
								
							|  | @ -41,6 +41,7 @@ | ||||||
| #include "rufus.h" | #include "rufus.h" | ||||||
| #include "msapi_utf8.h" | #include "msapi_utf8.h" | ||||||
| #include "resource.h" | #include "resource.h" | ||||||
|  | #include "localization.h" | ||||||
| 
 | 
 | ||||||
| // How often should we update the progress bar (in 2K blocks) as updating
 | // How often should we update the progress bar (in 2K blocks) as updating
 | ||||||
| // the progress bar for every block will bring extraction to a crawl
 | // the progress bar for every block will bring extraction to a crawl
 | ||||||
|  | @ -77,16 +78,15 @@ static __inline char* size_to_hr(int64_t size) | ||||||
| { | { | ||||||
| 	int suffix = 0; | 	int suffix = 0; | ||||||
| 	static char str_size[24]; | 	static char str_size[24]; | ||||||
| 	const char* sizes[] = { "", "KB", "MB", "GB", "TB" }; |  | ||||||
| 	double hr_size = (double)size; | 	double hr_size = (double)size; | ||||||
| 	while ((suffix < ARRAYSIZE(sizes)) && (hr_size >= 1024.0)) { | 	while ((suffix < MAX_SIZE_SUFFIXES) && (hr_size >= 1024.0)) { | ||||||
| 		hr_size /= 1024.0; | 		hr_size /= 1024.0; | ||||||
| 		suffix++; | 		suffix++; | ||||||
| 	} | 	} | ||||||
| 	if (suffix == 0) { | 	if (suffix == 0) { | ||||||
| 		safe_sprintf(str_size, sizeof(str_size), " (%d bytes)", (int)hr_size); | 		safe_sprintf(str_size, sizeof(str_size), " (%d %s)", (int)hr_size, lmprintf(MSG_020)); | ||||||
| 	} else { | 	} else { | ||||||
| 		safe_sprintf(str_size, sizeof(str_size), " (%0.1f %s)", hr_size, sizes[suffix]); | 		safe_sprintf(str_size, sizeof(str_size), " (%0.1f %s)", hr_size, lmprintf(MSG_020+suffix)); | ||||||
| 	} | 	} | ||||||
| 	return str_size; | 	return str_size; | ||||||
| } | } | ||||||
|  | @ -419,7 +419,6 @@ BOOL ExtractISO(const char* src_iso, const char* dest_dir, BOOL scan) | ||||||
| 	LONG progress_style; | 	LONG progress_style; | ||||||
| 	char* tmp; | 	char* tmp; | ||||||
| 	char path[64]; | 	char path[64]; | ||||||
| 	const char* scan_text = "Scanning ISO image..."; |  | ||||||
| 	const char* basedir[] = { "i386", "minint" }; | 	const char* basedir[] = { "i386", "minint" }; | ||||||
| 	const char* tmp_sif = ".\\txtsetup.sif~"; | 	const char* tmp_sif = ".\\txtsetup.sif~"; | ||||||
| 	iso_extension_mask_t iso_extension_mask = ISO_EXTENSION_ALL; | 	iso_extension_mask_t iso_extension_mask = ISO_EXTENSION_ALL; | ||||||
|  | @ -437,14 +436,14 @@ BOOL ExtractISO(const char* src_iso, const char* dest_dir, BOOL scan) | ||||||
| 		// String array of all isolinux/syslinux locations
 | 		// String array of all isolinux/syslinux locations
 | ||||||
| 		StrArrayCreate(&config_path, 8); | 		StrArrayCreate(&config_path, 8); | ||||||
| 		// Change the Window title and static text
 | 		// Change the Window title and static text
 | ||||||
| 		SetWindowTextU(hISOProgressDlg, scan_text); | 		SetWindowTextU(hISOProgressDlg, lmprintf(MSG_202)); | ||||||
| 		SetWindowTextU(hISOFileName, scan_text); | 		SetWindowTextU(hISOFileName, lmprintf(MSG_202)); | ||||||
| 		// Change progress style to marquee for scanning
 | 		// Change progress style to marquee for scanning
 | ||||||
| 		SetWindowLong(hISOProgressBar, GWL_STYLE, progress_style | PBS_MARQUEE); | 		SetWindowLong(hISOProgressBar, GWL_STYLE, progress_style | PBS_MARQUEE); | ||||||
| 		SendMessage(hISOProgressBar, PBM_SETMARQUEE, TRUE, 0); | 		SendMessage(hISOProgressBar, PBM_SETMARQUEE, TRUE, 0); | ||||||
| 	} else { | 	} else { | ||||||
| 		uprintf("Extracting files...\n"); | 		uprintf("Extracting files...\n"); | ||||||
| 		SetWindowTextU(hISOProgressDlg, "Copying ISO files..."); | 		SetWindowTextU(hISOProgressDlg, lmprintf(MSG_231)); | ||||||
| 		if (total_blocks == 0) { | 		if (total_blocks == 0) { | ||||||
| 			uprintf("Error: ISO has not been properly scanned.\n"); | 			uprintf("Error: ISO has not been properly scanned.\n"); | ||||||
| 			FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|APPERR(ERROR_ISO_SCAN); | 			FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|APPERR(ERROR_ISO_SCAN); | ||||||
|  | @ -506,7 +505,7 @@ out: | ||||||
| 	iso_blocking_status = -1; | 	iso_blocking_status = -1; | ||||||
| 	if (scan_only) { | 	if (scan_only) { | ||||||
| 		// Remove trailing spaces from the label
 | 		// Remove trailing spaces from the label
 | ||||||
| 		for (j=(int)safe_strlen(iso_report.label)-1; ((j>=0)&&(isspace(iso_report.label[j]))); j--) | 		for (j=(int)safe_strlen(iso_report.label)-1; ((j>=0)&&(isspaceU(iso_report.label[j]))); j--) | ||||||
| 			iso_report.label[j] = 0; | 			iso_report.label[j] = 0; | ||||||
| 		// We use the fact that UDF_BLOCKSIZE and ISO_BLOCKSIZE are the same here
 | 		// We use the fact that UDF_BLOCKSIZE and ISO_BLOCKSIZE are the same here
 | ||||||
| 		iso_report.projected_size = total_blocks * ISO_BLOCKSIZE; | 		iso_report.projected_size = total_blocks * ISO_BLOCKSIZE; | ||||||
|  |  | ||||||
|  | @ -19,16 +19,17 @@ | ||||||
| 
 | 
 | ||||||
| const char* about_blurb_format = | const char* about_blurb_format = | ||||||
| "{\\rtf1\\ansi\n" | "{\\rtf1\\ansi\n" | ||||||
| "{\\b\\fs20Rufus - The Reliable USB Formatting Utility}\\line\n" | "{\\b\\fs20%s}\\line\n" | ||||||
| "\\fs18Version %d.%d.%d (Build %d)\\line\n" | "\\fs18%s\\line\n" | ||||||
| "\\line\n" | "\\line\n" | ||||||
| "Copyright © 2011-2013 Pete Batard / Akeo\\line\n" | "Copyright © 2011-2013 Pete Batard / Akeo\\line\n" | ||||||
| RUFUS_URL "\\line\n" | RUFUS_URL "\\line\n" | ||||||
|  | "%s\\line\n" | ||||||
| "\\line\n" | "\\line\n" | ||||||
| "Report bugs or request enhancements at:\\line\n" | "%s\\line\n" | ||||||
| "https://github.com/pbatard/rufus/issues\\line\n" | "https://github.com/pbatard/rufus/issues\\line\n" | ||||||
| "\\line\n" | "\\line\n" | ||||||
| "{\\b\\fs18Additional Copyrights:}}"; | "{\\b\\fs18 %s}}"; | ||||||
| 
 | 
 | ||||||
| const char* additional_copyrights = | const char* additional_copyrights = | ||||||
| "{\\rtf1\\ansi\n" | "{\\rtf1\\ansi\n" | ||||||
|  | @ -90,17 +91,15 @@ const char* additional_copyrights = | ||||||
| 
 | 
 | ||||||
| const char* update_policy = | const char* update_policy = | ||||||
| "{\\rtf1\\ansi{\\fonttbl{\\f0\\fnil\\fcharset0 Microsoft Sans Serif;}{\\f1\\fnil\\fcharset2 Symbol;}}\n" | "{\\rtf1\\ansi{\\fonttbl{\\f0\\fnil\\fcharset0 Microsoft Sans Serif;}{\\f1\\fnil\\fcharset2 Symbol;}}\n" | ||||||
| "\\fs16\\b Update Policy:\\b0\\line\n" | "\\fs16\\b %s\\b0\\line\n" | ||||||
| "If you choose to allow this program to check for application updates, you agree that the following information may be collected on our server(s):\\par\n" | "%s:\\par\n" | ||||||
| "\\pard{\\pntext\\f1\\'B7\\tab}{\\*\\pn\\pnlvlblt\\pnf2\\pnindent0{\\pntxtb\\'B7}}\\fi-150\\li220 Your operating system's architecture and version\\par\n" | "\\pard{\\pntext\\f1\\'B7\\tab}{\\*\\pn\\pnlvlblt\\pnf2\\pnindent0{\\pntxtb\\'B7}}\\fi-150\\li220 %s\\par\n" | ||||||
| "{\\pntext\\f1\\'B7\\tab}The version of the application you use\\par\n" | "{\\pntext\\f1\\'B7\\tab}%s\\par\n" | ||||||
| "{\\pntext\\f1\\'B7\\tab}Your IP address\\line\\pard\n" | "{\\pntext\\f1\\'B7\\tab}%s\\line\\pard\n" | ||||||
| "\\line\n" | "\\line\n" | ||||||
| "For the purpose of generating private usage statistics, we may keep the information collected, \n" | "%s\\line\n\\line\n" | ||||||
| "\\b for at most a year\\b0 . However, we will not willingly disclose any of this individual data to third parties.\\line\n\\line\n" | "\\b %s\\b0\\line\n" | ||||||
| "\\b Update Process:\\b0\\line\n" | "%s\\line\n" | ||||||
| APPLICATION_NAME " does not install or run background services, therefore update checks are performed only when the main application is running.\\line\n" |  | ||||||
| "Internet access is of course required when checking for updates.\\line\n" |  | ||||||
| "}"; | "}"; | ||||||
| 
 | 
 | ||||||
| const char* gplv3 = | const char* gplv3 = | ||||||
|  |  | ||||||
							
								
								
									
										368
									
								
								src/localization.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										368
									
								
								src/localization.c
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,368 @@ | ||||||
|  | /*
 | ||||||
|  |  * Rufus: The Reliable USB Formatting Utility | ||||||
|  |  * Localization functions, a.k.a. "Everybody is doing it wrong but me!" | ||||||
|  |  * Copyright © 2013 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/>.
 | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | /* Memory leaks detection - define _CRTDBG_MAP_ALLOC as preprocessor macro */ | ||||||
|  | #ifdef _CRTDBG_MAP_ALLOC | ||||||
|  | #include <stdlib.h> | ||||||
|  | #include <crtdbg.h> | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #include <windows.h> | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <wchar.h> | ||||||
|  | #include <string.h> | ||||||
|  | #include <stddef.h> | ||||||
|  | 
 | ||||||
|  | #include "rufus.h" | ||||||
|  | #include "resource.h" | ||||||
|  | #include "msapi_utf8.h" | ||||||
|  | #include "localization.h" | ||||||
|  | #include "localization_data.h" | ||||||
|  | 
 | ||||||
|  | /* 
 | ||||||
|  |  * List of supported locale commands, with their parameter syntax: | ||||||
|  |  *   c control ID (no space, no quotes) | ||||||
|  |  *   s: quoted string | ||||||
|  |  *   i: 32 bit signed integer | ||||||
|  |  *   u: 32 bit unsigned CSV list | ||||||
|  |  * Remember to update the size of the array in localization.h when adding/removing elements | ||||||
|  |  */ | ||||||
|  | const loc_parse parse_cmd[9] = { | ||||||
|  | 	// Translation name and Windows LCIDs it should apply to
 | ||||||
|  | 	{ 'l', LC_LOCALE, "ssu" },	// l "en_US" "English (US)" 0x0009,0x1009
 | ||||||
|  | 	// Base translation to add on top of (eg. "English (UK)" can be used to build on top of "English (US)"
 | ||||||
|  | 	{ 'b', LC_BASE, "s" },		// b "en_US"
 | ||||||
|  | 	// Version to use for the localization commandset and API
 | ||||||
|  | 	{ 'v', LC_VERSION, "ii" },	// v 1.0				// TODO: NOT IMPLEMENTED YET
 | ||||||
|  | 	// Translate the text control associated with an ID
 | ||||||
|  | 	{ 't', LC_TEXT, "cs" },		// t IDC_CONTROL "Translation"
 | ||||||
|  | 	// Set the section/dialog to which the next commands should apply
 | ||||||
|  | 	{ 'g', LC_GROUP, "c" },		// g IDD_DIALOG
 | ||||||
|  | 	// Resize a dialog (dx dy pixel increment)
 | ||||||
|  | 	{ 's', LC_SIZE, "cii" },	// s IDC_CONTROL +10 +10
 | ||||||
|  | 	// Move a dialog (dx dy pixed displacement)
 | ||||||
|  | 	{ 'm', LC_MOVE, "cii" },	// m IDC_CONTROL -5 0
 | ||||||
|  | 	// Set the font to use for the text controls that follow
 | ||||||
|  | 	// Use f "Default" 0 to reset the font
 | ||||||
|  | 	{ 'f', LC_FONT, "si" },		// f "MS Dialog" 10
 | ||||||
|  | 	// Set the direction to use for the text controls that follow
 | ||||||
|  | 	// 0 = Left to right, 1 = Right to left
 | ||||||
|  | 	{ 'd', LC_DIRECTION, "i" },	// d 1					// TODO: NOT IMPLEMENTED YET
 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /* Globals */ | ||||||
|  | int    loc_line_nr; | ||||||
|  | struct list_head locale_list = {NULL, NULL}; | ||||||
|  | char   *loc_filename = NULL, *embedded_loc_filename = "[embedded] rufus.loc"; | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Add a localization command to a dialog/section | ||||||
|  |  */ | ||||||
|  | void add_dialog_command(int index, loc_cmd* lcmd) | ||||||
|  | { | ||||||
|  | 	if ((lcmd == NULL) || (index < 0) || (index >= ARRAYSIZE(loc_dlg))) { | ||||||
|  | 		uprintf("add_dialog_command: invalid parameter\n"); | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  | 	list_add(&lcmd->list, &loc_dlg[index].list); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void free_loc_cmd(loc_cmd* lcmd) | ||||||
|  | { | ||||||
|  | 	if (lcmd == NULL) | ||||||
|  | 		return; | ||||||
|  | 	safe_free(lcmd->txt[0]); | ||||||
|  | 	safe_free(lcmd->txt[1]); | ||||||
|  | 	safe_free(lcmd->unum); | ||||||
|  | 	free(lcmd); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void free_dialog_list(void) | ||||||
|  | { | ||||||
|  | 	size_t i = 0; | ||||||
|  | 	loc_cmd *lcmd, *next; | ||||||
|  | 
 | ||||||
|  | 	for (i=0; i<ARRAYSIZE(loc_dlg); i++) { | ||||||
|  | 		if (list_empty(&loc_dlg[i].list)) | ||||||
|  | 			continue; | ||||||
|  | 		list_for_each_entry_safe(lcmd, next, &loc_dlg[i].list, loc_cmd, list) { | ||||||
|  | 			list_del(&lcmd->list); | ||||||
|  | 			free_loc_cmd(lcmd); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void free_locale_list(void) | ||||||
|  | { | ||||||
|  | 	loc_cmd *lcmd, *next; | ||||||
|  | 
 | ||||||
|  | 	list_for_each_entry_safe(lcmd, next, &locale_list, loc_cmd, list) { | ||||||
|  | 		list_del(&lcmd->list); | ||||||
|  | 		free_loc_cmd(lcmd); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Init/destroy our various localization lists | ||||||
|  |  */ | ||||||
|  | void init_localization(void) { | ||||||
|  | 	size_t i; | ||||||
|  | 	for (i=0; i<ARRAYSIZE(loc_dlg); i++) | ||||||
|  | 		list_init(&loc_dlg[i].list); | ||||||
|  | 	list_init(&locale_list); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void exit_localization(void) { | ||||||
|  | 	free_dialog_list(); | ||||||
|  | 	free_locale_list(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Validate and store localization command data | ||||||
|  |  * | ||||||
|  |  * TODO: Do we need to store a revert for every action we execute here, | ||||||
|  |  * or do we want to reinstantiate the dialogs? | ||||||
|  |  */ | ||||||
|  | BOOL dispatch_loc_cmd(loc_cmd* lcmd) | ||||||
|  | { | ||||||
|  | 	size_t i; | ||||||
|  | 	static int dlg_index = 0; | ||||||
|  | 	loc_cmd* base_locale = NULL; | ||||||
|  | 
 | ||||||
|  | 	if (lcmd == NULL) | ||||||
|  | 		return FALSE; | ||||||
|  | 
 | ||||||
|  | 	if (lcmd->command <= LC_TEXT) { | ||||||
|  | 		// Any command up to LC_TEXT takes a control ID in text[0]
 | ||||||
|  | 		for (i=0; i<ARRAYSIZE(control_id); i++) { | ||||||
|  | 			if (safe_strcmp(lcmd->txt[0], control_id[i].name) == 0) { | ||||||
|  | 				lcmd->ctrl_id = control_id[i].id; | ||||||
|  | 				break; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		if (lcmd->ctrl_id < 0) { | ||||||
|  | 			luprintf("unknown control '%s'\n", lcmd->txt[0]); | ||||||
|  | 			goto err; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	switch(lcmd->command) { | ||||||
|  | 	// NB: For commands that take an ID, ctrl_id is always a valid index at this stage
 | ||||||
|  | 	case LC_TEXT: | ||||||
|  | 	case LC_MOVE: | ||||||
|  | 	case LC_SIZE: | ||||||
|  | 		add_dialog_command(dlg_index, lcmd); | ||||||
|  | 		break; | ||||||
|  | 	case LC_GROUP: | ||||||
|  | 		if ((lcmd->ctrl_id-IDD_DIALOG) > ARRAYSIZE(loc_dlg)) { | ||||||
|  | 			luprintf("'%s' is not a group ID\n", lcmd->txt[0]); | ||||||
|  | 			goto err; | ||||||
|  | 		} | ||||||
|  | 		dlg_index = lcmd->ctrl_id - IDD_DIALOG; | ||||||
|  | 		free_loc_cmd(lcmd); | ||||||
|  | 		break; | ||||||
|  | 	case LC_VERSION: | ||||||
|  | 		luprintf("GOT VERSION: %d.%d\n", lcmd->num[0], lcmd->num[1]); | ||||||
|  | 		free_loc_cmd(lcmd); | ||||||
|  | 		break; | ||||||
|  | 	case LC_BASE: | ||||||
|  | 		base_locale = get_locale_from_name(lcmd->txt[0]); | ||||||
|  | 		if (base_locale != NULL) { | ||||||
|  | 			uprintf("localization: using locale base '%s'", lcmd->txt[0]); | ||||||
|  | 			get_loc_data_file(NULL, (long)base_locale->num[0], (long)base_locale->num[1], base_locale->line_nr); | ||||||
|  | 		} else { | ||||||
|  | 			uprintf("localization: locale base '%s' not found", lcmd->txt[0]); | ||||||
|  | 		} | ||||||
|  | 		free_loc_cmd(lcmd); | ||||||
|  | 		break; | ||||||
|  | 	default: | ||||||
|  | 		free_loc_cmd(lcmd); | ||||||
|  | 		break; | ||||||
|  | 	} | ||||||
|  | 	return TRUE; | ||||||
|  | 
 | ||||||
|  | err: | ||||||
|  | 	free_loc_cmd(lcmd); | ||||||
|  | 	return FALSE; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Apply stored localization commands to a specific dialog | ||||||
|  |  * If hDlg is NULL, apply the commands against an active Window | ||||||
|  |  * TODO: if dlg_id is <0, apply all | ||||||
|  |  */ | ||||||
|  | void apply_localization(int dlg_id, HWND hDlg) | ||||||
|  | { | ||||||
|  | 	loc_cmd* lcmd; | ||||||
|  | 	HWND hCtrl = NULL; | ||||||
|  | 	int id_start = IDD_DIALOG, id_end = IDD_DIALOG + ARRAYSIZE(loc_dlg); | ||||||
|  | 	LONG_PTR style; | ||||||
|  | 	BOOL left_to_right = FALSE; | ||||||
|  | 
 | ||||||
|  | 	if ((dlg_id >= id_start) && (dlg_id < id_end)) { | ||||||
|  | 		// If we have a valid dialog_id, just process that one dialog
 | ||||||
|  | 		id_start = dlg_id; | ||||||
|  | 		id_end = dlg_id + 1; | ||||||
|  | 		if (hDlg != NULL) { | ||||||
|  | 			loc_dlg[dlg_id-IDD_DIALOG].hDlg = hDlg; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	for (dlg_id = id_start; dlg_id < id_end; dlg_id++) { | ||||||
|  | 		hDlg = loc_dlg[dlg_id-IDD_DIALOG].hDlg; | ||||||
|  | 		if ((!IsWindow(hDlg)) || (list_empty(&loc_dlg[dlg_id-IDD_DIALOG].list))) | ||||||
|  | 			continue; | ||||||
|  | 
 | ||||||
|  | 		// TODO: storing the messages in an array indexed on the message ID - 3000 would be faster
 | ||||||
|  | 		list_for_each_entry(lcmd, &loc_dlg[dlg_id-IDD_DIALOG].list, loc_cmd, list) { | ||||||
|  | 			if (lcmd->command <= LC_TEXT) { // TODO: should always be the case
 | ||||||
|  | 				if (lcmd->ctrl_id == dlg_id) { | ||||||
|  | 					if ((dlg_id == IDD_DIALOG) && (lcmd->txt[1] != NULL) && (lcmd->txt[1][0] != 0)) { | ||||||
|  | 						loc_line_nr = lcmd->line_nr; | ||||||
|  | 						luprint("operation forbidden (main dialog title cannot be changed)"); | ||||||
|  | 						continue; | ||||||
|  | 					} | ||||||
|  | 					hCtrl = hDlg; | ||||||
|  | 				} else { | ||||||
|  | 					hCtrl = GetDlgItem(hDlg, lcmd->ctrl_id); | ||||||
|  | 				} | ||||||
|  | 				if (hCtrl == NULL) { | ||||||
|  | 					loc_line_nr = lcmd->line_nr; | ||||||
|  | 					luprintf("control '%s' is not part of dialog '%s'\n", | ||||||
|  | 						lcmd->txt[0], control_id[dlg_id-IDD_DIALOG].name); | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			switch(lcmd->command) { | ||||||
|  | 			// NB: For commands that take an ID, ctrl_id is always a valid index at this stage
 | ||||||
|  | 			case LC_TEXT: | ||||||
|  | 				if (hCtrl != NULL) { | ||||||
|  | 					if ((lcmd->txt[1] != NULL) && (lcmd->txt[1][0] != 0)) | ||||||
|  | 						SetWindowTextU(hCtrl, lcmd->txt[1]); | ||||||
|  | 					if (left_to_right) { | ||||||
|  | 						style = GetWindowLongPtr(hCtrl, GWL_EXSTYLE); | ||||||
|  | 						style |= WS_EX_LAYOUTRTL; // WS_EX_RIGHT | WS_EX_RTLREADING
 | ||||||
|  | 						SetWindowLongPtr(hCtrl, GWL_EXSTYLE, style); | ||||||
|  | 						InvalidateRect(hCtrl, NULL, TRUE); | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 				break; | ||||||
|  | 			case LC_MOVE: | ||||||
|  | 				if (hCtrl != NULL) { | ||||||
|  | 					ResizeMoveCtrl(hDlg, hCtrl, lcmd->num[0], lcmd->num[1], 0, 0); | ||||||
|  | 				} | ||||||
|  | 				break; | ||||||
|  | 			case LC_SIZE: | ||||||
|  | 				if (hCtrl != NULL) { | ||||||
|  | 					ResizeMoveCtrl(hDlg, hCtrl, 0, 0, lcmd->num[0], lcmd->num[1]); | ||||||
|  | 				} | ||||||
|  | 				break; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * This function should be called when a localized dialog is destroyed | ||||||
|  |  * NB: we can't use isWindow() against our existing HWND to avoid this call | ||||||
|  |  * as handles are recycled. | ||||||
|  |  */ | ||||||
|  | void reset_localization(int dlg_id) | ||||||
|  | { | ||||||
|  | 	loc_dlg[dlg_id-IDD_DIALOG].hDlg = NULL; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Produce a formatted localized message. | ||||||
|  |  * Like printf, this call takes a variable number of argument, and uses | ||||||
|  |  * the message ID to identify the formatted message to use. | ||||||
|  |  * Uses a rolling list of buffers to allow concurrency | ||||||
|  |  * TODO: use dynamic realloc'd buffer in case LOC_MESSAGE_SIZE is not enough | ||||||
|  |  */ | ||||||
|  | char* lmprintf(int msg_id, ...) | ||||||
|  | { | ||||||
|  | 	static int buf_id = 0; | ||||||
|  | 	static char buf[LOC_MESSAGE_NB][LOC_MESSAGE_SIZE]; | ||||||
|  | 	char *format = NULL; | ||||||
|  | 	va_list args; | ||||||
|  | 	loc_cmd* lcmd; | ||||||
|  | 	buf_id %= LOC_MESSAGE_NB; | ||||||
|  | 	buf[buf_id][0] = 0; | ||||||
|  | 	list_for_each_entry(lcmd, &loc_dlg[IDD_MESSAGES-IDD_DIALOG].list, loc_cmd, list) { | ||||||
|  | 		if ((lcmd->command == LC_TEXT) && (lcmd->ctrl_id == msg_id) && (lcmd->txt[1] != NULL)) { | ||||||
|  | 			format = lcmd->txt[1]; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (format == NULL) { | ||||||
|  | 		safe_sprintf(buf[buf_id], LOC_MESSAGE_SIZE-1, "MSG_%03d UNTRANSLATED", msg_id - MSG_000); | ||||||
|  | 	} else { | ||||||
|  | 		va_start(args, msg_id); | ||||||
|  | 		safe_vsnprintf(buf[buf_id], LOC_MESSAGE_SIZE-1, format, args); | ||||||
|  | 		va_end(args); | ||||||
|  | 		buf[buf_id][LOC_MESSAGE_SIZE-1] = '\0'; | ||||||
|  | 	} | ||||||
|  | 	return buf[buf_id++]; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * These 2 functions are used to set the current locale | ||||||
|  |  */ | ||||||
|  | loc_cmd* get_locale_from_lcid(int lcid) | ||||||
|  | { | ||||||
|  | 	loc_cmd* lcmd = NULL; | ||||||
|  | 	int i; | ||||||
|  | 
 | ||||||
|  | 	if (list_empty(&locale_list)) { | ||||||
|  | 		uprintf("localization: the locale list is empty!\n"); | ||||||
|  | 		return NULL; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	list_for_each_entry(lcmd, &locale_list, loc_cmd, list) { | ||||||
|  | 		for (i=0; i<lcmd->unum_size; i++) { | ||||||
|  | 			if (lcmd->unum[i] == lcid) { | ||||||
|  | 				return lcmd; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	lcmd = list_entry(locale_list.next, loc_cmd, list); | ||||||
|  | 	// If we couldn't find a supported locale, just pick the first one (usually English)
 | ||||||
|  | 	uprintf("localization: could not find locale for LCID: 0x%04X. Will default to '%s'\n", lcid, lcmd->txt[0]); | ||||||
|  | 	return lcmd; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | loc_cmd* get_locale_from_name(char* locale_name) | ||||||
|  | { | ||||||
|  | 	loc_cmd* lcmd = NULL; | ||||||
|  | 
 | ||||||
|  | 	if (list_empty(&locale_list)) { | ||||||
|  | 		uprintf("localization: the locale list is empty!\n"); | ||||||
|  | 		return NULL; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	list_for_each_entry(lcmd, &locale_list, loc_cmd, list) { | ||||||
|  | 		if (safe_strcmp(lcmd->txt[0], locale_name) == 0) | ||||||
|  | 			return lcmd; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	lcmd = list_entry(locale_list.next, loc_cmd, list); | ||||||
|  | 	uprintf("localization: could not find locale for name '%s'. Will default to '%s'\n", locale_name, lcmd->txt[0]); | ||||||
|  | 	return lcmd; | ||||||
|  | } | ||||||
							
								
								
									
										158
									
								
								src/localization.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										158
									
								
								src/localization.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,158 @@ | ||||||
|  | /*
 | ||||||
|  |  * Rufus: The Reliable USB Formatting Utility | ||||||
|  |  * Localization functions, a.k.a. "Everybody is doing it wrong but me!" | ||||||
|  |  * Copyright © 2013 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/>.
 | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include <stdint.h> | ||||||
|  | #include <stddef.h> | ||||||
|  | 
 | ||||||
|  | #pragma once | ||||||
|  | 
 | ||||||
|  | // Number of concurrent localization messages. Must be a power of 2.
 | ||||||
|  | #define LOC_MESSAGE_NB    8 | ||||||
|  | #define LOC_MESSAGE_SIZE  2048 | ||||||
|  | 
 | ||||||
|  | #define luprint(msg) uprintf("%s(%d): " msg "\n", loc_filename, loc_line_nr) | ||||||
|  | #define luprintf(msg, ...) uprintf("%s(%d): " msg "\n", loc_filename, loc_line_nr, __VA_ARGS__) | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * List handling functions (stolen from libusb) | ||||||
|  |  * NB: offsetof() requires '#include <stddef.h>' | ||||||
|  |  */ | ||||||
|  | struct list_head { | ||||||
|  | 	struct list_head *prev, *next; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /* Get an entry from the list
 | ||||||
|  |  *  ptr - the address of this list_head element in "type" | ||||||
|  |  *  type - the data type that contains "member" | ||||||
|  |  *  member - the list_head element in "type" | ||||||
|  |  */ | ||||||
|  | #define list_entry(ptr, type, member) \ | ||||||
|  | 	((type *)((uintptr_t)(ptr) - (uintptr_t)offsetof(type, member))) | ||||||
|  | 
 | ||||||
|  | /* Get each entry from a list
 | ||||||
|  |  *  pos - A structure pointer has a "member" element | ||||||
|  |  *  head - list head | ||||||
|  |  *  member - the list_head element in "pos" | ||||||
|  |  *  type - the type of the first parameter | ||||||
|  |  */ | ||||||
|  | #define list_for_each_entry(pos, head, type, member)			\ | ||||||
|  | 	for (pos = list_entry((head)->next, type, member);			\ | ||||||
|  | 		 &pos->member != (head);								\ | ||||||
|  | 		 pos = list_entry(pos->member.next, type, member)) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #define list_for_each_entry_safe(pos, n, head, type, member)	\ | ||||||
|  | 	for (pos = list_entry((head)->next, type, member),			\ | ||||||
|  | 		 n = list_entry(pos->member.next, type, member);		\ | ||||||
|  | 		 &pos->member != (head);								\ | ||||||
|  | 		 pos = n, n = list_entry(n->member.next, type, member)) | ||||||
|  | 
 | ||||||
|  | #define list_empty(entry) ((entry)->next == (entry)) | ||||||
|  | 
 | ||||||
|  | static __inline void list_init(struct list_head *entry) | ||||||
|  | { | ||||||
|  | 	entry->prev = entry->next = entry; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static __inline void list_add(struct list_head *entry, struct list_head *head) | ||||||
|  | { | ||||||
|  | 	entry->next = head->next; | ||||||
|  | 	entry->prev = head; | ||||||
|  | 
 | ||||||
|  | 	head->next->prev = entry; | ||||||
|  | 	head->next = entry; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static __inline void list_add_tail(struct list_head *entry, | ||||||
|  | 	struct list_head *head) | ||||||
|  | { | ||||||
|  | 	entry->next = head; | ||||||
|  | 	entry->prev = head->prev; | ||||||
|  | 
 | ||||||
|  | 	head->prev->next = entry; | ||||||
|  | 	head->prev = entry; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static __inline void list_del(struct list_head *entry) | ||||||
|  | { | ||||||
|  | 	entry->next->prev = entry->prev; | ||||||
|  | 	entry->prev->next = entry->next; | ||||||
|  | 	entry->next = entry->prev = NULL; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Commands that take a control ID *MUST* be at the top
 | ||||||
|  | // The last command with a control ID *MUST* be LC_TEXT
 | ||||||
|  | enum loc_command_type { | ||||||
|  | 	LC_GROUP, | ||||||
|  | 	LC_MOVE, | ||||||
|  | 	LC_SIZE, | ||||||
|  | 	LC_TEXT,	// Delimits commands that take a Control ID and commands that don't
 | ||||||
|  | 	LC_VERSION, | ||||||
|  | 	LC_LOCALE, | ||||||
|  | 	LC_BASE, | ||||||
|  | 	LC_FONT, | ||||||
|  | 	LC_DIRECTION, | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | typedef struct loc_cmd_struct { | ||||||
|  | 	uint8_t		command; | ||||||
|  | 	uint8_t		unum_size; | ||||||
|  | 	uint16_t	line_nr; | ||||||
|  | 	int			ctrl_id; | ||||||
|  | 	int32_t		num[2]; | ||||||
|  | 	uint32_t*	unum; | ||||||
|  | 	char*		txt[2]; | ||||||
|  | 	struct list_head list; | ||||||
|  | } loc_cmd; | ||||||
|  | 
 | ||||||
|  | typedef struct loc_parse_struct { | ||||||
|  | 	char  c; | ||||||
|  | 	enum  loc_command_type cmd; | ||||||
|  | 	char* arg_type; | ||||||
|  | } loc_parse; | ||||||
|  | 
 | ||||||
|  | typedef struct loc_control_id_struct { | ||||||
|  | 	const char* name; | ||||||
|  | 	const int id; | ||||||
|  | } loc_control_id; | ||||||
|  | 
 | ||||||
|  | typedef struct loc_dlg_list_struct { | ||||||
|  | 	const int dlg_id; | ||||||
|  | 	HWND hDlg; | ||||||
|  | 	struct list_head list; | ||||||
|  | } loc_dlg_list; | ||||||
|  | 
 | ||||||
|  | extern const loc_parse parse_cmd[9]; | ||||||
|  | extern struct list_head locale_list; | ||||||
|  | int loc_line_nr; | ||||||
|  | char *loc_filename, *embedded_loc_filename; | ||||||
|  | 
 | ||||||
|  | void free_loc_cmd(loc_cmd* lcmd); | ||||||
|  | BOOL dispatch_loc_cmd(loc_cmd* lcmd); | ||||||
|  | void init_localization(void); | ||||||
|  | void exit_localization(void); | ||||||
|  | void apply_localization(int dlg_id, HWND hDlg); | ||||||
|  | void reset_localization(int dlg_id); | ||||||
|  | void free_dialog_list(void); | ||||||
|  | char* lmprintf(int msg_id, ...); | ||||||
|  | BOOL get_supported_locales(const char* filename); | ||||||
|  | char* get_loc_data_file(const char* filename, long offset, long end_offset, int start_line); | ||||||
|  | void free_locale_list(void); | ||||||
|  | loc_cmd* get_locale_from_lcid(int lcid); | ||||||
|  | loc_cmd* get_locale_from_name(char* locale_name); | ||||||
							
								
								
									
										382
									
								
								src/localization_data.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										382
									
								
								src/localization_data.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,382 @@ | ||||||
|  | /*
 | ||||||
|  |  * Rufus: The Reliable USB Formatting Utility | ||||||
|  |  * Localization tables - autogenerated from resource.h | ||||||
|  |  * Copyright © 2013 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/>.
 | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include <windows.h> | ||||||
|  | #include "resource.h" | ||||||
|  | #include "localization.h" | ||||||
|  | 
 | ||||||
|  | #define LOC_CTRL(x)  { #x, x } | ||||||
|  | #define LOC_DLG(x)   { x, NULL, {NULL, NULL} } | ||||||
|  | 
 | ||||||
|  | // Control IDs
 | ||||||
|  | const loc_control_id control_id[] = { | ||||||
|  | 	// The dialog IDs must come first
 | ||||||
|  | 	LOC_CTRL(IDD_DIALOG), | ||||||
|  | 	LOC_CTRL(IDD_ABOUTBOX), | ||||||
|  | 	LOC_CTRL(IDD_NOTIFICATION), | ||||||
|  | 	LOC_CTRL(IDD_LICENSE), | ||||||
|  | 	LOC_CTRL(IDD_ISO_EXTRACT), | ||||||
|  | 	LOC_CTRL(IDD_LOG), | ||||||
|  | 	LOC_CTRL(IDD_UPDATE_POLICY), | ||||||
|  | 	LOC_CTRL(IDD_NEW_VERSION), | ||||||
|  | 	LOC_CTRL(IDD_MESSAGES), | ||||||
|  | 	LOC_CTRL(IDC_DEVICE), | ||||||
|  | 	LOC_CTRL(IDC_FILESYSTEM), | ||||||
|  | 	LOC_CTRL(IDC_START), | ||||||
|  | 	LOC_CTRL(IDC_PARTITION_TYPE), | ||||||
|  | 	LOC_CTRL(IDC_CLUSTERSIZE), | ||||||
|  | 	LOC_CTRL(IDC_STATUS), | ||||||
|  | 	LOC_CTRL(IDC_ABOUT), | ||||||
|  | 	LOC_CTRL(IDC_LABEL), | ||||||
|  | 	LOC_CTRL(IDC_QUICKFORMAT), | ||||||
|  | 	LOC_CTRL(IDC_BOOT), | ||||||
|  | 	LOC_CTRL(IDC_BADBLOCKS), | ||||||
|  | 	LOC_CTRL(IDC_PROGRESS), | ||||||
|  | 	LOC_CTRL(IDC_BOOTTYPE), | ||||||
|  | 	LOC_CTRL(IDC_NBPASSES), | ||||||
|  | 	LOC_CTRL(IDC_TEST), | ||||||
|  | 	LOC_CTRL(IDC_SELECT_ISO), | ||||||
|  | 	LOC_CTRL(IDC_SET_ICON), | ||||||
|  | 	LOC_CTRL(IDC_RUFUS_MBR), | ||||||
|  | 	LOC_CTRL(IDC_ISO_FILENAME), | ||||||
|  | 	LOC_CTRL(IDC_ISO_ABORT), | ||||||
|  | 	LOC_CTRL(IDC_DISK_ID), | ||||||
|  | 	LOC_CTRL(IDC_EXTRA_PARTITION), | ||||||
|  | 	LOC_CTRL(IDC_ENABLE_FIXED_DISKS), | ||||||
|  | 	LOC_CTRL(IDC_ABOUT_LICENSE), | ||||||
|  | 	LOC_CTRL(IDC_ABOUT_ICON), | ||||||
|  | 	LOC_CTRL(IDC_ABOUT_UPDATES), | ||||||
|  | 	LOC_CTRL(IDC_ABOUT_COPYRIGHTS), | ||||||
|  | 	LOC_CTRL(IDC_ABOUT_BLURB), | ||||||
|  | 	LOC_CTRL(IDC_LICENSE_TEXT), | ||||||
|  | 	LOC_CTRL(IDC_NOTIFICATION_ICON), | ||||||
|  | 	LOC_CTRL(IDC_NOTIFICATION_TEXT), | ||||||
|  | 	LOC_CTRL(IDC_NOTIFICATION_LINE), | ||||||
|  | 	LOC_CTRL(IDC_ADVANCED), | ||||||
|  | 	LOC_CTRL(IDS_ADVANCED_OPTIONS_GRP), | ||||||
|  | 	LOC_CTRL(IDC_LOG), | ||||||
|  | 	LOC_CTRL(IDC_LOG_EDIT), | ||||||
|  | 	LOC_CTRL(IDC_LOG_SAVE), | ||||||
|  | 	LOC_CTRL(IDC_LOG_CLEAR), | ||||||
|  | 	LOC_CTRL(IDC_MORE_INFO), | ||||||
|  | 	LOC_CTRL(IDC_POLICY), | ||||||
|  | 	LOC_CTRL(IDC_UPDATE_FREQUENCY), | ||||||
|  | 	LOC_CTRL(IDC_INCLUDE_BETAS), | ||||||
|  | 	LOC_CTRL(IDC_RELEASE_NOTES), | ||||||
|  | 	LOC_CTRL(IDC_DOWNLOAD), | ||||||
|  | 	LOC_CTRL(IDC_CHECK_NOW), | ||||||
|  | 	LOC_CTRL(IDC_WEBSITE), | ||||||
|  | 	LOC_CTRL(IDC_YOUR_VERSION), | ||||||
|  | 	LOC_CTRL(IDC_LATEST_VERSION), | ||||||
|  | 	LOC_CTRL(IDC_DOWNLOAD_URL), | ||||||
|  | 	LOC_CTRL(IDS_DEVICE_TXT), | ||||||
|  | 	LOC_CTRL(IDS_PARTITION_TYPE_TXT), | ||||||
|  | 	LOC_CTRL(IDS_FILESYSTEM_TXT), | ||||||
|  | 	LOC_CTRL(IDS_CLUSTERSIZE_TXT), | ||||||
|  | 	LOC_CTRL(IDS_LABEL_TXT), | ||||||
|  | 	LOC_CTRL(IDS_FORMAT_OPTIONS_GRP), | ||||||
|  | 	LOC_CTRL(IDS_UPDATE_SETTINGS_GRP), | ||||||
|  | 	LOC_CTRL(IDS_UPDATE_FREQUENCY_TXT), | ||||||
|  | 	LOC_CTRL(IDS_INCLUDE_BETAS_TXT), | ||||||
|  | 	LOC_CTRL(IDS_NEW_VERSION_AVAIL_TXT), | ||||||
|  | 	LOC_CTRL(IDS_NEW_VERSION_DOWNLOAD_GRP), | ||||||
|  | 	LOC_CTRL(IDS_NEW_VERSION_NOTES_GRP), | ||||||
|  | 	LOC_CTRL(IDS_CHECK_NOW_GRP), | ||||||
|  | 	LOC_CTRL(MSG_000), | ||||||
|  | 	LOC_CTRL(MSG_001), | ||||||
|  | 	LOC_CTRL(MSG_002), | ||||||
|  | 	LOC_CTRL(MSG_003), | ||||||
|  | 	LOC_CTRL(MSG_004), | ||||||
|  | 	LOC_CTRL(MSG_005), | ||||||
|  | 	LOC_CTRL(MSG_006), | ||||||
|  | 	LOC_CTRL(MSG_007), | ||||||
|  | 	LOC_CTRL(MSG_008), | ||||||
|  | 	LOC_CTRL(MSG_009), | ||||||
|  | 	LOC_CTRL(MSG_010), | ||||||
|  | 	LOC_CTRL(MSG_011), | ||||||
|  | 	LOC_CTRL(MSG_012), | ||||||
|  | 	LOC_CTRL(MSG_013), | ||||||
|  | 	LOC_CTRL(MSG_014), | ||||||
|  | 	LOC_CTRL(MSG_015), | ||||||
|  | 	LOC_CTRL(MSG_016), | ||||||
|  | 	LOC_CTRL(MSG_017), | ||||||
|  | 	LOC_CTRL(MSG_018), | ||||||
|  | 	LOC_CTRL(MSG_019), | ||||||
|  | 	LOC_CTRL(MSG_020), | ||||||
|  | 	LOC_CTRL(MSG_021), | ||||||
|  | 	LOC_CTRL(MSG_022), | ||||||
|  | 	LOC_CTRL(MSG_023), | ||||||
|  | 	LOC_CTRL(MSG_024), | ||||||
|  | 	LOC_CTRL(MSG_025), | ||||||
|  | 	LOC_CTRL(MSG_026), | ||||||
|  | 	LOC_CTRL(MSG_027), | ||||||
|  | 	LOC_CTRL(MSG_028), | ||||||
|  | 	LOC_CTRL(MSG_029), | ||||||
|  | 	LOC_CTRL(MSG_030), | ||||||
|  | 	LOC_CTRL(MSG_031), | ||||||
|  | 	LOC_CTRL(MSG_032), | ||||||
|  | 	LOC_CTRL(MSG_033), | ||||||
|  | 	LOC_CTRL(MSG_034), | ||||||
|  | 	LOC_CTRL(MSG_035), | ||||||
|  | 	LOC_CTRL(MSG_036), | ||||||
|  | 	LOC_CTRL(MSG_037), | ||||||
|  | 	LOC_CTRL(MSG_038), | ||||||
|  | 	LOC_CTRL(MSG_039), | ||||||
|  | 	LOC_CTRL(MSG_040), | ||||||
|  | 	LOC_CTRL(MSG_041), | ||||||
|  | 	LOC_CTRL(MSG_042), | ||||||
|  | 	LOC_CTRL(MSG_043), | ||||||
|  | 	LOC_CTRL(MSG_044), | ||||||
|  | 	LOC_CTRL(MSG_045), | ||||||
|  | 	LOC_CTRL(MSG_046), | ||||||
|  | 	LOC_CTRL(MSG_047), | ||||||
|  | 	LOC_CTRL(MSG_048), | ||||||
|  | 	LOC_CTRL(MSG_049), | ||||||
|  | 	LOC_CTRL(MSG_050), | ||||||
|  | 	LOC_CTRL(MSG_051), | ||||||
|  | 	LOC_CTRL(MSG_052), | ||||||
|  | 	LOC_CTRL(MSG_053), | ||||||
|  | 	LOC_CTRL(MSG_054), | ||||||
|  | 	LOC_CTRL(MSG_055), | ||||||
|  | 	LOC_CTRL(MSG_056), | ||||||
|  | 	LOC_CTRL(MSG_057), | ||||||
|  | 	LOC_CTRL(MSG_058), | ||||||
|  | 	LOC_CTRL(MSG_059), | ||||||
|  | 	LOC_CTRL(MSG_060), | ||||||
|  | 	LOC_CTRL(MSG_061), | ||||||
|  | 	LOC_CTRL(MSG_062), | ||||||
|  | 	LOC_CTRL(MSG_063), | ||||||
|  | 	LOC_CTRL(MSG_064), | ||||||
|  | 	LOC_CTRL(MSG_065), | ||||||
|  | 	LOC_CTRL(MSG_066), | ||||||
|  | 	LOC_CTRL(MSG_067), | ||||||
|  | 	LOC_CTRL(MSG_068), | ||||||
|  | 	LOC_CTRL(MSG_069), | ||||||
|  | 	LOC_CTRL(MSG_070), | ||||||
|  | 	LOC_CTRL(MSG_071), | ||||||
|  | 	LOC_CTRL(MSG_072), | ||||||
|  | 	LOC_CTRL(MSG_073), | ||||||
|  | 	LOC_CTRL(MSG_074), | ||||||
|  | 	LOC_CTRL(MSG_075), | ||||||
|  | 	LOC_CTRL(MSG_076), | ||||||
|  | 	LOC_CTRL(MSG_077), | ||||||
|  | 	LOC_CTRL(MSG_078), | ||||||
|  | 	LOC_CTRL(MSG_079), | ||||||
|  | 	LOC_CTRL(MSG_080), | ||||||
|  | 	LOC_CTRL(MSG_081), | ||||||
|  | 	LOC_CTRL(MSG_082), | ||||||
|  | 	LOC_CTRL(MSG_083), | ||||||
|  | 	LOC_CTRL(MSG_084), | ||||||
|  | 	LOC_CTRL(MSG_085), | ||||||
|  | 	LOC_CTRL(MSG_086), | ||||||
|  | 	LOC_CTRL(MSG_087), | ||||||
|  | 	LOC_CTRL(MSG_088), | ||||||
|  | 	LOC_CTRL(MSG_089), | ||||||
|  | 	LOC_CTRL(MSG_090), | ||||||
|  | 	LOC_CTRL(MSG_091), | ||||||
|  | 	LOC_CTRL(MSG_092), | ||||||
|  | 	LOC_CTRL(MSG_093), | ||||||
|  | 	LOC_CTRL(MSG_094), | ||||||
|  | 	LOC_CTRL(MSG_095), | ||||||
|  | 	LOC_CTRL(MSG_096), | ||||||
|  | 	LOC_CTRL(MSG_097), | ||||||
|  | 	LOC_CTRL(MSG_098), | ||||||
|  | 	LOC_CTRL(MSG_099), | ||||||
|  | 	LOC_CTRL(MSG_100), | ||||||
|  | 	LOC_CTRL(MSG_101), | ||||||
|  | 	LOC_CTRL(MSG_102), | ||||||
|  | 	LOC_CTRL(MSG_103), | ||||||
|  | 	LOC_CTRL(MSG_104), | ||||||
|  | 	LOC_CTRL(MSG_105), | ||||||
|  | 	LOC_CTRL(MSG_106), | ||||||
|  | 	LOC_CTRL(MSG_107), | ||||||
|  | 	LOC_CTRL(MSG_108), | ||||||
|  | 	LOC_CTRL(MSG_109), | ||||||
|  | 	LOC_CTRL(MSG_110), | ||||||
|  | 	LOC_CTRL(MSG_111), | ||||||
|  | 	LOC_CTRL(MSG_112), | ||||||
|  | 	LOC_CTRL(MSG_113), | ||||||
|  | 	LOC_CTRL(MSG_114), | ||||||
|  | 	LOC_CTRL(MSG_115), | ||||||
|  | 	LOC_CTRL(MSG_116), | ||||||
|  | 	LOC_CTRL(MSG_117), | ||||||
|  | 	LOC_CTRL(MSG_118), | ||||||
|  | 	LOC_CTRL(MSG_119), | ||||||
|  | 	LOC_CTRL(MSG_120), | ||||||
|  | 	LOC_CTRL(MSG_121), | ||||||
|  | 	LOC_CTRL(MSG_122), | ||||||
|  | 	LOC_CTRL(MSG_123), | ||||||
|  | 	LOC_CTRL(MSG_124), | ||||||
|  | 	LOC_CTRL(MSG_125), | ||||||
|  | 	LOC_CTRL(MSG_126), | ||||||
|  | 	LOC_CTRL(MSG_127), | ||||||
|  | 	LOC_CTRL(MSG_128), | ||||||
|  | 	LOC_CTRL(MSG_129), | ||||||
|  | 	LOC_CTRL(MSG_130), | ||||||
|  | 	LOC_CTRL(MSG_131), | ||||||
|  | 	LOC_CTRL(MSG_132), | ||||||
|  | 	LOC_CTRL(MSG_133), | ||||||
|  | 	LOC_CTRL(MSG_134), | ||||||
|  | 	LOC_CTRL(MSG_135), | ||||||
|  | 	LOC_CTRL(MSG_136), | ||||||
|  | 	LOC_CTRL(MSG_137), | ||||||
|  | 	LOC_CTRL(MSG_138), | ||||||
|  | 	LOC_CTRL(MSG_139), | ||||||
|  | 	LOC_CTRL(MSG_140), | ||||||
|  | 	LOC_CTRL(MSG_141), | ||||||
|  | 	LOC_CTRL(MSG_142), | ||||||
|  | 	LOC_CTRL(MSG_143), | ||||||
|  | 	LOC_CTRL(MSG_144), | ||||||
|  | 	LOC_CTRL(MSG_145), | ||||||
|  | 	LOC_CTRL(MSG_146), | ||||||
|  | 	LOC_CTRL(MSG_147), | ||||||
|  | 	LOC_CTRL(MSG_148), | ||||||
|  | 	LOC_CTRL(MSG_149), | ||||||
|  | 	LOC_CTRL(MSG_150), | ||||||
|  | 	LOC_CTRL(MSG_151), | ||||||
|  | 	LOC_CTRL(MSG_152), | ||||||
|  | 	LOC_CTRL(MSG_153), | ||||||
|  | 	LOC_CTRL(MSG_154), | ||||||
|  | 	LOC_CTRL(MSG_155), | ||||||
|  | 	LOC_CTRL(MSG_156), | ||||||
|  | 	LOC_CTRL(MSG_157), | ||||||
|  | 	LOC_CTRL(MSG_158), | ||||||
|  | 	LOC_CTRL(MSG_159), | ||||||
|  | 	LOC_CTRL(MSG_160), | ||||||
|  | 	LOC_CTRL(MSG_161), | ||||||
|  | 	LOC_CTRL(MSG_162), | ||||||
|  | 	LOC_CTRL(MSG_163), | ||||||
|  | 	LOC_CTRL(MSG_164), | ||||||
|  | 	LOC_CTRL(MSG_165), | ||||||
|  | 	LOC_CTRL(MSG_166), | ||||||
|  | 	LOC_CTRL(MSG_167), | ||||||
|  | 	LOC_CTRL(MSG_168), | ||||||
|  | 	LOC_CTRL(MSG_169), | ||||||
|  | 	LOC_CTRL(MSG_170), | ||||||
|  | 	LOC_CTRL(MSG_171), | ||||||
|  | 	LOC_CTRL(MSG_172), | ||||||
|  | 	LOC_CTRL(MSG_173), | ||||||
|  | 	LOC_CTRL(MSG_174), | ||||||
|  | 	LOC_CTRL(MSG_175), | ||||||
|  | 	LOC_CTRL(MSG_176), | ||||||
|  | 	LOC_CTRL(MSG_177), | ||||||
|  | 	LOC_CTRL(MSG_178), | ||||||
|  | 	LOC_CTRL(MSG_179), | ||||||
|  | 	LOC_CTRL(MSG_180), | ||||||
|  | 	LOC_CTRL(MSG_181), | ||||||
|  | 	LOC_CTRL(MSG_182), | ||||||
|  | 	LOC_CTRL(MSG_183), | ||||||
|  | 	LOC_CTRL(MSG_184), | ||||||
|  | 	LOC_CTRL(MSG_185), | ||||||
|  | 	LOC_CTRL(MSG_186), | ||||||
|  | 	LOC_CTRL(MSG_187), | ||||||
|  | 	LOC_CTRL(MSG_188), | ||||||
|  | 	LOC_CTRL(MSG_189), | ||||||
|  | 	LOC_CTRL(MSG_190), | ||||||
|  | 	LOC_CTRL(MSG_191), | ||||||
|  | 	LOC_CTRL(MSG_192), | ||||||
|  | 	LOC_CTRL(MSG_193), | ||||||
|  | 	LOC_CTRL(MSG_194), | ||||||
|  | 	LOC_CTRL(MSG_195), | ||||||
|  | 	LOC_CTRL(MSG_196), | ||||||
|  | 	LOC_CTRL(MSG_197), | ||||||
|  | 	LOC_CTRL(MSG_198), | ||||||
|  | 	LOC_CTRL(MSG_199), | ||||||
|  | 	LOC_CTRL(MSG_200), | ||||||
|  | 	LOC_CTRL(MSG_201), | ||||||
|  | 	LOC_CTRL(MSG_202), | ||||||
|  | 	LOC_CTRL(MSG_203), | ||||||
|  | 	LOC_CTRL(MSG_204), | ||||||
|  | 	LOC_CTRL(MSG_205), | ||||||
|  | 	LOC_CTRL(MSG_206), | ||||||
|  | 	LOC_CTRL(MSG_207), | ||||||
|  | 	LOC_CTRL(MSG_208), | ||||||
|  | 	LOC_CTRL(MSG_209), | ||||||
|  | 	LOC_CTRL(MSG_210), | ||||||
|  | 	LOC_CTRL(MSG_211), | ||||||
|  | 	LOC_CTRL(MSG_212), | ||||||
|  | 	LOC_CTRL(MSG_213), | ||||||
|  | 	LOC_CTRL(MSG_214), | ||||||
|  | 	LOC_CTRL(MSG_215), | ||||||
|  | 	LOC_CTRL(MSG_216), | ||||||
|  | 	LOC_CTRL(MSG_217), | ||||||
|  | 	LOC_CTRL(MSG_218), | ||||||
|  | 	LOC_CTRL(MSG_219), | ||||||
|  | 	LOC_CTRL(MSG_220), | ||||||
|  | 	LOC_CTRL(MSG_221), | ||||||
|  | 	LOC_CTRL(MSG_222), | ||||||
|  | 	LOC_CTRL(MSG_223), | ||||||
|  | 	LOC_CTRL(MSG_224), | ||||||
|  | 	LOC_CTRL(MSG_225), | ||||||
|  | 	LOC_CTRL(MSG_226), | ||||||
|  | 	LOC_CTRL(MSG_227), | ||||||
|  | 	LOC_CTRL(MSG_228), | ||||||
|  | 	LOC_CTRL(MSG_229), | ||||||
|  | 	LOC_CTRL(MSG_230), | ||||||
|  | 	LOC_CTRL(MSG_231), | ||||||
|  | 	LOC_CTRL(MSG_232), | ||||||
|  | 	LOC_CTRL(MSG_233), | ||||||
|  | 	LOC_CTRL(MSG_234), | ||||||
|  | 	LOC_CTRL(MSG_235), | ||||||
|  | 	LOC_CTRL(MSG_236), | ||||||
|  | 	LOC_CTRL(MSG_237), | ||||||
|  | 	LOC_CTRL(MSG_238), | ||||||
|  | 	LOC_CTRL(MSG_239), | ||||||
|  | 	LOC_CTRL(MSG_240), | ||||||
|  | 	LOC_CTRL(MSG_241), | ||||||
|  | 	LOC_CTRL(MSG_242), | ||||||
|  | 	LOC_CTRL(MSG_243), | ||||||
|  | 	LOC_CTRL(MSG_244), | ||||||
|  | 	LOC_CTRL(MSG_245), | ||||||
|  | 	LOC_CTRL(MSG_246), | ||||||
|  | 	LOC_CTRL(MSG_247), | ||||||
|  | 	LOC_CTRL(MSG_248), | ||||||
|  | 	LOC_CTRL(MSG_249), | ||||||
|  | 	LOC_CTRL(MSG_250), | ||||||
|  | 	LOC_CTRL(MSG_251), | ||||||
|  | 	LOC_CTRL(MSG_252), | ||||||
|  | 	LOC_CTRL(MSG_253), | ||||||
|  | 	LOC_CTRL(MSG_254), | ||||||
|  | 	LOC_CTRL(MSG_255), | ||||||
|  | 	LOC_CTRL(MSG_256), | ||||||
|  | 	LOC_CTRL(MSG_257), | ||||||
|  | 	LOC_CTRL(MSG_258), | ||||||
|  | 	LOC_CTRL(IDOK), | ||||||
|  | 	LOC_CTRL(IDCANCEL), | ||||||
|  | 	LOC_CTRL(IDABORT), | ||||||
|  | 	LOC_CTRL(IDRETRY), | ||||||
|  | 	LOC_CTRL(IDIGNORE), | ||||||
|  | 	LOC_CTRL(IDYES), | ||||||
|  | 	LOC_CTRL(IDNO), | ||||||
|  | 	LOC_CTRL(IDCLOSE), | ||||||
|  | 	LOC_CTRL(IDHELP), | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | // Dialog data
 | ||||||
|  | loc_dlg_list loc_dlg[] = { | ||||||
|  | 	LOC_DLG(IDD_DIALOG), | ||||||
|  | 	LOC_DLG(IDD_ABOUTBOX), | ||||||
|  | 	LOC_DLG(IDD_NOTIFICATION), | ||||||
|  | 	LOC_DLG(IDD_LICENSE), | ||||||
|  | 	LOC_DLG(IDD_ISO_EXTRACT), | ||||||
|  | 	LOC_DLG(IDD_LOG), | ||||||
|  | 	LOC_DLG(IDD_UPDATE_POLICY), | ||||||
|  | 	LOC_DLG(IDD_NEW_VERSION), | ||||||
|  | 	LOC_DLG(IDD_MESSAGES), | ||||||
|  | }; | ||||||
							
								
								
									
										89
									
								
								src/localization_data.sh
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								src/localization_data.sh
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,89 @@ | ||||||
|  | #!/bin/sh | ||||||
|  | 
 | ||||||
|  | echo This file recreates localization_data.c according resource.h | ||||||
|  | echo | ||||||
|  | 
 | ||||||
|  | # check that sed are available | ||||||
|  | type -P sed &>/dev/null || { echo "sed command not found. Aborting." >&2; exit 1; } | ||||||
|  | 
 | ||||||
|  | # Create the first sed command file | ||||||
|  | cat > cmd.sed <<\_EOF | ||||||
|  | # Insert header | ||||||
|  | 1i /*\ | ||||||
|  |  * Rufus: The Reliable USB Formatting Utility\ | ||||||
|  |  * Localization tables - autogenerated from resource.h\ | ||||||
|  |  * Copyright © 2013 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/>.\ | ||||||
|  |  */\ | ||||||
|  | \ | ||||||
|  | #include <windows.h>\ | ||||||
|  | #include "resource.h"\ | ||||||
|  | #include "localization.h"\ | ||||||
|  | \ | ||||||
|  | #define LOC_CTRL(x)  { #x, x }\ | ||||||
|  | #define LOC_DLG(x)   { x, NULL, {NULL, NULL} }\ | ||||||
|  | \ | ||||||
|  | // Control IDs\ | ||||||
|  | const loc_control_id control_id[] = {\ | ||||||
|  | 	// The dialog IDs must come first | ||||||
|  | 
 | ||||||
|  | # Add the control entries - must be in IDD_, IDC_, IDS_ or MSG_ | ||||||
|  | s/^#define \([I|M][D|S][D|C|S|G]_[^ ]*\) .*/\	LOC_CTRL(\1),/ | ||||||
|  | 
 | ||||||
|  | # Add standard IDs from windows.h and close table | ||||||
|  | $a\ | ||||||
|  | 	LOC_CTRL(IDOK),\ | ||||||
|  | 	LOC_CTRL(IDCANCEL),\ | ||||||
|  | 	LOC_CTRL(IDABORT),\ | ||||||
|  | 	LOC_CTRL(IDRETRY),\ | ||||||
|  | 	LOC_CTRL(IDIGNORE),\ | ||||||
|  | 	LOC_CTRL(IDYES),\ | ||||||
|  | 	LOC_CTRL(IDNO),\ | ||||||
|  | 	LOC_CTRL(IDCLOSE),\ | ||||||
|  | 	LOC_CTRL(IDHELP),\ | ||||||
|  | \};\ | ||||||
|  | 
 | ||||||
|  | # Remove everything else | ||||||
|  | /^[#|\/]/d | ||||||
|  | /^$/d | ||||||
|  | _EOF | ||||||
|  | 
 | ||||||
|  | # Run first part | ||||||
|  | sed -f cmd.sed resource.h > localization_data.h | ||||||
|  | 
 | ||||||
|  | # Create the second sed command file | ||||||
|  | cat > cmd.sed <<\_EOF | ||||||
|  | 
 | ||||||
|  | # Insert dialog table header | ||||||
|  | 1i // Dialog data\ | ||||||
|  | loc_dlg_list loc_dlg[] = { | ||||||
|  | 
 | ||||||
|  | # Add the dialog entries - must start with IDD_ | ||||||
|  | s/^#define \(IDD_[^ ]*\) .*/\	LOC_DLG(\1),/ | ||||||
|  | 
 | ||||||
|  | # Close the table | ||||||
|  | $a\ | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | # Remove everything else | ||||||
|  | /^[#|\/]/d | ||||||
|  | /^$/d | ||||||
|  | _EOF | ||||||
|  | 
 | ||||||
|  | # Run second part | ||||||
|  | sed -f cmd.sed resource.h >> localization_data.h | ||||||
|  | 
 | ||||||
|  | rm cmd.sed | ||||||
|  | echo Done. | ||||||
|  | @ -1,6 +1,7 @@ | ||||||
| /*
 | /*
 | ||||||
|  * MSAPI_UTF8: Common API calls using UTF-8 strings |  * MSAPI_UTF8: Common API calls using UTF-8 strings | ||||||
|  * Compensating for what Microsoft should have done a long long time ago. |  * Compensating for what Microsoft should have done a long long time ago. | ||||||
|  |  * Also see http://utf8everywhere.org/
 | ||||||
|  * |  * | ||||||
|  * Copyright © 2010-2013 Pete Batard <pete@akeo.ie> |  * Copyright © 2010-2013 Pete Batard <pete@akeo.ie> | ||||||
|  * |  * | ||||||
|  | @ -53,6 +54,15 @@ extern "C" { | ||||||
| 	_ms_wlvi.pszText = utf8_to_wchar(pszText_); \ | 	_ms_wlvi.pszText = utf8_to_wchar(pszText_); \ | ||||||
| 	SNDMSG((hwndLV),LVM_SETITEMTEXTW,(WPARAM)(i),(LPARAM)&_ms_wlvi); sfree(_ms_wlvi.pszText);} | 	SNDMSG((hwndLV),LVM_SETITEMTEXTW,(WPARAM)(i),(LPARAM)&_ms_wlvi); sfree(_ms_wlvi.pszText);} | ||||||
| 
 | 
 | ||||||
|  | // Never ever use isdigit() or isspace(), etc. on UTF-8 strings!
 | ||||||
|  | // These calls take an int and char is signed so MS compilers will produce an assert error on anything that's > 0x80
 | ||||||
|  | #define isasciiU(c) isascii((unsigned char)(c)) | ||||||
|  | #define iscntrlU(c) iscntrl((unsigned char)(c)) | ||||||
|  | #define isdigitU(c) isdigit((unsigned char)(c)) | ||||||
|  | #define isspaceU(c) isspace((unsigned char)(c)) | ||||||
|  | #define isxdigitU(c) isxdigit((unsigned char)(c)) | ||||||
|  | // NB: other issomething() calls are not implemented as they may require multibyte UTF-8 sequences to be converted 
 | ||||||
|  | 
 | ||||||
| #define sfree(p) do {if (p != NULL) {free((void*)(p)); p = NULL;}} while(0) | #define sfree(p) do {if (p != NULL) {free((void*)(p)); p = NULL;}} while(0) | ||||||
| #define wconvert(p)     wchar_t* w ## p = utf8_to_wchar(p) | #define wconvert(p)     wchar_t* w ## p = utf8_to_wchar(p) | ||||||
| #define walloc(p, size) wchar_t* w ## p = (wchar_t*)calloc(size, sizeof(wchar_t)) | #define walloc(p, size) wchar_t* w ## p = (wchar_t*)calloc(size, sizeof(wchar_t)) | ||||||
|  | @ -354,6 +364,38 @@ static __inline DWORD GetCurrentDirectoryU(DWORD nBufferLength, char* lpBuffer) | ||||||
| 	return ret; | 	return ret; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static __inline DWORD GetTempPathU(DWORD nBufferLength, char* lpBuffer) | ||||||
|  | { | ||||||
|  | 	DWORD ret = 0, err = ERROR_INVALID_DATA; | ||||||
|  | 	walloc(lpBuffer, nBufferLength); | ||||||
|  | 	ret = GetTempPathW(nBufferLength, wlpBuffer); | ||||||
|  | 	err = GetLastError(); | ||||||
|  | 	if ((ret != 0) && ((ret = wchar_to_utf8_no_alloc(wlpBuffer, lpBuffer, nBufferLength)) == 0)) { | ||||||
|  | 		err = GetLastError(); | ||||||
|  | 	} | ||||||
|  | 	wfree(lpBuffer); | ||||||
|  | 	SetLastError(err); | ||||||
|  | 	return ret; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static __inline DWORD GetTempFileNameU(char* lpPathName, char* lpPrefixString, UINT uUnique, char* lpTempFileName) | ||||||
|  | { | ||||||
|  | 	DWORD ret = 0, err = ERROR_INVALID_DATA; | ||||||
|  | 	wconvert(lpPathName); | ||||||
|  | 	wconvert(lpPrefixString); | ||||||
|  | 	walloc(lpTempFileName, MAX_PATH); | ||||||
|  | 	ret =GetTempFileNameW(wlpPathName, wlpPrefixString, uUnique, wlpTempFileName); | ||||||
|  | 	err = GetLastError(); | ||||||
|  | 	if ((ret != 0) && ((ret = wchar_to_utf8_no_alloc(wlpTempFileName, lpTempFileName, MAX_PATH)) == 0)) { | ||||||
|  | 		err = GetLastError(); | ||||||
|  | 	} | ||||||
|  | 	wfree(lpTempFileName); | ||||||
|  | 	wfree(lpPrefixString); | ||||||
|  | 	wfree(lpPathName); | ||||||
|  | 	SetLastError(err); | ||||||
|  | 	return ret; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static __inline DWORD GetModuleFileNameU(HMODULE hModule, char* lpFilename, DWORD nSize) | static __inline DWORD GetModuleFileNameU(HMODULE hModule, char* lpFilename, DWORD nSize) | ||||||
| { | { | ||||||
| 	DWORD ret = 0, err = ERROR_INVALID_DATA; | 	DWORD ret = 0, err = ERROR_INVALID_DATA; | ||||||
|  |  | ||||||
							
								
								
									
										21
									
								
								src/net.c
									
										
									
									
									
								
							
							
						
						
									
										21
									
								
								src/net.c
									
										
									
									
									
								
							|  | @ -34,6 +34,7 @@ | ||||||
| #include "rufus.h" | #include "rufus.h" | ||||||
| #include "registry.h" | #include "registry.h" | ||||||
| #include "resource.h" | #include "resource.h" | ||||||
|  | #include "localization.h" | ||||||
| 
 | 
 | ||||||
| /* Maximum download chunk size, in bytes */ | /* Maximum download chunk size, in bytes */ | ||||||
| #define DOWNLOAD_BUFFER_SIZE    10240 | #define DOWNLOAD_BUFFER_SIZE    10240 | ||||||
|  | @ -89,6 +90,7 @@ const char* WinInetErrorString(void) | ||||||
| 	if ((error_code < INTERNET_ERROR_BASE) || (error_code > INTERNET_ERROR_LAST)) | 	if ((error_code < INTERNET_ERROR_BASE) || (error_code > INTERNET_ERROR_LAST)) | ||||||
| 		return WindowsErrorString(); | 		return WindowsErrorString(); | ||||||
| 
 | 
 | ||||||
|  | 	// TODO: These should be localized on an ad-hoc basis
 | ||||||
| 	switch(error_code) { | 	switch(error_code) { | ||||||
| 	case ERROR_INTERNET_OUT_OF_HANDLES: | 	case ERROR_INTERNET_OUT_OF_HANDLES: | ||||||
| 		return "No more handles could be generated at this time."; | 		return "No more handles could be generated at this time."; | ||||||
|  | @ -263,7 +265,7 @@ BOOL DownloadFile(const char* url, const char* file, HWND hProgressDialog) | ||||||
| 		SendMessage(hProgressDialog, UM_ISO_INIT, 0, 0); | 		SendMessage(hProgressDialog, UM_ISO_INIT, 0, 0); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	PrintStatus(0, FALSE, "Downloading %s: Connecting...\n", file); | 	PrintStatus(0, FALSE, lmprintf(MSG_240, file)); | ||||||
| 	uprintf("Downloading %s from %s\n", file, url); | 	uprintf("Downloading %s from %s\n", file, url); | ||||||
| 
 | 
 | ||||||
| 	if (!InternetCrackUrlA(url, (DWORD)safe_strlen(url), 0, &UrlParts)) { | 	if (!InternetCrackUrlA(url, (DWORD)safe_strlen(url), 0, &UrlParts)) { | ||||||
|  | @ -340,7 +342,7 @@ BOOL DownloadFile(const char* url, const char* file, HWND hProgressDialog) | ||||||
| 			break; | 			break; | ||||||
| 		dwSize += dwDownloaded; | 		dwSize += dwDownloaded; | ||||||
| 		SendMessage(hProgressBar, PBM_SETPOS, (WPARAM)(MAX_PROGRESS*((1.0f*dwSize)/(1.0f*dwTotalSize))), 0); | 		SendMessage(hProgressBar, PBM_SETPOS, (WPARAM)(MAX_PROGRESS*((1.0f*dwSize)/(1.0f*dwTotalSize))), 0); | ||||||
| 		PrintStatus(0, FALSE, "Downloading: %0.1f%%\n", (100.0f*dwSize)/(1.0f*dwTotalSize)); | 		PrintStatus(0, FALSE, lmprintf(MSG_241, (100.0f*dwSize)/(1.0f*dwTotalSize))); | ||||||
| 		if (fwrite(buf, 1, dwDownloaded, fd) != dwDownloaded) { | 		if (fwrite(buf, 1, dwDownloaded, fd) != dwDownloaded) { | ||||||
| 			uprintf("Error writing file '%s': %s\n", file, WinInetErrorString()); | 			uprintf("Error writing file '%s': %s\n", file, WinInetErrorString()); | ||||||
| 			goto out; | 			goto out; | ||||||
|  | @ -362,10 +364,10 @@ out: | ||||||
| 	if (fd != NULL) fclose(fd); | 	if (fd != NULL) fclose(fd); | ||||||
| 	if (!r) { | 	if (!r) { | ||||||
| 		_unlink(file); | 		_unlink(file); | ||||||
| 		PrintStatus(0, FALSE, "Failed to download file."); | 		PrintStatus(0, FALSE, lmprintf(MSG_242)); | ||||||
| 		SetLastError(error_code); | 		SetLastError(error_code); | ||||||
| 		MessageBoxA(hMainDialog, IS_ERROR(FormatStatus)?StrError(FormatStatus):WinInetErrorString(), | 		MessageBoxU(hMainDialog, IS_ERROR(FormatStatus)?StrError(FormatStatus):WinInetErrorString(), | ||||||
| 		"File download", MB_OK|MB_ICONERROR); | 		lmprintf(MSG_044), MB_OK|MB_ICONERROR); | ||||||
| 	} | 	} | ||||||
| 	if (hRequest) InternetCloseHandle(hRequest); | 	if (hRequest) InternetCloseHandle(hRequest); | ||||||
| 	if (hConnection) InternetCloseHandle(hConnection); | 	if (hConnection) InternetCloseHandle(hConnection); | ||||||
|  | @ -456,7 +458,7 @@ static DWORD WINAPI CheckForUpdatesThread(LPVOID param) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	PrintStatus(3000, TRUE, "Checking for " APPLICATION_NAME " updates...\n"); | 	PrintStatus(3000, TRUE, lmprintf(MSG_243)); | ||||||
| 	status++;	// 1
 | 	status++;	// 1
 | ||||||
| 
 | 
 | ||||||
| 	if (!GetVersionExA(&os_version)) { | 	if (!GetVersionExA(&os_version)) { | ||||||
|  | @ -600,15 +602,14 @@ out: | ||||||
| 	if (hSession) InternetCloseHandle(hSession); | 	if (hSession) InternetCloseHandle(hSession); | ||||||
| 	switch(status) { | 	switch(status) { | ||||||
| 	case 1: | 	case 1: | ||||||
| 		PrintStatus(3000, TRUE, "Updates: Unable to connect to the internet.\n"); | 		PrintStatus(3000, TRUE, lmprintf(MSG_244)); | ||||||
| 		break; | 		break; | ||||||
| 	case 2: | 	case 2: | ||||||
| 		PrintStatus(3000, TRUE, "Updates: Unable to access version data.\n"); | 		PrintStatus(3000, TRUE, lmprintf(MSG_245)); | ||||||
| 		break; | 		break; | ||||||
| 	case 3: | 	case 3: | ||||||
| 	case 4: | 	case 4: | ||||||
| 		PrintStatus(3000, FALSE, "%s new version of " APPLICATION_NAME " %s\n", | 		PrintStatus(3000, FALSE, lmprintf(found_new_version?MSG_246:MSG_247)); | ||||||
| 		found_new_version?"A":"No", found_new_version?"is available!":"was found."); |  | ||||||
| 	default: | 	default: | ||||||
| 		break; | 		break; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
							
								
								
									
										458
									
								
								src/parser.c
									
										
									
									
									
								
							
							
						
						
									
										458
									
								
								src/parser.c
									
										
									
									
									
								
							|  | @ -33,13 +33,415 @@ | ||||||
| 
 | 
 | ||||||
| #include "rufus.h" | #include "rufus.h" | ||||||
| #include "msapi_utf8.h" | #include "msapi_utf8.h" | ||||||
|  | #include "localization.h" | ||||||
| 
 | 
 | ||||||
| // Parse a line of UTF-16 text and return the data if it matches the 'token'
 | static const char space[] = " \t"; | ||||||
| // The parsed line is of the form: [ ]token[ ]=[ ]["]data["][ ] and is 
 | static const wchar_t wspace[] = L" \t"; | ||||||
| // modified by the parser
 | 
 | ||||||
|  | /*
 | ||||||
|  |  * Fill a localization command buffer by parsing the line arguments | ||||||
|  |  * The command is allocated and must be freed (by calling free_loc_cmd) | ||||||
|  |  */ | ||||||
|  | static loc_cmd* get_loc_cmd(char c, char* line) { | ||||||
|  | 	size_t i, j, k, l, r, ti = 0, ii = 0; | ||||||
|  | 	char *endptr, *expected_endptr, *token; | ||||||
|  | 	loc_cmd* lcmd = NULL; | ||||||
|  | 
 | ||||||
|  | 	for (j=0; j<ARRAYSIZE(parse_cmd); j++) { | ||||||
|  | 		if (c == parse_cmd[j].c) | ||||||
|  | 			break; | ||||||
|  | 	} | ||||||
|  | 	if (j >= ARRAYSIZE(parse_cmd)) { | ||||||
|  | 		luprint("unknown command"); | ||||||
|  | 		return NULL; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	lcmd = (loc_cmd*)calloc(sizeof(loc_cmd), 1); | ||||||
|  | 	if (lcmd == NULL) { | ||||||
|  | 		luprint("could not allocate command"); | ||||||
|  | 		return NULL; | ||||||
|  | 	} | ||||||
|  | 	lcmd->ctrl_id = -1; | ||||||
|  | 	lcmd->command = parse_cmd[j].cmd; | ||||||
|  | 	lcmd->line_nr = (uint16_t)loc_line_nr; | ||||||
|  | 
 | ||||||
|  | 	i = 0; | ||||||
|  | 	for (k = 0; parse_cmd[j].arg_type[k] != 0; k++) { | ||||||
|  | 		// Skip leading spaces
 | ||||||
|  | 		i += strspn(&line[i], space); | ||||||
|  | 		r = i; | ||||||
|  | 		if (line[i] == 0) { | ||||||
|  | 			luprintf("missing parameter for command '%c'", parse_cmd[j].c); | ||||||
|  | 			goto err; | ||||||
|  | 		} | ||||||
|  | 		switch(parse_cmd[j].arg_type[k]) { | ||||||
|  | 		case 's':	// quoted string
 | ||||||
|  | 			// search leading quote
 | ||||||
|  | 			if (line[i++] != '"') { | ||||||
|  | 				luprint("no start quote"); | ||||||
|  | 				goto err; | ||||||
|  | 			} | ||||||
|  | 			r = i; | ||||||
|  | 			// locate ending quote
 | ||||||
|  | 			while ((line[i] != 0) && ((line[i] != '"') || ((line[i] == '"') && (line[i-1] == '\\')))) { | ||||||
|  | 				if ((line[i] == '"') && (line[i-1] == '\\')) { | ||||||
|  | 					strcpy(&line[i-1], &line[i]); | ||||||
|  | 				} else { | ||||||
|  | 					i++; | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 			if (line[i] == 0) { | ||||||
|  | 				luprint("no end quote"); | ||||||
|  | 				goto err; | ||||||
|  | 			} | ||||||
|  | 			line[i++] = 0; | ||||||
|  | 			lcmd->txt[ti++] = safe_strdup(&line[r]); | ||||||
|  | 			break; | ||||||
|  | 		case 'c':	// control ID (single word)
 | ||||||
|  | 			while ((line[i] != 0) && (line[i] != space[0]) && (line[i] != space[1])) | ||||||
|  | 				i++; | ||||||
|  | 			if (line[i] != 0) | ||||||
|  | 				line[i++] = 0; | ||||||
|  | 			lcmd->txt[ti++] = safe_strdup(&line[r]); | ||||||
|  | 			break; | ||||||
|  | 		case 'i':	// 32 bit signed integer
 | ||||||
|  | 			// allow commas or dots between values
 | ||||||
|  | 			if ((line[i] == ',') || (line[i] == '.')) { | ||||||
|  | 				i += strspn(&line[i+1], space); | ||||||
|  | 				r = i; | ||||||
|  | 			} | ||||||
|  | 			while ((line[i] != 0) && (line[i] != space[0]) && (line[i] != space[1]) | ||||||
|  | 				&& (line[i] != ',') && (line[i] != '.')) | ||||||
|  | 				i++; | ||||||
|  | 			expected_endptr = &line[i]; | ||||||
|  | 			if (line[i] != 0) | ||||||
|  | 				line[i++] = 0; | ||||||
|  | 			lcmd->num[ii++] = (int32_t)strtol(&line[r], &endptr, 0); | ||||||
|  | 			if (endptr != expected_endptr) { | ||||||
|  | 				luprint("invalid integer"); | ||||||
|  | 				goto err; | ||||||
|  | 			} | ||||||
|  | 			break; | ||||||
|  | 		case 'u':	// comma separated list of unsigned integers (to end of line)
 | ||||||
|  | 			// count the number of commas
 | ||||||
|  | 			lcmd->unum_size = 1; | ||||||
|  | 			for (l=i; line[l] != 0; l++) { | ||||||
|  | 				if (line[l] == ',') | ||||||
|  | 					lcmd->unum_size++; | ||||||
|  | 			} | ||||||
|  | 			lcmd->unum = (uint32_t*)malloc(lcmd->unum_size * sizeof(uint32_t)); | ||||||
|  | 			token = strtok(&line[i], ","); | ||||||
|  | 			for (l=0; (l<lcmd->unum_size) && (token != NULL); l++) { | ||||||
|  | 				lcmd->unum[l] = (int32_t)strtol(token, &endptr, 0); | ||||||
|  | 				token = strtok(NULL, ","); | ||||||
|  | 			} | ||||||
|  | 			if ((token != NULL) || (l != lcmd->unum_size)) { | ||||||
|  | 				luprint("internal error (unexpected number of numeric values)"); | ||||||
|  | 				goto err; | ||||||
|  | 			} | ||||||
|  | 			break; | ||||||
|  | 		default: | ||||||
|  | 			uprintf("localization: unhandled arg_type '%c'\n", parse_cmd[j].arg_type[k]); | ||||||
|  | 			goto err; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return lcmd; | ||||||
|  | 
 | ||||||
|  | err: | ||||||
|  | 	free_loc_cmd(lcmd); | ||||||
|  | 	return NULL; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Parse an UTF-8 localization command line | ||||||
|  |  */ | ||||||
|  | static void get_loc_data_line(char* line) | ||||||
|  | { | ||||||
|  | 	size_t i; | ||||||
|  | 	loc_cmd* lcmd = NULL; | ||||||
|  | 	char t; | ||||||
|  | 
 | ||||||
|  | 	if ((line == NULL) || (line[0] == 0)) | ||||||
|  | 		return; | ||||||
|  | 
 | ||||||
|  | 	// Skip leading spaces
 | ||||||
|  | 	i = strspn(line, space); | ||||||
|  | 
 | ||||||
|  | 	// Read token (NUL character will be read if EOL)
 | ||||||
|  | 	t = line[i++]; | ||||||
|  | 	if (t == '#')	// Comment
 | ||||||
|  | 		return; | ||||||
|  | 	if ((t == 0) || ((line[i] != space[0]) && (line[i] != space[1]))) { | ||||||
|  | 		luprintf("syntax error: '%s'", line); | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	lcmd = get_loc_cmd(t, &line[i]); | ||||||
|  | 
 | ||||||
|  | 	if ((lcmd != NULL) && (lcmd->command != LC_LOCALE)) | ||||||
|  | 		// TODO: check return value?
 | ||||||
|  | 		dispatch_loc_cmd(lcmd); | ||||||
|  | 	else | ||||||
|  | 		free_loc_cmd(lcmd); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Open a localization file and store its file name, with special case | ||||||
|  |  * when dealing with the embedded loc file. | ||||||
|  |  */ | ||||||
|  | FILE* open_loc_file(const char* filename) | ||||||
|  | { | ||||||
|  | 	FILE* fd = NULL; | ||||||
|  | 	wchar_t *wfilename = NULL; | ||||||
|  | 	const char* tmp_ext = ".tmp"; | ||||||
|  | 
 | ||||||
|  | 	if (filename == NULL) | ||||||
|  | 		return NULL; | ||||||
|  | 
 | ||||||
|  | 	if (loc_filename != embedded_loc_filename) { | ||||||
|  | 		safe_free(loc_filename); | ||||||
|  | 	} | ||||||
|  | 	if (safe_strcmp(tmp_ext, &filename[safe_strlen(filename)-4]) == 0) { | ||||||
|  | 		loc_filename = embedded_loc_filename; | ||||||
|  | 	} else { | ||||||
|  | 		loc_filename = safe_strdup(filename); | ||||||
|  | 	} | ||||||
|  | 	wfilename = utf8_to_wchar(filename); | ||||||
|  | 	if (wfilename == NULL) { | ||||||
|  | 		uprintf("localization: could not convert '%s' filename to UTF-16\n", filename); | ||||||
|  | 		goto out; | ||||||
|  | 	} | ||||||
|  | 	fd = _wfopen(wfilename, L"r"); | ||||||
|  | 	if (fd == NULL) { | ||||||
|  | 		uprintf("localization: could not open '%s'\n", filename); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | out: | ||||||
|  | 	safe_free(wfilename); | ||||||
|  | 	return fd; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Parse a localization file, to construct the list of available locales. | ||||||
|  |  * The locale file must be UTF-8 with NO BOM. | ||||||
|  |  */ | ||||||
|  | BOOL get_supported_locales(const char* filename) | ||||||
|  | { | ||||||
|  | 	FILE* fd = NULL; | ||||||
|  | 	BOOL r = FALSE; | ||||||
|  | 	char line[1024]; | ||||||
|  | 	size_t i; | ||||||
|  | 	loc_cmd *lcmd = NULL, *last_lcmd = NULL; | ||||||
|  | 	long end_of_block; | ||||||
|  | 	 | ||||||
|  | 	fd = open_loc_file(filename); | ||||||
|  | 	if (fd == NULL) | ||||||
|  | 		goto out; | ||||||
|  | 
 | ||||||
|  | 	loc_line_nr = 0; | ||||||
|  | 	line[0] = 0; | ||||||
|  | 	free_locale_list(); | ||||||
|  | 	do { | ||||||
|  | 		// adjust the last block
 | ||||||
|  | 		end_of_block = ftell(fd); | ||||||
|  | 		if (fgets(line, sizeof(line), fd) == NULL) | ||||||
|  | 			break; | ||||||
|  | 		loc_line_nr++; | ||||||
|  | 		// Skip leading spaces
 | ||||||
|  | 		i = strspn(line, space); | ||||||
|  | 		if (line[i] != 'l') | ||||||
|  | 			continue; | ||||||
|  | 		// line[i] is not NUL so i+1 is safe to access
 | ||||||
|  | 		lcmd = get_loc_cmd(line[i], &line[i+1]); | ||||||
|  | 		if ((lcmd == NULL) || (lcmd->command != LC_LOCALE)) { | ||||||
|  | 			free_loc_cmd(lcmd); | ||||||
|  | 			continue; | ||||||
|  | 		} | ||||||
|  | 		// we use num[0] and num[1] as block delimiter index for this locale in the file
 | ||||||
|  | 		if (last_lcmd != NULL) { | ||||||
|  | 			last_lcmd->num[1] = (int32_t)end_of_block; | ||||||
|  | 		} | ||||||
|  | 		lcmd->num[0] = (int32_t)ftell(fd); | ||||||
|  | 		// Add our locale command to the locale list
 | ||||||
|  | 		list_add_tail(&lcmd->list, &locale_list); | ||||||
|  | 		uprintf("localization: found locale '%s'\n", lcmd->txt[0]); | ||||||
|  | 		last_lcmd = lcmd; | ||||||
|  | 	} while (1); | ||||||
|  | 	if (last_lcmd != NULL) | ||||||
|  | 		last_lcmd->num[1] = (int32_t)ftell(fd); | ||||||
|  | 	r = !list_empty(&locale_list); | ||||||
|  | 	if (r == FALSE) | ||||||
|  | 		uprintf("localization: '%s' contains no locale sections\n", filename);  | ||||||
|  | 
 | ||||||
|  | out: | ||||||
|  | 	if (fd != NULL) | ||||||
|  | 		fclose(fd); | ||||||
|  | 	return r; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Parse a locale section in a localization file (UTF-8, no BOM) | ||||||
|  |  * NB: this call is reentrant for the "base" command support | ||||||
|  |  */ | ||||||
|  | char* get_loc_data_file(const char* filename, long offset, long end_offset, int start_line) | ||||||
|  | { | ||||||
|  | 	size_t bufsize = 1024; | ||||||
|  | 	static FILE* fd = NULL; | ||||||
|  | 	char *ret = NULL, *buf = NULL; | ||||||
|  | 	size_t i = 0; | ||||||
|  | 	int r = 0, line_nr_incr = 1; | ||||||
|  | 	int c = 0, eol_char = 0; | ||||||
|  | 	int old_loc_line_nr; | ||||||
|  | 	BOOL eol = FALSE, escape_sequence = FALSE, reentrant = (fd != NULL); | ||||||
|  | 	long cur_offset = -1; | ||||||
|  | 
 | ||||||
|  | 	if (reentrant) { | ||||||
|  | 		// Called, from a 'b' command - no need to reopen the file,
 | ||||||
|  | 		// just save the current offset and current line number
 | ||||||
|  | 		cur_offset = ftell(fd); | ||||||
|  | 		old_loc_line_nr = loc_line_nr; | ||||||
|  | 	} else { | ||||||
|  | 		if ((filename == NULL) || (filename[0] == 0)) | ||||||
|  | 			return NULL; | ||||||
|  | 		free_dialog_list(); | ||||||
|  | 		fd = open_loc_file(filename); | ||||||
|  | 		if (fd == NULL) | ||||||
|  | 			goto out; | ||||||
|  | 	} | ||||||
|  | 	loc_line_nr = start_line; | ||||||
|  | 	buf = (char*) malloc(bufsize); | ||||||
|  | 	if (buf == NULL) { | ||||||
|  | 		uprintf("localization: could not allocate line buffer\n"); | ||||||
|  | 		goto out; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	fseek(fd, offset, SEEK_SET); | ||||||
|  | 
 | ||||||
|  | 	do {	// custom readline handling for string collation, realloc, line numbers, etc.
 | ||||||
|  | 		c = getc(fd); | ||||||
|  | 		switch(c) { | ||||||
|  | 		case EOF: | ||||||
|  | 			buf[i] = 0; | ||||||
|  | 			if (!eol) | ||||||
|  | 				loc_line_nr += line_nr_incr; | ||||||
|  | 			get_loc_data_line(buf); | ||||||
|  | 			goto out; | ||||||
|  | 		case '\r': | ||||||
|  | 		case '\n': | ||||||
|  | 			if (escape_sequence) { | ||||||
|  | 				escape_sequence = FALSE; | ||||||
|  | 				break; | ||||||
|  | 			} | ||||||
|  | 			// This assumes that the EOL sequence is always the same throughout the file
 | ||||||
|  | 			if (eol_char == 0) | ||||||
|  | 				eol_char = c; | ||||||
|  | 			if (c == eol_char) { | ||||||
|  | 				if (eol) { | ||||||
|  | 					line_nr_incr++; | ||||||
|  | 				} else { | ||||||
|  | 					loc_line_nr += line_nr_incr; | ||||||
|  | 					line_nr_incr = 1; | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 			buf[i] = 0; | ||||||
|  | 			if (!eol) { | ||||||
|  | 				// Strip trailing spaces (for string collation)
 | ||||||
|  | 				for (r = ((int)i)-1; (r>0) && ((buf[r]==space[0])||(buf[r]==space[1])); r--); | ||||||
|  | 				if (r < 0) | ||||||
|  | 					r = 0; | ||||||
|  | 				eol = TRUE; | ||||||
|  | 			} | ||||||
|  | 			break; | ||||||
|  | 		case ' ': | ||||||
|  | 		case '\t': | ||||||
|  | 			if (escape_sequence) { | ||||||
|  | 				escape_sequence = FALSE; | ||||||
|  | 				break; | ||||||
|  | 			} | ||||||
|  | 			if (!eol) { | ||||||
|  | 				buf[i++] = (char)c; | ||||||
|  | 			} | ||||||
|  | 			break; | ||||||
|  | 		case '\\': | ||||||
|  | 			if (!escape_sequence) { | ||||||
|  | 				escape_sequence = TRUE; | ||||||
|  | 				break; | ||||||
|  | 			} | ||||||
|  | 			// fall through on escape sequence
 | ||||||
|  | 		default: | ||||||
|  | 			if (escape_sequence) { | ||||||
|  | 				switch (c) { | ||||||
|  | 				case 'n':	// \n -> CRLF
 | ||||||
|  | 					buf[i++] = '\r'; | ||||||
|  | 					buf[i++] = '\n'; | ||||||
|  | 					break; | ||||||
|  | 				case '"':	// \" carried as is
 | ||||||
|  | 					buf[i++] = '\\'; | ||||||
|  | 					buf[i++] = '"'; | ||||||
|  | 					break; | ||||||
|  | 				case '\\': | ||||||
|  | 					buf[i++] = '\\'; | ||||||
|  | 					break; | ||||||
|  | 				default:	// ignore any other escape sequence
 | ||||||
|  | 					break; | ||||||
|  | 				} | ||||||
|  | 				escape_sequence = FALSE; | ||||||
|  | 			} else { | ||||||
|  | 				// Collate multiline strings
 | ||||||
|  | 				if ((eol) && (c == '"') && (buf[r] == '"')) { | ||||||
|  | 					i = r; | ||||||
|  | 					eol = FALSE; | ||||||
|  | 					break; | ||||||
|  | 				} | ||||||
|  | 				if (eol) { | ||||||
|  | 					get_loc_data_line(buf); | ||||||
|  | 					eol = FALSE; | ||||||
|  | 					i = 0; | ||||||
|  | 					r = 0; | ||||||
|  | 				} | ||||||
|  | 				buf[i++] = (char)c; | ||||||
|  | 			} | ||||||
|  | 			break; | ||||||
|  | 		} | ||||||
|  | 		if (ftell(fd) > end_offset) | ||||||
|  | 			goto out; | ||||||
|  | 		// Have at least 2 chars extra, for \r\n sequences
 | ||||||
|  | 		if (i >= bufsize-2) { | ||||||
|  | 			bufsize *= 2; | ||||||
|  | 			if (bufsize > 32768) { | ||||||
|  | 				uprintf("localization: requested line buffer is larger than 32K!\n"); | ||||||
|  | 				goto out; | ||||||
|  | 			} | ||||||
|  | 			buf = (char*) _reallocf(buf, bufsize); | ||||||
|  | 			if (buf == NULL) { | ||||||
|  | 				uprintf("localization: could not grow line buffer\n"); | ||||||
|  | 				goto out; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} while(1); | ||||||
|  | 
 | ||||||
|  | out: | ||||||
|  | 	// Don't close on a reentrant call
 | ||||||
|  | 	if (reentrant) { | ||||||
|  | 		fseek(fd, cur_offset, SEEK_SET); | ||||||
|  | 		loc_line_nr = old_loc_line_nr; | ||||||
|  | 	} else if (fd != NULL) { | ||||||
|  | 		fclose(fd); | ||||||
|  | 		fd = NULL; | ||||||
|  | 	} | ||||||
|  | 	safe_free(buf); | ||||||
|  | 	return ret; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Parse a line of UTF-16 text and return the data if it matches the 'token' | ||||||
|  |  * The parsed line is of the form: [ ]token[ ]=[ ]["]data["][ ] and is  | ||||||
|  |  * modified by the parser | ||||||
|  |  */ | ||||||
| static wchar_t* get_token_data_line(const wchar_t* wtoken, wchar_t* wline) | static wchar_t* get_token_data_line(const wchar_t* wtoken, wchar_t* wline) | ||||||
| { | { | ||||||
| 	const wchar_t wspace[] = L" \t";	// The only whitespaces we recognize as such
 |  | ||||||
| 	size_t i, r; | 	size_t i, r; | ||||||
| 	BOOLEAN quoteth = FALSE; | 	BOOLEAN quoteth = FALSE; | ||||||
| 
 | 
 | ||||||
|  | @ -90,8 +492,10 @@ static wchar_t* get_token_data_line(const wchar_t* wtoken, wchar_t* wline) | ||||||
| 	return (wline[r] == 0)?NULL:&wline[r]; | 	return (wline[r] == 0)?NULL:&wline[r]; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Parse a file (ANSI or UTF-8 or UTF-16) and return the data for the first occurrence of 'token'
 | /*
 | ||||||
| // The returned string is UTF-8 and MUST be freed by the caller
 |  * Parse a file (ANSI or UTF-8 or UTF-16) and return the data for the first occurrence of 'token' | ||||||
|  |  * The returned string is UTF-8 and MUST be freed by the caller | ||||||
|  |  */ | ||||||
| char* get_token_data_file(const char* token, const char* filename) | char* get_token_data_file(const char* token, const char* filename) | ||||||
| { | { | ||||||
| 	wchar_t *wtoken = NULL, *wdata= NULL, *wfilename = NULL; | 	wchar_t *wtoken = NULL, *wdata= NULL, *wfilename = NULL; | ||||||
|  | @ -135,8 +539,10 @@ out: | ||||||
| 	return ret; | 	return ret; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Parse a buffer (ANSI or UTF-8) and return the data for the 'n'th occurrence of 'token'
 | /*
 | ||||||
| // The returned string is UTF-8 and MUST be freed by the caller
 |  * Parse a buffer (ANSI or UTF-8) and return the data for the 'n'th occurrence of 'token' | ||||||
|  |  * The returned string is UTF-8 and MUST be freed by the caller | ||||||
|  |  */ | ||||||
| char* get_token_data_buffer(const char* token, unsigned int n, const char* buffer, size_t buffer_size) | char* get_token_data_buffer(const char* token, unsigned int n, const char* buffer, size_t buffer_size) | ||||||
| { | { | ||||||
| 	unsigned int j, curly_count; | 	unsigned int j, curly_count; | ||||||
|  | @ -199,10 +605,12 @@ static __inline char* get_sanitized_token_data_buffer(const char* token, unsigne | ||||||
| 	return data; | 	return data; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Parse an update data file and populates a rufus_update structure.
 | /*
 | ||||||
| // NB: since this is remote data, and we're running elevated, it *IS* considered
 |  * Parse an update data file and populates a rufus_update structure. | ||||||
| // potentially malicious, even if it comes from a supposedly trusted server.
 |  * NB: since this is remote data, and we're running elevated, it *IS* considered | ||||||
| // len should be the size of the buffer, including the zero terminator
 |  * potentially malicious, even if it comes from a supposedly trusted server. | ||||||
|  |  * len should be the size of the buffer, including the zero terminator | ||||||
|  |  */ | ||||||
| void parse_update(char* buf, size_t len) | void parse_update(char* buf, size_t len) | ||||||
| { | { | ||||||
| 	size_t i; | 	size_t i; | ||||||
|  | @ -249,13 +657,14 @@ void parse_update(char* buf, size_t len) | ||||||
| 	update.release_notes = get_sanitized_token_data_buffer("release_notes", 1, buf, len); | 	update.release_notes = get_sanitized_token_data_buffer("release_notes", 1, buf, len); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Insert entry 'data' under section 'section' of a config file
 | /*
 | ||||||
| // Section must include the relevant delimitors (eg '[', ']') if needed
 |  * Insert entry 'data' under section 'section' of a config file | ||||||
|  |  * Section must include the relevant delimitors (eg '[', ']') if needed | ||||||
|  |  */ | ||||||
| char* insert_section_data(const char* filename, const char* section, const char* data, BOOL dos2unix) | char* insert_section_data(const char* filename, const char* section, const char* data, BOOL dos2unix) | ||||||
| { | { | ||||||
| 	const wchar_t* outmode[] = { L"w", L"w, ccs=UTF-8", L"w, ccs=UTF-16LE" }; | 	const wchar_t* outmode[] = { L"w", L"w, ccs=UTF-8", L"w, ccs=UTF-16LE" }; | ||||||
| 	wchar_t *wsection = NULL, *wfilename = NULL, *wtmpname = NULL, *wdata = NULL, bom = 0; | 	wchar_t *wsection = NULL, *wfilename = NULL, *wtmpname = NULL, *wdata = NULL, bom = 0; | ||||||
| 	wchar_t wspace[] = L" \t"; |  | ||||||
| 	wchar_t buf[1024]; | 	wchar_t buf[1024]; | ||||||
| 	FILE *fd_in = NULL, *fd_out = NULL; | 	FILE *fd_in = NULL, *fd_out = NULL; | ||||||
| 	size_t i, size; | 	size_t i, size; | ||||||
|  | @ -316,7 +725,7 @@ char* insert_section_data(const char* filename, const char* section, const char* | ||||||
| 
 | 
 | ||||||
| 	fd_out = _wfopen(wtmpname, outmode[mode]); | 	fd_out = _wfopen(wtmpname, outmode[mode]); | ||||||
| 	if (fd_out == NULL) { | 	if (fd_out == NULL) { | ||||||
| 		uprintf("Could not open temporary output file %s~\n", filename); | 		uprintf("Could not open temporary output file '%s~'\n", filename); | ||||||
| 		goto out; | 		goto out; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | @ -360,7 +769,7 @@ out: | ||||||
| 			fclose(fd_in); | 			fclose(fd_in); | ||||||
| 			fclose(fd_out); | 			fclose(fd_out); | ||||||
| 		} else { | 		} else { | ||||||
| 			uprintf("Could not write %s - original file has been left unmodifiedn", filename); | 			uprintf("Could not write '%s' - original file has been left unmodified\n", filename); | ||||||
| 			ret = NULL; | 			ret = NULL; | ||||||
| 			if (fd_in != NULL) fclose(fd_in); | 			if (fd_in != NULL) fclose(fd_in); | ||||||
| 			if (fd_out != NULL) fclose(fd_out); | 			if (fd_out != NULL) fclose(fd_out); | ||||||
|  | @ -375,15 +784,16 @@ out: | ||||||
| 	return ret; | 	return ret; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Search for a specific 'src' substring data for all occurrences of 'token', and replace
 | /*
 | ||||||
| // it with 'rep'. File can be ANSI or UNICODE and is overwritten. Parameters are UTF-8.
 |  * Search for a specific 'src' substring data for all occurrences of 'token', and replace | ||||||
| // The parsed line is of the form: [ ]token[ ]data
 |  * it with 'rep'. File can be ANSI or UNICODE and is overwritten. Parameters are UTF-8. | ||||||
| // Returns a pointer to rep if replacement occurred, NULL otherwise
 |  * The parsed line is of the form: [ ]token[ ]data | ||||||
|  |  * Returns a pointer to rep if replacement occurred, NULL otherwise | ||||||
|  |  */ | ||||||
| char* replace_in_token_data(const char* filename, const char* token, const char* src, const char* rep, BOOL dos2unix) | char* replace_in_token_data(const char* filename, const char* token, const char* src, const char* rep, BOOL dos2unix) | ||||||
| { | { | ||||||
| 	const wchar_t* outmode[] = { L"w", L"w, ccs=UTF-8", L"w, ccs=UTF-16LE" }; | 	const wchar_t* outmode[] = { L"w", L"w, ccs=UTF-8", L"w, ccs=UTF-16LE" }; | ||||||
| 	wchar_t *wtoken = NULL, *wfilename = NULL, *wtmpname = NULL, *wsrc = NULL, *wrep = NULL, bom = 0; | 	wchar_t *wtoken = NULL, *wfilename = NULL, *wtmpname = NULL, *wsrc = NULL, *wrep = NULL, bom = 0; | ||||||
| 	wchar_t wspace[] = L" \t"; |  | ||||||
| 	wchar_t buf[1024], *torep; | 	wchar_t buf[1024], *torep; | ||||||
| 	FILE *fd_in = NULL, *fd_out = NULL; | 	FILE *fd_in = NULL, *fd_out = NULL; | ||||||
| 	size_t i, size; | 	size_t i, size; | ||||||
|  | @ -451,7 +861,7 @@ char* replace_in_token_data(const char* filename, const char* token, const char* | ||||||
| 
 | 
 | ||||||
| 	fd_out = _wfopen(wtmpname, outmode[mode]); | 	fd_out = _wfopen(wtmpname, outmode[mode]); | ||||||
| 	if (fd_out == NULL) { | 	if (fd_out == NULL) { | ||||||
| 		uprintf("Could not open temporary output file %s~\n", filename); | 		uprintf("Could not open temporary output file '%s~'\n", filename); | ||||||
| 		goto out; | 		goto out; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | @ -506,7 +916,7 @@ out: | ||||||
| 			fclose(fd_in); | 			fclose(fd_in); | ||||||
| 			fclose(fd_out); | 			fclose(fd_out); | ||||||
| 		} else { | 		} else { | ||||||
| 			uprintf("Could not write %s - original file has been left unmodified.\n", filename); | 			uprintf("Could not write '%s' - original file has been left unmodified.\n", filename); | ||||||
| 			ret = NULL; | 			ret = NULL; | ||||||
| 			if (fd_in != NULL) fclose(fd_in); | 			if (fd_in != NULL) fclose(fd_in); | ||||||
| 			if (fd_out != NULL) fclose(fd_out); | 			if (fd_out != NULL) fclose(fd_out); | ||||||
|  |  | ||||||
							
								
								
									
										303
									
								
								src/resource.h
									
										
									
									
									
								
							
							
						
						
									
										303
									
								
								src/resource.h
									
										
									
									
									
								
							|  | @ -3,17 +3,17 @@ | ||||||
| // Used by rufus.rc
 | // Used by rufus.rc
 | ||||||
| //
 | //
 | ||||||
| #define IDD_DIALOG                      101 | #define IDD_DIALOG                      101 | ||||||
| #define IDI_ICON                        102 | #define IDD_ABOUTBOX                    102 | ||||||
| #define IDD_ABOUTBOX                    103 | #define IDD_NOTIFICATION                103 | ||||||
| #define IDD_NOTIFICATION                104 | #define IDD_LICENSE                     104 | ||||||
| #define IDD_LICENSE                     105 | #define IDD_ISO_EXTRACT                 105 | ||||||
| #define IDD_ISO_EXTRACT                 106 | #define IDD_LOG                         106 | ||||||
| #define IDD_LOG                         107 | #define IDD_UPDATE_POLICY               107 | ||||||
| #define IDS_VERSION                     108 | #define IDD_NEW_VERSION                 108 | ||||||
| #define IDI_UP                          109 | #define IDD_MESSAGES                    109 | ||||||
| #define IDI_DOWN                        110 | #define IDI_ICON                        110 | ||||||
| #define IDD_UPDATE_POLICY               111 | #define IDI_UP                          111 | ||||||
| #define IDD_NEW_VERSION                 112 | #define IDI_DOWN                        112 | ||||||
| #define IDR_BR_MBR_BIN                  200 | #define IDR_BR_MBR_BIN                  200 | ||||||
| #define IDR_FD_COMMAND_COM              300 | #define IDR_FD_COMMAND_COM              300 | ||||||
| #define IDR_FD_KERNEL_SYS               301 | #define IDR_FD_KERNEL_SYS               301 | ||||||
|  | @ -46,10 +46,11 @@ | ||||||
| #define IDR_SL_LDLINUX_V4_SYS           401 | #define IDR_SL_LDLINUX_V4_SYS           401 | ||||||
| #define IDR_SL_LDLINUX_V5_BSS           402 | #define IDR_SL_LDLINUX_V5_BSS           402 | ||||||
| #define IDR_SL_LDLINUX_V5_SYS           403 | #define IDR_SL_LDLINUX_V5_SYS           403 | ||||||
|  | #define IDR_LC_RUFUS_LOC                500 | ||||||
| #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_PARTITION_SCHEME            1004 | #define IDC_PARTITION_TYPE              1004 | ||||||
| #define IDC_CLUSTERSIZE                 1005 | #define IDC_CLUSTERSIZE                 1005 | ||||||
| #define IDC_STATUS                      1006 | #define IDC_STATUS                      1006 | ||||||
| #define IDC_ABOUT                       1007 | #define IDC_ABOUT                       1007 | ||||||
|  | @ -79,7 +80,7 @@ | ||||||
| #define IDC_NOTIFICATION_TEXT           1041 | #define IDC_NOTIFICATION_TEXT           1041 | ||||||
| #define IDC_NOTIFICATION_LINE           1042 | #define IDC_NOTIFICATION_LINE           1042 | ||||||
| #define IDC_ADVANCED                    1043 | #define IDC_ADVANCED                    1043 | ||||||
| #define IDC_ADVANCED_GROUP              1044 | #define IDS_ADVANCED_OPTIONS_GRP        1044 | ||||||
| #define IDC_LOG                         1045 | #define IDC_LOG                         1045 | ||||||
| #define IDC_LOG_EDIT                    1050 | #define IDC_LOG_EDIT                    1050 | ||||||
| #define IDC_LOG_SAVE                    1051 | #define IDC_LOG_SAVE                    1051 | ||||||
|  | @ -95,15 +96,287 @@ | ||||||
| #define IDC_YOUR_VERSION                1068 | #define IDC_YOUR_VERSION                1068 | ||||||
| #define IDC_LATEST_VERSION              1069 | #define IDC_LATEST_VERSION              1069 | ||||||
| #define IDC_DOWNLOAD_URL                1070 | #define IDC_DOWNLOAD_URL                1070 | ||||||
|  | #define IDS_DEVICE_TXT                  2000 | ||||||
|  | #define IDS_PARTITION_TYPE_TXT          2001 | ||||||
|  | #define IDS_FILESYSTEM_TXT              2002 | ||||||
|  | #define IDS_CLUSTERSIZE_TXT             2003 | ||||||
|  | #define IDS_LABEL_TXT                   2004 | ||||||
|  | #define IDS_FORMAT_OPTIONS_GRP          2005 | ||||||
|  | #define IDS_UPDATE_SETTINGS_GRP         2006 | ||||||
|  | #define IDS_UPDATE_FREQUENCY_TXT        2007 | ||||||
|  | #define IDS_INCLUDE_BETAS_TXT           2008 | ||||||
|  | #define IDS_NEW_VERSION_AVAIL_TXT       2009 | ||||||
|  | #define IDS_NEW_VERSION_DOWNLOAD_GRP    2010 | ||||||
|  | #define IDS_NEW_VERSION_NOTES_GRP       2011 | ||||||
|  | #define IDS_CHECK_NOW_GRP               2012 | ||||||
|  | #define MSG_000                         3000 | ||||||
|  | #define MSG_001                         3001 | ||||||
|  | #define MSG_002                         3002 | ||||||
|  | #define MSG_003                         3003 | ||||||
|  | #define MSG_004                         3004 | ||||||
|  | #define MSG_005                         3005 | ||||||
|  | #define MSG_006                         3006 | ||||||
|  | #define MSG_007                         3007 | ||||||
|  | #define MSG_008                         3008 | ||||||
|  | #define MSG_009                         3009 | ||||||
|  | #define MSG_010                         3010 | ||||||
|  | #define MSG_011                         3011 | ||||||
|  | #define MSG_012                         3012 | ||||||
|  | #define MSG_013                         3013 | ||||||
|  | #define MSG_014                         3014 | ||||||
|  | #define MSG_015                         3015 | ||||||
|  | #define MSG_016                         3016 | ||||||
|  | #define MSG_017                         3017 | ||||||
|  | #define MSG_018                         3018 | ||||||
|  | #define MSG_019                         3019 | ||||||
|  | #define MSG_020                         3020 | ||||||
|  | #define MSG_021                         3021 | ||||||
|  | #define MSG_022                         3022 | ||||||
|  | #define MSG_023                         3023 | ||||||
|  | #define MSG_024                         3024 | ||||||
|  | #define MSG_025                         3025 | ||||||
|  | #define MSG_026                         3026 | ||||||
|  | #define MSG_027                         3027 | ||||||
|  | #define MSG_028                         3028 | ||||||
|  | #define MSG_029                         3029 | ||||||
|  | #define MSG_030                         3030 | ||||||
|  | #define MSG_031                         3031 | ||||||
|  | #define MSG_032                         3032 | ||||||
|  | #define MSG_033                         3033 | ||||||
|  | #define MSG_034                         3034 | ||||||
|  | #define MSG_035                         3035 | ||||||
|  | #define MSG_036                         3036 | ||||||
|  | #define MSG_037                         3037 | ||||||
|  | #define MSG_038                         3038 | ||||||
|  | #define MSG_039                         3039 | ||||||
|  | #define MSG_040                         3040 | ||||||
|  | #define MSG_041                         3041 | ||||||
|  | #define MSG_042                         3042 | ||||||
|  | #define MSG_043                         3043 | ||||||
|  | #define MSG_044                         3044 | ||||||
|  | #define MSG_045                         3045 | ||||||
|  | #define MSG_046                         3046 | ||||||
|  | #define MSG_047                         3047 | ||||||
|  | #define MSG_048                         3048 | ||||||
|  | #define MSG_049                         3049 | ||||||
|  | #define MSG_050                         3050 | ||||||
|  | #define MSG_051                         3051 | ||||||
|  | #define MSG_052                         3052 | ||||||
|  | #define MSG_053                         3053 | ||||||
|  | #define MSG_054                         3054 | ||||||
|  | #define MSG_055                         3055 | ||||||
|  | #define MSG_056                         3056 | ||||||
|  | #define MSG_057                         3057 | ||||||
|  | #define MSG_058                         3058 | ||||||
|  | #define MSG_059                         3059 | ||||||
|  | #define MSG_060                         3060 | ||||||
|  | #define MSG_061                         3061 | ||||||
|  | #define MSG_062                         3062 | ||||||
|  | #define MSG_063                         3063 | ||||||
|  | #define MSG_064                         3064 | ||||||
|  | #define MSG_065                         3065 | ||||||
|  | #define MSG_066                         3066 | ||||||
|  | #define MSG_067                         3067 | ||||||
|  | #define MSG_068                         3068 | ||||||
|  | #define MSG_069                         3069 | ||||||
|  | #define MSG_070                         3070 | ||||||
|  | #define MSG_071                         3071 | ||||||
|  | #define MSG_072                         3072 | ||||||
|  | #define MSG_073                         3073 | ||||||
|  | #define MSG_074                         3074 | ||||||
|  | #define MSG_075                         3075 | ||||||
|  | #define MSG_076                         3076 | ||||||
|  | #define MSG_077                         3077 | ||||||
|  | #define MSG_078                         3078 | ||||||
|  | #define MSG_079                         3079 | ||||||
|  | #define MSG_080                         3080 | ||||||
|  | #define MSG_081                         3081 | ||||||
|  | #define MSG_082                         3082 | ||||||
|  | #define MSG_083                         3083 | ||||||
|  | #define MSG_084                         3084 | ||||||
|  | #define MSG_085                         3085 | ||||||
|  | #define MSG_086                         3086 | ||||||
|  | #define MSG_087                         3087 | ||||||
|  | #define MSG_088                         3088 | ||||||
|  | #define MSG_089                         3089 | ||||||
|  | #define MSG_090                         3090 | ||||||
|  | #define MSG_091                         3091 | ||||||
|  | #define MSG_092                         3092 | ||||||
|  | #define MSG_093                         3093 | ||||||
|  | #define MSG_094                         3094 | ||||||
|  | #define MSG_095                         3095 | ||||||
|  | #define MSG_096                         3096 | ||||||
|  | #define MSG_097                         3097 | ||||||
|  | #define MSG_098                         3098 | ||||||
|  | #define MSG_099                         3099 | ||||||
|  | #define MSG_100                         3100 | ||||||
|  | #define MSG_101                         3101 | ||||||
|  | #define MSG_102                         3102 | ||||||
|  | #define MSG_103                         3103 | ||||||
|  | #define MSG_104                         3104 | ||||||
|  | #define MSG_105                         3105 | ||||||
|  | #define MSG_106                         3106 | ||||||
|  | #define MSG_107                         3107 | ||||||
|  | #define MSG_108                         3108 | ||||||
|  | #define MSG_109                         3109 | ||||||
|  | #define MSG_110                         3110 | ||||||
|  | #define MSG_111                         3111 | ||||||
|  | #define MSG_112                         3112 | ||||||
|  | #define MSG_113                         3113 | ||||||
|  | #define MSG_114                         3114 | ||||||
|  | #define MSG_115                         3115 | ||||||
|  | #define MSG_116                         3116 | ||||||
|  | #define MSG_117                         3117 | ||||||
|  | #define MSG_118                         3118 | ||||||
|  | #define MSG_119                         3119 | ||||||
|  | #define MSG_120                         3120 | ||||||
|  | #define MSG_121                         3121 | ||||||
|  | #define MSG_122                         3122 | ||||||
|  | #define MSG_123                         3123 | ||||||
|  | #define MSG_124                         3124 | ||||||
|  | #define MSG_125                         3125 | ||||||
|  | #define MSG_126                         3126 | ||||||
|  | #define MSG_127                         3127 | ||||||
|  | #define MSG_128                         3128 | ||||||
|  | #define MSG_129                         3129 | ||||||
|  | #define MSG_130                         3130 | ||||||
|  | #define MSG_131                         3131 | ||||||
|  | #define MSG_132                         3132 | ||||||
|  | #define MSG_133                         3133 | ||||||
|  | #define MSG_134                         3134 | ||||||
|  | #define MSG_135                         3135 | ||||||
|  | #define MSG_136                         3136 | ||||||
|  | #define MSG_137                         3137 | ||||||
|  | #define MSG_138                         3138 | ||||||
|  | #define MSG_139                         3139 | ||||||
|  | #define MSG_140                         3140 | ||||||
|  | #define MSG_141                         3141 | ||||||
|  | #define MSG_142                         3142 | ||||||
|  | #define MSG_143                         3143 | ||||||
|  | #define MSG_144                         3144 | ||||||
|  | #define MSG_145                         3145 | ||||||
|  | #define MSG_146                         3146 | ||||||
|  | #define MSG_147                         3147 | ||||||
|  | #define MSG_148                         3148 | ||||||
|  | #define MSG_149                         3149 | ||||||
|  | #define MSG_150                         3150 | ||||||
|  | #define MSG_151                         3151 | ||||||
|  | #define MSG_152                         3152 | ||||||
|  | #define MSG_153                         3153 | ||||||
|  | #define MSG_154                         3154 | ||||||
|  | #define MSG_155                         3155 | ||||||
|  | #define MSG_156                         3156 | ||||||
|  | #define MSG_157                         3157 | ||||||
|  | #define MSG_158                         3158 | ||||||
|  | #define MSG_159                         3159 | ||||||
|  | #define MSG_160                         3160 | ||||||
|  | #define MSG_161                         3161 | ||||||
|  | #define MSG_162                         3162 | ||||||
|  | #define MSG_163                         3163 | ||||||
|  | #define MSG_164                         3164 | ||||||
|  | #define MSG_165                         3165 | ||||||
|  | #define MSG_166                         3166 | ||||||
|  | #define MSG_167                         3167 | ||||||
|  | #define MSG_168                         3168 | ||||||
|  | #define MSG_169                         3169 | ||||||
|  | #define MSG_170                         3170 | ||||||
|  | #define MSG_171                         3171 | ||||||
|  | #define MSG_172                         3172 | ||||||
|  | #define MSG_173                         3173 | ||||||
|  | #define MSG_174                         3174 | ||||||
|  | #define MSG_175                         3175 | ||||||
|  | #define MSG_176                         3176 | ||||||
|  | #define MSG_177                         3177 | ||||||
|  | #define MSG_178                         3178 | ||||||
|  | #define MSG_179                         3179 | ||||||
|  | #define MSG_180                         3180 | ||||||
|  | #define MSG_181                         3181 | ||||||
|  | #define MSG_182                         3182 | ||||||
|  | #define MSG_183                         3183 | ||||||
|  | #define MSG_184                         3184 | ||||||
|  | #define MSG_185                         3185 | ||||||
|  | #define MSG_186                         3186 | ||||||
|  | #define MSG_187                         3187 | ||||||
|  | #define MSG_188                         3188 | ||||||
|  | #define MSG_189                         3189 | ||||||
|  | #define MSG_190                         3190 | ||||||
|  | #define MSG_191                         3191 | ||||||
|  | #define MSG_192                         3192 | ||||||
|  | #define MSG_193                         3193 | ||||||
|  | #define MSG_194                         3194 | ||||||
|  | #define MSG_195                         3195 | ||||||
|  | #define MSG_196                         3196 | ||||||
|  | #define MSG_197                         3197 | ||||||
|  | #define MSG_198                         3198 | ||||||
|  | #define MSG_199                         3199 | ||||||
|  | #define MSG_200                         3200 | ||||||
|  | #define MSG_201                         3201 | ||||||
|  | #define MSG_202                         3202 | ||||||
|  | #define MSG_203                         3203 | ||||||
|  | #define MSG_204                         3204 | ||||||
|  | #define MSG_205                         3205 | ||||||
|  | #define MSG_206                         3206 | ||||||
|  | #define MSG_207                         3207 | ||||||
|  | #define MSG_208                         3208 | ||||||
|  | #define MSG_209                         3209 | ||||||
|  | #define MSG_210                         3210 | ||||||
|  | #define MSG_211                         3211 | ||||||
|  | #define MSG_212                         3212 | ||||||
|  | #define MSG_213                         3213 | ||||||
|  | #define MSG_214                         3214 | ||||||
|  | #define MSG_215                         3215 | ||||||
|  | #define MSG_216                         3216 | ||||||
|  | #define MSG_217                         3217 | ||||||
|  | #define MSG_218                         3218 | ||||||
|  | #define MSG_219                         3219 | ||||||
|  | #define MSG_220                         3220 | ||||||
|  | #define MSG_221                         3221 | ||||||
|  | #define MSG_222                         3222 | ||||||
|  | #define MSG_223                         3223 | ||||||
|  | #define MSG_224                         3224 | ||||||
|  | #define MSG_225                         3225 | ||||||
|  | #define MSG_226                         3226 | ||||||
|  | #define MSG_227                         3227 | ||||||
|  | #define MSG_228                         3228 | ||||||
|  | #define MSG_229                         3229 | ||||||
|  | #define MSG_230                         3230 | ||||||
|  | #define MSG_231                         3231 | ||||||
|  | #define MSG_232                         3232 | ||||||
|  | #define MSG_233                         3233 | ||||||
|  | #define MSG_234                         3234 | ||||||
|  | #define MSG_235                         3235 | ||||||
|  | #define MSG_236                         3236 | ||||||
|  | #define MSG_237                         3237 | ||||||
|  | #define MSG_238                         3238 | ||||||
|  | #define MSG_239                         3239 | ||||||
|  | #define MSG_240                         3240 | ||||||
|  | #define MSG_241                         3241 | ||||||
|  | #define MSG_242                         3242 | ||||||
|  | #define MSG_243                         3243 | ||||||
|  | #define MSG_244                         3244 | ||||||
|  | #define MSG_245                         3245 | ||||||
|  | #define MSG_246                         3246 | ||||||
|  | #define MSG_247                         3247 | ||||||
|  | #define MSG_248                         3248 | ||||||
|  | #define MSG_249                         3249 | ||||||
|  | #define MSG_250                         3250 | ||||||
|  | #define MSG_251                         3251 | ||||||
|  | #define MSG_252                         3252 | ||||||
|  | #define MSG_253                         3253 | ||||||
|  | #define MSG_254                         3254 | ||||||
|  | #define MSG_255                         3255 | ||||||
|  | #define MSG_256                         3256 | ||||||
|  | #define MSG_257                         3257 | ||||||
|  | #define MSG_258                         3258 | ||||||
| 
 | 
 | ||||||
| // Next default values for new objects
 | // Next default values for new objects
 | ||||||
| // 
 | // 
 | ||||||
| #ifdef APSTUDIO_INVOKED | #ifdef APSTUDIO_INVOKED | ||||||
| #ifndef APSTUDIO_READONLY_SYMBOLS | #ifndef APSTUDIO_READONLY_SYMBOLS | ||||||
| #define _APS_NO_MFC                     1 | #define _APS_NO_MFC                     1 | ||||||
| #define _APS_NEXT_RESOURCE_VALUE        113 | #define _APS_NEXT_RESOURCE_VALUE        404 | ||||||
| #define _APS_NEXT_COMMAND_VALUE         40001 | #define _APS_NEXT_COMMAND_VALUE         40001 | ||||||
| #define _APS_NEXT_CONTROL_VALUE         1071 | #define _APS_NEXT_CONTROL_VALUE         1071 | ||||||
| #define _APS_NEXT_SYMED_VALUE           101 | #define _APS_NEXT_SYMED_VALUE           4000 | ||||||
| #endif | #endif | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
							
								
								
									
										417
									
								
								src/rufus.c
									
										
									
									
									
								
							
							
						
						
									
										417
									
								
								src/rufus.c
									
										
									
									
									
								
							|  | @ -40,6 +40,7 @@ | ||||||
| #include "resource.h" | #include "resource.h" | ||||||
| #include "rufus.h" | #include "rufus.h" | ||||||
| #include "registry.h" | #include "registry.h" | ||||||
|  | #include "localization.h" | ||||||
| 
 | 
 | ||||||
| /* Redefinitions for WDK and MinGW */ | /* Redefinitions for WDK and MinGW */ | ||||||
| #ifndef PBM_SETSTATE | #ifndef PBM_SETSTATE | ||||||
|  | @ -88,12 +89,6 @@ struct { | ||||||
| const char* FileSystemLabel[FS_MAX] = { "FAT", "FAT32", "NTFS", "UDF", "exFAT" }; | const char* FileSystemLabel[FS_MAX] = { "FAT", "FAT32", "NTFS", "UDF", "exFAT" }; | ||||||
| // Number of steps for each FS for FCC_STRUCTURE_PROGRESS
 | // Number of steps for each FS for FCC_STRUCTURE_PROGRESS
 | ||||||
| const int nb_steps[FS_MAX] = { 5, 5, 12, 1, 10 }; | const int nb_steps[FS_MAX] = { 5, 5, 12, 1, 10 }; | ||||||
| // Don't ask me - just following the MS "standard" here
 |  | ||||||
| // We hijack 256 as a "Default" for UDF, since we can't set clustersize there
 |  | ||||||
| static const char* ClusterSizeLabel[] = { "Default", "512 bytes", "1024 bytes","2048 bytes","4096 bytes","8192 bytes", |  | ||||||
| 	"16 kilobytes", "32 kilobytes", "64 kilobytes", "128 kilobytes", "256 kilobytes", "512 kilobytes", |  | ||||||
| 	"1024 kilobytes","2048 kilobytes","4096 kilobytes","8192 kilobytes","16 megabytes","32 megabytes" }; |  | ||||||
| static const char* BiosTypeLabel[BT_MAX] = { "BIOS", "UEFI" }; |  | ||||||
| static const char* PartitionTypeLabel[2] = { "MBR", "GPT" }; | static const char* PartitionTypeLabel[2] = { "MBR", "GPT" }; | ||||||
| static BOOL existing_key = FALSE;	// For LGP set/restore
 | static BOOL existing_key = FALSE;	// For LGP set/restore
 | ||||||
| static BOOL size_check = TRUE; | static BOOL size_check = TRUE; | ||||||
|  | @ -101,6 +96,8 @@ static BOOL log_displayed = FALSE; | ||||||
| static BOOL iso_provided = FALSE; | static BOOL iso_provided = FALSE; | ||||||
| extern BOOL force_large_fat32, enable_joliet, enable_rockridge; | extern BOOL force_large_fat32, enable_joliet, enable_rockridge; | ||||||
| static int selection_default; | static int selection_default; | ||||||
|  | static loc_cmd* selected_locale = NULL; | ||||||
|  | char ClusterSizeLabel[MAX_CLUSTER_SIZES][64]; | ||||||
| char msgbox[1024], msgbox_title[32]; | char msgbox[1024], msgbox_title[32]; | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  | @ -148,6 +145,23 @@ static float previous_end; | ||||||
| #define MB       1048576LL | #define MB       1048576LL | ||||||
| #define GB    1073741824LL | #define GB    1073741824LL | ||||||
| #define TB 1099511627776LL | #define TB 1099511627776LL | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Fill in the cluster size names | ||||||
|  |  */ | ||||||
|  | static void SetClusterSizeLabels(void) | ||||||
|  | { | ||||||
|  | 	unsigned int i, j, k; | ||||||
|  | 	safe_sprintf(ClusterSizeLabel[0], 64, lmprintf(MSG_029)); | ||||||
|  | 	for (i=512, j=1, k=MSG_026; j<MAX_CLUSTER_SIZES; i<<=1, j++) { | ||||||
|  | 		if (i > 8192) { | ||||||
|  | 			i /= 1024; | ||||||
|  | 			k++; | ||||||
|  | 		} | ||||||
|  | 		safe_sprintf(ClusterSizeLabel[j], 64, "%d %s", i, lmprintf(k)); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
| /* 
 | /* 
 | ||||||
|  * Set cluster size values according to http://support.microsoft.com/kb/140365
 |  * Set cluster size values according to http://support.microsoft.com/kb/140365
 | ||||||
|  * this call will return FALSE if we can't find a supportable FS for the drive |  * this call will return FALSE if we can't find a supportable FS for the drive | ||||||
|  | @ -157,7 +171,7 @@ static BOOL DefineClusterSizes(void) | ||||||
| 	LONGLONG i; | 	LONGLONG i; | ||||||
| 	int fs; | 	int fs; | ||||||
| 	BOOL r = FALSE; | 	BOOL r = FALSE; | ||||||
| 	char tmp[64] = ""; | 	char tmp[64] = "", *entry; | ||||||
| 
 | 
 | ||||||
| 	default_fs = FS_UNKNOWN; | 	default_fs = FS_UNKNOWN; | ||||||
| 	memset(&SelectedDrive.ClusterSize, 0, sizeof(SelectedDrive.ClusterSize)); | 	memset(&SelectedDrive.ClusterSize, 0, sizeof(SelectedDrive.ClusterSize)); | ||||||
|  | @ -278,11 +292,13 @@ out: | ||||||
| 				safe_strcat(tmp, sizeof(tmp), "Large "); | 				safe_strcat(tmp, sizeof(tmp), "Large "); | ||||||
| 			safe_strcat(tmp, sizeof(tmp), FileSystemLabel[fs]); | 			safe_strcat(tmp, sizeof(tmp), FileSystemLabel[fs]); | ||||||
| 			if (default_fs == FS_UNKNOWN) { | 			if (default_fs == FS_UNKNOWN) { | ||||||
| 				safe_strcat(tmp, sizeof(tmp), " (Default)"); | 				entry = lmprintf(MSG_030, tmp); | ||||||
| 				default_fs = fs; | 				default_fs = fs; | ||||||
|  | 			} else { | ||||||
|  | 				entry = tmp; | ||||||
| 			} | 			} | ||||||
| 			IGNORE_RETVAL(ComboBox_SetItemData(hFileSystem,  | 			IGNORE_RETVAL(ComboBox_SetItemData(hFileSystem,  | ||||||
| 				ComboBox_AddStringU(hFileSystem, tmp), fs)); | 				ComboBox_AddStringU(hFileSystem, entry), fs)); | ||||||
| 			r = TRUE; | 			r = TRUE; | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | @ -299,7 +315,7 @@ out: | ||||||
|  */ |  */ | ||||||
| static BOOL SetClusterSizes(int FSType) | static BOOL SetClusterSizes(int FSType) | ||||||
| { | { | ||||||
| 	char szClustSize[64]; | 	char* szClustSize; | ||||||
| 	int i, k, default_index = 0; | 	int i, k, default_index = 0; | ||||||
| 	ULONG j; | 	ULONG j; | ||||||
| 
 | 
 | ||||||
|  | @ -317,10 +333,11 @@ static BOOL SetClusterSizes(int FSType) | ||||||
| 
 | 
 | ||||||
| 	for(i=0,j=0x100,k=0;j<0x10000000;i++,j<<=1) { | 	for(i=0,j=0x100,k=0;j<0x10000000;i++,j<<=1) { | ||||||
| 		if (j & SelectedDrive.ClusterSize[FSType].Allowed) { | 		if (j & SelectedDrive.ClusterSize[FSType].Allowed) { | ||||||
| 			safe_sprintf(szClustSize, sizeof(szClustSize), "%s", ClusterSizeLabel[i]); |  | ||||||
| 			if (j == SelectedDrive.ClusterSize[FSType].Default) { | 			if (j == SelectedDrive.ClusterSize[FSType].Default) { | ||||||
| 				safe_strcat(szClustSize, sizeof(szClustSize), " (Default)"); | 				szClustSize = lmprintf(MSG_030, ClusterSizeLabel[i]); | ||||||
| 				default_index = k; | 				default_index = k; | ||||||
|  | 			} else { | ||||||
|  | 				szClustSize = ClusterSizeLabel[i]; | ||||||
| 			} | 			} | ||||||
| 			IGNORE_RETVAL(ComboBox_SetItemData(hClusterSize, ComboBox_AddStringU(hClusterSize, szClustSize), j)); | 			IGNORE_RETVAL(ComboBox_SetItemData(hClusterSize, ComboBox_AddStringU(hClusterSize, szClustSize), j)); | ||||||
| 			k++; | 			k++; | ||||||
|  | @ -470,15 +487,12 @@ static void SetPartitionSchemeTooltip(void) | ||||||
| 	bt = GETBIOSTYPE((int)ComboBox_GetItemData(hPartitionScheme, ComboBox_GetCurSel(hPartitionScheme))); | 	bt = GETBIOSTYPE((int)ComboBox_GetItemData(hPartitionScheme, ComboBox_GetCurSel(hPartitionScheme))); | ||||||
| 	pt = GETPARTTYPE((int)ComboBox_GetItemData(hPartitionScheme, ComboBox_GetCurSel(hPartitionScheme))); | 	pt = GETPARTTYPE((int)ComboBox_GetItemData(hPartitionScheme, ComboBox_GetCurSel(hPartitionScheme))); | ||||||
| 	if (bt == BT_BIOS) { | 	if (bt == BT_BIOS) { | ||||||
| 		CreateTooltip(hPartitionScheme, "Usually the safest choice. If you have an UEFI computer and want to install " | 		CreateTooltip(hPartitionScheme, lmprintf(MSG_150), 15000); | ||||||
| 			"an OS in EFI mode however, you should select one of the options below", 15000); |  | ||||||
| 	} else { | 	} else { | ||||||
| 		if (pt == PARTITION_STYLE_MBR) { | 		if (pt == PARTITION_STYLE_MBR) { | ||||||
| 			CreateTooltip(hPartitionScheme, "Use this if you want to install an OS in EFI mode, but need to access " | 			CreateTooltip(hPartitionScheme, lmprintf(MSG_151), 15000); | ||||||
| 				"the USB content from Windows XP", 15000); |  | ||||||
| 		} else { | 		} else { | ||||||
| 			CreateTooltip(hPartitionScheme, "The preferred option to install an OS in EFI mode and when " | 			CreateTooltip(hPartitionScheme, lmprintf(MSG_152), 15000); | ||||||
| 				"USB access is not required for Windows XP", 15000); |  | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | @ -489,8 +503,6 @@ static void SetPartitionSchemeTooltip(void) | ||||||
| static BOOL PopulateProperties(int ComboIndex) | static BOOL PopulateProperties(int ComboIndex) | ||||||
| { | { | ||||||
| 	double HumanReadableSize; | 	double HumanReadableSize; | ||||||
| 	char capacity[64]; |  | ||||||
| 	static char* suffix[] = { "B", "KB", "MB", "GB", "TB", "PB"}; |  | ||||||
| 	char no_label[] = STR_NO_LABEL; | 	char no_label[] = STR_NO_LABEL; | ||||||
| 	int i, j, pt, bt; | 	int i, j, pt, bt; | ||||||
| 
 | 
 | ||||||
|  | @ -510,7 +522,7 @@ static BOOL PopulateProperties(int ComboIndex) | ||||||
| 	EnableBootOptions(TRUE); | 	EnableBootOptions(TRUE); | ||||||
| 
 | 
 | ||||||
| 	HumanReadableSize = (double)SelectedDrive.DiskSize; | 	HumanReadableSize = (double)SelectedDrive.DiskSize; | ||||||
| 	for (i=1; i<ARRAYSIZE(suffix); i++) { | 	for (i=1; i<MAX_SIZE_SUFFIXES; i++) { | ||||||
| 		HumanReadableSize /= 1024.0; | 		HumanReadableSize /= 1024.0; | ||||||
| 		if (HumanReadableSize < 512.0) { | 		if (HumanReadableSize < 512.0) { | ||||||
| 			for (j=0; j<3; j++) { | 			for (j=0; j<3; j++) { | ||||||
|  | @ -520,14 +532,14 @@ static BOOL PopulateProperties(int ComboIndex) | ||||||
| 					continue; | 					continue; | ||||||
| 				bt = (j==0)?BT_BIOS:BT_UEFI; | 				bt = (j==0)?BT_BIOS:BT_UEFI; | ||||||
| 				pt = (j==2)?PARTITION_STYLE_GPT:PARTITION_STYLE_MBR; | 				pt = (j==2)?PARTITION_STYLE_GPT:PARTITION_STYLE_MBR; | ||||||
| 				safe_sprintf(capacity, sizeof(capacity), "%s partition scheme for %s%s computer%s", | 				IGNORE_RETVAL(ComboBox_SetItemData(hPartitionScheme, ComboBox_AddStringU(hPartitionScheme, | ||||||
| 					PartitionTypeLabel[pt], BiosTypeLabel[bt], (j==0)?" or UEFI":"", (j==0)?"s":""); | 					lmprintf(MSG_031+j, PartitionTypeLabel[pt])), (bt<<16)|pt)); | ||||||
| 				IGNORE_RETVAL(ComboBox_SetItemData(hPartitionScheme, ComboBox_AddStringU(hPartitionScheme, capacity), (bt<<16)|pt)); | 
 | ||||||
| 			} | 			} | ||||||
| 			break; | 			break; | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	if (i >= ARRAYSIZE(suffix)) | 	if (i >= MAX_SIZE_SUFFIXES) | ||||||
| 		uprintf("Could not populate partition scheme data\n"); | 		uprintf("Could not populate partition scheme data\n"); | ||||||
| 	if (SelectedDrive.PartitionType == PARTITION_STYLE_GPT) { | 	if (SelectedDrive.PartitionType == PARTITION_STYLE_GPT) { | ||||||
| 		j = 2; | 		j = 2; | ||||||
|  | @ -548,10 +560,10 @@ static BOOL PopulateProperties(int ComboIndex) | ||||||
| 	// If we're beneath the tolerance, round proposed label to an integer, if not, show two decimal point
 | 	// If we're beneath the tolerance, round proposed label to an integer, if not, show two decimal point
 | ||||||
| 	if (fabs(HumanReadableSize / ceil(HumanReadableSize) - 1.0) < PROPOSEDLABEL_TOLERANCE) { | 	if (fabs(HumanReadableSize / ceil(HumanReadableSize) - 1.0) < PROPOSEDLABEL_TOLERANCE) { | ||||||
| 		safe_sprintf(SelectedDrive.proposed_label, sizeof(SelectedDrive.proposed_label), | 		safe_sprintf(SelectedDrive.proposed_label, sizeof(SelectedDrive.proposed_label), | ||||||
| 			"%0.0f%s", ceil(HumanReadableSize), suffix[i]); | 			"%0.0f%s", ceil(HumanReadableSize), lmprintf(MSG_020+i)); | ||||||
| 	} else { | 	} else { | ||||||
| 		safe_sprintf(SelectedDrive.proposed_label, sizeof(SelectedDrive.proposed_label), | 		safe_sprintf(SelectedDrive.proposed_label, sizeof(SelectedDrive.proposed_label), | ||||||
| 			"%0.2f%s", HumanReadableSize, suffix[i]); | 			"%0.2f%s", HumanReadableSize, lmprintf(MSG_020+i)); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// If no existing label is available and no ISO is selected, propose one according to the size (eg: "256MB", "8GB")
 | 	// If no existing label is available and no ISO is selected, propose one according to the size (eg: "256MB", "8GB")
 | ||||||
|  | @ -584,9 +596,8 @@ static BOOL GetUSBDevices(DWORD devnum) | ||||||
| 	LONG maxwidth = 0; | 	LONG maxwidth = 0; | ||||||
| 	RECT rect; | 	RECT rect; | ||||||
| 	char drive_letter; | 	char drive_letter; | ||||||
| 	char *label, entry[MAX_PATH], buffer[MAX_PATH]; | 	char *label, *entry, buffer[MAX_PATH]; | ||||||
| 	const char* usbstor_name = "USBSTOR"; | 	const char* usbstor_name = "USBSTOR"; | ||||||
| 	const char* generic_friendly_name = "USB Storage Device (Generic)"; |  | ||||||
| 	GUID _GUID_DEVINTERFACE_DISK =			// only known to some...
 | 	GUID _GUID_DEVINTERFACE_DISK =			// only known to some...
 | ||||||
| 		{ 0x53f56307L, 0xb6bf, 0x11d0, {0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b} }; | 		{ 0x53f56307L, 0xb6bf, 0x11d0, {0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b} }; | ||||||
| 
 | 
 | ||||||
|  | @ -617,7 +628,7 @@ static BOOL GetUSBDevices(DWORD devnum) | ||||||
| 				&datatype, (LPBYTE)buffer, sizeof(buffer), &size)) { | 				&datatype, (LPBYTE)buffer, sizeof(buffer), &size)) { | ||||||
| 			uprintf("SetupDiGetDeviceRegistryProperty (Friendly Name) failed: %s\n", WindowsErrorString()); | 			uprintf("SetupDiGetDeviceRegistryProperty (Friendly Name) failed: %s\n", WindowsErrorString()); | ||||||
| 			// We can afford a failure on this call - just replace the name
 | 			// We can afford a failure on this call - just replace the name
 | ||||||
| 			safe_strcpy(buffer, sizeof(buffer), generic_friendly_name); | 			safe_strcpy(buffer, sizeof(buffer), lmprintf(MSG_045)); | ||||||
| 		} | 		} | ||||||
| 		uprintf("Found device '%s'\n", buffer); | 		uprintf("Found device '%s'\n", buffer); | ||||||
| 
 | 
 | ||||||
|  | @ -684,7 +695,7 @@ static BOOL GetUSBDevices(DWORD devnum) | ||||||
| 				StrArrayAdd(&DriveLabel, label); | 				StrArrayAdd(&DriveLabel, label); | ||||||
| 				// Drive letter ' ' is returned for drives that don't have a volume assigned yet
 | 				// Drive letter ' ' is returned for drives that don't have a volume assigned yet
 | ||||||
| 				if (drive_letter == ' ') { | 				if (drive_letter == ' ') { | ||||||
| 					safe_sprintf(entry, sizeof(entry), "%s (Disk %d)", label, device_number.DeviceNumber); | 					entry = lmprintf(MSG_046, label, device_number.DeviceNumber); | ||||||
| 				} else { | 				} else { | ||||||
| 					if (drive_letter == app_dir[0]) { | 					if (drive_letter == app_dir[0]) { | ||||||
| 						uprintf("Removing %c: from the list: This is the disk from which " APPLICATION_NAME " is running!\n", drive_letter); | 						uprintf("Removing %c: from the list: This is the disk from which " APPLICATION_NAME " is running!\n", drive_letter); | ||||||
|  | @ -692,7 +703,7 @@ static BOOL GetUSBDevices(DWORD devnum) | ||||||
| 						safe_free(devint_detail_data); | 						safe_free(devint_detail_data); | ||||||
| 						break; | 						break; | ||||||
| 					} | 					} | ||||||
| 					safe_sprintf(entry, sizeof(entry), "%s (%c:)", label, drive_letter); | 					entry = lmprintf(MSG_047, label, drive_letter); | ||||||
| 				} | 				} | ||||||
| 				IGNORE_RETVAL(ComboBox_SetItemData(hDeviceList, ComboBox_AddStringU(hDeviceList, entry), | 				IGNORE_RETVAL(ComboBox_SetItemData(hDeviceList, ComboBox_AddStringU(hDeviceList, entry), | ||||||
| 					device_number.DeviceNumber + DRIVE_INDEX_MIN)); | 					device_number.DeviceNumber + DRIVE_INDEX_MIN)); | ||||||
|  | @ -850,7 +861,7 @@ void UpdateProgress(int op, float percent) | ||||||
| static void EnableControls(BOOL bEnable) | static void EnableControls(BOOL bEnable) | ||||||
| { | { | ||||||
| 	EnableWindow(GetDlgItem(hMainDialog, IDC_DEVICE), bEnable); | 	EnableWindow(GetDlgItem(hMainDialog, IDC_DEVICE), bEnable); | ||||||
| 	EnableWindow(GetDlgItem(hMainDialog, IDC_PARTITION_SCHEME), bEnable); | 	EnableWindow(GetDlgItem(hMainDialog, IDC_PARTITION_TYPE), bEnable); | ||||||
| 	EnableWindow(GetDlgItem(hMainDialog, IDC_FILESYSTEM), bEnable); | 	EnableWindow(GetDlgItem(hMainDialog, IDC_FILESYSTEM), bEnable); | ||||||
| 	EnableWindow(GetDlgItem(hMainDialog, IDC_CLUSTERSIZE), bEnable); | 	EnableWindow(GetDlgItem(hMainDialog, IDC_CLUSTERSIZE), bEnable); | ||||||
| 	EnableWindow(GetDlgItem(hMainDialog, IDC_LABEL), bEnable); | 	EnableWindow(GetDlgItem(hMainDialog, IDC_LABEL), bEnable); | ||||||
|  | @ -864,7 +875,7 @@ static void EnableControls(BOOL bEnable) | ||||||
| 	EnableWindow(GetDlgItem(hMainDialog, IDC_SET_ICON), bEnable); | 	EnableWindow(GetDlgItem(hMainDialog, IDC_SET_ICON), bEnable); | ||||||
| 	EnableWindow(GetDlgItem(hMainDialog, IDC_ADVANCED), bEnable); | 	EnableWindow(GetDlgItem(hMainDialog, IDC_ADVANCED), bEnable); | ||||||
| 	EnableWindow(GetDlgItem(hMainDialog, IDC_ENABLE_FIXED_DISKS), bEnable); | 	EnableWindow(GetDlgItem(hMainDialog, IDC_ENABLE_FIXED_DISKS), bEnable); | ||||||
| 	SetDlgItemTextA(hMainDialog, IDCANCEL, bEnable?"Close":"Cancel"); | 	SetDlgItemTextU(hMainDialog, IDCANCEL, lmprintf(bEnable?MSG_006:MSG_007)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* Callback for the log window */ | /* Callback for the log window */ | ||||||
|  | @ -878,6 +889,7 @@ BOOL CALLBACK LogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) | ||||||
| 
 | 
 | ||||||
| 	switch (message) { | 	switch (message) { | ||||||
| 	case WM_INITDIALOG: | 	case WM_INITDIALOG: | ||||||
|  | 		apply_localization(IDD_LOG, hDlg); | ||||||
| 		hLog = GetDlgItem(hDlg, IDC_LOG_EDIT); | 		hLog = GetDlgItem(hDlg, IDC_LOG_EDIT); | ||||||
| 		// Increase the size of our log textbox to MAX_LOG_SIZE (unsigned word)
 | 		// Increase the size of our log textbox to MAX_LOG_SIZE (unsigned word)
 | ||||||
| 		PostMessage(hLog, EM_LIMITTEXT, MAX_LOG_SIZE , 0); | 		PostMessage(hLog, EM_LIMITTEXT, MAX_LOG_SIZE , 0); | ||||||
|  | @ -907,7 +919,7 @@ BOOL CALLBACK LogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) | ||||||
| 				log_size = GetDlgItemTextU(hDlg, IDC_LOG_EDIT, log_buffer, log_size); | 				log_size = GetDlgItemTextU(hDlg, IDC_LOG_EDIT, log_buffer, log_size); | ||||||
| 				if (log_size != 0) { | 				if (log_size != 0) { | ||||||
| 					log_size--;	// remove NUL terminator
 | 					log_size--;	// remove NUL terminator
 | ||||||
| 					filepath =  FileDialog(TRUE, app_dir, "rufus.log", "log", "Rufus log"); | 					filepath =  FileDialog(TRUE, app_dir, "rufus.log", "log", lmprintf(MSG_108)); | ||||||
| 					if (filepath != NULL) { | 					if (filepath != NULL) { | ||||||
| 						FileIO(TRUE, filepath, &log_buffer, &log_size); | 						FileIO(TRUE, filepath, &log_buffer, &log_size); | ||||||
| 					} | 					} | ||||||
|  | @ -920,6 +932,7 @@ BOOL CALLBACK LogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) | ||||||
| 		break; | 		break; | ||||||
| 	case WM_CLOSE: | 	case WM_CLOSE: | ||||||
| 		ShowWindow(hDlg, SW_HIDE); | 		ShowWindow(hDlg, SW_HIDE); | ||||||
|  | 		reset_localization(IDD_LOG); | ||||||
| 		log_displayed = FALSE; | 		log_displayed = FALSE; | ||||||
| 		return TRUE; | 		return TRUE; | ||||||
| 	} | 	} | ||||||
|  | @ -960,14 +973,7 @@ static void CALLBACK BlockingTimer(HWND hWnd, UINT uMsg, UINT_PTR idEvent, DWORD | ||||||
| 		// A write or close operation hasn't made any progress since our last check
 | 		// A write or close operation hasn't made any progress since our last check
 | ||||||
| 		user_notified = TRUE; | 		user_notified = TRUE; | ||||||
| 		uprintf("Blocking I/O operation detected\n"); | 		uprintf("Blocking I/O operation detected\n"); | ||||||
| 		MessageBoxU(hMainDialog, | 		MessageBoxU(hMainDialog, lmprintf(MSG_080), lmprintf(MSG_048), MB_OK|MB_ICONINFORMATION); | ||||||
| 			APPLICATION_NAME " detected that Windows is still flushing its internal buffers\n" |  | ||||||
| 			"onto the USB device.\n\n" |  | ||||||
| 			"Depending on the speed of your USB device, this operation may\n" |  | ||||||
| 			"take a long time to complete, especially for large files.\n\n" |  | ||||||
| 			"We recommend that you let Windows finish, to avoid corruption.\n" |  | ||||||
| 			"But if you grow tired of waiting, you can just unplug the device...", |  | ||||||
| 			RUFUS_BLOCKING_IO_TITLE, MB_OK|MB_ICONINFORMATION); |  | ||||||
| 		} else { | 		} else { | ||||||
| 			last_iso_blocking_status = iso_blocking_status; | 			last_iso_blocking_status = iso_blocking_status; | ||||||
| 		} | 		} | ||||||
|  | @ -979,6 +985,7 @@ BOOL CALLBACK ISOProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) | ||||||
| { | { | ||||||
| 	switch (message) { | 	switch (message) { | ||||||
| 	case WM_INITDIALOG: | 	case WM_INITDIALOG: | ||||||
|  | 		apply_localization(IDD_ISO_EXTRACT, hDlg); | ||||||
| 		hISOProgressBar = GetDlgItem(hDlg, IDC_PROGRESS); | 		hISOProgressBar = GetDlgItem(hDlg, IDC_PROGRESS); | ||||||
| 		hISOFileName = GetDlgItem(hDlg, IDC_ISO_FILENAME); | 		hISOFileName = GetDlgItem(hDlg, IDC_ISO_FILENAME); | ||||||
| 		// Use maximum granularity for the progress bar
 | 		// Use maximum granularity for the progress bar
 | ||||||
|  | @ -999,7 +1006,7 @@ BOOL CALLBACK ISOProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) | ||||||
| 		switch (LOWORD(wParam)) { | 		switch (LOWORD(wParam)) { | ||||||
| 		case IDC_ISO_ABORT: | 		case IDC_ISO_ABORT: | ||||||
| 			FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_CANCELLED; | 			FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_CANCELLED; | ||||||
| 			PrintStatus(0, FALSE, "Cancelling - Please wait..."); | 			PrintStatus(0, FALSE, lmprintf(MSG_201)); | ||||||
| 			uprintf("Cancelling (from ISO proc.)\n"); | 			uprintf("Cancelling (from ISO proc.)\n"); | ||||||
| 			EnableWindow(GetDlgItem(hISOProgressDlg, IDC_ISO_ABORT), FALSE); | 			EnableWindow(GetDlgItem(hISOProgressDlg, IDC_ISO_ABORT), FALSE); | ||||||
| 			if (format_thid != NULL) | 			if (format_thid != NULL) | ||||||
|  | @ -1027,10 +1034,10 @@ DWORD WINAPI ISOScanThread(LPVOID param) | ||||||
| 
 | 
 | ||||||
| 	if (iso_path == NULL) | 	if (iso_path == NULL) | ||||||
| 		goto out; | 		goto out; | ||||||
| 	PrintStatus(0, TRUE, "Scanning ISO image...\n"); | 	PrintStatus(0, TRUE, lmprintf(MSG_202)); | ||||||
| 	if (!ExtractISO(iso_path, "", TRUE)) { | 	if (!ExtractISO(iso_path, "", TRUE)) { | ||||||
| 		SendMessage(hISOProgressDlg, UM_ISO_EXIT, 0, 0); | 		SendMessage(hISOProgressDlg, UM_ISO_EXIT, 0, 0); | ||||||
| 		PrintStatus(0, TRUE, "Failed to scan ISO image."); | 		PrintStatus(0, TRUE, lmprintf(MSG_203)); | ||||||
| 		safe_free(iso_path); | 		safe_free(iso_path); | ||||||
| 		goto out; | 		goto out; | ||||||
| 	} | 	} | ||||||
|  | @ -1047,9 +1054,7 @@ DWORD WINAPI ISOScanThread(LPVOID param) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	if ((!iso_report.has_bootmgr) && (!iso_report.has_isolinux) && (!IS_WINPE(iso_report.winpe)) && (!iso_report.has_efi)) { | 	if ((!iso_report.has_bootmgr) && (!iso_report.has_isolinux) && (!IS_WINPE(iso_report.winpe)) && (!iso_report.has_efi)) { | ||||||
| 		MessageBoxU(hMainDialog, "This version of " APPLICATION_NAME " only supports bootable ISOs\n" | 		MessageBoxU(hMainDialog, lmprintf(MSG_082), lmprintf(MSG_081), MB_OK|MB_ICONINFORMATION); | ||||||
| 			"based on bootmgr/WinPE, isolinux or EFI.\n" |  | ||||||
| 			"This ISO doesn't appear to use either...", "Unsupported ISO", MB_OK|MB_ICONINFORMATION); |  | ||||||
| 		safe_free(iso_path); | 		safe_free(iso_path); | ||||||
| 		SetMBRProps(); | 		SetMBRProps(); | ||||||
| 	} else if (!iso_report.has_syslinux_v5) {	// This check is for Syslinux v4.x or earlier
 | 	} else if (!iso_report.has_syslinux_v5) {	// This check is for Syslinux v4.x or earlier
 | ||||||
|  | @ -1063,18 +1068,10 @@ DWORD WINAPI ISOScanThread(LPVOID param) | ||||||
| 					fclose(fd); | 					fclose(fd); | ||||||
| 					use_own_c32[i] = TRUE; | 					use_own_c32[i] = TRUE; | ||||||
| 				} else { | 				} else { | ||||||
| 					PrintStatus(0, FALSE, "Obsolete %s detected", old_c32_name[i]); | 					PrintStatus(0, FALSE, lmprintf(MSG_204, old_c32_name[i])); | ||||||
| 					safe_sprintf(msgbox, sizeof(msgbox), "This ISO image seems to use an obsolete version of '%s'.\n" | 					if (MessageBoxU(hMainDialog, lmprintf(MSG_084, old_c32_name[i], old_c32_name[i]), | ||||||
| 						"Boot menus may not may not display properly because of this.\n\n" | 						 lmprintf(MSG_083, old_c32_name[i]), MB_YESNO|MB_ICONWARNING) == IDYES) { | ||||||
| 						"A newer version can be downloaded by " APPLICATION_NAME " to fix this issue:\n" | 						SetWindowTextU(hISOProgressDlg, lmprintf(MSG_085, old_c32_name[i])); | ||||||
| 						"- Choose 'Yes' to connect to the internet and download the file\n" |  | ||||||
| 						"- Choose 'No' to leave the existing ISO file unmodified\n" |  | ||||||
| 						"If you don't know what to do, you should select 'Yes'.\n\n" |  | ||||||
| 						"Note: The new file will be downloaded in the current directory and once a " |  | ||||||
| 						"'%s' exists there, it will be reused automatically.\n", old_c32_name[i], old_c32_name[i]); |  | ||||||
| 					safe_sprintf(msgbox_title, sizeof(msgbox_title), "Replace %s?", old_c32_name[i]); |  | ||||||
| 					if (MessageBoxU(hMainDialog, msgbox, msgbox_title, MB_YESNO|MB_ICONWARNING) == IDYES) { |  | ||||||
| 						SetWindowTextU(hISOProgressDlg, "Downloading file"); |  | ||||||
| 						SetWindowTextU(hISOFileName, new_c32_url[i]); | 						SetWindowTextU(hISOFileName, new_c32_url[i]); | ||||||
| 						if (DownloadFile(new_c32_url[i], old_c32_name[i], hISOProgressDlg)) | 						if (DownloadFile(new_c32_url[i], old_c32_name[i], hISOProgressDlg)) | ||||||
| 							use_own_c32[i] = TRUE; | 							use_own_c32[i] = TRUE; | ||||||
|  | @ -1088,7 +1085,7 @@ DWORD WINAPI ISOScanThread(LPVOID param) | ||||||
| 		SetFSFromISO(); | 		SetFSFromISO(); | ||||||
| 		SetMBRProps(); | 		SetMBRProps(); | ||||||
| 		for (i=(int)safe_strlen(iso_path); (i>0)&&(iso_path[i]!='\\'); i--); | 		for (i=(int)safe_strlen(iso_path); (i>0)&&(iso_path[i]!='\\'); i--); | ||||||
| 		PrintStatus(0, TRUE, "Using ISO: %s\n", &iso_path[i+1]); | 		PrintStatus(0, TRUE, lmprintf(MSG_205, &iso_path[i+1])); | ||||||
| 		// Some Linux distros, such as Arch Linux, require the USB drive to have
 | 		// Some Linux distros, such as Arch Linux, require the USB drive to have
 | ||||||
| 		// a specific label => copy the one we got from the ISO image
 | 		// a specific label => copy the one we got from the ISO image
 | ||||||
| 		if (iso_report.label[0] != 0) { | 		if (iso_report.label[0] != 0) { | ||||||
|  | @ -1105,28 +1102,17 @@ out: | ||||||
| 	ExitThread(0); | 	ExitThread(0); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void MoveControl(HWND hDlg, int nID, float vertical_shift) | // Move a control along the Y axis according to the advanced mode setting
 | ||||||
| { | void MoveCtrlY(HWND hDlg, int nID, float vertical_shift) { | ||||||
| 	RECT rect; | 	ResizeMoveCtrl(hDlg, GetDlgItem(hDlg, nID), 0, | ||||||
| 	POINT point; | 		(int)(advanced_mode?vertical_shift:-vertical_shift), 0, 0); | ||||||
| 	HWND hControl; |  | ||||||
| 
 |  | ||||||
| 	hControl = GetDlgItem(hDlg, nID); |  | ||||||
| 	GetWindowRect(hControl, &rect); |  | ||||||
| 	point.x = rect.left; |  | ||||||
| 	point.y = rect.top; |  | ||||||
| 	ScreenToClient(hDlg, &point); |  | ||||||
| 	GetClientRect(hControl, &rect); |  | ||||||
| 	MoveWindow(hControl, point.x, point.y + (int)(fScale*(advanced_mode?vertical_shift:-vertical_shift)), |  | ||||||
| 		(rect.right - rect.left), (rect.bottom - rect.top), TRUE); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void SetPassesTooltip(void) | void SetPassesTooltip(void) | ||||||
| { | { | ||||||
| 	char passes_tooltip[32]; | 	const unsigned char pattern[] = BADBLOCK_PATTERNS; | ||||||
| 	safe_strcpy(passes_tooltip, sizeof(passes_tooltip), "Pattern: 0x55, 0xAA, 0xFF, 0x00"); | 	CreateTooltip(hNBPasses, lmprintf(MSG_153 + ComboBox_GetCurSel(hNBPasses), | ||||||
| 	passes_tooltip[13 + ComboBox_GetCurSel(hNBPasses)*6] = 0; | 		pattern[0], pattern[1], pattern[2], pattern[3]), -1); | ||||||
| 	CreateTooltip(hNBPasses, passes_tooltip, -1); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Toggle "advanced" mode
 | // Toggle "advanced" mode
 | ||||||
|  | @ -1147,14 +1133,14 @@ void ToggleAdvanced(void) | ||||||
| 		point.y + (int)(fScale*(advanced_mode?dialog_shift:-dialog_shift)), TRUE); | 		point.y + (int)(fScale*(advanced_mode?dialog_shift:-dialog_shift)), TRUE); | ||||||
| 
 | 
 | ||||||
| 	// Move the status bar up or down
 | 	// Move the status bar up or down
 | ||||||
| 	MoveControl(hMainDialog, IDC_STATUS, dialog_shift); | 	MoveCtrlY(hMainDialog, IDC_STATUS, dialog_shift); | ||||||
| 	MoveControl(hMainDialog, IDC_START, dialog_shift); | 	MoveCtrlY(hMainDialog, IDC_START, dialog_shift); | ||||||
| 	MoveControl(hMainDialog, IDC_PROGRESS, dialog_shift); | 	MoveCtrlY(hMainDialog, IDC_PROGRESS, dialog_shift); | ||||||
| 	MoveControl(hMainDialog, IDC_ABOUT, dialog_shift); | 	MoveCtrlY(hMainDialog, IDC_ABOUT, dialog_shift); | ||||||
| 	MoveControl(hMainDialog, IDC_LOG, dialog_shift); | 	MoveCtrlY(hMainDialog, IDC_LOG, dialog_shift); | ||||||
| 	MoveControl(hMainDialog, IDCANCEL, dialog_shift); | 	MoveCtrlY(hMainDialog, IDCANCEL, dialog_shift); | ||||||
| #ifdef RUFUS_TEST | #ifdef RUFUS_TEST | ||||||
| 	MoveControl(hMainDialogm, IDC_TEST, dialog_shift); | 	MoveCtrlY(hMainDialog, IDC_TEST, dialog_shift); | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| 	// And do the same for the log dialog while we're at it
 | 	// And do the same for the log dialog while we're at it
 | ||||||
|  | @ -1163,9 +1149,9 @@ void ToggleAdvanced(void) | ||||||
| 	point.y = (rect.bottom - rect.top); | 	point.y = (rect.bottom - rect.top); | ||||||
| 	MoveWindow(hLogDlg, rect.left, rect.top, point.x, | 	MoveWindow(hLogDlg, rect.left, rect.top, point.x, | ||||||
| 		point.y + (int)(fScale*(advanced_mode?dialog_shift:-dialog_shift)), TRUE); | 		point.y + (int)(fScale*(advanced_mode?dialog_shift:-dialog_shift)), TRUE); | ||||||
| 	MoveControl(hLogDlg, IDC_LOG_CLEAR, dialog_shift); | 	MoveCtrlY(hLogDlg, IDC_LOG_CLEAR, dialog_shift); | ||||||
| 	MoveControl(hLogDlg, IDC_LOG_SAVE, dialog_shift); | 	MoveCtrlY(hLogDlg, IDC_LOG_SAVE, dialog_shift); | ||||||
| 	MoveControl(hLogDlg, IDCANCEL, dialog_shift); | 	MoveCtrlY(hLogDlg, IDCANCEL, dialog_shift); | ||||||
| 	GetWindowRect(hLog, &rect); | 	GetWindowRect(hLog, &rect); | ||||||
| 	point.x = (rect.right - rect.left); | 	point.x = (rect.right - rect.left); | ||||||
| 	point.y = (rect.bottom - rect.top) + (int)(fScale*(advanced_mode?dialog_shift:-dialog_shift)); | 	point.y = (rect.bottom - rect.top) + (int)(fScale*(advanced_mode?dialog_shift:-dialog_shift)); | ||||||
|  | @ -1179,7 +1165,7 @@ void ToggleAdvanced(void) | ||||||
| 	ShowWindow(GetDlgItem(hMainDialog, IDC_EXTRA_PARTITION), toggle); | 	ShowWindow(GetDlgItem(hMainDialog, IDC_EXTRA_PARTITION), toggle); | ||||||
| 	ShowWindow(GetDlgItem(hMainDialog, IDC_RUFUS_MBR), toggle); | 	ShowWindow(GetDlgItem(hMainDialog, IDC_RUFUS_MBR), toggle); | ||||||
| 	ShowWindow(GetDlgItem(hMainDialog, IDC_DISK_ID), toggle); | 	ShowWindow(GetDlgItem(hMainDialog, IDC_DISK_ID), toggle); | ||||||
| 	ShowWindow(GetDlgItem(hMainDialog, IDC_ADVANCED_GROUP), toggle); | 	ShowWindow(GetDlgItem(hMainDialog, IDS_ADVANCED_OPTIONS_GRP), toggle); | ||||||
| 
 | 
 | ||||||
| 	// Toggle the up/down icon
 | 	// Toggle the up/down icon
 | ||||||
| 	SendMessage(GetDlgItem(hMainDialog, IDC_ADVANCED), BCM_SETIMAGELIST, 0, (LPARAM)(advanced_mode?&bi_up:&bi_down)); | 	SendMessage(GetDlgItem(hMainDialog, IDC_ADVANCED), BCM_SETIMAGELIST, 0, (LPARAM)(advanced_mode?&bi_up:&bi_down)); | ||||||
|  | @ -1189,89 +1175,67 @@ static BOOL BootCheck(void) | ||||||
| { | { | ||||||
| 	int fs, bt, dt, r; | 	int fs, bt, dt, r; | ||||||
| 	FILE* fd; | 	FILE* fd; | ||||||
| 	const char* ldlinux_c32 = "ldlinux.c32"; | 	const char* ldlinux_name = "ldlinux.c32"; | ||||||
| 
 | 
 | ||||||
| 	dt = (int)ComboBox_GetItemData(hBootType, ComboBox_GetCurSel(hBootType)); | 	dt = (int)ComboBox_GetItemData(hBootType, ComboBox_GetCurSel(hBootType)); | ||||||
| 	if (dt == DT_ISO) { | 	if (dt == DT_ISO) { | ||||||
| 		if (iso_path == NULL) { | 		if (iso_path == NULL) { | ||||||
| 			MessageBoxU(hMainDialog, "Please click on the disc button to select a bootable ISO,\n" | 			MessageBoxU(hMainDialog, lmprintf(MSG_087), lmprintf(MSG_086), MB_OK|MB_ICONERROR); | ||||||
| 				"or uncheck the \"Create a bootable disk...\" checkbox.", |  | ||||||
| 				"No ISO image selected", MB_OK|MB_ICONERROR); |  | ||||||
| 			return FALSE; | 			return FALSE; | ||||||
| 		} | 		} | ||||||
| 		if ((size_check) && (iso_report.projected_size > (uint64_t)SelectedDrive.DiskSize)) { | 		if ((size_check) && (iso_report.projected_size > (uint64_t)SelectedDrive.DiskSize)) { | ||||||
| 			MessageBoxU(hMainDialog, "This ISO image is too big " | 			MessageBoxU(hMainDialog, lmprintf(MSG_089), lmprintf(MSG_088), MB_OK|MB_ICONERROR); | ||||||
| 				"for the selected target.", "ISO image too big", MB_OK|MB_ICONERROR); |  | ||||||
| 			return FALSE; | 			return FALSE; | ||||||
| 		} | 		} | ||||||
| 		fs = (int)ComboBox_GetItemData(hFileSystem, ComboBox_GetCurSel(hFileSystem)); | 		fs = (int)ComboBox_GetItemData(hFileSystem, ComboBox_GetCurSel(hFileSystem)); | ||||||
| 		bt = GETBIOSTYPE((int)ComboBox_GetItemData(hPartitionScheme, ComboBox_GetCurSel(hPartitionScheme))); | 		bt = GETBIOSTYPE((int)ComboBox_GetItemData(hPartitionScheme, ComboBox_GetCurSel(hPartitionScheme))); | ||||||
| 		if (bt == BT_UEFI) { | 		if (bt == BT_UEFI) { | ||||||
| 			if (!IS_EFI(iso_report)) { | 			if (!IS_EFI(iso_report)) { | ||||||
| 				MessageBoxU(hMainDialog, "When using UEFI Target Type, only EFI bootable ISO images are supported. " | 				MessageBoxU(hMainDialog, lmprintf(MSG_091), lmprintf(MSG_090), MB_OK|MB_ICONERROR); | ||||||
| 					"Please select an EFI bootable ISO or set the Target Type to BIOS.", "Unsupported ISO", MB_OK|MB_ICONERROR); |  | ||||||
| 				return FALSE; | 				return FALSE; | ||||||
| 			} else if (fs > FS_FAT32) { | 			} else if (fs > FS_FAT32) { | ||||||
| 				MessageBoxU(hMainDialog, "When using UEFI Target Type, only FAT/FAT32 is supported. " | 				MessageBoxU(hMainDialog, lmprintf(MSG_093), lmprintf(MSG_092), MB_OK|MB_ICONERROR); | ||||||
| 					"Please select FAT/FAT32 as the File system or set the Target Type to BIOS.", "Unsupported filesystem", MB_OK|MB_ICONERROR); |  | ||||||
| 				return FALSE; | 				return FALSE; | ||||||
| 			} else if (iso_report.has_4GB_file) { | 			} else if (iso_report.has_4GB_file) { | ||||||
| 				// Who the heck decided that using FAT32 for UEFI boot was a great idea?!?
 | 				// Who the heck decided that using FAT32 for UEFI boot was a great idea?!?
 | ||||||
| 				MessageBoxU(hMainDialog, "This ISO image contains a file larger than 4 GB and cannot be used to create an EFI bootable USB.\r\n" | 				MessageBoxU(hMainDialog, lmprintf(MSG_095), lmprintf(MSG_094), MB_OK|MB_ICONINFORMATION); | ||||||
| 					"This is a limitation from UEFI/FAT32, not from " APPLICATION_NAME ".", |  | ||||||
| 					"Non UEFI compatible ISO", MB_OK|MB_ICONINFORMATION); |  | ||||||
| 				return FALSE; | 				return FALSE; | ||||||
| 			} | 			} | ||||||
| 		} else if ((fs == FS_NTFS) && (!iso_report.has_bootmgr) && (!IS_WINPE(iso_report.winpe))) { | 		} else if ((fs == FS_NTFS) && (!iso_report.has_bootmgr) && (!IS_WINPE(iso_report.winpe))) { | ||||||
| 			if (iso_report.has_isolinux) { | 			if (iso_report.has_isolinux) { | ||||||
| 				MessageBoxU(hMainDialog, "Only FAT/FAT32 is supported for this type of ISO. " | 				MessageBoxU(hMainDialog, lmprintf(MSG_096), lmprintf(MSG_092), MB_OK|MB_ICONERROR); | ||||||
| 					"Please select FAT/FAT32 as the File system.", "Unsupported filesystem", MB_OK|MB_ICONERROR); |  | ||||||
| 			} else { | 			} else { | ||||||
| 				MessageBoxU(hMainDialog, "Only 'bootmgr' or 'WinPE' based ISO " | 				MessageBoxU(hMainDialog, lmprintf(MSG_097), lmprintf(MSG_090), MB_OK|MB_ICONERROR); | ||||||
| 					"images can currently be used with NTFS.", "Unsupported ISO", MB_OK|MB_ICONERROR); |  | ||||||
| 			} | 			} | ||||||
| 			return FALSE; | 			return FALSE; | ||||||
| 		} else if (((fs == FS_FAT16)||(fs == FS_FAT32)) && (!iso_report.has_isolinux)) { | 		} else if (((fs == FS_FAT16)||(fs == FS_FAT32)) && (!iso_report.has_isolinux)) { | ||||||
| 			MessageBoxU(hMainDialog, "FAT/FAT32 can only be used for isolinux based ISO images " | 			MessageBoxU(hMainDialog, lmprintf(MSG_098), lmprintf(MSG_090), MB_OK|MB_ICONERROR); | ||||||
| 				"or when the Target Type is UEFI.", "Unsupported ISO", MB_OK|MB_ICONERROR); |  | ||||||
| 			return FALSE; | 			return FALSE; | ||||||
| 		} else if (((fs == FS_FAT16)||(fs == FS_FAT32)) && (iso_report.has_4GB_file)) { | 		} else if (((fs == FS_FAT16)||(fs == FS_FAT32)) && (iso_report.has_4GB_file)) { | ||||||
| 			MessageBoxU(hMainDialog, "This iso image contains a file larger than 4GB file, which is more than the " | 			MessageBoxU(hMainDialog, lmprintf(MSG_100), lmprintf(MSG_099), MB_OK|MB_ICONERROR); | ||||||
| 				"maximum size allowed for a FAT or FAT32 file system.", "Filesystem limitation", MB_OK|MB_ICONERROR); |  | ||||||
| 			return FALSE; | 			return FALSE; | ||||||
| 		} | 		} | ||||||
| 		if ((bt == BT_UEFI) && (iso_report.has_win7_efi) && (!WimExtractCheck())) { | 		if ((bt == BT_UEFI) && (iso_report.has_win7_efi) && (!WimExtractCheck())) { | ||||||
| 			if (MessageBoxU(hMainDialog, "Your platform cannot extract files from WIM archives. WIM extraction " | 			if (MessageBoxU(hMainDialog, lmprintf(MSG_102), lmprintf(MSG_101), MB_YESNO|MB_ICONERROR) == IDYES) | ||||||
| 				"is required to create EFI bootable Windows 7 and Windows Vista USB drives. You can fix that " |  | ||||||
| 				"by installing a recent version of 7-Zip.\r\nDo you want to visit the 7-zip download page?", |  | ||||||
| 				"Missing WIM support", MB_YESNO|MB_ICONERROR) == IDYES) |  | ||||||
| 				ShellExecuteA(hMainDialog, "open", SEVENZIP_URL, NULL, NULL, SW_SHOWNORMAL); | 				ShellExecuteA(hMainDialog, "open", SEVENZIP_URL, NULL, NULL, SW_SHOWNORMAL); | ||||||
| 			return FALSE; | 			return FALSE; | ||||||
| 		} | 		} | ||||||
| 	} else if (dt == DT_SYSLINUX_V5) { | 	} else if (dt == DT_SYSLINUX_V5) { | ||||||
| 		_chdirU(app_dir); | 		_chdirU(app_dir); | ||||||
| 		fd = fopen(ldlinux_c32, "rb"); | 		fd = fopen(ldlinux_name, "rb"); | ||||||
| 		if (fd != NULL) { | 		if (fd != NULL) { | ||||||
| 			uprintf("Will reuse '%s' for Syslinux v5\n", ldlinux_c32); | 			uprintf("Will reuse '%s' for Syslinux v5\n", ldlinux_name); | ||||||
| 			fclose(fd); | 			fclose(fd); | ||||||
| 		} else { | 		} else { | ||||||
| 			PrintStatus(0, FALSE, "Missing '%s' file", ldlinux_c32); | 			PrintStatus(0, FALSE, lmprintf(MSG_206, ldlinux_name)); | ||||||
| 			safe_sprintf(msgbox, sizeof(msgbox), "Syslinux v5.0 or later requires a '%s' file to be installed.\n" | 			r = MessageBoxU(hMainDialog, lmprintf(MSG_104, ldlinux_name, ldlinux_name), | ||||||
| 				"Because this file is more than 100 KB in size, and always present on Syslinux v5+ ISO images, " | 				lmprintf(MSG_103, ldlinux_name), MB_YESNOCANCEL|MB_ICONWARNING); | ||||||
| 				"it is not embedded in " APPLICATION_NAME ".\n\n" |  | ||||||
| 				APPLICATION_NAME " can download the missing file for you:\n" |  | ||||||
| 				"- Select 'Yes' to connect to the internet and download the file\n" |  | ||||||
| 				"- Select 'No' if you want to manually copy this file on the drive later\n\n" |  | ||||||
| 				"Note: The file will be downloaded in the current directory and once a " |  | ||||||
| 				"'%s' exists there, it will be reused automatically.\n", ldlinux_c32, ldlinux_c32); |  | ||||||
| 			safe_sprintf(msgbox_title, sizeof(msgbox_title), "Download %s?", ldlinux_c32); |  | ||||||
| 			r = MessageBoxU(hMainDialog, msgbox, msgbox_title, MB_YESNOCANCEL|MB_ICONWARNING); |  | ||||||
| 			if (r == IDCANCEL)  | 			if (r == IDCANCEL)  | ||||||
| 				return FALSE; | 				return FALSE; | ||||||
| 			if (r == IDYES) { | 			if (r == IDYES) { | ||||||
| 				SetWindowTextU(hISOProgressDlg, "Downloading file..."); | 				SetWindowTextU(hISOProgressDlg, lmprintf(MSG_085, ldlinux_name)); | ||||||
| 				SetWindowTextU(hISOFileName, ldlinux_c32); | 				SetWindowTextU(hISOFileName, LDLINUX_C32_URL); | ||||||
| 				DownloadFile(LDLINUX_C32_URL, ldlinux_c32, hISOProgressDlg); | 				DownloadFile(LDLINUX_C32_URL, ldlinux_name, hISOProgressDlg); | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | @ -1295,7 +1259,7 @@ void InitDialog(HWND hDlg) | ||||||
| 	// Quite a burden to carry around as parameters
 | 	// Quite a burden to carry around as parameters
 | ||||||
| 	hMainDialog = hDlg; | 	hMainDialog = hDlg; | ||||||
| 	hDeviceList = GetDlgItem(hDlg, IDC_DEVICE); | 	hDeviceList = GetDlgItem(hDlg, IDC_DEVICE); | ||||||
| 	hPartitionScheme = GetDlgItem(hDlg, IDC_PARTITION_SCHEME); | 	hPartitionScheme = GetDlgItem(hDlg, IDC_PARTITION_TYPE); | ||||||
| 	hFileSystem = GetDlgItem(hDlg, IDC_FILESYSTEM); | 	hFileSystem = GetDlgItem(hDlg, IDC_FILESYSTEM); | ||||||
| 	hClusterSize = GetDlgItem(hDlg, IDC_CLUSTERSIZE); | 	hClusterSize = GetDlgItem(hDlg, IDC_CLUSTERSIZE); | ||||||
| 	hLabel = GetDlgItem(hDlg, IDC_LABEL); | 	hLabel = GetDlgItem(hDlg, IDC_LABEL); | ||||||
|  | @ -1344,6 +1308,11 @@ void InitDialog(HWND hDlg) | ||||||
| 	} | 	} | ||||||
| 	uprintf("Windows version: %s %d-bit\n", PrintWindowsVersion(nWindowsVersion), is_x64?64:32); | 	uprintf("Windows version: %s %d-bit\n", PrintWindowsVersion(nWindowsVersion), is_x64?64:32); | ||||||
| 
 | 
 | ||||||
|  | 	// Detect the LCID
 | ||||||
|  | 	uprintf("LCID: 0x%04X\n", GetUserDefaultLCID()); | ||||||
|  | 
 | ||||||
|  | 	SetClusterSizeLabels(); | ||||||
|  | 
 | ||||||
| 	// Prefer FreeDOS to MS-DOS
 | 	// Prefer FreeDOS to MS-DOS
 | ||||||
| 	selection_default = DT_FREEDOS; | 	selection_default = DT_FREEDOS; | ||||||
| 	// Create the status line and initialize the taskbar icon for progress overlay
 | 	// Create the status line and initialize the taskbar icon for progress overlay
 | ||||||
|  | @ -1355,21 +1324,19 @@ void InitDialog(HWND hDlg) | ||||||
| 	SendMessage(hProgress, PBM_SETRANGE, 0, (MAX_PROGRESS<<16) & 0xFFFF0000); | 	SendMessage(hProgress, PBM_SETRANGE, 0, (MAX_PROGRESS<<16) & 0xFFFF0000); | ||||||
| 	// Fill up the passes
 | 	// Fill up the passes
 | ||||||
| 	for (i=0; i<4; i++) { | 	for (i=0; i<4; i++) { | ||||||
| 		safe_sprintf(tmp, sizeof(tmp), "%d Pass%s", i+1, (i==0)?"":"es"); | 		IGNORE_RETVAL(ComboBox_AddStringU(hNBPasses, lmprintf((i==0)?MSG_034:MSG_035, i+1))); | ||||||
| 		IGNORE_RETVAL(ComboBox_AddStringU(hNBPasses, tmp)); |  | ||||||
| 	} | 	} | ||||||
| 	IGNORE_RETVAL(ComboBox_SetCurSel(hNBPasses, 1)); | 	IGNORE_RETVAL(ComboBox_SetCurSel(hNBPasses, 1)); | ||||||
| 	SetPassesTooltip(); | 	SetPassesTooltip(); | ||||||
| 	// Fill up the DOS type dropdown
 | 	// Fill up the DOS type dropdown
 | ||||||
| 	IGNORE_RETVAL(ComboBox_SetItemData(hBootType, ComboBox_AddStringU(hBootType, "MS-DOS"), DT_WINME)); | 	IGNORE_RETVAL(ComboBox_SetItemData(hBootType, ComboBox_AddStringU(hBootType, "MS-DOS"), DT_WINME)); | ||||||
| 	IGNORE_RETVAL(ComboBox_SetItemData(hBootType, ComboBox_AddStringU(hBootType, "FreeDOS"), DT_FREEDOS)); | 	IGNORE_RETVAL(ComboBox_SetItemData(hBootType, ComboBox_AddStringU(hBootType, "FreeDOS"), DT_FREEDOS)); | ||||||
| 	IGNORE_RETVAL(ComboBox_SetItemData(hBootType, ComboBox_AddStringU(hBootType, "ISO Image"), DT_ISO)); | 	IGNORE_RETVAL(ComboBox_SetItemData(hBootType, ComboBox_AddStringU(hBootType, lmprintf(MSG_036)), DT_ISO)); | ||||||
| 	IGNORE_RETVAL(ComboBox_SetCurSel(hBootType, selection_default)); | 	IGNORE_RETVAL(ComboBox_SetCurSel(hBootType, selection_default)); | ||||||
| 	// Fill up the MBR masqueraded disk IDs ("8 disks should be enough for anybody")
 | 	// Fill up the MBR masqueraded disk IDs ("8 disks should be enough for anybody")
 | ||||||
| 	IGNORE_RETVAL(ComboBox_SetItemData(hDiskID, ComboBox_AddStringU(hDiskID, "0x80 (default)"), 0x80)); | 	IGNORE_RETVAL(ComboBox_SetItemData(hDiskID, ComboBox_AddStringU(hDiskID, lmprintf(MSG_030, "0x80")), 0x80)); | ||||||
| 	for (i=1; i<=7; i++) { | 	for (i=1; i<=7; i++) { | ||||||
| 		sprintf(tmp, "0x%02x (%d%s disk)", 0x80+i, i+1, (i==1)?"nd":((i==2)?"rd":"th")); | 		IGNORE_RETVAL(ComboBox_SetItemData(hDiskID, ComboBox_AddStringU(hDiskID, lmprintf(MSG_109, 0x80+i, i+1)), 0x80+i)); | ||||||
| 		IGNORE_RETVAL(ComboBox_SetItemData(hDiskID, ComboBox_AddStringU(hDiskID, tmp), 0x80+i)); |  | ||||||
| 	} | 	} | ||||||
| 	IGNORE_RETVAL(ComboBox_SetCurSel(hDiskID, 0)); | 	IGNORE_RETVAL(ComboBox_SetCurSel(hDiskID, 0)); | ||||||
| 
 | 
 | ||||||
|  | @ -1413,26 +1380,23 @@ void InitDialog(HWND hDlg) | ||||||
| 	SendMessage(GetDlgItem(hDlg, IDC_ADVANCED), BCM_SETIMAGELIST, 0, (LPARAM)&bi_down); | 	SendMessage(GetDlgItem(hDlg, IDC_ADVANCED), BCM_SETIMAGELIST, 0, (LPARAM)&bi_down); | ||||||
| 
 | 
 | ||||||
| 	// Set the various tooltips
 | 	// Set the various tooltips
 | ||||||
| 	CreateTooltip(hFileSystem, "Sets the target filesystem", -1); | 	CreateTooltip(hFileSystem, lmprintf(MSG_157), -1); | ||||||
| 	CreateTooltip(hClusterSize, "Minimum size that each data block occupies", -1); | 	CreateTooltip(hClusterSize, lmprintf(MSG_158), -1); | ||||||
| 	CreateTooltip(hLabel, "Use this field to set the drive label\nInternational characters are accepted", -1); | 	CreateTooltip(hLabel, lmprintf(MSG_159), -1); | ||||||
| 	CreateTooltip(GetDlgItem(hDlg, IDC_ADVANCED), "Toggle advanced options", -1); | 	CreateTooltip(GetDlgItem(hDlg, IDC_ADVANCED), lmprintf(MSG_160), -1); | ||||||
| 	CreateTooltip(GetDlgItem(hDlg, IDC_BADBLOCKS), "Test the device for bad blocks using a byte pattern", -1); | 	CreateTooltip(GetDlgItem(hDlg, IDC_BADBLOCKS), lmprintf(MSG_161), -1); | ||||||
| 	CreateTooltip(GetDlgItem(hDlg, IDC_QUICKFORMAT), "Unchek this box to use the \"slow\" format method", -1); | 	CreateTooltip(GetDlgItem(hDlg, IDC_QUICKFORMAT), lmprintf(MSG_162), -1); | ||||||
| 	CreateTooltip(hBoot, "Check this box to make the USB drive bootable", -1); | 	CreateTooltip(hBoot, lmprintf(MSG_163), -1); | ||||||
| 	CreateTooltip(hBootType, "Boot method", -1); | 	CreateTooltip(hBootType, lmprintf(MSG_164), -1); | ||||||
| 	CreateTooltip(hSelectISO, "Click to select an ISO...", -1); | 	CreateTooltip(hSelectISO, lmprintf(MSG_165), -1); | ||||||
| 	CreateTooltip(GetDlgItem(hDlg, IDC_SET_ICON), "Check this box to allow the display of international labels " | 	CreateTooltip(GetDlgItem(hDlg, IDC_SET_ICON), lmprintf(MSG_166), 10000); | ||||||
| 		"and set a device icon (creates an autorun.inf)", 10000); | 	CreateTooltip(GetDlgItem(hDlg, IDC_RUFUS_MBR), lmprintf(MSG_167), 10000); | ||||||
| 	CreateTooltip(GetDlgItem(hDlg, IDC_RUFUS_MBR), "Install an MBR that allows boot selection and can masquerade the BIOS USB drive ID", 10000); | 	CreateTooltip(hDiskID, lmprintf(MSG_168), 10000); | ||||||
| 	CreateTooltip(hDiskID, "Try to masquerade first bootable USB drive (usually 0x80) as a different disk.\n" | 	CreateTooltip(GetDlgItem(hDlg, IDC_EXTRA_PARTITION), lmprintf(MSG_169), -1); | ||||||
| 		"This should only be necessary for XP installation" , 10000); | 	CreateTooltip(GetDlgItem(hDlg, IDC_ENABLE_FIXED_DISKS), lmprintf(MSG_170), -1); | ||||||
| 	CreateTooltip(GetDlgItem(hDlg, IDC_EXTRA_PARTITION), "Create an extra hidden partition and try to align partitions boundaries.\n" | 	CreateTooltip(GetDlgItem(hDlg, IDC_START), lmprintf(MSG_171), -1); | ||||||
| 		"This can improve boot detection for older BIOSes", -1); | 	CreateTooltip(GetDlgItem(hDlg, IDC_ABOUT), lmprintf(MSG_172), -1); | ||||||
| 	CreateTooltip(GetDlgItem(hDlg, IDC_ENABLE_FIXED_DISKS), "Enable detection for disks not normally detected by " APPLICATION_NAME ". " | 	// TODO: add new tooltips
 | ||||||
| 		"USE AT YOUR OWN RISKS!!!", -1); |  | ||||||
| 	CreateTooltip(GetDlgItem(hDlg, IDC_START), "Start the formatting operation.\nThis will DESTROY any data on the target!", -1); |  | ||||||
| 	CreateTooltip(GetDlgItem(hDlg, IDC_ABOUT), "Licensing information and credits", -1); |  | ||||||
| 
 | 
 | ||||||
| 	ToggleAdvanced();	// We start in advanced mode => go to basic mode
 | 	ToggleAdvanced();	// We start in advanced mode => go to basic mode
 | ||||||
| 
 | 
 | ||||||
|  | @ -1445,9 +1409,10 @@ void InitDialog(HWND hDlg) | ||||||
| 
 | 
 | ||||||
| static void PrintStatus2000(const char* str, BOOL val) | static void PrintStatus2000(const char* str, BOOL val) | ||||||
| { | { | ||||||
| 	PrintStatus(2000, FALSE, "%s %s.", str, (val)?"enabled":"disabled"); | 	PrintStatus(2000, FALSE, (lmprintf((val)?MSG_250:MSG_251, str))); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| /*
 | /*
 | ||||||
|  * Main dialog callback |  * Main dialog callback | ||||||
|  */ |  */ | ||||||
|  | @ -1456,9 +1421,9 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA | ||||||
| 	DRAWITEMSTRUCT* pDI; | 	DRAWITEMSTRUCT* pDI; | ||||||
| 	POINT Point; | 	POINT Point; | ||||||
| 	RECT DialogRect, DesktopRect; | 	RECT DialogRect, DesktopRect; | ||||||
| 	int nDeviceIndex, fs, bt, i, nWidth, nHeight; | 	int nDeviceIndex, fs, bt, i, nWidth, nHeight, nb_devices; | ||||||
| 	static DWORD DeviceNum = 0, LastRefresh = 0; | 	static DWORD DeviceNum = 0, LastRefresh = 0; | ||||||
| 	char tmp[128], str[MAX_PATH]; | 	char tmp[128]; | ||||||
| 	static UINT uBootChecked = BST_CHECKED, uQFChecked; | 	static UINT uBootChecked = BST_CHECKED, uQFChecked; | ||||||
| 	static BOOL first_log_display = TRUE, user_changed_label = FALSE; | 	static BOOL first_log_display = TRUE, user_changed_label = FALSE; | ||||||
| 
 | 
 | ||||||
|  | @ -1497,9 +1462,10 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA | ||||||
| 		break; | 		break; | ||||||
| 
 | 
 | ||||||
| 	case WM_INITDIALOG: | 	case WM_INITDIALOG: | ||||||
|  | 		apply_localization(IDD_DIALOG, hDlg); | ||||||
| 		SetUpdateCheck(); | 		SetUpdateCheck(); | ||||||
| 		// Create the log window (hidden)
 | 		// Create the log window (hidden)
 | ||||||
| 		hLogDlg = CreateDialogA(hMainInstance, MAKEINTRESOURCEA(IDD_LOG), hDlg, (DLGPROC)LogProc);  | 		hLogDlg = CreateDialogW(hMainInstance, MAKEINTRESOURCEW(IDD_LOG), hDlg, (DLGPROC)LogProc);  | ||||||
| 		InitDialog(hDlg); | 		InitDialog(hDlg); | ||||||
| 		GetUSBDevices(0); | 		GetUSBDevices(0); | ||||||
| 		CheckForUpdates(FALSE); | 		CheckForUpdates(FALSE); | ||||||
|  | @ -1533,13 +1499,12 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA | ||||||
| 			EnableWindow(GetDlgItem(hISOProgressDlg, IDC_ISO_ABORT), FALSE); | 			EnableWindow(GetDlgItem(hISOProgressDlg, IDC_ISO_ABORT), FALSE); | ||||||
| 			EnableWindow(GetDlgItem(hDlg, IDCANCEL), FALSE); | 			EnableWindow(GetDlgItem(hDlg, IDCANCEL), FALSE); | ||||||
| 			if (format_thid != NULL) { | 			if (format_thid != NULL) { | ||||||
| 				if (MessageBoxU(hMainDialog, "Cancelling may leave the device in an UNUSABLE state.\r\n" | 				if (MessageBoxU(hMainDialog, lmprintf(MSG_105), lmprintf(MSG_049), | ||||||
| 					"If you are sure you want to cancel, click YES. Otherwise, click NO.", | 					MB_YESNO|MB_ICONWARNING) == IDYES) { | ||||||
| 					RUFUS_CANCELBOX_TITLE, MB_YESNO|MB_ICONWARNING) == IDYES) { |  | ||||||
| 					// Operation may have completed in the meantime
 | 					// Operation may have completed in the meantime
 | ||||||
| 					if (format_thid != NULL) { | 					if (format_thid != NULL) { | ||||||
| 						FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_CANCELLED; | 						FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_CANCELLED; | ||||||
| 						PrintStatus(0, FALSE, "Cancelling - Please wait..."); | 						PrintStatus(0, FALSE, lmprintf(MSG_201)); | ||||||
| 						uprintf("Cancelling (from main app)\n"); | 						uprintf("Cancelling (from main app)\n"); | ||||||
| 						//  Start a timer to detect blocking operations during ISO file extraction
 | 						//  Start a timer to detect blocking operations during ISO file extraction
 | ||||||
| 						if (iso_blocking_status >= 0) { | 						if (iso_blocking_status >= 0) { | ||||||
|  | @ -1606,8 +1571,8 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA | ||||||
| 		case IDC_DEVICE: | 		case IDC_DEVICE: | ||||||
| 			if (HIWORD(wParam) != CBN_SELCHANGE) | 			if (HIWORD(wParam) != CBN_SELCHANGE) | ||||||
| 				break; | 				break; | ||||||
| 			PrintStatus(0, TRUE, "%d device%s found.", ComboBox_GetCount(hDeviceList), | 			nb_devices = ComboBox_GetCount(hDeviceList); | ||||||
| 				(ComboBox_GetCount(hDeviceList)!=1)?"s":""); | 			PrintStatus(0, TRUE, lmprintf((nb_devices==1)?MSG_208:MSG_209, nb_devices)); | ||||||
| 			PopulateProperties(ComboBox_GetCurSel(hDeviceList)); | 			PopulateProperties(ComboBox_GetCurSel(hDeviceList)); | ||||||
| 			SendMessage(hMainDialog, WM_COMMAND, (CBN_SELCHANGE<<16) | IDC_FILESYSTEM, | 			SendMessage(hMainDialog, WM_COMMAND, (CBN_SELCHANGE<<16) | IDC_FILESYSTEM, | ||||||
| 				ComboBox_GetCurSel(hFileSystem)); | 				ComboBox_GetCurSel(hFileSystem)); | ||||||
|  | @ -1617,7 +1582,7 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA | ||||||
| 				break; | 				break; | ||||||
| 			SetPassesTooltip(); | 			SetPassesTooltip(); | ||||||
| 			break; | 			break; | ||||||
| 		case IDC_PARTITION_SCHEME: | 		case IDC_PARTITION_TYPE: | ||||||
| 			if (HIWORD(wParam) != CBN_SELCHANGE) | 			if (HIWORD(wParam) != CBN_SELCHANGE) | ||||||
| 				break; | 				break; | ||||||
| 			SetPartitionSchemeTooltip(); | 			SetPartitionSchemeTooltip(); | ||||||
|  | @ -1673,7 +1638,7 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA | ||||||
| 				IGNORE_RETVAL(ComboBox_SetItemData(hBootType, ComboBox_AddStringU(hBootType, "MS-DOS"), DT_WINME)); | 				IGNORE_RETVAL(ComboBox_SetItemData(hBootType, ComboBox_AddStringU(hBootType, "MS-DOS"), DT_WINME)); | ||||||
| 				IGNORE_RETVAL(ComboBox_SetItemData(hBootType, ComboBox_AddStringU(hBootType, "FreeDOS"), DT_FREEDOS)); | 				IGNORE_RETVAL(ComboBox_SetItemData(hBootType, ComboBox_AddStringU(hBootType, "FreeDOS"), DT_FREEDOS)); | ||||||
| 			} | 			} | ||||||
| 			IGNORE_RETVAL(ComboBox_SetItemData(hBootType, ComboBox_AddStringU(hBootType, "ISO Image"), DT_ISO)); | 			IGNORE_RETVAL(ComboBox_SetItemData(hBootType, ComboBox_AddStringU(hBootType, lmprintf(MSG_036)), DT_ISO)); | ||||||
| 			// If needed (advanced mode) also append a Syslinux option
 | 			// If needed (advanced mode) also append a Syslinux option
 | ||||||
| 			if ( (bt == BT_BIOS) && (((fs == FS_FAT16) || (fs == FS_FAT32)) && (advanced_mode)) ) { | 			if ( (bt == BT_BIOS) && (((fs == FS_FAT16) || (fs == FS_FAT32)) && (advanced_mode)) ) { | ||||||
| 				IGNORE_RETVAL(ComboBox_SetItemData(hBootType, ComboBox_AddStringU(hBootType, "Syslinux 4"), DT_SYSLINUX_V4)); | 				IGNORE_RETVAL(ComboBox_SetItemData(hBootType, ComboBox_AddStringU(hBootType, "Syslinux 4"), DT_SYSLINUX_V4)); | ||||||
|  | @ -1729,9 +1694,9 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA | ||||||
| 				iso_provided = FALSE;	// One off thing...
 | 				iso_provided = FALSE;	// One off thing...
 | ||||||
| 			} else { | 			} else { | ||||||
| 				safe_free(iso_path); | 				safe_free(iso_path); | ||||||
| 				iso_path = FileDialog(FALSE, NULL, "*.iso", "iso", "ISO Image"); | 				iso_path = FileDialog(FALSE, NULL, "*.iso", "iso", lmprintf(MSG_036)); | ||||||
| 				if (iso_path == NULL) { | 				if (iso_path == NULL) { | ||||||
| 					CreateTooltip(hSelectISO, "Click to select...", -1); | 					CreateTooltip(hSelectISO, lmprintf(MSG_173), -1); | ||||||
| 					break; | 					break; | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
|  | @ -1750,7 +1715,7 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA | ||||||
| 		case IDC_ENABLE_FIXED_DISKS: | 		case IDC_ENABLE_FIXED_DISKS: | ||||||
| 			if ((HIWORD(wParam)) == BN_CLICKED) { | 			if ((HIWORD(wParam)) == BN_CLICKED) { | ||||||
| 				enable_fixed_disks = !enable_fixed_disks; | 				enable_fixed_disks = !enable_fixed_disks; | ||||||
| 				PrintStatus2000("Fixed disks detection", enable_fixed_disks); | 				PrintStatus2000(lmprintf(MSG_253), enable_fixed_disks); | ||||||
| 				GetUSBDevices(0); | 				GetUSBDevices(0); | ||||||
| 			} | 			} | ||||||
| 			break; | 			break; | ||||||
|  | @ -1773,9 +1738,8 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA | ||||||
| 					break; | 					break; | ||||||
| 				} | 				} | ||||||
| 				GetWindowTextU(hDeviceList, tmp, ARRAYSIZE(tmp)); | 				GetWindowTextU(hDeviceList, tmp, ARRAYSIZE(tmp)); | ||||||
| 				_snprintf(str, ARRAYSIZE(str), "WARNING: ALL DATA ON DEVICE '%s'\r\nWILL BE DESTROYED.\r\n" | 				if (MessageBoxU(hMainDialog, lmprintf(MSG_003, tmp), | ||||||
| 					"To continue with this operation, click OK. To quit click CANCEL.", tmp); | 					APPLICATION_NAME, MB_OKCANCEL|MB_ICONWARNING) == IDCANCEL) { | ||||||
| 				if (MessageBoxU(hMainDialog, str, APPLICATION_NAME, MB_OKCANCEL|MB_ICONWARNING) == IDCANCEL) { |  | ||||||
| 					format_op_in_progress = FALSE; | 					format_op_in_progress = FALSE; | ||||||
| 					break; | 					break; | ||||||
| 				} | 				} | ||||||
|  | @ -1818,7 +1782,7 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA | ||||||
| 		// You'd think that Windows would let you instantiate a modeless dialog wherever
 | 		// You'd think that Windows would let you instantiate a modeless dialog wherever
 | ||||||
| 		// but you'd be wrong. It must be done in the main callback, hence the custom message.
 | 		// but you'd be wrong. It must be done in the main callback, hence the custom message.
 | ||||||
| 		if (!IsWindow(hISOProgressDlg)) {  | 		if (!IsWindow(hISOProgressDlg)) {  | ||||||
| 			hISOProgressDlg = CreateDialogA(hMainInstance, MAKEINTRESOURCEA(IDD_ISO_EXTRACT), | 			hISOProgressDlg = CreateDialogW(hMainInstance, MAKEINTRESOURCEW(IDD_ISO_EXTRACT), | ||||||
| 				hDlg, (DLGPROC)ISOProc);  | 				hDlg, (DLGPROC)ISOProc);  | ||||||
| 			// The window is not visible by default but takes focus => restore it
 | 			// The window is not visible by default but takes focus => restore it
 | ||||||
| 			SetFocus(hDlg); | 			SetFocus(hDlg); | ||||||
|  | @ -1830,8 +1794,8 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA | ||||||
| 		// Stop the timer
 | 		// Stop the timer
 | ||||||
| 		KillTimer(hMainDialog, TID_APP_TIMER); | 		KillTimer(hMainDialog, TID_APP_TIMER); | ||||||
| 		// Close the cancel MessageBox and Blocking notification if active
 | 		// Close the cancel MessageBox and Blocking notification if active
 | ||||||
| 		SendMessage(FindWindowA(MAKEINTRESOURCEA(32770), RUFUS_CANCELBOX_TITLE), WM_COMMAND, IDNO, 0); | 		SendMessage(FindWindowA(MAKEINTRESOURCEA(32770), lmprintf(MSG_049)), WM_COMMAND, IDNO, 0); | ||||||
| 		SendMessage(FindWindowA(MAKEINTRESOURCEA(32770), RUFUS_BLOCKING_IO_TITLE), WM_COMMAND, IDYES, 0); | 		SendMessage(FindWindowA(MAKEINTRESOURCEA(32770), lmprintf(MSG_049)), WM_COMMAND, IDYES, 0); | ||||||
| 		EnableWindow(GetDlgItem(hISOProgressDlg, IDC_ISO_ABORT), TRUE); | 		EnableWindow(GetDlgItem(hISOProgressDlg, IDC_ISO_ABORT), TRUE); | ||||||
| 		EnableWindow(GetDlgItem(hMainDialog, IDCANCEL), TRUE); | 		EnableWindow(GetDlgItem(hMainDialog, IDCANCEL), TRUE); | ||||||
| 		EnableControls(TRUE); | 		EnableControls(TRUE); | ||||||
|  | @ -1843,17 +1807,17 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA | ||||||
| 			SendMessage(hProgress, PBM_SETPOS, (MAX_PROGRESS+1), 0); | 			SendMessage(hProgress, PBM_SETPOS, (MAX_PROGRESS+1), 0); | ||||||
| 			SendMessage(hProgress, PBM_SETRANGE, 0, (MAX_PROGRESS<<16) & 0xFFFF0000); | 			SendMessage(hProgress, PBM_SETRANGE, 0, (MAX_PROGRESS<<16) & 0xFFFF0000); | ||||||
| 			SetTaskbarProgressState(TASKBAR_NOPROGRESS); | 			SetTaskbarProgressState(TASKBAR_NOPROGRESS); | ||||||
| 			PrintStatus(0, FALSE, "DONE"); | 			PrintStatus(0, FALSE, lmprintf(MSG_210)); | ||||||
| 		} else if (SCODE_CODE(FormatStatus) == ERROR_CANCELLED) { | 		} else if (SCODE_CODE(FormatStatus) == ERROR_CANCELLED) { | ||||||
| 			SendMessage(hProgress, PBM_SETSTATE, (WPARAM)PBST_PAUSED, 0); | 			SendMessage(hProgress, PBM_SETSTATE, (WPARAM)PBST_PAUSED, 0); | ||||||
| 			SetTaskbarProgressState(TASKBAR_PAUSED); | 			SetTaskbarProgressState(TASKBAR_PAUSED); | ||||||
| 			PrintStatus(0, FALSE, "Cancelled"); | 			PrintStatus(0, FALSE, lmprintf(MSG_211)); | ||||||
| 			Notification(MSG_INFO, NULL, "Cancelled", "Operation cancelled by the user."); | 			Notification(MSG_INFO, NULL, lmprintf(MSG_211), lmprintf(MSG_041)); | ||||||
| 		} else { | 		} else { | ||||||
| 			SendMessage(hProgress, PBM_SETSTATE, (WPARAM)PBST_ERROR, 0); | 			SendMessage(hProgress, PBM_SETSTATE, (WPARAM)PBST_ERROR, 0); | ||||||
| 			SetTaskbarProgressState(TASKBAR_ERROR); | 			SetTaskbarProgressState(TASKBAR_ERROR); | ||||||
| 			PrintStatus(0, FALSE, "FAILED"); | 			PrintStatus(0, FALSE, lmprintf(MSG_212)); | ||||||
| 			Notification(MSG_ERROR, NULL, "Error", "Error: %s", StrError(FormatStatus)); | 			Notification(MSG_ERROR, NULL, lmprintf(MSG_042), lmprintf(MSG_043), StrError(FormatStatus)); | ||||||
| 		} | 		} | ||||||
| 		FormatStatus = 0; | 		FormatStatus = 0; | ||||||
| 		format_op_in_progress = FALSE; | 		format_op_in_progress = FALSE; | ||||||
|  | @ -1912,10 +1876,13 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine | ||||||
| 	const char* old_wait_option = "/W"; | 	const char* old_wait_option = "/W"; | ||||||
| 	int i, opt, option_index = 0, argc = 0, si = 0; | 	int i, opt, option_index = 0, argc = 0, si = 0; | ||||||
| 	BOOL attached_console = FALSE; | 	BOOL attached_console = FALSE; | ||||||
|  | 	BYTE* loc_data; | ||||||
|  | 	DWORD loc_size, Size; | ||||||
|  | 	char tmp_path[MAX_PATH], loc_file[MAX_PATH] = "", *locale_name = NULL; | ||||||
| 	char** argv = NULL; | 	char** argv = NULL; | ||||||
| 	wchar_t **wenv, **wargv; | 	wchar_t **wenv, **wargv; | ||||||
| 	PF_DECL(__wgetmainargs); | 	PF_DECL(__wgetmainargs); | ||||||
| 	HANDLE mutex = NULL; | 	HANDLE mutex = NULL, hFile = NULL; | ||||||
| 	HWND hDlg = NULL; | 	HWND hDlg = NULL; | ||||||
| 	MSG msg; | 	MSG msg; | ||||||
| 	int wait_for_mutex = 0; | 	int wait_for_mutex = 0; | ||||||
|  | @ -1938,7 +1905,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine | ||||||
| 		printf("\n"); | 		printf("\n"); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// We have to process the arguments before we acquire the lock
 | 	// We have to process the arguments before we acquire the lock and process the locale
 | ||||||
| 	PF_INIT(__wgetmainargs, msvcrt); | 	PF_INIT(__wgetmainargs, msvcrt); | ||||||
| 	if (pf__wgetmainargs != NULL) { | 	if (pf__wgetmainargs != NULL) { | ||||||
| 		pf__wgetmainargs(&argc, &wargv, &wenv, 1, &si); | 		pf__wgetmainargs(&argc, &wargv, &wenv, 1, &si); | ||||||
|  | @ -1950,7 +1917,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine | ||||||
| 				wait_for_mutex = 150;	// Try to acquire the mutex for 15 seconds
 | 				wait_for_mutex = 150;	// Try to acquire the mutex for 15 seconds
 | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		while ((opt = getopt_long(argc, argv, "?fhi:w:", long_options, &option_index)) != EOF) | 		while ((opt = getopt_long(argc, argv, "?fhi:w:l:", long_options, &option_index)) != EOF) | ||||||
| 			switch (opt) { | 			switch (opt) { | ||||||
| 			case 'f': | 			case 'f': | ||||||
| 				enable_fixed_disks = TRUE; | 				enable_fixed_disks = TRUE; | ||||||
|  | @ -1963,6 +1930,10 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine | ||||||
| 					printf("Could not find ISO image '%s'\n", optarg); | 					printf("Could not find ISO image '%s'\n", optarg); | ||||||
| 				} | 				} | ||||||
| 				break; | 				break; | ||||||
|  | 			case 'l': | ||||||
|  | 				// TODO: accept a locale code such as 0x409
 | ||||||
|  | 				locale_name = optarg; | ||||||
|  | 				break; | ||||||
| 			case 'w': | 			case 'w': | ||||||
| 				wait_for_mutex = atoi(optarg); | 				wait_for_mutex = atoi(optarg); | ||||||
| 				break; | 				break; | ||||||
|  | @ -1976,6 +1947,44 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine | ||||||
| 		uprintf("unable to access UTF-16 args"); | 		uprintf("unable to access UTF-16 args"); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	// Retrieve the current application directory
 | ||||||
|  | 	GetCurrentDirectoryU(MAX_PATH, app_dir); | ||||||
|  | 
 | ||||||
|  | 	// Init localization
 | ||||||
|  | 	init_localization(); | ||||||
|  | 	// Seek for a loc file in the current directory
 | ||||||
|  | 	if (GetFileAttributesU("rufus.loc") == INVALID_FILE_ATTRIBUTES) { | ||||||
|  | 		uprintf("loc file not found in current directory - embedded one will be used"); | ||||||
|  | 
 | ||||||
|  | 		loc_data = (BYTE*)GetResource(hMainInstance, MAKEINTRESOURCEA(IDR_LC_RUFUS_LOC), _RT_RCDATA, "rufus.loc", &loc_size, FALSE); | ||||||
|  | 		GetTempPathU(sizeof(tmp_path), tmp_path); | ||||||
|  | 		GetTempFileNameU(tmp_path, APPLICATION_NAME, 0, loc_file); | ||||||
|  | 
 | ||||||
|  | 		hFile = CreateFileU(loc_file, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, | ||||||
|  | 			NULL, CREATE_ALWAYS, 0, 0); | ||||||
|  | 		if ((hFile == INVALID_HANDLE_VALUE)|| (!WriteFile(hFile, loc_data, loc_size, &Size, 0)) || (loc_size != Size)) { | ||||||
|  | 			safe_closehandle(hFile); | ||||||
|  | 			uprintf("localization: unable to extract '%s': %s.\n", loc_file, WindowsErrorString()); | ||||||
|  | 		} else { | ||||||
|  | 			safe_closehandle(hFile); | ||||||
|  | 			uprintf("localization: extracted data to '%s'\n", loc_file); | ||||||
|  | 		} | ||||||
|  | 	} else { | ||||||
|  | 		safe_sprintf(loc_file, sizeof(loc_file), "%s\\rufus.loc", app_dir); | ||||||
|  | 		uprintf("using external loc file '%s'", loc_file); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if ( (!get_supported_locales(loc_file)) | ||||||
|  | 	  || ((selected_locale = ((locale_name == NULL)?get_locale_from_lcid(GetUserDefaultLCID()):get_locale_from_name(locale_name))) == NULL) ) { | ||||||
|  | 		uprintf("FATAL: Could not access locale!\n"); | ||||||
|  | 		MessageBoxU(NULL, "The locale data is missing. This application will now exit.", | ||||||
|  | 			"Fatal error", MB_ICONSTOP); | ||||||
|  | 		goto out; | ||||||
|  | 	} | ||||||
|  | 	uprintf("localization: using locale '%s'\n", selected_locale->txt[0]); | ||||||
|  | 	get_loc_data_file(loc_file, (long)selected_locale->num[0], (long)selected_locale->num[1], selected_locale->line_nr); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| 	// Prevent 2 applications from running at the same time, unless "/W" is passed as an option
 | 	// Prevent 2 applications from running at the same time, unless "/W" is passed as an option
 | ||||||
| 	// in which case we wait for the mutex to be relinquished
 | 	// in which case we wait for the mutex to be relinquished
 | ||||||
| 	if ((safe_strlen(lpCmdLine)==2) && (lpCmdLine[0] == '/') && (lpCmdLine[1] == 'W')) | 	if ((safe_strlen(lpCmdLine)==2) && (lpCmdLine[0] == '/') && (lpCmdLine[1] == 'W')) | ||||||
|  | @ -1987,9 +1996,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine | ||||||
| 		mutex = CreateMutexA(NULL, TRUE, "Global/" APPLICATION_NAME); | 		mutex = CreateMutexA(NULL, TRUE, "Global/" APPLICATION_NAME); | ||||||
| 	} | 	} | ||||||
| 	if ((mutex == NULL) || (GetLastError() == ERROR_ALREADY_EXISTS)) { | 	if ((mutex == NULL) || (GetLastError() == ERROR_ALREADY_EXISTS)) { | ||||||
| 		MessageBoxU(NULL, "Another " APPLICATION_NAME " application is running.\n" | 		MessageBoxU(NULL, lmprintf(MSG_002), lmprintf(MSG_001), MB_ICONSTOP); | ||||||
| 			"Please close the first application before running another one.", |  | ||||||
| 			"Other instance detected", MB_ICONSTOP); |  | ||||||
| 		goto out; | 		goto out; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | @ -2004,9 +2011,6 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine | ||||||
| 		uprintf("Could not load RichEdit library - some dialogs may not display: %s\n", WindowsErrorString()); | 		uprintf("Could not load RichEdit library - some dialogs may not display: %s\n", WindowsErrorString()); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// Retrieve the current application directory
 |  | ||||||
| 	GetCurrentDirectoryU(MAX_PATH, app_dir); |  | ||||||
| 
 |  | ||||||
| 	// Set the Windows version
 | 	// Set the Windows version
 | ||||||
| 	nWindowsVersion = DetectWindowsVersion(); | 	nWindowsVersion = DetectWindowsVersion(); | ||||||
| 
 | 
 | ||||||
|  | @ -2015,7 +2019,8 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine | ||||||
| 	SetLGP(FALSE, &existing_key, "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer", "NoDriveTypeAutorun", 0x9e); | 	SetLGP(FALSE, &existing_key, "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer", "NoDriveTypeAutorun", 0x9e); | ||||||
| 
 | 
 | ||||||
| 	// Create the main Window
 | 	// Create the main Window
 | ||||||
| 	if ( (hDlg = CreateDialogA(hInstance, MAKEINTRESOURCEA(IDD_DIALOG), NULL, MainCallback)) == NULL ) { | 	hDlg = CreateDialogW(hInstance, MAKEINTRESOURCEW(IDD_DIALOG), NULL, MainCallback); | ||||||
|  | 	if (hDlg == NULL) { | ||||||
| 		MessageBoxU(NULL, "Could not create Window", "DialogBox failure", MB_ICONSTOP); | 		MessageBoxU(NULL, "Could not create Window", "DialogBox failure", MB_ICONSTOP); | ||||||
| 		goto out; | 		goto out; | ||||||
| 	} | 	} | ||||||
|  | @ -2031,7 +2036,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine | ||||||
| 			// the target USB drive. If this is enabled, the size check is disabled.
 | 			// the target USB drive. If this is enabled, the size check is disabled.
 | ||||||
| 			if ((msg.message == WM_SYSKEYDOWN) && (msg.wParam == 'S')) { | 			if ((msg.message == WM_SYSKEYDOWN) && (msg.wParam == 'S')) { | ||||||
| 				size_check = !size_check; | 				size_check = !size_check; | ||||||
| 				PrintStatus2000("Size checks", size_check); | 				PrintStatus2000(lmprintf(MSG_252), size_check); | ||||||
| 				GetUSBDevices(0); | 				GetUSBDevices(0); | ||||||
| 				continue; | 				continue; | ||||||
| 			} | 			} | ||||||
|  | @ -2041,20 +2046,20 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine | ||||||
| 			// drive instead of an USB key. If this is enabled, Rufus will allow fixed disk formatting.
 | 			// drive instead of an USB key. If this is enabled, Rufus will allow fixed disk formatting.
 | ||||||
| 			if ((msg.message == WM_SYSKEYDOWN) && (msg.wParam == 'F')) { | 			if ((msg.message == WM_SYSKEYDOWN) && (msg.wParam == 'F')) { | ||||||
| 				enable_fixed_disks = !enable_fixed_disks; | 				enable_fixed_disks = !enable_fixed_disks; | ||||||
| 				PrintStatus2000("Fixed disks detection", enable_fixed_disks); | 				PrintStatus2000(lmprintf(MSG_253), enable_fixed_disks); | ||||||
| 				GetUSBDevices(0); | 				GetUSBDevices(0); | ||||||
| 				continue; | 				continue; | ||||||
| 			} | 			} | ||||||
| 			// Alt-L => Force Large FAT32 format to be used on < 32 GB drives
 | 			// Alt-L => Force Large FAT32 format to be used on < 32 GB drives
 | ||||||
| 			if ((msg.message == WM_SYSKEYDOWN) && (msg.wParam == 'L')) { | 			if ((msg.message == WM_SYSKEYDOWN) && (msg.wParam == 'L')) { | ||||||
| 				force_large_fat32 = !force_large_fat32; | 				force_large_fat32 = !force_large_fat32; | ||||||
| 				PrintStatus2000("Force large FAT32 usage", force_large_fat32); | 				PrintStatus2000(lmprintf(MSG_254), force_large_fat32); | ||||||
| 				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)
 | ||||||
| 			// This key is used to disable Windows popup messages when an USB drive is plugged in.
 | 			// This key is used to disable Windows popup messages when an USB drive is plugged in.
 | ||||||
| 			if ((msg.message == WM_SYSKEYDOWN) && (msg.wParam == 'D')) { | 			if ((msg.message == WM_SYSKEYDOWN) && (msg.wParam == 'D')) { | ||||||
| 				PrintStatus(2000, FALSE, "NoDriveTypeAutorun will be deleted on exit."); | 				PrintStatus(2000, FALSE, lmprintf(MSG_255)); | ||||||
| 				existing_key = FALSE; | 				existing_key = FALSE; | ||||||
| 				continue; | 				continue; | ||||||
| 			} | 			} | ||||||
|  | @ -2064,13 +2069,13 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine | ||||||
| 			// a file name). This option allows users to ignore Joliet when using such images.
 | 			// a file name). This option allows users to ignore Joliet when using such images.
 | ||||||
| 			if ((msg.message == WM_SYSKEYDOWN) && (msg.wParam == 'J')) { | 			if ((msg.message == WM_SYSKEYDOWN) && (msg.wParam == 'J')) { | ||||||
| 				enable_joliet = !enable_joliet; | 				enable_joliet = !enable_joliet; | ||||||
| 				PrintStatus2000("Joliet support", enable_joliet); | 				PrintStatus2000(lmprintf(MSG_257), enable_joliet); | ||||||
| 				continue; | 				continue; | ||||||
| 			} | 			} | ||||||
| 			// Alt K => Toggle Rock Ridge support for ISO9660 image
 | 			// Alt K => Toggle Rock Ridge support for ISO9660 images
 | ||||||
| 			if ((msg.message == WM_SYSKEYDOWN) && (msg.wParam == 'K')) { | 			if ((msg.message == WM_SYSKEYDOWN) && (msg.wParam == 'K')) { | ||||||
| 				enable_rockridge = !enable_rockridge; | 				enable_rockridge = !enable_rockridge; | ||||||
| 				PrintStatus2000("Rock Ridge support", enable_rockridge); | 				PrintStatus2000(lmprintf(MSG_258), enable_rockridge); | ||||||
| 				continue; | 				continue; | ||||||
| 			} | 			} | ||||||
| 			// Alt L => Toggle fake drive detection during bad blocks check
 | 			// Alt L => Toggle fake drive detection during bad blocks check
 | ||||||
|  | @ -2080,13 +2085,12 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine | ||||||
| 			// it back during the bad block check.
 | 			// it back during the bad block check.
 | ||||||
| 			if ((msg.message == WM_SYSKEYDOWN) && (msg.wParam == 'L')) { | 			if ((msg.message == WM_SYSKEYDOWN) && (msg.wParam == 'L')) { | ||||||
| 				detect_fakes = !detect_fakes; | 				detect_fakes = !detect_fakes; | ||||||
| 				PrintStatus2000("Fake drive detection", detect_fakes); | 				PrintStatus2000(lmprintf(MSG_256), detect_fakes); | ||||||
| 				continue; | 				continue; | ||||||
| 			} | 			} | ||||||
| 			// Alt-R => Remove all the registry keys created by Rufus
 | 			// Alt-R => Remove all the registry keys created by Rufus
 | ||||||
| 			if ((msg.message == WM_SYSKEYDOWN) && (msg.wParam == 'R')) { | 			if ((msg.message == WM_SYSKEYDOWN) && (msg.wParam == 'R')) { | ||||||
| 				PrintStatus(2000, FALSE, "Application registry key %s deleted.", | 				PrintStatus(2000, FALSE, lmprintf(DeleteRegistryKey(REGKEY_HKCU, COMPANY_NAME "\\" APPLICATION_NAME)?MSG_248:MSG_249)); | ||||||
| 					DeleteRegistryKey(REGKEY_HKCU, COMPANY_NAME "\\" APPLICATION_NAME)?"successfully":"could not be"); |  | ||||||
| 				// Also try to delete the upper key (company name) if it's empty (don't care about the result)
 | 				// Also try to delete the upper key (company name) if it's empty (don't care about the result)
 | ||||||
| 				DeleteRegistryKey(REGKEY_HKCU, COMPANY_NAME); | 				DeleteRegistryKey(REGKEY_HKCU, COMPANY_NAME); | ||||||
| 				continue; | 				continue; | ||||||
|  | @ -2097,7 +2101,10 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| out: | out: | ||||||
|  | 	if (loc_file[0] != 0) | ||||||
|  | 		DeleteFileU(loc_file); | ||||||
| 	DestroyAllTooltips(); | 	DestroyAllTooltips(); | ||||||
|  | 	exit_localization(); | ||||||
| 	safe_free(iso_path); | 	safe_free(iso_path); | ||||||
| 	safe_free(update.download_url); | 	safe_free(update.download_url); | ||||||
| 	safe_free(update.release_notes); | 	safe_free(update.release_notes); | ||||||
|  |  | ||||||
							
								
								
									
										23
									
								
								src/rufus.h
									
										
									
									
									
								
							
							
						
						
									
										23
									
								
								src/rufus.h
									
										
									
									
									
								
							|  | @ -17,6 +17,7 @@ | ||||||
|  */ |  */ | ||||||
| #include <windows.h> | #include <windows.h> | ||||||
| #include <winioctl.h>               // for DISK_GEOMETRY | #include <winioctl.h>               // for DISK_GEOMETRY | ||||||
|  | #include <malloc.h> | ||||||
| #include <stdint.h> | #include <stdint.h> | ||||||
| 
 | 
 | ||||||
| #if defined(_MSC_VER) | #if defined(_MSC_VER) | ||||||
|  | @ -29,19 +30,19 @@ | ||||||
| /* Program options */ | /* Program options */ | ||||||
| #define RUFUS_DEBUG                 // print debug info to Debug facility
 | #define RUFUS_DEBUG                 // print debug info to Debug facility
 | ||||||
| /* Features not ready for prime time and that may *DESTROY* your data - USE AT YOUR OWN RISKS! */ | /* Features not ready for prime time and that may *DESTROY* your data - USE AT YOUR OWN RISKS! */ | ||||||
| //#define RUFUS_TEST
 | // #define RUFUS_TEST
 | ||||||
| 
 | 
 | ||||||
| #define APPLICATION_NAME            "Rufus" | #define APPLICATION_NAME            "Rufus" | ||||||
| #define COMPANY_NAME                "Akeo Consulting" | #define COMPANY_NAME                "Akeo Consulting" | ||||||
| #define STR_NO_LABEL                "NO_LABEL" | #define STR_NO_LABEL                "NO_LABEL" | ||||||
| #define RUFUS_CANCELBOX_TITLE       APPLICATION_NAME " - Cancellation" |  | ||||||
| #define RUFUS_BLOCKING_IO_TITLE     APPLICATION_NAME " - Flushing buffers" |  | ||||||
| #define DRIVE_ACCESS_TIMEOUT        15000		// How long we should retry drive access (in ms)
 | #define DRIVE_ACCESS_TIMEOUT        15000		// How long we should retry drive access (in ms)
 | ||||||
| #define DRIVE_ACCESS_RETRIES        60			// How many times we should retry
 | #define DRIVE_ACCESS_RETRIES        60			// How many times we should retry
 | ||||||
| #define DRIVE_INDEX_MIN             0x00000080 | #define DRIVE_INDEX_MIN             0x00000080 | ||||||
| #define DRIVE_INDEX_MAX             0x000000C0 | #define DRIVE_INDEX_MAX             0x000000C0 | ||||||
| #define MAX_DRIVES                  (DRIVE_INDEX_MAX - DRIVE_INDEX_MIN) | #define MAX_DRIVES                  (DRIVE_INDEX_MAX - DRIVE_INDEX_MIN) | ||||||
| #define MAX_TOOLTIPS                32 | #define MAX_TOOLTIPS                128 | ||||||
|  | #define MAX_SIZE_SUFFIXES           6			// bytes, KB, MB, GB, TB, PB
 | ||||||
|  | #define MAX_CLUSTER_SIZES           18 | ||||||
| #define MAX_PROGRESS                (0xFFFF-1)	// leave room for 1 more for insta-progress workaround
 | #define MAX_PROGRESS                (0xFFFF-1)	// leave room for 1 more for insta-progress workaround
 | ||||||
| #define MAX_LOG_SIZE                0x7FFFFFFE | #define MAX_LOG_SIZE                0x7FFFFFFE | ||||||
| #define MAX_GUID_STRING_LENGTH      40 | #define MAX_GUID_STRING_LENGTH      40 | ||||||
|  | @ -50,6 +51,7 @@ | ||||||
| #define MBR_UEFI_MARKER             0x49464555	// 'U', 'E', 'F', 'I', as a 32 bit little endian longword
 | #define MBR_UEFI_MARKER             0x49464555	// 'U', 'E', 'F', 'I', as a 32 bit little endian longword
 | ||||||
| #define PROPOSEDLABEL_TOLERANCE     0.10 | #define PROPOSEDLABEL_TOLERANCE     0.10 | ||||||
| #define FS_DEFAULT                  FS_FAT32 | #define FS_DEFAULT                  FS_FAT32 | ||||||
|  | #define BADBLOCK_PATTERNS           {0xaa, 0x55, 0xff, 0x00} | ||||||
| #define LARGE_FAT32_SIZE            (32*1073741824LL)	// Size at which we need to use fat32format
 | #define LARGE_FAT32_SIZE            (32*1073741824LL)	// Size at which we need to use fat32format
 | ||||||
| #define MAX_FAT32_SIZE              2.0f		// Threshold above which we disable FAT32 formatting (in TB)
 | #define MAX_FAT32_SIZE              2.0f		// Threshold above which we disable FAT32 formatting (in TB)
 | ||||||
| #define WHITE                       RGB(255,255,255) | #define WHITE                       RGB(255,255,255) | ||||||
|  | @ -283,12 +285,13 @@ extern enum WindowsVersion DetectWindowsVersion(void); | ||||||
| extern const char* PrintWindowsVersion(enum WindowsVersion version); | extern const char* PrintWindowsVersion(enum WindowsVersion version); | ||||||
| extern const char *WindowsErrorString(void); | extern const char *WindowsErrorString(void); | ||||||
| extern void DumpBufferHex(void *buf, size_t size); | extern void DumpBufferHex(void *buf, size_t size); | ||||||
| extern void PrintStatus(unsigned int duration, BOOL debug, const char *format, ...); | extern void PrintStatus(unsigned int duration, BOOL debug, const char* message); | ||||||
| extern void UpdateProgress(int op, float percent); | extern void UpdateProgress(int op, float percent); | ||||||
| extern const char* StrError(DWORD error_code); | extern const char* StrError(DWORD error_code); | ||||||
| extern char* GuidToString(const GUID* guid); | extern char* GuidToString(const GUID* guid); | ||||||
| extern char* SizeToHumanReadable(LARGE_INTEGER size); | extern char* SizeToHumanReadable(LARGE_INTEGER size); | ||||||
| extern void CenterDialog(HWND hDlg); | extern void CenterDialog(HWND hDlg); | ||||||
|  | extern void ResizeMoveCtrl(HWND hDlg, HWND hCtrl, int dx, int dy, int dw, int dh); | ||||||
| extern void CreateStatusBar(void); | extern void CreateStatusBar(void); | ||||||
| extern void SetTitleBarIcon(HWND hDlg); | extern void SetTitleBarIcon(HWND hDlg); | ||||||
| extern BOOL CreateTaskbarList(void); | extern BOOL CreateTaskbarList(void); | ||||||
|  | @ -342,12 +345,20 @@ extern void parse_update(char* buf, size_t len); | ||||||
| extern BOOL WimExtractCheck(void); | extern BOOL WimExtractCheck(void); | ||||||
| extern BOOL WimExtractFile(const char* wim_image, int index, const char* src, const char* dst); | extern BOOL WimExtractFile(const char* wim_image, int index, const char* src, const char* dst); | ||||||
| 
 | 
 | ||||||
| __inline static BOOL UnlockDrive(HANDLE hDrive) | static __inline BOOL UnlockDrive(HANDLE hDrive) | ||||||
| { | { | ||||||
| 	DWORD size; | 	DWORD size; | ||||||
| 	return DeviceIoControl(hDrive, FSCTL_UNLOCK_VOLUME, NULL, 0, NULL, 0, &size, NULL); | 	return DeviceIoControl(hDrive, FSCTL_UNLOCK_VOLUME, NULL, 0, NULL, 0, &size, NULL); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static __inline void *_reallocf(void *ptr, size_t size) | ||||||
|  | { | ||||||
|  | 	void *ret = realloc(ptr, size); | ||||||
|  | 	if (!ret) | ||||||
|  | 		free(ptr); | ||||||
|  | 	return ret; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| /* Basic String Array */ | /* Basic String Array */ | ||||||
| typedef struct { | typedef struct { | ||||||
| 	char** Table; | 	char** Table; | ||||||
|  |  | ||||||
							
								
								
									
										77
									
								
								src/rufus.rc
									
										
									
									
									
								
							
							
						
						
									
										77
									
								
								src/rufus.rc
									
										
									
									
									
								
							|  | @ -30,48 +30,48 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL | ||||||
| IDD_DIALOG DIALOGEX 12, 12, 206, 329 | IDD_DIALOG DIALOGEX 12, 12, 206, 329 | ||||||
| STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU | STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU | ||||||
| EXSTYLE WS_EX_APPWINDOW | EXSTYLE WS_EX_APPWINDOW | ||||||
| CAPTION "Rufus v1.4.0.280" | CAPTION "Rufus v1.4.0.281" | ||||||
| FONT 8, "MS Shell Dlg", 400, 0, 0x1 | FONT 8, "MS Shell Dlg", 400, 0, 0x1 | ||||||
| BEGIN | BEGIN | ||||||
|     DEFPUSHBUTTON   "Start",IDC_START,94,291,50,14 |     DEFPUSHBUTTON   "Start",IDC_START,94,291,50,14 | ||||||
|     PUSHBUTTON      "Close",IDCANCEL,148,291,50,14 |     PUSHBUTTON      "Close",IDCANCEL,148,291,50,14 | ||||||
|     COMBOBOX        IDC_DEVICE,8,17,190,33,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP |  | ||||||
|     CONTROL         "Device",IDC_STATIC,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,9,6,22,8 |  | ||||||
|     COMBOBOX        IDC_FILESYSTEM,8,75,190,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP |  | ||||||
|     LTEXT           "File system",IDC_STATIC,9,64,51,10 |  | ||||||
|     COMBOBOX        IDC_PARTITION_SCHEME,8,46,190,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP |  | ||||||
|     LTEXT           "Partition scheme and target system type",IDC_STATIC,9,35,176,8 |  | ||||||
|     COMBOBOX        IDC_CLUSTERSIZE,8,104,190,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP |  | ||||||
|     LTEXT           "Cluster size",IDC_STATIC,9,93,105,10 |  | ||||||
|     PUSHBUTTON      "About...",IDC_ABOUT,8,291,50,14 |     PUSHBUTTON      "About...",IDC_ABOUT,8,291,50,14 | ||||||
|     GROUPBOX        "Format Options       ",IDC_STATIC,7,149,192,66 |     PUSHBUTTON      "Log",IDC_LOG,62,291,18,14 | ||||||
|  |     PUSHBUTTON      "T",IDC_TEST,80,291,12,14,NOT WS_VISIBLE | ||||||
|  |     COMBOBOX        IDC_DEVICE,8,17,190,33,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP | ||||||
|  |     LTEXT           "Device",IDS_DEVICE_TXT,9,6,186,8 | ||||||
|  |     COMBOBOX        IDC_FILESYSTEM,8,75,190,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP | ||||||
|  |     LTEXT           "File system",IDS_FILESYSTEM_TXT,9,64,186,10 | ||||||
|  |     COMBOBOX        IDC_PARTITION_TYPE,8,46,190,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP | ||||||
|  |     LTEXT           "Partition scheme and target system type",IDS_PARTITION_TYPE_TXT,9,35,186,8 | ||||||
|  |     COMBOBOX        IDC_CLUSTERSIZE,8,104,190,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP | ||||||
|  |     LTEXT           "Cluster size",IDS_CLUSTERSIZE_TXT,9,93,186,10 | ||||||
|  |     GROUPBOX        "Format Options       ",IDS_FORMAT_OPTIONS_GRP,7,149,192,66 | ||||||
|  |     LTEXT           "New volume label",IDS_LABEL_TXT,9,121,186,10 | ||||||
|     EDITTEXT        IDC_LABEL,7,131,190,13,ES_AUTOHSCROLL |     EDITTEXT        IDC_LABEL,7,131,190,13,ES_AUTOHSCROLL | ||||||
|     CONTROL         "Check device for bad blocks:",IDC_BADBLOCKS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,161,101,10 |     CONTROL         "Check device for bad blocks:",IDC_BADBLOCKS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,161,101,10 | ||||||
|     CONTROL         "Quick format",IDC_QUICKFORMAT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,173,55,10 |     CONTROL         "Quick format",IDC_QUICKFORMAT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,173,181,10 | ||||||
|     CONTROL         "Create a bootable disk using:",IDC_BOOT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,185,104,10 |     CONTROL         "Create a bootable disk using:",IDC_BOOT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,185,104,10 | ||||||
|     CONTROL         "Create extended label and icon files",IDC_SET_ICON, |     CONTROL         "Create extended label and icon files",IDC_SET_ICON, | ||||||
|                     "Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,198,131,10 |                     "Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,198,181,10 | ||||||
|     LTEXT           "New volume label",IDC_STATIC,9,121,105,10 |  | ||||||
|     CONTROL         "",IDC_PROGRESS,"msctls_progress32",PBS_SMOOTH | WS_BORDER,8,272,189,9 |     CONTROL         "",IDC_PROGRESS,"msctls_progress32",PBS_SMOOTH | WS_BORDER,8,272,189,9 | ||||||
|     COMBOBOX        IDC_NBPASSES,119,159,49,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP |     COMBOBOX        IDC_NBPASSES,119,159,49,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP | ||||||
|     COMBOBOX        IDC_BOOTTYPE,119,183,49,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP |     COMBOBOX        IDC_BOOTTYPE,119,183,49,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP | ||||||
|     PUSHBUTTON      "...",IDC_SELECT_ISO,171,182,22,14,BS_ICON |     PUSHBUTTON      "...",IDC_SELECT_ISO,171,182,22,14,BS_ICON | ||||||
|     PUSHBUTTON      "T",IDC_TEST,80,291,12,14,NOT WS_VISIBLE |     CONTROL         "Use Rufus MBR with BIOS ID:",IDC_RUFUS_MBR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,248,106,10 | ||||||
|     CONTROL         "Use Rufus MBR with BIOS ID:",IDC_RUFUS_MBR,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,13,248,106,10 |  | ||||||
|     PUSHBUTTON      "",IDC_ADVANCED,63,148,14,10,BS_TOP | BS_FLAT |     PUSHBUTTON      "",IDC_ADVANCED,63,148,14,10,BS_TOP | BS_FLAT | ||||||
|     GROUPBOX        "Advanced Options",IDC_ADVANCED_GROUP,7,210,192,54,NOT WS_VISIBLE |     GROUPBOX        "Advanced Options",IDS_ADVANCED_OPTIONS_GRP,7,210,192,54 | ||||||
|     COMBOBOX        IDC_DISK_ID,119,246,73,30,CBS_DROPDOWNLIST | NOT WS_VISIBLE | WS_VSCROLL | WS_TABSTOP |     COMBOBOX        IDC_DISK_ID,119,246,73,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP | ||||||
|     CONTROL         "Add fixes for old BIOSes (extra partition, align, etc.)",IDC_EXTRA_PARTITION, |     CONTROL         "Add fixes for old BIOSes (extra partition, align, etc.)",IDC_EXTRA_PARTITION, | ||||||
|                     "Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,235,184,10 |                     "Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,235,181,10 | ||||||
|     CONTROL         "List fixed (non-flash) or unpartitioned USB disks",IDC_ENABLE_FIXED_DISKS, |     CONTROL         "List fixed (non-flash) or unpartitioned USB disks",IDC_ENABLE_FIXED_DISKS, | ||||||
|                     "Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,222,185,10 |                     "Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,222,181,10 | ||||||
|     PUSHBUTTON      "Log",IDC_LOG,62,291,18,14 |  | ||||||
| END | END | ||||||
| 
 | 
 | ||||||
| IDD_ABOUTBOX DIALOGEX 0, 0, 287, 201 | IDD_ABOUTBOX DIALOGEX 0, 0, 287, 201 | ||||||
| STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | ||||||
| CAPTION "About Rufus" | CAPTION "About Rufus" | ||||||
| FONT 8, "Microsoft Sans Serif", 400, 0, 0x0 | FONT 8, "MS Shell Dlg", 400, 0, 0x0 | ||||||
| BEGIN | BEGIN | ||||||
|     ICON            IDI_ICON,IDC_ABOUT_ICON,11,8,20,20 |     ICON            IDI_ICON,IDC_ABOUT_ICON,11,8,20,20 | ||||||
|     DEFPUSHBUTTON   "OK",IDOK,231,181,50,14,WS_GROUP |     DEFPUSHBUTTON   "OK",IDOK,231,181,50,14,WS_GROUP | ||||||
|  | @ -128,36 +128,35 @@ END | ||||||
| IDD_UPDATE_POLICY DIALOGEX 0, 0, 287, 198 | IDD_UPDATE_POLICY DIALOGEX 0, 0, 287, 198 | ||||||
| STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | ||||||
| CAPTION "Update policy and settings" | CAPTION "Update policy and settings" | ||||||
| FONT 8, "Microsoft Sans Serif", 400, 0, 0x0 | FONT 8, "MS Shell Dlg", 400, 0, 0x0 | ||||||
| BEGIN | BEGIN | ||||||
|     ICON            IDI_ICON,IDC_ABOUT_ICON,11,8,21,20 |     ICON            IDI_ICON,IDC_ABOUT_ICON,11,8,20,20 | ||||||
|     DEFPUSHBUTTON   "Close",IDCANCEL,221,172,50,14,WS_GROUP |     DEFPUSHBUTTON   "Close",IDCANCEL,221,172,50,14,WS_GROUP | ||||||
|     CONTROL         "",IDC_POLICY,"RichEdit20W",WS_VSCROLL | 0x804,46,8,235,130,WS_EX_STATICEDGE |     CONTROL         "",IDC_POLICY,"RichEdit20W",WS_VSCROLL | 0x804,46,8,235,130,WS_EX_STATICEDGE | ||||||
|     COMBOBOX        IDC_UPDATE_FREQUENCY,133,155,66,12,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP |     COMBOBOX        IDC_UPDATE_FREQUENCY,133,155,66,12,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP | ||||||
|     LTEXT           "Check for updates:",IDC_STATIC,52,157,72,11 |     LTEXT           "Check for updates:",IDS_UPDATE_FREQUENCY_TXT,52,157,80,11 | ||||||
|     LTEXT           "Include beta versions:",IDC_STATIC,52,173,93,11 |     LTEXT           "Include beta versions:",IDS_INCLUDE_BETAS_TXT,52,173,80,11 | ||||||
|     COMBOBOX        IDC_INCLUDE_BETAS,133,171,36,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP |     COMBOBOX        IDC_INCLUDE_BETAS,133,171,36,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP | ||||||
|     GROUPBOX        "Settings",IDC_STATIC,45,145,161,46 |     GROUPBOX        "Settings",IDS_UPDATE_SETTINGS_GRP,45,145,161,46 | ||||||
|     PUSHBUTTON      "Check Now",IDC_CHECK_NOW,221,154,50,14 |     PUSHBUTTON      "Check Now",IDC_CHECK_NOW,221,154,50,14 | ||||||
|     GROUPBOX        "",IDC_STATIC,210,145,71,46 |     GROUPBOX        "",IDS_CHECK_NOW_GRP,210,145,71,46 | ||||||
| END | END | ||||||
| 
 | 
 | ||||||
| IDD_NEW_VERSION DIALOGEX 0, 0, 384, 268 | IDD_NEW_VERSION DIALOGEX 0, 0, 384, 268 | ||||||
| STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | ||||||
| CAPTION "Check For Updates - Rufus" | CAPTION "Check For Updates - Rufus" | ||||||
| FONT 8, "Microsoft Sans Serif", 400, 0, 0x0 | FONT 8, "MS Shell Dlg", 400, 0, 0x0 | ||||||
| BEGIN | BEGIN | ||||||
|     PUSHBUTTON      "Close",IDCANCEL,167,244,50,14,WS_GROUP |     PUSHBUTTON      "Close",IDCANCEL,167,244,50,14,WS_GROUP | ||||||
|     CONTROL         "",IDC_RELEASE_NOTES,"RichEdit20W",WS_VSCROLL | 0x804,15,77,352,88,WS_EX_STATICEDGE |     CONTROL         "",IDC_RELEASE_NOTES,"RichEdit20W",ES_MULTILINE | ES_READONLY | WS_VSCROLL,15,77,352,88,WS_EX_STATICEDGE | ||||||
|     DEFPUSHBUTTON   "Download",IDC_DOWNLOAD,293,211,74,14,WS_GROUP |     DEFPUSHBUTTON   "Download",IDC_DOWNLOAD,293,211,74,14,WS_GROUP | ||||||
|     CONTROL         "",IDC_PROGRESS,"msctls_progress32",WS_BORDER,15,212,270,11 |     CONTROL         "",IDC_PROGRESS,"msctls_progress32",WS_BORDER,15,212,270,11 | ||||||
|     GROUPBOX        "Release Notes",IDC_STATIC,8,63,367,111 |     GROUPBOX        "Release Notes",IDS_NEW_VERSION_NOTES_GRP,8,63,367,111 | ||||||
|     LTEXT           "A newer version is available. Please download the latest version!",IDC_STATIC,10,32,229,8 |     LTEXT           "A newer version is available. Please download the latest version!",IDS_NEW_VERSION_AVAIL_TXT,10,32,229,8 | ||||||
|     LTEXT           "[...]",IDC_YOUR_VERSION,10,8,124,8 |     LTEXT           "[...]",IDC_YOUR_VERSION,10,8,124,8 | ||||||
|     LTEXT           "[...]",IDC_LATEST_VERSION,10,19,129,8 |     LTEXT           "[...]",IDC_LATEST_VERSION,10,19,129,8 | ||||||
|     CONTROL         "<a href=""http://rufus.akeo.ie"">Click here to go to the website</a>",IDC_WEBSITE, |     LTEXT           " Click here to go to the website",IDC_WEBSITE,138,49,108,9,SS_NOTIFY | ||||||
|                     "SysLink",WS_TABSTOP,143,49,96,9 |     GROUPBOX        "Download",IDS_NEW_VERSION_DOWNLOAD_GRP,8,177,367,58 | ||||||
|     GROUPBOX        "Download",IDC_STATIC,8,177,367,58 |  | ||||||
|     EDITTEXT        IDC_DOWNLOAD_URL,15,191,351,13,ES_AUTOHSCROLL | ES_READONLY |     EDITTEXT        IDC_DOWNLOAD_URL,15,191,351,13,ES_AUTOHSCROLL | ES_READONLY | ||||||
| END | END | ||||||
| 
 | 
 | ||||||
|  | @ -185,6 +184,7 @@ END | ||||||
| 3 TEXTINCLUDE  | 3 TEXTINCLUDE  | ||||||
| BEGIN | BEGIN | ||||||
|     "\r\n" |     "\r\n" | ||||||
|  |     "IDR_LC_RUFUS_LOC        RCDATA                  ""../res/localization/rufus.loc""\r\n" | ||||||
|     "IDR_SL_LDLINUX_V4_BSS   RCDATA                  ""../res/syslinux/ldlinux_v4.bss""\r\n" |     "IDR_SL_LDLINUX_V4_BSS   RCDATA                  ""../res/syslinux/ldlinux_v4.bss""\r\n" | ||||||
|     "IDR_SL_LDLINUX_V4_SYS   RCDATA                  ""../res/syslinux/ldlinux_v4.sys""\r\n" |     "IDR_SL_LDLINUX_V4_SYS   RCDATA                  ""../res/syslinux/ldlinux_v4.sys""\r\n" | ||||||
|     "IDR_SL_LDLINUX_V5_BSS   RCDATA                  ""../res/syslinux/ldlinux_v5.bss""\r\n" |     "IDR_SL_LDLINUX_V5_BSS   RCDATA                  ""../res/syslinux/ldlinux_v5.bss""\r\n" | ||||||
|  | @ -278,8 +278,8 @@ END | ||||||
| // | // | ||||||
| 
 | 
 | ||||||
| VS_VERSION_INFO VERSIONINFO | VS_VERSION_INFO VERSIONINFO | ||||||
|  FILEVERSION 1,4,0,280 |  FILEVERSION 1,4,0,281 | ||||||
|  PRODUCTVERSION 1,4,0,280 |  PRODUCTVERSION 1,4,0,281 | ||||||
|  FILEFLAGSMASK 0x3fL |  FILEFLAGSMASK 0x3fL | ||||||
| #ifdef _DEBUG | #ifdef _DEBUG | ||||||
|  FILEFLAGS 0x1L |  FILEFLAGS 0x1L | ||||||
|  | @ -296,13 +296,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", "1.4.0.280" |             VALUE "FileVersion", "1.4.0.281" | ||||||
|             VALUE "InternalName", "Rufus" |             VALUE "InternalName", "Rufus" | ||||||
|             VALUE "LegalCopyright", "© 2011-2013 Pete Batard (GPL v3)" |             VALUE "LegalCopyright", "© 2011-2013 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", "1.4.0.280" |             VALUE "ProductVersion", "1.4.0.281" | ||||||
|         END |         END | ||||||
|     END |     END | ||||||
|     BLOCK "VarFileInfo" |     BLOCK "VarFileInfo" | ||||||
|  | @ -333,6 +333,7 @@ IDI_DOWN                ICON                    "../res/down.ico" | ||||||
| // Generated from the TEXTINCLUDE 3 resource. | // Generated from the TEXTINCLUDE 3 resource. | ||||||
| // | // | ||||||
| 
 | 
 | ||||||
|  | IDR_LC_RUFUS_LOC        RCDATA                  "../res/localization/rufus.loc" | ||||||
| IDR_SL_LDLINUX_V4_BSS   RCDATA                  "../res/syslinux/ldlinux_v4.bss" | IDR_SL_LDLINUX_V4_BSS   RCDATA                  "../res/syslinux/ldlinux_v4.bss" | ||||||
| IDR_SL_LDLINUX_V4_SYS   RCDATA                  "../res/syslinux/ldlinux_v4.sys" | IDR_SL_LDLINUX_V4_SYS   RCDATA                  "../res/syslinux/ldlinux_v4.sys" | ||||||
| IDR_SL_LDLINUX_V5_BSS   RCDATA                  "../res/syslinux/ldlinux_v5.bss" | IDR_SL_LDLINUX_V5_BSS   RCDATA                  "../res/syslinux/ldlinux_v5.bss" | ||||||
|  |  | ||||||
|  | @ -26,6 +26,8 @@ | ||||||
| 
 | 
 | ||||||
| #include "msapi_utf8.h" | #include "msapi_utf8.h" | ||||||
| #include "rufus.h" | #include "rufus.h" | ||||||
|  | #include "resource.h" | ||||||
|  | #include "localization.h" | ||||||
| 
 | 
 | ||||||
| // Must be in the same order as enum WindowsVersion
 | // Must be in the same order as enum WindowsVersion
 | ||||||
| static const char* WindowsVersionName[WINDOWS_MAX] = { | static const char* WindowsVersionName[WINDOWS_MAX] = { | ||||||
|  | @ -232,7 +234,7 @@ BOOL FileIO(BOOL save, char* path, char** buffer, DWORD* size) | ||||||
| 		goto out; | 		goto out; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	PrintStatus(0, TRUE, "%s '%s'", save?"Saved":"Opened", path); | 	PrintStatus(0, TRUE, save?lmprintf(MSG_216, path):lmprintf(MSG_215, path)); | ||||||
| 	ret = TRUE; | 	ret = TRUE; | ||||||
| 
 | 
 | ||||||
| out: | out: | ||||||
|  |  | ||||||
							
								
								
									
										95
									
								
								src/stdio.c
									
										
									
									
									
								
							
							
						
						
									
										95
									
								
								src/stdio.c
									
										
									
									
									
								
							|  | @ -31,6 +31,7 @@ | ||||||
| #include "msapi_utf8.h" | #include "msapi_utf8.h" | ||||||
| #include "rufus.h" | #include "rufus.h" | ||||||
| #include "resource.h" | #include "resource.h" | ||||||
|  | #include "localization.h" | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  * Globals |  * Globals | ||||||
|  | @ -40,7 +41,8 @@ HWND hStatus; | ||||||
| #ifdef RUFUS_DEBUG | #ifdef RUFUS_DEBUG | ||||||
| void _uprintf(const char *format, ...) | void _uprintf(const char *format, ...) | ||||||
| { | { | ||||||
| 	char buf[4096], *p = buf; | 	static char buf[4096]; | ||||||
|  | 	char* p = buf; | ||||||
| 	va_list args; | 	va_list args; | ||||||
| 	int n; | 	int n; | ||||||
| 
 | 
 | ||||||
|  | @ -50,7 +52,7 @@ void _uprintf(const char *format, ...) | ||||||
| 
 | 
 | ||||||
| 	p += (n < 0)?sizeof(buf)-3:n; | 	p += (n < 0)?sizeof(buf)-3:n; | ||||||
| 
 | 
 | ||||||
| 	while((p>buf) && (isspace((unsigned char)p[-1]))) | 	while((p>buf) && (isspaceU(p[-1]))) | ||||||
| 		*--p = '\0'; | 		*--p = '\0'; | ||||||
| 
 | 
 | ||||||
| 	*p++ = '\r'; | 	*p++ = '\r'; | ||||||
|  | @ -145,23 +147,11 @@ static void CALLBACK PrintStatusTimeout(HWND hwnd, UINT uMsg, UINT_PTR idEvent, | ||||||
| 	KillTimer(hMainDialog, TID_MESSAGE); | 	KillTimer(hMainDialog, TID_MESSAGE); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void PrintStatus(unsigned int duration, BOOL debug, const char *format, ...) | void PrintStatus(unsigned int duration, BOOL debug, const char* message) | ||||||
| { | { | ||||||
| 	char *p = szStatusMessage; | 	if (message == NULL) | ||||||
| 	va_list args; | 		return; | ||||||
| 	int n; | 	safe_strcpy(szStatusMessage, sizeof(szStatusMessage), message); | ||||||
| 
 |  | ||||||
| 	va_start(args, format); |  | ||||||
| 	n = safe_vsnprintf(p, sizeof(szStatusMessage)-1, format, args); // room for NUL
 |  | ||||||
| 	va_end(args); |  | ||||||
| 
 |  | ||||||
| 	p += (n < 0)?sizeof(szStatusMessage)-1:n; |  | ||||||
| 
 |  | ||||||
| 	while((p>szStatusMessage) && (isspace(p[-1]))) |  | ||||||
| 		*--p = '\0'; |  | ||||||
| 
 |  | ||||||
| 	*p   = '\0'; |  | ||||||
| 
 |  | ||||||
| 	if (debug) | 	if (debug) | ||||||
| 		uprintf("%s\n", szStatusMessage); | 		uprintf("%s\n", szStatusMessage); | ||||||
| 
 | 
 | ||||||
|  | @ -192,17 +182,16 @@ char* GuidToString(const GUID* guid) | ||||||
| char* SizeToHumanReadable(LARGE_INTEGER size) | char* SizeToHumanReadable(LARGE_INTEGER size) | ||||||
| { | { | ||||||
| 	int suffix = 0; | 	int suffix = 0; | ||||||
| 	static char str_size[24]; | 	static char str_size[32]; | ||||||
| 	const char* sizes[] = { "", "KB", "MB", "GB", "TB" }; |  | ||||||
| 	double hr_size = (double)size.QuadPart; | 	double hr_size = (double)size.QuadPart; | ||||||
| 	while ((suffix < ARRAYSIZE(sizes)) && (hr_size >= 1024.0)) { | 	while ((suffix < MAX_SIZE_SUFFIXES) && (hr_size >= 1024.0)) { | ||||||
| 		hr_size /= 1024.0; | 		hr_size /= 1024.0; | ||||||
| 		suffix++; | 		suffix++; | ||||||
| 	} | 	} | ||||||
| 	if (suffix == 0) { | 	if (suffix == 0) { | ||||||
| 		safe_sprintf(str_size, sizeof(str_size), "%d bytes", (int)hr_size); | 		safe_sprintf(str_size, sizeof(str_size), "%d %s", (int)hr_size, lmprintf(MSG_020)); | ||||||
| 	} else { | 	} else { | ||||||
| 		safe_sprintf(str_size, sizeof(str_size), "%0.1f %s", hr_size, sizes[suffix]); | 		safe_sprintf(str_size, sizeof(str_size), "%0.1f %s", hr_size, lmprintf(MSG_020 + suffix)); | ||||||
| 	} | 	} | ||||||
| 	return str_size; | 	return str_size; | ||||||
| } | } | ||||||
|  | @ -210,7 +199,7 @@ char* SizeToHumanReadable(LARGE_INTEGER size) | ||||||
| const char* StrError(DWORD error_code) | const char* StrError(DWORD error_code) | ||||||
| { | { | ||||||
| 	if ( (!IS_ERROR(error_code)) || (SCODE_CODE(error_code) == ERROR_SUCCESS)) { | 	if ( (!IS_ERROR(error_code)) || (SCODE_CODE(error_code) == ERROR_SUCCESS)) { | ||||||
| 		return "Success"; | 		return lmprintf(MSG_044); | ||||||
| 	} | 	} | ||||||
| 	if (SCODE_FACILITY(error_code) != FACILITY_STORAGE) { | 	if (SCODE_FACILITY(error_code) != FACILITY_STORAGE) { | ||||||
| 		uprintf("StrError: non storage - %08X (%X)\n", error_code, SCODE_FACILITY(error_code)); | 		uprintf("StrError: non storage - %08X (%X)\n", error_code, SCODE_FACILITY(error_code)); | ||||||
|  | @ -219,63 +208,61 @@ const char* StrError(DWORD error_code) | ||||||
| 	} | 	} | ||||||
| 	switch (SCODE_CODE(error_code)) { | 	switch (SCODE_CODE(error_code)) { | ||||||
| 	case ERROR_GEN_FAILURE: | 	case ERROR_GEN_FAILURE: | ||||||
| 		return "Undetermined error while formatting."; | 		return lmprintf(MSG_051); | ||||||
| 	case ERROR_INCOMPATIBLE_FS: | 	case ERROR_INCOMPATIBLE_FS: | ||||||
| 		return "Cannot use the selected file system for this media."; | 		return lmprintf(MSG_052); | ||||||
| 	case ERROR_ACCESS_DENIED: | 	case ERROR_ACCESS_DENIED: | ||||||
| 		return "Access to the device is denied."; | 		return lmprintf(MSG_053); | ||||||
| 	case ERROR_WRITE_PROTECT: | 	case ERROR_WRITE_PROTECT: | ||||||
| 		return "Media is write protected."; | 		return lmprintf(MSG_054); | ||||||
| 	case ERROR_DEVICE_IN_USE: | 	case ERROR_DEVICE_IN_USE: | ||||||
| 		return "The device is in use by another process. " | 		return lmprintf(MSG_055); | ||||||
| 			"Please close any other process that may be accessing the device."; |  | ||||||
| 	case ERROR_CANT_QUICK_FORMAT: | 	case ERROR_CANT_QUICK_FORMAT: | ||||||
| 		return "Quick format is not available for this device."; | 		return lmprintf(MSG_056); | ||||||
| 	case ERROR_LABEL_TOO_LONG: | 	case ERROR_LABEL_TOO_LONG: | ||||||
| 		return "The volume label is invalid."; | 		return lmprintf(MSG_057); | ||||||
| 	case ERROR_INVALID_HANDLE: | 	case ERROR_INVALID_HANDLE: | ||||||
| 		return "The device handle is invalid."; | 		return lmprintf(MSG_058); | ||||||
| 	case ERROR_INVALID_CLUSTER_SIZE: | 	case ERROR_INVALID_CLUSTER_SIZE: | ||||||
| 		return "The selected cluster size is not valid for this device."; | 		return lmprintf(MSG_059); | ||||||
| 	case ERROR_INVALID_VOLUME_SIZE: | 	case ERROR_INVALID_VOLUME_SIZE: | ||||||
| 		return "The volume size is invalid."; | 		return lmprintf(MSG_060); | ||||||
| 	case ERROR_NO_MEDIA_IN_DRIVE: | 	case ERROR_NO_MEDIA_IN_DRIVE: | ||||||
| 		return "Please insert a media in drive."; | 		return lmprintf(MSG_061); | ||||||
| 	case ERROR_NOT_SUPPORTED: | 	case ERROR_NOT_SUPPORTED: | ||||||
| 		return "An unsupported command was received."; | 		return lmprintf(MSG_062); | ||||||
| 	case ERROR_NOT_ENOUGH_MEMORY: | 	case ERROR_NOT_ENOUGH_MEMORY: | ||||||
| 		return "Memory allocation error."; | 		return lmprintf(MSG_063); | ||||||
| 	case ERROR_READ_FAULT: | 	case ERROR_READ_FAULT: | ||||||
| 		return "Read error."; | 		return lmprintf(MSG_064); | ||||||
| 	case ERROR_WRITE_FAULT: | 	case ERROR_WRITE_FAULT: | ||||||
| 		return "Write error."; | 		return lmprintf(MSG_065); | ||||||
| 	case ERROR_INSTALL_FAILURE: | 	case ERROR_INSTALL_FAILURE: | ||||||
| 		return "Installation failure"; | 		return lmprintf(MSG_066); | ||||||
| 	case ERROR_OPEN_FAILED: | 	case ERROR_OPEN_FAILED: | ||||||
| 		return "Could not open media. It may be in use by another process. " | 		return lmprintf(MSG_067); | ||||||
| 			"Please re-plug the media and try again."; |  | ||||||
| 	case ERROR_PARTITION_FAILURE: | 	case ERROR_PARTITION_FAILURE: | ||||||
| 		return "Error while partitioning drive."; | 		return lmprintf(MSG_068); | ||||||
| 	case ERROR_CANNOT_COPY: | 	case ERROR_CANNOT_COPY: | ||||||
| 		return "Could not copy files to target drive."; | 		return lmprintf(MSG_069); | ||||||
| 	case ERROR_CANCELLED: | 	case ERROR_CANCELLED: | ||||||
| 		return "Cancelled by user."; | 		return lmprintf(MSG_070); | ||||||
| 	case ERROR_CANT_START_THREAD: | 	case ERROR_CANT_START_THREAD: | ||||||
| 		return "Unable to create formatting thread."; | 		return lmprintf(MSG_071); | ||||||
| 	case ERROR_BADBLOCKS_FAILURE: | 	case ERROR_BADBLOCKS_FAILURE: | ||||||
| 		return "Bad blocks check didn't complete."; | 		return lmprintf(MSG_072); | ||||||
| 	case ERROR_ISO_SCAN: | 	case ERROR_ISO_SCAN: | ||||||
| 		return "ISO image scan failure."; | 		return lmprintf(MSG_073); | ||||||
| 	case ERROR_ISO_EXTRACT: | 	case ERROR_ISO_EXTRACT: | ||||||
| 		return "ISO image extraction failure."; | 		return lmprintf(MSG_074); | ||||||
| 	case ERROR_CANT_REMOUNT_VOLUME: | 	case ERROR_CANT_REMOUNT_VOLUME: | ||||||
| 		return "Unable to remount volume."; | 		return lmprintf(MSG_075); | ||||||
| 	case ERROR_CANT_PATCH: | 	case ERROR_CANT_PATCH: | ||||||
| 		return "Unable to patch/setup files for boot."; | 		return lmprintf(MSG_076); | ||||||
| 	case ERROR_CANT_ASSIGN_LETTER: | 	case ERROR_CANT_ASSIGN_LETTER: | ||||||
| 		return "Unable to assign a drive letter."; | 		return lmprintf(MSG_077); | ||||||
| 	case ERROR_CANT_MOUNT_VOLUME: | 	case ERROR_CANT_MOUNT_VOLUME: | ||||||
| 		return "Can't mount GUID volume."; | 		return lmprintf(MSG_078); | ||||||
| 	default: | 	default: | ||||||
| 		uprintf("Unknown error: %08X\n", error_code); | 		uprintf("Unknown error: %08X\n", error_code); | ||||||
| 		SetLastError(error_code); | 		SetLastError(error_code); | ||||||
|  |  | ||||||
							
								
								
									
										216
									
								
								src/stdlg.c
									
										
									
									
									
								
							
							
						
						
									
										216
									
								
								src/stdlg.c
									
										
									
									
									
								
							|  | @ -39,6 +39,7 @@ | ||||||
| #include "registry.h" | #include "registry.h" | ||||||
| #include "resource.h" | #include "resource.h" | ||||||
| #include "license.h" | #include "license.h" | ||||||
|  | #include "localization.h" | ||||||
| 
 | 
 | ||||||
| /* The following is only available on Vista and later */ | /* The following is only available on Vista and later */ | ||||||
| #if (_WIN32_WINNT >= 0x0600) | #if (_WIN32_WINNT >= 0x0600) | ||||||
|  | @ -66,6 +67,7 @@ static const SETTEXTEX friggin_microsoft_unicode_amateurs = {ST_DEFAULT, CP_UTF8 | ||||||
| static BOOL notification_is_question; | static BOOL notification_is_question; | ||||||
| static const notification_info* notification_more_info; | static const notification_info* notification_more_info; | ||||||
| static BOOL reg_commcheck = FALSE; | static BOOL reg_commcheck = FALSE; | ||||||
|  | static WNDPROC original_wndproc = NULL; | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  * We need a sub-callback to read the content of the edit box on exit and update |  * We need a sub-callback to read the content of the edit box on exit and update | ||||||
|  | @ -222,7 +224,7 @@ fallback: | ||||||
| 	INIT_XP_SHELL32; | 	INIT_XP_SHELL32; | ||||||
| 	memset(&bi, 0, sizeof(BROWSEINFOW)); | 	memset(&bi, 0, sizeof(BROWSEINFOW)); | ||||||
| 	bi.hwndOwner = hMainDialog; | 	bi.hwndOwner = hMainDialog; | ||||||
| 	bi.lpszTitle = L"Please select the installation folder:"; | 	bi.lpszTitle = utf8_to_wchar(lmprintf(MSG_106)); | ||||||
| 	bi.lpfn = BrowseInfoCallback; | 	bi.lpfn = BrowseInfoCallback; | ||||||
| 	// BIF_NONEWFOLDERBUTTON = 0x00000200 is unknown on MinGW
 | 	// BIF_NONEWFOLDERBUTTON = 0x00000200 is unknown on MinGW
 | ||||||
| 	bi.ulFlags = BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS | | 	bi.ulFlags = BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS | | ||||||
|  | @ -231,6 +233,7 @@ fallback: | ||||||
| 	if (pidl != NULL) { | 	if (pidl != NULL) { | ||||||
| 		CoTaskMemFree(pidl); | 		CoTaskMemFree(pidl); | ||||||
| 	} | 	} | ||||||
|  | 	safe_free(bi.lpszTitle); | ||||||
| 	dialog_showing--; | 	dialog_showing--; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -244,7 +247,7 @@ char* FileDialog(BOOL save, char* path, char* filename, char* ext, char* ext_des | ||||||
| 	DWORD tmp; | 	DWORD tmp; | ||||||
| 	OPENFILENAMEA ofn; | 	OPENFILENAMEA ofn; | ||||||
| 	char selected_name[MAX_PATH]; | 	char selected_name[MAX_PATH]; | ||||||
| 	char* ext_string = NULL; | 	char *ext_string = NULL, *all_files = NULL; | ||||||
| 	size_t i, ext_strlen; | 	size_t i, ext_strlen; | ||||||
| 	BOOL r; | 	BOOL r; | ||||||
| 	char* filepath = NULL; | 	char* filepath = NULL; | ||||||
|  | @ -259,6 +262,7 @@ char* FileDialog(BOOL save, char* path, char* filename, char* ext, char* ext_des | ||||||
| 	IShellItem *si_path = NULL;	// Automatically freed
 | 	IShellItem *si_path = NULL;	// Automatically freed
 | ||||||
| 
 | 
 | ||||||
| 	dialog_showing++; | 	dialog_showing++; | ||||||
|  | 	memset(filter_spec, 0, sizeof(filter_spec)); | ||||||
| 	INIT_VISTA_SHELL32; | 	INIT_VISTA_SHELL32; | ||||||
| 	if (IS_VISTA_SHELL32_AVAILABLE) { | 	if (IS_VISTA_SHELL32_AVAILABLE) { | ||||||
| 		// Setup the file extension filter table
 | 		// Setup the file extension filter table
 | ||||||
|  | @ -269,7 +273,7 @@ char* FileDialog(BOOL save, char* path, char* filename, char* ext, char* ext_des | ||||||
| 			safe_free(ext_filter); | 			safe_free(ext_filter); | ||||||
| 			filter_spec[0].pszName = utf8_to_wchar(ext_desc); | 			filter_spec[0].pszName = utf8_to_wchar(ext_desc); | ||||||
| 			filter_spec[1].pszSpec = L"*.*"; | 			filter_spec[1].pszSpec = L"*.*"; | ||||||
| 			filter_spec[1].pszName = L"All files"; | 			filter_spec[1].pszName = utf8_to_wchar(lmprintf(MSG_107)); | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		hr = CoCreateInstance(save?&CLSID_FileSaveDialog:&CLSID_FileOpenDialog, NULL, CLSCTX_INPROC, | 		hr = CoCreateInstance(save?&CLSID_FileSaveDialog:&CLSID_FileOpenDialog, NULL, CLSCTX_INPROC, | ||||||
|  | @ -305,6 +309,7 @@ char* FileDialog(BOOL save, char* path, char* filename, char* ext, char* ext_des | ||||||
| 		safe_free(wfilename); | 		safe_free(wfilename); | ||||||
| 		safe_free(filter_spec[0].pszSpec); | 		safe_free(filter_spec[0].pszSpec); | ||||||
| 		safe_free(filter_spec[0].pszName); | 		safe_free(filter_spec[0].pszName); | ||||||
|  | 		safe_free(filter_spec[1].pszName); | ||||||
| 
 | 
 | ||||||
| 		if (SUCCEEDED(hr)) { | 		if (SUCCEEDED(hr)) { | ||||||
| 			// Obtain the result of the user's interaction with the dialog.
 | 			// Obtain the result of the user's interaction with the dialog.
 | ||||||
|  | @ -343,11 +348,12 @@ fallback: | ||||||
| 	ofn.lpstrFile = selected_name; | 	ofn.lpstrFile = selected_name; | ||||||
| 	ofn.nMaxFile = MAX_PATH; | 	ofn.nMaxFile = MAX_PATH; | ||||||
| 	// Set the file extension filters
 | 	// Set the file extension filters
 | ||||||
| 	ext_strlen = safe_strlen(ext_desc) + 2*safe_strlen(ext) + sizeof(" (*.)\0*.\0All Files (*.*)\0*.*\0\0"); | 	all_files = lmprintf(MSG_107); | ||||||
|  | 	ext_strlen = safe_strlen(ext_desc) + 2*safe_strlen(ext) + sizeof(" (*.)\0*.\0 (*.*)\0*.*\0\0") + safe_strlen(all_files); | ||||||
| 	ext_string = (char*)malloc(ext_strlen); | 	ext_string = (char*)malloc(ext_strlen); | ||||||
| 	if (ext_string == NULL) | 	if (ext_string == NULL) | ||||||
| 		return NULL; | 		return NULL; | ||||||
| 	safe_sprintf(ext_string, ext_strlen, "%s (*.%s)\r*.%s\rAll Files (*.*)\r*.*\r\0", ext_desc, ext, ext); | 	safe_sprintf(ext_string, ext_strlen, "%s (*.%s)\r*.%s\r%s (*.*)\r*.*\r\0", ext_desc, ext, ext, all_files); | ||||||
| 	// Microsoft could really have picked a better delimiter!
 | 	// Microsoft could really have picked a better delimiter!
 | ||||||
| 	for (i=0; i<ext_strlen; i++) { | 	for (i=0; i<ext_strlen; i++) { | ||||||
| 		if (ext_string[i] == '\r') { | 		if (ext_string[i] == '\r') { | ||||||
|  | @ -369,7 +375,7 @@ fallback: | ||||||
| 	} else { | 	} else { | ||||||
| 		tmp = CommDlgExtendedError(); | 		tmp = CommDlgExtendedError(); | ||||||
| 		if (tmp != 0) { | 		if (tmp != 0) { | ||||||
| 			uprintf("Could not selected file for %s. Error %X\n", save?"save":"open", tmp); | 			uprintf("Could not select file for %s. Error %X\n", save?"save":"open", tmp); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	safe_free(ext_string); | 	safe_free(ext_string); | ||||||
|  | @ -435,6 +441,43 @@ void CenterDialog(HWND hDlg) | ||||||
| 	MoveWindow(hDlg, Point.x, Point.y, nWidth, nHeight, FALSE); | 	MoveWindow(hDlg, Point.x, Point.y, nWidth, nHeight, FALSE); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // http://stackoverflow.com/questions/431470/window-border-width-and-height-in-win32-how-do-i-get-it
 | ||||||
|  | SIZE GetBorderSize(HWND hDlg) | ||||||
|  | { | ||||||
|  | 	RECT rect = {0, 0, 0, 0}; | ||||||
|  | 	SIZE size = {0, 0}; | ||||||
|  | 	WINDOWINFO wi; | ||||||
|  | 	wi.cbSize = sizeof(WINDOWINFO); | ||||||
|  | 
 | ||||||
|  | 	GetWindowInfo(hDlg, &wi); | ||||||
|  | 
 | ||||||
|  | 	AdjustWindowRectEx(&rect, wi.dwStyle, FALSE, wi.dwExStyle); | ||||||
|  | 	size.cx = rect.right - rect.left; | ||||||
|  | 	size.cy = rect.bottom - rect.top; | ||||||
|  | 	return size; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void ResizeMoveCtrl(HWND hDlg, HWND hCtrl, int dx, int dy, int dw, int dh) | ||||||
|  | { | ||||||
|  | 	RECT rect; | ||||||
|  | 	POINT point; | ||||||
|  | 	SIZE border = {0, 0}; | ||||||
|  | 
 | ||||||
|  | 	GetWindowRect(hCtrl, &rect); | ||||||
|  | 	point.x = rect.left; | ||||||
|  | 	point.y = rect.top; | ||||||
|  | 	ScreenToClient(hDlg, &point); | ||||||
|  | 	GetClientRect(hCtrl, &rect); | ||||||
|  | 
 | ||||||
|  | 	// If we're dealing with a dialog, we must take the border into account
 | ||||||
|  | 	if (hCtrl == hDlg) | ||||||
|  | 		border = GetBorderSize(hDlg); | ||||||
|  | 	MoveWindow(hCtrl, point.x + (int)(fScale*(float)dx), point.y + (int)(fScale*(float)dy), | ||||||
|  | 		(rect.right - rect.left) + (int)(fScale*(float)dw + border.cx), | ||||||
|  | 		(rect.bottom - rect.top) + border.cy, TRUE); | ||||||
|  | 	InvalidateRect(hCtrl, NULL, TRUE); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| /*
 | /*
 | ||||||
|  * License callback |  * License callback | ||||||
|  */ |  */ | ||||||
|  | @ -442,6 +485,7 @@ INT_PTR CALLBACK LicenseCallback(HWND hDlg, UINT message, WPARAM wParam, LPARAM | ||||||
| { | { | ||||||
| 	switch (message) { | 	switch (message) { | ||||||
| 	case WM_INITDIALOG: | 	case WM_INITDIALOG: | ||||||
|  | 		apply_localization(IDD_LICENSE, hDlg); | ||||||
| 		CenterDialog(hDlg); | 		CenterDialog(hDlg); | ||||||
| 		SetDlgItemTextA(hDlg, IDC_LICENSE_TEXT, gplv3); | 		SetDlgItemTextA(hDlg, IDC_LICENSE_TEXT, gplv3); | ||||||
| 		break; | 		break; | ||||||
|  | @ -449,6 +493,7 @@ INT_PTR CALLBACK LicenseCallback(HWND hDlg, UINT message, WPARAM wParam, LPARAM | ||||||
| 		switch (LOWORD(wParam)) { | 		switch (LOWORD(wParam)) { | ||||||
| 		case IDOK: | 		case IDOK: | ||||||
| 		case IDCANCEL: | 		case IDCANCEL: | ||||||
|  | 			reset_localization(IDD_LICENSE); | ||||||
| 			EndDialog(hDlg, LOWORD(wParam)); | 			EndDialog(hDlg, LOWORD(wParam)); | ||||||
| 			return (INT_PTR)TRUE; | 			return (INT_PTR)TRUE; | ||||||
| 		} | 		} | ||||||
|  | @ -463,7 +508,7 @@ INT_PTR CALLBACK AboutCallback(HWND hDlg, UINT message, WPARAM wParam, LPARAM lP | ||||||
| { | { | ||||||
| 	int i; | 	int i; | ||||||
| 	const int edit_id[2] = {IDC_ABOUT_BLURB, IDC_ABOUT_COPYRIGHTS}; | 	const int edit_id[2] = {IDC_ABOUT_BLURB, IDC_ABOUT_COPYRIGHTS}; | ||||||
| 	char about_blurb[1024]; | 	char about_blurb[2048]; | ||||||
| 	const char* edit_text[2] = {about_blurb, additional_copyrights}; | 	const char* edit_text[2] = {about_blurb, additional_copyrights}; | ||||||
| 	HWND hEdit[2]; | 	HWND hEdit[2]; | ||||||
| 	TEXTRANGEW tr; | 	TEXTRANGEW tr; | ||||||
|  | @ -472,12 +517,15 @@ INT_PTR CALLBACK AboutCallback(HWND hDlg, UINT message, WPARAM wParam, LPARAM lP | ||||||
| 
 | 
 | ||||||
| 	switch (message) { | 	switch (message) { | ||||||
| 	case WM_INITDIALOG: | 	case WM_INITDIALOG: | ||||||
|  | 		// Execute dialog localization
 | ||||||
|  | 		apply_localization(IDD_ABOUTBOX, hDlg); | ||||||
| 		SetTitleBarIcon(hDlg); | 		SetTitleBarIcon(hDlg); | ||||||
| 		CenterDialog(hDlg); | 		CenterDialog(hDlg); | ||||||
| 		if (reg_commcheck) | 		if (reg_commcheck) | ||||||
| 			ShowWindow(GetDlgItem(hDlg, IDC_ABOUT_UPDATES), SW_SHOW); | 			ShowWindow(GetDlgItem(hDlg, IDC_ABOUT_UPDATES), SW_SHOW); | ||||||
| 		safe_sprintf(about_blurb, sizeof(about_blurb), about_blurb_format,  | 		safe_sprintf(about_blurb, sizeof(about_blurb), about_blurb_format, lmprintf(MSG_174), | ||||||
| 			rufus_version[0], rufus_version[1], rufus_version[2], rufus_version[3]); | 			lmprintf(MSG_175, rufus_version[0], rufus_version[1], rufus_version[2], rufus_version[3]), | ||||||
|  | 			lmprintf(MSG_176), lmprintf(MSG_177), lmprintf(MSG_178)); | ||||||
| 		for (i=0; i<ARRAYSIZE(hEdit); i++) { | 		for (i=0; i<ARRAYSIZE(hEdit); i++) { | ||||||
| 			hEdit[i] = GetDlgItem(hDlg, edit_id[i]); | 			hEdit[i] = GetDlgItem(hDlg, edit_id[i]); | ||||||
| 			SendMessage(hEdit[i], EM_AUTOURLDETECT, 1, 0); | 			SendMessage(hEdit[i], EM_AUTOURLDETECT, 1, 0); | ||||||
|  | @ -510,13 +558,14 @@ INT_PTR CALLBACK AboutCallback(HWND hDlg, UINT message, WPARAM wParam, LPARAM lP | ||||||
| 		switch (LOWORD(wParam)) { | 		switch (LOWORD(wParam)) { | ||||||
| 		case IDOK: | 		case IDOK: | ||||||
| 		case IDCANCEL: | 		case IDCANCEL: | ||||||
|  | 			reset_localization(IDD_ABOUTBOX); | ||||||
| 			EndDialog(hDlg, LOWORD(wParam)); | 			EndDialog(hDlg, LOWORD(wParam)); | ||||||
| 			return (INT_PTR)TRUE; | 			return (INT_PTR)TRUE; | ||||||
| 		case IDC_ABOUT_LICENSE: | 		case IDC_ABOUT_LICENSE: | ||||||
| 			DialogBoxA(hMainInstance, MAKEINTRESOURCEA(IDD_LICENSE), hDlg, LicenseCallback); | 			DialogBoxW(hMainInstance, MAKEINTRESOURCEW(IDD_LICENSE), hDlg, LicenseCallback); | ||||||
| 			break; | 			break; | ||||||
| 		case IDC_ABOUT_UPDATES: | 		case IDC_ABOUT_UPDATES: | ||||||
| 			DialogBoxA(hMainInstance, MAKEINTRESOURCEA(IDD_UPDATE_POLICY), hDlg, UpdateCallback); | 			DialogBoxW(hMainInstance, MAKEINTRESOURCEW(IDD_UPDATE_POLICY), hDlg, UpdateCallback); | ||||||
| 			break; | 			break; | ||||||
| 		} | 		} | ||||||
| 		break; | 		break; | ||||||
|  | @ -528,7 +577,7 @@ INT_PTR CreateAboutBox(void) | ||||||
| { | { | ||||||
| 	INT_PTR r; | 	INT_PTR r; | ||||||
| 	dialog_showing++; | 	dialog_showing++; | ||||||
| 	r = DialogBoxA(hMainInstance, MAKEINTRESOURCEA(IDD_ABOUTBOX), hMainDialog, AboutCallback); | 	r = DialogBoxW(hMainInstance, MAKEINTRESOURCEW(IDD_ABOUTBOX), hMainDialog, AboutCallback); | ||||||
| 	dialog_showing--; | 	dialog_showing--; | ||||||
| 	return r; | 	return r; | ||||||
| } | } | ||||||
|  | @ -547,6 +596,7 @@ INT_PTR CALLBACK NotificationCallback(HWND hDlg, UINT message, WPARAM wParam, LP | ||||||
| 
 | 
 | ||||||
| 	switch (message) { | 	switch (message) { | ||||||
| 	case WM_INITDIALOG: | 	case WM_INITDIALOG: | ||||||
|  | 		apply_localization(IDD_NOTIFICATION, hDlg); | ||||||
| 		white_brush = CreateSolidBrush(WHITE); | 		white_brush = CreateSolidBrush(WHITE); | ||||||
| 		separator_brush = CreateSolidBrush(SEPARATOR_GREY); | 		separator_brush = CreateSolidBrush(SEPARATOR_GREY); | ||||||
| 		SetTitleBarIcon(hDlg); | 		SetTitleBarIcon(hDlg); | ||||||
|  | @ -557,11 +607,11 @@ INT_PTR CALLBACK NotificationCallback(HWND hDlg, UINT message, WPARAM wParam, LP | ||||||
| 		} | 		} | ||||||
| 		// Set the dialog title
 | 		// Set the dialog title
 | ||||||
| 		if (szMessageTitle != NULL) { | 		if (szMessageTitle != NULL) { | ||||||
| 			SetWindowTextA(hDlg, szMessageTitle); | 			SetWindowTextU(hDlg, szMessageTitle); | ||||||
| 		} | 		} | ||||||
| 		// Enable/disable the buttons and set text
 | 		// Enable/disable the buttons and set text
 | ||||||
| 		if (!notification_is_question) { | 		if (!notification_is_question) { | ||||||
| 			SetWindowTextA(GetDlgItem(hDlg, IDNO), "Close"); | 			SetWindowTextU(GetDlgItem(hDlg, IDNO), lmprintf(MSG_006)); | ||||||
| 		} else { | 		} else { | ||||||
| 			ShowWindow(GetDlgItem(hDlg, IDYES), SW_SHOW); | 			ShowWindow(GetDlgItem(hDlg, IDYES), SW_SHOW); | ||||||
| 		} | 		} | ||||||
|  | @ -570,7 +620,7 @@ INT_PTR CALLBACK NotificationCallback(HWND hDlg, UINT message, WPARAM wParam, LP | ||||||
| 		} | 		} | ||||||
| 		// Set the control text
 | 		// Set the control text
 | ||||||
| 		if (szMessageText != NULL) { | 		if (szMessageText != NULL) { | ||||||
| 			SetWindowTextA(GetDlgItem(hDlg, IDC_NOTIFICATION_TEXT), szMessageText); | 			SetWindowTextU(GetDlgItem(hDlg, IDC_NOTIFICATION_TEXT), szMessageText); | ||||||
| 		} | 		} | ||||||
| 		return (INT_PTR)TRUE; | 		return (INT_PTR)TRUE; | ||||||
| 	case WM_CTLCOLORSTATIC: | 	case WM_CTLCOLORSTATIC: | ||||||
|  | @ -599,7 +649,7 @@ INT_PTR CALLBACK NotificationCallback(HWND hDlg, UINT message, WPARAM wParam, LP | ||||||
| 			return (INT_PTR)TRUE; | 			return (INT_PTR)TRUE; | ||||||
| 		case IDC_MORE_INFO: | 		case IDC_MORE_INFO: | ||||||
| 			if (notification_more_info != NULL) | 			if (notification_more_info != NULL) | ||||||
| 				DialogBoxA(hMainInstance, MAKEINTRESOURCEA(notification_more_info->id), | 				DialogBoxW(hMainInstance, MAKEINTRESOURCEW(notification_more_info->id), | ||||||
| 					hDlg, notification_more_info->callback); | 					hDlg, notification_more_info->callback); | ||||||
| 			break; | 			break; | ||||||
| 		} | 		} | ||||||
|  | @ -937,17 +987,19 @@ INT_PTR CALLBACK UpdateCallback(HWND hDlg, UINT message, WPARAM wParam, LPARAM l | ||||||
| 	HWND hPolicy; | 	HWND hPolicy; | ||||||
| 	static HWND hFrequency, hBeta; | 	static HWND hFrequency, hBeta; | ||||||
| 	int32_t freq; | 	int32_t freq; | ||||||
|  | 	char update_policy_text[4096]; | ||||||
| 
 | 
 | ||||||
| 	switch (message) { | 	switch (message) { | ||||||
| 	case WM_INITDIALOG: | 	case WM_INITDIALOG: | ||||||
|  | 		apply_localization(IDD_UPDATE_POLICY, hDlg); | ||||||
| 		SetTitleBarIcon(hDlg); | 		SetTitleBarIcon(hDlg); | ||||||
| 		CenterDialog(hDlg); | 		CenterDialog(hDlg); | ||||||
| 		hFrequency = GetDlgItem(hDlg, IDC_UPDATE_FREQUENCY); | 		hFrequency = GetDlgItem(hDlg, IDC_UPDATE_FREQUENCY); | ||||||
| 		hBeta = GetDlgItem(hDlg, IDC_INCLUDE_BETAS); | 		hBeta = GetDlgItem(hDlg, IDC_INCLUDE_BETAS); | ||||||
| 		IGNORE_RETVAL(ComboBox_SetItemData(hFrequency, ComboBox_AddStringU(hFrequency, "Disabled"), -1)); | 		IGNORE_RETVAL(ComboBox_SetItemData(hFrequency, ComboBox_AddStringU(hFrequency, lmprintf(MSG_013)), -1)); | ||||||
| 		IGNORE_RETVAL(ComboBox_SetItemData(hFrequency, ComboBox_AddStringU(hFrequency, "Daily (Default)"), 86400)); | 		IGNORE_RETVAL(ComboBox_SetItemData(hFrequency, ComboBox_AddStringU(hFrequency, lmprintf(MSG_030, lmprintf(MSG_014))), 86400)); | ||||||
| 		IGNORE_RETVAL(ComboBox_SetItemData(hFrequency, ComboBox_AddStringU(hFrequency, "Weekly"), 604800)); | 		IGNORE_RETVAL(ComboBox_SetItemData(hFrequency, ComboBox_AddStringU(hFrequency, lmprintf(MSG_015)), 604800)); | ||||||
| 		IGNORE_RETVAL(ComboBox_SetItemData(hFrequency, ComboBox_AddStringU(hFrequency, "Monthly"), 2629800)); | 		IGNORE_RETVAL(ComboBox_SetItemData(hFrequency, ComboBox_AddStringU(hFrequency, lmprintf(MSG_016)), 2629800)); | ||||||
| 		freq = ReadRegistryKey32(REGKEY_HKCU, REGKEY_UPDATE_INTERVAL); | 		freq = ReadRegistryKey32(REGKEY_HKCU, REGKEY_UPDATE_INTERVAL); | ||||||
| 		EnableWindow(GetDlgItem(hDlg, IDC_CHECK_NOW), (freq != 0)); | 		EnableWindow(GetDlgItem(hDlg, IDC_CHECK_NOW), (freq != 0)); | ||||||
| 		EnableWindow(hBeta, (freq >= 0)); | 		EnableWindow(hBeta, (freq >= 0)); | ||||||
|  | @ -966,16 +1018,19 @@ INT_PTR CALLBACK UpdateCallback(HWND hDlg, UINT message, WPARAM wParam, LPARAM l | ||||||
| 			IGNORE_RETVAL(ComboBox_SetCurSel(hFrequency, 3)); | 			IGNORE_RETVAL(ComboBox_SetCurSel(hFrequency, 3)); | ||||||
| 			break; | 			break; | ||||||
| 		default: | 		default: | ||||||
| 			IGNORE_RETVAL(ComboBox_SetItemData(hFrequency, ComboBox_AddStringU(hFrequency, "Custom"), freq)); | 			IGNORE_RETVAL(ComboBox_SetItemData(hFrequency, ComboBox_AddStringU(hFrequency, lmprintf(MSG_017)), freq)); | ||||||
| 			IGNORE_RETVAL(ComboBox_SetCurSel(hFrequency, 4)); | 			IGNORE_RETVAL(ComboBox_SetCurSel(hFrequency, 4)); | ||||||
| 			break; | 			break; | ||||||
| 		} | 		} | ||||||
| 		IGNORE_RETVAL(ComboBox_AddStringU(hBeta, "Yes")); | 		IGNORE_RETVAL(ComboBox_AddStringU(hBeta, lmprintf(MSG_008))); | ||||||
| 		IGNORE_RETVAL(ComboBox_AddStringU(hBeta, "No")); | 		IGNORE_RETVAL(ComboBox_AddStringU(hBeta, lmprintf(MSG_009))); | ||||||
| 		IGNORE_RETVAL(ComboBox_SetCurSel(hBeta, GetRegistryKeyBool(REGKEY_HKCU, REGKEY_INCLUDE_BETAS)?0:1)); | 		IGNORE_RETVAL(ComboBox_SetCurSel(hBeta, GetRegistryKeyBool(REGKEY_HKCU, REGKEY_INCLUDE_BETAS)?0:1)); | ||||||
| 		hPolicy = GetDlgItem(hDlg, IDC_POLICY); | 		hPolicy = GetDlgItem(hDlg, IDC_POLICY); | ||||||
| 		SendMessage(hPolicy, EM_AUTOURLDETECT, 1, 0); | 		SendMessage(hPolicy, EM_AUTOURLDETECT, 1, 0); | ||||||
| 		SendMessageA(hPolicy, EM_SETTEXTEX, (WPARAM)&friggin_microsoft_unicode_amateurs, (LPARAM)update_policy); | 		safe_sprintf(update_policy_text, sizeof(update_policy_text), update_policy, lmprintf(MSG_179), | ||||||
|  | 			lmprintf(MSG_180), lmprintf(MSG_181), lmprintf(MSG_182), lmprintf(MSG_183), lmprintf(MSG_184), | ||||||
|  | 			lmprintf(MSG_185), lmprintf(MSG_186)); | ||||||
|  | 		SendMessageA(hPolicy, EM_SETTEXTEX, (WPARAM)&friggin_microsoft_unicode_amateurs, (LPARAM)update_policy_text); | ||||||
| 		SendMessage(hPolicy, EM_SETSEL, -1, -1); | 		SendMessage(hPolicy, EM_SETSEL, -1, -1); | ||||||
| 		SendMessage(hPolicy, EM_SETEVENTMASK, 0, ENM_LINK); | 		SendMessage(hPolicy, EM_SETEVENTMASK, 0, ENM_LINK); | ||||||
| 		SendMessageA(hPolicy, EM_SETBKGNDCOLOR, 0, (LPARAM)GetSysColor(COLOR_BTNFACE)); | 		SendMessageA(hPolicy, EM_SETBKGNDCOLOR, 0, (LPARAM)GetSysColor(COLOR_BTNFACE)); | ||||||
|  | @ -984,6 +1039,7 @@ INT_PTR CALLBACK UpdateCallback(HWND hDlg, UINT message, WPARAM wParam, LPARAM l | ||||||
| 		switch (LOWORD(wParam)) { | 		switch (LOWORD(wParam)) { | ||||||
| 		case IDCLOSE: | 		case IDCLOSE: | ||||||
| 		case IDCANCEL: | 		case IDCANCEL: | ||||||
|  | 			reset_localization(IDD_UPDATE_POLICY); | ||||||
| 			EndDialog(hDlg, LOWORD(wParam)); | 			EndDialog(hDlg, LOWORD(wParam)); | ||||||
| 			return (INT_PTR)TRUE; | 			return (INT_PTR)TRUE; | ||||||
| 		case IDC_CHECK_NOW: | 		case IDC_CHECK_NOW: | ||||||
|  | @ -1036,8 +1092,7 @@ BOOL SetUpdateCheck(void) | ||||||
| 			uprintf("Short name used - Disabling initial update policy prompt\n"); | 			uprintf("Short name used - Disabling initial update policy prompt\n"); | ||||||
| 			enable_updates = TRUE; | 			enable_updates = TRUE; | ||||||
| 		} else { | 		} else { | ||||||
| 			enable_updates = Notification(MSG_QUESTION, &more_info, APPLICATION_NAME " update policy", | 			enable_updates = Notification(MSG_QUESTION, &more_info, lmprintf(MSG_004), lmprintf(MSG_005)); | ||||||
| 				"Do you want to allow " APPLICATION_NAME " to check for application updates?\n"); |  | ||||||
| 		} | 		} | ||||||
| 		if (!enable_updates) { | 		if (!enable_updates) { | ||||||
| 			WriteRegistryKey32(REGKEY_HKCU, REGKEY_UPDATE_INTERVAL, -1); | 			WriteRegistryKey32(REGKEY_HKCU, REGKEY_UPDATE_INTERVAL, -1); | ||||||
|  | @ -1051,6 +1106,48 @@ BOOL SetUpdateCheck(void) | ||||||
| 	return TRUE; | 	return TRUE; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static void CreateStaticFont(HDC dc, HFONT* hyperlink_font) { | ||||||
|  | 	TEXTMETRIC tm; | ||||||
|  | 	LOGFONT lf; | ||||||
|  | 
 | ||||||
|  | 	if (*hyperlink_font != NULL) | ||||||
|  | 		return; | ||||||
|  | 	GetTextMetrics(dc, &tm); | ||||||
|  | 	lf.lfHeight = tm.tmHeight; | ||||||
|  | 	lf.lfWidth = 0; | ||||||
|  | 	lf.lfEscapement = 0; | ||||||
|  | 	lf.lfOrientation = 0; | ||||||
|  | 	lf.lfWeight = tm.tmWeight; | ||||||
|  | 	lf.lfItalic = tm.tmItalic; | ||||||
|  | 	lf.lfUnderline = TRUE; | ||||||
|  | 	lf.lfStrikeOut = tm.tmStruckOut; | ||||||
|  | 	lf.lfCharSet = tm.tmCharSet; | ||||||
|  | 	lf.lfOutPrecision = OUT_DEFAULT_PRECIS; | ||||||
|  | 	lf.lfClipPrecision = CLIP_DEFAULT_PRECIS; | ||||||
|  | 	lf.lfQuality = DEFAULT_QUALITY; | ||||||
|  | 	lf.lfPitchAndFamily = tm.tmPitchAndFamily; | ||||||
|  | 	GetTextFace(dc, LF_FACESIZE, lf.lfFaceName); | ||||||
|  | 	*hyperlink_font = CreateFontIndirect(&lf); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Work around the limitations of edit control, to display a hand cursor for hyperlinks | ||||||
|  |  * NB: The LTEXT control must have SS_NOTIFY attribute for this to work | ||||||
|  |  */ | ||||||
|  | INT_PTR CALLBACK subclass_callback(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) | ||||||
|  | { | ||||||
|  | 	switch (message) | ||||||
|  | 	{ | ||||||
|  | 	case WM_SETCURSOR: | ||||||
|  | 		if ((HWND)wParam == GetDlgItem(hDlg, IDC_WEBSITE)) { | ||||||
|  | 			SetCursor(LoadCursor(NULL, IDC_HAND)); | ||||||
|  | 			return (INT_PTR)TRUE; | ||||||
|  | 		} | ||||||
|  | 		break; | ||||||
|  | 	} | ||||||
|  | 	return CallWindowProc(original_wndproc, hDlg, message, wParam, lParam); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| /*
 | /*
 | ||||||
|  * New version notification dialog |  * New version notification dialog | ||||||
|  */ |  */ | ||||||
|  | @ -1058,64 +1155,55 @@ INT_PTR CALLBACK NewVersionCallback(HWND hDlg, UINT message, WPARAM wParam, LPAR | ||||||
| { | { | ||||||
| 	int i; | 	int i; | ||||||
| 	HWND hNotes; | 	HWND hNotes; | ||||||
| 	TEXTRANGEW tr; |  | ||||||
| 	ENLINK* enl; |  | ||||||
| 	wchar_t wUrl[256]; |  | ||||||
| 	char tmp[128]; | 	char tmp[128]; | ||||||
| 	static char* filepath = NULL; | 	static char* filepath = NULL; | ||||||
| 	static int download_status = 0; | 	static int download_status = 0; | ||||||
| 	STARTUPINFOA si; | 	STARTUPINFOA si; | ||||||
| 	PROCESS_INFORMATION pi; | 	PROCESS_INFORMATION pi; | ||||||
|  | 	HFONT hyperlink_font = NULL; | ||||||
| 
 | 
 | ||||||
| 	switch (message) { | 	switch (message) { | ||||||
| 	case WM_INITDIALOG: | 	case WM_INITDIALOG: | ||||||
|  | 		apply_localization(IDD_NEW_VERSION, hDlg); | ||||||
| 		download_status = 0; | 		download_status = 0; | ||||||
| 		SetTitleBarIcon(hDlg); | 		SetTitleBarIcon(hDlg); | ||||||
| 		CenterDialog(hDlg); | 		CenterDialog(hDlg); | ||||||
|  | 		// Subclass the callback so that we can change the cursor
 | ||||||
|  | 		original_wndproc = (WNDPROC)SetWindowLongPtr(hDlg, GWLP_WNDPROC, (LONG_PTR)subclass_callback); | ||||||
| 		hNotes = GetDlgItem(hDlg, IDC_RELEASE_NOTES); | 		hNotes = GetDlgItem(hDlg, IDC_RELEASE_NOTES); | ||||||
| 		SendMessage(hNotes, EM_AUTOURLDETECT, 1, 0); | 		SendMessage(hNotes, EM_AUTOURLDETECT, 1, 0); | ||||||
| 		SendMessageA(hNotes, EM_SETTEXTEX, (WPARAM)&friggin_microsoft_unicode_amateurs, (LPARAM)update.release_notes); | 		SendMessageA(hNotes, EM_SETTEXTEX, (WPARAM)&friggin_microsoft_unicode_amateurs, (LPARAM)update.release_notes); | ||||||
| 		SendMessage(hNotes, EM_SETSEL, -1, -1); | 		SendMessage(hNotes, EM_SETSEL, -1, -1); | ||||||
| 		SendMessage(hNotes, EM_SETEVENTMASK, 0, ENM_LINK); | 		SendMessage(hNotes, EM_SETEVENTMASK, 0, ENM_LINK); | ||||||
| 		safe_sprintf(tmp, sizeof(tmp), "Your version: %d.%d.%d (Build %d)", | 		SetWindowTextU(GetDlgItem(hDlg, IDC_YOUR_VERSION), lmprintf(MSG_018,  | ||||||
| 			rufus_version[0], rufus_version[1], rufus_version[2], rufus_version[3]); | 			rufus_version[0], rufus_version[1], rufus_version[2], rufus_version[3])); | ||||||
| 		SetWindowTextA(GetDlgItem(hDlg, IDC_YOUR_VERSION), tmp); | 		SetWindowTextU(GetDlgItem(hDlg, IDC_LATEST_VERSION), lmprintf(MSG_019, | ||||||
| 		safe_sprintf(tmp, sizeof(tmp), "Latest version: %d.%d.%d (Build %d)", | 			update.version[0], update.version[1], update.version[2], update.version[3])); | ||||||
| 			update.version[0], update.version[1], update.version[2], update.version[3]); | 		SetWindowTextU(GetDlgItem(hDlg, IDC_DOWNLOAD_URL), update.download_url); | ||||||
| 		SetWindowTextA(GetDlgItem(hDlg, IDC_LATEST_VERSION), tmp); |  | ||||||
| 		SetWindowTextA(GetDlgItem(hDlg, IDC_DOWNLOAD_URL), update.download_url); |  | ||||||
| 		SendMessage(GetDlgItem(hDlg, IDC_PROGRESS), PBM_SETRANGE, 0, (MAX_PROGRESS<<16) & 0xFFFF0000); | 		SendMessage(GetDlgItem(hDlg, IDC_PROGRESS), PBM_SETRANGE, 0, (MAX_PROGRESS<<16) & 0xFFFF0000); | ||||||
| 		if (update.download_url == NULL) | 		if (update.download_url == NULL) | ||||||
| 			EnableWindow(GetDlgItem(hDlg, IDC_DOWNLOAD), FALSE); | 			EnableWindow(GetDlgItem(hDlg, IDC_DOWNLOAD), FALSE); | ||||||
| 		break; | 		break; | ||||||
| 	case WM_NOTIFY: | 	case WM_CTLCOLORSTATIC: | ||||||
| 		switch (((LPNMHDR)lParam)->code) { | 		if ((HWND)lParam != GetDlgItem(hDlg, IDC_WEBSITE)) | ||||||
| 		case NM_CLICK: | 			return FALSE; | ||||||
| 		case NM_RETURN: | 		// Change the font for the hyperlink
 | ||||||
| 			if (LOWORD(wParam) == IDC_WEBSITE) { | 		SetBkMode((HDC)wParam, TRANSPARENT); | ||||||
| 				ShellExecuteA(hDlg, "open", RUFUS_URL, NULL, NULL, SW_SHOWNORMAL); | 		CreateStaticFont((HDC)wParam, &hyperlink_font); | ||||||
| 			} | 		SelectObject((HDC)wParam, hyperlink_font); | ||||||
| 			break; | 		SetTextColor((HDC)wParam, RGB(0,0,125));	// DARK_BLUE
 | ||||||
| 		case EN_LINK: | 		return (INT_PTR)CreateSolidBrush(GetSysColor(COLOR_BTNFACE)); | ||||||
| 			enl = (ENLINK*) lParam; |  | ||||||
| 			if (enl->msg == WM_LBUTTONUP) { |  | ||||||
| 				tr.lpstrText = wUrl; |  | ||||||
| 				tr.chrg.cpMin = enl->chrg.cpMin; |  | ||||||
| 				tr.chrg.cpMax = enl->chrg.cpMax; |  | ||||||
| 				SendMessageW(enl->nmhdr.hwndFrom, EM_GETTEXTRANGE, 0, (LPARAM)&tr); |  | ||||||
| 				wUrl[ARRAYSIZE(wUrl)-1] = 0; |  | ||||||
| 				ShellExecuteW(hDlg, L"open", wUrl, NULL, NULL, SW_SHOWNORMAL); |  | ||||||
| 			} |  | ||||||
| 			break; |  | ||||||
| 		} |  | ||||||
| 		break; |  | ||||||
| 	case WM_COMMAND: | 	case WM_COMMAND: | ||||||
| 		switch (LOWORD(wParam)) { | 		switch (LOWORD(wParam)) { | ||||||
| 		case IDCLOSE: | 		case IDCLOSE: | ||||||
| 		case IDCANCEL: | 		case IDCANCEL: | ||||||
|  | 			reset_localization(IDD_NEW_VERSION); | ||||||
| 			safe_free(filepath); | 			safe_free(filepath); | ||||||
| 			EndDialog(hDlg, LOWORD(wParam)); | 			EndDialog(hDlg, LOWORD(wParam)); | ||||||
| 			return (INT_PTR)TRUE; | 			return (INT_PTR)TRUE; | ||||||
|  | 		case IDC_WEBSITE: | ||||||
|  | 			ShellExecuteA(hDlg, "open", RUFUS_URL, NULL, NULL, SW_SHOWNORMAL); | ||||||
|  | 			break; | ||||||
| 		case IDC_DOWNLOAD:	// Also doubles as abort and launch function
 | 		case IDC_DOWNLOAD:	// Also doubles as abort and launch function
 | ||||||
| 			switch(download_status) { | 			switch(download_status) { | ||||||
| 			case 1:		// Abort
 | 			case 1:		// Abort
 | ||||||
|  | @ -1130,17 +1218,17 @@ INT_PTR CALLBACK NewVersionCallback(HWND hDlg, UINT message, WPARAM wParam, LPAR | ||||||
| 				memset(&pi, 0, sizeof(pi)); | 				memset(&pi, 0, sizeof(pi)); | ||||||
| 				si.cb = sizeof(si); | 				si.cb = sizeof(si); | ||||||
| 				if (!CreateProcessU(NULL, tmp, NULL, NULL, FALSE, 0, NULL, filepath, &si, &pi)) { | 				if (!CreateProcessU(NULL, tmp, NULL, NULL, FALSE, 0, NULL, filepath, &si, &pi)) { | ||||||
| 					PrintStatus(0, FALSE, "Failed to launch new application"); | 					PrintStatus(0, FALSE, lmprintf(MSG_214)); | ||||||
| 					uprintf("Failed to launch new application: %s\n", WindowsErrorString()); | 					uprintf("Failed to launch new application: %s\n", WindowsErrorString()); | ||||||
| 				} else { | 				} else { | ||||||
| 					PrintStatus(0, FALSE, "Launching new application..."); | 					PrintStatus(0, FALSE, lmprintf(MSG_213)); | ||||||
| 					PostMessage(hDlg, WM_COMMAND, (WPARAM)IDCLOSE, 0); | 					PostMessage(hDlg, WM_COMMAND, (WPARAM)IDCLOSE, 0); | ||||||
| 					PostMessage(hMainDialog, WM_CLOSE, 0, 0); | 					PostMessage(hMainDialog, WM_CLOSE, 0, 0); | ||||||
| 				} | 				} | ||||||
| 				break; | 				break; | ||||||
| 			default:	// Download
 | 			default:	// Download
 | ||||||
| 				for (i=(int)safe_strlen(update.download_url); (i>0)&&(update.download_url[i]!='/'); i--); | 				for (i=(int)safe_strlen(update.download_url); (i>0)&&(update.download_url[i]!='/'); i--); | ||||||
| 				filepath = FileDialog(TRUE, app_dir, (char*)&update.download_url[i+1], "exe", "Application"); | 				filepath = FileDialog(TRUE, app_dir, (char*)&update.download_url[i+1], "exe", lmprintf(MSG_037)); | ||||||
| 				if (filepath != NULL) | 				if (filepath != NULL) | ||||||
| 					DownloadFileThreaded(update.download_url, filepath, hDlg); | 					DownloadFileThreaded(update.download_url, filepath, hDlg); | ||||||
| 				break; | 				break; | ||||||
|  | @ -1151,14 +1239,14 @@ INT_PTR CALLBACK NewVersionCallback(HWND hDlg, UINT message, WPARAM wParam, LPAR | ||||||
| 	case UM_ISO_INIT: | 	case UM_ISO_INIT: | ||||||
| 		FormatStatus = 0; | 		FormatStatus = 0; | ||||||
| 		download_status = 1; | 		download_status = 1; | ||||||
| 		SetWindowTextA(GetDlgItem(hDlg, IDC_DOWNLOAD), "Abort"); | 		SetWindowTextU(GetDlgItem(hDlg, IDC_DOWNLOAD), lmprintf(MSG_038)); | ||||||
| 		return (INT_PTR)TRUE; | 		return (INT_PTR)TRUE; | ||||||
| 	case UM_ISO_EXIT: | 	case UM_ISO_EXIT: | ||||||
| 		if (wParam) { | 		if (wParam) { | ||||||
| 			SetWindowTextA(GetDlgItem(hDlg, IDC_DOWNLOAD), "Launch"); | 			SetWindowTextU(GetDlgItem(hDlg, IDC_DOWNLOAD), lmprintf(MSG_039)); | ||||||
| 			download_status = 2; | 			download_status = 2; | ||||||
| 		} else { | 		} else { | ||||||
| 			SetWindowTextA(GetDlgItem(hDlg, IDC_DOWNLOAD), "Download"); | 			SetWindowTextU(GetDlgItem(hDlg, IDC_DOWNLOAD), lmprintf(MSG_040)); | ||||||
| 			download_status = 0; | 			download_status = 0; | ||||||
| 		} | 		} | ||||||
| 		return (INT_PTR)TRUE; | 		return (INT_PTR)TRUE; | ||||||
|  | @ -1168,7 +1256,7 @@ INT_PTR CALLBACK NewVersionCallback(HWND hDlg, UINT message, WPARAM wParam, LPAR | ||||||
| 
 | 
 | ||||||
| void DownloadNewVersion(void) | void DownloadNewVersion(void) | ||||||
| { | { | ||||||
| 	DialogBoxA(hMainInstance, MAKEINTRESOURCEA(IDD_NEW_VERSION), hMainDialog, NewVersionCallback); | 	DialogBoxW(hMainInstance, MAKEINTRESOURCEW(IDD_NEW_VERSION), hMainDialog, NewVersionCallback); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void SetTitleBarIcon(HWND hDlg) | void SetTitleBarIcon(HWND hDlg) | ||||||
|  |  | ||||||
|  | @ -28,6 +28,7 @@ | ||||||
| 
 | 
 | ||||||
| #include "rufus.h" | #include "rufus.h" | ||||||
| #include "resource.h" | #include "resource.h" | ||||||
|  | #include "localization.h" | ||||||
| 
 | 
 | ||||||
| #include "syslinux.h" | #include "syslinux.h" | ||||||
| #include "syslxfs.h" | #include "syslxfs.h" | ||||||
|  | @ -91,7 +92,7 @@ BOOL InstallSyslinux(DWORD drive_index, char drive_letter) | ||||||
| 	int dt = (int)ComboBox_GetItemData(hBootType, ComboBox_GetCurSel(hBootType)); | 	int dt = (int)ComboBox_GetItemData(hBootType, ComboBox_GetCurSel(hBootType)); | ||||||
| 	BOOL use_v5 = (dt == DT_SYSLINUX_V5) || ((dt == DT_ISO) && (iso_report.has_syslinux_v5)); | 	BOOL use_v5 = (dt == DT_SYSLINUX_V5) || ((dt == DT_ISO) && (iso_report.has_syslinux_v5)); | ||||||
| 
 | 
 | ||||||
| 	PrintStatus(0, TRUE, "Installing Syslinux v%d...", use_v5?5:4); | 	PrintStatus(0, TRUE, lmprintf(MSG_234, use_v5?5:4)); | ||||||
| 
 | 
 | ||||||
| 	ldlinux_path[0] = drive_letter; | 	ldlinux_path[0] = drive_letter; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue