mirror of
https://github.com/pbatard/rufus.git
synced 2025-05-17 16:44:27 -04: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