mirror of
				https://github.com/pbatard/rufus.git
				synced 2024-08-14 23:57:05 +00:00 
			
		
		
		
	Merge remote-tracking branch 'upstream/master' into FixJapanese
# Conflicts: # res/localization/rufus.loc
This commit is contained in:
		
						commit
						d04a79e9c5
					
				
					 77 changed files with 3452 additions and 1611 deletions
				
			
		| 
						 | 
					@ -1,3 +1,29 @@
 | 
				
			||||||
 | 
					o Version 2.9 (2016.05.??)
 | 
				
			||||||
 | 
					    Add ARM support for UEFI:NTFS
 | 
				
			||||||
 | 
					    Fix UEFI:NTFS support for HP and Gigabyte firmwares (with thanks to Rod Smith and linnaea)
 | 
				
			||||||
 | 
					    Fix unwanted listing of some internal removable drives
 | 
				
			||||||
 | 
					    Fix missing default cluster size default on exFAT for >32GB drives
 | 
				
			||||||
 | 
					    Fix the non-removal of the commandline hogger in some corner cases
 | 
				
			||||||
 | 
					    Use "modern" file selection dialog on Vista or later (if you can spot the difference, good for you...)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					o Version 2.8 (2016.03.22)
 | 
				
			||||||
 | 
					    Enable listing of non-USB card readers (EXPERIMENTAL)
 | 
				
			||||||
 | 
					    Major speed improvement for checksum computation
 | 
				
			||||||
 | 
					    Fix UI flicker during progress actualization
 | 
				
			||||||
 | 
					    Fix computation of FAT size for Large FAT32 (with thanks to Ady)
 | 
				
			||||||
 | 
					    Syslinux improvements
 | 
				
			||||||
 | 
					    Update GRUB to 2.02~beta3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					o Version 2.7 (2016.02.14)
 | 
				
			||||||
 | 
					    Add Thai translation, courtesy of Sippapas Wangsri
 | 
				
			||||||
 | 
					    Add Drag and Drop support, courtesy of SeymourApps
 | 
				
			||||||
 | 
					    Add a retry for most write operations
 | 
				
			||||||
 | 
					    Update UEFI:NTFS, ms-sys and Grub4DOS to latest
 | 
				
			||||||
 | 
					    Dual sign Rufus with both SHA-1 and SHA-256
 | 
				
			||||||
 | 
					    Fix 2nd line of SHA-256 being hidden on some platforms
 | 
				
			||||||
 | 
					    Fix shutdown prevention issues
 | 
				
			||||||
 | 
					    Additional fixes & translation updates
 | 
				
			||||||
 | 
					
 | 
				
			||||||
o Version 2.6 (2015.12.22)
 | 
					o Version 2.6 (2015.12.22)
 | 
				
			||||||
    Add Serbian (Latin) translation, courtesy of Ivan Strugar
 | 
					    Add Serbian (Latin) translation, courtesy of Ivan Strugar
 | 
				
			||||||
    Add a cheat mode to zero a device (Alt-Z)
 | 
					    Add a cheat mode to zero a device (Alt-Z)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,5 +1,5 @@
 | 
				
			||||||
@echo off
 | 
					@echo off
 | 
				
			||||||
set COV_DIR=E:\cov-analysis-win32-7.7.0
 | 
					set COV_DIR=E:\cov-analysis-win32-7.7.0.4
 | 
				
			||||||
set PATH=%PATH%;%COV_DIR%\bin
 | 
					set PATH=%PATH%;%COV_DIR%\bin
 | 
				
			||||||
set PWD=%~dp0
 | 
					set PWD=%~dp0
 | 
				
			||||||
rmdir cov-int /s /q >NUL 2>NUL
 | 
					rmdir cov-int /s /q >NUL 2>NUL
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										13
									
								
								_sign.cmd
									
										
									
									
									
								
							
							
						
						
									
										13
									
								
								_sign.cmd
									
										
									
									
									
								
							| 
						 | 
					@ -1,6 +1,9 @@
 | 
				
			||||||
 | 
					@echo off
 | 
				
			||||||
:retry
 | 
					:retry
 | 
				
			||||||
@set /p password=Please enter PFX password:
 | 
					set /p password=Please enter PFX password: 
 | 
				
			||||||
@"C:\Program Files (x86)\Windows Kits\8.1\bin\x64\signtool" sign /v /fd SHA256 /f D:\Secured\akeo\akeo.p12 /p %password% /tr http://timestamp.comodoca.com/rfc3161 /td SHA256 %1 %2 %3 %4
 | 
					"C:\Program Files (x86)\Windows Kits\8.1\bin\x64\signtool" sign /v /fd SHA1 /f D:\Secured\akeo\sha1\akeo.p12 /p %password% /tr http://timestamp.comodoca.com/rfc3161 /td SHA1 %1
 | 
				
			||||||
@if ERRORLEVEL 1 goto retry
 | 
					if ERRORLEVEL 1 goto retry
 | 
				
			||||||
@set password=
 | 
					"C:\Program Files (x86)\Windows Kits\8.1\bin\x64\signtool" sign /as /v /fd SHA256 /f D:\Secured\akeo\akeo.p12 /p %password% /tr http://timestamp.comodoca.com/rfc3161 /td SHA256 %1
 | 
				
			||||||
@exit
 | 
					if ERRORLEVEL 1 goto retry
 | 
				
			||||||
 | 
					set password=
 | 
				
			||||||
 | 
					exit
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										23
									
								
								configure
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										23
									
								
								configure
									
										
									
									
										vendored
									
									
								
							| 
						 | 
					@ -1,6 +1,6 @@
 | 
				
			||||||
#! /bin/sh
 | 
					#! /bin/sh
 | 
				
			||||||
# Guess values for system-dependent variables and create Makefiles.
 | 
					# Guess values for system-dependent variables and create Makefiles.
 | 
				
			||||||
# Generated by GNU Autoconf 2.69 for rufus 2.7.
 | 
					# Generated by GNU Autoconf 2.69 for rufus 2.9.
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# Report bugs to <https://github.com/pbatard/rufus/issues>.
 | 
					# Report bugs to <https://github.com/pbatard/rufus/issues>.
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
| 
						 | 
					@ -580,8 +580,8 @@ MAKEFLAGS=
 | 
				
			||||||
# Identity of this package.
 | 
					# Identity of this package.
 | 
				
			||||||
PACKAGE_NAME='rufus'
 | 
					PACKAGE_NAME='rufus'
 | 
				
			||||||
PACKAGE_TARNAME='rufus'
 | 
					PACKAGE_TARNAME='rufus'
 | 
				
			||||||
PACKAGE_VERSION='2.7'
 | 
					PACKAGE_VERSION='2.9'
 | 
				
			||||||
PACKAGE_STRING='rufus 2.7'
 | 
					PACKAGE_STRING='rufus 2.9'
 | 
				
			||||||
PACKAGE_BUGREPORT='https://github.com/pbatard/rufus/issues'
 | 
					PACKAGE_BUGREPORT='https://github.com/pbatard/rufus/issues'
 | 
				
			||||||
PACKAGE_URL='http://rufus.akeo.ie'
 | 
					PACKAGE_URL='http://rufus.akeo.ie'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1228,7 +1228,7 @@ if test "$ac_init_help" = "long"; then
 | 
				
			||||||
  # Omit some internal or obsolete options to make the list less imposing.
 | 
					  # Omit some internal or obsolete options to make the list less imposing.
 | 
				
			||||||
  # This message is too long to be a string in the A/UX 3.1 sh.
 | 
					  # This message is too long to be a string in the A/UX 3.1 sh.
 | 
				
			||||||
  cat <<_ACEOF
 | 
					  cat <<_ACEOF
 | 
				
			||||||
\`configure' configures rufus 2.7 to adapt to many kinds of systems.
 | 
					\`configure' configures rufus 2.9 to adapt to many kinds of systems.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Usage: $0 [OPTION]... [VAR=VALUE]...
 | 
					Usage: $0 [OPTION]... [VAR=VALUE]...
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1294,7 +1294,7 @@ fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if test -n "$ac_init_help"; then
 | 
					if test -n "$ac_init_help"; then
 | 
				
			||||||
  case $ac_init_help in
 | 
					  case $ac_init_help in
 | 
				
			||||||
     short | recursive ) echo "Configuration of rufus 2.7:";;
 | 
					     short | recursive ) echo "Configuration of rufus 2.9:";;
 | 
				
			||||||
   esac
 | 
					   esac
 | 
				
			||||||
  cat <<\_ACEOF
 | 
					  cat <<\_ACEOF
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1385,7 +1385,7 @@ fi
 | 
				
			||||||
test -n "$ac_init_help" && exit $ac_status
 | 
					test -n "$ac_init_help" && exit $ac_status
 | 
				
			||||||
if $ac_init_version; then
 | 
					if $ac_init_version; then
 | 
				
			||||||
  cat <<\_ACEOF
 | 
					  cat <<\_ACEOF
 | 
				
			||||||
rufus configure 2.7
 | 
					rufus configure 2.9
 | 
				
			||||||
generated by GNU Autoconf 2.69
 | 
					generated by GNU Autoconf 2.69
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Copyright (C) 2012 Free Software Foundation, Inc.
 | 
					Copyright (C) 2012 Free Software Foundation, Inc.
 | 
				
			||||||
| 
						 | 
					@ -1440,7 +1440,7 @@ cat >config.log <<_ACEOF
 | 
				
			||||||
This file contains any messages produced by compilers while
 | 
					This file contains any messages produced by compilers while
 | 
				
			||||||
running configure, to aid debugging if configure makes a mistake.
 | 
					running configure, to aid debugging if configure makes a mistake.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
It was created by rufus $as_me 2.7, which was
 | 
					It was created by rufus $as_me 2.9, which was
 | 
				
			||||||
generated by GNU Autoconf 2.69.  Invocation command line was
 | 
					generated by GNU Autoconf 2.69.  Invocation command line was
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  $ $0 $@
 | 
					  $ $0 $@
 | 
				
			||||||
| 
						 | 
					@ -2303,7 +2303,7 @@ fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Define the identity of the package.
 | 
					# Define the identity of the package.
 | 
				
			||||||
 PACKAGE='rufus'
 | 
					 PACKAGE='rufus'
 | 
				
			||||||
 VERSION='2.7'
 | 
					 VERSION='2.9'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
cat >>confdefs.h <<_ACEOF
 | 
					cat >>confdefs.h <<_ACEOF
 | 
				
			||||||
| 
						 | 
					@ -3922,6 +3922,8 @@ ac_config_files="$ac_config_files src/syslinux/libfat/Makefile"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ac_config_files="$ac_config_files src/syslinux/libinstaller/Makefile"
 | 
					ac_config_files="$ac_config_files src/syslinux/libinstaller/Makefile"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ac_config_files="$ac_config_files src/syslinux/win/Makefile"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
cat >confcache <<\_ACEOF
 | 
					cat >confcache <<\_ACEOF
 | 
				
			||||||
# This file is a shell script that caches the results of configure
 | 
					# This file is a shell script that caches the results of configure
 | 
				
			||||||
# tests run on this system so they can be shared between configure
 | 
					# tests run on this system so they can be shared between configure
 | 
				
			||||||
| 
						 | 
					@ -4480,7 +4482,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 | 
				
			||||||
# report actual input values of CONFIG_FILES etc. instead of their
 | 
					# report actual input values of CONFIG_FILES etc. instead of their
 | 
				
			||||||
# values after options handling.
 | 
					# values after options handling.
 | 
				
			||||||
ac_log="
 | 
					ac_log="
 | 
				
			||||||
This file was extended by rufus $as_me 2.7, which was
 | 
					This file was extended by rufus $as_me 2.9, which was
 | 
				
			||||||
generated by GNU Autoconf 2.69.  Invocation command line was
 | 
					generated by GNU Autoconf 2.69.  Invocation command line was
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  CONFIG_FILES    = $CONFIG_FILES
 | 
					  CONFIG_FILES    = $CONFIG_FILES
 | 
				
			||||||
| 
						 | 
					@ -4534,7 +4536,7 @@ _ACEOF
 | 
				
			||||||
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 | 
					cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 | 
				
			||||||
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 | 
					ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 | 
				
			||||||
ac_cs_version="\\
 | 
					ac_cs_version="\\
 | 
				
			||||||
rufus config.status 2.7
 | 
					rufus config.status 2.9
 | 
				
			||||||
configured by $0, generated by GNU Autoconf 2.69,
 | 
					configured by $0, generated by GNU Autoconf 2.69,
 | 
				
			||||||
  with options \\"\$ac_cs_config\\"
 | 
					  with options \\"\$ac_cs_config\\"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4657,6 +4659,7 @@ do
 | 
				
			||||||
    "src/ms-sys/Makefile") CONFIG_FILES="$CONFIG_FILES src/ms-sys/Makefile" ;;
 | 
					    "src/ms-sys/Makefile") CONFIG_FILES="$CONFIG_FILES src/ms-sys/Makefile" ;;
 | 
				
			||||||
    "src/syslinux/libfat/Makefile") CONFIG_FILES="$CONFIG_FILES src/syslinux/libfat/Makefile" ;;
 | 
					    "src/syslinux/libfat/Makefile") CONFIG_FILES="$CONFIG_FILES src/syslinux/libfat/Makefile" ;;
 | 
				
			||||||
    "src/syslinux/libinstaller/Makefile") CONFIG_FILES="$CONFIG_FILES src/syslinux/libinstaller/Makefile" ;;
 | 
					    "src/syslinux/libinstaller/Makefile") CONFIG_FILES="$CONFIG_FILES src/syslinux/libinstaller/Makefile" ;;
 | 
				
			||||||
 | 
					    "src/syslinux/win/Makefile") CONFIG_FILES="$CONFIG_FILES src/syslinux/win/Makefile" ;;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
 | 
					  *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
 | 
				
			||||||
  esac
 | 
					  esac
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,4 +1,4 @@
 | 
				
			||||||
AC_INIT([rufus], [2.7], [https://github.com/pbatard/rufus/issues], [rufus], [http://rufus.akeo.ie])
 | 
					AC_INIT([rufus], [2.9], [https://github.com/pbatard/rufus/issues], [rufus], [http://rufus.akeo.ie])
 | 
				
			||||||
AM_INIT_AUTOMAKE([-Wno-portability foreign no-dist no-dependencies])
 | 
					AM_INIT_AUTOMAKE([-Wno-portability foreign no-dist no-dependencies])
 | 
				
			||||||
AC_CONFIG_SRCDIR([src/rufus.c])
 | 
					AC_CONFIG_SRCDIR([src/rufus.c])
 | 
				
			||||||
AC_CONFIG_MACRO_DIR([m4])
 | 
					AC_CONFIG_MACRO_DIR([m4])
 | 
				
			||||||
| 
						 | 
					@ -80,4 +80,5 @@ AC_CONFIG_FILES([res/localization/Makefile])
 | 
				
			||||||
AC_CONFIG_FILES([src/ms-sys/Makefile])
 | 
					AC_CONFIG_FILES([src/ms-sys/Makefile])
 | 
				
			||||||
AC_CONFIG_FILES([src/syslinux/libfat/Makefile])
 | 
					AC_CONFIG_FILES([src/syslinux/libfat/Makefile])
 | 
				
			||||||
AC_CONFIG_FILES([src/syslinux/libinstaller/Makefile])
 | 
					AC_CONFIG_FILES([src/syslinux/libinstaller/Makefile])
 | 
				
			||||||
 | 
					AC_CONFIG_FILES([src/syslinux/win/Makefile])
 | 
				
			||||||
AC_OUTPUT
 | 
					AC_OUTPUT
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,7 +1,7 @@
 | 
				
			||||||
This directory contains the Grub4DOS boot records that are used by Rufus
 | 
					This directory contains the Grub4DOS boot records that are used by Rufus
 | 
				
			||||||
 | 
					
 | 
				
			||||||
* grldr.mbr was taken from the official 2015.10.21 release from
 | 
					* grldr.mbr was taken from the official 2016.01.19 release from
 | 
				
			||||||
   http://grub4dos.chenall.net/downloads/grub4dos-0.4.6a-2015-10-21/
 | 
					  http://grub4dos.chenall.net/downloads/grub4dos-0.4.6a-2016-01-19/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
* Note that, for convenience reasons, the first 512 bytes from this grldr.mbr are
 | 
					* Note that, for convenience reasons, the first 512 bytes from this grldr.mbr are
 | 
				
			||||||
  *not* the ones that Rufus processes when writing the actual MBR (first 512 bytes).
 | 
					  *not* the ones that Rufus processes when writing the actual MBR (first 512 bytes).
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
										
											Binary file not shown.
										
									
								
							| 
						 | 
					@ -2,4 +2,4 @@
 | 
				
			||||||
 * This file contains the version string of the GRUB 2.x binary embedded in Rufus.
 | 
					 * This file contains the version string of the GRUB 2.x binary embedded in Rufus.
 | 
				
			||||||
 * Should be the same as GRUB's PACKAGE_VERSION in config.h.
 | 
					 * Should be the same as GRUB's PACKAGE_VERSION in config.h.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
#define GRUB2_PACKAGE_VERSION "2.02~beta2"
 | 
					#define GRUB2_PACKAGE_VERSION "2.02~beta3"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,7 +1,7 @@
 | 
				
			||||||
This directory contains the Grub 2.0 boot records that are used by Rufus
 | 
					This directory contains the Grub 2.0 boot records that are used by Rufus
 | 
				
			||||||
 | 
					
 | 
				
			||||||
* boot.img and core.img were compiled from git://git.savannah.gnu.org/grub.git,
 | 
					* boot.img and core.img were compiled from
 | 
				
			||||||
  commit 72ec399ad8d6348b6c74ea63d80c79784c8b84ae, on a Debian 7.7.0 x64 system.
 | 
					  http://alpha.gnu.org/gnu/grub/grub-2.02~beta3.tar.xz, on a Debian 8.3 x64 system.
 | 
				
			||||||
  This was done following the guide from:
 | 
					  This was done following the guide from:
 | 
				
			||||||
  http://pete.akeo.ie/2014/05/compiling-and-installing-grub2-for.html.
 | 
					  http://pete.akeo.ie/2014/05/compiling-and-installing-grub2-for.html.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -15,6 +15,14 @@ content. PLEASE, do not just look at this Changelog when updating your
 | 
				
			||||||
translation, but always use the English section of rufus.loc as your base.
 | 
					translation, but always use the English section of rufus.loc as your base.
 | 
				
			||||||
For instance, MSG_114, that was introduced in v1.0.8 is MORE than one line!
 | 
					For instance, MSG_114, that was introduced in v1.0.8 is MORE than one line!
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					o Version 1.0.20 (2016.05.09)
 | 
				
			||||||
 | 
					  - *NEW* MSG_286 "Zeroing drive: %0.1f%% completed"
 | 
				
			||||||
 | 
					    Used when filling a whole drive with zero bytes, to display progress in percent (e.g. "Zeroing drive: 12.3% completed")
 | 
				
			||||||
 | 
					    Can be tested with Alt-Z (CAUTION: THIS WILL COMPLETELY ERASE THE SELECTED DRIVE!!)
 | 
				
			||||||
 | 
					  - *NEW* MSG_287 "Detection of non-USB removable drives"
 | 
				
			||||||
 | 
					    Note, this message is followed by either "enabled"/"disabled" (see MSG_250/251) and is similar to MSG_253
 | 
				
			||||||
 | 
					    The message appears on the status bar and can be tested with Ctrl-Alt-F.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
o Version 1.0.19 (2015.10.15)
 | 
					o Version 1.0.19 (2015.10.15)
 | 
				
			||||||
    Note: The following message can be tested by pressing Alt-, (That's the 'Alt' and 'comma' keys on your keyboard)
 | 
					    Note: The following message can be tested by pressing Alt-, (That's the 'Alt' and 'comma' keys on your keyboard)
 | 
				
			||||||
          In case the message below is not clear, you can consider that it says "Exclusive locking of the USB drive"
 | 
					          In case the message below is not clear, you can consider that it says "Exclusive locking of the USB drive"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -77,7 +77,7 @@
 | 
				
			||||||
# l "ru-RU" "Russian (Русский)" 0x0419
 | 
					# l "ru-RU" "Russian (Русский)" 0x0419
 | 
				
			||||||
# l "sr-SP" "Serbian (Latin)" 0x241a
 | 
					# l "sr-SP" "Serbian (Latin)" 0x241a
 | 
				
			||||||
# l "sk-SK" "Slovak (Slovensky)" 0x041B
 | 
					# l "sk-SK" "Slovak (Slovensky)" 0x041B
 | 
				
			||||||
# l "sl-SI" "Slovene (Slovenščina)" 0x0424
 | 
					# l "sl-SI" "Slovenian (Slovenščina)" 0x0424
 | 
				
			||||||
# l "es-ES" "Spanish (Español)" 0x040a
 | 
					# l "es-ES" "Spanish (Español)" 0x040a
 | 
				
			||||||
# l "sv-SE" "Swedish (Svenska)" 0x041d
 | 
					# l "sv-SE" "Swedish (Svenska)" 0x041d
 | 
				
			||||||
# l "th-TH" "Thai (ไทย)" 0x041e
 | 
					# l "th-TH" "Thai (ไทย)" 0x041e
 | 
				
			||||||
| 
						 | 
					@ -92,7 +92,7 @@
 | 
				
			||||||
# http://download.microsoft.com/download/9/5/E/95EF66AF-9026-4BB0-A41D-A4F81802D92C/%5BMS-LCID%5D.pdf
 | 
					# http://download.microsoft.com/download/9/5/E/95EF66AF-9026-4BB0-A41D-A4F81802D92C/%5BMS-LCID%5D.pdf
 | 
				
			||||||
# for the LCID (0x####) codes you should use
 | 
					# for the LCID (0x####) codes you should use
 | 
				
			||||||
l "en-US" "English (English)" 0x0409, 0x0809, 0x0c09, 0x1009, 0x1409, 0x1809, 0x1c09, 0x2009, 0x2409, 0x2809, 0x2c09, 0x3009, 0x3409, 0x3809, 0x3c09, 0x4009, 0x4409, 0x4809
 | 
					l "en-US" "English (English)" 0x0409, 0x0809, 0x0c09, 0x1009, 0x1409, 0x1809, 0x1c09, 0x2009, 0x2409, 0x2809, 0x2c09, 0x3009, 0x3409, 0x3809, 0x3c09, 0x4009, 0x4409, 0x4809
 | 
				
			||||||
v 1.0.19
 | 
					v 1.0.20
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Main dialog
 | 
					# Main dialog
 | 
				
			||||||
g IDD_DIALOG
 | 
					g IDD_DIALOG
 | 
				
			||||||
| 
						 | 
					@ -548,6 +548,7 @@ t MSG_284 "The downloaded executable is missing a digital signature."
 | 
				
			||||||
t MSG_285 "The downloaded executable is signed by '%s'.\nThis is not a signature we recognize and could "
 | 
					t MSG_285 "The downloaded executable is signed by '%s'.\nThis is not a signature we recognize and could "
 | 
				
			||||||
	"indicate some form of malicious activity...\nAre you sure you want to run this file?"
 | 
						"indicate some form of malicious activity...\nAre you sure you want to run this file?"
 | 
				
			||||||
t MSG_286 "Zeroing drive: %0.1f%% completed"
 | 
					t MSG_286 "Zeroing drive: %0.1f%% completed"
 | 
				
			||||||
 | 
					t MSG_287 "Detection of non-USB removable drives"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
################################################################################
 | 
					################################################################################
 | 
				
			||||||
############################# TRANSLATOR END COPY ##############################
 | 
					############################# TRANSLATOR END COPY ##############################
 | 
				
			||||||
| 
						 | 
					@ -988,7 +989,7 @@ t MSG_281 "(فضلا اختر صورة)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
################################################################################
 | 
					################################################################################
 | 
				
			||||||
l "az-AZ" "Azerbaijani (Azərbaycanca)" 0x042c, 0x782c
 | 
					l "az-AZ" "Azerbaijani (Azərbaycanca)" 0x042c, 0x782c
 | 
				
			||||||
v 1.0.19
 | 
					v 1.0.20
 | 
				
			||||||
b "en-US"
 | 
					b "en-US"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Main dialog
 | 
					# Main dialog
 | 
				
			||||||
| 
						 | 
					@ -1464,6 +1465,8 @@ t MSG_283 "Keçərsiz imza"
 | 
				
			||||||
t MSG_284 "Yüklənən aparıla faylın rəqəmsal imzası çatmır."
 | 
					t MSG_284 "Yüklənən aparıla faylın rəqəmsal imzası çatmır."
 | 
				
			||||||
t MSG_285 "Yüklənən aparıla bilən fayl '%s' tərəfindən imzalanmışdır.\nBu tərifə və pis niyyətli "
 | 
					t MSG_285 "Yüklənən aparıla bilən fayl '%s' tərəfindən imzalanmışdır.\nBu tərifə və pis niyyətli "
 | 
				
			||||||
	"səmərəliliyini qeyd edəcəyimiz bir imza deyil...\nBu faylı işlətmək istədiyinizə əminsiniz?"
 | 
						"səmərəliliyini qeyd edəcəyimiz bir imza deyil...\nBu faylı işlətmək istədiyinizə əminsiniz?"
 | 
				
			||||||
 | 
					t MSG_286 "Sürücü sıfırlama: %0.1f%% tamamlandı"
 | 
				
			||||||
 | 
					t MSG_287 "Olmayan çıxarılabilən USB sürücülər"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
######################################################################
 | 
					######################################################################
 | 
				
			||||||
l "bg-BG" "Bulgarian (Български)" 0x0402
 | 
					l "bg-BG" "Bulgarian (Български)" 0x0402
 | 
				
			||||||
| 
						 | 
					@ -2387,7 +2390,7 @@ t MSG_285 "已下载的可执行文件是由 '%s' 签署的。\n这个不是我
 | 
				
			||||||
 | 
					
 | 
				
			||||||
################################################################################
 | 
					################################################################################
 | 
				
			||||||
l "zh-TW" "Chinese Traditional (正體中文)" 0x0404, 0x0c04, 0x1404, 0x7c04
 | 
					l "zh-TW" "Chinese Traditional (正體中文)" 0x0404, 0x0c04, 0x1404, 0x7c04
 | 
				
			||||||
v 1.0.19
 | 
					v 1.0.20
 | 
				
			||||||
b "en-US"
 | 
					b "en-US"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Main dialog
 | 
					# Main dialog
 | 
				
			||||||
| 
						 | 
					@ -2797,6 +2800,8 @@ t MSG_282 "鎖定 USB 磁碟"
 | 
				
			||||||
t MSG_283 "無效簽章"
 | 
					t MSG_283 "無效簽章"
 | 
				
			||||||
t MSG_284 "下載的檔案缺少數位簽章。"
 | 
					t MSG_284 "下載的檔案缺少數位簽章。"
 | 
				
			||||||
t MSG_285 "下載的檔案簽章者為: '%s'.\n本軟體未使用此簽章,代表檔案可能已遭受病毒感染...\n是否要執行檔案?"
 | 
					t MSG_285 "下載的檔案簽章者為: '%s'.\n本軟體未使用此簽章,代表檔案可能已遭受病毒感染...\n是否要執行檔案?"
 | 
				
			||||||
 | 
					t MSG_286 "寫入零: 已完成 %0.1f%%"
 | 
				
			||||||
 | 
					t MSG_287 "偵測非USB可移除磁碟"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
################################################################################
 | 
					################################################################################
 | 
				
			||||||
l "hr-HR" "Croatian (Hrvatski)" 0x041a, 0x081a, 0x101a
 | 
					l "hr-HR" "Croatian (Hrvatski)" 0x041a, 0x081a, 0x101a
 | 
				
			||||||
| 
						 | 
					@ -4584,7 +4589,7 @@ t MSG_286 "Nullen schrijven : %0.1f%% voltooid"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
################################################################################
 | 
					################################################################################
 | 
				
			||||||
l "fi-FI" "Finnish (Suomi)" 0x040B
 | 
					l "fi-FI" "Finnish (Suomi)" 0x040B
 | 
				
			||||||
v 1.0.19
 | 
					v 1.0.20
 | 
				
			||||||
b "en-US"
 | 
					b "en-US"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Main dialog
 | 
					# Main dialog
 | 
				
			||||||
| 
						 | 
					@ -5030,10 +5035,12 @@ t MSG_283 "Epäkelpo allekirjoitus"
 | 
				
			||||||
t MSG_284 "Ladatusta tiedostosta puuttuu digitaalinen allekirjoitus."
 | 
					t MSG_284 "Ladatusta tiedostosta puuttuu digitaalinen allekirjoitus."
 | 
				
			||||||
t MSG_285 "Ladatun tiedoston on allekirjoittanut '%s'.\nEmme tunnista kyseistä allekirjoitusta, mikä "
 | 
					t MSG_285 "Ladatun tiedoston on allekirjoittanut '%s'.\nEmme tunnista kyseistä allekirjoitusta, mikä "
 | 
				
			||||||
	"saattaa viitata haitalliseen toimintaan...\nHaluatko varmasti suorittaa tämän tiedoston?"
 | 
						"saattaa viitata haitalliseen toimintaan...\nHaluatko varmasti suorittaa tämän tiedoston?"
 | 
				
			||||||
 | 
					t MSG_286 "Nollataan asemaa: %0.1f%% suoritettu"
 | 
				
			||||||
 | 
					t MSG_287 "Ei-USB-liitäntäisten irroitettavien asemien tunnistus"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
################################################################################
 | 
					################################################################################
 | 
				
			||||||
l "fr-FR" "French (Français)" 0x040c, 0x080c, 0x0c0c, 0x100c, 0x140c, 0x180c, 0x1c0c, 0x200c, 0x240c, 0x280c, 0x2c0c, 0x300c, 0x340c, 0x380c, 0xe40c
 | 
					l "fr-FR" "French (Français)" 0x040c, 0x080c, 0x0c0c, 0x100c, 0x140c, 0x180c, 0x1c0c, 0x200c, 0x240c, 0x280c, 0x2c0c, 0x300c, 0x340c, 0x380c, 0xe40c
 | 
				
			||||||
v 1.0.19
 | 
					v 1.0.20
 | 
				
			||||||
b "en-US"
 | 
					b "en-US"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
g IDD_DIALOG
 | 
					g IDD_DIALOG
 | 
				
			||||||
| 
						 | 
					@ -5236,11 +5243,11 @@ t MSG_095 "Image DD"
 | 
				
			||||||
t MSG_096 "Le système de fichiers sélectionné ne peut pas être utilisé avec ce type d'image ISO. "
 | 
					t MSG_096 "Le système de fichiers sélectionné ne peut pas être utilisé avec ce type d'image ISO. "
 | 
				
			||||||
	"Veuillez sélectionner un système de fichiers different file ou une autre ISO."
 | 
						"Veuillez sélectionner un système de fichiers different file ou une autre ISO."
 | 
				
			||||||
t MSG_097 "'%s' peut seulement être appliqué pour un système de fichiers NTFS."
 | 
					t MSG_097 "'%s' peut seulement être appliqué pour un système de fichiers NTFS."
 | 
				
			||||||
t MSG_098 "IMPORTANT: Vous essayez d'installer 'Windows To Go', mais votre périphérique de destination ne possède pas "
 | 
					t MSG_098 "IMPORTANT : Vous essayez d'installer 'Windows To Go', mais votre périphérique de destination ne possède pas "
 | 
				
			||||||
	"l'attribut 'FIXE'. A cause de cela, Windows va très probablement geler lors du démarrage, car Microsoft ne l'a pas "
 | 
						"l'attribut 'FIXE'. A cause de cela, Windows va très probablement geler lors du démarrage, car Microsoft ne l'a pas "
 | 
				
			||||||
	"conçu pour fonctionner avec des périphériques qui possèdent l'attribut 'AMOVIBLE'.\n\n"
 | 
						"conçu pour fonctionner avec des périphériques qui possèdent l'attribut 'AMOVIBLE'.\n\n"
 | 
				
			||||||
	"Voulez vous continuer malgré celà?\n\n"
 | 
						"Voulez vous continuer malgré celà?\n\n"
 | 
				
			||||||
	"Note: L'attribut 'FIXE/AMOVIBLE' est une propriété matérielle qui peut uniquement être changée avec des outils "
 | 
						"Note : L'attribut 'FIXE/AMOVIBLE' est une propriété matérielle qui peut uniquement être changée avec des outils "
 | 
				
			||||||
	"propriétaires, que les fabriquants de périphériques ne fournissent PRESQUE JAMAIS au public..."
 | 
						"propriétaires, que les fabriquants de périphériques ne fournissent PRESQUE JAMAIS au public..."
 | 
				
			||||||
t MSG_099 "Limitation du système de fichiers"
 | 
					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 "
 | 
					t MSG_100 "Cette image ISO contient un fichier de plus de 4 Go, ce qui est plus que la taille maximum "
 | 
				
			||||||
| 
						 | 
					@ -5346,7 +5353,7 @@ t MSG_192 "Phase de lecture"
 | 
				
			||||||
t MSG_193 "Téléchargement completé pour %s "
 | 
					t MSG_193 "Téléchargement completé pour %s "
 | 
				
			||||||
t MSG_194 "Impossible de télécharger %s"
 | 
					t MSG_194 "Impossible de télécharger %s"
 | 
				
			||||||
t MSG_195 "La version par défaut du fichier %s sera utilisée"
 | 
					t MSG_195 "La version par défaut du fichier %s sera utilisée"
 | 
				
			||||||
t MSG_196 "IMPORTANT: CE PÉRIPHÉRIQUE UTILISE UNE TAILLE DE SECTEUR NON STANDARD !\n\n"
 | 
					t MSG_196 "IMPORTANT : CE PÉRIPHÉRIQUE UTILISE UNE TAILLE DE SECTEUR NON STANDARD !\n\n"
 | 
				
			||||||
	"La majorité des disques utilisent une taille de secteur de 512 octets, mais celui ci utilise une taille de %d octets. "
 | 
						"La majorité des disques utilisent une taille de secteur de 512 octets, mais celui ci utilise une taille de %d octets. "
 | 
				
			||||||
	"Dans la majorité des cas, cela veut dire que vous ne POUVEZ PAS démarrer un oridinateur depusi ce disque.\n"
 | 
						"Dans la majorité des cas, cela veut dire que vous ne POUVEZ PAS démarrer un oridinateur depusi ce disque.\n"
 | 
				
			||||||
	"Rufus peut toujours essayer de créer un disque démarrable, mais il n'y a AUCUNE guarantie que cela marchera."
 | 
						"Rufus peut toujours essayer de créer un disque démarrable, mais il n'y a AUCUNE guarantie que cela marchera."
 | 
				
			||||||
| 
						 | 
					@ -5376,7 +5383,7 @@ t MSG_215 "%s ouvert"
 | 
				
			||||||
t MSG_216 "%s sauvegardé"
 | 
					t MSG_216 "%s sauvegardé"
 | 
				
			||||||
t MSG_217 "Formatage : %0.1f%% complété"
 | 
					t MSG_217 "Formatage : %0.1f%% complété"
 | 
				
			||||||
t MSG_218 "Système de fichiers : Tâche %d/%d complétée"
 | 
					t MSG_218 "Système de fichiers : Tâche %d/%d complétée"
 | 
				
			||||||
t MSG_219 "Finalisation NTFS: %d%% complété"
 | 
					t MSG_219 "Finalisation NTFS : %d%% complété"
 | 
				
			||||||
t MSG_220 "Formatage (%s) - durée estimée %d :%02d..."
 | 
					t MSG_220 "Formatage (%s) - durée estimée %d :%02d..."
 | 
				
			||||||
t MSG_221 "Ecriture du label (peut prendre du temps)..."
 | 
					t MSG_221 "Ecriture du label (peut prendre du temps)..."
 | 
				
			||||||
t MSG_222 "Formatage (%s)..."
 | 
					t MSG_222 "Formatage (%s)..."
 | 
				
			||||||
| 
						 | 
					@ -5398,7 +5405,7 @@ t MSG_237 "Test de défauts : Test avec motif 0x%02X"
 | 
				
			||||||
t MSG_238 "Partitionage (%s)..."
 | 
					t MSG_238 "Partitionage (%s)..."
 | 
				
			||||||
t MSG_239 "Effacement des partitions..."
 | 
					t MSG_239 "Effacement des partitions..."
 | 
				
			||||||
t MSG_240 "Téléchargement de %s : Connexion..."
 | 
					t MSG_240 "Téléchargement de %s : Connexion..."
 | 
				
			||||||
t MSG_241 "Téléchargement: %0.1f%%"
 | 
					t MSG_241 "Téléchargement : %0.1f%%"
 | 
				
			||||||
t MSG_242 "Echec de téléchargement du fichier"
 | 
					t MSG_242 "Echec de téléchargement du fichier"
 | 
				
			||||||
t MSG_243 "Recherche des mises à jour..."
 | 
					t MSG_243 "Recherche des mises à jour..."
 | 
				
			||||||
t MSG_244 "Mises à jour : Impossible de se connecter"
 | 
					t MSG_244 "Mises à jour : Impossible de se connecter"
 | 
				
			||||||
| 
						 | 
					@ -5424,11 +5431,11 @@ t MSG_263 "Affichage de tailles avec de VRAIES unités"
 | 
				
			||||||
t MSG_264 "Suppression du dossier '%s'"
 | 
					t MSG_264 "Suppression du dossier '%s'"
 | 
				
			||||||
t MSG_265 "Détection de disque VMWare"
 | 
					t MSG_265 "Détection de disque VMWare"
 | 
				
			||||||
t MSG_266 "Mode dual UEFI/BIOS"
 | 
					t MSG_266 "Mode dual UEFI/BIOS"
 | 
				
			||||||
t MSG_267 "Application de l'image Windows: %0.1f%% complété"
 | 
					t MSG_267 "Application de l'image Windows : %0.1f%% complété"
 | 
				
			||||||
t MSG_268 "Application de l'image Windows..."
 | 
					t MSG_268 "Application de l'image Windows..."
 | 
				
			||||||
t MSG_269 "Préservation des dates de fichiers"
 | 
					t MSG_269 "Préservation des dates de fichiers"
 | 
				
			||||||
t MSG_270 "Debug USB"
 | 
					t MSG_270 "Debug USB"
 | 
				
			||||||
t MSG_271 "Calculation des checksums de l'image: %0.1f%% complété"
 | 
					t MSG_271 "Calculation des checksums de l'image : %0.1f%% complété"
 | 
				
			||||||
t MSG_272 "Calcule les checksums MD5, SHA1 et SHA256 pour l'image sélectionée"
 | 
					t MSG_272 "Calcule les checksums MD5, SHA1 et SHA256 pour l'image sélectionée"
 | 
				
			||||||
t MSG_273 "Change la langue de l'application"
 | 
					t MSG_273 "Change la langue de l'application"
 | 
				
			||||||
t MSG_274 "Image ISOHybrid détectée"
 | 
					t MSG_274 "Image ISOHybrid détectée"
 | 
				
			||||||
| 
						 | 
					@ -5449,10 +5456,12 @@ t MSG_283 "Signature invalide"
 | 
				
			||||||
t MSG_284 "L'exécutable téléchargé ne possède pas de signature digitale."
 | 
					t MSG_284 "L'exécutable téléchargé ne possède pas de signature digitale."
 | 
				
			||||||
t MSG_285 "L'exécutable téléchargé est signé par '%s'.\nCe n’est pas une signature que nous reconnaissons et "
 | 
					t MSG_285 "L'exécutable téléchargé est signé par '%s'.\nCe n’est pas une signature que nous reconnaissons et "
 | 
				
			||||||
	"pourrait indiquer une activité malicieuse...\nÊtes-vous certain de vouloir lancer ce fichier?"
 | 
						"pourrait indiquer une activité malicieuse...\nÊtes-vous certain de vouloir lancer ce fichier?"
 | 
				
			||||||
 | 
					t MSG_286 "Effacement à zéro : %0.1f%% complété"
 | 
				
			||||||
 | 
					t MSG_287 "Détection disques non-USB détachables"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
################################################################################
 | 
					################################################################################
 | 
				
			||||||
l "de-DE" "German (Deutsch)" 0x0407, 0x0807, 0x0c07, 0x1007, 0x1407
 | 
					l "de-DE" "German (Deutsch)" 0x0407, 0x0807, 0x0c07, 0x1007, 0x1407
 | 
				
			||||||
v 1.0.19
 | 
					v 1.0.20
 | 
				
			||||||
b "en-US"
 | 
					b "en-US"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
g IDD_DIALOG
 | 
					g IDD_DIALOG
 | 
				
			||||||
| 
						 | 
					@ -5894,10 +5903,12 @@ t MSG_283 "Ungültige Signatur"
 | 
				
			||||||
t MSG_284 "Die heruntergeladene ausführbare Datei verfügt über keine Signatur."
 | 
					t MSG_284 "Die heruntergeladene ausführbare Datei verfügt über keine Signatur."
 | 
				
			||||||
t MSG_285 "Die heruntergeladene ausführbare Datei ist von '%s' signiert.\nDiese Signatur ist nicht akzeptiert und könnte "
 | 
					t MSG_285 "Die heruntergeladene ausführbare Datei ist von '%s' signiert.\nDiese Signatur ist nicht akzeptiert und könnte "
 | 
				
			||||||
	"auf eine böswillige Aktivität hindeuten...\nSind Sie sicher, dass Sie diese Datei ausführen wollen?"
 | 
						"auf eine böswillige Aktivität hindeuten...\nSind Sie sicher, dass Sie diese Datei ausführen wollen?"
 | 
				
			||||||
 | 
					t MSG_286 "Überschreiben mit Nullen: %0.1f%% fertiggestellt"
 | 
				
			||||||
 | 
					t MSG_287 "Erkennung nicht wechselbarer USB-Laufwerke"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
################################################################################
 | 
					################################################################################
 | 
				
			||||||
l "el-GR" "Greek (Ελληνικά)" 0x0408
 | 
					l "el-GR" "Greek (Ελληνικά)" 0x0408
 | 
				
			||||||
v 1.0.18
 | 
					v 1.0.19
 | 
				
			||||||
b "en-US"
 | 
					b "en-US"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Main dialog
 | 
					# Main dialog
 | 
				
			||||||
| 
						 | 
					@ -6369,6 +6380,12 @@ t MSG_278 "Τύπος εκκίνησης"
 | 
				
			||||||
t MSG_279 "Δεν διαθέτει δυνατότητα εκκίνησης"
 | 
					t MSG_279 "Δεν διαθέτει δυνατότητα εκκίνησης"
 | 
				
			||||||
t MSG_280 "Επιλογή ειδώλου"
 | 
					t MSG_280 "Επιλογή ειδώλου"
 | 
				
			||||||
t MSG_281 "(Παρακαλώ επιλέξτε κάποιο είδωλο)"
 | 
					t MSG_281 "(Παρακαλώ επιλέξτε κάποιο είδωλο)"
 | 
				
			||||||
 | 
					t MSG_282 "Κλείδωμα μονάδας USB"
 | 
				
			||||||
 | 
					t MSG_283 "Μη έγκυρη ψηφιακή υπογραφή"
 | 
				
			||||||
 | 
					t MSG_284 "Το εκτελέσιμο αρχείο που κατεβάσατε δεν περιλαμβάνει ψηφιακή υπογραφή."
 | 
				
			||||||
 | 
					τ MSG_285 "Το εκτελέσιμο αρχείο που κατεβάσατε έχει υπογραφτεί από τον/την '%s'.\nΑύτη η υπογραφή δεν "
 | 
				
			||||||
 | 
						"αναγνωρίζεται από το Rufus. Ενδεχομένως να υπάρχει συσχέτιση με κάποια κακόβουλη προσπάθεια...\n"
 | 
				
			||||||
 | 
						"Είστε σίγουροι ότι θέλετε να εκτελέσετε αυτό το αρχείο?"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
################################################################################
 | 
					################################################################################
 | 
				
			||||||
l "hu-HU" "Hungarian (Magyar)" 0x040e
 | 
					l "hu-HU" "Hungarian (Magyar)" 0x040e
 | 
				
			||||||
| 
						 | 
					@ -6812,7 +6829,7 @@ t MSG_286 "Meghajtó kinullázása: %0.1f%% kész"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
################################################################################
 | 
					################################################################################
 | 
				
			||||||
l "id-ID" "Indonesian (Bahasa Indonesia)" 0x0421
 | 
					l "id-ID" "Indonesian (Bahasa Indonesia)" 0x0421
 | 
				
			||||||
v 1.0.18
 | 
					v 1.0.20
 | 
				
			||||||
b "en-US"
 | 
					b "en-US"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Main dialog
 | 
					# Main dialog
 | 
				
			||||||
| 
						 | 
					@ -7132,7 +7149,7 @@ t MSG_158 "Ukuran minimal blok data yang akan menempati sistem berkas"
 | 
				
			||||||
t MSG_159 "Gunakan bidang ini untuk menyetel karakter Internasional yang diperbolehkan\npada label perangkat"
 | 
					t MSG_159 "Gunakan bidang ini untuk menyetel karakter Internasional yang diperbolehkan\npada label perangkat"
 | 
				
			||||||
t MSG_160 "Tombol untuk opsi lanjutan"
 | 
					t MSG_160 "Tombol untuk opsi lanjutan"
 | 
				
			||||||
t MSG_161 "Periksa blok buruk pada perangkat menggunakan tes pola"
 | 
					t MSG_161 "Periksa blok buruk pada perangkat menggunakan tes pola"
 | 
				
			||||||
t MSG_162 "Hapus centang pada kotak ini untuk \"tampilkan\" metode format"
 | 
					t MSG_162 "Hapus centang kotak ini untuk menggunakan metode format \"lambat\""
 | 
				
			||||||
t MSG_163 "Centang kotak ini untuk membuat perangkat USB bootable"
 | 
					t MSG_163 "Centang kotak ini untuk membuat perangkat USB bootable"
 | 
				
			||||||
t MSG_164 "Metode yang akan digunakan untuk membuat perangkat bootable"
 | 
					t MSG_164 "Metode yang akan digunakan untuk membuat perangkat bootable"
 | 
				
			||||||
t MSG_165 "Klik untuk memilih sebuah image..."
 | 
					t MSG_165 "Klik untuk memilih sebuah image..."
 | 
				
			||||||
| 
						 | 
					@ -7288,10 +7305,18 @@ t MSG_278 "Tipe Boot"
 | 
				
			||||||
t MSG_279 "Non bootable"
 | 
					t MSG_279 "Non bootable"
 | 
				
			||||||
t MSG_280 "Pemilihan image"
 | 
					t MSG_280 "Pemilihan image"
 | 
				
			||||||
t MSG_281 "(Silakan pilih sebuah image)"
 | 
					t MSG_281 "(Silakan pilih sebuah image)"
 | 
				
			||||||
 | 
					t MSG_282 "Penguncian perangkat USB khusus"
 | 
				
			||||||
 | 
					t MSG_283 "Tanda tangan digital tidak valid"
 | 
				
			||||||
 | 
					t MSG_284 "Berkas exe yang diunduh memiliki tanda tangan digital yang salah."
 | 
				
			||||||
 | 
					t MSG_285 "Berkas exe yang diunduh ditandatangani oleh '%s'.\nTanda tangan ini "
 | 
				
			||||||
 | 
						"tidak kami kenali dan bisa menjadi pertanda dari aktivitas berbahaya...\n"
 | 
				
			||||||
 | 
						"Apakah Anda yakin ingin menjalankan berkas ini?"
 | 
				
			||||||
 | 
					t MSG_286 "Mengosongkan perangkat: %0.1f%% selesai"
 | 
				
			||||||
 | 
					t MSG_287 "Deteksi selain perangkat USB yang dapat dilepas"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
################################################################################
 | 
					################################################################################
 | 
				
			||||||
l "it-IT" "Italian (Italiano)" 0x0410, 0x0810
 | 
					l "it-IT" "Italian (Italiano)" 0x0410, 0x0810
 | 
				
			||||||
v 1.0.19
 | 
					v 1.0.20
 | 
				
			||||||
b "en-US"
 | 
					b "en-US"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
g IDD_DIALOG
 | 
					g IDD_DIALOG
 | 
				
			||||||
| 
						 | 
					@ -7719,6 +7744,8 @@ t MSG_283 "Firma non valida"
 | 
				
			||||||
t MSG_284 "L'eseguibile scaricato non ha una firma digitale."
 | 
					t MSG_284 "L'eseguibile scaricato non ha una firma digitale."
 | 
				
			||||||
t MSG_285 "L'eseguibile scaricato è firmato da '%s'.\nQuesta non è una firma riconosciuta e potrebbe "
 | 
					t MSG_285 "L'eseguibile scaricato è firmato da '%s'.\nQuesta non è una firma riconosciuta e potrebbe "
 | 
				
			||||||
	"indicare qualche forma di attività malevola.\nSei sicuro di voler eseguire questo file?"
 | 
						"indicare qualche forma di attività malevola.\nSei sicuro di voler eseguire questo file?"
 | 
				
			||||||
 | 
					t MSG_286 "Azzeramento disco: %0.1f%% completato"
 | 
				
			||||||
 | 
					t MSG_287 "Rilevamento di unità rimuovibili non USB"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
######################################################################
 | 
					######################################################################
 | 
				
			||||||
l "ja-JP" "Japanese (日本語)" 0x0411
 | 
					l "ja-JP" "Japanese (日本語)" 0x0411
 | 
				
			||||||
| 
						 | 
					@ -7994,8 +8021,11 @@ t MSG_102 "ご使用の環境ではWIMファイルからファイルを抽出で
 | 
				
			||||||
	"EFIでのブートを必要とするWindows 7とWindows Vista用のUSBドライブを作るためには、WIMファイルを展開できる必要があります。"
 | 
						"EFIでのブートを必要とするWindows 7とWindows Vista用のUSBドライブを作るためには、WIMファイルを展開できる必要があります。"
 | 
				
			||||||
	"7-Zipの最近のバージョンでは展開することができます。\n7-Zipのダウンロードページへ行きますか?"
 | 
						"7-Zipの最近のバージョンでは展開することができます。\n7-Zipのダウンロードページへ行きますか?"
 | 
				
			||||||
t MSG_103 "ダウンロード %s?"
 | 
					t MSG_103 "ダウンロード %s?"
 | 
				
			||||||
 | 
					<<<<<<< HEAD
 | 
				
			||||||
# Eg. "Grub4DOS v0.4 or later requires a 'grldr' file to be installed. Because this file
 | 
					# Eg. "Grub4DOS v0.4 or later requires a 'grldr' file to be installed. Because this file
 | 
				
			||||||
#      is more than 100 KB in size, and always present on Grub4DOS ISO images, etc."
 | 
					#      is more than 100 KB in size, and always present on Grub4DOS ISO images, etc."
 | 
				
			||||||
 | 
					=======
 | 
				
			||||||
 | 
					>>>>>>> upstream/master
 | 
				
			||||||
t MSG_104 "%s 以降の物が内包されており '%s' ファイルが必要になります。\n"
 | 
					t MSG_104 "%s 以降の物が内包されており '%s' ファイルが必要になります。\n"
 | 
				
			||||||
	"このファイルは100KBより大きいのでRufusに内蔵していません。%s にISO イメージが常時あるためです。"
 | 
						"このファイルは100KBより大きいのでRufusに内蔵していません。%s にISO イメージが常時あるためです。"
 | 
				
			||||||
	"\n\nRufus で不足しているファイルをダウンロードすることができます:\n"
 | 
						"\n\nRufus で不足しているファイルをダウンロードすることができます:\n"
 | 
				
			||||||
| 
						 | 
					@ -8027,8 +8057,11 @@ t MSG_114 "このイメージは Syslinux %s%s を使用しますが、このア
 | 
				
			||||||
	"注意: ファイルは現在のディレクトリへダウンロードされます。新しいファイルが既に現在のディレクトリにある場合、"
 | 
						"注意: ファイルは現在のディレクトリへダウンロードされます。新しいファイルが既に現在のディレクトリにある場合、"
 | 
				
			||||||
	"ダウンロードせず自動的に再使用します。\n"
 | 
						"ダウンロードせず自動的に再使用します。\n"
 | 
				
			||||||
t MSG_115 "ダウンロードが必要"
 | 
					t MSG_115 "ダウンロードが必要"
 | 
				
			||||||
 | 
					<<<<<<< HEAD
 | 
				
			||||||
# Note: You should be able to test this message with Super Grub2 Disk ISO:
 | 
					# Note: You should be able to test this message with Super Grub2 Disk ISO:
 | 
				
			||||||
# http://forja.cenatic.es/frs/download.php/file/1757/super_grub2_disk_hybrid_2.00s2.iso (11 MB)
 | 
					# http://forja.cenatic.es/frs/download.php/file/1757/super_grub2_disk_hybrid_2.00s2.iso (11 MB)
 | 
				
			||||||
 | 
					=======
 | 
				
			||||||
 | 
					>>>>>>> upstream/master
 | 
				
			||||||
t MSG_116 "このイメージはGrub %s を使いますが、このアプリケーションには Grub %sのインストールファイルのみ"
 | 
					t MSG_116 "このイメージはGrub %s を使いますが、このアプリケーションには Grub %sのインストールファイルのみ"
 | 
				
			||||||
	"内蔵しています。\n\n各々のGrubのバージョンは互いに互換性はなく、使用できません。"
 | 
						"内蔵しています。\n\n各々のGrubのバージョンは互いに互換性はなく、使用できません。"
 | 
				
			||||||
	"しかし、Rufusはイメージと一致したバージョンのGrubインストールファイル('core.img')"
 | 
						"しかし、Rufusはイメージと一致したバージョンのGrubインストールファイル('core.img')"
 | 
				
			||||||
| 
						 | 
					@ -8165,7 +8198,10 @@ t MSG_234 "Syslinux %s をインストール中..."
 | 
				
			||||||
t MSG_235 "不良ブロック:%s %d/%d - %0.2f%% (%d/%d/%d エラー)"
 | 
					t MSG_235 "不良ブロック:%s %d/%d - %0.2f%% (%d/%d/%d エラー)"
 | 
				
			||||||
t MSG_236 "不良ブロック:ランダムパターンでテスト"
 | 
					t MSG_236 "不良ブロック:ランダムパターンでテスト"
 | 
				
			||||||
t MSG_237 "不良ブロック:パターン 0x%02X でテスト"
 | 
					t MSG_237 "不良ブロック:パターン 0x%02X でテスト"
 | 
				
			||||||
 | 
					<<<<<<< HEAD
 | 
				
			||||||
# eg. "Partitioning (MBR)..."
 | 
					# eg. "Partitioning (MBR)..."
 | 
				
			||||||
 | 
					=======
 | 
				
			||||||
 | 
					>>>>>>> upstream/master
 | 
				
			||||||
t MSG_238 "パーティション分割中 (%s)..."
 | 
					t MSG_238 "パーティション分割中 (%s)..."
 | 
				
			||||||
t MSG_239 "パーティション削除中..."
 | 
					t MSG_239 "パーティション削除中..."
 | 
				
			||||||
t MSG_240 "ダウンロード中 %s: 接続中..."
 | 
					t MSG_240 "ダウンロード中 %s: 接続中..."
 | 
				
			||||||
| 
						 | 
					@ -8206,13 +8242,19 @@ t MSG_271 "イメージのチェックサムを計算中 : %0.1f%% 完了"
 | 
				
			||||||
t MSG_272 "選択したイメージのMD5、SHA1、SHA256チェックサムを計算します。"
 | 
					t MSG_272 "選択したイメージのMD5、SHA1、SHA256チェックサムを計算します。"
 | 
				
			||||||
t MSG_273 "アプリケーションの使用言語を変更"
 | 
					t MSG_273 "アプリケーションの使用言語を変更"
 | 
				
			||||||
t MSG_274 "「ISOHybrid」イメージを検出しました"
 | 
					t MSG_274 "「ISOHybrid」イメージを検出しました"
 | 
				
			||||||
 | 
					<<<<<<< HEAD
 | 
				
			||||||
# '%s' below will be replaced with your translations for MSG_036 ("ISO Image") and MSG_095 ("DD Image")
 | 
					# '%s' below will be replaced with your translations for MSG_036 ("ISO Image") and MSG_095 ("DD Image")
 | 
				
			||||||
 | 
					=======
 | 
				
			||||||
 | 
					>>>>>>> upstream/master
 | 
				
			||||||
t MSG_275 "選択されたイメージは「ISOHybrid」です。下記のいずれかの方法で書き込むことができます: "
 | 
					t MSG_275 "選択されたイメージは「ISOHybrid」です。下記のいずれかの方法で書き込むことができます: "
 | 
				
			||||||
	"%s (ファイルコピー)モード又は %s (ディスクイメージ)モード。\n"
 | 
						"%s (ファイルコピー)モード又は %s (ディスクイメージ)モード。\n"
 | 
				
			||||||
	"書き込み後、ドライブへフルアクセスできる様、Rufusは %s を推奨します。\n"
 | 
						"書き込み後、ドライブへフルアクセスできる様、Rufusは %s を推奨します。\n"
 | 
				
			||||||
	"ブート中エラーが発生する場合には、%s モードで再度試してみてください。\n\n"
 | 
						"ブート中エラーが発生する場合には、%s モードで再度試してみてください。\n\n"
 | 
				
			||||||
	"このイメージを書き込む際に使用するモードを選択してください:"
 | 
						"このイメージを書き込む際に使用するモードを選択してください:"
 | 
				
			||||||
 | 
					<<<<<<< HEAD
 | 
				
			||||||
# '%s' below will be replaced with your translation for MSG_036 ("ISO Image")
 | 
					# '%s' below will be replaced with your translation for MSG_036 ("ISO Image")
 | 
				
			||||||
 | 
					=======
 | 
				
			||||||
 | 
					>>>>>>> upstream/master
 | 
				
			||||||
t MSG_276 "%sモードで書き込む(推奨)"
 | 
					t MSG_276 "%sモードで書き込む(推奨)"
 | 
				
			||||||
# '%s' below will be replaced with your translation for MSG_095 ("DD Image")
 | 
					# '%s' below will be replaced with your translation for MSG_095 ("DD Image")
 | 
				
			||||||
t MSG_277 "%sモードで書き込む"
 | 
					t MSG_277 "%sモードで書き込む"
 | 
				
			||||||
| 
						 | 
					@ -8233,7 +8275,7 @@ t MSG_286 "'0'をドライブへ書き込み初期化中: %0.1f%% 完了"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
################################################################################
 | 
					################################################################################
 | 
				
			||||||
l "ko-KR" "Korean (한국어)" 0x0412
 | 
					l "ko-KR" "Korean (한국어)" 0x0412
 | 
				
			||||||
v 1.0.18
 | 
					v 1.0.19
 | 
				
			||||||
b "en-US"
 | 
					b "en-US"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Main dialog
 | 
					# Main dialog
 | 
				
			||||||
| 
						 | 
					@ -8663,10 +8705,15 @@ t MSG_278 "부팅 유형"
 | 
				
			||||||
t MSG_279 "부팅 안 됨"
 | 
					t MSG_279 "부팅 안 됨"
 | 
				
			||||||
t MSG_280 "이미지 선택"
 | 
					t MSG_280 "이미지 선택"
 | 
				
			||||||
t MSG_281 "(이미지를 선택하세요)"
 | 
					t MSG_281 "(이미지를 선택하세요)"
 | 
				
			||||||
 | 
					t MSG_282 "전용 USB 드라이브 잠김"
 | 
				
			||||||
 | 
					t MSG_283 "유효하지 않은 디지털 서명"
 | 
				
			||||||
 | 
					t MSG_284 "다운로드 한 실행 파일에 디지털 서명이 없습니다."
 | 
				
			||||||
 | 
					t MSG_285 "다운로드 한 실행 파일은 '%s'에 의해 서명됩니다..\n이 파일은 정상적인 서명이 아니며 악성코드가 포함되어 있을 수 있습니다.\n"
 | 
				
			||||||
 | 
						"그래도 이 파일을 실행하시겠습니까?"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
################################################################################
 | 
					################################################################################
 | 
				
			||||||
l "lv-LV" "Latvian (Latviešu)" 0x0426
 | 
					l "lv-LV" "Latvian (Latviešu)" 0x0426
 | 
				
			||||||
v 1.0.19
 | 
					v 1.0.20
 | 
				
			||||||
b "en-US"
 | 
					b "en-US"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Main dialog
 | 
					# Main dialog
 | 
				
			||||||
| 
						 | 
					@ -9130,10 +9177,12 @@ t MSG_283 "Nederīgs paraksts"
 | 
				
			||||||
t MSG_284 "Ielādētajam izpildfailam ir kļūdains ciparu paraksts."
 | 
					t MSG_284 "Ielādētajam izpildfailam ir kļūdains ciparu paraksts."
 | 
				
			||||||
t MSG_285 "Ielādētais izpildfails parakstīts kā '%s'.\nTas ir neatpazīts paraksts un iespējams, "
 | 
					t MSG_285 "Ielādētais izpildfails parakstīts kā '%s'.\nTas ir neatpazīts paraksts un iespējams, "
 | 
				
			||||||
	"var radīt aizdomīgas aktivitātes...\nVai tiešām vēlaties izpildīt šo failu?"
 | 
						"var radīt aizdomīgas aktivitātes...\nVai tiešām vēlaties izpildīt šo failu?"
 | 
				
			||||||
 | 
					t MSG_286 "Nulles disks: %0.1f%% paveikts"
 | 
				
			||||||
 | 
					t MSG_287 "neUSB disku noteikšana"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
################################################################################
 | 
					################################################################################
 | 
				
			||||||
l "lt-LT" "Lithuanian (Lietuvių)" 0x0427
 | 
					l "lt-LT" "Lithuanian (Lietuvių)" 0x0427
 | 
				
			||||||
v 1.0.19
 | 
					v 1.0.20
 | 
				
			||||||
b "en-US"
 | 
					b "en-US"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Main dialog
 | 
					# Main dialog
 | 
				
			||||||
| 
						 | 
					@ -9591,10 +9640,12 @@ t MSG_283 "Negaliojantis parašas"
 | 
				
			||||||
t MSG_284 "Atsiųstas vykdomasis failas neturi skaitmeninio parašo."
 | 
					t MSG_284 "Atsiųstas vykdomasis failas neturi skaitmeninio parašo."
 | 
				
			||||||
t MSG_285 "Atsiųstą vykdomąjį failą pasirašė '%s'.\nŠio parašo mes neatpažįstame ir tai gali "
 | 
					t MSG_285 "Atsiųstą vykdomąjį failą pasirašė '%s'.\nŠio parašo mes neatpažįstame ir tai gali "
 | 
				
			||||||
	"būti tam tikros kenkėjiškos veiklos požymis...\nAr jūs tikrai norite vykdyti šį failą?"
 | 
						"būti tam tikros kenkėjiškos veiklos požymis...\nAr jūs tikrai norite vykdyti šį failą?"
 | 
				
			||||||
 | 
					t MSG_286 "Nulinamas diskas: %0.1f%% baigta"
 | 
				
			||||||
 | 
					t MSG_287 "Ne USB keičiamų diskų aptikimas"	
 | 
				
			||||||
 | 
					
 | 
				
			||||||
################################################################################
 | 
					################################################################################
 | 
				
			||||||
l "ms-MY" "Malay (Bahasa Malaysia)" 0x043e, 0x083e
 | 
					l "ms-MY" "Malay (Bahasa Malaysia)" 0x043e, 0x083e
 | 
				
			||||||
v 1.0.16
 | 
					v 1.0.19
 | 
				
			||||||
b "en-US"
 | 
					b "en-US"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Main dialog
 | 
					# Main dialog
 | 
				
			||||||
| 
						 | 
					@ -9607,7 +9658,7 @@ s IDC_FILESYSTEM +30,0
 | 
				
			||||||
s IDC_CLUSTERSIZE +30,0
 | 
					s IDC_CLUSTERSIZE +30,0
 | 
				
			||||||
s IDC_LABEL +30,0
 | 
					s IDC_LABEL +30,0
 | 
				
			||||||
t IDS_DEVICE_TXT "Peranti"
 | 
					t IDS_DEVICE_TXT "Peranti"
 | 
				
			||||||
t IDS_PARTITION_TYPE_TXT "Skema partition dan jenis sistem sasaran"
 | 
					t IDS_PARTITION_TYPE_TXT "Skema partisyen dan jenis sistem sasaran"
 | 
				
			||||||
t IDS_FILESYSTEM_TXT "Sistem fail"
 | 
					t IDS_FILESYSTEM_TXT "Sistem fail"
 | 
				
			||||||
t IDS_CLUSTERSIZE_TXT "Saiz gugusan"
 | 
					t IDS_CLUSTERSIZE_TXT "Saiz gugusan"
 | 
				
			||||||
t IDS_LABEL_TXT "Label jilid baharu"
 | 
					t IDS_LABEL_TXT "Label jilid baharu"
 | 
				
			||||||
| 
						 | 
					@ -9621,9 +9672,9 @@ m IDC_SELECT_ISO +30,0
 | 
				
			||||||
s IDC_INFO +30,0
 | 
					s IDC_INFO +30,0
 | 
				
			||||||
m IDC_BOOTTYPE +30,0
 | 
					m IDC_BOOTTYPE +30,0
 | 
				
			||||||
s IDC_BOOT +32,0
 | 
					s IDC_BOOT +32,0
 | 
				
			||||||
t IDC_BOOT "Cipta disk boleh-but menggunakan"
 | 
					t IDC_BOOT "Cipta disk boot menggunakan"
 | 
				
			||||||
t IDC_SET_ICON "Cipta label lanjut dan fail icon"
 | 
					t IDC_SET_ICON "Cipta label lanjut dan fail ikon"
 | 
				
			||||||
t IDC_ABOUT "Tentang..."
 | 
					t IDC_ABOUT "Mengenai..."
 | 
				
			||||||
t IDC_LOG "Log"
 | 
					t IDC_LOG "Log"
 | 
				
			||||||
t IDCANCEL "Tutup"
 | 
					t IDCANCEL "Tutup"
 | 
				
			||||||
m IDCANCEL +30,0
 | 
					m IDCANCEL +30,0
 | 
				
			||||||
| 
						 | 
					@ -9640,7 +9691,7 @@ t IDC_RUFUS_MBR "Guna MBR Rufus dengan BIOS ID"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# About dialog
 | 
					# About dialog
 | 
				
			||||||
g IDD_ABOUTBOX
 | 
					g IDD_ABOUTBOX
 | 
				
			||||||
t IDD_ABOUTBOX "Tentang Rufus"
 | 
					t IDD_ABOUTBOX "Mengenai Rufus"
 | 
				
			||||||
t IDC_ABOUT_LICENSE "Lesen"
 | 
					t IDC_ABOUT_LICENSE "Lesen"
 | 
				
			||||||
t IDC_ABOUT_UPDATES "Kemas kini"
 | 
					t IDC_ABOUT_UPDATES "Kemas kini"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -9651,7 +9702,7 @@ t IDCANCEL "Tutup"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Notifications. You can trigger one of these by using Alt-R and re-launching Rufus
 | 
					# Notifications. You can trigger one of these by using Alt-R and re-launching Rufus
 | 
				
			||||||
g IDD_NOTIFICATION
 | 
					g IDD_NOTIFICATION
 | 
				
			||||||
t IDC_MORE_INFO "Informasi lanjut"
 | 
					t IDC_MORE_INFO "Maklumat lanjut"
 | 
				
			||||||
t IDYES "Ya"
 | 
					t IDYES "Ya"
 | 
				
			||||||
t IDNO "Tidak"
 | 
					t IDNO "Tidak"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -9691,8 +9742,8 @@ t IDCANCEL "Tutup"
 | 
				
			||||||
g IDD_NEW_VERSION
 | 
					g IDD_NEW_VERSION
 | 
				
			||||||
t IDD_NEW_VERSION "Semak untuk versi baharu - Rufus"
 | 
					t IDD_NEW_VERSION "Semak untuk versi baharu - Rufus"
 | 
				
			||||||
t IDS_NEW_VERSION_AVAIL_TXT "Terdapat versi Rufus  yang baharu. Sila muat turun versi yang terkini."
 | 
					t IDS_NEW_VERSION_AVAIL_TXT "Terdapat versi Rufus  yang baharu. Sila muat turun versi yang terkini."
 | 
				
			||||||
t IDC_WEBSITE "Klik di sini untuk ke laman web Rufus"
 | 
					t IDC_WEBSITE "Klik di sini untuk ke laman sesawang Rufus"
 | 
				
			||||||
t IDS_NEW_VERSION_NOTES_GRP "Informasi versi terbaharu"
 | 
					t IDS_NEW_VERSION_NOTES_GRP "Maklumat versi terbaharu"
 | 
				
			||||||
t IDS_NEW_VERSION_DOWNLOAD_GRP "Muat turun"
 | 
					t IDS_NEW_VERSION_DOWNLOAD_GRP "Muat turun"
 | 
				
			||||||
t IDC_DOWNLOAD "Muat turun"
 | 
					t IDC_DOWNLOAD "Muat turun"
 | 
				
			||||||
t IDCANCEL "Tutup"
 | 
					t IDCANCEL "Tutup"
 | 
				
			||||||
| 
						 | 
					@ -9704,24 +9755,24 @@ t MSG_002 "Terdapat aplikasi Rufus sedang berjalan.\n"
 | 
				
			||||||
t MSG_003 "AMARAN: SEMUA DATA DI DALAM PERANTI '%s' AKAN DIPADAM.\n"
 | 
					t MSG_003 "AMARAN: SEMUA DATA DI DALAM PERANTI '%s' AKAN DIPADAM.\n"
 | 
				
			||||||
	"Jika hendak teruskan, klik OK. Untuk berhenti, klik BATAL."
 | 
						"Jika hendak teruskan, klik OK. Untuk berhenti, klik BATAL."
 | 
				
			||||||
t MSG_004 "Dasar kemas kini Rufus"
 | 
					t MSG_004 "Dasar kemas kini Rufus"
 | 
				
			||||||
t MSG_005 "Adakah anda mahu membenarkan Rufus menyemak untuk versi baharu secara online?"
 | 
					t MSG_005 "Adakah anda mahu membenarkan Rufus menyemak untuk versi baharu dalam talian?"
 | 
				
			||||||
# Must be the same as IDD_DIALOG:IDCANCEL (i.e. "Close" - I know it's confusing)
 | 
					# Must be the same as IDD_DIALOG:IDCANCEL (i.e. "Close" - I know it's confusing)
 | 
				
			||||||
t MSG_006 "Tutup"
 | 
					t MSG_006 "Tutup"
 | 
				
			||||||
t MSG_007 "batal"
 | 
					t MSG_007 "batal"
 | 
				
			||||||
t MSG_008 "Ya"
 | 
					t MSG_008 "Ya"
 | 
				
			||||||
t MSG_009 "Tidak"
 | 
					t MSG_009 "Tidak"
 | 
				
			||||||
t MSG_010 "Blok rosak dijumpai"
 | 
					t MSG_010 "Blok rosak dijumpai"
 | 
				
			||||||
t MSG_011 "Semak selsesai: %d blok rosak dijumpai\n"
 | 
					t MSG_011 "Semak selesai: %d blok rosak dijumpai\n"
 | 
				
			||||||
	"  %d error membaca\n  %d error menulis\n  %d error korupsi\n"
 | 
						"  %d kesilapan membaca\n  %d kesilapan menulis\n  %d kesilapan korupsi\n"
 | 
				
			||||||
# The following will contain the formatted message above as well as the name of the bad blocks logfile
 | 
					# 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_012 "%s\nLaporan lebih terperinci boleh dijumpai di:\n%s"
 | 
				
			||||||
t MSG_013 "Tidak menyemak"
 | 
					t MSG_013 "Tidak menyemak"
 | 
				
			||||||
t MSG_014 "Harian"
 | 
					t MSG_014 "Harian"
 | 
				
			||||||
t MSG_015 "Mingguan"
 | 
					t MSG_015 "Mingguan"
 | 
				
			||||||
t MSG_016 "Bulanan"
 | 
					t MSG_016 "Bulanan"
 | 
				
			||||||
t MSG_017 "Tetapan sendiri"
 | 
					t MSG_017 "Tetapan sendiri"
 | 
				
			||||||
t MSG_018 "Versi anda: %d.%d (Build %d)"
 | 
					t MSG_018 "Versi anda: %d.%d (Binaan %d)"
 | 
				
			||||||
t MSG_019 "Versi terkini: %d.%d (Build %d)"
 | 
					t MSG_019 "Versi terkini: %d.%d (Binaan %d)"
 | 
				
			||||||
# *Short* size names. These can be used as suffixes
 | 
					# *Short* size names. These can be used as suffixes
 | 
				
			||||||
t MSG_020 "bait"
 | 
					t MSG_020 "bait"
 | 
				
			||||||
t MSG_021 "KB"
 | 
					t MSG_021 "KB"
 | 
				
			||||||
| 
						 | 
					@ -9736,9 +9787,9 @@ t MSG_028 "megabait"
 | 
				
			||||||
t MSG_029 "lalai"
 | 
					t MSG_029 "lalai"
 | 
				
			||||||
# The following gets appended to the file system, cluster size, etc.
 | 
					# The following gets appended to the file system, cluster size, etc.
 | 
				
			||||||
t MSG_030 "%s (Lalai)"
 | 
					t MSG_030 "%s (Lalai)"
 | 
				
			||||||
t MSG_031 "%s skema partition untuk BIOS dan %s"
 | 
					t MSG_031 "%s skema partisyen untuk BIOS dan %s"
 | 
				
			||||||
t MSG_032 "%s skema partition untuk BIOS"
 | 
					t MSG_032 "%s skema partisyen untuk BIOS"
 | 
				
			||||||
t MSG_033 "%s skema partition untuk UEFI"
 | 
					t MSG_033 "%s skema partisyen untuk UEFI"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Number of bad block check passes (singular for 1 pass, plural for 2 or more passes)
 | 
					# Number of bad block check passes (singular for 1 pass, plural for 2 or more passes)
 | 
				
			||||||
t MSG_034 "%d kali lulus"
 | 
					t MSG_034 "%d kali lulus"
 | 
				
			||||||
| 
						 | 
					@ -9749,23 +9800,23 @@ t MSG_038 "Batal"
 | 
				
			||||||
t MSG_039 "Mula"
 | 
					t MSG_039 "Mula"
 | 
				
			||||||
t MSG_040 "Muat Turun"
 | 
					t MSG_040 "Muat Turun"
 | 
				
			||||||
t MSG_041 "Operasi dibatalkan oleh pengguna"
 | 
					t MSG_041 "Operasi dibatalkan oleh pengguna"
 | 
				
			||||||
t MSG_042 "Error"
 | 
					t MSG_042 "Kesilapan"
 | 
				
			||||||
t MSG_043 "Error: %s"
 | 
					t MSG_043 "Kesilapan: %s"
 | 
				
			||||||
t MSG_044 "Muat turun fail"
 | 
					t MSG_044 "Muat turun fail"
 | 
				
			||||||
t MSG_045 "Peranti storan USB (Generik)"
 | 
					t MSG_045 "Peranti storan USB (Generik)"
 | 
				
			||||||
t MSG_046 "%s (Disk %d) [%s]"
 | 
					t MSG_046 "%s (Cakera %d) [%s]"
 | 
				
			||||||
t MSG_047 "Beberapa Partition"
 | 
					t MSG_047 "Beberapa Partisyen"
 | 
				
			||||||
t MSG_048 "Rufus - Mengeflush buffer"
 | 
					t MSG_048 "Rufus - 'Flush' penimbal"
 | 
				
			||||||
t MSG_049 "Rufus - Dibatalkan"
 | 
					t MSG_049 "Rufus - Dibatalkan"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Error messages
 | 
					# Error messages
 | 
				
			||||||
t MSG_050 "Berjaya."
 | 
					t MSG_050 "Berjaya."
 | 
				
			||||||
t MSG_051 "Error yang tidak dapat ditentukan ketika berformat."
 | 
					t MSG_051 "Kesilapan yang tidak dapat ditentukan ketika memformat."
 | 
				
			||||||
t MSG_052 "Tidak boleh menggunakan sistem fail yang dipilih untuk media ini."
 | 
					t MSG_052 "Tidak boleh menggunakan sistem fail yang dipilih untuk media ini."
 | 
				
			||||||
t MSG_053 "Akses kepada peranti dinafikan."
 | 
					t MSG_053 "Akses kepada peranti dinafikan."
 | 
				
			||||||
t MSG_054 "Tidak boleh menulis data ke peranti (Dilindungi)"
 | 
					t MSG_054 "Tidak boleh menulis data ke peranti (Dilindungi)"
 | 
				
			||||||
t MSG_055 "Peranti ini digunakan oleh proses lain. "
 | 
					t MSG_055 "Peranti ini digunakan oleh proses lain. "
 | 
				
			||||||
	"Sila tutup mana-mana proses yang mukin menggunakan peranti ini."
 | 
						"Sila tutup mana-mana proses yang mungkin menggunakan peranti ini."
 | 
				
			||||||
t MSG_056 "Format pantas tidak boleh digunakan pada peranti ini."
 | 
					t MSG_056 "Format pantas tidak boleh digunakan pada peranti ini."
 | 
				
			||||||
t MSG_057 "Label jilid tidak sah."
 | 
					t MSG_057 "Label jilid tidak sah."
 | 
				
			||||||
t MSG_058 "Pengendali peranti tidak sah."
 | 
					t MSG_058 "Pengendali peranti tidak sah."
 | 
				
			||||||
| 
						 | 
					@ -9773,36 +9824,35 @@ t MSG_059 "Saiz gugusan yang dipilih tidak boleh digunakan pada peranti ini."
 | 
				
			||||||
t MSG_060 "Saiz jilid tidak sah."
 | 
					t MSG_060 "Saiz jilid tidak sah."
 | 
				
			||||||
t MSG_061 "Sila masukkan media boleh alih ke dalam pemacu."
 | 
					t MSG_061 "Sila masukkan media boleh alih ke dalam pemacu."
 | 
				
			||||||
t MSG_062 "Arahan yang tidak disokong diterima."
 | 
					t MSG_062 "Arahan yang tidak disokong diterima."
 | 
				
			||||||
t MSG_063 "error peruntukkan memori."
 | 
					t MSG_063 "Kesilapan peruntukkan memori."
 | 
				
			||||||
t MSG_064 "Error membaca."
 | 
					t MSG_064 "Kesilapan membaca."
 | 
				
			||||||
t MSG_065 "Error menulis."
 | 
					t MSG_065 "Kesilapan menulis."
 | 
				
			||||||
t MSG_066 "Kegagalan memasang"
 | 
					t MSG_066 "Kegagalan memasang"
 | 
				
			||||||
t MSG_067 "Media tidak boleh dibuka. Ia mungkin digunakan dalam proses yang lain. "
 | 
					t MSG_067 "Media tidak boleh dibuka. Ia mungkin digunakan dalam proses yang lain. "
 | 
				
			||||||
	"Tolong cabut dan masukkan semula dan cuba sekali lagi."
 | 
						"Sila cabut dan masukkan semula dan cuba sekali lagi."
 | 
				
			||||||
t MSG_068 "Masalah semasa mempartition drive."
 | 
					t MSG_068 "Masalah semasa pembahagian pemacu."
 | 
				
			||||||
t MSG_069 "Tidak boleh meyalin fail kepada drive."
 | 
					t MSG_069 "Tidak boleh meyalin fail kepada pemacu."
 | 
				
			||||||
t MSG_070 "Dibatalkan oleh pengguna."
 | 
					t MSG_070 "Dibatalkan oleh pengguna."
 | 
				
			||||||
# See http://en.wikipedia.org/wiki/Thread_%28computing%29
 | 
					# See http://en.wikipedia.org/wiki/Thread_%28computing%29
 | 
				
			||||||
t MSG_071 "\"Thread\" tidak boleh dimulakan'."
 | 
					t MSG_071 "\"Bebenang\" tidak boleh dimulakan'."
 | 
				
			||||||
t MSG_072 "Penyemakan blok rosak tidak dapat dihabiskan."
 | 
					t MSG_072 "Penyemakan blok rosak tidak dapat diselesaikan."
 | 
				
			||||||
t MSG_073 "Kegagalan  imabasan imej ISO."
 | 
					t MSG_073 "Kegagalan  imbasan imej ISO."
 | 
				
			||||||
t MSG_074 "Pengekstrakan imej ISO gagal."
 | 
					t MSG_074 "Pengekstrakan imej ISO gagal."
 | 
				
			||||||
t MSG_075 "Tidak dapat mount semula jilid."
 | 
					t MSG_075 "Tidak dapat melekap semula jilid."
 | 
				
			||||||
t MSG_076 "Tidak dapat mengepatch/menyediakan fail untuk boot."
 | 
					t MSG_076 "Tidak dapat 'patch'/menyediakan fail untuk boot."
 | 
				
			||||||
t MSG_077 "Tidak dapat menguntukkan huruf untuk drive."
 | 
					t MSG_077 "Tidak dapat memperuntukkan huruf untuk pemacu."
 | 
				
			||||||
t MSG_078 "Tidak boleh mount jilid GUID."
 | 
					t MSG_078 "Tidak boleh lekap jilid GUID."
 | 
				
			||||||
t MSG_079 "Peranti ini tidak sedia untuk digunakan"
 | 
					t MSG_079 "Peranti ini tidak sedia untuk digunakan"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
t MSG_080 "Rufus mengesan bahawa Windows masih lagi mengeflush buffer ke dalam peranti USB.\n\n"
 | 
					t MSG_080 "Rufus mengesan bahawa Windows masih lagi menarik penimbal ke dalam peranti USB.\n\n"
 | 
				
			||||||
	"Bergantung kepada kelajuan peranti USB anda, operasi ini mungkin mengambil masa yang amat lama."
 | 
						"Bergantung kepada kelajuan peranti USB anda, operasi ini mungkin mengambil masa yang amat lama."
 | 
				
			||||||
	"Terutamanya untuk fail besar .\n\nKami cadangkan anda biarkan Windows tamat dahulu untuk mengelakkan korupsi."
 | 
						"Terutamanya untuk fail besar .\n\nKami cadangkan anda biarkan Windows tamat dahulu untuk mengelakkan korupsi."
 | 
				
			||||||
	"Namun, jika anda kesuntukkan masa, anda boleh cabutkan peranti anda..."
 | 
						"Namun, jika anda kesuntukan masa, anda boleh cabutkan peranti anda..."
 | 
				
			||||||
t MSG_081 "ISO ini tidak disokong"
 | 
					t MSG_081 "ISO tidak disokong" -> "Imej tidak disokong"
 | 
				
			||||||
t MSG_082 "Versi Rufus ini hanya menyokong ISO boleh-but yang berdasarkan bootmgr, EFI, Grub4DOS, GRUB 2, isolinux atau WinPE.\n"
 | 
					t MSG_082 "Imej ini sama ada tidak boleh boot, atau ia menggunakan kaedah boot atau mampatan yang tidak disokong oleh Rufus..."
 | 
				
			||||||
	"ISO ini tidak menggunakan mana-mana antara tersebut..."
 | 
					 | 
				
			||||||
t MSG_083 "Gantikan %s?"
 | 
					t MSG_083 "Gantikan %s?"
 | 
				
			||||||
t MSG_084 "Imej ISO ini menggunakan versi '%s' yang telah usang.\n"
 | 
					t MSG_084 "Imej ISO ini menggunakan versi '%s' yang telah lapuk.\n"
 | 
				
			||||||
	"Oleh sebab ini, menu but mungkin tidak dipaparkan dengan betul.\n\n"
 | 
						"Oleh sebab ini, menu boot mungkin tidak dipaparkan dengan betul.\n\n"
 | 
				
			||||||
	"Versi yang lebih baharu boleh dimuat turun oleh Rufus untuk memperbaiki isu ini:\n"
 | 
						"Versi yang lebih baharu boleh dimuat turun oleh Rufus untuk memperbaiki isu ini:\n"
 | 
				
			||||||
	"- Pilih 'Ya' untuk menyambung ke internet dan muat turun fail tersebut\n"
 | 
						"- Pilih 'Ya' untuk menyambung ke internet dan muat turun fail tersebut\n"
 | 
				
			||||||
	"- Pilih 'Tidak' untuk tidak mengubahsuai fail ISO yang digunakan\n"
 | 
						"- Pilih 'Tidak' untuk tidak mengubahsuai fail ISO yang digunakan\n"
 | 
				
			||||||
| 
						 | 
					@ -9813,30 +9863,41 @@ t MSG_085 "Muat turun %s"
 | 
				
			||||||
t MSG_086 "Tiada imej yang dipilih"
 | 
					t MSG_086 "Tiada imej yang dipilih"
 | 
				
			||||||
# The content between the quotes below (\"Create a bootable disk\") should match
 | 
					# The content between the quotes below (\"Create a bootable disk\") should match
 | 
				
			||||||
# the beginning of the IDC_BOOT text
 | 
					# the beginning of the IDC_BOOT text
 | 
				
			||||||
t MSG_087 "Sila kilik pada butang disk untuk memilih imej yang boleh boot, "
 | 
					t MSG_087 "Sila klik pada butang cakera untuk memilih imej yang boleh boot, "
 | 
				
			||||||
	"atau nyahtandakan kotak semak \"Cipta disk boleh boot menggunakan\"."
 | 
						"atau nyahtandakan kotak semak \"Cipta pemacu boleh boot menggunakan\"."
 | 
				
			||||||
t MSG_088 "Imej terlalu besar"
 | 
					t MSG_088 "Imej terlalu besar"
 | 
				
			||||||
t MSG_089 "Imej ini terlalu besar untuk sasaran yang dipilih."
 | 
					t MSG_089 "Imej ini terlalu besar untuk sasaran yang dipilih."
 | 
				
			||||||
t MSG_090 "ISO tidak disokong"
 | 
					t MSG_090 "ISO tidak disokong"
 | 
				
			||||||
t MSG_091 "Apabila menggunakan jenis sasaran UEFI , hanya imej boleh boot jenis EFI sahaja disokong. "
 | 
					t MSG_091 "Apabila menggunakan jenis sasaran UEFI , hanya imej boot jenis EFI sahaja disokong. "
 | 
				
			||||||
	"Tolong pilih ISO boleh boot jenis EFI atau tukarkan jenis sasaran kepada BIOS."
 | 
						"Sila pilih ISO boot jenis EFI atau tukarkan jenis sasaran kepada BIOS."
 | 
				
			||||||
t MSG_092 "Sistem fail tidak disokong"
 | 
					t MSG_092 "Sistem fail tidak disokong"
 | 
				
			||||||
t MSG_093 "PENTING: PERANTI INI MEMPUNYAI BEBERAPA PARTITION!!\n\n"
 | 
					t MSG_093 "PENTING: PERANTI INI MEMPUNYAI BEBERAPA PARTISYEN!!\n\n"
 | 
				
			||||||
	"Ini mungkin termasuk partition/jilid yang tidak disenaraikan atau tidak boleh dilihat dari Windows. "
 | 
						"Ini mungkin termasuk partisyen/jilid yang tidak disenaraikan atau tidak boleh dilihat dari Windows. "
 | 
				
			||||||
	"Jika anda mahu meneruskannya, anda bertanggungjawab ke atas kehilangan data dalam partition tersebut."
 | 
						"Jika anda mahu meneruskannya, anda bertanggungjawab ke atas kehilangan data dalam partisyen tersebut."
 | 
				
			||||||
t MSG_094 "Beberapa partition dikesan"
 | 
					t MSG_094 "Beberapa partisyen dikesan"
 | 
				
			||||||
t MSG_095 "DD Imej"
 | 
					t MSG_095 "DD Imej"
 | 
				
			||||||
 | 
					t MSG_096 "Sistem fail yang sedang dipilih tidak boleh digunakan dengan jenis ISO ini. "
 | 
				
			||||||
 | 
						"Sila pilih sistem fail berlainan atau gunakan ISO berlainan."
 | 
				
			||||||
 | 
					t MSG_097 "'Windows To Go' hanya boleh digunakan jika sistem fail adalah NTFS."
 | 
				
			||||||
 | 
					t MSG_098 "PENTING: Anda cuba memasang 'Windows To Go', tetapi "
 | 
				
			||||||
 | 
						"pemacu sasaran anda tidak mempunyai atribut 'FIXED'. Disebabkan "
 | 
				
			||||||
 | 
						"ini Windows akan berkemungkinan besar sangkut sepanjang but, kerana Microsoft "
 | 
				
			||||||
 | 
						"tidak merekanya untuk berfungsi dengan pemacu yang sebaliknya mempunyai "
 | 
				
			||||||
 | 
						"atribut 'REMOVABLE'.\n\nAdakah anda masih mahu teruskan?\n\n"
 | 
				
			||||||
 | 
						"Nota: Atribut 'FIXED/REMOVABLE'adalah sifat perkakasan yang "
 | 
				
			||||||
 | 
						"hanya boleh ditukar menggunakan alatan tersuai daripada pengilang pemacu. "
 | 
				
			||||||
 | 
						"Bagaimanapun alatan tersebut adalah HAMPIR TIDAK AKAN diberikan kepada umum..."
 | 
				
			||||||
t MSG_099 "Had sistem fail"
 | 
					t MSG_099 "Had sistem fail"
 | 
				
			||||||
t MSG_100 "Imej ISO ini mengandungi fail yang lebih besar daripada 4GB "
 | 
					t MSG_100 "Imej ISO ini mengandungi fail yang lebih besar daripada 4GB "
 | 
				
			||||||
	"iaitu saiz maksima yang dibenarakan untuk sistem fail FAT/FAT32."
 | 
						"iaitu saiz maksima yang dibenarkan untuk sistem fail FAT/FAT32."
 | 
				
			||||||
t MSG_101 "Tiada sokongan WIM"
 | 
					t MSG_101 "Tiada sokongan WIM"
 | 
				
			||||||
t MSG_102 "Platform anda tidak boleh mengekstrak fail daripada arkib WIM. Ini diperlukan "
 | 
					t MSG_102 "Platform anda tidak boleh mengekstrak fail daripada arkib WIM. Ini diperlukan "
 | 
				
			||||||
	"untuk mencipta cakera boleh boot EFI Windows 7 dan Windows Vista. Anda boleh membaikinya dengan "
 | 
						"untuk mencipta cakera boot EFI Windows 7 dan Windows Vista. Anda boleh membaikinya dengan "
 | 
				
			||||||
	"cara mendapatkan versi 7-Zip terbaharu.\nAdakah anda mahu ke halaman muat turun 7-zip?"
 | 
						"cara mendapatkan versi 7-Zip terbaharu.\nAdakah anda mahu ke halaman muat turun 7-zip?"
 | 
				
			||||||
t MSG_103 "Muat turun %s?"
 | 
					t MSG_103 "Muat turun %s?"
 | 
				
			||||||
t MSG_104 "%s atau kemudian memerlukan fail '%s' di komputer anda.\n"
 | 
					t MSG_104 "%s atau kemudian memerlukan fail '%s' di komputer anda.\n"
 | 
				
			||||||
	"Oleh sebab fail tersebut lebih besar daripada 100 KB dan sentiasa ada dalam imej %s, "
 | 
						"Oleh sebab fail tersebut lebih besar daripada 100 KB dan sentiasa ada dalam imej %s, "
 | 
				
			||||||
	"Ia tidak termasuk dalam Rufus.\n\nRufus boleh memuat turunkan fail tersebut untuk anda:\n"
 | 
						"Ia tidak termasuk dalam Rufus.\n\nRufus boleh memuat turun fail tersebut untuk anda:\n"
 | 
				
			||||||
	"- Pilih 'Ya' untuk muat turun fail tersebut\n"
 | 
						"- Pilih 'Ya' untuk muat turun fail tersebut\n"
 | 
				
			||||||
	"- Pilih 'Tidak' jika anda mahu menyalin fail tersebut secara manual ke cakera ini pada masa lain\n\n"
 | 
						"- Pilih 'Tidak' jika anda mahu menyalin fail tersebut secara manual ke cakera ini pada masa lain\n\n"
 | 
				
			||||||
	"Perhatian: Fail akan dimuat turun ke direktori bersamaan Rufus dan apabila "
 | 
						"Perhatian: Fail akan dimuat turun ke direktori bersamaan Rufus dan apabila "
 | 
				
			||||||
| 
						 | 
					@ -9846,30 +9907,39 @@ t MSG_105 "Pembatalan boleh menyebabkan peranti ini TIDAK BOLEH DIGUNAKAN SEMULA
 | 
				
			||||||
t MSG_106 "Sila pilih folder"
 | 
					t MSG_106 "Sila pilih folder"
 | 
				
			||||||
t MSG_107 "Semua fail"
 | 
					t MSG_107 "Semua fail"
 | 
				
			||||||
t MSG_108 "Log Rufus"
 | 
					t MSG_108 "Log Rufus"
 | 
				
			||||||
t MSG_109 "0x%02X (Disk %d)"
 | 
					t MSG_109 "0x%02X (Cakera %d)"
 | 
				
			||||||
# "Cluster size" below should be the same as the label for IDS_CLUSTERSIZE_TXT
 | 
					# "Cluster size" below should be the same as the label for IDS_CLUSTERSIZE_TXT
 | 
				
			||||||
# "kilobytes" should be the same as in MSG_027
 | 
					# "kilobytes" should be the same as in MSG_027
 | 
				
			||||||
t MSG_110 "MS-DOS tidak boleh-but daripada cakera yang menggunakan saiz gugusan 64 kilobait.\n"
 | 
					t MSG_110 "MS-DOS tidak boleh boot daripada cakera yang menggunakan saiz gugusan 64 kilobait.\n"
 | 
				
			||||||
	"Tolong tukar saiz gugusan atau gunakan FreeDOS."
 | 
						"Sila tukarkan saiz gugusan atau gunakan FreeDOS."
 | 
				
			||||||
t MSG_111 "Incompatible Cluster size"
 | 
					t MSG_111 "Saiz gugusan tidak sesuai"
 | 
				
			||||||
# "%d:%02d" below is a duration (mins:secs)
 | 
					# "%d:%02d" below is a duration (mins:secs)
 | 
				
			||||||
t MSG_112 "Pemformattan jilid UDF yang besar mengambil masa yang amat lama. Pada kelajuan USB 2.0 anggaran masa pemformatan "
 | 
					t MSG_112 "Pemformatan jilid UDF yang besar mengambil masa yang amat lama. Pada kelajuan USB 2.0 anggaran masa pemformatan "
 | 
				
			||||||
	"adalah %d:%02d, di mana bar kemajuan akan lihat seperti ia tidak bergerak. Tolong bersabar"
 | 
						"adalah %d:%02d, di mana bar kemajuan akan kelihatan seperti ia tidak bergerak. Sila tunggu"
 | 
				
			||||||
t MSG_113 "Jilid UDF besar"
 | 
					t MSG_113 "Jilid UDF besar"
 | 
				
			||||||
t MSG_114 "Imej ini menggunakan Syslinux %s%s tetapi aplikasi ini hanya mempunyai fail pemasangan untuk"
 | 
					t MSG_114 "Imej ini menggunakan Syslinux %s%s tetapi aplikasi ini hanya mempunyai fail pemasangan untuk"
 | 
				
			||||||
	"Syslinux %s%s.\n\nOleh kerana versi-versi baharu Syslinux tidak serasi dengan satu sama lain, maka tidak"
 | 
						"Syslinux %s%s.\n\nOleh kerana versi-versi baharu Syslinux tidak serasi dengan satu sama lain, maka tidak"
 | 
				
			||||||
	"wajarlah Rufus menyediakan semuanya, dua fail tambahan perlu dimuat turun dari"
 | 
						"wajar Rufus menyediakan semuanya, dua fail tambahan perlu dimuat turun dari"
 | 
				
			||||||
	"Internet ('ldlinux.sys' dan 'ldlinux.bss'):\n"
 | 
						"Internet ('ldlinux.sys' dan 'ldlinux.bss'):\n"
 | 
				
			||||||
	"- Pilih 'Ya' untuk menyambung ke Internet dan memuat turun fail tersebut\n"
 | 
						"- Pilih 'Ya' untuk menyambung ke Internet dan memuat turun fail tersebut\n"
 | 
				
			||||||
	"- Pilih 'Tidak' untuk membatalkan operasi\n\n"
 | 
						"- Pilih 'Tidak' untuk membatalkan operasi\n\n"
 | 
				
			||||||
	"NOTA:Fail akan dimuat turun ke dalam direktori aplikasi ini dan akan digunakan semula"
 | 
						"NOTA:Fail akan dimuat turun ke dalam direktori aplikasi ini dan akan digunakan semula"
 | 
				
			||||||
	"secara automatik sekiranya sedia ada.\n"
 | 
						"secara automatik sekiranya sedia ada.\n"
 | 
				
			||||||
t MSG_115 "Muat turun diperlukan"
 | 
					t MSG_115 "Muat turun diperlukan"
 | 
				
			||||||
 | 
					t MSG_116 "Imej ini menggunakan Grub %s tetapi aplikasi hanya termasuk fail pemasangan untuk Grub %s.\n\n"
 | 
				
			||||||
 | 
						"Sepertimana versi Grub berlainan mungkin tidak sesuai antara satu sama lain, dan ianya tidak "
 | 
				
			||||||
 | 
						"mungkin untuk memasukkan mereka semua, Rufus akan cuba mengesan versi fail pemasangan Grub "
 | 
				
			||||||
 | 
						"('core.img') yang sepadan dengan salah satu daripada imej anda:\n"
 | 
				
			||||||
 | 
						"- Pilih 'Ya' untuk bersambung ke Internet dan cuba memuat turunnya\n"
 | 
				
			||||||
 | 
						"- Pilih 'Tidak' untuk menggunakan versi lalai dari Rufus\n"
 | 
				
			||||||
 | 
						"- Pilih 'Batal' untuk membatalkan operasi\n\n"
 | 
				
			||||||
 | 
						"Nota: Fail akan dimuat turun dalam direktori aplikasi semasa dan akan digunakan semula secara automatik "
 | 
				
			||||||
 | 
						"jika ada. Jika tiada padanan boleh dijumpai dalam talian, versi lalai akan digunakan."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Tooltips
 | 
					# Tooltips
 | 
				
			||||||
# Partition Scheme and Target Type
 | 
					# Partition Scheme and Target Type
 | 
				
			||||||
t MSG_150 "Selalunya pilihan ini paling selamat. Namun, jika anda ada komputer UEFI dan mahu "
 | 
					t MSG_150 "Biasanya pilihan ini paling selamat. Namun, jika anda ada komputer UEFI dan mahu "
 | 
				
			||||||
	"install OS dalam mod EFI, anda patut pilih pilihan yang lain"
 | 
						"memasang OS dalam mod EFI, anda patut pilih pilihan yang lain"
 | 
				
			||||||
t MSG_151 "Gunakan ini jika anda mahu memasang OS dalam mod EFI, tetapi perlukan akses kepada "
 | 
					t MSG_151 "Gunakan ini jika anda mahu memasang OS dalam mod EFI, tetapi perlukan akses kepada "
 | 
				
			||||||
	"kandungan USB daripada Windows XP"
 | 
						"kandungan USB daripada Windows XP"
 | 
				
			||||||
t MSG_152 "Pilihan yang disyorkan untuk memasang OS dalam mod EFI dan apabila "
 | 
					t MSG_152 "Pilihan yang disyorkan untuk memasang OS dalam mod EFI dan apabila "
 | 
				
			||||||
| 
						 | 
					@ -9881,100 +9951,118 @@ t MSG_156 "Uji corak: 0x%02X, 0x%02X, 0x%02X, 0x%02X"
 | 
				
			||||||
t MSG_157 "Menetapkan sistem fail sasaran"
 | 
					t MSG_157 "Menetapkan sistem fail sasaran"
 | 
				
			||||||
t MSG_158 "Saiz minima satu blok data akan gunakan dalam sistem fail"
 | 
					t MSG_158 "Saiz minima satu blok data akan gunakan dalam sistem fail"
 | 
				
			||||||
t MSG_159 "Gunakan ini untuk tetapkan label cakera\nHuruf antarabangsa boleh digunakan"
 | 
					t MSG_159 "Gunakan ini untuk tetapkan label cakera\nHuruf antarabangsa boleh digunakan"
 | 
				
			||||||
t MSG_160 "Togol pilihan lanjutan"
 | 
					t MSG_160 "Togel pilihan lanjutan"
 | 
				
			||||||
t MSG_161 "Semak peranti untuk blok rosak menggunakan corak ujian"
 | 
					t MSG_161 "Semak peranti untuk blok rosak menggunakan corak ujian"
 | 
				
			||||||
t MSG_162 "Jangan tanda kotak ini untuk menggunakan kaedah pemformatan \"perlahan\""
 | 
					t MSG_162 "Jangan tanda kotak ini untuk menggunakan kaedah pemformatan \"perlahan\""
 | 
				
			||||||
t MSG_163 "Tanda kotak ini jika anda mahu membuat cakera USB yang boleh-but"
 | 
					t MSG_163 "Tanda kotak ini jika anda mahu membuat cakera USB boot"
 | 
				
			||||||
t MSG_164 "Kaedah yang digunakan untuk membuat cakera boleh-but"
 | 
					t MSG_164 "Kaedah yang digunakan untuk membuat cakera boot"
 | 
				
			||||||
t MSG_165 "Klik untuk memilih imej..."
 | 
					t MSG_165 "Klik untuk memilih imej..."
 | 
				
			||||||
t MSG_166 "Klik kotak ini untuk membenarkan paparan label antarabangsa "
 | 
					t MSG_166 "Klik kotak ini untuk membenarkan paparan label antarabangsa "
 | 
				
			||||||
	"dan menetapkan ikon cakera (akan membuat fail autorun.inf)"
 | 
						"dan menetapkan ikon cakera (akan membuat fail autorun.inf)"
 | 
				
			||||||
t MSG_167 "Memasang MBR yang membenarkan pilihan boot dan mampu menyamar ID BIOS USB"
 | 
					t MSG_167 "Memasang MBR yang membenarkan pilihan boot dan mampu menyamar ID BIOS USB"
 | 
				
			||||||
t MSG_168 "Cuba menyamarkan cakera USB boleh-but (biasanya 0x80) sebagai disk lain.\n"
 | 
					t MSG_168 "Cuba menyamarkan cakera USB boot (biasanya 0x80) sebagai cakera lain.\n"
 | 
				
			||||||
	"Ini hanya diperlukan jika anda memsang Windows XP dan mempunyai lebih daripada satu cakera"
 | 
						"Ini hanya diperlukan jika anda memasang Windows XP dan mempunyai lebih daripada satu cakera"
 | 
				
			||||||
t MSG_169 "Ciptakan partition tambahan tersembunyi dan cuba melaraskan sempadan partition.\n"
 | 
					t MSG_169 "Ciptakan partisyen tambahan tersembunyi dan cuba melaraskan sempadan partisyen.\n"
 | 
				
			||||||
	"Ini boleh mempertingkatkan pengesanan but untuk BIOS lama"
 | 
						"Ini boleh mempertingkatkan pengesanan boot untuk BIOS lama"
 | 
				
			||||||
t MSG_170 "Membolehkan penyenaraian pagaran cakera keras USB. GUNAKAN PADA RISIKO SENDIRI!!!"
 | 
					t MSG_170 "Membolehkan penyenaraian pagaran cakera keras USB. GUNAKAN ATAS RISIKO SENDIRI!!!"
 | 
				
			||||||
t MSG_171 "Mulakan operasi pemformatan.\nIni akan MEMADAMKAN semua data di sasaran!"
 | 
					t MSG_171 "Mulakan operasi pemformatan.\nIni akan MEMADAMKAN semua data pada sasaran!"
 | 
				
			||||||
t MSG_172 "Maklumat pelesenan dan penghargaan"
 | 
					t MSG_172 "Maklumat pelesenan dan penghargaan"
 | 
				
			||||||
t MSG_173 "Klik untuk memilih..."
 | 
					t MSG_173 "Klik untuk memilih..."
 | 
				
			||||||
# The following will appear in the about dialog
 | 
					# The following will appear in the about dialog
 | 
				
			||||||
t MSG_174 "Rufus - Utiliti pemformatan USB yang dipercayai"
 | 
					t MSG_174 "Rufus - Utiliti pemformatan USB yang dipercayai"
 | 
				
			||||||
t MSG_175 "Versi %d.%d (Build %d)"
 | 
					t MSG_175 "Versi %d.%d (Build %d)"
 | 
				
			||||||
t MSG_176 "Terjemahan Bahasa Malaysia: Muhammad Aman <aman.tifli@gmail.com>"
 | 
					t MSG_176 "Terjemahan Bahasa Malaysia:\\line\n"
 | 
				
			||||||
 | 
						"Muhammad Aman <mailto:aman.tifli@gmail.com>\\line\n"
 | 
				
			||||||
 | 
						"VGPlayer <mailto:razman90a@yahoo.com.my>"
 | 
				
			||||||
t MSG_177 "Laporkan masalah atau cadangan penambahbaikan di:"
 | 
					t MSG_177 "Laporkan masalah atau cadangan penambahbaikan di:"
 | 
				
			||||||
t MSG_178 "Hak cipta tambahan:"
 | 
					t MSG_178 "Hak cipta tambahan:"
 | 
				
			||||||
t MSG_179 "Polisi mengemaskini:"
 | 
					t MSG_179 "Polisi kemaskini:"
 | 
				
			||||||
t MSG_180 "jika anda pilih untuk membenarakan program ini menyemak untuk versi baru, "
 | 
					t MSG_180 "jika anda pilih untuk membenarkan aturcara ini menyemak untuk versi baru, "
 | 
				
			||||||
	"anda bersetuju untuk membenarkan server kami mengumpulkan maklumat berikut:"
 | 
						"anda bersetuju untuk membenarkan pelayan kami mengumpulkan maklumat berikut:"
 | 
				
			||||||
t MSG_181 "Versi dan arkitekture sistem operasi"
 | 
					t MSG_181 "Versi dan kerangka sistem operasi"
 | 
				
			||||||
t MSG_182 "Versi aplikasi yang anda gunakan"
 | 
					t MSG_182 "Versi aplikasi yang anda gunakan"
 | 
				
			||||||
t MSG_183 "IP address anda"
 | 
					t MSG_183 "Alamat IP anda"
 | 
				
			||||||
t MSG_184 "Untuk tujuan menjana statistik penggunaan peribadi , kami mungkin menyimpan informasi yang dikumpulkan, "
 | 
					t MSG_184 "Untuk tujuan menjana statistik penggunaan peribadi , kami mungkin menyimpan maklumat yang dikumpulkan, "
 | 
				
			||||||
	"\\b untuk sekurang-paling setahun\\b0 . Namun, kami tidak rela untuk mendedahkan informasi ini kepada mana-mana pihak ketiga."
 | 
						"\\b untuk sekurang-kurangnya setahun\\b0 . Namun, kami tidak rela untuk mendedahkan maklumat ini kepada mana-mana pihak ketiga."
 | 
				
			||||||
t MSG_185 "Proses mengemas kini:"
 | 
					t MSG_185 "Proses mengemas kini:"
 | 
				
			||||||
t MSG_186 "Rufus tidak memasang atau menjalankan servis di latar belakang. Oleh itu, semakan kemas kini hanya dijalankan apabila aplikasi utama berjalan.\\line\n"
 | 
					t MSG_186 "Rufus tidak memasang atau menjalankan servis di latar belakang. Oleh itu, semakan kemas kini hanya dijalankan apabila aplikasi utama berjalan.\\line\n"
 | 
				
			||||||
	"Akses internet diperlukan untuk menymeak untuk versi baru."
 | 
						"Akses internet diperlukan untuk menyemak untuk versi baru."
 | 
				
			||||||
t MSG_187 "Imej tidak sah untuk pilihan boot yang dipilih"
 | 
					t MSG_187 "Imej tidak sah untuk pilihan boot yang dipilih"
 | 
				
			||||||
t MSG_188 "Imej	tidak serasi dengan pilihan boot yang dipilih. Tolong gunakan imej lain atau pilih pilihan boot lain."
 | 
					t MSG_188 "Imej	tidak serasi dengan pilihan boot yang dipilih. Sila gunakan imej lain atau pilih pilihan boot lain."
 | 
				
			||||||
t MSG_189 "Imej ISO ini tidak serasi dengan sistem fail yang dipilih"
 | 
					t MSG_189 "Imej ISO ini tidak serasi dengan sistem fail yang dipilih"
 | 
				
			||||||
 | 
					t MSG_190 "Pemacu tidak serasi dikesan"
 | 
				
			||||||
 | 
					t MSG_191 "Melepasi tulisan"
 | 
				
			||||||
 | 
					t MSG_192 "Melepasi bacaan"
 | 
				
			||||||
 | 
					t MSG_193 "Muat turun %s"
 | 
				
			||||||
 | 
					t MSG_194 "Tidak boleh muat turun %s"
 | 
				
			||||||
 | 
					t MSG_195 "Menggunakan %s fail versi dibenam"
 | 
				
			||||||
 | 
					t MSG_196 "PENTING: PEMACU INI MENGGUNAKAN SAIZ SEKTOR BUKAN PIAWAIAN!\n\n"
 | 
				
			||||||
 | 
						"Pemacu konvensional mengunakan saiz sektor 512 bait tetapi pemacu ini menggunakan "
 | 
				
			||||||
 | 
						"%d bait. Dalam banyak kes, ini bermaksud anda TIDAK akan mampu untuk but dari pemacu ini.\n"
 | 
				
			||||||
 | 
						"Rufus boleh cuba untuk mencipta pemacu boleh but, tetapi TIDAK ADA JAMINAN ianya akan berfungsi."
 | 
				
			||||||
 | 
					t MSG_197 "Saiz sektor bukan standard dikesan"
 | 
				
			||||||
 | 
					t MSG_198 "'Windows To Go' hanya boleh dipasang dalam pemacu berpartisyen GPT jika ia mempunyai "
 | 
				
			||||||
 | 
						"set atribut 'FIXED'. Pemacu semasa tidak dikesan sebagai 'FIXED'."
 | 
				
			||||||
 | 
					t MSG_199 "Pilih ini jika anda merancang untuk memasang Windows, ke cakera lain, "
 | 
				
			||||||
 | 
						"menggunakan peranti dipilih sebagai media pemasangan."
 | 
				
			||||||
 | 
					t MSG_200 "Pilih ini jika anda mahu untuk menjalankan Windows secara langsung dari peranti dipilih."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Status messages - these messages will appear on the status bar
 | 
					# Status messages - these messages will appear on the status bar
 | 
				
			||||||
t MSG_201 "Sedang membatalkan - Sila tunggu..."
 | 
					t MSG_201 "Sedang membatalkan - Sila tunggu..."
 | 
				
			||||||
t MSG_202 "Mengimbas imej..."
 | 
					t MSG_202 "Mengimbas imej..."
 | 
				
			||||||
t MSG_203 "Imbasan imej gagal"
 | 
					t MSG_203 "Imbasan imej gagal"
 | 
				
			||||||
# Parameter: the name of an obsolete Syslinux .c32 module. eg: "Obsolete vesamenu.c32 detected"
 | 
					# Parameter: the name of an obsolete Syslinux .c32 module. eg: "Obsolete vesamenu.c32 detected"
 | 
				
			||||||
t MSG_204 "%s usang dikesan"
 | 
					t MSG_204 "%s lapuk dikesan"
 | 
				
			||||||
# Display the name of the ISO selected. eg: "Using ISO: en_win7_x64_sp1.iso"
 | 
					# Display the name of the ISO selected. eg: "Using ISO: en_win7_x64_sp1.iso"
 | 
				
			||||||
t MSG_205 "Menggunakan ISO: %s"
 | 
					t MSG_205 "Menggunakan ISO: %s" -> "Menggunakan imej: %s"
 | 
				
			||||||
# Typically "Missing ldlinux.c32 file"
 | 
					# Typically "Missing ldlinux.c32 file"
 | 
				
			||||||
t MSG_206 "Tidak jumpa fail %s"
 | 
					t MSG_206 "Tidak menjumpai fail %s"
 | 
				
			||||||
# The name proposed by Windows' Computer Management -> Disk Management when you try to format a drive
 | 
					# The name proposed by Windows' Computer Management -> Disk Management when you try to format a drive
 | 
				
			||||||
# with an empty label. See http://rufus.akeo.ie/pics/default_name.png
 | 
					# with an empty label. See http://rufus.akeo.ie/pics/default_name.png
 | 
				
			||||||
t MSG_207 "Jilid baharu"
 | 
					t MSG_207 "Jilid baharu"
 | 
				
			||||||
# Same message, once for singular and plural ("1 device found", "2 devices found")
 | 
					# Same message, once for singular and plural ("1 device found", "2 devices found")
 | 
				
			||||||
t MSG_208 "%d peranti dijumpa"
 | 
					t MSG_208 "%d peranti dijumpai"
 | 
				
			||||||
t MSG_209 "%d peranti dijumpa"
 | 
					t MSG_209 "%d peranti dijumpai"
 | 
				
			||||||
t MSG_210 "SELESAI"
 | 
					t MSG_210 "SELESAI" -> "SEDIA".
 | 
				
			||||||
t MSG_211 "DIBATALKAN"
 | 
					t MSG_211 "DIBATALKAN"
 | 
				
			||||||
t MSG_212 "GAGAL"
 | 
					t MSG_212 "GAGAL"
 | 
				
			||||||
# Used when a new update has been downloaded and launched
 | 
					# Used when a new update has been downloaded and launched
 | 
				
			||||||
t MSG_213 "Melancarkan aplikasi baru..."
 | 
					t MSG_213 "Melancarkan aplikasi baru..."
 | 
				
			||||||
t MSG_214 "Gagal untuk melancakan aplikasi baru"
 | 
					t MSG_214 "Gagal untuk melancarkan aplikasi baru"
 | 
				
			||||||
# Open/Save file
 | 
					# Open/Save file
 | 
				
			||||||
t MSG_215 "%s dibuka"
 | 
					t MSG_215 "%s dibuka"
 | 
				
			||||||
t MSG_216 "%s disimpan"
 | 
					t MSG_216 "%s disimpan"
 | 
				
			||||||
# Formatting status (make sure you use a double % to print the percent sign)
 | 
					# Formatting status (make sure you use a double % to print the percent sign)
 | 
				
			||||||
t MSG_217 "Pemformatan: %0.1f%% selesai"
 | 
					t MSG_217 "Pemformatan: %0.1f%% selesai"
 | 
				
			||||||
t MSG_218 "Mencipta sistem fail: Tugas %d/%d selesai"
 | 
					t MSG_218 "Mencipta sistem fail: Tugas %d/%d selesai"
 | 
				
			||||||
t MSG_219 "NTFS Fixup: %d%% selesai"
 | 
					t MSG_219 "Pembaikian NTFS: %d%% selesai"
 | 
				
			||||||
# Parameter: the file system and an estimated duration in mins and secs.
 | 
					# Parameter: the file system and an estimated duration in mins and secs.
 | 
				
			||||||
# eg. "Formatting (UDF) - Jangka masa anggaran 3:21..."
 | 
					# eg. "Formatting (UDF) - Jangka masa anggaran 3:21..."
 | 
				
			||||||
# NB: if "estimated duration" is too long, just use "estimated" or an abbreviation
 | 
					# NB: if "estimated duration" is too long, just use "estimated" or an abbreviation
 | 
				
			||||||
t MSG_220 "Pemformattan (%s) - Jangka masa anggaran %d:%02d..."
 | 
					t MSG_220 "Pemformatan (%s) - Jangka masa anggaran %d:%02d..."
 | 
				
			||||||
t MSG_221 "Menetapkan label (Ini mungkin mengambil sedikit masa)..."
 | 
					t MSG_221 "Menetapkan label (Ini mungkin mengambil sedikit masa)..."
 | 
				
			||||||
# Parameter: the file system. eg. "Formatting (NTFS)..."
 | 
					# Parameter: the file system. eg. "Formatting (NTFS)..."
 | 
				
			||||||
t MSG_222 "Pemformattan (%s)..."
 | 
					t MSG_222 "Pemformatan (%s)..."
 | 
				
			||||||
t MSG_223 "NTFS Fixup (Checkdisk)..."
 | 
					t MSG_223 "Pembaikian NTFS (Periksa cakera)..."
 | 
				
			||||||
t MSG_224 "Memadam struktur MBR/PBR/GPT..."
 | 
					t MSG_224 "Memadam struktur MBR/PBR/GPT..."
 | 
				
			||||||
t MSG_225 "Meminta akses cakera..."
 | 
					t MSG_225 "Meminta akses cakera..."
 | 
				
			||||||
t MSG_226 "Menganalisis rekod but sedia ada..."
 | 
					t MSG_226 "Menganalisis rekod boot sedia ada..."
 | 
				
			||||||
t MSG_227 "Menutup jilid sedia ada..."
 | 
					t MSG_227 "Menutup jilid sedia ada..."
 | 
				
			||||||
t MSG_228 "Menulis \"Master boot record\"..."
 | 
					t MSG_228 "Menulis \"Rekod master boot\"..."
 | 
				
			||||||
t MSG_229 "Menulis rekod but partition..."
 | 
					t MSG_229 "Menulis rekod boot partisyen..."
 | 
				
			||||||
t MSG_230 "Menyalin fail DOS..."
 | 
					t MSG_230 "Menyalin fail DOS..."
 | 
				
			||||||
t MSG_231 "Menyalin fail ISO..."
 | 
					t MSG_231 "Menyalin fail ISO..."
 | 
				
			||||||
t MSG_232 "Persediaan boot EFI Win7 (ini mungkin mengambil sedikit masa)..."
 | 
					t MSG_232 "Persediaan boot EFI Win7 (ini mungkin mengambil sedikit masa)..."
 | 
				
			||||||
t MSG_233 "Memuktamadkan, sila tunggu..."
 | 
					t MSG_233 "Menyiapkan, sila tunggu..."
 | 
				
			||||||
# Takes the Syslinux version as parameter, eg. "Installing Syslinux v5..."
 | 
					# Takes the Syslinux version as parameter, eg. "Installing Syslinux v5..."
 | 
				
			||||||
t MSG_234 "Memasang Syslinux %s..."
 | 
					t MSG_234 "Memasang Syslinux %s..."
 | 
				
			||||||
# Bad blocks status. eg: "Bad Blocks: PASS 1/2 - 12.34% (0/0/1 errors)"
 | 
					# Bad blocks status. eg: "Bad Blocks: PASS 1/2 - 12.34% (0/0/1 errors)"
 | 
				
			||||||
t MSG_235 "Blok rosak: %s %d/%d - %0.2f%% (%d/%d/%d errors)"
 | 
					t MSG_235 "Blok rosak: MELEPASI %d/%d - %0.2f%% (%d/%d/%d kesilapan)" -> "Blok rosak: %s %d/%d - %0.2f%% (%d/%d/%d kesilapan)"
 | 
				
			||||||
t MSG_236 "Blok rosak: menguji dengan corak rawak"
 | 
					t MSG_236 "Blok rosak: menguji dengan corak rawak"
 | 
				
			||||||
t MSG_237 "Blok rosak: Menguji dengan corak 0x%02X"
 | 
					t MSG_237 "Blok rosak: Menguji dengan corak 0x%02X"
 | 
				
			||||||
# eg. "Partitioning (MBR)..."
 | 
					# eg. "Partitioning (MBR)..."
 | 
				
			||||||
t MSG_238 "Mempartition (%s)..."
 | 
					t MSG_238 "Mempartisyenkan (%s)..."
 | 
				
			||||||
t MSG_239 "Memadam partition..."
 | 
					t MSG_239 "Memadam partisyen..."
 | 
				
			||||||
t MSG_240 "Memuat turun %s: menyambung ke internet..."
 | 
					t MSG_240 "Memuat turun %s: menyambung ke internet..."
 | 
				
			||||||
t MSG_241 "memuat turun: %0.1f%%"
 | 
					t MSG_241 "memuat turun: %0.1f%%"
 | 
				
			||||||
t MSG_242 "Gagal memuat turun fail."
 | 
					t MSG_242 "Gagal memuat turun fail."
 | 
				
			||||||
| 
						 | 
					@ -9983,13 +10071,13 @@ t MSG_244 "Kemas kini: Tidak dapat menyambung ke internet"
 | 
				
			||||||
t MSG_245 "Kemsa kini: Tidak dapat mengakses data versi"
 | 
					t MSG_245 "Kemsa kini: Tidak dapat mengakses data versi"
 | 
				
			||||||
t MSG_246 "Versi baru Rufus boleh didapati!"
 | 
					t MSG_246 "Versi baru Rufus boleh didapati!"
 | 
				
			||||||
t MSG_247 "Tiada versi baru Rufus didapati"
 | 
					t MSG_247 "Tiada versi baru Rufus didapati"
 | 
				
			||||||
t MSG_248 "Kekunci registry aplikasi berjaya dipadam"
 | 
					t MSG_248 "Kekunci daftar aplikasi berjaya dipadam"
 | 
				
			||||||
t MSG_249 "Gagal memadam kekunci registry aplikasi"
 | 
					t MSG_249 "Gagal memadam kekunci daftar aplikasi"
 | 
				
			||||||
# eg. "Fixed disk detection enabled" "ISO size check disabled"
 | 
					# eg. "Fixed disk detection enabled" "ISO size check disabled"
 | 
				
			||||||
t MSG_250 "%s dibolehkan"
 | 
					t MSG_250 "%s dibolehkan"
 | 
				
			||||||
t MSG_251 "%s tidak dibolehkan"
 | 
					t MSG_251 "%s tidak dibolehkan"
 | 
				
			||||||
t MSG_252 "Menyemak saiz"
 | 
					t MSG_252 "Menyemak saiz"
 | 
				
			||||||
t MSG_253 "Pengesanan cakera tetap"
 | 
					t MSG_253 "Pengesanan cakera tetap" -> "Pengesanan cakera keras"
 | 
				
			||||||
t MSG_254 "Memaksa pemformatan FAT32 besar"
 | 
					t MSG_254 "Memaksa pemformatan FAT32 besar"
 | 
				
			||||||
t MSG_255 "NoDriveTypeAutorun akan dipadam apabila keluar"
 | 
					t MSG_255 "NoDriveTypeAutorun akan dipadam apabila keluar"
 | 
				
			||||||
t MSG_256 "Pengesanan cakera palsu"
 | 
					t MSG_256 "Pengesanan cakera palsu"
 | 
				
			||||||
| 
						 | 
					@ -10000,10 +10088,45 @@ t MSG_260 "Mampatan NTFS"
 | 
				
			||||||
t MSG_261 "Menulis imej: %0.1f%% selesai"
 | 
					t MSG_261 "Menulis imej: %0.1f%% selesai"
 | 
				
			||||||
t MSG_262 "Sokongan ISO"
 | 
					t MSG_262 "Sokongan ISO"
 | 
				
			||||||
t MSG_263 "Guna saiz seunit yang BETUL"
 | 
					t MSG_263 "Guna saiz seunit yang BETUL"
 | 
				
			||||||
 | 
					t MSG_264 "Memadam direktori '%s'"
 | 
				
			||||||
 | 
					t MSG_265 "Pengesanan cakera VMWare"
 | 
				
			||||||
 | 
					t MSG_266 "Mod dwi UEFI/BIOS"
 | 
				
			||||||
 | 
					t MSG_267 "Menggunakan imej Windows: %0.1f%% selesai"
 | 
				
			||||||
 | 
					t MSG_268 "Menggunakan imej Windows..."
 | 
				
			||||||
 | 
					t MSG_269 "Mengekalkan cap masa"
 | 
				
			||||||
 | 
					t MSG_270 "Nyahpijat USB"
 | 
				
			||||||
 | 
					t MSG_271 "Mengira semak tambah imej: %0.1f%% selesai"
 | 
				
			||||||
 | 
					t MSG_272 "Mengira semak tambah MD5, SHA1 dan SHA256 imej dipilih"
 | 
				
			||||||
 | 
					t MSG_273 "Menukar bahasa aplikasi"
 | 
				
			||||||
 | 
					t MSG_274 "Imej ISOHybrid dikesan"
 | 
				
			||||||
 | 
					# '%s' below will be replaced with your translations for MSG_036 ("ISO Image") and MSG_095 ("DD Image")
 | 
				
			||||||
 | 
					t MSG_275 "Imej yang anda telah pilih adalah imej 'ISOHybrid'. Ini bermaksud ia boleh ditulis sama ada dalam "
 | 
				
			||||||
 | 
						"%s mod (salinan fail) atau %s mod (imej cakera).\n"
 | 
				
			||||||
 | 
						"Rufus galakkan menggunakan mod %s, jadi anda selalu mempunyai akses penuh ke pemacu selepas menulisnya.\n"
 | 
				
			||||||
 | 
						"Bagaimanapun, jika anda menghadapi isu-isu semasa boot, anda boleh cuba menulis imej ini lagi dalam mod %s.\n\n"
 | 
				
			||||||
 | 
						"Sila pilih mod yang anda mahu guna untuk menulis imej ini:"
 | 
				
			||||||
 | 
					# '%s' below will be replaced with your translation for MSG_036 ("ISO Image")
 | 
				
			||||||
 | 
					t MSG_276 "Menulis dalam mod %s (Digalakkan)"
 | 
				
			||||||
 | 
					# '%s' below will be replaced with your translation for MSG_095 ("DD Image")
 | 
				
			||||||
 | 
					t MSG_277 "Menulis dalam mod %s"
 | 
				
			||||||
 | 
					# The following will be used for new controls of the Rufus 3.0 interface
 | 
				
			||||||
 | 
					# They are added as messages, so that I will have them available when needed.
 | 
				
			||||||
 | 
					# 278 & 280 will be dropdown titles, similar to how IDS_DEVICE_TXT or IDS_PARTITION_TYPE_TXT are used
 | 
				
			||||||
 | 
					# 279 & 281 will be items that can appear in the dropdowns
 | 
				
			||||||
 | 
					t MSG_278 "Jenis boot"
 | 
				
			||||||
 | 
					t MSG_279 "Tidak boleh boot"
 | 
				
			||||||
 | 
					t MSG_280 "Pilihan imej"
 | 
				
			||||||
 | 
					t MSG_281 "(Sila pilih satu imej)"
 | 
				
			||||||
 | 
					t MSG_282 "Penguncian pemacu USB eksklusif"
 | 
				
			||||||
 | 
					t MSG_283 "tandatangan tidak sah"
 | 
				
			||||||
 | 
					t MSG_284 "'Executable' yang dimuat turun kehilangan tandatangan digital."
 | 
				
			||||||
 | 
					t MSG_285 "'Executable' yang dimuat turun ditandatangani oleh '%s'.\nIni bukannya tandatangan yang kami kenal dan boleh "
 | 
				
			||||||
 | 
						"menunjukkan beberapa bentuk aktiviti berniat jahat...\nAdakah anda pasti anda mahu menjalankan fail ini?"
 | 
				
			||||||
 | 
					t MSG_286 "Mensifarkan pemacu: %0.1f%% selesai"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
################################################################################
 | 
					################################################################################
 | 
				
			||||||
l "nb-NO" "Norwegian (Norsk)" 0x0414
 | 
					l "nb-NO" "Norwegian (Norsk)" 0x0414
 | 
				
			||||||
v 1.0.19
 | 
					v 1.0.20
 | 
				
			||||||
b "en-US"
 | 
					b "en-US"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Main dialog
 | 
					# Main dialog
 | 
				
			||||||
| 
						 | 
					@ -10473,11 +10596,13 @@ t MSG_283 "Ugyldig signatur"
 | 
				
			||||||
t MSG_284 "Den nedlastede programfil mangler en digital signatur."
 | 
					t MSG_284 "Den nedlastede programfil mangler en digital signatur."
 | 
				
			||||||
t MSG_285 "Den nedlastede programfil er signert av '%s'.\nDette er en signatur vi ikke gjenkjenner, og kan "
 | 
					t MSG_285 "Den nedlastede programfil er signert av '%s'.\nDette er en signatur vi ikke gjenkjenner, og kan "
 | 
				
			||||||
	"indikere en form for skadelig aktivitet...\nEr du sikker på at du vil kjøre denne filen?"
 | 
						"indikere en form for skadelig aktivitet...\nEr du sikker på at du vil kjøre denne filen?"
 | 
				
			||||||
 | 
					t MSG_286 "Skriver 0-er til stasjon: %0.1f%% ferdig"
 | 
				
			||||||
 | 
					t MSG_287 "Oppdagelse av ikke-USB flyttbare stasjoner"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
################################################################################
 | 
					################################################################################
 | 
				
			||||||
l "fa-IR" "Persian (فارسی)" 0x0429
 | 
					l "fa-IR" "Persian (فارسی)" 0x0429
 | 
				
			||||||
a "r"
 | 
					a "r"
 | 
				
			||||||
v 1.0.19
 | 
					v 1.0.20
 | 
				
			||||||
b "en-US"
 | 
					b "en-US"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Main dialog
 | 
					# Main dialog
 | 
				
			||||||
| 
						 | 
					@ -11020,10 +11145,12 @@ t MSG_283 "امضای نامعتبر"
 | 
				
			||||||
t MSG_284 "فایل اجرایی دانلود شده امضای دیجیتال ندارد."
 | 
					t MSG_284 "فایل اجرایی دانلود شده امضای دیجیتال ندارد."
 | 
				
			||||||
t MSG_285 "این فایل اجرایی دانلود شده، توسط '%s' امضا شده است.\n ما این امضا را نمیشناسیم و "
 | 
					t MSG_285 "این فایل اجرایی دانلود شده، توسط '%s' امضا شده است.\n ما این امضا را نمیشناسیم و "
 | 
				
			||||||
	"ناشناس بودن آن ممکن است نشانه نوعی فعالیت خرابکارانه باشد...\nآیا مطمئن هستید میخواهید این فایل را اجرا کنید؟"
 | 
						"ناشناس بودن آن ممکن است نشانه نوعی فعالیت خرابکارانه باشد...\nآیا مطمئن هستید میخواهید این فایل را اجرا کنید؟"
 | 
				
			||||||
 | 
					t MSG_286 "درحال بازنويسي درايو با داده صفر؛ درصد پيشرفت: %0.1f%%"
 | 
				
			||||||
 | 
					t MSG_287 "شناسايي درايوهاي غير USB"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
################################################################################
 | 
					################################################################################
 | 
				
			||||||
l "pl-PL" "Polish (Polski)" 0x0415
 | 
					l "pl-PL" "Polish (Polski)" 0x0415
 | 
				
			||||||
v 1.0.19
 | 
					v 1.0.20
 | 
				
			||||||
b "en-US"
 | 
					b "en-US"
 | 
				
			||||||
# my info: 6.9.2015,22:39
 | 
					# my info: 6.9.2015,22:39
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -11495,10 +11622,12 @@ t MSG_283 "Nieprawidłowa sygnatura"
 | 
				
			||||||
t MSG_284 "Pobrany plik wykonywalny nie posiada cyfrowej sygnatury."
 | 
					t MSG_284 "Pobrany plik wykonywalny nie posiada cyfrowej sygnatury."
 | 
				
			||||||
t MSG_285 "Pobrany plik wykonywalny jest podpisany przez '%s'.\nTo nie jest rozpoznawana przez nas sygnatura i może "
 | 
					t MSG_285 "Pobrany plik wykonywalny jest podpisany przez '%s'.\nTo nie jest rozpoznawana przez nas sygnatura i może "
 | 
				
			||||||
	"wskazywać na pewne formy złośliwych zachowań...\nCzy na pewno chcesz uruchomić ten plik?"
 | 
						"wskazywać na pewne formy złośliwych zachowań...\nCzy na pewno chcesz uruchomić ten plik?"
 | 
				
			||||||
 | 
					t MSG_286 "Zerowanie dysku: ukończono %0.1f%%"
 | 
				
			||||||
 | 
					t MSG_287 "Wykrywanie dysków wymiennych nie-USB"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
################################################################################
 | 
					################################################################################
 | 
				
			||||||
l "pt-BR" "Portuguese Brazilian (Português do Brasil)" 0x0416
 | 
					l "pt-BR" "Portuguese Brazilian (Português do Brasil)" 0x0416
 | 
				
			||||||
v 1.0.19
 | 
					v 1.0.20
 | 
				
			||||||
b "en-US"
 | 
					b "en-US"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Main dialog
 | 
					# Main dialog
 | 
				
			||||||
| 
						 | 
					@ -11930,10 +12059,12 @@ t MSG_283 "Assinatura digital inválida"
 | 
				
			||||||
t MSG_284 "O executável baixado não contém uma assinatura digital."
 | 
					t MSG_284 "O executável baixado não contém uma assinatura digital."
 | 
				
			||||||
t MSG_285 "O executável baixado é assinado por '%s'.\nEsta assinatura não é reconhecida e pode "
 | 
					t MSG_285 "O executável baixado é assinado por '%s'.\nEsta assinatura não é reconhecida e pode "
 | 
				
			||||||
	"indicar alguma forma de atividade maliciosa...\nVocê tem certeza que deseja executar este arquivo?"
 | 
						"indicar alguma forma de atividade maliciosa...\nVocê tem certeza que deseja executar este arquivo?"
 | 
				
			||||||
 | 
					t MSG_286 "Zerando HD: %0.1f%% concluído"
 | 
				
			||||||
 | 
					t MSG_287 "Detecção de drives não USB removíveis"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
################################################################################
 | 
					################################################################################
 | 
				
			||||||
l "pt-PT" "Portuguese Standard (Português)" 0x0816
 | 
					l "pt-PT" "Portuguese Standard (Português)" 0x0816
 | 
				
			||||||
v 1.0.19
 | 
					v 1.0.20
 | 
				
			||||||
b "en-US"
 | 
					b "en-US"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Main dialog
 | 
					# Main dialog
 | 
				
			||||||
| 
						 | 
					@ -12390,10 +12521,12 @@ t MSG_283 "Assinatura inválida"
 | 
				
			||||||
t MSG_284 "No executável transferido está a faltar uma assinatura digital."
 | 
					t MSG_284 "No executável transferido está a faltar uma assinatura digital."
 | 
				
			||||||
t MSG_285 "O executável transferido está assinado por '%s'.\nNão é uma assinatura reconhecida e "
 | 
					t MSG_285 "O executável transferido está assinado por '%s'.\nNão é uma assinatura reconhecida e "
 | 
				
			||||||
	"poderá indicar algum tipo de actividade mal intencionada...\nTem certeza de que deseja executar este ficheiro?"
 | 
						"poderá indicar algum tipo de actividade mal intencionada...\nTem certeza de que deseja executar este ficheiro?"
 | 
				
			||||||
 | 
					t MSG_286 "A limpar disco: %0.1f%% concluído"
 | 
				
			||||||
 | 
					t MSG_287 "Detecção de unidades removíveis não-USB"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
################################################################################
 | 
					################################################################################
 | 
				
			||||||
l "ro-RO" "Romanian (Română)" 0x0418, 0x0818
 | 
					l "ro-RO" "Romanian (Română)" 0x0418, 0x0818
 | 
				
			||||||
v 1.0.19
 | 
					v 1.0.20
 | 
				
			||||||
b "en-US"
 | 
					b "en-US"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
g IDD_DIALOG
 | 
					g IDD_DIALOG
 | 
				
			||||||
| 
						 | 
					@ -12805,10 +12938,12 @@ t MSG_283 "Semnătură invalidă"
 | 
				
			||||||
t MSG_284 "Executabilul descărcat nu este semnat."
 | 
					t MSG_284 "Executabilul descărcat nu este semnat."
 | 
				
			||||||
t MSG_285 "Executabilul descărcat este semnat de către '%s'.\nAceasta nu este o semnătură recunoscută și ar putea "
 | 
					t MSG_285 "Executabilul descărcat este semnat de către '%s'.\nAceasta nu este o semnătură recunoscută și ar putea "
 | 
				
			||||||
	"indica o anumită formă de activitate dăunătoare...\nSunteți sigur că doriți să executați acest fișier?"
 | 
						"indica o anumită formă de activitate dăunătoare...\nSunteți sigur că doriți să executați acest fișier?"
 | 
				
			||||||
 | 
					t MSG_286 "Unitatea zero: %0.1f%% finisat"	
 | 
				
			||||||
 | 
					t MSG_287 "Detectarea unităților mobile de bază non-USB"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
################################################################################
 | 
					################################################################################
 | 
				
			||||||
l "ru-RU" "Russian (Русский)" 0x0419, 0x0819
 | 
					l "ru-RU" "Russian (Русский)" 0x0419, 0x0819
 | 
				
			||||||
v 1.0.19
 | 
					v 1.0.20
 | 
				
			||||||
b "en-US"
 | 
					b "en-US"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Main dialog
 | 
					# Main dialog
 | 
				
			||||||
| 
						 | 
					@ -13241,6 +13376,8 @@ t MSG_283 "Неверная подпись"
 | 
				
			||||||
t MSG_284 "У загруженного файла отсутствует цифровая подпись."
 | 
					t MSG_284 "У загруженного файла отсутствует цифровая подпись."
 | 
				
			||||||
t MSG_285 "Загруженный файл подписан '%s'.\nЭто не та подпись, которая признается, что "
 | 
					t MSG_285 "Загруженный файл подписан '%s'.\nЭто не та подпись, которая признается, что "
 | 
				
			||||||
	"указывает на некоторые формы вредоносных действий...\nВы уверены, что хотите запустить этот файл?"
 | 
						"указывает на некоторые формы вредоносных действий...\nВы уверены, что хотите запустить этот файл?"
 | 
				
			||||||
 | 
					t MSG_286 "Обнуление диска: %0.1f%% выполнено"
 | 
				
			||||||
 | 
					t MSG_287 "Выявление не-USB съемных дисков"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
################################################################################
 | 
					################################################################################
 | 
				
			||||||
l "sr-SP" "Serbian (Srpski)" 0x241a, 0x081a, 0x181a, 0x2c1a, 0x701a, 0x7c1a
 | 
					l "sr-SP" "Serbian (Srpski)" 0x241a, 0x081a, 0x181a, 0x2c1a, 0x701a, 0x7c1a
 | 
				
			||||||
| 
						 | 
					@ -14170,8 +14307,8 @@ t MSG_285 "Stiahnutý inštalátor podpísal '%s'.\nTento podpis nebol rozoznan
 | 
				
			||||||
	"nejakú formu škodlivej aktivity...\nSte si istý, že chcete spustiť tento súbor?"
 | 
						"nejakú formu škodlivej aktivity...\nSte si istý, že chcete spustiť tento súbor?"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
################################################################################
 | 
					################################################################################
 | 
				
			||||||
l "sl-SI" "Slovene (Slovenščina)" 0x0424
 | 
					l "sl-SI" "Slovenian (Slovenščina)" 0x0424
 | 
				
			||||||
v 1.0.19
 | 
					v 1.0.20
 | 
				
			||||||
b "en-US"
 | 
					b "en-US"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Main dialog
 | 
					# Main dialog
 | 
				
			||||||
| 
						 | 
					@ -14609,10 +14746,12 @@ t MSG_283 "Neveljaven podpis"
 | 
				
			||||||
t MSG_284 "Prenesena datoteka nima digitalnega podpisa."
 | 
					t MSG_284 "Prenesena datoteka nima digitalnega podpisa."
 | 
				
			||||||
t MSG_285 "Oseba, ki je podpisala preneseno datoteko, je '%s'.\nTa podpis se ne ujema s pričakovanim, kar lahko pomeni, "
 | 
					t MSG_285 "Oseba, ki je podpisala preneseno datoteko, je '%s'.\nTa podpis se ne ujema s pričakovanim, kar lahko pomeni, "
 | 
				
			||||||
	"da je to zlonamerna datoteka, ki jo vam je nekdo podtaknil.\nAli ste prepričani, da jo želite zagnati?"
 | 
						"da je to zlonamerna datoteka, ki jo vam je nekdo podtaknil.\nAli ste prepričani, da jo želite zagnati?"
 | 
				
			||||||
 | 
					t MSG_286 "Zapolnjujem nosilec z ničlami: %0.1f%%"
 | 
				
			||||||
 | 
					t MSG_287 "Zaznava neodstranljivih nosilcev"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
################################################################################
 | 
					################################################################################
 | 
				
			||||||
l "es-ES" "Spanish (Español)" 0x040a, 0x080a, 0x0c0a, 0x100a, 0x140a, 0x180a, 0x1c0a, 0x200a, 0x240a, 0x280a, 0x2c0a, 0x300a, 0x340a, 0x380a, 0x3c0a, 0x400a, 0x440a, 0x480a, 0x4c0a, 0x500a, 0x540a, 0x580a
 | 
					l "es-ES" "Spanish (Español)" 0x040a, 0x080a, 0x0c0a, 0x100a, 0x140a, 0x180a, 0x1c0a, 0x200a, 0x240a, 0x280a, 0x2c0a, 0x300a, 0x340a, 0x380a, 0x3c0a, 0x400a, 0x440a, 0x480a, 0x4c0a, 0x500a, 0x540a, 0x580a
 | 
				
			||||||
v 1.0.19
 | 
					v 1.0.20
 | 
				
			||||||
b "en-US"
 | 
					b "en-US"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Main dialog
 | 
					# Main dialog
 | 
				
			||||||
| 
						 | 
					@ -15078,10 +15217,12 @@ t MSG_283 "Firma no válida"
 | 
				
			||||||
t MSG_284 "El ejecutable descargado carece de firma digital."
 | 
					t MSG_284 "El ejecutable descargado carece de firma digital."
 | 
				
			||||||
t MSG_285 "El ejecutable descargado está firmado por '%s'.\nNo reconocemos este tipo de firma y podría "
 | 
					t MSG_285 "El ejecutable descargado está firmado por '%s'.\nNo reconocemos este tipo de firma y podría "
 | 
				
			||||||
	"indicar alguna forma de actividad maliciosa...\n¿Está seguro de que quieres ejecutar este fichero?"
 | 
						"indicar alguna forma de actividad maliciosa...\n¿Está seguro de que quieres ejecutar este fichero?"
 | 
				
			||||||
 | 
					t MSG_286 "Borrando a ceros la unidad: %0.1f%% completado"
 | 
				
			||||||
 | 
					t MSG_287 "Detección de unidades extraibles no USB"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
################################################################################
 | 
					################################################################################
 | 
				
			||||||
l "sv-SE" "Swedish (Svenska)" 0x041d, 0x081d
 | 
					l "sv-SE" "Swedish (Svenska)" 0x041d, 0x081d
 | 
				
			||||||
v 1.0.19
 | 
					v 1.0.20
 | 
				
			||||||
b "en-US"
 | 
					b "en-US"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Main dialog
 | 
					# Main dialog
 | 
				
			||||||
| 
						 | 
					@ -15543,10 +15684,12 @@ t MSG_283 "Ogiltig signatur"
 | 
				
			||||||
t MSG_284 "Den nedladdade körbara filen saknar digital signatur."
 | 
					t MSG_284 "Den nedladdade körbara filen saknar digital signatur."
 | 
				
			||||||
t MSG_285 "Den nedladdade körbara filen är signerad av '%s'.\nDetta är inte en signatur vi känner igen och "
 | 
					t MSG_285 "Den nedladdade körbara filen är signerad av '%s'.\nDetta är inte en signatur vi känner igen och "
 | 
				
			||||||
	"detta kan tyda på någon form av skadlig aktivitet...\nÄr du säker på att du vill köra filen?"
 | 
						"detta kan tyda på någon form av skadlig aktivitet...\nÄr du säker på att du vill köra filen?"
 | 
				
			||||||
 | 
					t MSG_286 "Nollställer enheten: %0.1f%% klart"
 | 
				
			||||||
 | 
					t MSG_287 "Visar även icke flyttbara USB-enheter" 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
################################################################################
 | 
					################################################################################
 | 
				
			||||||
l "th-TH" "Thai (ไทย)" 0x041e
 | 
					l "th-TH" "Thai (ไทย)" 0x041e
 | 
				
			||||||
v 1.0.19
 | 
					v 1.0.20
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Main dialog
 | 
					# Main dialog
 | 
				
			||||||
g IDD_DIALOG
 | 
					g IDD_DIALOG
 | 
				
			||||||
| 
						 | 
					@ -15681,8 +15824,8 @@ t MSG_045 "USB Storage Device (Generic)"
 | 
				
			||||||
t MSG_046 "%s (Disk %d) [%s]"
 | 
					t MSG_046 "%s (Disk %d) [%s]"
 | 
				
			||||||
# Used when a drive is detected that contains more than one partition
 | 
					# Used when a drive is detected that contains more than one partition
 | 
				
			||||||
t MSG_047 "พบหลายพาร์ทิชั่น"
 | 
					t MSG_047 "พบหลายพาร์ทิชั่น"
 | 
				
			||||||
t MSG_048 "Rufus - Flushing buffers"
 | 
					t MSG_048 "Rufus - กำลังล้างบัฟเฟอร์"
 | 
				
			||||||
t MSG_049 "Rufus - Cancellation"
 | 
					t MSG_049 "Rufus - กำลังยกเลิกการดำเนินการ"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Error messages
 | 
					# Error messages
 | 
				
			||||||
t MSG_050 "สำเร็จ"
 | 
					t MSG_050 "สำเร็จ"
 | 
				
			||||||
| 
						 | 
					@ -15969,7 +16112,7 @@ t MSG_262 "การรองรับ ISO"
 | 
				
			||||||
t MSG_263 "ใช้หน่วยของขนาดตามจริง (เช่น 1KB คือ 1024 bytes)"
 | 
					t MSG_263 "ใช้หน่วยของขนาดตามจริง (เช่น 1KB คือ 1024 bytes)"
 | 
				
			||||||
t MSG_264 "กำลังลบไดเรคทอรี่ '%s'"
 | 
					t MSG_264 "กำลังลบไดเรคทอรี่ '%s'"
 | 
				
			||||||
t MSG_265 "กำลังตรวจหาดิสก์ VMWare"
 | 
					t MSG_265 "กำลังตรวจหาดิสก์ VMWare"
 | 
				
			||||||
t MSG_266 "Dual UEFI/BIOS mode"
 | 
					t MSG_266 "ระบบบูตคู่ UEFI/BIOS"
 | 
				
			||||||
t MSG_267 "กำลังใช้อิมเมจ Windows: %0.1f%%"
 | 
					t MSG_267 "กำลังใช้อิมเมจ Windows: %0.1f%%"
 | 
				
			||||||
t MSG_268 "กำลังใช้อิมเมจ Windows..."
 | 
					t MSG_268 "กำลังใช้อิมเมจ Windows..."
 | 
				
			||||||
t MSG_269 "Preserve timestamps"
 | 
					t MSG_269 "Preserve timestamps"
 | 
				
			||||||
| 
						 | 
					@ -16001,11 +16144,12 @@ t MSG_283 "ใบรับรองผิดพลาด"
 | 
				
			||||||
t MSG_284 "ไฟล์ที่ดาวน์โหลดมาไม่มีการรับรองดิจิทัล"
 | 
					t MSG_284 "ไฟล์ที่ดาวน์โหลดมาไม่มีการรับรองดิจิทัล"
 | 
				
			||||||
t MSG_285 "ไฟล์ที่ดาวน์โหลดมาถูกรับรองโดย '%s'.\nซึ่งไม่ใช่การรับรองที่เรารู้จัก ซึ่งอาจ"
 | 
					t MSG_285 "ไฟล์ที่ดาวน์โหลดมาถูกรับรองโดย '%s'.\nซึ่งไม่ใช่การรับรองที่เรารู้จัก ซึ่งอาจ"
 | 
				
			||||||
	"ทำให้เกิดกิจกรรมที่เกิดภัยคุกคามได้...\nคุณต้องการจะเปิดไฟล์นี้หรือไม่?"
 | 
						"ทำให้เกิดกิจกรรมที่เกิดภัยคุกคามได้...\nคุณต้องการจะเปิดไฟล์นี้หรือไม่?"
 | 
				
			||||||
t MSG_286 "Zeroing drive: %0.1f%%"
 | 
					t MSG_286 "กำลังเขียนไดร์ฟด้วย zero byte: %0.1f%%"
 | 
				
			||||||
 | 
					t MSG_287 "กำลังตรวจสอบไดร์ฟที่ไม่ใช่ USB"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
################################################################################
 | 
					################################################################################
 | 
				
			||||||
l "tr-TR" "Turkish (Türkçe)" 0x041F
 | 
					l "tr-TR" "Turkish (Türkçe)" 0x041F
 | 
				
			||||||
v 1.0.19
 | 
					v 1.0.20
 | 
				
			||||||
b "en-US"
 | 
					b "en-US"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Main dialog
 | 
					# Main dialog
 | 
				
			||||||
| 
						 | 
					@ -16481,10 +16625,12 @@ t MSG_283 "Geçersiz imza"
 | 
				
			||||||
t MSG_284 "İndirilen yürütülebilir dosyanın dijital imzası eksik."
 | 
					t MSG_284 "İndirilen yürütülebilir dosyanın dijital imzası eksik."
 | 
				
			||||||
t MSG_285 "İndirilen yürütülebilir dosya '%s' tarafından imzalanmış.\nBu tanımlayabildiğimiz ve kötü niyetli "
 | 
					t MSG_285 "İndirilen yürütülebilir dosya '%s' tarafından imzalanmış.\nBu tanımlayabildiğimiz ve kötü niyetli "
 | 
				
			||||||
	"etkinliğini belirtebileceğimiz bir imza değil...\nBu dosyayı çalıştırmak istediğinize emin misiniz?"
 | 
						"etkinliğini belirtebileceğimiz bir imza değil...\nBu dosyayı çalıştırmak istediğinize emin misiniz?"
 | 
				
			||||||
 | 
					t MSG_286 "Sürücü sıfırlanıyor: %0.1f%% tamamlandı"
 | 
				
			||||||
 | 
					t MSG_287 "USB olmayan çıkarılabilir aygıtlar taranıyor"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
################################################################################
 | 
					################################################################################
 | 
				
			||||||
l "uk-UA" "Ukrainian (Українська)" 0x0422
 | 
					l "uk-UA" "Ukrainian (Українська)" 0x0422
 | 
				
			||||||
v 1.0.19
 | 
					v 1.0.20
 | 
				
			||||||
b "en-US"
 | 
					b "en-US"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Main dialog
 | 
					# Main dialog
 | 
				
			||||||
| 
						 | 
					@ -16936,6 +17082,8 @@ t MSG_283 "Невірний підпис"
 | 
				
			||||||
t MSG_284 "У завантаженого файлу відсутній цифровий підпис."
 | 
					t MSG_284 "У завантаженого файлу відсутній цифровий підпис."
 | 
				
			||||||
t MSG_285 "Завантажений файл підписаний '%s'.\nЦе не той підпис, який визнається, "
 | 
					t MSG_285 "Завантажений файл підписаний '%s'.\nЦе не той підпис, який визнається, "
 | 
				
			||||||
  "що вказує на деякі форми шкідливих дій...\nВи впевнені, що хочете запустити цей файл?"
 | 
					  "що вказує на деякі форми шкідливих дій...\nВи впевнені, що хочете запустити цей файл?"
 | 
				
			||||||
 | 
					t MSG_286 "Обнуління диска: %0.1f%% завершено"
 | 
				
			||||||
 | 
					t MSG_287 "Виявлення знімних не-USB носіїв"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
################################################################################
 | 
					################################################################################
 | 
				
			||||||
l "vi-VN" "Vietnamese (Tiếng Việt)" 0x042A
 | 
					l "vi-VN" "Vietnamese (Tiếng Việt)" 0x042A
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -15,9 +15,26 @@ LastUpdateCheck = 13068056756
 | 
				
			||||||
UpdateCheckInterval = 86400
 | 
					UpdateCheckInterval = 86400
 | 
				
			||||||
; Whether the check for updates should also include new BETA releases
 | 
					; Whether the check for updates should also include new BETA releases
 | 
				
			||||||
CheckForBetas = 1
 | 
					CheckForBetas = 1
 | 
				
			||||||
; Use this to increases the log verbosity, for the update checks
 | 
					; Use this to increase the log verbosity for the updates check (0-2)
 | 
				
			||||||
VerboseUpdateCheck = 0
 | 
					; VerboseUpdateCheck = 2
 | 
				
			||||||
; If you are paranoid about apps writing to the registry, you can uncomment the
 | 
					; If you are paranoid about apps writing to the registry, you can uncomment the
 | 
				
			||||||
; following. It will disable the Local Group Policy calls that Rufus issues, to
 | 
					; following. It will disable the Local Group Policy calls that Rufus issues, to
 | 
				
			||||||
; temporarily prevent the *annoying* notices Windows issues about new drives.
 | 
					; temporarily prevent the *annoying* notices Windows issues about new drives.
 | 
				
			||||||
; DisableLGP = 1
 | 
					; DisableLGP = 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					; Start with the 'Advanced Options' panel displayed
 | 
				
			||||||
 | 
					; AdvancedMode = 1
 | 
				
			||||||
 | 
					; Have Rufus to preserve timestamps when copying files (Alt-T)
 | 
				
			||||||
 | 
					; PreserveTimestamps = 1
 | 
				
			||||||
 | 
					; Disable the whole Kibi/Gibi nonsense (Alt-U)
 | 
				
			||||||
 | 
					; UseProperSizeUnits = 1
 | 
				
			||||||
 | 
					; Display extended information duringh USB enumeration (Alt-.)
 | 
				
			||||||
 | 
					; EnableUsbDebug = 1
 | 
				
			||||||
 | 
					; Don't perform a fake drive test during bad blocks check (Alt-B)
 | 
				
			||||||
 | 
					; DisableFakeDrivesCheck = 1
 | 
				
			||||||
 | 
					; Allow the creation of dual UEFI+BIOS bootable drives for Windows (Alt-E)
 | 
				
			||||||
 | 
					; EnableWindowsDualUefiBiosMode = 1
 | 
				
			||||||
 | 
					; Also use RidgeCrop's Large FAT32 format algorithm when formatting smaller drives (Alt-L)
 | 
				
			||||||
 | 
					; ForceLargeFat32Formatting = 1
 | 
				
			||||||
 | 
					; Enable listing of VMWare's VMDK drives when used in a virtual machine (Alt-W)
 | 
				
			||||||
 | 
					; EnableVmdkDetection = 1
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,13 +4,13 @@ Rufus for NTFS UEFI boot support. See https://github.com/pbatard/uefi-ntfs.
 | 
				
			||||||
This image, which you can mount as FAT filesystem or open in 7-zip, contains
 | 
					This image, which you can mount as FAT filesystem or open in 7-zip, contains
 | 
				
			||||||
the following data:
 | 
					the following data:
 | 
				
			||||||
o The NTFS UEFI drivers from efifs (https://github.com/pbatard/efifs) which were
 | 
					o The NTFS UEFI drivers from efifs (https://github.com/pbatard/efifs) which were
 | 
				
			||||||
  compiled, with compression disabled, using Visual Studio 2013 Community Edition.
 | 
					  compiled, with compression disabled, using Visual Studio 2015 Community Edition.
 | 
				
			||||||
  These are the \EFI\Rufus\ntfs_[x32|x64].efi files.
 | 
					  These are the \EFI\Rufus\ntfs_[ia32|x64|arm].efi files.
 | 
				
			||||||
o The UEFI:NTFS binaries (https://github.com/pbatard/uefi-ntfs), which were also
 | 
					o The UEFI:NTFS binaries (https://github.com/pbatard/uefi-ntfs), which were also
 | 
				
			||||||
  compiled using Visual Studio 2013 Community Edition.
 | 
					  compiled using Visual Studio 2015 Community Edition.
 | 
				
			||||||
  These are the \EFI\Boot\boot[ia32|x64].efi files.
 | 
					  These are the \EFI\Boot\boot[ia32|x64|arm].efi files.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The FAT partition was created on Debian GNU/Linux using the following commands
 | 
					The FAT partition was created on Debian GNU/Linux using the following commands
 | 
				
			||||||
  dd if=/dev/zero of=uefi-ntfs.img bs=512 count=512
 | 
					  dd if=/dev/zero of=uefi-ntfs.img bs=512 count=1024
 | 
				
			||||||
  mkfs.vfat -n UEFI_NTFS uefi-ntfs.img
 | 
					  mkfs.vfat -n UEFI_NTFS uefi-ntfs.img
 | 
				
			||||||
and then mounting the uefi-ntfs.img image and copying the relevant files.
 | 
					and then mounting the uefi-ntfs.img image and copying the relevant files.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										13
									
								
								rufus.sln
									
										
									
									
									
								
							
							
						
						
									
										13
									
								
								rufus.sln
									
										
									
									
									
								
							| 
						 | 
					@ -1,7 +1,6 @@
 | 
				
			||||||
 | 
					 | 
				
			||||||
Microsoft Visual Studio Solution File, Format Version 12.00
 | 
					Microsoft Visual Studio Solution File, Format Version 12.00
 | 
				
			||||||
# Visual Studio 14
 | 
					# Visual Studio 14
 | 
				
			||||||
VisualStudioVersion = 14.0.23107.0
 | 
					VisualStudioVersion = 14.0.24720.0
 | 
				
			||||||
MinimumVisualStudioVersion = 10.0.40219.1
 | 
					MinimumVisualStudioVersion = 10.0.40219.1
 | 
				
			||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "rufus", "src\.msvc\rufus.vcxproj", "{731858A7-0303-4988-877B-9C0DD6471864}"
 | 
					Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "rufus", "src\.msvc\rufus.vcxproj", "{731858A7-0303-4988-877B-9C0DD6471864}"
 | 
				
			||||||
EndProject
 | 
					EndProject
 | 
				
			||||||
| 
						 | 
					@ -11,6 +10,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "syslinux-libfat", "src\sysl
 | 
				
			||||||
EndProject
 | 
					EndProject
 | 
				
			||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "syslinux-libinstaller", "src\syslinux\libinstaller\.msvc\libinstaller.vcxproj", "{266502AC-CD74-4581-B707-938A7D05AD7A}"
 | 
					Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "syslinux-libinstaller", "src\syslinux\libinstaller\.msvc\libinstaller.vcxproj", "{266502AC-CD74-4581-B707-938A7D05AD7A}"
 | 
				
			||||||
EndProject
 | 
					EndProject
 | 
				
			||||||
 | 
					Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "syslinux-win", "src\syslinux\win\.msvc\win.vcxproj", "{7D2E9784-DDF7-4988-A887-CF099BC3B340}"
 | 
				
			||||||
 | 
					EndProject
 | 
				
			||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcdio-iso9660", "src\libcdio\iso9660\.msvc\iso9660.vcxproj", "{D4E80F35-2604-40AC-B436-97B052ECB572}"
 | 
					Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcdio-iso9660", "src\libcdio\iso9660\.msvc\iso9660.vcxproj", "{D4E80F35-2604-40AC-B436-97B052ECB572}"
 | 
				
			||||||
EndProject
 | 
					EndProject
 | 
				
			||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcdio-udf", "src\libcdio\udf\.msvc\udf.vcxproj", "{0CEC40A6-A195-4BE5-A88B-0AB00EB142EC}"
 | 
					Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcdio-udf", "src\libcdio\udf\.msvc\udf.vcxproj", "{0CEC40A6-A195-4BE5-A88B-0AB00EB142EC}"
 | 
				
			||||||
| 
						 | 
					@ -61,6 +62,14 @@ Global
 | 
				
			||||||
		{266502AC-CD74-4581-B707-938A7D05AD7A}.Release|x86_32.Build.0 = Release|Win32
 | 
							{266502AC-CD74-4581-B707-938A7D05AD7A}.Release|x86_32.Build.0 = Release|Win32
 | 
				
			||||||
		{266502AC-CD74-4581-B707-938A7D05AD7A}.Release|x86_64.ActiveCfg = Release|x64
 | 
							{266502AC-CD74-4581-B707-938A7D05AD7A}.Release|x86_64.ActiveCfg = Release|x64
 | 
				
			||||||
		{266502AC-CD74-4581-B707-938A7D05AD7A}.Release|x86_64.Build.0 = Release|x64
 | 
							{266502AC-CD74-4581-B707-938A7D05AD7A}.Release|x86_64.Build.0 = Release|x64
 | 
				
			||||||
 | 
							{7D2E9784-DDF7-4988-A887-CF099BC3B340}.Debug|x86_32.ActiveCfg = Debug|Win32
 | 
				
			||||||
 | 
							{7D2E9784-DDF7-4988-A887-CF099BC3B340}.Debug|x86_32.Build.0 = Debug|Win32
 | 
				
			||||||
 | 
							{7D2E9784-DDF7-4988-A887-CF099BC3B340}.Debug|x86_64.ActiveCfg = Debug|x64
 | 
				
			||||||
 | 
							{7D2E9784-DDF7-4988-A887-CF099BC3B340}.Debug|x86_64.Build.0 = Debug|x64
 | 
				
			||||||
 | 
							{7D2E9784-DDF7-4988-A887-CF099BC3B340}.Release|x86_32.ActiveCfg = Release|Win32
 | 
				
			||||||
 | 
							{7D2E9784-DDF7-4988-A887-CF099BC3B340}.Release|x86_32.Build.0 = Release|Win32
 | 
				
			||||||
 | 
							{7D2E9784-DDF7-4988-A887-CF099BC3B340}.Release|x86_64.ActiveCfg = Release|x64
 | 
				
			||||||
 | 
							{7D2E9784-DDF7-4988-A887-CF099BC3B340}.Release|x86_64.Build.0 = Release|x64
 | 
				
			||||||
		{D4E80F35-2604-40AC-B436-97B052ECB572}.Debug|x86_32.ActiveCfg = Debug|Win32
 | 
							{D4E80F35-2604-40AC-B436-97B052ECB572}.Debug|x86_32.ActiveCfg = Debug|Win32
 | 
				
			||||||
		{D4E80F35-2604-40AC-B436-97B052ECB572}.Debug|x86_32.Build.0 = Debug|Win32
 | 
							{D4E80F35-2604-40AC-B436-97B052ECB572}.Debug|x86_32.Build.0 = Debug|Win32
 | 
				
			||||||
		{D4E80F35-2604-40AC-B436-97B052ECB572}.Debug|x86_64.ActiveCfg = Debug|x64
 | 
							{D4E80F35-2604-40AC-B436-97B052ECB572}.Debug|x86_64.ActiveCfg = Debug|x64
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -84,7 +84,7 @@
 | 
				
			||||||
      <PreprocessorDefinitions>_OFF_T_DEFINED;_off_t=__int64;off_t=_off_t;_CRTDBG_MAP_ALLOC;%(PreprocessorDefinitions)</PreprocessorDefinitions>
 | 
					      <PreprocessorDefinitions>_OFF_T_DEFINED;_off_t=__int64;off_t=_off_t;_CRTDBG_MAP_ALLOC;%(PreprocessorDefinitions)</PreprocessorDefinitions>
 | 
				
			||||||
      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
 | 
					      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
 | 
				
			||||||
      <WarningLevel>Level3</WarningLevel>
 | 
					      <WarningLevel>Level3</WarningLevel>
 | 
				
			||||||
      <AdditionalIncludeDirectories>..\msvc-missing;..\ms-sys\inc;..\syslinux\libinstaller;..\syslinux\libfat;..\libcdio;..\getopt;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
 | 
					      <AdditionalIncludeDirectories>..\msvc-missing;..\ms-sys\inc;..\syslinux\libinstaller;..\syslinux\libfat;..\syslinux\win;..\libcdio;..\getopt;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
 | 
				
			||||||
      <CompileAs>CompileAsC</CompileAs>
 | 
					      <CompileAs>CompileAsC</CompileAs>
 | 
				
			||||||
      <MultiProcessorCompilation>true</MultiProcessorCompilation>
 | 
					      <MultiProcessorCompilation>true</MultiProcessorCompilation>
 | 
				
			||||||
      <ExceptionHandling>false</ExceptionHandling>
 | 
					      <ExceptionHandling>false</ExceptionHandling>
 | 
				
			||||||
| 
						 | 
					@ -108,7 +108,7 @@
 | 
				
			||||||
      <TargetEnvironment>X64</TargetEnvironment>
 | 
					      <TargetEnvironment>X64</TargetEnvironment>
 | 
				
			||||||
    </Midl>
 | 
					    </Midl>
 | 
				
			||||||
    <ClCompile>
 | 
					    <ClCompile>
 | 
				
			||||||
      <AdditionalIncludeDirectories>..\msvc-missing;..\ms-sys\inc;..\syslinux\libinstaller;..\syslinux\libfat;..\libcdio;..\getopt;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
 | 
					      <AdditionalIncludeDirectories>..\msvc-missing;..\ms-sys\inc;..\syslinux\libinstaller;..\syslinux\libfat;..\syslinux\win;..\libcdio;..\getopt;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
 | 
				
			||||||
      <PreprocessorDefinitions>_OFF_T_DEFINED;_off_t=__int64;off_t=_off_t;_CRTDBG_MAP_ALLOC;%(PreprocessorDefinitions)</PreprocessorDefinitions>
 | 
					      <PreprocessorDefinitions>_OFF_T_DEFINED;_off_t=__int64;off_t=_off_t;_CRTDBG_MAP_ALLOC;%(PreprocessorDefinitions)</PreprocessorDefinitions>
 | 
				
			||||||
      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
 | 
					      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
 | 
				
			||||||
      <WarningLevel>Level3</WarningLevel>
 | 
					      <WarningLevel>Level3</WarningLevel>
 | 
				
			||||||
| 
						 | 
					@ -136,7 +136,7 @@
 | 
				
			||||||
      <PreprocessorDefinitions>_OFF_T_DEFINED;_off_t=__int64;off_t=_off_t;%(PreprocessorDefinitions)</PreprocessorDefinitions>
 | 
					      <PreprocessorDefinitions>_OFF_T_DEFINED;_off_t=__int64;off_t=_off_t;%(PreprocessorDefinitions)</PreprocessorDefinitions>
 | 
				
			||||||
      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
 | 
					      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
 | 
				
			||||||
      <WarningLevel>Level3</WarningLevel>
 | 
					      <WarningLevel>Level3</WarningLevel>
 | 
				
			||||||
      <AdditionalIncludeDirectories>..\msvc-missing;..\ms-sys\inc;..\syslinux\libinstaller;..\syslinux\libfat;..\libcdio;..\getopt;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
 | 
					      <AdditionalIncludeDirectories>..\msvc-missing;..\ms-sys\inc;..\syslinux\libinstaller;..\syslinux\libfat;..\syslinux\win;..\libcdio;..\getopt;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
 | 
				
			||||||
      <CompileAs>CompileAsC</CompileAs>
 | 
					      <CompileAs>CompileAsC</CompileAs>
 | 
				
			||||||
      <MultiProcessorCompilation>true</MultiProcessorCompilation>
 | 
					      <MultiProcessorCompilation>true</MultiProcessorCompilation>
 | 
				
			||||||
      <ExceptionHandling>false</ExceptionHandling>
 | 
					      <ExceptionHandling>false</ExceptionHandling>
 | 
				
			||||||
| 
						 | 
					@ -163,7 +163,7 @@
 | 
				
			||||||
      <PreprocessorDefinitions>_OFF_T_DEFINED;_off_t=__int64;off_t=_off_t;%(PreprocessorDefinitions)</PreprocessorDefinitions>
 | 
					      <PreprocessorDefinitions>_OFF_T_DEFINED;_off_t=__int64;off_t=_off_t;%(PreprocessorDefinitions)</PreprocessorDefinitions>
 | 
				
			||||||
      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
 | 
					      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
 | 
				
			||||||
      <WarningLevel>Level3</WarningLevel>
 | 
					      <WarningLevel>Level3</WarningLevel>
 | 
				
			||||||
      <AdditionalIncludeDirectories>..\msvc-missing;..\ms-sys\inc;..\syslinux\libinstaller;..\syslinux\libfat;..\libcdio;..\getopt;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
 | 
					      <AdditionalIncludeDirectories>..\msvc-missing;..\ms-sys\inc;..\syslinux\libinstaller;..\syslinux\libfat;..\syslinux\win;..\libcdio;..\getopt;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
 | 
				
			||||||
      <CompileAs>CompileAsC</CompileAs>
 | 
					      <CompileAs>CompileAsC</CompileAs>
 | 
				
			||||||
      <MultiProcessorCompilation>true</MultiProcessorCompilation>
 | 
					      <MultiProcessorCompilation>true</MultiProcessorCompilation>
 | 
				
			||||||
      <ExceptionHandling>false</ExceptionHandling>
 | 
					      <ExceptionHandling>false</ExceptionHandling>
 | 
				
			||||||
| 
						 | 
					@ -200,7 +200,7 @@
 | 
				
			||||||
    <ClCompile Include="..\stdio.c" />
 | 
					    <ClCompile Include="..\stdio.c" />
 | 
				
			||||||
    <ClCompile Include="..\stdlg.c" />
 | 
					    <ClCompile Include="..\stdlg.c" />
 | 
				
			||||||
    <ClCompile Include="..\syslinux.c" />
 | 
					    <ClCompile Include="..\syslinux.c" />
 | 
				
			||||||
    <ClCompile Include="..\usb.c" />
 | 
					    <ClCompile Include="..\dev.c" />
 | 
				
			||||||
    <ClCompile Include="..\vhd.c" />
 | 
					    <ClCompile Include="..\vhd.c" />
 | 
				
			||||||
  </ItemGroup>
 | 
					  </ItemGroup>
 | 
				
			||||||
  <ItemGroup>
 | 
					  <ItemGroup>
 | 
				
			||||||
| 
						 | 
					@ -209,6 +209,7 @@
 | 
				
			||||||
    <ClInclude Include="..\drive.h" />
 | 
					    <ClInclude Include="..\drive.h" />
 | 
				
			||||||
    <ClInclude Include="..\format.h" />
 | 
					    <ClInclude Include="..\format.h" />
 | 
				
			||||||
    <ClInclude Include="..\hdd_vs_ufd.h" />
 | 
					    <ClInclude Include="..\hdd_vs_ufd.h" />
 | 
				
			||||||
 | 
					    <ClInclude Include="..\missing.h" />
 | 
				
			||||||
    <ClInclude Include="..\settings.h" />
 | 
					    <ClInclude Include="..\settings.h" />
 | 
				
			||||||
    <ClInclude Include="..\libcdio\cdio\cdio.h" />
 | 
					    <ClInclude Include="..\libcdio\cdio\cdio.h" />
 | 
				
			||||||
    <ClInclude Include="..\libcdio\cdio\iso9660.h" />
 | 
					    <ClInclude Include="..\libcdio\cdio\iso9660.h" />
 | 
				
			||||||
| 
						 | 
					@ -223,7 +224,7 @@
 | 
				
			||||||
    <ClInclude Include="..\license.h" />
 | 
					    <ClInclude Include="..\license.h" />
 | 
				
			||||||
    <ClInclude Include="..\smart.h" />
 | 
					    <ClInclude Include="..\smart.h" />
 | 
				
			||||||
    <ClInclude Include="..\sys_types.h" />
 | 
					    <ClInclude Include="..\sys_types.h" />
 | 
				
			||||||
    <ClInclude Include="..\usb.h" />
 | 
					    <ClInclude Include="..\dev.h" />
 | 
				
			||||||
  </ItemGroup>
 | 
					  </ItemGroup>
 | 
				
			||||||
  <ItemGroup>
 | 
					  <ItemGroup>
 | 
				
			||||||
    <Manifest Include="..\rufus.manifest" />
 | 
					    <Manifest Include="..\rufus.manifest" />
 | 
				
			||||||
| 
						 | 
					@ -261,6 +262,9 @@
 | 
				
			||||||
    <ProjectReference Include="..\syslinux\libinstaller\.msvc\libinstaller.vcxproj">
 | 
					    <ProjectReference Include="..\syslinux\libinstaller\.msvc\libinstaller.vcxproj">
 | 
				
			||||||
      <Project>{266502ac-cd74-4581-b707-938a7d05ad7a}</Project>
 | 
					      <Project>{266502ac-cd74-4581-b707-938a7d05ad7a}</Project>
 | 
				
			||||||
    </ProjectReference>
 | 
					    </ProjectReference>
 | 
				
			||||||
 | 
					    <ProjectReference Include="..\syslinux\win\.msvc\win.vcxproj">
 | 
				
			||||||
 | 
					      <Project>{7d2e9784-ddf7-4988-a887-cf099bc3b340}</Project>
 | 
				
			||||||
 | 
					    </ProjectReference>
 | 
				
			||||||
  </ItemGroup>
 | 
					  </ItemGroup>
 | 
				
			||||||
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
 | 
					  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
 | 
				
			||||||
  <ImportGroup Label="ExtensionTargets">
 | 
					  <ImportGroup Label="ExtensionTargets">
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -66,15 +66,15 @@
 | 
				
			||||||
    <ClCompile Include="..\smart.c">
 | 
					    <ClCompile Include="..\smart.c">
 | 
				
			||||||
      <Filter>Source Files</Filter>
 | 
					      <Filter>Source Files</Filter>
 | 
				
			||||||
    </ClCompile>
 | 
					    </ClCompile>
 | 
				
			||||||
    <ClCompile Include="..\usb.c">
 | 
					 | 
				
			||||||
      <Filter>Source Files</Filter>
 | 
					 | 
				
			||||||
    </ClCompile>
 | 
					 | 
				
			||||||
    <ClCompile Include="..\checksum.c">
 | 
					    <ClCompile Include="..\checksum.c">
 | 
				
			||||||
      <Filter>Source Files</Filter>
 | 
					      <Filter>Source Files</Filter>
 | 
				
			||||||
    </ClCompile>
 | 
					    </ClCompile>
 | 
				
			||||||
    <ClCompile Include="..\pki.c">
 | 
					    <ClCompile Include="..\pki.c">
 | 
				
			||||||
      <Filter>Source Files</Filter>
 | 
					      <Filter>Source Files</Filter>
 | 
				
			||||||
    </ClCompile>
 | 
					    </ClCompile>
 | 
				
			||||||
 | 
					    <ClCompile Include="..\dev.c">
 | 
				
			||||||
 | 
					      <Filter>Source Files</Filter>
 | 
				
			||||||
 | 
					    </ClCompile>
 | 
				
			||||||
  </ItemGroup>
 | 
					  </ItemGroup>
 | 
				
			||||||
  <ItemGroup>
 | 
					  <ItemGroup>
 | 
				
			||||||
    <ClInclude Include="..\rufus.h">
 | 
					    <ClInclude Include="..\rufus.h">
 | 
				
			||||||
| 
						 | 
					@ -128,15 +128,18 @@
 | 
				
			||||||
    <ClInclude Include="..\drive.h">
 | 
					    <ClInclude Include="..\drive.h">
 | 
				
			||||||
      <Filter>Header Files</Filter>
 | 
					      <Filter>Header Files</Filter>
 | 
				
			||||||
    </ClInclude>
 | 
					    </ClInclude>
 | 
				
			||||||
    <ClInclude Include="..\usb.h">
 | 
					 | 
				
			||||||
      <Filter>Header Files</Filter>
 | 
					 | 
				
			||||||
    </ClInclude>
 | 
					 | 
				
			||||||
    <ClInclude Include="..\bled\bled.h">
 | 
					    <ClInclude Include="..\bled\bled.h">
 | 
				
			||||||
      <Filter>Header Files</Filter>
 | 
					      <Filter>Header Files</Filter>
 | 
				
			||||||
    </ClInclude>
 | 
					    </ClInclude>
 | 
				
			||||||
    <ClInclude Include="..\settings.h">
 | 
					    <ClInclude Include="..\settings.h">
 | 
				
			||||||
      <Filter>Header Files</Filter>
 | 
					      <Filter>Header Files</Filter>
 | 
				
			||||||
    </ClInclude>
 | 
					    </ClInclude>
 | 
				
			||||||
 | 
					    <ClInclude Include="..\missing.h">
 | 
				
			||||||
 | 
					      <Filter>Header Files</Filter>
 | 
				
			||||||
 | 
					    </ClInclude>
 | 
				
			||||||
 | 
					    <ClInclude Include="..\dev.h">
 | 
				
			||||||
 | 
					      <Filter>Header Files</Filter>
 | 
				
			||||||
 | 
					    </ClInclude>
 | 
				
			||||||
  </ItemGroup>
 | 
					  </ItemGroup>
 | 
				
			||||||
  <ItemGroup>
 | 
					  <ItemGroup>
 | 
				
			||||||
    <None Include="..\..\res\rufus.ico">
 | 
					    <None Include="..\..\res\rufus.ico">
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3,7 +3,7 @@ TARGETTYPE=PROGRAM
 | 
				
			||||||
UMTYPE=windows
 | 
					UMTYPE=windows
 | 
				
			||||||
UMENTRY=winmain
 | 
					UMENTRY=winmain
 | 
				
			||||||
 | 
					
 | 
				
			||||||
INCLUDES=$(DDK_INC_PATH);.\ms-sys\inc;.\syslinux\libfat;.\syslinux\libinstaller;.\msvc-missing;.\libcdio;.\getopt;.\bled
 | 
					INCLUDES=$(DDK_INC_PATH);.\ms-sys\inc;.\syslinux\libfat;.\syslinux\libinstaller;.\syslinux\win;.\msvc-missing;.\libcdio;.\getopt;.\bled
 | 
				
			||||||
C_DEFINES = $(C_DEFINES) /DDDKBUILD /DUNICODE /D_UNICODE /DRUFUS_LOC /DISOLATION_AWARE_ENABLED
 | 
					C_DEFINES = $(C_DEFINES) /DDDKBUILD /DUNICODE /D_UNICODE /DRUFUS_LOC /DISOLATION_AWARE_ENABLED
 | 
				
			||||||
 | 
					
 | 
				
			||||||
!IFNDEF MSC_WARNING_LEVEL
 | 
					!IFNDEF MSC_WARNING_LEVEL
 | 
				
			||||||
| 
						 | 
					@ -25,6 +25,7 @@ TARGETLIBS=$(SDK_LIB_PATH)\kernel32.lib \
 | 
				
			||||||
           .\ms-sys\ms-sys.lib \
 | 
					           .\ms-sys\ms-sys.lib \
 | 
				
			||||||
           .\syslinux\libfat\libfat.lib \
 | 
					           .\syslinux\libfat\libfat.lib \
 | 
				
			||||||
           .\syslinux\libinstaller\libinstaller.lib \
 | 
					           .\syslinux\libinstaller\libinstaller.lib \
 | 
				
			||||||
 | 
					           .\syslinux\win\win.lib \
 | 
				
			||||||
           .\libcdio\iso9660\iso9660.lib \
 | 
					           .\libcdio\iso9660\iso9660.lib \
 | 
				
			||||||
           .\libcdio\udf\udf.lib \
 | 
					           .\libcdio\udf\udf.lib \
 | 
				
			||||||
           .\libcdio\driver\driver.lib \
 | 
					           .\libcdio\driver\driver.lib \
 | 
				
			||||||
| 
						 | 
					@ -35,6 +36,7 @@ SXS_APPLICATION_MANIFEST=..\rufus.manifest
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SOURCES=badblocks.c      \
 | 
					SOURCES=badblocks.c      \
 | 
				
			||||||
        checksum.c       \
 | 
					        checksum.c       \
 | 
				
			||||||
 | 
					        dev.c            \
 | 
				
			||||||
        dos.c            \
 | 
					        dos.c            \
 | 
				
			||||||
        dos_locale.c     \
 | 
					        dos_locale.c     \
 | 
				
			||||||
        drive.c          \
 | 
					        drive.c          \
 | 
				
			||||||
| 
						 | 
					@ -51,6 +53,5 @@ SOURCES=badblocks.c      \
 | 
				
			||||||
        stdio.c          \
 | 
					        stdio.c          \
 | 
				
			||||||
        stdlg.c          \
 | 
					        stdlg.c          \
 | 
				
			||||||
        syslinux.c       \
 | 
					        syslinux.c       \
 | 
				
			||||||
        usb.c            \
 | 
					 | 
				
			||||||
        vhd.c            \
 | 
					        vhd.c            \
 | 
				
			||||||
        rufus.rc
 | 
					        rufus.rc
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,4 +1,4 @@
 | 
				
			||||||
SUBDIRS = bled ms-sys syslinux/libfat syslinux/libinstaller libcdio/iso9660 libcdio/udf libcdio/driver ../res/localization
 | 
					SUBDIRS = bled ms-sys syslinux/libfat syslinux/libinstaller syslinux/win libcdio/iso9660 libcdio/udf libcdio/driver ../res/localization
 | 
				
			||||||
 | 
					
 | 
				
			||||||
noinst_PROGRAMS = rufus
 | 
					noinst_PROGRAMS = rufus
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -10,9 +10,9 @@ AM_V_WINDRES   = $(AM_V_WINDRES_$(V))
 | 
				
			||||||
%_rc.o: %.rc ../res/localization/embedded.loc
 | 
					%_rc.o: %.rc ../res/localization/embedded.loc
 | 
				
			||||||
	$(AM_V_WINDRES) $(AM_RCFLAGS) -i $< -o $@
 | 
						$(AM_V_WINDRES) $(AM_RCFLAGS) -i $< -o $@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
rufus_SOURCES = badblocks.c checksum.c dos.c dos_locale.c drive.c format.c icon.c iso.c localization.c net.c parser.c \
 | 
					rufus_SOURCES = badblocks.c checksum.c dev.c dos.c dos_locale.c drive.c format.c icon.c iso.c localization.c \
 | 
				
			||||||
	pki.c rufus.c smart.c stdfn.c stdio.c stdlg.c syslinux.c usb.c vhd.c
 | 
						net.c parser.c pki.c rufus.c smart.c stdfn.c stdio.c stdlg.c syslinux.c vhd.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./syslinux/win -I./libcdio $(AM_CFLAGS)
 | 
				
			||||||
rufus_LDFLAGS = $(AM_LDFLAGS) -mwindows
 | 
					rufus_LDFLAGS = $(AM_LDFLAGS) -mwindows
 | 
				
			||||||
rufus_LDADD = rufus_rc.o bled/libbled.a ms-sys/libmssys.a syslinux/libfat/libfat.a syslinux/libinstaller/libinstaller.a \
 | 
					rufus_LDADD = rufus_rc.o bled/libbled.a ms-sys/libmssys.a syslinux/libfat/libfat.a syslinux/libinstaller/libinstaller.a syslinux/win/libwin.a \
 | 
				
			||||||
	libcdio/iso9660/libiso9660.a libcdio/udf/libudf.a libcdio/driver/libdriver.a -lsetupapi -lole32 -lgdi32 -lwininet -lshlwapi -lcrypt32 -lwintrust
 | 
						libcdio/iso9660/libiso9660.a libcdio/udf/libudf.a libcdio/driver/libdriver.a -lsetupapi -lole32 -lgdi32 -lwininet -lshlwapi -lcrypt32 -lwintrust -lcomdlg32 -luuid
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -88,20 +88,20 @@ CONFIG_CLEAN_FILES =
 | 
				
			||||||
CONFIG_CLEAN_VPATH_FILES =
 | 
					CONFIG_CLEAN_VPATH_FILES =
 | 
				
			||||||
PROGRAMS = $(noinst_PROGRAMS)
 | 
					PROGRAMS = $(noinst_PROGRAMS)
 | 
				
			||||||
am_rufus_OBJECTS = rufus-badblocks.$(OBJEXT) rufus-checksum.$(OBJEXT) \
 | 
					am_rufus_OBJECTS = rufus-badblocks.$(OBJEXT) rufus-checksum.$(OBJEXT) \
 | 
				
			||||||
	rufus-dos.$(OBJEXT) rufus-dos_locale.$(OBJEXT) \
 | 
						rufus-dev.$(OBJEXT) rufus-dos.$(OBJEXT) \
 | 
				
			||||||
	rufus-drive.$(OBJEXT) rufus-format.$(OBJEXT) \
 | 
						rufus-dos_locale.$(OBJEXT) rufus-drive.$(OBJEXT) \
 | 
				
			||||||
	rufus-icon.$(OBJEXT) rufus-iso.$(OBJEXT) \
 | 
						rufus-format.$(OBJEXT) rufus-icon.$(OBJEXT) \
 | 
				
			||||||
	rufus-localization.$(OBJEXT) rufus-net.$(OBJEXT) \
 | 
						rufus-iso.$(OBJEXT) rufus-localization.$(OBJEXT) \
 | 
				
			||||||
	rufus-parser.$(OBJEXT) rufus-pki.$(OBJEXT) \
 | 
						rufus-net.$(OBJEXT) rufus-parser.$(OBJEXT) rufus-pki.$(OBJEXT) \
 | 
				
			||||||
	rufus-rufus.$(OBJEXT) rufus-smart.$(OBJEXT) \
 | 
						rufus-rufus.$(OBJEXT) rufus-smart.$(OBJEXT) \
 | 
				
			||||||
	rufus-stdfn.$(OBJEXT) rufus-stdio.$(OBJEXT) \
 | 
						rufus-stdfn.$(OBJEXT) rufus-stdio.$(OBJEXT) \
 | 
				
			||||||
	rufus-stdlg.$(OBJEXT) rufus-syslinux.$(OBJEXT) \
 | 
						rufus-stdlg.$(OBJEXT) rufus-syslinux.$(OBJEXT) \
 | 
				
			||||||
	rufus-usb.$(OBJEXT) rufus-vhd.$(OBJEXT)
 | 
						rufus-vhd.$(OBJEXT)
 | 
				
			||||||
rufus_OBJECTS = $(am_rufus_OBJECTS)
 | 
					rufus_OBJECTS = $(am_rufus_OBJECTS)
 | 
				
			||||||
rufus_DEPENDENCIES = rufus_rc.o bled/libbled.a ms-sys/libmssys.a \
 | 
					rufus_DEPENDENCIES = rufus_rc.o bled/libbled.a ms-sys/libmssys.a \
 | 
				
			||||||
	syslinux/libfat/libfat.a syslinux/libinstaller/libinstaller.a \
 | 
						syslinux/libfat/libfat.a syslinux/libinstaller/libinstaller.a \
 | 
				
			||||||
	libcdio/iso9660/libiso9660.a libcdio/udf/libudf.a \
 | 
						syslinux/win/libwin.a libcdio/iso9660/libiso9660.a \
 | 
				
			||||||
	libcdio/driver/libdriver.a
 | 
						libcdio/udf/libudf.a libcdio/driver/libdriver.a
 | 
				
			||||||
rufus_LINK = $(CCLD) $(rufus_CFLAGS) $(CFLAGS) $(rufus_LDFLAGS) \
 | 
					rufus_LINK = $(CCLD) $(rufus_CFLAGS) $(CFLAGS) $(rufus_LDFLAGS) \
 | 
				
			||||||
	$(LDFLAGS) -o $@
 | 
						$(LDFLAGS) -o $@
 | 
				
			||||||
AM_V_P = $(am__v_P_@AM_V@)
 | 
					AM_V_P = $(am__v_P_@AM_V@)
 | 
				
			||||||
| 
						 | 
					@ -265,18 +265,18 @@ target_alias = @target_alias@
 | 
				
			||||||
top_build_prefix = @top_build_prefix@
 | 
					top_build_prefix = @top_build_prefix@
 | 
				
			||||||
top_builddir = @top_builddir@
 | 
					top_builddir = @top_builddir@
 | 
				
			||||||
top_srcdir = @top_srcdir@
 | 
					top_srcdir = @top_srcdir@
 | 
				
			||||||
SUBDIRS = bled ms-sys syslinux/libfat syslinux/libinstaller libcdio/iso9660 libcdio/udf libcdio/driver ../res/localization
 | 
					SUBDIRS = bled ms-sys syslinux/libfat syslinux/libinstaller syslinux/win libcdio/iso9660 libcdio/udf libcdio/driver ../res/localization
 | 
				
			||||||
AM_V_WINDRES_0 = @echo "  RC     $@";$(WINDRES)
 | 
					AM_V_WINDRES_0 = @echo "  RC     $@";$(WINDRES)
 | 
				
			||||||
AM_V_WINDRES_1 = $(WINDRES)
 | 
					AM_V_WINDRES_1 = $(WINDRES)
 | 
				
			||||||
AM_V_WINDRES_ = $(AM_V_WINDRES_$(AM_DEFAULT_VERBOSITY))
 | 
					AM_V_WINDRES_ = $(AM_V_WINDRES_$(AM_DEFAULT_VERBOSITY))
 | 
				
			||||||
AM_V_WINDRES = $(AM_V_WINDRES_$(V))
 | 
					AM_V_WINDRES = $(AM_V_WINDRES_$(V))
 | 
				
			||||||
rufus_SOURCES = badblocks.c checksum.c dos.c dos_locale.c drive.c format.c icon.c iso.c localization.c net.c parser.c \
 | 
					rufus_SOURCES = badblocks.c checksum.c dev.c dos.c dos_locale.c drive.c format.c icon.c iso.c localization.c \
 | 
				
			||||||
	pki.c rufus.c smart.c stdfn.c stdio.c stdlg.c syslinux.c usb.c vhd.c
 | 
						net.c parser.c pki.c rufus.c smart.c stdfn.c stdio.c stdlg.c syslinux.c vhd.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./syslinux/win -I./libcdio $(AM_CFLAGS)
 | 
				
			||||||
rufus_LDFLAGS = $(AM_LDFLAGS) -mwindows
 | 
					rufus_LDFLAGS = $(AM_LDFLAGS) -mwindows
 | 
				
			||||||
rufus_LDADD = rufus_rc.o bled/libbled.a ms-sys/libmssys.a syslinux/libfat/libfat.a syslinux/libinstaller/libinstaller.a \
 | 
					rufus_LDADD = rufus_rc.o bled/libbled.a ms-sys/libmssys.a syslinux/libfat/libfat.a syslinux/libinstaller/libinstaller.a syslinux/win/libwin.a \
 | 
				
			||||||
	libcdio/iso9660/libiso9660.a libcdio/udf/libudf.a libcdio/driver/libdriver.a -lsetupapi -lole32 -lgdi32 -lwininet -lshlwapi -lcrypt32 -lwintrust
 | 
						libcdio/iso9660/libiso9660.a libcdio/udf/libudf.a libcdio/driver/libdriver.a -lsetupapi -lole32 -lgdi32 -lwininet -lshlwapi -lcrypt32 -lwintrust -lcomdlg32 -luuid
 | 
				
			||||||
 | 
					
 | 
				
			||||||
all: all-recursive
 | 
					all: all-recursive
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -344,6 +344,12 @@ rufus-checksum.o: checksum.c
 | 
				
			||||||
rufus-checksum.obj: checksum.c
 | 
					rufus-checksum.obj: checksum.c
 | 
				
			||||||
	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rufus_CFLAGS) $(CFLAGS) -c -o rufus-checksum.obj `if test -f 'checksum.c'; then $(CYGPATH_W) 'checksum.c'; else $(CYGPATH_W) '$(srcdir)/checksum.c'; fi`
 | 
						$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rufus_CFLAGS) $(CFLAGS) -c -o rufus-checksum.obj `if test -f 'checksum.c'; then $(CYGPATH_W) 'checksum.c'; else $(CYGPATH_W) '$(srcdir)/checksum.c'; fi`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					rufus-dev.o: dev.c
 | 
				
			||||||
 | 
						$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rufus_CFLAGS) $(CFLAGS) -c -o rufus-dev.o `test -f 'dev.c' || echo '$(srcdir)/'`dev.c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					rufus-dev.obj: dev.c
 | 
				
			||||||
 | 
						$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rufus_CFLAGS) $(CFLAGS) -c -o rufus-dev.obj `if test -f 'dev.c'; then $(CYGPATH_W) 'dev.c'; else $(CYGPATH_W) '$(srcdir)/dev.c'; fi`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
rufus-dos.o: dos.c
 | 
					rufus-dos.o: dos.c
 | 
				
			||||||
	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rufus_CFLAGS) $(CFLAGS) -c -o rufus-dos.o `test -f 'dos.c' || echo '$(srcdir)/'`dos.c
 | 
						$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rufus_CFLAGS) $(CFLAGS) -c -o rufus-dos.o `test -f 'dos.c' || echo '$(srcdir)/'`dos.c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -440,12 +446,6 @@ rufus-syslinux.o: syslinux.c
 | 
				
			||||||
rufus-syslinux.obj: syslinux.c
 | 
					rufus-syslinux.obj: syslinux.c
 | 
				
			||||||
	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rufus_CFLAGS) $(CFLAGS) -c -o rufus-syslinux.obj `if test -f 'syslinux.c'; then $(CYGPATH_W) 'syslinux.c'; else $(CYGPATH_W) '$(srcdir)/syslinux.c'; fi`
 | 
						$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rufus_CFLAGS) $(CFLAGS) -c -o rufus-syslinux.obj `if test -f 'syslinux.c'; then $(CYGPATH_W) 'syslinux.c'; else $(CYGPATH_W) '$(srcdir)/syslinux.c'; fi`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
rufus-usb.o: usb.c
 | 
					 | 
				
			||||||
	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rufus_CFLAGS) $(CFLAGS) -c -o rufus-usb.o `test -f 'usb.c' || echo '$(srcdir)/'`usb.c
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
rufus-usb.obj: usb.c
 | 
					 | 
				
			||||||
	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rufus_CFLAGS) $(CFLAGS) -c -o rufus-usb.obj `if test -f 'usb.c'; then $(CYGPATH_W) 'usb.c'; else $(CYGPATH_W) '$(srcdir)/usb.c'; fi`
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
rufus-vhd.o: vhd.c
 | 
					rufus-vhd.o: vhd.c
 | 
				
			||||||
	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rufus_CFLAGS) $(CFLAGS) -c -o rufus-vhd.o `test -f 'vhd.c' || echo '$(srcdir)/'`vhd.c
 | 
						$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rufus_CFLAGS) $(CFLAGS) -c -o rufus-vhd.o `test -f 'vhd.c' || echo '$(srcdir)/'`vhd.c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -7,7 +7,7 @@
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * Copyright 1995, 1996, 1997, 1998, 1999 by Theodore Ts'o
 | 
					 * Copyright 1995, 1996, 1997, 1998, 1999 by Theodore Ts'o
 | 
				
			||||||
 * Copyright 1999 by David Beattie
 | 
					 * Copyright 1999 by David Beattie
 | 
				
			||||||
 * Copyright 2011-2015 by Pete Batard
 | 
					 * Copyright 2011-2016 by Pete Batard
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * This file is based on the minix file system programs fsck and mkfs
 | 
					 * This file is based on the minix file system programs fsck and mkfs
 | 
				
			||||||
 * written and copyrighted by Linus Torvalds <Linus.Torvalds@cs.helsinki.fi>
 | 
					 * written and copyrighted by Linus Torvalds <Linus.Torvalds@cs.helsinki.fi>
 | 
				
			||||||
| 
						 | 
					@ -42,11 +42,12 @@
 | 
				
			||||||
#include <stdint.h>
 | 
					#include <stdint.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "rufus.h"
 | 
					#include "rufus.h"
 | 
				
			||||||
 | 
					#include "resource.h"
 | 
				
			||||||
 | 
					#include "msapi_utf8.h"
 | 
				
			||||||
 | 
					#include "localization.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "badblocks.h"
 | 
					#include "badblocks.h"
 | 
				
			||||||
#include "file.h"
 | 
					#include "file.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";
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										637
									
								
								src/checksum.c
									
										
									
									
									
								
							
							
						
						
									
										637
									
								
								src/checksum.c
									
										
									
									
									
								
							| 
						 | 
					@ -1,10 +1,10 @@
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Rufus: The Reliable USB Formatting Utility
 | 
					 * Rufus: The Reliable USB Formatting Utility
 | 
				
			||||||
 * Message-Digest algorithms (sha1sum, md5sum)
 | 
					 * Message-Digest algorithms (md5sum, sha1sum, sha256sum)
 | 
				
			||||||
 * Copyright © 1998-2001 Free Software Foundation, Inc.
 | 
					 * Copyright © 1998-2001 Free Software Foundation, Inc.
 | 
				
			||||||
 * Copyright © 2004 g10 Code GmbH
 | 
					 * Copyright © 2004 g10 Code GmbH
 | 
				
			||||||
 * Copyright © 2006-2012 Brad Conte <brad@bradconte.com>
 | 
					 * Copyright © 2002-2015 Wei Dai & Igor Pavlov
 | 
				
			||||||
 * Copyright © 2015 Pete Batard <pete@akeo.ie>
 | 
					 * Copyright © 2015-2016 Pete Batard <pete@akeo.ie>
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * This program is free software: you can redistribute it and/or modify
 | 
					 * This program is free software: you can redistribute it and/or modify
 | 
				
			||||||
 * it under the terms of the GNU General Public License as published by
 | 
					 * it under the terms of the GNU General Public License as published by
 | 
				
			||||||
| 
						 | 
					@ -23,8 +23,7 @@
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * SHA-1 code taken from GnuPG, as per copyrights above.
 | 
					 * SHA-1 code taken from GnuPG, as per copyrights above.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * SHA-256 code modified from crypto-algorithms by Brad Conte:
 | 
					 * SHA-256 taken from 7-zip's Sha256.c, itself based on Crypto++ - Public Domain
 | 
				
			||||||
 * https://github.com/B-Con/crypto-algorithms - Public Domain
 | 
					 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * MD5 code from various public domain sources sharing the following
 | 
					 * MD5 code from various public domain sources sharing the following
 | 
				
			||||||
 * copyright declaration:
 | 
					 * copyright declaration:
 | 
				
			||||||
| 
						 | 
					@ -51,47 +50,35 @@
 | 
				
			||||||
#include <inttypes.h>
 | 
					#include <inttypes.h>
 | 
				
			||||||
#include <errno.h>
 | 
					#include <errno.h>
 | 
				
			||||||
#include <windowsx.h>
 | 
					#include <windowsx.h>
 | 
				
			||||||
#include "msapi_utf8.h"
 | 
					
 | 
				
			||||||
#include "rufus.h"
 | 
					#include "rufus.h"
 | 
				
			||||||
 | 
					#include "missing.h"
 | 
				
			||||||
#include "resource.h"
 | 
					#include "resource.h"
 | 
				
			||||||
 | 
					#include "msapi_utf8.h"
 | 
				
			||||||
#include "localization.h"
 | 
					#include "localization.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#undef BIG_ENDIAN_HOST
 | 
					#undef BIG_ENDIAN_HOST
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define BUFFER_SIZE     (64*KB)
 | 
				
			||||||
 | 
					#define WAIT_TIME       5000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Globals */
 | 
					/* Globals */
 | 
				
			||||||
char sha1str[41], sha256str[65], md5str[33];
 | 
					char sum_str[NUM_CHECKSUMS][65];
 | 
				
			||||||
 | 
					uint32_t bufnum, sum_count[NUM_CHECKSUMS] = { 16, 20, 32 };
 | 
				
			||||||
 | 
					HANDLE data_ready[NUM_CHECKSUMS], thread_ready[NUM_CHECKSUMS];
 | 
				
			||||||
 | 
					DWORD read_size[2];
 | 
				
			||||||
 | 
					char ALIGNED(64) buffer[2][BUFFER_SIZE];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(__GNUC__)
 | 
					/*
 | 
				
			||||||
#define ALIGNED(m) __attribute__ ((__aligned__(m)))
 | 
					 * Rotate 32 bit integers by n bytes.
 | 
				
			||||||
#elif defined(_MSC_VER)
 | 
					 * Don't bother trying to hand-optimize those, as the
 | 
				
			||||||
#define ALIGNED(m) __declspec(align(m))
 | 
					 * compiler usually does a pretty good job at that.
 | 
				
			||||||
#endif
 | 
					 */
 | 
				
			||||||
 | 
					#define ROL(a,b) (((a) << (b)) | ((a) >> (32-(b))))
 | 
				
			||||||
 | 
					#define ROR(a,b) (((a) >> (b)) | ((a) << (32-(b))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Rotate a 32 bit integer by n bytes */
 | 
					/* SHA-256 constants */
 | 
				
			||||||
#if defined(__GNUC__) && defined(__i386__)
 | 
					static const uint32_t K[64] = {
 | 
				
			||||||
static inline uint32_t rol(uint32_t x, int n)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	__asm__("roll %%cl,%0"
 | 
					 | 
				
			||||||
		:"=r" (x)
 | 
					 | 
				
			||||||
		:"0" (x),"c" (n));
 | 
					 | 
				
			||||||
	return x;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
#elif defined(_MSC_VER) && (_M_IX86 >= 300)
 | 
					 | 
				
			||||||
static __inline uint32_t rol(uint32_t x, int n)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	__asm {
 | 
					 | 
				
			||||||
		mov eax, x
 | 
					 | 
				
			||||||
		mov ecx, n
 | 
					 | 
				
			||||||
		rol eax, cl
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	/* returns with result in EAX */
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
#define rol(x,n) ( ((x) << (n)) | ((x) >> (32-(n))) )
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// For SHA-256
 | 
					 | 
				
			||||||
static const uint32_t k[64] = {
 | 
					 | 
				
			||||||
	0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5,0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5,
 | 
						0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5,0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5,
 | 
				
			||||||
	0xd807aa98,0x12835b01,0x243185be,0x550c7dc3,0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174,
 | 
						0xd807aa98,0x12835b01,0x243185be,0x550c7dc3,0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174,
 | 
				
			||||||
	0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc,0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da,
 | 
						0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc,0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da,
 | 
				
			||||||
| 
						 | 
					@ -102,27 +89,26 @@ static const uint32_t k[64] = {
 | 
				
			||||||
	0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208,0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2
 | 
						0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208,0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct ALIGNED(8) {
 | 
					/*
 | 
				
			||||||
	unsigned char buf[64];
 | 
					 * For convenience, we use a common context for all the checksums algorithms,
 | 
				
			||||||
	uint32_t state[5];
 | 
					 * which means some elements may be unused...
 | 
				
			||||||
	uint32_t count;
 | 
					 */
 | 
				
			||||||
	uint64_t nblocks;
 | 
					typedef struct ALIGNED(64) {
 | 
				
			||||||
} SHA1_CONTEXT;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef struct ALIGNED(8) {
 | 
					 | 
				
			||||||
	unsigned char buf[64];
 | 
						unsigned char buf[64];
 | 
				
			||||||
	uint32_t state[8];
 | 
						uint32_t state[8];
 | 
				
			||||||
	uint32_t datalen;
 | 
						uint64_t bytecount;
 | 
				
			||||||
	uint64_t bitlen;
 | 
					} SUM_CONTEXT;
 | 
				
			||||||
} SHA256_CONTEXT;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct ALIGNED(8) {
 | 
					static void md5_init(SUM_CONTEXT *ctx)
 | 
				
			||||||
	unsigned char buf[64];
 | 
					{
 | 
				
			||||||
	uint32_t state[4];
 | 
						memset(ctx, 0, sizeof(*ctx));
 | 
				
			||||||
	uint64_t bitcount;
 | 
						ctx->state[0] = 0x67452301;
 | 
				
			||||||
} MD5_CONTEXT;
 | 
						ctx->state[1] = 0xefcdab89;
 | 
				
			||||||
 | 
						ctx->state[2] = 0x98badcfe;
 | 
				
			||||||
 | 
						ctx->state[3] = 0x10325476;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void sha1_init(SHA1_CONTEXT *ctx)
 | 
					static void sha1_init(SUM_CONTEXT *ctx)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	memset(ctx, 0, sizeof(*ctx));
 | 
						memset(ctx, 0, sizeof(*ctx));
 | 
				
			||||||
	ctx->state[0] = 0x67452301;
 | 
						ctx->state[0] = 0x67452301;
 | 
				
			||||||
| 
						 | 
					@ -132,7 +118,7 @@ static void sha1_init(SHA1_CONTEXT *ctx)
 | 
				
			||||||
	ctx->state[4] = 0xc3d2e1f0;
 | 
						ctx->state[4] = 0xc3d2e1f0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void sha256_init(SHA256_CONTEXT *ctx)
 | 
					static void sha256_init(SUM_CONTEXT *ctx)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	memset(ctx, 0, sizeof(*ctx));
 | 
						memset(ctx, 0, sizeof(*ctx));
 | 
				
			||||||
	ctx->state[0] = 0x6a09e667;
 | 
						ctx->state[0] = 0x6a09e667;
 | 
				
			||||||
| 
						 | 
					@ -145,20 +131,10 @@ static void sha256_init(SHA256_CONTEXT *ctx)
 | 
				
			||||||
	ctx->state[7] = 0x5be0cd19;
 | 
						ctx->state[7] = 0x5be0cd19;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void md5_init(MD5_CONTEXT *ctx)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	memset(ctx, 0, sizeof(*ctx));
 | 
					 | 
				
			||||||
	ctx->state[0] = 0x67452301;
 | 
					 | 
				
			||||||
	ctx->state[1] = 0xefcdab89;
 | 
					 | 
				
			||||||
	ctx->state[2] = 0x98badcfe;
 | 
					 | 
				
			||||||
	ctx->state[3] = 0x10325476;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Transform the message X which consists of 16 32-bit-words (SHA-1) */
 | 
					/* Transform the message X which consists of 16 32-bit-words (SHA-1) */
 | 
				
			||||||
static void sha1_transform(SHA1_CONTEXT *ctx, const unsigned char *data)
 | 
					static void sha1_transform(SUM_CONTEXT *ctx, const unsigned char *data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	uint32_t a, b, c, d, e, tm;
 | 
						uint32_t a, b, c, d, e, tm, x[16];
 | 
				
			||||||
	uint32_t x[16];
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* get values from the chaining vars */
 | 
						/* get values from the chaining vars */
 | 
				
			||||||
	a = ctx->state[0];
 | 
						a = ctx->state[0];
 | 
				
			||||||
| 
						 | 
					@ -171,13 +147,13 @@ static void sha1_transform(SHA1_CONTEXT *ctx, const unsigned char *data)
 | 
				
			||||||
	memcpy(x, data, sizeof(x));
 | 
						memcpy(x, data, sizeof(x));
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		int i;
 | 
							unsigned k;
 | 
				
			||||||
		unsigned char *p2;
 | 
							for (k = 0; k < 16; k += 4) {
 | 
				
			||||||
		for (i = 0, p2 = (unsigned char*)x; i < 16; i++, p2 += 4) {
 | 
								const unsigned char *p2 = data + k * 4;
 | 
				
			||||||
			p2[3] = *data++;
 | 
								x[k] = read_swap32(p2);
 | 
				
			||||||
			p2[2] = *data++;
 | 
								x[k + 1] = read_swap32(p2 + 4);
 | 
				
			||||||
			p2[1] = *data++;
 | 
								x[k + 2] = read_swap32(p2 + 8);
 | 
				
			||||||
			p2[0] = *data++;
 | 
								x[k + 3] = read_swap32(p2 + 12);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -191,10 +167,10 @@ static void sha1_transform(SHA1_CONTEXT *ctx, const unsigned char *data)
 | 
				
			||||||
#define F3(x,y,z)   ( ( x & y ) | ( z & ( x | y ) ) )
 | 
					#define F3(x,y,z)   ( ( x & y ) | ( z & ( x | y ) ) )
 | 
				
			||||||
#define F4(x,y,z)   ( x ^ y ^ z )
 | 
					#define F4(x,y,z)   ( x ^ y ^ z )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define M(i) ( tm = x[i&0x0f] ^ x[(i-14)&0x0f] ^ x[(i-8)&0x0f] ^ x[(i-3)&0x0f], (x[i&0x0f] = rol(tm,1)) )
 | 
					#define M(i) ( tm = x[i&0x0f] ^ x[(i-14)&0x0f] ^ x[(i-8)&0x0f] ^ x[(i-3)&0x0f], (x[i&0x0f] = ROL(tm,1)) )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SHA1STEP(a,b,c,d,e,f,k,m) do { e += rol(a, 5) + f(b, c, d) + k + m; \
 | 
					#define SHA1STEP(a,b,c,d,e,f,k,m) do { e += ROL(a, 5) + f(b, c, d) + k + m; \
 | 
				
			||||||
                                       b = rol(b, 30); } while(0)
 | 
					                                       b = ROL(b, 30); } while(0)
 | 
				
			||||||
	SHA1STEP(a, b, c, d, e, F1, K1, x[0]);
 | 
						SHA1STEP(a, b, c, d, e, F1, K1, x[0]);
 | 
				
			||||||
	SHA1STEP(e, a, b, c, d, F1, K1, x[1]);
 | 
						SHA1STEP(e, a, b, c, d, F1, K1, x[1]);
 | 
				
			||||||
	SHA1STEP(d, e, a, b, c, F1, K1, x[2]);
 | 
						SHA1STEP(d, e, a, b, c, F1, K1, x[2]);
 | 
				
			||||||
| 
						 | 
					@ -289,9 +265,10 @@ static void sha1_transform(SHA1_CONTEXT *ctx, const unsigned char *data)
 | 
				
			||||||
	ctx->state[4] += e;
 | 
						ctx->state[4] += e;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void sha256_transform(SHA256_CONTEXT *ctx, const unsigned char *data)
 | 
					/* Transform the message X which consists of 16 32-bit-words (SHA-256) */
 | 
				
			||||||
 | 
					static __inline void sha256_transform(SUM_CONTEXT *ctx, const unsigned char *data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	uint32_t a, b, c, d, e, f, g, h, i, t1, t2, m[64];
 | 
						uint32_t a, b, c, d, e, f, g, h, j, x[16];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	a = ctx->state[0];
 | 
						a = ctx->state[0];
 | 
				
			||||||
	b = ctx->state[1];
 | 
						b = ctx->state[1];
 | 
				
			||||||
| 
						 | 
					@ -302,47 +279,54 @@ static void sha256_transform(SHA256_CONTEXT *ctx, const unsigned char *data)
 | 
				
			||||||
	g = ctx->state[6];
 | 
						g = ctx->state[6];
 | 
				
			||||||
	h = ctx->state[7];
 | 
						h = ctx->state[7];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define ROTLEFT(a,b) (((a) << (b)) | ((a) >> (32-(b))))
 | 
					#define CH(x,y,z) ((z) ^ ((x) & ((y) ^ (z))))
 | 
				
			||||||
#define ROTRIGHT(a,b) (((a) >> (b)) | ((a) << (32-(b))))
 | 
					#define MAJ(x,y,z) (((x) & (y)) | ((z) & ((x) | (y))))
 | 
				
			||||||
 | 
					// Nesting the ROR allows for single register compiler optimizations
 | 
				
			||||||
#define CH(x,y,z) (((x) & (y)) ^ (~(x) & (z)))
 | 
					#define S0(x) (ROR(ROR(ROR(x,9)^(x),11)^(x),2))
 | 
				
			||||||
#define MAJ(x,y,z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))
 | 
					#define S1(x) (ROR(ROR(ROR(x,14)^(x),5)^(x),6))
 | 
				
			||||||
#define EP0(x) (ROTRIGHT(x,2) ^ ROTRIGHT(x,13) ^ ROTRIGHT(x,22))
 | 
					#define s0(x) (ROR(ROR(x,11)^(x),7)^((x)>>3))
 | 
				
			||||||
#define EP1(x) (ROTRIGHT(x,6) ^ ROTRIGHT(x,11) ^ ROTRIGHT(x,25))
 | 
					#define s1(x) (ROR(ROR(x,2)^(x),17)^((x)>>10))
 | 
				
			||||||
#define SIG0(x) (ROTRIGHT(x,7) ^ ROTRIGHT(x,18) ^ ((x) >> 3))
 | 
					#define BLK0(i) (x[i])
 | 
				
			||||||
#define SIG1(x) (ROTRIGHT(x,17) ^ ROTRIGHT(x,19) ^ ((x) >> 10))
 | 
					#define BLK2(i) (x[i] += s1(x[((i)-2)&15]) + x[((i)-7)&15] + s0(x[((i)-15)&15]))
 | 
				
			||||||
 | 
					#define R(a,b,c,d,e,f,g,h,i) \
 | 
				
			||||||
 | 
						h += S1(e) + CH(e,f,g) + K[(i)+(j)] + (j ? BLK2(i) : BLK0(i)); \
 | 
				
			||||||
 | 
						d += h; \
 | 
				
			||||||
 | 
						h += S0(a) + MAJ(a, b, c)
 | 
				
			||||||
 | 
					#define RX_8(i) \
 | 
				
			||||||
 | 
						R(a,b,c,d,e,f,g,h, i); \
 | 
				
			||||||
 | 
						R(h,a,b,c,d,e,f,g, i+1); \
 | 
				
			||||||
 | 
						R(g,h,a,b,c,d,e,f, i+2); \
 | 
				
			||||||
 | 
						R(f,g,h,a,b,c,d,e, i+3); \
 | 
				
			||||||
 | 
						R(e,f,g,h,a,b,c,d, i+4); \
 | 
				
			||||||
 | 
						R(d,e,f,g,h,a,b,c, i+5); \
 | 
				
			||||||
 | 
						R(c,d,e,f,g,h,a,b, i+6); \
 | 
				
			||||||
 | 
						R(b,c,d,e,f,g,h,a, i+7)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef BIG_ENDIAN_HOST
 | 
					#ifdef BIG_ENDIAN_HOST
 | 
				
			||||||
	memcpy(m, data, sizeof(m));
 | 
						memcpy(x, data, sizeof(x));
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		unsigned char *p2;
 | 
							unsigned k;
 | 
				
			||||||
		for (i = 0, p2 = (unsigned char*)m; i < 16; i++, p2 += 4) {
 | 
							for (k = 0; k < 16; k += 4) {
 | 
				
			||||||
			p2[3] = *data++;
 | 
								const unsigned char *p2 = data + k * 4;
 | 
				
			||||||
			p2[2] = *data++;
 | 
								x[k] = read_swap32(p2);
 | 
				
			||||||
			p2[1] = *data++;
 | 
								x[k + 1] = read_swap32(p2 + 4);
 | 
				
			||||||
			p2[0] = *data++;
 | 
								x[k + 2] = read_swap32(p2 + 8);
 | 
				
			||||||
 | 
								x[k + 3] = read_swap32(p2 + 12);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (i = 16; i < 64; ++i)
 | 
						for (j = 0; j < 64; j += 16) {
 | 
				
			||||||
		m[i] = SIG1(m[i - 2]) + m[i - 7] + SIG0(m[i - 15]) + m[i - 16];
 | 
							RX_8(0);
 | 
				
			||||||
 | 
							RX_8(8);
 | 
				
			||||||
	for (i = 0; i < 64; ++i) {
 | 
					 | 
				
			||||||
		t1 = h + EP1(e) + CH(e, f, g) + k[i] + m[i];
 | 
					 | 
				
			||||||
		t2 = EP0(a) + MAJ(a, b, c);
 | 
					 | 
				
			||||||
		h = g;
 | 
					 | 
				
			||||||
		g = f;
 | 
					 | 
				
			||||||
		f = e;
 | 
					 | 
				
			||||||
		e = d + t1;
 | 
					 | 
				
			||||||
		d = c;
 | 
					 | 
				
			||||||
		c = b;
 | 
					 | 
				
			||||||
		b = a;
 | 
					 | 
				
			||||||
		a = t1 + t2;
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#undef S0
 | 
				
			||||||
 | 
					#undef S1
 | 
				
			||||||
 | 
					#undef s0
 | 
				
			||||||
 | 
					#undef s1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ctx->state[0] += a;
 | 
						ctx->state[0] += a;
 | 
				
			||||||
	ctx->state[1] += b;
 | 
						ctx->state[1] += b;
 | 
				
			||||||
	ctx->state[2] += c;
 | 
						ctx->state[2] += c;
 | 
				
			||||||
| 
						 | 
					@ -354,29 +338,28 @@ static void sha256_transform(SHA256_CONTEXT *ctx, const unsigned char *data)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Transform the message X which consists of 16 32-bit-words (MD5) */
 | 
					/* Transform the message X which consists of 16 32-bit-words (MD5) */
 | 
				
			||||||
static void md5_transform(MD5_CONTEXT *ctx, const unsigned char *data)
 | 
					static void md5_transform(SUM_CONTEXT *ctx, const unsigned char *data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	uint32_t a, b, c, d;
 | 
						uint32_t a, b, c, d, x[16];
 | 
				
			||||||
	uint32_t x[16];
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	a = ctx->state[0];
 | 
						a = ctx->state[0];
 | 
				
			||||||
	b = ctx->state[1];
 | 
						b = ctx->state[1];
 | 
				
			||||||
	c = ctx->state[2];
 | 
						c = ctx->state[2];
 | 
				
			||||||
	d = ctx->state[3];
 | 
						d = ctx->state[3];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef BIG_ENDIAN_HOST
 | 
					#ifdef BIG_ENDIAN_HOST
 | 
				
			||||||
	memcpy(x, data, sizeof(x));
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		int i;
 | 
							unsigned k;
 | 
				
			||||||
		unsigned char *p;
 | 
							for (k = 0; k < 16; k += 4) {
 | 
				
			||||||
		for (i = 0, p = (unsigned char*)x; i < 16; i++, p += 4) {
 | 
								const unsigned char *p2 = data + k * 4;
 | 
				
			||||||
			p[3] = *data++;
 | 
								x[k] = read_swap32(p2);
 | 
				
			||||||
			p[2] = *data++;
 | 
								x[k + 1] = read_swap32(p2 + 4);
 | 
				
			||||||
			p[1] = *data++;
 | 
								x[k + 2] = read_swap32(p2 + 8);
 | 
				
			||||||
			p[0] = *data++;
 | 
								x[k + 3] = read_swap32(p2 + 12);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
						memcpy(x, data, sizeof(x));
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define F1(x, y, z) (z ^ (x & (y ^ z)))
 | 
					#define F1(x, y, z) (z ^ (x & (y ^ z)))
 | 
				
			||||||
| 
						 | 
					@ -468,58 +451,88 @@ static void md5_transform(MD5_CONTEXT *ctx, const unsigned char *data)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Update the message digest with the contents of the buffer (SHA-1) */
 | 
					/* Update the message digest with the contents of the buffer (SHA-1) */
 | 
				
			||||||
static void sha1_write(SHA1_CONTEXT *ctx, const unsigned char *buf, size_t len)
 | 
					static void sha1_write(SUM_CONTEXT *ctx, const unsigned char *buf, size_t len)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (ctx->count == 64) { /* flush the buffer */
 | 
						size_t t;
 | 
				
			||||||
		sha1_transform(ctx, ctx->buf);
 | 
					
 | 
				
			||||||
		ctx->count = 0;
 | 
						/* Update bytecount */
 | 
				
			||||||
		ctx->nblocks++;
 | 
						ctx->bytecount += len;
 | 
				
			||||||
	}
 | 
					
 | 
				
			||||||
	if (!buf)
 | 
						t = ctx->bytecount & 0x3f;
 | 
				
			||||||
		return;
 | 
					
 | 
				
			||||||
	if (ctx->count) {
 | 
						/* Handle any leading odd-sized chunks */
 | 
				
			||||||
		for (; len && ctx->count < 64; len--)
 | 
						if (t) {
 | 
				
			||||||
			ctx->buf[ctx->count++] = *buf++;
 | 
							unsigned char *p = ctx->buf + t;
 | 
				
			||||||
		sha1_write(ctx, NULL, 0);
 | 
					
 | 
				
			||||||
		if (!len)
 | 
							t = 64 - t;
 | 
				
			||||||
 | 
							if (len < t) {
 | 
				
			||||||
 | 
								memcpy(p, buf, len);
 | 
				
			||||||
			return;
 | 
								return;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							memcpy(p, buf, t);
 | 
				
			||||||
 | 
							sha1_transform(ctx, ctx->buf);
 | 
				
			||||||
 | 
							buf += t;
 | 
				
			||||||
 | 
							len -= t;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Process data in 64-byte chunks */
 | 
				
			||||||
	while (len >= 64) {
 | 
						while (len >= 64) {
 | 
				
			||||||
 | 
							PREFETCH64(buf + 64);
 | 
				
			||||||
		sha1_transform(ctx, buf);
 | 
							sha1_transform(ctx, buf);
 | 
				
			||||||
		ctx->count = 0;
 | 
					 | 
				
			||||||
		ctx->nblocks++;
 | 
					 | 
				
			||||||
		len -= 64;
 | 
					 | 
				
			||||||
		buf += 64;
 | 
							buf += 64;
 | 
				
			||||||
 | 
							len -= 64;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	for (; len && ctx->count < 64; len--)
 | 
					
 | 
				
			||||||
		ctx->buf[ctx->count++] = *buf++;
 | 
						/* Handle any remaining bytes of data. */
 | 
				
			||||||
 | 
						memcpy(ctx->buf, buf, len);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void sha256_write(SHA256_CONTEXT *ctx, const unsigned char *buf, size_t len)
 | 
					/* Update the message digest with the contents of the buffer (SHA-256) */
 | 
				
			||||||
 | 
					static void sha256_write(SUM_CONTEXT *ctx, const unsigned char *buf, size_t len)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	uint32_t i;
 | 
						size_t t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (i = 0; i < len; ++i) {
 | 
						/* Update bytecount */
 | 
				
			||||||
		ctx->buf[ctx->datalen] = buf[i];
 | 
						ctx->bytecount += len;
 | 
				
			||||||
		ctx->datalen++;
 | 
					
 | 
				
			||||||
		if (ctx->datalen == 64) {
 | 
						t = ctx->bytecount & 0x3f;
 | 
				
			||||||
			sha256_transform(ctx, ctx->buf);
 | 
					
 | 
				
			||||||
			ctx->bitlen += 512;
 | 
						/* Handle any leading odd-sized chunks */
 | 
				
			||||||
			ctx->datalen = 0;
 | 
						if (t) {
 | 
				
			||||||
 | 
							unsigned char *p = ctx->buf + t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							t = 64 - t;
 | 
				
			||||||
 | 
							if (len < t) {
 | 
				
			||||||
 | 
								memcpy(p, buf, len);
 | 
				
			||||||
 | 
								return;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							memcpy(p, buf, t);
 | 
				
			||||||
 | 
							sha256_transform(ctx, ctx->buf);
 | 
				
			||||||
 | 
							buf += t;
 | 
				
			||||||
 | 
							len -= t;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Process data in 64-byte chunks */
 | 
				
			||||||
 | 
						while (len >= 64) {
 | 
				
			||||||
 | 
							PREFETCH64(buf + 64);
 | 
				
			||||||
 | 
							sha256_transform(ctx, buf);
 | 
				
			||||||
 | 
							buf += 64;
 | 
				
			||||||
 | 
							len -= 64;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Handle any remaining bytes of data. */
 | 
				
			||||||
 | 
						memcpy(ctx->buf, buf, len);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Update the message digest with the contents of the buffer (MD5) */
 | 
					/* Update the message digest with the contents of the buffer (MD5) */
 | 
				
			||||||
static void md5_write(MD5_CONTEXT *ctx, const unsigned char *buf, size_t len)
 | 
					static void md5_write(SUM_CONTEXT *ctx, const unsigned char *buf, size_t len)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	uint32_t t;
 | 
						size_t t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Update bitcount */
 | 
						/* Update bytecount */
 | 
				
			||||||
	ctx->bitcount += (len << 3);
 | 
						ctx->bytecount += len;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	t = (ctx->bitcount >> 3) & 0x3f;
 | 
						t = ctx->bytecount & 0x3f;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Handle any leading odd-sized chunks */
 | 
						/* Handle any leading odd-sized chunks */
 | 
				
			||||||
	if (t) {
 | 
						if (t) {
 | 
				
			||||||
| 
						 | 
					@ -538,8 +551,8 @@ static void md5_write(MD5_CONTEXT *ctx, const unsigned char *buf, size_t len)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Process data in 64-byte chunks */
 | 
						/* Process data in 64-byte chunks */
 | 
				
			||||||
	while (len >= 64) {
 | 
						while (len >= 64) {
 | 
				
			||||||
		memcpy(ctx->buf, buf, 64);
 | 
							PREFETCH64(buf + 64);
 | 
				
			||||||
		md5_transform(ctx, ctx->buf);
 | 
							md5_transform(ctx, buf);
 | 
				
			||||||
		buf += 64;
 | 
							buf += 64;
 | 
				
			||||||
		len -= 64;
 | 
							len -= 64;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -548,46 +561,40 @@ static void md5_write(MD5_CONTEXT *ctx, const unsigned char *buf, size_t len)
 | 
				
			||||||
	memcpy(ctx->buf, buf, len);
 | 
						memcpy(ctx->buf, buf, len);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* The routine final terminates the computation and returns the digest (SHA-1) */
 | 
					/* Finalize the computation and write the digest in ctx->state[] (SHA-1) */
 | 
				
			||||||
static void sha1_final(SHA1_CONTEXT *ctx)
 | 
					static void sha1_final(SUM_CONTEXT *ctx)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	uint64_t bitcount;
 | 
						uint64_t bitcount = ctx->bytecount << 3;
 | 
				
			||||||
 | 
						size_t pos = ((size_t)ctx->bytecount) & 0x3F;
 | 
				
			||||||
	unsigned char *p;
 | 
						unsigned char *p;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sha1_write(ctx, NULL, 0); /* flush */;
 | 
						ctx->buf[pos++] = 0x80;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	bitcount = ctx->nblocks * 64 * 8;
 | 
						/* Pad whatever data is left in the buffer */
 | 
				
			||||||
 | 
						while (pos != (64 - 8)) {
 | 
				
			||||||
	if (ctx->count < 56) { /* enough room */
 | 
							pos &= 0x3F;
 | 
				
			||||||
		ctx->buf[ctx->count++] = 0x80; /* pad */
 | 
							if (pos == 0)
 | 
				
			||||||
		while (ctx->count < 56)
 | 
								sha1_transform(ctx, ctx->buf);
 | 
				
			||||||
			ctx->buf[ctx->count++] = 0; /* pad */
 | 
							ctx->buf[pos++] = 0;
 | 
				
			||||||
	} else { /* need one extra block */
 | 
					 | 
				
			||||||
		ctx->buf[ctx->count++] = 0x80; /* pad character */
 | 
					 | 
				
			||||||
		while (ctx->count < 64)
 | 
					 | 
				
			||||||
			ctx->buf[ctx->count++] = 0;
 | 
					 | 
				
			||||||
		sha1_write(ctx, NULL, 0); /* flush */;
 | 
					 | 
				
			||||||
		memset(ctx->buf, 0, 56); /* fill next block with zeroes */
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* append the 64 bit count (big-endian) */
 | 
						/* Append to the padding the total message's length in bits and transform */
 | 
				
			||||||
	ctx->buf[56] = (unsigned char) (bitcount >> 56);
 | 
					 | 
				
			||||||
	ctx->buf[57] = (unsigned char) (bitcount >> 48);
 | 
					 | 
				
			||||||
	ctx->buf[58] = (unsigned char) (bitcount >> 40);
 | 
					 | 
				
			||||||
	ctx->buf[59] = (unsigned char) (bitcount >> 32);
 | 
					 | 
				
			||||||
	ctx->buf[60] = (unsigned char) (bitcount >> 24);
 | 
					 | 
				
			||||||
	ctx->buf[61] = (unsigned char) (bitcount >> 16);
 | 
					 | 
				
			||||||
	ctx->buf[62] = (unsigned char) (bitcount >> 8);
 | 
					 | 
				
			||||||
	ctx->buf[63] = (unsigned char) bitcount;
 | 
						ctx->buf[63] = (unsigned char) bitcount;
 | 
				
			||||||
 | 
						ctx->buf[62] = (unsigned char) (bitcount >> 8);
 | 
				
			||||||
 | 
						ctx->buf[61] = (unsigned char) (bitcount >> 16);
 | 
				
			||||||
 | 
						ctx->buf[60] = (unsigned char) (bitcount >> 24);
 | 
				
			||||||
 | 
						ctx->buf[59] = (unsigned char) (bitcount >> 32);
 | 
				
			||||||
 | 
						ctx->buf[58] = (unsigned char) (bitcount >> 40);
 | 
				
			||||||
 | 
						ctx->buf[57] = (unsigned char) (bitcount >> 48);
 | 
				
			||||||
 | 
						ctx->buf[56] = (unsigned char) (bitcount >> 56);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sha1_transform(ctx, ctx->buf);
 | 
						sha1_transform(ctx, ctx->buf);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	p = ctx->buf;
 | 
						p = ctx->buf;
 | 
				
			||||||
#ifdef BIG_ENDIAN_HOST
 | 
					#ifdef BIG_ENDIAN_HOST
 | 
				
			||||||
#define X(a) do { *(uint32_t*)p = ctx->state[a]; p += 4; } while(0)
 | 
					#define X(a) do { *(uint32_t*)p = ctx->state[a]; p += 4; } while(0)
 | 
				
			||||||
#else /* little endian */
 | 
					#else
 | 
				
			||||||
#define X(a) do { *p++ = (unsigned char) (ctx->state[a] >> 24); *p++ = (unsigned char) (ctx->state[a] >> 16); \
 | 
					#define X(a) do { write_swap32(p, ctx->state[a]); p += 4; } while(0);
 | 
				
			||||||
                  *p++ = (unsigned char) (ctx->state[a] >> 8); *p++ = (unsigned char) ctx->state[a]; } while(0)
 | 
					 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
	X(0);
 | 
						X(0);
 | 
				
			||||||
	X(1);
 | 
						X(1);
 | 
				
			||||||
| 
						 | 
					@ -597,46 +604,40 @@ static void sha1_final(SHA1_CONTEXT *ctx)
 | 
				
			||||||
#undef X
 | 
					#undef X
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void sha256_final(SHA256_CONTEXT *ctx)
 | 
					/* Finalize the computation and write the digest in ctx->state[] (SHA-256) */
 | 
				
			||||||
 | 
					static void sha256_final(SUM_CONTEXT *ctx)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	uint32_t i;
 | 
						uint64_t bitcount = ctx->bytecount << 3;
 | 
				
			||||||
 | 
						size_t pos = ((size_t)ctx->bytecount) & 0x3F;
 | 
				
			||||||
	unsigned char *p;
 | 
						unsigned char *p;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	i = ctx->datalen;
 | 
						ctx->buf[pos++] = 0x80;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Pad whatever data is left in the buffer.
 | 
						/* Pad whatever data is left in the buffer */
 | 
				
			||||||
	if (ctx->datalen < 56) {
 | 
						while (pos != (64 - 8)) {
 | 
				
			||||||
		ctx->buf[i++] = 0x80;
 | 
							pos &= 0x3F;
 | 
				
			||||||
		while (i < 56)
 | 
							if (pos == 0)
 | 
				
			||||||
			ctx->buf[i++] = 0x00;
 | 
								sha256_transform(ctx, ctx->buf);
 | 
				
			||||||
	}
 | 
							ctx->buf[pos++] = 0;
 | 
				
			||||||
	else {
 | 
					 | 
				
			||||||
		ctx->buf[i++] = 0x80;
 | 
					 | 
				
			||||||
		while (i < 64)
 | 
					 | 
				
			||||||
			ctx->buf[i++] = 0x00;
 | 
					 | 
				
			||||||
		sha256_transform(ctx, ctx->buf);
 | 
					 | 
				
			||||||
		memset(ctx->buf, 0, 56);
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Append to the padding the total message's length in bits and transform.
 | 
						/* Append to the padding the total message's length in bits and transform */
 | 
				
			||||||
	ctx->bitlen += ctx->datalen * 8;
 | 
						ctx->buf[63] = (unsigned char) bitcount;
 | 
				
			||||||
	ctx->buf[63] = (unsigned char) (ctx->bitlen);
 | 
						ctx->buf[62] = (unsigned char) (bitcount >> 8);
 | 
				
			||||||
	ctx->buf[62] = (unsigned char) (ctx->bitlen >> 8);
 | 
						ctx->buf[61] = (unsigned char) (bitcount >> 16);
 | 
				
			||||||
	ctx->buf[61] = (unsigned char) (ctx->bitlen >> 16);
 | 
						ctx->buf[60] = (unsigned char) (bitcount >> 24);
 | 
				
			||||||
	ctx->buf[60] = (unsigned char) (ctx->bitlen >> 24);
 | 
						ctx->buf[59] = (unsigned char) (bitcount >> 32);
 | 
				
			||||||
	ctx->buf[59] = (unsigned char) (ctx->bitlen >> 32);
 | 
						ctx->buf[58] = (unsigned char) (bitcount >> 40);
 | 
				
			||||||
	ctx->buf[58] = (unsigned char) (ctx->bitlen >> 40);
 | 
						ctx->buf[57] = (unsigned char) (bitcount >> 48);
 | 
				
			||||||
	ctx->buf[57] = (unsigned char) (ctx->bitlen >> 48);
 | 
						ctx->buf[56] = (unsigned char) (bitcount >> 56);
 | 
				
			||||||
	ctx->buf[56] = (unsigned char) (ctx->bitlen >> 56);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sha256_transform(ctx, ctx->buf);
 | 
						sha256_transform(ctx, ctx->buf);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	p = ctx->buf;
 | 
						p = ctx->buf;
 | 
				
			||||||
#ifdef BIG_ENDIAN_HOST
 | 
					#ifdef BIG_ENDIAN_HOST
 | 
				
			||||||
#define X(a) do { *(uint32_t*)p = ctx->state[a]; p += 4; } while(0)
 | 
					#define X(a) do { *(uint32_t*)p = ctx->state[a]; p += 4; } while(0)
 | 
				
			||||||
#else /* little endian */
 | 
					#else
 | 
				
			||||||
#define X(a) do { *p++ = (unsigned char) (ctx->state[a] >> 24); *p++ = (unsigned char) (ctx->state[a] >> 16); \
 | 
					#define X(a) do { write_swap32(p, ctx->state[a]); p += 4; } while(0);
 | 
				
			||||||
                  *p++ = (unsigned char) (ctx->state[a] >> 8); *p++ = (unsigned char) ctx->state[a]; } while(0)
 | 
					 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
	X(0);
 | 
						X(0);
 | 
				
			||||||
	X(1);
 | 
						X(1);
 | 
				
			||||||
| 
						 | 
					@ -649,15 +650,13 @@ static void sha256_final(SHA256_CONTEXT *ctx)
 | 
				
			||||||
#undef X
 | 
					#undef X
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* The routine final terminates the computation and returns the digest (MD5) */
 | 
					/* Finalize the computation and write the digest in ctx->state[] (MD5) */
 | 
				
			||||||
static void md5_final(MD5_CONTEXT *ctx)
 | 
					static void md5_final(SUM_CONTEXT *ctx)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	uint32_t count;
 | 
						size_t count = ((size_t)ctx->bytecount) & 0x3F;
 | 
				
			||||||
 | 
						uint64_t bitcount = ctx->bytecount << 3;
 | 
				
			||||||
	unsigned char *p;
 | 
						unsigned char *p;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Compute number of bytes mod 64 */
 | 
					 | 
				
			||||||
	count = (ctx->bitcount >> 3) & 0x3F;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* Set the first char of padding to 0x80.
 | 
						/* Set the first char of padding to 0x80.
 | 
				
			||||||
	 * This is safe since there is always at least one byte free
 | 
						 * This is safe since there is always at least one byte free
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
| 
						 | 
					@ -681,22 +680,21 @@ static void md5_final(MD5_CONTEXT *ctx)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* append the 64 bit count (little endian) */
 | 
						/* append the 64 bit count (little endian) */
 | 
				
			||||||
	ctx->buf[56] = (unsigned char) ctx->bitcount;
 | 
						ctx->buf[56] = (unsigned char) bitcount;
 | 
				
			||||||
	ctx->buf[57] = (unsigned char) (ctx->bitcount >> 8);
 | 
						ctx->buf[57] = (unsigned char) (bitcount >> 8);
 | 
				
			||||||
	ctx->buf[58] = (unsigned char) (ctx->bitcount >> 16);
 | 
						ctx->buf[58] = (unsigned char) (bitcount >> 16);
 | 
				
			||||||
	ctx->buf[59] = (unsigned char) (ctx->bitcount >> 24);
 | 
						ctx->buf[59] = (unsigned char) (bitcount >> 24);
 | 
				
			||||||
	ctx->buf[60] = (unsigned char) (ctx->bitcount >> 32);
 | 
						ctx->buf[60] = (unsigned char) (bitcount >> 32);
 | 
				
			||||||
	ctx->buf[61] = (unsigned char) (ctx->bitcount >> 40);
 | 
						ctx->buf[61] = (unsigned char) (bitcount >> 40);
 | 
				
			||||||
	ctx->buf[62] = (unsigned char) (ctx->bitcount >> 48);
 | 
						ctx->buf[62] = (unsigned char) (bitcount >> 48);
 | 
				
			||||||
	ctx->buf[63] = (unsigned char) (ctx->bitcount >> 56);
 | 
						ctx->buf[63] = (unsigned char) (bitcount >> 56);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	md5_transform(ctx, ctx->buf);
 | 
						md5_transform(ctx, ctx->buf);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	p = ctx->buf;
 | 
						p = ctx->buf;
 | 
				
			||||||
#ifdef BIG_ENDIAN_HOST
 | 
					#ifdef BIG_ENDIAN_HOST
 | 
				
			||||||
#define X(a) do { *p++ = (unsigned char) (ctx->state[a] >> 24); *p++ = (unsigned char) (ctx->state[a] >> 16); \
 | 
					#define X(a) do { write_swap32(p, ctx->state[a]); p += 4; } while(0);
 | 
				
			||||||
                  *p++ = (unsigned char) (ctx->state[a] >> 8); *p++ = (unsigned char) ctx->state[a]; } while(0)
 | 
					#else
 | 
				
			||||||
#else /* little endian */
 | 
					 | 
				
			||||||
#define X(a) do { *(uint32_t*)p = ctx->state[a]; p += 4; } while(0)
 | 
					#define X(a) do { *(uint32_t*)p = ctx->state[a]; p += 4; } while(0)
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
	X(0);
 | 
						X(0);
 | 
				
			||||||
| 
						 | 
					@ -706,12 +704,27 @@ static void md5_final(MD5_CONTEXT *ctx)
 | 
				
			||||||
#undef X
 | 
					#undef X
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//#define NULL_TEST
 | 
				
			||||||
 | 
					#ifdef NULL_TEST
 | 
				
			||||||
 | 
					// These 'null' calls are useful for testing load balancing and individual algorithm speed
 | 
				
			||||||
 | 
					static void null_init(SUM_CONTEXT *ctx) { memset(ctx, 0, sizeof(*ctx)); }
 | 
				
			||||||
 | 
					static void null_write(SUM_CONTEXT *ctx, const unsigned char *buf, size_t len) { }
 | 
				
			||||||
 | 
					static void null_final(SUM_CONTEXT *ctx) { }
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef void sum_init_t(SUM_CONTEXT *ctx);
 | 
				
			||||||
 | 
					typedef void sum_write_t(SUM_CONTEXT *ctx, const unsigned char *buf, size_t len);
 | 
				
			||||||
 | 
					typedef void sum_final_t(SUM_CONTEXT *ctx);
 | 
				
			||||||
 | 
					sum_init_t *sum_init[NUM_CHECKSUMS] = { md5_init, sha1_init , sha256_init };
 | 
				
			||||||
 | 
					sum_write_t *sum_write[NUM_CHECKSUMS] = { md5_write, sha1_write , sha256_write };
 | 
				
			||||||
 | 
					sum_final_t *sum_final[NUM_CHECKSUMS] = { md5_final, sha1_final , sha256_final };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Checksum dialog callback
 | 
					 * Checksum dialog callback
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
INT_PTR CALLBACK ChecksumCallback(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
 | 
					INT_PTR CALLBACK ChecksumCallback(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int i, dw;
 | 
						int i, dw, dh;
 | 
				
			||||||
	RECT rect;
 | 
						RECT rect;
 | 
				
			||||||
	HFONT hFont;
 | 
						HFONT hFont;
 | 
				
			||||||
	HDC hDC;
 | 
						HDC hDC;
 | 
				
			||||||
| 
						 | 
					@ -727,9 +740,9 @@ INT_PTR CALLBACK ChecksumCallback(HWND hDlg, UINT message, WPARAM wParam, LPARAM
 | 
				
			||||||
		SendDlgItemMessageA(hDlg, IDC_MD5, WM_SETFONT, (WPARAM)hFont, TRUE);
 | 
							SendDlgItemMessageA(hDlg, IDC_MD5, WM_SETFONT, (WPARAM)hFont, TRUE);
 | 
				
			||||||
		SendDlgItemMessageA(hDlg, IDC_SHA1, WM_SETFONT, (WPARAM)hFont, TRUE);
 | 
							SendDlgItemMessageA(hDlg, IDC_SHA1, WM_SETFONT, (WPARAM)hFont, TRUE);
 | 
				
			||||||
		SendDlgItemMessageA(hDlg, IDC_SHA256, WM_SETFONT, (WPARAM)hFont, TRUE);
 | 
							SendDlgItemMessageA(hDlg, IDC_SHA256, WM_SETFONT, (WPARAM)hFont, TRUE);
 | 
				
			||||||
		SetWindowTextA(GetDlgItem(hDlg, IDC_MD5), md5str);
 | 
							SetWindowTextA(GetDlgItem(hDlg, IDC_MD5), sum_str[0]);
 | 
				
			||||||
		SetWindowTextA(GetDlgItem(hDlg, IDC_SHA1), sha1str);
 | 
							SetWindowTextA(GetDlgItem(hDlg, IDC_SHA1), sum_str[1]);
 | 
				
			||||||
		SetWindowTextA(GetDlgItem(hDlg, IDC_SHA256), sha256str);
 | 
							SetWindowTextA(GetDlgItem(hDlg, IDC_SHA256), sum_str[2]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Move/Resize the controls as needed to fit our text
 | 
							// Move/Resize the controls as needed to fit our text
 | 
				
			||||||
		hDC = GetDC(GetDlgItem(hDlg, IDC_MD5));
 | 
							hDC = GetDC(GetDlgItem(hDlg, IDC_MD5));
 | 
				
			||||||
| 
						 | 
					@ -737,13 +750,15 @@ INT_PTR CALLBACK ChecksumCallback(HWND hDlg, UINT message, WPARAM wParam, LPARAM
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		GetWindowRect(GetDlgItem(hDlg, IDC_MD5), &rect);
 | 
							GetWindowRect(GetDlgItem(hDlg, IDC_MD5), &rect);
 | 
				
			||||||
		dw = rect.right - rect.left;
 | 
							dw = rect.right - rect.left;
 | 
				
			||||||
		DrawTextU(hDC, md5str, -1, &rect, DT_CALCRECT);
 | 
							dh = rect.bottom - rect.top;
 | 
				
			||||||
 | 
							DrawTextU(hDC, sum_str[0], -1, &rect, DT_CALCRECT);
 | 
				
			||||||
		dw = rect.right - rect.left - dw + 12;	// Ideally we'd compute the field borders from the system, but hey...
 | 
							dw = rect.right - rect.left - dw + 12;	// Ideally we'd compute the field borders from the system, but hey...
 | 
				
			||||||
		ResizeMoveCtrl(hDlg, GetDlgItem(hDlg, IDC_SHA256), 0, 0, dw, 0, 1.0f);
 | 
							dh = rect.bottom - rect.top - dh + 6;
 | 
				
			||||||
 | 
							ResizeMoveCtrl(hDlg, GetDlgItem(hDlg, IDC_SHA256), 0, 0, dw, dh, 1.0f);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		GetWindowRect(GetDlgItem(hDlg, IDC_SHA1), &rect);
 | 
							GetWindowRect(GetDlgItem(hDlg, IDC_SHA1), &rect);
 | 
				
			||||||
		dw = rect.right - rect.left;
 | 
							dw = rect.right - rect.left;
 | 
				
			||||||
		DrawTextU(hDC, sha1str, -1, &rect, DT_CALCRECT);
 | 
							DrawTextU(hDC, sum_str[1], -1, &rect, DT_CALCRECT);
 | 
				
			||||||
		dw = rect.right - rect.left - dw + 12;
 | 
							dw = rect.right - rect.left - dw + 12;
 | 
				
			||||||
		ResizeMoveCtrl(hDlg, GetDlgItem(hDlg, IDC_MD5), 0, 0, dw, 0, 1.0f);
 | 
							ResizeMoveCtrl(hDlg, GetDlgItem(hDlg, IDC_MD5), 0, 0, dw, 0, 1.0f);
 | 
				
			||||||
		ResizeMoveCtrl(hDlg, GetDlgItem(hDlg, IDC_SHA1), 0, 0, dw, 0, 1.0f);
 | 
							ResizeMoveCtrl(hDlg, GetDlgItem(hDlg, IDC_SHA1), 0, 0, dw, 0, 1.0f);
 | 
				
			||||||
| 
						 | 
					@ -771,23 +786,80 @@ INT_PTR CALLBACK ChecksumCallback(HWND hDlg, UINT message, WPARAM wParam, LPARAM
 | 
				
			||||||
	return (INT_PTR)FALSE;
 | 
						return (INT_PTR)FALSE;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Individual thread that computes one of MD5, SHA1 or SHA256 in parallel
 | 
				
			||||||
 | 
					DWORD WINAPI IndividualSumThread(void* param)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						SUM_CONTEXT sum_ctx = { 0 }; // There's a memset in sum_init, but static analyzers still bug us
 | 
				
			||||||
 | 
						uint32_t i = (uint32_t)(uintptr_t)param, j;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						sum_init[i](&sum_ctx);
 | 
				
			||||||
 | 
						// Signal that we're ready to service requests
 | 
				
			||||||
 | 
						if (!SetEvent(thread_ready[i]))
 | 
				
			||||||
 | 
							goto error;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Wait for requests
 | 
				
			||||||
 | 
						while (1) {
 | 
				
			||||||
 | 
							if (WaitForSingleObject(data_ready[i], WAIT_TIME) != WAIT_OBJECT_0) {
 | 
				
			||||||
 | 
								uprintf("Failed to wait for event for checksum thread #%d: %s", i, WindowsErrorString());
 | 
				
			||||||
 | 
								return 1;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if (read_size[bufnum] != 0) {
 | 
				
			||||||
 | 
								sum_write[i](&sum_ctx, buffer[bufnum], (size_t)read_size[bufnum]);
 | 
				
			||||||
 | 
								if (!SetEvent(thread_ready[i]))
 | 
				
			||||||
 | 
									goto error;
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								sum_final[i](&sum_ctx);
 | 
				
			||||||
 | 
								memset(&sum_str[i], 0, ARRAYSIZE(sum_str[i]));
 | 
				
			||||||
 | 
								for (j = 0; j < sum_count[i]; j++)
 | 
				
			||||||
 | 
									safe_sprintf(&sum_str[i][2 * j], ARRAYSIZE(sum_str[i]) - 2 * j, "%02x", sum_ctx.buf[j]);
 | 
				
			||||||
 | 
								return 0;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					error:
 | 
				
			||||||
 | 
						uprintf("Failed to set event for checksum thread #%d: %s", i, WindowsErrorString());
 | 
				
			||||||
 | 
						return 1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
DWORD WINAPI SumThread(void* param)
 | 
					DWORD WINAPI SumThread(void* param)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						DWORD_PTR* thread_affinity = (DWORD_PTR*)param;
 | 
				
			||||||
 | 
						HANDLE sum_thread[NUM_CHECKSUMS] = { NULL, NULL, NULL };
 | 
				
			||||||
	HANDLE h = INVALID_HANDLE_VALUE;
 | 
						HANDLE h = INVALID_HANDLE_VALUE;
 | 
				
			||||||
	DWORD rSize = 0, LastRefresh = 0;
 | 
						uint64_t rb, LastRefresh = 0;
 | 
				
			||||||
	uint64_t rb;
 | 
						int i, _bufnum, r = -1;
 | 
				
			||||||
	char buffer[4096];
 | 
					 | 
				
			||||||
	SHA1_CONTEXT sha1_ctx;
 | 
					 | 
				
			||||||
	SHA256_CONTEXT sha256_ctx;
 | 
					 | 
				
			||||||
	MD5_CONTEXT md5_ctx;
 | 
					 | 
				
			||||||
	int i, r = -1;
 | 
					 | 
				
			||||||
	float format_percent = 0.0f;
 | 
						float format_percent = 0.0f;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (image_path == NULL)
 | 
						if ((image_path == NULL) || (thread_affinity == NULL))
 | 
				
			||||||
		goto out;
 | 
							goto out;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	uprintf("\r\nComputing checksum for '%s'...", image_path);
 | 
						uprintf("\r\nComputing checksum for '%s'...", image_path);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (thread_affinity[0] != 0)
 | 
				
			||||||
 | 
							// Use the first affinity mask, as our read thread is the least
 | 
				
			||||||
 | 
							// CPU intensive (mostly waits on disk I/O or on the other threads)
 | 
				
			||||||
 | 
							// whereas the OS is likely to requisition the first Core, which
 | 
				
			||||||
 | 
							// is usually in this first mask, for other tasks.
 | 
				
			||||||
 | 
							SetThreadAffinityMask(GetCurrentThread(), thread_affinity[0]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (i = 0; i < NUM_CHECKSUMS; i++) {
 | 
				
			||||||
 | 
							// NB: Can't use a single manual-reset event for data_ready as we
 | 
				
			||||||
 | 
							// wouldn't be able to ensure the event is reset before the thread
 | 
				
			||||||
 | 
							// gets into its next wait loop
 | 
				
			||||||
 | 
							data_ready[i] = CreateEvent(NULL, FALSE, FALSE, NULL);
 | 
				
			||||||
 | 
							thread_ready[i] = CreateEvent(NULL, FALSE, FALSE, NULL);
 | 
				
			||||||
 | 
							if ((data_ready[i] == NULL) || (thread_ready[i] == NULL)) {
 | 
				
			||||||
 | 
								uprintf("Unable to create checksum thread event: %s", WindowsErrorString());
 | 
				
			||||||
 | 
								goto out;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							sum_thread[i] = CreateThread(NULL, 0, IndividualSumThread, (LPVOID)(uintptr_t)i, 0, NULL);
 | 
				
			||||||
 | 
							if (sum_thread[i] == NULL) {
 | 
				
			||||||
 | 
								uprintf("Unable to start checksum thread #%d", i);
 | 
				
			||||||
 | 
								goto out;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if (thread_affinity[i+1] != 0)
 | 
				
			||||||
 | 
								SetThreadAffinityMask(sum_thread[i], thread_affinity[i+1]);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	h = CreateFileU(image_path, GENERIC_READ, FILE_SHARE_READ, NULL,
 | 
						h = CreateFileU(image_path, GENERIC_READ, FILE_SHARE_READ, NULL,
 | 
				
			||||||
		OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
 | 
							OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
 | 
				
			||||||
	if (h == INVALID_HANDLE_VALUE) {
 | 
						if (h == INVALID_HANDLE_VALUE) {
 | 
				
			||||||
| 
						 | 
					@ -796,47 +868,70 @@ DWORD WINAPI SumThread(void* param)
 | 
				
			||||||
		goto out;
 | 
							goto out;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sha1_init(&sha1_ctx);
 | 
						bufnum = 0;
 | 
				
			||||||
	sha256_init(&sha256_ctx);
 | 
						_bufnum = 0;
 | 
				
			||||||
	md5_init(&md5_ctx);
 | 
						read_size[0] = 1;	// Don't trigger the first loop break
 | 
				
			||||||
 | 
						for (rb = 0; ;rb += read_size[_bufnum]) {
 | 
				
			||||||
	for (rb = 0; ; rb += rSize) {
 | 
							// Update the progress and check for cancel
 | 
				
			||||||
		if (GetTickCount() > LastRefresh + 25) {
 | 
							if (_GetTickCount64() > LastRefresh + MAX_REFRESH) {
 | 
				
			||||||
			LastRefresh = GetTickCount();
 | 
								LastRefresh = _GetTickCount64();
 | 
				
			||||||
			format_percent = (100.0f*rb) / (1.0f*img_report.projected_size);
 | 
								format_percent = (100.0f*rb) / (1.0f*img_report.projected_size);
 | 
				
			||||||
			PrintInfo(0, MSG_271, format_percent);
 | 
								PrintInfo(0, MSG_271, format_percent);
 | 
				
			||||||
			SendMessage(hProgress, PBM_SETPOS, (WPARAM)((format_percent/100.0f)*MAX_PROGRESS), 0);
 | 
								SendMessage(hProgress, PBM_SETPOS, (WPARAM)((format_percent / 100.0f)*MAX_PROGRESS), 0);
 | 
				
			||||||
			SetTaskbarProgressValue(rb, img_report.projected_size);
 | 
								SetTaskbarProgressValue(rb, img_report.projected_size);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		CHECK_FOR_USER_CANCEL;
 | 
							CHECK_FOR_USER_CANCEL;
 | 
				
			||||||
		if (!ReadFile(h, buffer, sizeof(buffer), &rSize, NULL)) {
 | 
					
 | 
				
			||||||
 | 
							// Signal the threads that we have data to process
 | 
				
			||||||
 | 
							if (rb != 0) {
 | 
				
			||||||
 | 
								bufnum = _bufnum;
 | 
				
			||||||
 | 
								// Toggle the read buffer
 | 
				
			||||||
 | 
								_bufnum = (bufnum + 1) % 2;
 | 
				
			||||||
 | 
								// Signal the waiting threads
 | 
				
			||||||
 | 
								for (i = 0; i < NUM_CHECKSUMS; i++) {
 | 
				
			||||||
 | 
									if (!SetEvent(data_ready[i])) {
 | 
				
			||||||
 | 
										uprintf("Could not signal checksum thread %d: %s", i, WindowsErrorString());
 | 
				
			||||||
 | 
										goto out;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Break the loop when data has been exhausted
 | 
				
			||||||
 | 
							if (read_size[bufnum] == 0)
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Read data (double buffered)
 | 
				
			||||||
 | 
							if (!ReadFile(h, buffer[_bufnum], BUFFER_SIZE, &read_size[_bufnum], NULL)) {
 | 
				
			||||||
			FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | ERROR_READ_FAULT;
 | 
								FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | ERROR_READ_FAULT;
 | 
				
			||||||
			uprintf("  Read error: %s", WindowsErrorString());
 | 
								uprintf("Read error: %s", WindowsErrorString());
 | 
				
			||||||
 | 
								goto out;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Wait for the thread to signal they are ready to process data
 | 
				
			||||||
 | 
							if (WaitForMultipleObjects(NUM_CHECKSUMS, thread_ready, TRUE, WAIT_TIME) != WAIT_OBJECT_0) {
 | 
				
			||||||
 | 
								uprintf("Checksum threads failed to signal: %s", WindowsErrorString());
 | 
				
			||||||
			goto out;
 | 
								goto out;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if (rSize == 0)
 | 
					 | 
				
			||||||
			break;
 | 
					 | 
				
			||||||
		sha1_write(&sha1_ctx, buffer, (size_t)rSize);
 | 
					 | 
				
			||||||
		sha256_write(&sha256_ctx, buffer, (size_t)rSize);
 | 
					 | 
				
			||||||
		md5_write(&md5_ctx, buffer, (size_t)rSize);
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sha1_final(&sha1_ctx);
 | 
						// Our last event with read_size=0 signaled the threads to exit - wait for that to happen
 | 
				
			||||||
	sha256_final(&sha256_ctx);
 | 
						if (WaitForMultipleObjects(NUM_CHECKSUMS, sum_thread, TRUE, WAIT_TIME) != WAIT_OBJECT_0) {
 | 
				
			||||||
	md5_final(&md5_ctx);
 | 
							uprintf("Checksum threads did not finalize: %s", WindowsErrorString());
 | 
				
			||||||
 | 
							goto out;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (i = 0; i < 16; i++)
 | 
						uprintf("  MD5:\t %s", sum_str[0]);
 | 
				
			||||||
		safe_sprintf(&md5str[2*i], sizeof(md5str) - 2*i, "%02x", md5_ctx.buf[i]);
 | 
						uprintf("  SHA1:\t %s", sum_str[1]);
 | 
				
			||||||
	uprintf("  MD5:\t %s", md5str);
 | 
						uprintf("  SHA256: %s", sum_str[2]);
 | 
				
			||||||
	for (i = 0; i < 20; i++)
 | 
					 | 
				
			||||||
		safe_sprintf(&sha1str[2*i], sizeof(sha1str) - 2*i, "%02x", sha1_ctx.buf[i]);
 | 
					 | 
				
			||||||
	uprintf("  SHA1:\t %s", sha1str);
 | 
					 | 
				
			||||||
	for (i = 0; i < 32; i++)
 | 
					 | 
				
			||||||
		safe_sprintf(&sha256str[2*i], sizeof(sha256str) - 2*i, "%02x", sha256_ctx.buf[i]);
 | 
					 | 
				
			||||||
	uprintf("  SHA256: %s", sha256str);
 | 
					 | 
				
			||||||
	r = 0;
 | 
						r = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
out:
 | 
					out:
 | 
				
			||||||
 | 
						for (i = 0; i < NUM_CHECKSUMS; i++) {
 | 
				
			||||||
 | 
							if (sum_thread[i] != NULL)
 | 
				
			||||||
 | 
								TerminateThread(sum_thread[i], 1);
 | 
				
			||||||
 | 
							CloseHandle(data_ready[i]);
 | 
				
			||||||
 | 
							CloseHandle(thread_ready[i]);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	safe_closehandle(h);
 | 
						safe_closehandle(h);
 | 
				
			||||||
	PostMessage(hMainDialog, UM_FORMAT_COMPLETED, (WPARAM)FALSE, 0);
 | 
						PostMessage(hMainDialog, UM_FORMAT_COMPLETED, (WPARAM)FALSE, 0);
 | 
				
			||||||
	if (r == 0)
 | 
						if (r == 0)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,7 +1,7 @@
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Rufus: The Reliable USB Formatting Utility
 | 
					 * Rufus: The Reliable USB Formatting Utility
 | 
				
			||||||
 * USB device listing
 | 
					 * Device detection and enumeration
 | 
				
			||||||
 * Copyright © 2014 Pete Batard <pete@akeo.ie>
 | 
					 * Copyright © 2014-2016 Pete Batard <pete@akeo.ie>
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * This program is free software: you can redistribute it and/or modify
 | 
					 * This program is free software: you can redistribute it and/or modify
 | 
				
			||||||
 * it under the terms of the GNU General Public License as published by
 | 
					 * it under the terms of the GNU General Public License as published by
 | 
				
			||||||
| 
						 | 
					@ -33,15 +33,17 @@
 | 
				
			||||||
#include <commctrl.h>
 | 
					#include <commctrl.h>
 | 
				
			||||||
#include <setupapi.h>
 | 
					#include <setupapi.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "msapi_utf8.h"
 | 
					 | 
				
			||||||
#include "rufus.h"
 | 
					#include "rufus.h"
 | 
				
			||||||
#include "drive.h"
 | 
					#include "missing.h"
 | 
				
			||||||
#include "resource.h"
 | 
					#include "resource.h"
 | 
				
			||||||
 | 
					#include "msapi_utf8.h"
 | 
				
			||||||
#include "localization.h"
 | 
					#include "localization.h"
 | 
				
			||||||
#include "usb.h"
 | 
					
 | 
				
			||||||
 | 
					#include "drive.h"
 | 
				
			||||||
 | 
					#include "dev.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern StrArray DriveID, DriveLabel;
 | 
					extern StrArray DriveID, DriveLabel;
 | 
				
			||||||
extern BOOL enable_HDDs, use_fake_units, enable_vmdk, usb_debug;
 | 
					extern BOOL enable_HDDs, use_fake_units, enable_vmdk, usb_debug, list_non_usb_removable_drives;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Get the VID, PID and current device speed
 | 
					 * Get the VID, PID and current device speed
 | 
				
			||||||
| 
						 | 
					@ -133,6 +135,17 @@ static __inline BOOL IsVHD(const char* buffer)
 | 
				
			||||||
	return FALSE;
 | 
						return FALSE;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static __inline BOOL IsRemovable(const char* buffer)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						switch (*((DWORD*)buffer)) {
 | 
				
			||||||
 | 
						case CM_REMOVAL_POLICY_EXPECT_SURPRISE_REMOVAL:
 | 
				
			||||||
 | 
						case CM_REMOVAL_POLICY_EXPECT_ORDERLY_REMOVAL:
 | 
				
			||||||
 | 
							return TRUE;
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							return FALSE;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* For debugging user reports of HDDs vs UFDs */
 | 
					/* For debugging user reports of HDDs vs UFDs */
 | 
				
			||||||
//#define FORCED_DEVICE
 | 
					//#define FORCED_DEVICE
 | 
				
			||||||
#ifdef FORCED_DEVICE
 | 
					#ifdef FORCED_DEVICE
 | 
				
			||||||
| 
						 | 
					@ -144,31 +157,52 @@ static __inline BOOL IsVHD(const char* buffer)
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Refresh the list of USB devices
 | 
					 * Refresh the list of USB devices
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
BOOL GetUSBDevices(DWORD devnum)
 | 
					BOOL GetDevices(DWORD devnum)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	// The first two are standard Microsoft drivers (including the Windows 8 UASP one).
 | 
						// List of USB storage drivers we know - list may be incomplete!
 | 
				
			||||||
	// The rest are the vendor UASP drivers I know of so far - list may be incomplete!
 | 
						const char* usbstor_name[] = {
 | 
				
			||||||
	const char* storage_name[] = { "USBSTOR", "UASPSTOR", "VUSBSTOR", "ETRONSTOR", "ASUSSTPT" };
 | 
							// Standard MS USB storage driver
 | 
				
			||||||
	const char* scsi_name = "SCSI";
 | 
							"USBSTOR",
 | 
				
			||||||
 | 
							// USB card readers, with proprietary drivers (Realtek,etc...)
 | 
				
			||||||
 | 
							// Mostly "guessed" from http://www.carrona.org/dvrref.php
 | 
				
			||||||
 | 
							"RTSUER", "CMIUCR", "EUCR",
 | 
				
			||||||
 | 
							// UASP Drivers *MUST* be listed after this, starting with "UASPSTOR"
 | 
				
			||||||
 | 
							// (which is Microsoft's native UASP driver for Windows 8 and later)
 | 
				
			||||||
 | 
							// as we use "UASPSTOR" as a delimiter
 | 
				
			||||||
 | 
							"UASPSTOR", "VUSBSTOR", "ETRONSTOR", "ASUSSTPT"
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
						// These are the generic (non USB) storage enumerators we also test
 | 
				
			||||||
 | 
						const char* genstor_name[] = {
 | 
				
			||||||
 | 
							// Generic storage drivers (Careful now!)
 | 
				
			||||||
 | 
							"SCSI", // "STORAGE",	// "STORAGE" is used by 'Storage Spaces" and stuff => DANGEROUS!
 | 
				
			||||||
 | 
							// Non-USB card reader drivers - *MUST* start with "SD" (delimiter)
 | 
				
			||||||
 | 
							// See http://itdoc.hitachi.co.jp/manuals/3021/30213B5200e/DMDS0094.HTM
 | 
				
			||||||
 | 
							// Also  http://www.carrona.org/dvrref.php. NB: These should be reported
 | 
				
			||||||
 | 
							// as enumerators by Rufus when Enum Debug is enabled
 | 
				
			||||||
 | 
							"SD", "PCISTOR", "RTSOR", "JMCR", "JMCF", "RIMMPTSK", "RIMSPTSK", "RIXDPTSK",
 | 
				
			||||||
 | 
							"TI21SONY", "ESD7SK", "ESM7SK", "O2MD", "O2SD", "VIACR"
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
	const char* usb_speed_name[USB_SPEED_MAX] = { "USB", "USB 1.0", "USB 1.1", "USB 2.0", "USB 3.0" };
 | 
						const char* usb_speed_name[USB_SPEED_MAX] = { "USB", "USB 1.0", "USB 1.1", "USB 2.0", "USB 3.0" };
 | 
				
			||||||
	// Hash table and String Array used to match a Device ID with the parent hub's Device Interface Path
 | 
						// Hash table and String Array used to match a Device ID with the parent hub's Device Interface Path
 | 
				
			||||||
	htab_table htab_devid = HTAB_EMPTY;
 | 
						htab_table htab_devid = HTAB_EMPTY;
 | 
				
			||||||
	StrArray dev_if_path;
 | 
						StrArray dev_if_path;
 | 
				
			||||||
	char letter_name[] = " (?:)";
 | 
						char letter_name[] = " (?:)";
 | 
				
			||||||
 | 
						char drive_name[] = "?:\\";
 | 
				
			||||||
	char uefi_togo_check[] = "?:\\EFI\\Rufus\\ntfs_x64.efi";
 | 
						char uefi_togo_check[] = "?:\\EFI\\Rufus\\ntfs_x64.efi";
 | 
				
			||||||
	BOOL r = FALSE, found = FALSE, is_SCSI, post_backslash;
 | 
						BOOL r = FALSE, found = FALSE, post_backslash;
 | 
				
			||||||
	HDEVINFO dev_info = NULL;
 | 
						HDEVINFO dev_info = NULL;
 | 
				
			||||||
	SP_DEVINFO_DATA dev_info_data;
 | 
						SP_DEVINFO_DATA dev_info_data;
 | 
				
			||||||
	SP_DEVICE_INTERFACE_DATA devint_data;
 | 
						SP_DEVICE_INTERFACE_DATA devint_data;
 | 
				
			||||||
	PSP_DEVICE_INTERFACE_DETAIL_DATA_A devint_detail_data;
 | 
						PSP_DEVICE_INTERFACE_DETAIL_DATA_A devint_detail_data;
 | 
				
			||||||
	DEVINST parent_inst, grandparent_inst, device_inst;
 | 
						DEVINST parent_inst, grandparent_inst, device_inst;
 | 
				
			||||||
	DWORD size, i, j, k, l, datatype, drive_index;
 | 
						DWORD size, i, j, k, l, datatype, drive_index;
 | 
				
			||||||
	ULONG list_size[ARRAYSIZE(storage_name)] = { 0 }, list_start[ARRAYSIZE(storage_name)] = { 0 }, full_list_size, ulFlags;
 | 
						DWORD uasp_start = ARRAYSIZE(usbstor_name), card_start = ARRAYSIZE(genstor_name);
 | 
				
			||||||
 | 
						ULONG list_size[ARRAYSIZE(usbstor_name)] = { 0 }, list_start[ARRAYSIZE(usbstor_name)] = { 0 }, full_list_size, ulFlags;
 | 
				
			||||||
	HANDLE hDrive;
 | 
						HANDLE hDrive;
 | 
				
			||||||
	LONG maxwidth = 0;
 | 
						LONG maxwidth = 0;
 | 
				
			||||||
	int s, score, drive_number, remove_drive;
 | 
						int s, score, drive_number, remove_drive;
 | 
				
			||||||
	char drive_letters[27], *device_id, *devid_list = NULL, entry_msg[128];
 | 
						char drive_letters[27], *device_id, *devid_list = NULL, entry_msg[128];
 | 
				
			||||||
	char *label, *entry, buffer[MAX_PATH], str[MAX_PATH], *method_str;
 | 
						char *p, *label, *entry, buffer[MAX_PATH], str[MAX_PATH], *method_str;
 | 
				
			||||||
	usb_device_props props;
 | 
						usb_device_props props;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	IGNORE_RETVAL(ComboBox_ResetContent(hDeviceList));
 | 
						IGNORE_RETVAL(ComboBox_ResetContent(hDeviceList));
 | 
				
			||||||
| 
						 | 
					@ -235,29 +269,47 @@ BOOL GetUSBDevices(DWORD devnum)
 | 
				
			||||||
	ulFlags = CM_GETIDLIST_FILTER_SERVICE;
 | 
						ulFlags = CM_GETIDLIST_FILTER_SERVICE;
 | 
				
			||||||
	if (nWindowsVersion >= WINDOWS_7)
 | 
						if (nWindowsVersion >= WINDOWS_7)
 | 
				
			||||||
		ulFlags |= CM_GETIDLIST_FILTER_PRESENT;
 | 
							ulFlags |= CM_GETIDLIST_FILTER_PRESENT;
 | 
				
			||||||
	for (s=0; s<ARRAYSIZE(storage_name); s++) {
 | 
						for (s=0; s<ARRAYSIZE(usbstor_name); s++) {
 | 
				
			||||||
		// Get a list of device IDs for all USB storage devices
 | 
							// Get a list of device IDs for all USB storage devices
 | 
				
			||||||
		// This will be used to find if a device is UASP
 | 
							// This will be used to find if a device is UASP
 | 
				
			||||||
		if (CM_Get_Device_ID_List_SizeA(&list_size[s], storage_name[s], ulFlags) != CR_SUCCESS)
 | 
							// Also compute the uasp_start index
 | 
				
			||||||
 | 
							if (strcmp(usbstor_name[s], "UASPSTOR") == 0)
 | 
				
			||||||
 | 
								uasp_start = s;
 | 
				
			||||||
 | 
							if (CM_Get_Device_ID_List_SizeA(&list_size[s], usbstor_name[s], ulFlags) != CR_SUCCESS)
 | 
				
			||||||
			list_size[s] = 0;
 | 
								list_size[s] = 0;
 | 
				
			||||||
		if (list_size[s] != 0)
 | 
							if (list_size[s] != 0)
 | 
				
			||||||
			full_list_size += list_size[s]-1;	// remove extra NUL terminator
 | 
								full_list_size += list_size[s]-1;	// remove extra NUL terminator
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						// Compute the card_start index
 | 
				
			||||||
 | 
						for (s=0; s<ARRAYSIZE(genstor_name); s++) {
 | 
				
			||||||
 | 
							if (strcmp(genstor_name[s], "SD") == 0)
 | 
				
			||||||
 | 
								card_start = s;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						// Overkill, but better safe than sorry. And yeah, we could have used
 | 
				
			||||||
 | 
						// arrays of arrays to avoid this, but it's more readable this way.
 | 
				
			||||||
 | 
						if ((uasp_start <= 0) || (uasp_start >= ARRAYSIZE(usbstor_name))) {
 | 
				
			||||||
 | 
							uprintf("Spock gone crazy error in %s:%d", __FILE__, __LINE__);
 | 
				
			||||||
 | 
							goto out;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if ((card_start <= 0) || (card_start >= ARRAYSIZE(genstor_name))) {
 | 
				
			||||||
 | 
							uprintf("Spock gone crazy error in %s:%d", __FILE__, __LINE__);
 | 
				
			||||||
 | 
							goto out;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	devid_list = NULL;
 | 
						devid_list = NULL;
 | 
				
			||||||
	if (full_list_size != 0) {
 | 
						if (full_list_size != 0) {
 | 
				
			||||||
		full_list_size += 1;	// add extra NUL terminator
 | 
							full_list_size += 1;	// add extra NUL terminator
 | 
				
			||||||
		devid_list = (char*)malloc(full_list_size);
 | 
							devid_list = (char*)malloc(full_list_size);
 | 
				
			||||||
		if (devid_list == NULL) {
 | 
							if (devid_list == NULL) {
 | 
				
			||||||
			uprintf("Could not allocate Device ID list\n");
 | 
								uprintf("Could not allocate Device ID list\n");
 | 
				
			||||||
			return FALSE;
 | 
								goto out;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		for (s=0, i=0; s<ARRAYSIZE(storage_name); s++) {
 | 
							for (s=0, i=0; s<ARRAYSIZE(usbstor_name); s++) {
 | 
				
			||||||
			list_start[s] = i;
 | 
								list_start[s] = i;
 | 
				
			||||||
			if (list_size[s] > 1) {
 | 
								if (list_size[s] > 1) {
 | 
				
			||||||
				if (CM_Get_Device_ID_ListA(storage_name[s], &devid_list[i], list_size[s], ulFlags) != CR_SUCCESS)
 | 
									if (CM_Get_Device_ID_ListA(usbstor_name[s], &devid_list[i], list_size[s], ulFlags) != CR_SUCCESS)
 | 
				
			||||||
					continue;
 | 
										continue;
 | 
				
			||||||
				if (usb_debug) {
 | 
									if (usb_debug) {
 | 
				
			||||||
					uprintf("Processing IDs belonging to %s:", storage_name[s]);
 | 
										uprintf("Processing IDs belonging to '%s':", usbstor_name[s]);
 | 
				
			||||||
					for (device_id = &devid_list[i]; *device_id != 0; device_id += strlen(device_id) + 1)
 | 
										for (device_id = &devid_list[i]; *device_id != 0; device_id += strlen(device_id) + 1)
 | 
				
			||||||
						uprintf("  %s", device_id);
 | 
											uprintf("  %s", device_id);
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
| 
						 | 
					@ -270,7 +322,7 @@ BOOL GetUSBDevices(DWORD devnum)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Now use SetupDi to enumerate all our storage devices
 | 
						// Now use SetupDi to enumerate all our disk storage devices
 | 
				
			||||||
	dev_info = SetupDiGetClassDevsA(&_GUID_DEVINTERFACE_DISK, NULL, NULL, DIGCF_PRESENT|DIGCF_DEVICEINTERFACE);
 | 
						dev_info = SetupDiGetClassDevsA(&_GUID_DEVINTERFACE_DISK, NULL, NULL, DIGCF_PRESENT|DIGCF_DEVICEINTERFACE);
 | 
				
			||||||
	if (dev_info == INVALID_HANDLE_VALUE) {
 | 
						if (dev_info == INVALID_HANDLE_VALUE) {
 | 
				
			||||||
		uprintf("SetupDiGetClassDevs (Interface) failed: %s\n", WindowsErrorString());
 | 
							uprintf("SetupDiGetClassDevs (Interface) failed: %s\n", WindowsErrorString());
 | 
				
			||||||
| 
						 | 
					@ -279,24 +331,49 @@ BOOL GetUSBDevices(DWORD devnum)
 | 
				
			||||||
	dev_info_data.cbSize = sizeof(dev_info_data);
 | 
						dev_info_data.cbSize = sizeof(dev_info_data);
 | 
				
			||||||
	for (i=0; SetupDiEnumDeviceInfo(dev_info, i, &dev_info_data); i++) {
 | 
						for (i=0; SetupDiEnumDeviceInfo(dev_info, i, &dev_info_data); i++) {
 | 
				
			||||||
		memset(buffer, 0, sizeof(buffer));
 | 
							memset(buffer, 0, sizeof(buffer));
 | 
				
			||||||
 | 
							memset(&props, 0, sizeof(props));
 | 
				
			||||||
		method_str = "";
 | 
							method_str = "";
 | 
				
			||||||
		if (!SetupDiGetDeviceRegistryPropertyA(dev_info, &dev_info_data, SPDRP_ENUMERATOR_NAME,
 | 
							if (!SetupDiGetDeviceRegistryPropertyA(dev_info, &dev_info_data, SPDRP_ENUMERATOR_NAME,
 | 
				
			||||||
				&datatype, (LPBYTE)buffer, sizeof(buffer), &size)) {
 | 
									&datatype, (LPBYTE)buffer, sizeof(buffer), &size)) {
 | 
				
			||||||
			uprintf("SetupDiGetDeviceRegistryProperty (Enumerator Name) failed: %s\n", WindowsErrorString());
 | 
								uprintf("SetupDiGetDeviceRegistryProperty (Enumerator Name) failed: %s\n", WindowsErrorString());
 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		// UASP drives are listed under SCSI (along with regular SYSTEM drives => "DANGER, WILL ROBINSON!!!")
 | 
					
 | 
				
			||||||
		is_SCSI = (safe_stricmp(buffer, scsi_name) == 0);
 | 
							for (j = 0; j < ARRAYSIZE(usbstor_name); j++) {
 | 
				
			||||||
		if ((safe_stricmp(buffer, storage_name[0]) != 0) && (!is_SCSI))
 | 
								if (safe_stricmp(buffer, usbstor_name[0]) == 0) {
 | 
				
			||||||
 | 
									props.is_USB = TRUE;
 | 
				
			||||||
 | 
									if ((j != 0) && (j < uasp_start))
 | 
				
			||||||
 | 
										props.is_CARD = TRUE;
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// UASP drives are listed under SCSI, and we also have non USB card readers to populate
 | 
				
			||||||
 | 
							for (j = 0; j < ARRAYSIZE(genstor_name); j++) {
 | 
				
			||||||
 | 
								if (safe_stricmp(buffer, genstor_name[j]) == 0) {
 | 
				
			||||||
 | 
									props.is_SCSI = TRUE;
 | 
				
			||||||
 | 
									if (j >= card_start)
 | 
				
			||||||
 | 
										props.is_CARD = TRUE;
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							uuprintf("Processing '%s' device:", buffer);
 | 
				
			||||||
 | 
							if ((!props.is_USB) && (!props.is_SCSI)) {
 | 
				
			||||||
 | 
								uuprintf("  Disabled by policy");
 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// We can't use the friendly name to find if a drive is a VHD, as friendly name string gets translated
 | 
							// We can't use the friendly name to find if a drive is a VHD, as friendly name string gets translated
 | 
				
			||||||
		// according to your locale, so we poke the Hardware ID
 | 
							// according to your locale, so we poke the Hardware ID
 | 
				
			||||||
		memset(&props, 0, sizeof(props));
 | 
					 | 
				
			||||||
		memset(buffer, 0, sizeof(buffer));
 | 
							memset(buffer, 0, sizeof(buffer));
 | 
				
			||||||
		props.is_VHD = SetupDiGetDeviceRegistryPropertyA(dev_info, &dev_info_data, SPDRP_HARDWAREID,
 | 
							props.is_VHD = SetupDiGetDeviceRegistryPropertyA(dev_info, &dev_info_data, SPDRP_HARDWAREID,
 | 
				
			||||||
			&datatype, (LPBYTE)buffer, sizeof(buffer), &size) && IsVHD(buffer);
 | 
								&datatype, (LPBYTE)buffer, sizeof(buffer), &size) && IsVHD(buffer);
 | 
				
			||||||
		uuprintf("Processing Device: '%s'", buffer);
 | 
							uuprintf("  Hardware ID: '%s'", buffer);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							memset(buffer, 0, sizeof(buffer));
 | 
				
			||||||
 | 
							props.is_Removable = SetupDiGetDeviceRegistryPropertyA(dev_info, &dev_info_data, SPDRP_REMOVAL_POLICY,
 | 
				
			||||||
 | 
								&datatype, (LPBYTE)buffer, sizeof(buffer), &size) && IsRemovable(buffer);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		memset(buffer, 0, sizeof(buffer));
 | 
							memset(buffer, 0, sizeof(buffer));
 | 
				
			||||||
		if (!SetupDiGetDeviceRegistryPropertyA(dev_info, &dev_info_data, SPDRP_FRIENDLYNAME,
 | 
							if (!SetupDiGetDeviceRegistryPropertyA(dev_info, &dev_info_data, SPDRP_FRIENDLYNAME,
 | 
				
			||||||
| 
						 | 
					@ -307,72 +384,95 @@ BOOL GetUSBDevices(DWORD devnum)
 | 
				
			||||||
		} else if ((!props.is_VHD) && (devid_list != NULL)) {
 | 
							} else if ((!props.is_VHD) && (devid_list != NULL)) {
 | 
				
			||||||
			// Get the properties of the device. We could avoid doing this lookup every time by keeping
 | 
								// Get the properties of the device. We could avoid doing this lookup every time by keeping
 | 
				
			||||||
			// a lookup table, but there shouldn't be that many USB storage devices connected...
 | 
								// a lookup table, but there shouldn't be that many USB storage devices connected...
 | 
				
			||||||
			// NB: Each of these Device IDs have an _only_ child, from which we get the Device Instance match.
 | 
								// NB: Each of these Device IDs should have a child, from which we get the Device Instance match.
 | 
				
			||||||
			for (device_id = devid_list; *device_id != 0; device_id += strlen(device_id) + 1) {
 | 
								for (device_id = devid_list; *device_id != 0; device_id += strlen(device_id) + 1) {
 | 
				
			||||||
				if ( (CM_Locate_DevNodeA(&parent_inst, device_id, 0) == CR_SUCCESS)
 | 
									if (CM_Locate_DevNodeA(&parent_inst, device_id, 0) != CR_SUCCESS) {
 | 
				
			||||||
				  && (CM_Get_Child(&device_inst, parent_inst, 0) == CR_SUCCESS)
 | 
										uuprintf("Could not locate device node for '%s'", device_id);
 | 
				
			||||||
				  && (device_inst == dev_info_data.DevInst) ) {
 | 
										continue;
 | 
				
			||||||
					post_backslash = FALSE;
 | 
									}
 | 
				
			||||||
					method_str = "";
 | 
									if (CM_Get_Child(&device_inst, parent_inst, 0) != CR_SUCCESS) {
 | 
				
			||||||
 | 
										uuprintf("Could not get children of '%s'", device_id);
 | 
				
			||||||
					// If we're not dealing with the USBSTOR part of our list, then this is an UASP device
 | 
										continue;
 | 
				
			||||||
					props.is_UASP = ((((uintptr_t)device_id)+2) >= ((uintptr_t)devid_list)+list_start[1]);
 | 
									}
 | 
				
			||||||
					// Now get the properties of the device, and its Device ID, which we need to populate the properties
 | 
									if (device_inst != dev_info_data.DevInst) {
 | 
				
			||||||
					j = htab_hash(device_id, &htab_devid);
 | 
										// Try the siblings
 | 
				
			||||||
					uuprintf("  Matched with ID[%03d]: %s", j, device_id);
 | 
										while (CM_Get_Sibling(&device_inst, device_inst, 0) == CR_SUCCESS) {
 | 
				
			||||||
 | 
											if (device_inst == dev_info_data.DevInst) {
 | 
				
			||||||
					// Try to parse the current device_id string for VID:PID
 | 
												uuprintf("NOTE: Matched instance from sibling for '%s'", device_id);
 | 
				
			||||||
					// We'll use that if we can't get anything better
 | 
												break;
 | 
				
			||||||
					for (k = 0, l = 0; (k<strlen(device_id)) && (l<2); k++) {
 | 
					 | 
				
			||||||
						// The ID is in the form USB_VENDOR_BUSID\VID_xxxx&PID_xxxx\...
 | 
					 | 
				
			||||||
						if (device_id[k] == '\\')
 | 
					 | 
				
			||||||
							post_backslash = TRUE;
 | 
					 | 
				
			||||||
						if (!post_backslash)
 | 
					 | 
				
			||||||
							continue;
 | 
					 | 
				
			||||||
						if (device_id[k] == '_') {
 | 
					 | 
				
			||||||
							props.pid = (uint16_t)strtoul(&device_id[k + 1], NULL, 16);
 | 
					 | 
				
			||||||
							if (l++ == 0)
 | 
					 | 
				
			||||||
								props.vid = props.pid;
 | 
					 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
					if (props.vid != 0)
 | 
										if (device_inst != dev_info_data.DevInst)
 | 
				
			||||||
						method_str = "[ID]";
 | 
											continue;
 | 
				
			||||||
 | 
					 | 
				
			||||||
					// If the hash didn't match a populated string in dev_if_path[] (htab_devid.table[j].data > 0),
 | 
					 | 
				
			||||||
					// we might have an extra vendor driver in between (e.g. "ASUS USB 3.0 Boost Storage Driver"
 | 
					 | 
				
			||||||
					// for UASP devices in ASUS "Turbo Mode" or "Apple Mobile Device USB Driver" for iPods)
 | 
					 | 
				
			||||||
					// so try to see if we can match the grandparent.
 | 
					 | 
				
			||||||
					if ( ((uintptr_t)htab_devid.table[j].data == 0)
 | 
					 | 
				
			||||||
					  && (CM_Get_Parent(&grandparent_inst, parent_inst, 0) == CR_SUCCESS)
 | 
					 | 
				
			||||||
					  && (CM_Get_Device_IDA(grandparent_inst, str, MAX_PATH, 0) == CR_SUCCESS) ) {
 | 
					 | 
				
			||||||
						device_id = str;
 | 
					 | 
				
			||||||
						method_str = "[GP]";
 | 
					 | 
				
			||||||
						j = htab_hash(device_id, &htab_devid);
 | 
					 | 
				
			||||||
						uuprintf("  Matched with (GP) ID[%03d]: %s", j, device_id);
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
					if ((uintptr_t)htab_devid.table[j].data > 0) {
 | 
					 | 
				
			||||||
						uuprintf("  Matched with Hub[%d]: '%s'", (uintptr_t)htab_devid.table[j].data,
 | 
					 | 
				
			||||||
								dev_if_path.String[(uintptr_t)htab_devid.table[j].data]);
 | 
					 | 
				
			||||||
						if (GetUSBProperties(dev_if_path.String[(uintptr_t)htab_devid.table[j].data], device_id, &props))
 | 
					 | 
				
			||||||
							method_str = "";
 | 
					 | 
				
			||||||
#ifdef FORCED_DEVICE
 | 
					 | 
				
			||||||
						props.vid = FORCED_VID;
 | 
					 | 
				
			||||||
						props.pid = FORCED_PID;
 | 
					 | 
				
			||||||
						safe_strcpy(buffer, sizeof(buffer), FORCED_NAME);
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
					break;
 | 
					 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
									post_backslash = FALSE;
 | 
				
			||||||
 | 
									method_str = "";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									// If we're not dealing with the USBSTOR part of our list, then this is an UASP device
 | 
				
			||||||
 | 
									props.is_UASP = ((((uintptr_t)device_id)+2) >= ((uintptr_t)devid_list)+list_start[uasp_start]);
 | 
				
			||||||
 | 
									// Now get the properties of the device, and its Device ID, which we need to populate the properties
 | 
				
			||||||
 | 
									j = htab_hash(device_id, &htab_devid);
 | 
				
			||||||
 | 
									uuprintf("  Matched with ID[%03d]: %s", j, device_id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									// Try to parse the current device_id string for VID:PID
 | 
				
			||||||
 | 
									// We'll use that if we can't get anything better
 | 
				
			||||||
 | 
									for (k = 0, l = 0; (k<strlen(device_id)) && (l<2); k++) {
 | 
				
			||||||
 | 
										// The ID is in the form USB_VENDOR_BUSID\VID_xxxx&PID_xxxx\...
 | 
				
			||||||
 | 
										if (device_id[k] == '\\')
 | 
				
			||||||
 | 
											post_backslash = TRUE;
 | 
				
			||||||
 | 
										if (!post_backslash)
 | 
				
			||||||
 | 
											continue;
 | 
				
			||||||
 | 
										if (device_id[k] == '_') {
 | 
				
			||||||
 | 
											props.pid = (uint16_t)strtoul(&device_id[k + 1], NULL, 16);
 | 
				
			||||||
 | 
											if (l++ == 0)
 | 
				
			||||||
 | 
												props.vid = props.pid;
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									if (props.vid != 0)
 | 
				
			||||||
 | 
										method_str = "[ID]";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									// If the hash didn't match a populated string in dev_if_path[] (htab_devid.table[j].data > 0),
 | 
				
			||||||
 | 
									// we might have an extra vendor driver in between (e.g. "ASUS USB 3.0 Boost Storage Driver"
 | 
				
			||||||
 | 
									// for UASP devices in ASUS "Turbo Mode" or "Apple Mobile Device USB Driver" for iPods)
 | 
				
			||||||
 | 
									// so try to see if we can match the grandparent.
 | 
				
			||||||
 | 
									if ( ((uintptr_t)htab_devid.table[j].data == 0)
 | 
				
			||||||
 | 
										&& (CM_Get_Parent(&grandparent_inst, parent_inst, 0) == CR_SUCCESS)
 | 
				
			||||||
 | 
										&& (CM_Get_Device_IDA(grandparent_inst, str, MAX_PATH, 0) == CR_SUCCESS) ) {
 | 
				
			||||||
 | 
										device_id = str;
 | 
				
			||||||
 | 
										method_str = "[GP]";
 | 
				
			||||||
 | 
										j = htab_hash(device_id, &htab_devid);
 | 
				
			||||||
 | 
										uuprintf("  Matched with (GP) ID[%03d]: %s", j, device_id);
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									if ((uintptr_t)htab_devid.table[j].data > 0) {
 | 
				
			||||||
 | 
										uuprintf("  Matched with Hub[%d]: '%s'", (uintptr_t)htab_devid.table[j].data,
 | 
				
			||||||
 | 
												dev_if_path.String[(uintptr_t)htab_devid.table[j].data]);
 | 
				
			||||||
 | 
										if (GetUSBProperties(dev_if_path.String[(uintptr_t)htab_devid.table[j].data], device_id, &props))
 | 
				
			||||||
 | 
											method_str = "";
 | 
				
			||||||
 | 
					#ifdef FORCED_DEVICE
 | 
				
			||||||
 | 
										props.vid = FORCED_VID;
 | 
				
			||||||
 | 
										props.pid = FORCED_PID;
 | 
				
			||||||
 | 
										safe_strcpy(buffer, sizeof(buffer), FORCED_NAME);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if (props.is_VHD) {
 | 
							if (props.is_VHD) {
 | 
				
			||||||
			uprintf("Found VHD device '%s'", buffer);
 | 
								uprintf("Found VHD device '%s'", buffer);
 | 
				
			||||||
 | 
							} else if ((props.is_CARD) && ((!props.is_USB) || ((props.vid == 0) && (props.pid == 0)))) {
 | 
				
			||||||
 | 
								uprintf("Found card reader device '%s'", buffer);
 | 
				
			||||||
 | 
							} else if ((!props.is_USB) && (!props.is_UASP) && (props.is_Removable)) {
 | 
				
			||||||
 | 
								uprintf("Found non-USB removable device '%s' => Eliminated", buffer);
 | 
				
			||||||
 | 
								if (!list_non_usb_removable_drives) {
 | 
				
			||||||
 | 
									uuprintf("If you *REALLY* need, you can enable listing of this device with <Ctrl><Alt><F>");
 | 
				
			||||||
 | 
									continue;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			if ((props.vid == 0) && (props.pid == 0)) {
 | 
								if ((props.vid == 0) && (props.pid == 0)) {
 | 
				
			||||||
				if (is_SCSI) {
 | 
									if (!props.is_USB) {
 | 
				
			||||||
					// If we have an SCSI drive and couldn't get a VID:PID, we are most likely
 | 
										// If we have a non removable SCSI drive and couldn't get a VID:PID,
 | 
				
			||||||
					// dealing with a system drive => eliminate it!
 | 
										// we are most likely dealing with a system drive => eliminate it!
 | 
				
			||||||
					uuprintf("  Non USB => Eliminated");
 | 
										uuprintf("Found non-USB non-removable device '%s' => Eliminated", buffer);
 | 
				
			||||||
					continue;
 | 
										continue;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				safe_strcpy(str, sizeof(str), "????:????");	// Couldn't figure VID:PID
 | 
									safe_strcpy(str, sizeof(str), "????:????");	// Couldn't figure VID:PID
 | 
				
			||||||
| 
						 | 
					@ -442,13 +542,44 @@ BOOL GetUSBDevices(DWORD devnum)
 | 
				
			||||||
				safe_free(devint_detail_data);
 | 
									safe_free(devint_detail_data);
 | 
				
			||||||
				break;
 | 
									break;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
								if (GetDriveSize(drive_index) < (MIN_DRIVE_SIZE*MB)) {
 | 
				
			||||||
 | 
									uprintf("Device eliminated because it is smaller than %d MB\n", MIN_DRIVE_SIZE);
 | 
				
			||||||
 | 
									safe_closehandle(hDrive);
 | 
				
			||||||
 | 
									safe_free(devint_detail_data);
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (GetDriveLabel(drive_index, drive_letters, &label)) {
 | 
								if (GetDriveLabel(drive_index, drive_letters, &label)) {
 | 
				
			||||||
				if ((!enable_HDDs) && (!props.is_VHD) &&
 | 
									if ((props.is_SCSI) && (!props.is_UASP) && (!props.is_VHD)) {
 | 
				
			||||||
 | 
										if (!props.is_Removable) {
 | 
				
			||||||
 | 
											// Non removables should have been eliminated above, but since we
 | 
				
			||||||
 | 
											// are potentially dealing with system drives, better safe than sorry
 | 
				
			||||||
 | 
											safe_closehandle(hDrive);
 | 
				
			||||||
 | 
											safe_free(devint_detail_data);
 | 
				
			||||||
 | 
											break;
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										if (!list_non_usb_removable_drives) {
 | 
				
			||||||
 | 
											// Go over the mounted partitions and find if GetDriveType() says they are
 | 
				
			||||||
 | 
											// removable. If they are not removable, don't allow the drive to be listed
 | 
				
			||||||
 | 
											for (p = drive_letters; *p; p++) {
 | 
				
			||||||
 | 
												drive_name[0] = *p;
 | 
				
			||||||
 | 
												if (GetDriveTypeA(drive_name) != DRIVE_REMOVABLE)
 | 
				
			||||||
 | 
													break;
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
											if (*p) {
 | 
				
			||||||
 | 
												uprintf("Device eliminated because it contains a mounted partition that is set as non-removable");
 | 
				
			||||||
 | 
												safe_closehandle(hDrive);
 | 
				
			||||||
 | 
												safe_free(devint_detail_data);
 | 
				
			||||||
 | 
												break;
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									if ((!enable_HDDs) && (!props.is_VHD) && (!props.is_CARD) &&
 | 
				
			||||||
					((score = IsHDD(drive_index, (uint16_t)props.vid, (uint16_t)props.pid, buffer)) > 0)) {
 | 
										((score = IsHDD(drive_index, (uint16_t)props.vid, (uint16_t)props.pid, buffer)) > 0)) {
 | 
				
			||||||
					uprintf("Device eliminated because it was detected as an USB Hard Drive (score %d > 0)\n", score);
 | 
										uprintf("Device eliminated because it was detected as a Hard Drive (score %d > 0)", score);
 | 
				
			||||||
					uprintf("If this device is not an USB Hard Drive, please e-mail the author of this application\n");
 | 
										if (!list_non_usb_removable_drives)
 | 
				
			||||||
					uprintf("NOTE: You can enable the listing of USB Hard Drives in 'Advanced Options' (after clicking the white triangle)");
 | 
											uprintf("If this device is not a Hard Drive, please e-mail the author of this application");
 | 
				
			||||||
 | 
										uprintf("NOTE: You can enable the listing of Hard Drives in 'Advanced Options' (after clicking the white triangle)");
 | 
				
			||||||
					safe_closehandle(hDrive);
 | 
										safe_closehandle(hDrive);
 | 
				
			||||||
					safe_free(devint_detail_data);
 | 
										safe_free(devint_detail_data);
 | 
				
			||||||
					break;
 | 
										break;
 | 
				
			||||||
| 
						 | 
					@ -1,7 +1,7 @@
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Rufus: The Reliable USB Formatting Utility
 | 
					 * Rufus: The Reliable USB Formatting Utility
 | 
				
			||||||
 * USB device listing
 | 
					 * Device listing
 | 
				
			||||||
 * Copyright © 2014 Pete Batard <pete@akeo.ie>
 | 
					 * Copyright © 2014-2016 Pete Batard <pete@akeo.ie>
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * This program is free software: you can redistribute it and/or modify
 | 
					 * This program is free software: you can redistribute it and/or modify
 | 
				
			||||||
 * it under the terms of the GNU General Public License as published by
 | 
					 * it under the terms of the GNU General Public License as published by
 | 
				
			||||||
| 
						 | 
					@ -32,8 +32,12 @@ typedef struct usb_device_props {
 | 
				
			||||||
	uint32_t  pid;
 | 
						uint32_t  pid;
 | 
				
			||||||
	uint32_t  speed;
 | 
						uint32_t  speed;
 | 
				
			||||||
	uint32_t  port;
 | 
						uint32_t  port;
 | 
				
			||||||
 | 
						BOOLEAN   is_USB;
 | 
				
			||||||
 | 
						BOOLEAN   is_SCSI;
 | 
				
			||||||
 | 
						BOOLEAN   is_CARD;
 | 
				
			||||||
	BOOLEAN   is_UASP;
 | 
						BOOLEAN   is_UASP;
 | 
				
			||||||
	BOOLEAN   is_VHD;
 | 
						BOOLEAN   is_VHD;
 | 
				
			||||||
 | 
						BOOLEAN   is_Removable;
 | 
				
			||||||
	BOOLEAN   is_LowerSpeed;
 | 
						BOOLEAN   is_LowerSpeed;
 | 
				
			||||||
} usb_device_props;
 | 
					} usb_device_props;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -46,12 +50,15 @@ typedef DWORD RETURN_TYPE;
 | 
				
			||||||
typedef RETURN_TYPE CONFIGRET;
 | 
					typedef RETURN_TYPE CONFIGRET;
 | 
				
			||||||
typedef CHAR *DEVINSTID_A;
 | 
					typedef CHAR *DEVINSTID_A;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define CR_SUCCESS                              0x00000000
 | 
					#define CR_SUCCESS                                  0x00000000
 | 
				
			||||||
#define CR_NO_SUCH_DEVNODE                      0x0000000D
 | 
					#define CR_NO_SUCH_DEVNODE                          0x0000000D
 | 
				
			||||||
#define CM_GETIDLIST_FILTER_SERVICE             0x00000002
 | 
					#define CM_GETIDLIST_FILTER_SERVICE                 0x00000002
 | 
				
			||||||
 | 
					#define CM_REMOVAL_POLICY_EXPECT_NO_REMOVAL         0x00000001
 | 
				
			||||||
 | 
					#define CM_REMOVAL_POLICY_EXPECT_ORDERLY_REMOVAL    0x00000002
 | 
				
			||||||
 | 
					#define CM_REMOVAL_POLICY_EXPECT_SURPRISE_REMOVAL   0x00000003
 | 
				
			||||||
// /!\ The following flag is only available on Windows 7 or later!
 | 
					// /!\ The following flag is only available on Windows 7 or later!
 | 
				
			||||||
#define CM_GETIDLIST_FILTER_PRESENT             0x00000100
 | 
					#define CM_GETIDLIST_FILTER_PRESENT                 0x00000100
 | 
				
			||||||
#define CM_DRP_ADDRESS                          0x0000001D
 | 
					#define CM_DRP_ADDRESS                              0x0000001D
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef METHOD_BUFFERED
 | 
					#ifndef METHOD_BUFFERED
 | 
				
			||||||
#define METHOD_BUFFERED                         0
 | 
					#define METHOD_BUFFERED                         0
 | 
				
			||||||
							
								
								
									
										16
									
								
								src/dos.c
									
										
									
									
									
								
							
							
						
						
									
										16
									
								
								src/dos.c
									
										
									
									
									
								
							| 
						 | 
					@ -2,7 +2,7 @@
 | 
				
			||||||
 * Rufus: The Reliable USB Formatting Utility
 | 
					 * Rufus: The Reliable USB Formatting Utility
 | 
				
			||||||
 * DOS boot file extraction, from the FAT12 floppy image in diskcopy.dll
 | 
					 * DOS boot file extraction, from the FAT12 floppy image in diskcopy.dll
 | 
				
			||||||
 * (MS WinME DOS) or from the embedded FreeDOS resource files
 | 
					 * (MS WinME DOS) or from the embedded FreeDOS resource files
 | 
				
			||||||
 * Copyright © 2011-2015 Pete Batard <pete@akeo.ie>
 | 
					 * Copyright © 2011-2016 Pete Batard <pete@akeo.ie>
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * This program is free software: you can redistribute it and/or modify
 | 
					 * This program is free software: you can redistribute it and/or modify
 | 
				
			||||||
 * it under the terms of the GNU General Public License as published by
 | 
					 * it under the terms of the GNU General Public License as published by
 | 
				
			||||||
| 
						 | 
					@ -31,9 +31,11 @@
 | 
				
			||||||
#include <string.h>
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "rufus.h"
 | 
					#include "rufus.h"
 | 
				
			||||||
#include "dos.h"
 | 
					#include "missing.h"
 | 
				
			||||||
#include "resource.h"
 | 
					#include "resource.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "dos.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static BYTE* DiskImage = NULL;
 | 
					static BYTE* DiskImage = NULL;
 | 
				
			||||||
static DWORD DiskImageSize;
 | 
					static DWORD DiskImageSize;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -257,8 +259,8 @@ static BOOL ExtractFAT(int entry, const char* path)
 | 
				
			||||||
		return FALSE;
 | 
							return FALSE;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ((!WriteFile(hFile, &DiskImage[filestart], (DWORD)filesize, &Size, 0)) || (filesize != Size)) {
 | 
						if (!WriteFileWithRetry(hFile, &DiskImage[filestart], (DWORD)filesize, &Size, WRITE_RETRIES)) {
 | 
				
			||||||
		uprintf("Couldn't write file '%s': %s.\n", filename, WindowsErrorString());
 | 
							uprintf("Could not write file '%s': %s.\n", filename, WindowsErrorString());
 | 
				
			||||||
		safe_closehandle(hFile);
 | 
							safe_closehandle(hFile);
 | 
				
			||||||
		return FALSE;
 | 
							return FALSE;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -324,7 +326,7 @@ static BOOL ExtractMSDOS(const char* path)
 | 
				
			||||||
		goto out;
 | 
							goto out;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Sanity check
 | 
						// Sanity check
 | 
				
			||||||
	if (DiskImageSize < 700*1024) {
 | 
						if (DiskImageSize < 700*KB) {
 | 
				
			||||||
		uprintf("MS-DOS disk image is too small (%d bytes)\n", dllname, DiskImageSize);
 | 
							uprintf("MS-DOS disk image is too small (%d bytes)\n", dllname, DiskImageSize);
 | 
				
			||||||
		goto out;
 | 
							goto out;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -394,8 +396,8 @@ BOOL ExtractFreeDOS(const char* path)
 | 
				
			||||||
			return FALSE;
 | 
								return FALSE;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if ((!WriteFile(hFile, res_data, res_size, &Size, 0)) || (res_size != Size)) {
 | 
							if (!WriteFileWithRetry(hFile, res_data, res_size, &Size, WRITE_RETRIES)) {
 | 
				
			||||||
			uprintf("Couldn't write file '%s': %s.\n", filename, WindowsErrorString());
 | 
								uprintf("Could not write file '%s': %s.\n", filename, WindowsErrorString());
 | 
				
			||||||
			safe_closehandle(hFile);
 | 
								safe_closehandle(hFile);
 | 
				
			||||||
			return FALSE;
 | 
								return FALSE;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										47
									
								
								src/drive.c
									
										
									
									
									
								
							
							
						
						
									
										47
									
								
								src/drive.c
									
										
									
									
									
								
							| 
						 | 
					@ -26,17 +26,19 @@
 | 
				
			||||||
#include <string.h>
 | 
					#include <string.h>
 | 
				
			||||||
#include <ctype.h>
 | 
					#include <ctype.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "msapi_utf8.h"
 | 
					 | 
				
			||||||
#include "rufus.h"
 | 
					#include "rufus.h"
 | 
				
			||||||
 | 
					#include "missing.h"
 | 
				
			||||||
 | 
					#include "resource.h"
 | 
				
			||||||
 | 
					#include "msapi_utf8.h"
 | 
				
			||||||
 | 
					#include "localization.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "file.h"
 | 
					#include "file.h"
 | 
				
			||||||
#include "drive.h"
 | 
					#include "drive.h"
 | 
				
			||||||
#include "resource.h"
 | 
					 | 
				
			||||||
#include "sys_types.h"
 | 
					#include "sys_types.h"
 | 
				
			||||||
#include "br.h"
 | 
					#include "br.h"
 | 
				
			||||||
#include "fat16.h"
 | 
					#include "fat16.h"
 | 
				
			||||||
#include "fat32.h"
 | 
					#include "fat32.h"
 | 
				
			||||||
#include "ntfs.h"
 | 
					#include "ntfs.h"
 | 
				
			||||||
#include "localization.h"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if !defined(PARTITION_BASIC_DATA_GUID)
 | 
					#if !defined(PARTITION_BASIC_DATA_GUID)
 | 
				
			||||||
const GUID PARTITION_BASIC_DATA_GUID =
 | 
					const GUID PARTITION_BASIC_DATA_GUID =
 | 
				
			||||||
| 
						 | 
					@ -55,7 +57,6 @@ const GUID PARTITION_SYSTEM_GUID =
 | 
				
			||||||
 * Globals
 | 
					 * Globals
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
RUFUS_DRIVE_INFO SelectedDrive;
 | 
					RUFUS_DRIVE_INFO SelectedDrive;
 | 
				
			||||||
size_t uefi_ntfs_size = 0;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * The following methods get or set the AutoMount setting (which is different from AutoRun)
 | 
					 * The following methods get or set the AutoMount setting (which is different from AutoRun)
 | 
				
			||||||
| 
						 | 
					@ -395,10 +396,10 @@ static BOOL _GetDriveLettersAndType(DWORD DriveIndex, char* drive_letters, UINT*
 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/* IOCTL_STORAGE_GET_DEVICE_NUMBER's STORAGE_DEVICE_NUMBER.DeviceNumber is
 | 
							// IOCTL_STORAGE_GET_DEVICE_NUMBER's STORAGE_DEVICE_NUMBER.DeviceNumber is
 | 
				
			||||||
			not unique! An HDD, a DVD and probably other drives can have the same
 | 
							// not unique! An HDD, a DVD and probably other drives can have the same
 | 
				
			||||||
			value there => Use GetDriveType() to filter out unwanted devices.
 | 
							// value there => Use GetDriveType() to filter out unwanted devices.
 | 
				
			||||||
			See https://github.com/pbatard/rufus/issues/32 for details. */
 | 
							// See https://github.com/pbatard/rufus/issues/32#issuecomment-3785956
 | 
				
			||||||
		_drive_type = GetDriveTypeA(drive);
 | 
							_drive_type = GetDriveTypeA(drive);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if ((_drive_type != DRIVE_REMOVABLE) && (_drive_type != DRIVE_FIXED))
 | 
							if ((_drive_type != DRIVE_REMOVABLE) && (_drive_type != DRIVE_FIXED))
 | 
				
			||||||
| 
						 | 
					@ -682,9 +683,6 @@ BOOL GetDrivePartitionData(DWORD DriveIndex, char* FileSystemName, DWORD FileSys
 | 
				
			||||||
	if (hPhysical == INVALID_HANDLE_VALUE)
 | 
						if (hPhysical == INVALID_HANDLE_VALUE)
 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (uefi_ntfs_size == 0)
 | 
					 | 
				
			||||||
		uefi_ntfs_size = GetResourceSize(hMainInstance, MAKEINTRESOURCEA(IDR_UEFI_NTFS), _RT_RCDATA, "uefi-ntfs.img");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	r = DeviceIoControl(hPhysical, IOCTL_DISK_GET_DRIVE_GEOMETRY_EX,
 | 
						r = DeviceIoControl(hPhysical, IOCTL_DISK_GET_DRIVE_GEOMETRY_EX,
 | 
				
			||||||
			NULL, 0, geometry, sizeof(geometry), &size, NULL);
 | 
								NULL, 0, geometry, sizeof(geometry), &size, NULL);
 | 
				
			||||||
	if (!r || size <= 0) {
 | 
						if (!r || size <= 0) {
 | 
				
			||||||
| 
						 | 
					@ -732,7 +730,7 @@ BOOL GetDrivePartitionData(DWORD DriveIndex, char* FileSystemName, DWORD FileSys
 | 
				
			||||||
			if (DriveLayout->PartitionEntry[i].Mbr.PartitionType != PARTITION_ENTRY_UNUSED) {
 | 
								if (DriveLayout->PartitionEntry[i].Mbr.PartitionType != PARTITION_ENTRY_UNUSED) {
 | 
				
			||||||
				part_type = DriveLayout->PartitionEntry[i].Mbr.PartitionType;
 | 
									part_type = DriveLayout->PartitionEntry[i].Mbr.PartitionType;
 | 
				
			||||||
				isUefiNtfs = (i == 1) && (part_type == 0xef) &&
 | 
									isUefiNtfs = (i == 1) && (part_type == 0xef) &&
 | 
				
			||||||
					(DriveLayout->PartitionEntry[i].PartitionLength.QuadPart == uefi_ntfs_size);
 | 
										(DriveLayout->PartitionEntry[i].PartitionLength.QuadPart <= 1*MB);
 | 
				
			||||||
				suprintf("Partition %d%s:\n", i+1, isUefiNtfs?" (UEFI:NTFS)":"");
 | 
									suprintf("Partition %d%s:\n", i+1, isUefiNtfs?" (UEFI:NTFS)":"");
 | 
				
			||||||
				for (j=0; j<ARRAYSIZE(mbr_mountable); j++) {
 | 
									for (j=0; j<ARRAYSIZE(mbr_mountable); j++) {
 | 
				
			||||||
					if (part_type == mbr_mountable[j]) {
 | 
										if (part_type == mbr_mountable[j]) {
 | 
				
			||||||
| 
						 | 
					@ -1027,6 +1025,7 @@ BOOL CreatePartition(HANDLE hDrive, int partition_style, int file_system, BOOL m
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	const char* PartitionTypeName[2] = { "MBR", "GPT" };
 | 
						const char* PartitionTypeName[2] = { "MBR", "GPT" };
 | 
				
			||||||
	unsigned char* buffer;
 | 
						unsigned char* buffer;
 | 
				
			||||||
 | 
						size_t uefi_ntfs_size = 0;
 | 
				
			||||||
	CREATE_DISK CreateDisk = {PARTITION_STYLE_RAW, {{0}}};
 | 
						CREATE_DISK CreateDisk = {PARTITION_STYLE_RAW, {{0}}};
 | 
				
			||||||
	DRIVE_LAYOUT_INFORMATION_EX4 DriveLayoutEx = {0};
 | 
						DRIVE_LAYOUT_INFORMATION_EX4 DriveLayoutEx = {0};
 | 
				
			||||||
	BOOL r;
 | 
						BOOL r;
 | 
				
			||||||
| 
						 | 
					@ -1036,7 +1035,7 @@ BOOL CreatePartition(HANDLE hDrive, int partition_style, int file_system, BOOL m
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	PrintInfoDebug(0, MSG_238, PartitionTypeName[partition_style]);
 | 
						PrintInfoDebug(0, MSG_238, PartitionTypeName[partition_style]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ((extra_partitions & XP_UEFI_NTFS) && (uefi_ntfs_size == 0)) {
 | 
						if (extra_partitions & XP_UEFI_NTFS) {
 | 
				
			||||||
		uefi_ntfs_size = GetResourceSize(hMainInstance, MAKEINTRESOURCEA(IDR_UEFI_NTFS), _RT_RCDATA, "uefi-ntfs.img");
 | 
							uefi_ntfs_size = GetResourceSize(hMainInstance, MAKEINTRESOURCEA(IDR_UEFI_NTFS), _RT_RCDATA, "uefi-ntfs.img");
 | 
				
			||||||
		if (uefi_ntfs_size == 0)
 | 
							if (uefi_ntfs_size == 0)
 | 
				
			||||||
			return FALSE;
 | 
								return FALSE;
 | 
				
			||||||
| 
						 | 
					@ -1045,7 +1044,7 @@ BOOL CreatePartition(HANDLE hDrive, int partition_style, int file_system, BOOL m
 | 
				
			||||||
	// Compute the start offset of our first partition
 | 
						// Compute the start offset of our first partition
 | 
				
			||||||
	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...
 | 
				
			||||||
		DriveLayoutEx.PartitionEntry[pn].StartingOffset.QuadPart = 1024*1024;
 | 
							DriveLayoutEx.PartitionEntry[pn].StartingOffset.QuadPart = MB;
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		// Align on Cylinder
 | 
							// Align on Cylinder
 | 
				
			||||||
		DriveLayoutEx.PartitionEntry[pn].StartingOffset.QuadPart = bytes_per_track;
 | 
							DriveLayoutEx.PartitionEntry[pn].StartingOffset.QuadPart = bytes_per_track;
 | 
				
			||||||
| 
						 | 
					@ -1054,7 +1053,7 @@ BOOL CreatePartition(HANDLE hDrive, int partition_style, int file_system, BOOL m
 | 
				
			||||||
	// If required, set the MSR partition (GPT only - must be created before the data part)
 | 
						// If required, set the MSR partition (GPT only - must be created before the data part)
 | 
				
			||||||
	if ((partition_style == PARTITION_STYLE_GPT) && (extra_partitions & XP_MSR)) {
 | 
						if ((partition_style == PARTITION_STYLE_GPT) && (extra_partitions & XP_MSR)) {
 | 
				
			||||||
		uprintf("Adding MSR partition");
 | 
							uprintf("Adding MSR partition");
 | 
				
			||||||
		DriveLayoutEx.PartitionEntry[pn].PartitionLength.QuadPart = 128*1024*1024;
 | 
							DriveLayoutEx.PartitionEntry[pn].PartitionLength.QuadPart = 128*MB;
 | 
				
			||||||
		DriveLayoutEx.PartitionEntry[pn].Gpt.PartitionType = PARTITION_MSFT_RESERVED_GUID;
 | 
							DriveLayoutEx.PartitionEntry[pn].Gpt.PartitionType = PARTITION_MSFT_RESERVED_GUID;
 | 
				
			||||||
		IGNORE_RETVAL(CoCreateGuid(&DriveLayoutEx.PartitionEntry[pn].Gpt.PartitionId));
 | 
							IGNORE_RETVAL(CoCreateGuid(&DriveLayoutEx.PartitionEntry[pn].Gpt.PartitionId));
 | 
				
			||||||
		// coverity[strcpy_overrun]
 | 
							// coverity[strcpy_overrun]
 | 
				
			||||||
| 
						 | 
					@ -1065,7 +1064,7 @@ BOOL CreatePartition(HANDLE hDrive, int partition_style, int file_system, BOOL m
 | 
				
			||||||
			bufsize = 65536;	// 64K should be enough for everyone
 | 
								bufsize = 65536;	// 64K should be enough for everyone
 | 
				
			||||||
			buffer = calloc(bufsize, 1);
 | 
								buffer = calloc(bufsize, 1);
 | 
				
			||||||
			if (buffer != NULL) {
 | 
								if (buffer != NULL) {
 | 
				
			||||||
				if ((!WriteFile(hDrive, buffer, bufsize, &size, NULL)) || (size != bufsize))
 | 
									if (!WriteFileWithRetry(hDrive, buffer, bufsize, &size, WRITE_RETRIES))
 | 
				
			||||||
					uprintf("  Could not zero MSR: %s", WindowsErrorString());
 | 
										uprintf("  Could not zero MSR: %s", WindowsErrorString());
 | 
				
			||||||
				free(buffer);
 | 
									free(buffer);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
| 
						 | 
					@ -1090,11 +1089,11 @@ BOOL CreatePartition(HANDLE hDrive, int partition_style, int file_system, BOOL m
 | 
				
			||||||
			// The size of the EFI partition depends on the minimum size we're able to format in FAT32,
 | 
								// The size of the EFI partition depends on the minimum size we're able to format in FAT32,
 | 
				
			||||||
			// which in turn depends on the cluster size used, which in turn depends on the disk sector size.
 | 
								// which in turn depends on the cluster size used, which in turn depends on the disk sector size.
 | 
				
			||||||
			if (SelectedDrive.Geometry.BytesPerSector <= 1024)
 | 
								if (SelectedDrive.Geometry.BytesPerSector <= 1024)
 | 
				
			||||||
				ms_efi_size = 100*1024*1024;
 | 
									ms_efi_size = 100*MB;
 | 
				
			||||||
			else if (SelectedDrive.Geometry.BytesPerSector <= 4096)
 | 
								else if (SelectedDrive.Geometry.BytesPerSector <= 4096)
 | 
				
			||||||
				ms_efi_size = 300*1024*1024;
 | 
									ms_efi_size = 300*MB;
 | 
				
			||||||
			else
 | 
								else
 | 
				
			||||||
				ms_efi_size = 1200*1024*1024;	// That'll teach you to have a nonstandard disk!
 | 
									ms_efi_size = 1200*MB;	// That'll teach you to have a nonstandard disk!
 | 
				
			||||||
			extra_part_size_in_tracks = (ms_efi_size + bytes_per_track - 1) / bytes_per_track;
 | 
								extra_part_size_in_tracks = (ms_efi_size + bytes_per_track - 1) / bytes_per_track;
 | 
				
			||||||
		} else if (extra_partitions & XP_UEFI_NTFS)
 | 
							} else if (extra_partitions & XP_UEFI_NTFS)
 | 
				
			||||||
			extra_part_size_in_tracks = (MIN_EXTRA_PART_SIZE + bytes_per_track - 1) / bytes_per_track;
 | 
								extra_part_size_in_tracks = (MIN_EXTRA_PART_SIZE + bytes_per_track - 1) / bytes_per_track;
 | 
				
			||||||
| 
						 | 
					@ -1165,12 +1164,8 @@ BOOL CreatePartition(HANDLE hDrive, int partition_style, int file_system, BOOL m
 | 
				
			||||||
				uprintf("Could not access uefi-ntfs.img");
 | 
									uprintf("Could not access uefi-ntfs.img");
 | 
				
			||||||
				return FALSE;
 | 
									return FALSE;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			r = WriteFile(hDrive, buffer, bufsize, &size, NULL);
 | 
								if(!WriteFileWithRetry(hDrive, buffer, bufsize, &size, WRITE_RETRIES)) {
 | 
				
			||||||
			if ((!r) || (size != bufsize)) {
 | 
									uprintf("Write error: %s", WindowsErrorString());
 | 
				
			||||||
				if (!r)
 | 
					 | 
				
			||||||
					uprintf("Write error: %s", WindowsErrorString());
 | 
					 | 
				
			||||||
				else
 | 
					 | 
				
			||||||
					uprintf("Write error: Wrote %d bytes, expected %d bytes\n", size, bufsize);
 | 
					 | 
				
			||||||
				return FALSE;
 | 
									return FALSE;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					@ -1191,7 +1186,7 @@ BOOL CreatePartition(HANDLE hDrive, int partition_style, int file_system, BOOL m
 | 
				
			||||||
		// This helps us reselect the partition scheme option that was used when creating the
 | 
							// This helps us reselect the partition scheme option that was used when creating the
 | 
				
			||||||
		// drive in Rufus. As far as I can tell, Windows doesn't care much if this signature
 | 
							// drive in Rufus. As far as I can tell, Windows doesn't care much if this signature
 | 
				
			||||||
		// isn't unique for USB drives.
 | 
							// isn't unique for USB drives.
 | 
				
			||||||
		CreateDisk.Mbr.Signature = mbr_uefi_marker?MBR_UEFI_MARKER:GetTickCount();
 | 
							CreateDisk.Mbr.Signature = mbr_uefi_marker?MBR_UEFI_MARKER:(DWORD)_GetTickCount64();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		DriveLayoutEx.PartitionStyle = PARTITION_STYLE_MBR;
 | 
							DriveLayoutEx.PartitionStyle = PARTITION_STYLE_MBR;
 | 
				
			||||||
		DriveLayoutEx.PartitionCount = 4;	// Must be multiple of 4 for MBR
 | 
							DriveLayoutEx.PartitionCount = 4;	// Must be multiple of 4 for MBR
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										28
									
								
								src/drive.h
									
										
									
									
									
								
							
							
						
						
									
										28
									
								
								src/drive.h
									
										
									
									
									
								
							| 
						 | 
					@ -1,7 +1,7 @@
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Rufus: The Reliable USB Formatting Utility
 | 
					 * Rufus: The Reliable USB Formatting Utility
 | 
				
			||||||
 * Drive access function calls
 | 
					 * Drive access function calls
 | 
				
			||||||
 * Copyright © 2011-2014 Pete Batard <pete@akeo.ie>
 | 
					 * Copyright © 2011-2016 Pete Batard <pete@akeo.ie>
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * This program is free software: you can redistribute it and/or modify
 | 
					 * This program is free software: you can redistribute it and/or modify
 | 
				
			||||||
 * it under the terms of the GNU General Public License as published by
 | 
					 * it under the terms of the GNU General Public License as published by
 | 
				
			||||||
| 
						 | 
					@ -19,6 +19,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <windows.h>
 | 
					#include <windows.h>
 | 
				
			||||||
#include <stdint.h>
 | 
					#include <stdint.h>
 | 
				
			||||||
 | 
					#include <winioctl.h>				// for DISK_GEOMETRY
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#pragma once
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -48,6 +49,31 @@ typedef struct {
 | 
				
			||||||
	DISK_EXTENT Extents[8];
 | 
						DISK_EXTENT Extents[8];
 | 
				
			||||||
} VOLUME_DISK_EXTENTS_REDEF;
 | 
					} VOLUME_DISK_EXTENTS_REDEF;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static __inline BOOL UnlockDrive(HANDLE hDrive) {
 | 
				
			||||||
 | 
						DWORD size;
 | 
				
			||||||
 | 
						return DeviceIoControl(hDrive, FSCTL_UNLOCK_VOLUME, NULL, 0, NULL, 0, &size, NULL);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#define safe_unlockclose(h) do {if ((h != INVALID_HANDLE_VALUE) && (h != NULL)) {UnlockDrive(h); CloseHandle(h); h = INVALID_HANDLE_VALUE;}} while(0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Current drive info */
 | 
				
			||||||
 | 
					typedef struct {
 | 
				
			||||||
 | 
						DWORD DeviceNumber;
 | 
				
			||||||
 | 
						LONGLONG DiskSize;
 | 
				
			||||||
 | 
						DISK_GEOMETRY Geometry;
 | 
				
			||||||
 | 
						DWORD FirstSector;
 | 
				
			||||||
 | 
						char proposed_label[16];
 | 
				
			||||||
 | 
						int PartitionType;
 | 
				
			||||||
 | 
						int nPartitions;	// number of partitions we actually care about
 | 
				
			||||||
 | 
						int FSType;
 | 
				
			||||||
 | 
						BOOL has_protective_mbr;
 | 
				
			||||||
 | 
						BOOL has_mbr_uefi_marker;
 | 
				
			||||||
 | 
						struct {
 | 
				
			||||||
 | 
							ULONG Allowed;
 | 
				
			||||||
 | 
							ULONG Default;
 | 
				
			||||||
 | 
						} ClusterSize[FS_MAX];
 | 
				
			||||||
 | 
					} RUFUS_DRIVE_INFO;
 | 
				
			||||||
 | 
					extern RUFUS_DRIVE_INFO SelectedDrive;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
BOOL SetAutoMount(BOOL enable);
 | 
					BOOL SetAutoMount(BOOL enable);
 | 
				
			||||||
BOOL GetAutoMount(BOOL* enabled);
 | 
					BOOL GetAutoMount(BOOL* enabled);
 | 
				
			||||||
char* GetPhysicalName(DWORD DriveIndex);
 | 
					char* GetPhysicalName(DWORD DriveIndex);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										287
									
								
								src/format.c
									
										
									
									
									
								
							
							
						
						
									
										287
									
								
								src/format.c
									
										
									
									
									
								
							| 
						 | 
					@ -32,9 +32,12 @@
 | 
				
			||||||
#include <ctype.h>
 | 
					#include <ctype.h>
 | 
				
			||||||
#include <locale.h>
 | 
					#include <locale.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "msapi_utf8.h"
 | 
					 | 
				
			||||||
#include "rufus.h"
 | 
					#include "rufus.h"
 | 
				
			||||||
 | 
					#include "missing.h"
 | 
				
			||||||
#include "resource.h"
 | 
					#include "resource.h"
 | 
				
			||||||
 | 
					#include "msapi_utf8.h"
 | 
				
			||||||
 | 
					#include "localization.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "br.h"
 | 
					#include "br.h"
 | 
				
			||||||
#include "fat16.h"
 | 
					#include "fat16.h"
 | 
				
			||||||
#include "fat32.h"
 | 
					#include "fat32.h"
 | 
				
			||||||
| 
						 | 
					@ -44,7 +47,6 @@
 | 
				
			||||||
#include "drive.h"
 | 
					#include "drive.h"
 | 
				
			||||||
#include "format.h"
 | 
					#include "format.h"
 | 
				
			||||||
#include "badblocks.h"
 | 
					#include "badblocks.h"
 | 
				
			||||||
#include "localization.h"
 | 
					 | 
				
			||||||
#include "bled/bled.h"
 | 
					#include "bled/bled.h"
 | 
				
			||||||
#include "../res/grub/grub_version.h"
 | 
					#include "../res/grub/grub_version.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -53,7 +55,7 @@
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
DWORD FormatStatus;
 | 
					DWORD FormatStatus;
 | 
				
			||||||
badblocks_report report;
 | 
					badblocks_report report;
 | 
				
			||||||
static DWORD LastRefresh;
 | 
					static uint64_t LastRefresh;
 | 
				
			||||||
static float format_percent = 0.0f;
 | 
					static float format_percent = 0.0f;
 | 
				
			||||||
static int task_number = 0;
 | 
					static int task_number = 0;
 | 
				
			||||||
extern const int nb_steps[FS_MAX];
 | 
					extern const int nb_steps[FS_MAX];
 | 
				
			||||||
| 
						 | 
					@ -345,31 +347,20 @@ static DWORD GetVolumeID(void)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * This is the Microsoft calculation from FATGEN
 | 
					 * Proper computation of FAT size
 | 
				
			||||||
 *
 | 
					 * See: http://www.syslinux.org/archives/2016-February/024850.html
 | 
				
			||||||
 * DWORD RootDirSectors = 0;
 | 
					 * and subsequent replies.
 | 
				
			||||||
 * DWORD TmpVal1, TmpVal2, FATSz;
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * TmpVal1 = DskSize - (ReservedSecCnt + RootDirSectors);
 | 
					 | 
				
			||||||
 * TmpVal2 = (256 * SecPerClus) + NumFATs;
 | 
					 | 
				
			||||||
 * TmpVal2 = TmpVal2 / 2;
 | 
					 | 
				
			||||||
 * FATSz = (TmpVal1 + (TmpVal2 - 1)) / TmpVal2;
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * return( FatSz );
 | 
					 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
static DWORD GetFATSizeSectors(DWORD DskSize, DWORD ReservedSecCnt, DWORD SecPerClus, DWORD NumFATs, DWORD BytesPerSect)
 | 
					static DWORD GetFATSizeSectors(DWORD DskSize, DWORD ReservedSecCnt, DWORD SecPerClus, DWORD NumFATs, DWORD BytesPerSect)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	ULONGLONG Numerator, Denominator;
 | 
						ULONGLONG Numerator, Denominator;
 | 
				
			||||||
	ULONGLONG FatElementSize = 4;
 | 
						ULONGLONG FatElementSize = 4;
 | 
				
			||||||
 | 
						ULONGLONG ReservedClusCnt = 2;
 | 
				
			||||||
	ULONGLONG FatSz;
 | 
						ULONGLONG FatSz;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// This is based on
 | 
						Numerator = DskSize - ReservedSecCnt + ReservedClusCnt * SecPerClus;
 | 
				
			||||||
	// http://hjem.get2net.dk/rune_moeller_barnkob/filesystems/fat.html
 | 
						Denominator = SecPerClus * BytesPerSect / FatElementSize + NumFATs;
 | 
				
			||||||
	Numerator = FatElementSize * (DskSize - ReservedSecCnt);
 | 
						FatSz = Numerator / Denominator + 1;	// +1 to ensure we are rounded up
 | 
				
			||||||
	Denominator = (SecPerClus * BytesPerSect) + (FatElementSize * NumFATs);
 | 
					 | 
				
			||||||
	FatSz = Numerator / Denominator;
 | 
					 | 
				
			||||||
	// round up
 | 
					 | 
				
			||||||
	FatSz += 1;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return (DWORD)FatSz;
 | 
						return (DWORD)FatSz;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -621,8 +612,8 @@ static BOOL FormatFAT32(DWORD DriveIndex)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	format_percent = 0.0f;
 | 
						format_percent = 0.0f;
 | 
				
			||||||
	for (i=0; i<(SystemAreaSize+BurstSize-1); i+=BurstSize) {
 | 
						for (i=0; i<(SystemAreaSize+BurstSize-1); i+=BurstSize) {
 | 
				
			||||||
		if (GetTickCount() > LastRefresh + 25) {
 | 
							if (_GetTickCount64() > LastRefresh + MAX_REFRESH) {
 | 
				
			||||||
			LastRefresh = GetTickCount();
 | 
								LastRefresh = _GetTickCount64();
 | 
				
			||||||
			format_percent = (100.0f*i)/(1.0f*(SystemAreaSize+BurstSize));
 | 
								format_percent = (100.0f*i)/(1.0f*(SystemAreaSize+BurstSize));
 | 
				
			||||||
			PrintInfo(0, MSG_217, format_percent);
 | 
								PrintInfo(0, MSG_217, format_percent);
 | 
				
			||||||
			UpdateProgress(OP_FORMAT, format_percent);
 | 
								UpdateProgress(OP_FORMAT, format_percent);
 | 
				
			||||||
| 
						 | 
					@ -917,7 +908,7 @@ static BOOL WriteMBR(HANDLE hPhysicalDrive)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// What follows is really a case statement with complex conditions listed
 | 
						// What follows is really a case statement with complex conditions listed
 | 
				
			||||||
	// by order of preference
 | 
						// by order of preference
 | 
				
			||||||
	if (allow_dual_uefi_bios)
 | 
						if ((allow_dual_uefi_bios) && (tt == TT_BIOS))
 | 
				
			||||||
		goto windows_mbr;
 | 
							goto windows_mbr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Forced UEFI (by zeroing the MBR)
 | 
						// Forced UEFI (by zeroing the MBR)
 | 
				
			||||||
| 
						 | 
					@ -999,7 +990,7 @@ static BOOL WriteSBR(HANDLE hPhysicalDrive)
 | 
				
			||||||
	set_bytes_per_sector(SelectedDrive.Geometry.BytesPerSector);
 | 
						set_bytes_per_sector(SelectedDrive.Geometry.BytesPerSector);
 | 
				
			||||||
	// Ensure that we have sufficient space for the SBR
 | 
						// Ensure that we have sufficient space for the SBR
 | 
				
			||||||
	max_size = IsChecked(IDC_EXTRA_PARTITION) ?
 | 
						max_size = IsChecked(IDC_EXTRA_PARTITION) ?
 | 
				
			||||||
		(DWORD)(SelectedDrive.Geometry.BytesPerSector * SelectedDrive.Geometry.SectorsPerTrack) : 1024 * 1024;
 | 
							(DWORD)(SelectedDrive.Geometry.BytesPerSector * SelectedDrive.Geometry.SectorsPerTrack) : 1*MB;
 | 
				
			||||||
	max_size -= mbr_size;
 | 
						max_size -= mbr_size;
 | 
				
			||||||
	// Syslinux has precedence over Grub
 | 
						// Syslinux has precedence over Grub
 | 
				
			||||||
	if ((bt == BT_ISO) && (!HAS_SYSLINUX(img_report))) {
 | 
						if ((bt == BT_ISO) && (!HAS_SYSLINUX(img_report))) {
 | 
				
			||||||
| 
						 | 
					@ -1251,7 +1242,7 @@ static BOOL SetupWinPE(char drive_letter)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ((!WriteFile(handle, buf, size, &rw_size, NULL)) || (size != rw_size)) {
 | 
						if (!WriteFileWithRetry(handle, buf, size, &rw_size, WRITE_RETRIES)) {
 | 
				
			||||||
		uprintf("Could not write patched file: %s\n", WindowsErrorString());
 | 
							uprintf("Could not write patched file: %s\n", WindowsErrorString());
 | 
				
			||||||
		goto out;
 | 
							goto out;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -1273,7 +1264,7 @@ out:
 | 
				
			||||||
// incompatibilities from one version of Windows to the next.
 | 
					// incompatibilities from one version of Windows to the next.
 | 
				
			||||||
// Maybe when we use wimlib we'll review this, but for now just turn it off.
 | 
					// Maybe when we use wimlib we'll review this, but for now just turn it off.
 | 
				
			||||||
//#define SET_INTERNAL_DRIVES_OFFLINE
 | 
					//#define SET_INTERNAL_DRIVES_OFFLINE
 | 
				
			||||||
BOOL SetupWinToGo(const char* drive_name, BOOL use_ms_efi)
 | 
					static BOOL SetupWinToGo(const char* drive_name, BOOL use_ms_efi)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#ifdef SET_INTERNAL_DRIVES_OFFLINE
 | 
					#ifdef SET_INTERNAL_DRIVES_OFFLINE
 | 
				
			||||||
	static char san_policy_path[] = "?:\\san_policy.xml";
 | 
						static char san_policy_path[] = "?:\\san_policy.xml";
 | 
				
			||||||
| 
						 | 
					@ -1441,7 +1432,7 @@ static BOOL CALLBACK FormatPromptCallback(HWND hWnd, LPARAM lParam)
 | 
				
			||||||
 * disk in drive X: before you can use it'. You will also get that popup if you start a
 | 
					 * disk in drive X: before you can use it'. You will also get that popup if you start a
 | 
				
			||||||
 * bad blocks check and cancel it before it completes. We have to close that popup manually.
 | 
					 * bad blocks check and cancel it before it completes. We have to close that popup manually.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
DWORD WINAPI CloseFormatPromptThread(LPVOID param) {
 | 
					static DWORD WINAPI CloseFormatPromptThread(LPVOID param) {
 | 
				
			||||||
	HWND hFormatPrompt;
 | 
						HWND hFormatPrompt;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	while(format_op_in_progress) {
 | 
						while(format_op_in_progress) {
 | 
				
			||||||
| 
						 | 
					@ -1456,16 +1447,109 @@ DWORD WINAPI CloseFormatPromptThread(LPVOID param) {
 | 
				
			||||||
	ExitThread(0);
 | 
						ExitThread(0);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void update_progress(const uint64_t processed_bytes)
 | 
					static void update_progress(const uint64_t processed_bytes)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (GetTickCount() > LastRefresh + 25) {
 | 
						if (_GetTickCount64() > LastRefresh + MAX_REFRESH) {
 | 
				
			||||||
		LastRefresh = GetTickCount();
 | 
							LastRefresh = _GetTickCount64();
 | 
				
			||||||
		format_percent = (100.0f*processed_bytes)/(1.0f*img_report.projected_size);
 | 
							format_percent = (100.0f*processed_bytes)/(1.0f*img_report.projected_size);
 | 
				
			||||||
		PrintInfo(0, MSG_261, format_percent);
 | 
							PrintInfo(0, MSG_261, format_percent);
 | 
				
			||||||
		UpdateProgress(OP_FORMAT, format_percent);
 | 
							UpdateProgress(OP_FORMAT, format_percent);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Write an image file or zero a drive */
 | 
				
			||||||
 | 
					static BOOL WriteDrive(HANDLE hPhysicalDrive, HANDLE hSourceImage)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						const DWORD SectorSize = SelectedDrive.Geometry.BytesPerSector;
 | 
				
			||||||
 | 
						BOOL s, ret = FALSE;
 | 
				
			||||||
 | 
						LARGE_INTEGER li;
 | 
				
			||||||
 | 
						DWORD rSize, wSize, BufSize;
 | 
				
			||||||
 | 
						uint64_t wb, target_size = hSourceImage?img_report.projected_size:SelectedDrive.DiskSize;
 | 
				
			||||||
 | 
						uint8_t *buffer = NULL, *aligned_buffer;
 | 
				
			||||||
 | 
						int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// We poked the MBR and other stuff, so we need to rewind
 | 
				
			||||||
 | 
						li.QuadPart = 0;
 | 
				
			||||||
 | 
						if (!SetFilePointerEx(hPhysicalDrive, li, NULL, FILE_BEGIN))
 | 
				
			||||||
 | 
							uprintf("Warning: Unable to rewind image position - wrong data might be copied!");
 | 
				
			||||||
 | 
						LastRefresh = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (img_report.compression_type != BLED_COMPRESSION_NONE) {
 | 
				
			||||||
 | 
							uprintf("Writing Compressed Image...");
 | 
				
			||||||
 | 
							bled_init(_uprintf, update_progress, &FormatStatus);
 | 
				
			||||||
 | 
							bled_uncompress_with_handles(hSourceImage, hPhysicalDrive, img_report.compression_type);
 | 
				
			||||||
 | 
							bled_exit();
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							uprintf(hSourceImage?"Writing Image...":"Zeroing drive...");
 | 
				
			||||||
 | 
							// Our buffer size must be a multiple of the sector size
 | 
				
			||||||
 | 
							BufSize = ((DD_BUFFER_SIZE + SectorSize - 1) / SectorSize) * SectorSize;
 | 
				
			||||||
 | 
							buffer = (uint8_t*)calloc(BufSize + SectorSize, 1);	// +1 sector for align
 | 
				
			||||||
 | 
							if (buffer == NULL) {
 | 
				
			||||||
 | 
								FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | ERROR_NOT_ENOUGH_MEMORY;
 | 
				
			||||||
 | 
								uprintf("could not allocate disk write buffer");
 | 
				
			||||||
 | 
								goto out;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							// http://msdn.microsoft.com/en-us/library/windows/desktop/aa365747.aspx does buffer sector alignment
 | 
				
			||||||
 | 
							aligned_buffer = ((void *)((((uintptr_t)(buffer)) + (SectorSize)-1) & (~(((uintptr_t)(SectorSize)) - 1))));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Don't bother trying for something clever, using double buffering overlapped and whatnot:
 | 
				
			||||||
 | 
							// With Windows' default optimizations, sync read + sync write for sequential operations
 | 
				
			||||||
 | 
							// will be as fast, if not faster, than whatever async scheme you can come up with.
 | 
				
			||||||
 | 
							rSize = BufSize;
 | 
				
			||||||
 | 
							for (wb = 0, wSize = 0; wb < (uint64_t)SelectedDrive.DiskSize; wb += wSize) {
 | 
				
			||||||
 | 
								if (_GetTickCount64() > LastRefresh + MAX_REFRESH) {
 | 
				
			||||||
 | 
									LastRefresh = _GetTickCount64();
 | 
				
			||||||
 | 
									format_percent = (100.0f*wb) / (1.0f*target_size);
 | 
				
			||||||
 | 
									PrintInfo(0, hSourceImage?MSG_261:MSG_286, format_percent);
 | 
				
			||||||
 | 
									UpdateProgress(OP_FORMAT, format_percent);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (hSourceImage != NULL) {
 | 
				
			||||||
 | 
									s = ReadFile(hSourceImage, aligned_buffer, BufSize, &rSize, NULL);
 | 
				
			||||||
 | 
									if (!s) {
 | 
				
			||||||
 | 
										FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | ERROR_READ_FAULT;
 | 
				
			||||||
 | 
										uprintf("read error: %s", WindowsErrorString());
 | 
				
			||||||
 | 
										goto out;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									if (rSize == 0)
 | 
				
			||||||
 | 
										break;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								// Don't overflow our projected size (mostly for VHDs)
 | 
				
			||||||
 | 
								if (wb + rSize > target_size) {
 | 
				
			||||||
 | 
									rSize = (DWORD)(target_size - wb);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// WriteFile fails unless the size is a multiple of sector size
 | 
				
			||||||
 | 
								if (rSize % SectorSize != 0)
 | 
				
			||||||
 | 
									rSize = ((rSize + SectorSize - 1) / SectorSize) * SectorSize;
 | 
				
			||||||
 | 
								for (i = 0; i < WRITE_RETRIES; i++) {
 | 
				
			||||||
 | 
									CHECK_FOR_USER_CANCEL;
 | 
				
			||||||
 | 
									s = WriteFile(hPhysicalDrive, aligned_buffer, rSize, &wSize, NULL);
 | 
				
			||||||
 | 
									if ((s) && (wSize == rSize))
 | 
				
			||||||
 | 
										break;
 | 
				
			||||||
 | 
									if (s)
 | 
				
			||||||
 | 
										uprintf("write error: Wrote %d bytes, expected %d bytes\n", wSize, rSize);
 | 
				
			||||||
 | 
									else
 | 
				
			||||||
 | 
										uprintf("write error: %s", WindowsErrorString());
 | 
				
			||||||
 | 
									if (i < WRITE_RETRIES - 1) {
 | 
				
			||||||
 | 
										li.QuadPart = wb;
 | 
				
			||||||
 | 
										SetFilePointerEx(hPhysicalDrive, li, NULL, FILE_BEGIN);
 | 
				
			||||||
 | 
										uprintf("  RETRYING...\n");
 | 
				
			||||||
 | 
									} else {
 | 
				
			||||||
 | 
										FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | ERROR_WRITE_FAULT;
 | 
				
			||||||
 | 
										goto out;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if (i >= WRITE_RETRIES) goto out;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						RefreshDriveLayout(hPhysicalDrive);
 | 
				
			||||||
 | 
						ret = TRUE;
 | 
				
			||||||
 | 
					out:
 | 
				
			||||||
 | 
						safe_free(buffer);
 | 
				
			||||||
 | 
						return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Standalone thread for the formatting operation
 | 
					 * Standalone thread for the formatting operation
 | 
				
			||||||
 * According to http://msdn.microsoft.com/en-us/library/windows/desktop/aa364562.aspx
 | 
					 * According to http://msdn.microsoft.com/en-us/library/windows/desktop/aa364562.aspx
 | 
				
			||||||
| 
						 | 
					@ -1480,20 +1564,18 @@ void update_progress(const uint64_t processed_bytes)
 | 
				
			||||||
DWORD WINAPI FormatThread(void* param)
 | 
					DWORD WINAPI FormatThread(void* param)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int i, r, pt, tt, fs, bt;
 | 
						int i, r, pt, tt, fs, bt;
 | 
				
			||||||
	BOOL s, ret, use_large_fat32, windows_to_go;
 | 
						BOOL ret, use_large_fat32, windows_to_go;
 | 
				
			||||||
	const DWORD SectorSize = SelectedDrive.Geometry.BytesPerSector;
 | 
						const DWORD SectorSize = SelectedDrive.Geometry.BytesPerSector;
 | 
				
			||||||
	DWORD rSize, wSize, BufSize, DriveIndex = (DWORD)(uintptr_t)param;
 | 
						DWORD DriveIndex = (DWORD)(uintptr_t)param;
 | 
				
			||||||
	HANDLE hPhysicalDrive = INVALID_HANDLE_VALUE;
 | 
						HANDLE hPhysicalDrive = INVALID_HANDLE_VALUE;
 | 
				
			||||||
	HANDLE hLogicalVolume = INVALID_HANDLE_VALUE;
 | 
						HANDLE hLogicalVolume = INVALID_HANDLE_VALUE;
 | 
				
			||||||
	HANDLE hSourceImage = INVALID_HANDLE_VALUE;
 | 
						HANDLE hSourceImage = INVALID_HANDLE_VALUE;
 | 
				
			||||||
	SYSTEMTIME lt;
 | 
						SYSTEMTIME lt;
 | 
				
			||||||
	FILE* log_fd;
 | 
						FILE* log_fd;
 | 
				
			||||||
	LARGE_INTEGER li;
 | 
						uint8_t *buffer = NULL, extra_partitions = 0;
 | 
				
			||||||
	uint64_t wb;
 | 
					 | 
				
			||||||
	uint8_t *buffer = NULL, *aligned_buffer, extra_partitions = 0;
 | 
					 | 
				
			||||||
	char *bb_msg, *guid_volume = NULL;
 | 
						char *bb_msg, *guid_volume = NULL;
 | 
				
			||||||
	char drive_name[] = "?:\\";
 | 
						char drive_name[] = "?:\\";
 | 
				
			||||||
	char drive_letters[27];
 | 
						char drive_letters[27], fs_type[32];
 | 
				
			||||||
	char logfile[MAX_PATH], *userdir;
 | 
						char logfile[MAX_PATH], *userdir;
 | 
				
			||||||
	char efi_dst[] = "?:\\efi\\boot\\bootx64.efi";
 | 
						char efi_dst[] = "?:\\efi\\boot\\bootx64.efi";
 | 
				
			||||||
	char kolibri_dst[] = "?:\\MTLD_F32";
 | 
						char kolibri_dst[] = "?:\\MTLD_F32";
 | 
				
			||||||
| 
						 | 
					@ -1595,57 +1677,8 @@ DWORD WINAPI FormatThread(void* param)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	CreateThread(NULL, 0, CloseFormatPromptThread, NULL, 0, NULL);
 | 
						CreateThread(NULL, 0, CloseFormatPromptThread, NULL, 0, NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// TODO: factorize this with DD write?
 | 
					 | 
				
			||||||
	if (zero_drive) {
 | 
						if (zero_drive) {
 | 
				
			||||||
		li.QuadPart = 0;
 | 
							WriteDrive(hPhysicalDrive, NULL);
 | 
				
			||||||
		SetFilePointerEx(hPhysicalDrive, li, NULL, FILE_BEGIN);
 | 
					 | 
				
			||||||
		uprintf("Zeroing drive...");
 | 
					 | 
				
			||||||
		// Our buffer size must be a multiple of the sector size
 | 
					 | 
				
			||||||
		BufSize = ((DD_BUFFER_SIZE + SectorSize - 1) / SectorSize) * SectorSize;
 | 
					 | 
				
			||||||
		buffer = (uint8_t*)calloc(BufSize + SectorSize, 1);	// +1 sector for align
 | 
					 | 
				
			||||||
		if (buffer == NULL) {
 | 
					 | 
				
			||||||
			FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | ERROR_NOT_ENOUGH_MEMORY;
 | 
					 | 
				
			||||||
			uprintf("could not allocate zeroing buffer");
 | 
					 | 
				
			||||||
			goto out;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		// http://msdn.microsoft.com/en-us/library/windows/desktop/aa365747.aspx does buffer sector alignment
 | 
					 | 
				
			||||||
		aligned_buffer = ((void *)((((uintptr_t)(buffer)) + (SectorSize)-1) & (~(((uintptr_t)(SectorSize)) - 1))));
 | 
					 | 
				
			||||||
		for (wb = 0, wSize = 0; wb < (uint64_t)SelectedDrive.DiskSize; wb += wSize) {
 | 
					 | 
				
			||||||
			if (GetTickCount() > LastRefresh + 25) {
 | 
					 | 
				
			||||||
				LastRefresh = GetTickCount();
 | 
					 | 
				
			||||||
				format_percent = (100.0f*wb) / (1.0f*SelectedDrive.DiskSize);
 | 
					 | 
				
			||||||
				PrintInfo(0, MSG_286, format_percent);
 | 
					 | 
				
			||||||
				UpdateProgress(OP_FORMAT, format_percent);
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			// Don't overflow our projected size
 | 
					 | 
				
			||||||
			if (wb + BufSize > (uint64_t)SelectedDrive.DiskSize) {
 | 
					 | 
				
			||||||
				BufSize = (DWORD)(SelectedDrive.DiskSize - wb);
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			// WriteFile fails unless the size is a multiple of sector size
 | 
					 | 
				
			||||||
			if (BufSize % SectorSize != 0)
 | 
					 | 
				
			||||||
				BufSize = ((BufSize + SectorSize - 1) / SectorSize) * SectorSize;
 | 
					 | 
				
			||||||
			for (i = 0; i < WRITE_RETRIES; i++) {
 | 
					 | 
				
			||||||
				CHECK_FOR_USER_CANCEL;
 | 
					 | 
				
			||||||
				s = WriteFile(hPhysicalDrive, aligned_buffer, BufSize, &wSize, NULL);
 | 
					 | 
				
			||||||
				if ((s) && (wSize == BufSize))
 | 
					 | 
				
			||||||
					break;
 | 
					 | 
				
			||||||
				if (s)
 | 
					 | 
				
			||||||
					uprintf("write error: Wrote %d bytes, expected %d bytes\n", wSize, BufSize);
 | 
					 | 
				
			||||||
				else
 | 
					 | 
				
			||||||
					uprintf("write error: %s", WindowsErrorString());
 | 
					 | 
				
			||||||
				if (i < WRITE_RETRIES - 1) {
 | 
					 | 
				
			||||||
					li.QuadPart = wb;
 | 
					 | 
				
			||||||
					SetFilePointerEx(hPhysicalDrive, li, NULL, FILE_BEGIN);
 | 
					 | 
				
			||||||
					uprintf("  RETRYING...\n");
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				else {
 | 
					 | 
				
			||||||
					FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | ERROR_WRITE_FAULT;
 | 
					 | 
				
			||||||
					goto out;
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if (i >= WRITE_RETRIES) goto out;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		RefreshDriveLayout(hPhysicalDrive);
 | 
					 | 
				
			||||||
		goto out;
 | 
							goto out;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1716,11 +1749,6 @@ DWORD WINAPI FormatThread(void* param)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Write an image file
 | 
						// Write an image file
 | 
				
			||||||
	if (IsChecked(IDC_BOOT) && (bt == BT_IMG)) {
 | 
						if (IsChecked(IDC_BOOT) && (bt == BT_IMG)) {
 | 
				
			||||||
		char fs_type[32];
 | 
					 | 
				
			||||||
		// We poked the MBR and other stuff, so we need to rewind
 | 
					 | 
				
			||||||
		li.QuadPart = 0;
 | 
					 | 
				
			||||||
		if (!SetFilePointerEx(hPhysicalDrive, li, NULL, FILE_BEGIN))
 | 
					 | 
				
			||||||
			uprintf("Warning: Unable to rewind image position - wrong data might be copied!");
 | 
					 | 
				
			||||||
		hSourceImage = CreateFileU(image_path, GENERIC_READ, FILE_SHARE_READ, NULL,
 | 
							hSourceImage = CreateFileU(image_path, GENERIC_READ, FILE_SHARE_READ, NULL,
 | 
				
			||||||
			OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
 | 
								OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
 | 
				
			||||||
		if (hSourceImage == INVALID_HANDLE_VALUE) {
 | 
							if (hSourceImage == INVALID_HANDLE_VALUE) {
 | 
				
			||||||
| 
						 | 
					@ -1728,75 +1756,10 @@ DWORD WINAPI FormatThread(void* param)
 | 
				
			||||||
			FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_OPEN_FAILED;
 | 
								FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_OPEN_FAILED;
 | 
				
			||||||
			goto out;
 | 
								goto out;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		LastRefresh = 0;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (img_report.compression_type != BLED_COMPRESSION_NONE) {
 | 
							WriteDrive(hPhysicalDrive, hSourceImage);
 | 
				
			||||||
			uprintf("Writing Compressed Image...");
 | 
					 | 
				
			||||||
			bled_init(_uprintf, update_progress, &FormatStatus);
 | 
					 | 
				
			||||||
			bled_uncompress_with_handles(hSourceImage, hPhysicalDrive, img_report.compression_type);
 | 
					 | 
				
			||||||
			bled_exit();
 | 
					 | 
				
			||||||
		} else {
 | 
					 | 
				
			||||||
			uprintf("Writing Image...");
 | 
					 | 
				
			||||||
			// Our buffer size must be a multiple of the sector size
 | 
					 | 
				
			||||||
			BufSize = ((DD_BUFFER_SIZE + SectorSize - 1) / SectorSize) * SectorSize;
 | 
					 | 
				
			||||||
			buffer = (uint8_t*)malloc(BufSize + SectorSize);	// +1 sector for align
 | 
					 | 
				
			||||||
			if (buffer == NULL) {
 | 
					 | 
				
			||||||
				FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_NOT_ENOUGH_MEMORY;
 | 
					 | 
				
			||||||
				uprintf("could not allocate DD buffer");
 | 
					 | 
				
			||||||
				goto out;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			// http://msdn.microsoft.com/en-us/library/windows/desktop/aa365747.aspx does buffer sector alignment
 | 
					 | 
				
			||||||
			aligned_buffer = ((void *) ((((uintptr_t)(buffer)) + (SectorSize) - 1) & (~(((uintptr_t)(SectorSize)) - 1))));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// Don't bother trying for something clever, using double buffering overlapped and whatnot:
 | 
					 | 
				
			||||||
			// With Windows' default optimizations, sync read + sync write for sequential operations
 | 
					 | 
				
			||||||
			// will be as fast, if not faster, than whatever async scheme you can come up with.
 | 
					 | 
				
			||||||
			for (wb = 0, wSize = 0; ; wb += wSize) {
 | 
					 | 
				
			||||||
				s = ReadFile(hSourceImage, aligned_buffer, BufSize, &rSize, NULL);
 | 
					 | 
				
			||||||
				if (!s) {
 | 
					 | 
				
			||||||
					FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_READ_FAULT;
 | 
					 | 
				
			||||||
					uprintf("read error: %s", WindowsErrorString());
 | 
					 | 
				
			||||||
					goto out;
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				if (rSize == 0)
 | 
					 | 
				
			||||||
					break;
 | 
					 | 
				
			||||||
				if (GetTickCount() > LastRefresh + 25) {
 | 
					 | 
				
			||||||
					LastRefresh = GetTickCount();
 | 
					 | 
				
			||||||
					format_percent = (100.0f*wb)/(1.0f*img_report.projected_size);
 | 
					 | 
				
			||||||
					PrintInfo(0, MSG_261, format_percent);
 | 
					 | 
				
			||||||
					UpdateProgress(OP_FORMAT, format_percent);
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				// Don't overflow our projected size (mostly for VHDs)
 | 
					 | 
				
			||||||
				if (wb + rSize > img_report.projected_size) {
 | 
					 | 
				
			||||||
					rSize = (DWORD)(img_report.projected_size - wb);
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				// WriteFile fails unless the size is a multiple of sector size
 | 
					 | 
				
			||||||
				if (rSize % SectorSize != 0)
 | 
					 | 
				
			||||||
					rSize = ((rSize + SectorSize -1) / SectorSize) * SectorSize;
 | 
					 | 
				
			||||||
				for (i=0; i < WRITE_RETRIES; i++) {
 | 
					 | 
				
			||||||
					CHECK_FOR_USER_CANCEL;
 | 
					 | 
				
			||||||
					s = WriteFile(hPhysicalDrive, aligned_buffer, rSize, &wSize, NULL);
 | 
					 | 
				
			||||||
					if ((s) && (wSize == rSize))
 | 
					 | 
				
			||||||
						break;
 | 
					 | 
				
			||||||
					if (s)
 | 
					 | 
				
			||||||
						uprintf("write error: Wrote %d bytes, expected %d bytes\n", wSize, rSize);
 | 
					 | 
				
			||||||
					else
 | 
					 | 
				
			||||||
						uprintf("write error: %s", WindowsErrorString());
 | 
					 | 
				
			||||||
					if (i < WRITE_RETRIES-1) {
 | 
					 | 
				
			||||||
						li.QuadPart = wb;
 | 
					 | 
				
			||||||
						SetFilePointerEx(hPhysicalDrive, li, NULL, FILE_BEGIN);
 | 
					 | 
				
			||||||
						uprintf("  RETRYING...\n");
 | 
					 | 
				
			||||||
					} else {
 | 
					 | 
				
			||||||
						FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_WRITE_FAULT;
 | 
					 | 
				
			||||||
						goto out;
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				if (i >= WRITE_RETRIES) goto out;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// If the image contains a partition we might be able to access, try to re-mount it
 | 
							// If the image contains a partition we might be able to access, try to re-mount it
 | 
				
			||||||
		RefreshDriveLayout(hPhysicalDrive);
 | 
					 | 
				
			||||||
		safe_unlockclose(hPhysicalDrive);
 | 
							safe_unlockclose(hPhysicalDrive);
 | 
				
			||||||
		safe_unlockclose(hLogicalVolume);
 | 
							safe_unlockclose(hLogicalVolume);
 | 
				
			||||||
		Sleep(200);
 | 
							Sleep(200);
 | 
				
			||||||
| 
						 | 
					@ -1806,8 +1769,6 @@ DWORD WINAPI FormatThread(void* param)
 | 
				
			||||||
			if ((guid_volume != NULL) && (MountVolume(drive_name, guid_volume)))
 | 
								if ((guid_volume != NULL) && (MountVolume(drive_name, guid_volume)))
 | 
				
			||||||
				uprintf("Remounted %s on %s\n", guid_volume, drive_name);
 | 
									uprintf("Remounted %s on %s\n", guid_volume, drive_name);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					 | 
				
			||||||
		uprintf("Done");
 | 
					 | 
				
			||||||
		goto out;
 | 
							goto out;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1883,7 +1844,7 @@ DWORD WINAPI FormatThread(void* param)
 | 
				
			||||||
		} else if (tt == TT_UEFI) {
 | 
							} else if (tt == TT_UEFI) {
 | 
				
			||||||
			// For once, no need to do anything - just check our sanity
 | 
								// For once, no need to do anything - just check our sanity
 | 
				
			||||||
			if ( (bt != BT_ISO) || (!img_report.has_efi) || (fs > FS_NTFS) ) {
 | 
								if ( (bt != BT_ISO) || (!img_report.has_efi) || (fs > FS_NTFS) ) {
 | 
				
			||||||
				uprintf("Spock gone crazy error!\n");
 | 
									uprintf("Spock gone crazy error in %s:%d", __FILE__, __LINE__);
 | 
				
			||||||
				FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_INSTALL_FAILURE;
 | 
									FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_INSTALL_FAILURE;
 | 
				
			||||||
				goto out;
 | 
									goto out;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
| 
						 | 
					@ -2082,8 +2043,8 @@ DWORD WINAPI SaveImageThread(void* param)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if (rSize == 0)
 | 
							if (rSize == 0)
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
		if (GetTickCount() > LastRefresh + 25) {
 | 
							if (_GetTickCount64() > LastRefresh + MAX_REFRESH) {
 | 
				
			||||||
			LastRefresh = GetTickCount();
 | 
								LastRefresh = _GetTickCount64();
 | 
				
			||||||
			format_percent = (100.0f*wb)/(1.0f*SelectedDrive.DiskSize);
 | 
								format_percent = (100.0f*wb)/(1.0f*SelectedDrive.DiskSize);
 | 
				
			||||||
			PrintInfo(0, MSG_261, format_percent);
 | 
								PrintInfo(0, MSG_261, format_percent);
 | 
				
			||||||
			UpdateProgress(OP_FORMAT, format_percent);
 | 
								UpdateProgress(OP_FORMAT, format_percent);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										32
									
								
								src/icon.c
									
										
									
									
									
								
							
							
						
						
									
										32
									
								
								src/icon.c
									
										
									
									
									
								
							| 
						 | 
					@ -1,7 +1,7 @@
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Rufus: The Reliable USB Formatting Utility
 | 
					 * Rufus: The Reliable USB Formatting Utility
 | 
				
			||||||
 * Extract icon from executable and set autorun.inf
 | 
					 * Extract icon from executable and set autorun.inf
 | 
				
			||||||
 * Copyright © 2012-2013 Pete Batard <pete@akeo.ie>
 | 
					 * Copyright © 2012-2016 Pete Batard <pete@akeo.ie>
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * This program is free software: you can redistribute it and/or modify
 | 
					 * This program is free software: you can redistribute it and/or modify
 | 
				
			||||||
 * it under the terms of the GNU General Public License as published by
 | 
					 * it under the terms of the GNU General Public License as published by
 | 
				
			||||||
| 
						 | 
					@ -27,9 +27,10 @@
 | 
				
			||||||
#include <stdio.h>
 | 
					#include <stdio.h>
 | 
				
			||||||
#include <string.h>
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "msapi_utf8.h"
 | 
					 | 
				
			||||||
#include "rufus.h"
 | 
					#include "rufus.h"
 | 
				
			||||||
 | 
					#include "missing.h"
 | 
				
			||||||
#include "resource.h"
 | 
					#include "resource.h"
 | 
				
			||||||
 | 
					#include "msapi_utf8.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#pragma pack(push)
 | 
					#pragma pack(push)
 | 
				
			||||||
#pragma pack(2)
 | 
					#pragma pack(2)
 | 
				
			||||||
| 
						 | 
					@ -103,13 +104,13 @@ static BOOL SaveIcon(const char* filename)
 | 
				
			||||||
	hFile = CreateFileA(filename, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE,
 | 
						hFile = CreateFileA(filename, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE,
 | 
				
			||||||
			NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
 | 
								NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
 | 
				
			||||||
	if (hFile == INVALID_HANDLE_VALUE) {
 | 
						if (hFile == INVALID_HANDLE_VALUE) {
 | 
				
			||||||
		uprintf("Unable to create icon '%s': %s.\n", filename, WindowsErrorString());
 | 
							uprintf("Unable to create icon '%s': %s.", filename, WindowsErrorString());
 | 
				
			||||||
		goto out;
 | 
							goto out;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Write .ico header
 | 
						// Write .ico header
 | 
				
			||||||
	if ((!WriteFile(hFile, icondir, 3*sizeof(WORD), &Size, NULL)) || (Size != 3*sizeof(WORD))) {
 | 
						if (!WriteFileWithRetry(hFile, icondir, 3*sizeof(WORD), &Size, WRITE_RETRIES)) {
 | 
				
			||||||
		uprintf("Couldn't write icon header: %s.\n", WindowsErrorString());
 | 
							uprintf("Could not write icon header: %s.", WindowsErrorString());
 | 
				
			||||||
		goto out;
 | 
							goto out;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -117,15 +118,14 @@ static BOOL SaveIcon(const char* filename)
 | 
				
			||||||
	offset = 3*sizeof(WORD) + icondir->idCount*sizeof(ICONDIRENTRY);
 | 
						offset = 3*sizeof(WORD) + icondir->idCount*sizeof(ICONDIRENTRY);
 | 
				
			||||||
	for (i=0; i<icondir->idCount; i++) {
 | 
						for (i=0; i<icondir->idCount; i++) {
 | 
				
			||||||
		// Write the common part of ICONDIRENTRY
 | 
							// Write the common part of ICONDIRENTRY
 | 
				
			||||||
		if ( (!WriteFile(hFile, &icondir->idEntries[i], sizeof(GRPICONDIRENTRY)-sizeof(WORD), &Size, NULL))
 | 
							if (!WriteFileWithRetry(hFile, &icondir->idEntries[i], sizeof(GRPICONDIRENTRY)-sizeof(WORD), &Size, WRITE_RETRIES)) {
 | 
				
			||||||
		   || (Size != sizeof(GRPICONDIRENTRY)-sizeof(WORD)) ) {
 | 
								uprintf("Could not write ICONDIRENTRY[%d]: %s.", i, WindowsErrorString());
 | 
				
			||||||
			uprintf("Couldn't write ICONDIRENTRY[%d]: %s.\n", i, WindowsErrorString());
 | 
					 | 
				
			||||||
			goto out;
 | 
								goto out;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		res = FindResourceA(hMainInstance, MAKEINTRESOURCEA(icondir->idEntries[i].nID), _RT_ICON);
 | 
							res = FindResourceA(hMainInstance, MAKEINTRESOURCEA(icondir->idEntries[i].nID), _RT_ICON);
 | 
				
			||||||
		// Write the DWORD offset
 | 
							// Write the DWORD offset
 | 
				
			||||||
		if ( (!WriteFile(hFile, &offset, sizeof(offset), &Size, NULL)) || (Size != sizeof(offset)) ) {
 | 
							if (!WriteFileWithRetry(hFile, &offset, sizeof(offset), &Size, WRITE_RETRIES)) {
 | 
				
			||||||
			uprintf("Couldn't write ICONDIRENTRY[%d] offset: %s.\n", i, WindowsErrorString());
 | 
								uprintf("Could not write ICONDIRENTRY[%d] offset: %s.", i, WindowsErrorString());
 | 
				
			||||||
			goto out;
 | 
								goto out;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		offset += SizeofResource(NULL, res);
 | 
							offset += SizeofResource(NULL, res);
 | 
				
			||||||
| 
						 | 
					@ -136,12 +136,12 @@ static BOOL SaveIcon(const char* filename)
 | 
				
			||||||
		res_handle = LoadResource(NULL, res);
 | 
							res_handle = LoadResource(NULL, res);
 | 
				
			||||||
		res_data = (BYTE*)LockResource(res_handle);
 | 
							res_data = (BYTE*)LockResource(res_handle);
 | 
				
			||||||
		res_size = SizeofResource(NULL, res);
 | 
							res_size = SizeofResource(NULL, res);
 | 
				
			||||||
		if ( (!WriteFile(hFile, res_data, res_size, &Size, NULL)) || (Size != res_size) ) {
 | 
							if (!WriteFileWithRetry(hFile, res_data, res_size, &Size, WRITE_RETRIES)) {
 | 
				
			||||||
			uprintf("Couldn't write icon data #%d: %s.\n", i, WindowsErrorString());
 | 
								uprintf("Could not write icon data #%d: %s.", i, WindowsErrorString());
 | 
				
			||||||
			goto out;
 | 
								goto out;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	uprintf("Created: %s\n", filename);
 | 
						uprintf("Created: %s", filename);
 | 
				
			||||||
	r = TRUE;
 | 
						r = TRUE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
out:
 | 
					out:
 | 
				
			||||||
| 
						 | 
					@ -163,14 +163,14 @@ BOOL SetAutorun(const char* path)
 | 
				
			||||||
	safe_sprintf(filename, sizeof(filename), "%sautorun.inf", path);
 | 
						safe_sprintf(filename, sizeof(filename), "%sautorun.inf", path);
 | 
				
			||||||
	fd = fopen(filename, "r");	// If there's an existing autorun, don't overwrite
 | 
						fd = fopen(filename, "r");	// If there's an existing autorun, don't overwrite
 | 
				
			||||||
	if (fd != NULL) {
 | 
						if (fd != NULL) {
 | 
				
			||||||
		uprintf("%s already exists - keeping it\n", filename);
 | 
							uprintf("%s already exists - keeping it", filename);
 | 
				
			||||||
		fclose(fd);
 | 
							fclose(fd);
 | 
				
			||||||
		return FALSE;
 | 
							return FALSE;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	// No "/autorun.inf" => create a new one in UTF-16 LE mode
 | 
						// No "/autorun.inf" => create a new one in UTF-16 LE mode
 | 
				
			||||||
	fd = fopen(filename, "w, ccs=UTF-16LE");
 | 
						fd = fopen(filename, "w, ccs=UTF-16LE");
 | 
				
			||||||
	if (fd == NULL) {
 | 
						if (fd == NULL) {
 | 
				
			||||||
		uprintf("Unable to create %s\n", filename);
 | 
							uprintf("Unable to create %s", filename);
 | 
				
			||||||
		uprintf("NOTE: This may be caused by a poorly designed security solution. "
 | 
							uprintf("NOTE: This may be caused by a poorly designed security solution. "
 | 
				
			||||||
			"See http://rufus.akeo.ie/compatibility.");
 | 
								"See http://rufus.akeo.ie/compatibility.");
 | 
				
			||||||
		return FALSE;
 | 
							return FALSE;
 | 
				
			||||||
| 
						 | 
					@ -181,7 +181,7 @@ BOOL SetAutorun(const char* path)
 | 
				
			||||||
	fwprintf(fd, L"; Created by %s\n; " LTEXT(RUFUS_URL) L"\n", wRufusVersion);
 | 
						fwprintf(fd, L"; Created by %s\n; " LTEXT(RUFUS_URL) L"\n", wRufusVersion);
 | 
				
			||||||
	fwprintf(fd, L"[autorun]\nicon  = autorun.ico\nlabel = %s\n", wlabel);
 | 
						fwprintf(fd, L"[autorun]\nicon  = autorun.ico\nlabel = %s\n", wlabel);
 | 
				
			||||||
	fclose(fd);
 | 
						fclose(fd);
 | 
				
			||||||
	uprintf("Created: %s\n", filename);
 | 
						uprintf("Created: %s", filename);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// .inf -> .ico
 | 
						// .inf -> .ico
 | 
				
			||||||
	filename[strlen(filename)-1] = 'o';
 | 
						filename[strlen(filename)-1] = 'o';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										132
									
								
								src/iso.c
									
										
									
									
									
								
							
							
						
						
									
										132
									
								
								src/iso.c
									
										
									
									
									
								
							| 
						 | 
					@ -1,7 +1,7 @@
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Rufus: The Reliable USB Formatting Utility
 | 
					 * Rufus: The Reliable USB Formatting Utility
 | 
				
			||||||
 * ISO file extraction
 | 
					 * ISO file extraction
 | 
				
			||||||
 * Copyright © 2011-2015 Pete Batard <pete@akeo.ie>
 | 
					 * Copyright © 2011-2016 Pete Batard <pete@akeo.ie>
 | 
				
			||||||
 * Based on libcdio's iso & udf samples:
 | 
					 * Based on libcdio's iso & udf samples:
 | 
				
			||||||
 * Copyright © 2003-2014 Rocky Bernstein <rocky@gnu.org>
 | 
					 * Copyright © 2003-2014 Rocky Bernstein <rocky@gnu.org>
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
| 
						 | 
					@ -39,8 +39,9 @@
 | 
				
			||||||
#include <cdio/udf.h>
 | 
					#include <cdio/udf.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "rufus.h"
 | 
					#include "rufus.h"
 | 
				
			||||||
#include "msapi_utf8.h"
 | 
					#include "missing.h"
 | 
				
			||||||
#include "resource.h"
 | 
					#include "resource.h"
 | 
				
			||||||
 | 
					#include "msapi_utf8.h"
 | 
				
			||||||
#include "localization.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
 | 
				
			||||||
| 
						 | 
					@ -71,7 +72,7 @@ static const char* grldr_name = "grldr";
 | 
				
			||||||
static const char* ldlinux_name = "ldlinux.sys";
 | 
					static const char* ldlinux_name = "ldlinux.sys";
 | 
				
			||||||
static const char* ldlinux_c32 = "ldlinux.c32";
 | 
					static const char* ldlinux_c32 = "ldlinux.c32";
 | 
				
			||||||
static const char* efi_dirname = "/efi/boot";
 | 
					static const char* efi_dirname = "/efi/boot";
 | 
				
			||||||
static const char* efi_bootname[] = { "bootia32.efi", "bootx64.efi", "bootia64.efi", "bootarm.efi" };
 | 
					static const char* efi_bootname[] = { "bootia32.efi", "bootia64.efi", "bootx64.efi", "bootarm.efi", "bootaa64.efi" };
 | 
				
			||||||
static const char* install_wim_path = "/sources";
 | 
					static const char* install_wim_path = "/sources";
 | 
				
			||||||
static const char* install_wim_name[] = { "install.wim", "install.swm" };
 | 
					static const char* install_wim_name[] = { "install.wim", "install.swm" };
 | 
				
			||||||
static const char* grub_dirname = "/boot/grub"; // NB: We don't support nonstandard config dir such as AROS' "/boot/pc/grub/"
 | 
					static const char* grub_dirname = "/boot/grub"; // NB: We don't support nonstandard config dir such as AROS' "/boot/pc/grub/"
 | 
				
			||||||
| 
						 | 
					@ -306,8 +307,6 @@ static void print_extracted_file(char* psz_fullpath, int64_t i_file_length)
 | 
				
			||||||
	safe_sprintf(&psz_fullpath[nul_pos], 24, " (%s)", SizeToHumanReadable(i_file_length, TRUE, FALSE));
 | 
						safe_sprintf(&psz_fullpath[nul_pos], 24, " (%s)", SizeToHumanReadable(i_file_length, TRUE, FALSE));
 | 
				
			||||||
	uprintf("Extracting: %s\n", psz_fullpath);
 | 
						uprintf("Extracting: %s\n", psz_fullpath);
 | 
				
			||||||
	safe_sprintf(&psz_fullpath[nul_pos], 24, " (%s)", SizeToHumanReadable(i_file_length, FALSE, FALSE));
 | 
						safe_sprintf(&psz_fullpath[nul_pos], 24, " (%s)", SizeToHumanReadable(i_file_length, FALSE, FALSE));
 | 
				
			||||||
	// TODO: I don't think we need both of these...
 | 
					 | 
				
			||||||
	SendMessageLU(hStatus, SB_SETTEXTW, SBT_OWNERDRAW | SB_SECTION_LEFT, psz_fullpath);
 | 
					 | 
				
			||||||
	PrintStatus(0, MSG_000, psz_fullpath);	// MSG_000 is "%s"
 | 
						PrintStatus(0, MSG_000, psz_fullpath);	// MSG_000 is "%s"
 | 
				
			||||||
	// ISO9660 cannot handle backslashes
 | 
						// ISO9660 cannot handle backslashes
 | 
				
			||||||
	for (i=0; i<nul_pos; i++)
 | 
						for (i=0; i<nul_pos; i++)
 | 
				
			||||||
| 
						 | 
					@ -429,17 +428,11 @@ static int udf_extract_files(udf_t *p_udf, udf_dirent_t *p_udf_dirent, const cha
 | 
				
			||||||
					goto out;
 | 
										goto out;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				buf_size = (DWORD)MIN(i_file_length, i_read);
 | 
									buf_size = (DWORD)MIN(i_file_length, i_read);
 | 
				
			||||||
				for (i=0; i<WRITE_RETRIES; i++) {
 | 
									ISO_BLOCKING(r = WriteFileWithRetry(file_handle, buf, buf_size, &wr_size, WRITE_RETRIES));
 | 
				
			||||||
					ISO_BLOCKING(r = WriteFile(file_handle, buf, buf_size, &wr_size, NULL));
 | 
									if (!r) {
 | 
				
			||||||
					if ((!r) || (buf_size != wr_size)) {
 | 
										uprintf("  Error writing file: %s", WindowsErrorString());
 | 
				
			||||||
						uprintf("  Error writing file: %s", WindowsErrorString());
 | 
										goto out;
 | 
				
			||||||
						if (i < WRITE_RETRIES-1)
 | 
					 | 
				
			||||||
							uprintf("  RETRYING...\n");
 | 
					 | 
				
			||||||
					} else {
 | 
					 | 
				
			||||||
						break;
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				if (i >= WRITE_RETRIES) goto out;
 | 
					 | 
				
			||||||
				i_file_length -= i_read;
 | 
									i_file_length -= i_read;
 | 
				
			||||||
				if (nb_blocks++ % PROGRESS_THRESHOLD == 0)
 | 
									if (nb_blocks++ % PROGRESS_THRESHOLD == 0)
 | 
				
			||||||
					UpdateProgress(OP_DOS, 100.0f*nb_blocks/total_blocks);
 | 
										UpdateProgress(OP_DOS, 100.0f*nb_blocks/total_blocks);
 | 
				
			||||||
| 
						 | 
					@ -476,7 +469,7 @@ static int iso_extract_files(iso9660_t* p_iso, const char *psz_path)
 | 
				
			||||||
	HANDLE file_handle = NULL;
 | 
						HANDLE file_handle = NULL;
 | 
				
			||||||
	DWORD buf_size, wr_size, err;
 | 
						DWORD buf_size, wr_size, err;
 | 
				
			||||||
	EXTRACT_PROPS props;
 | 
						EXTRACT_PROPS props;
 | 
				
			||||||
	BOOL s, is_symlink, is_identical;
 | 
						BOOL is_symlink, is_identical;
 | 
				
			||||||
	int i_length, r = 1;
 | 
						int i_length, r = 1;
 | 
				
			||||||
	char tmp[128], psz_fullpath[MAX_PATH], *psz_basename, *psz_sanpath;
 | 
						char tmp[128], psz_fullpath[MAX_PATH], *psz_basename, *psz_sanpath;
 | 
				
			||||||
	const char *psz_iso_name = &psz_fullpath[strlen(psz_extract_dir)];
 | 
						const char *psz_iso_name = &psz_fullpath[strlen(psz_extract_dir)];
 | 
				
			||||||
| 
						 | 
					@ -484,7 +477,7 @@ static int iso_extract_files(iso9660_t* p_iso, const char *psz_path)
 | 
				
			||||||
	CdioListNode_t* p_entnode;
 | 
						CdioListNode_t* p_entnode;
 | 
				
			||||||
	iso9660_stat_t *p_statbuf;
 | 
						iso9660_stat_t *p_statbuf;
 | 
				
			||||||
	CdioList_t* p_entlist;
 | 
						CdioList_t* p_entlist;
 | 
				
			||||||
	size_t i, j;
 | 
						size_t i;
 | 
				
			||||||
	lsn_t lsn;
 | 
						lsn_t lsn;
 | 
				
			||||||
	int64_t i_file_length;
 | 
						int64_t i_file_length;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -582,17 +575,11 @@ static int iso_extract_files(iso9660_t* p_iso, const char *psz_path)
 | 
				
			||||||
					goto out;
 | 
										goto out;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				buf_size = (DWORD)MIN(i_file_length, ISO_BLOCKSIZE);
 | 
									buf_size = (DWORD)MIN(i_file_length, ISO_BLOCKSIZE);
 | 
				
			||||||
				for (j=0; j<WRITE_RETRIES; j++) {
 | 
									ISO_BLOCKING(r = WriteFileWithRetry(file_handle, buf, buf_size, &wr_size, WRITE_RETRIES));
 | 
				
			||||||
					ISO_BLOCKING(s = WriteFile(file_handle, buf, buf_size, &wr_size, NULL));
 | 
									if (!r) {
 | 
				
			||||||
					if ((!s) || (buf_size != wr_size)) {
 | 
										uprintf("  Error writing file: %s", WindowsErrorString());
 | 
				
			||||||
						uprintf("  Error writing file: %s", WindowsErrorString());
 | 
										goto out;
 | 
				
			||||||
						if (j < WRITE_RETRIES-1)
 | 
					 | 
				
			||||||
							uprintf("  RETRYING...\n");
 | 
					 | 
				
			||||||
					} else {
 | 
					 | 
				
			||||||
						break;
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				if (j >= WRITE_RETRIES) goto out;
 | 
					 | 
				
			||||||
				i_file_length -= ISO_BLOCKSIZE;
 | 
									i_file_length -= ISO_BLOCKSIZE;
 | 
				
			||||||
				if (nb_blocks++ % PROGRESS_THRESHOLD == 0)
 | 
									if (nb_blocks++ % PROGRESS_THRESHOLD == 0)
 | 
				
			||||||
					UpdateProgress(OP_DOS, 100.0f*nb_blocks/total_blocks);
 | 
										UpdateProgress(OP_DOS, 100.0f*nb_blocks/total_blocks);
 | 
				
			||||||
| 
						 | 
					@ -918,7 +905,6 @@ int64_t ExtractISOFile(const char* iso, const char* iso_file, const char* dest_f
 | 
				
			||||||
	int64_t file_length, r = 0;
 | 
						int64_t file_length, r = 0;
 | 
				
			||||||
	char buf[UDF_BLOCKSIZE];
 | 
						char buf[UDF_BLOCKSIZE];
 | 
				
			||||||
	DWORD buf_size, wr_size;
 | 
						DWORD buf_size, wr_size;
 | 
				
			||||||
	BOOL s;
 | 
					 | 
				
			||||||
	iso9660_t* p_iso = NULL;
 | 
						iso9660_t* p_iso = NULL;
 | 
				
			||||||
	udf_t* p_udf = NULL;
 | 
						udf_t* p_udf = NULL;
 | 
				
			||||||
	udf_dirent_t *p_udf_root = NULL, *p_udf_file = NULL;
 | 
						udf_dirent_t *p_udf_root = NULL, *p_udf_file = NULL;
 | 
				
			||||||
| 
						 | 
					@ -957,8 +943,7 @@ int64_t ExtractISOFile(const char* iso, const char* iso_file, const char* dest_f
 | 
				
			||||||
			goto out;
 | 
								goto out;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		buf_size = (DWORD)MIN(file_length, read_size);
 | 
							buf_size = (DWORD)MIN(file_length, read_size);
 | 
				
			||||||
		s = WriteFile(file_handle, buf, buf_size, &wr_size, NULL);
 | 
							if (!WriteFileWithRetry(file_handle, buf, buf_size, &wr_size, WRITE_RETRIES)) {
 | 
				
			||||||
		if ((!s) || (buf_size != wr_size)) {
 | 
					 | 
				
			||||||
			uprintf("  Error writing file %s: %s\n", dest_file, WindowsErrorString());
 | 
								uprintf("  Error writing file %s: %s\n", dest_file, WindowsErrorString());
 | 
				
			||||||
			goto out;
 | 
								goto out;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					@ -989,8 +974,7 @@ try_iso:
 | 
				
			||||||
			goto out;
 | 
								goto out;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		buf_size = (DWORD)MIN(file_length, ISO_BLOCKSIZE);
 | 
							buf_size = (DWORD)MIN(file_length, ISO_BLOCKSIZE);
 | 
				
			||||||
		s = WriteFile(file_handle, buf, buf_size, &wr_size, NULL);
 | 
							if (!WriteFileWithRetry(file_handle, buf, buf_size, &wr_size, WRITE_RETRIES)) {
 | 
				
			||||||
		if ((!s) || (buf_size != wr_size)) {
 | 
					 | 
				
			||||||
			uprintf("  Error writing file %s: %s\n", dest_file, WindowsErrorString());
 | 
								uprintf("  Error writing file %s: %s\n", dest_file, WindowsErrorString());
 | 
				
			||||||
			goto out;
 | 
								goto out;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					@ -1083,91 +1067,9 @@ out:
 | 
				
			||||||
	if (p_udf != NULL)
 | 
						if (p_udf != NULL)
 | 
				
			||||||
		udf_close(p_udf);
 | 
							udf_close(p_udf);
 | 
				
			||||||
	safe_free(wim_path);
 | 
						safe_free(wim_path);
 | 
				
			||||||
	return bswap_32(r);
 | 
						return bswap_uint32(r);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * The following is used for native ISO mounting in Windows 8 or later
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
#define VIRTUAL_STORAGE_TYPE_VENDOR_MICROSOFT \
 | 
					 | 
				
			||||||
	{ 0xEC984AECL, 0xA0F9, 0x47e9, { 0x90, 0x1F, 0x71, 0x41, 0x5A, 0x66, 0x34, 0x5B } }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef enum _VIRTUAL_DISK_ACCESS_MASK {
 | 
					 | 
				
			||||||
	VIRTUAL_DISK_ACCESS_NONE = 0x00000000,
 | 
					 | 
				
			||||||
	VIRTUAL_DISK_ACCESS_ATTACH_RO = 0x00010000,
 | 
					 | 
				
			||||||
	VIRTUAL_DISK_ACCESS_ATTACH_RW = 0x00020000,
 | 
					 | 
				
			||||||
	VIRTUAL_DISK_ACCESS_DETACH = 0x00040000,
 | 
					 | 
				
			||||||
	VIRTUAL_DISK_ACCESS_GET_INFO = 0x00080000,
 | 
					 | 
				
			||||||
	VIRTUAL_DISK_ACCESS_CREATE = 0x00100000,
 | 
					 | 
				
			||||||
	VIRTUAL_DISK_ACCESS_METAOPS = 0x00200000,
 | 
					 | 
				
			||||||
	VIRTUAL_DISK_ACCESS_READ = 0x000d0000,
 | 
					 | 
				
			||||||
	VIRTUAL_DISK_ACCESS_ALL = 0x003f0000,
 | 
					 | 
				
			||||||
	VIRTUAL_DISK_ACCESS_WRITABLE = 0x00320000
 | 
					 | 
				
			||||||
} VIRTUAL_DISK_ACCESS_MASK;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef enum _OPEN_VIRTUAL_DISK_FLAG {
 | 
					 | 
				
			||||||
	OPEN_VIRTUAL_DISK_FLAG_NONE = 0x00000000,
 | 
					 | 
				
			||||||
	OPEN_VIRTUAL_DISK_FLAG_NO_PARENTS = 0x00000001,
 | 
					 | 
				
			||||||
	OPEN_VIRTUAL_DISK_FLAG_BLANK_FILE = 0x00000002,
 | 
					 | 
				
			||||||
	OPEN_VIRTUAL_DISK_FLAG_BOOT_DRIVE = 0x00000004,
 | 
					 | 
				
			||||||
	OPEN_VIRTUAL_DISK_FLAG_CACHED_IO = 0x00000008,
 | 
					 | 
				
			||||||
	OPEN_VIRTUAL_DISK_FLAG_CUSTOM_DIFF_CHAIN = 0x00000010
 | 
					 | 
				
			||||||
} OPEN_VIRTUAL_DISK_FLAG;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef enum _OPEN_VIRTUAL_DISK_VERSION {
 | 
					 | 
				
			||||||
	OPEN_VIRTUAL_DISK_VERSION_UNSPECIFIED = 0,
 | 
					 | 
				
			||||||
	OPEN_VIRTUAL_DISK_VERSION_1 = 1,
 | 
					 | 
				
			||||||
	OPEN_VIRTUAL_DISK_VERSION_2 = 2
 | 
					 | 
				
			||||||
} OPEN_VIRTUAL_DISK_VERSION;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef enum _ATTACH_VIRTUAL_DISK_FLAG {
 | 
					 | 
				
			||||||
	ATTACH_VIRTUAL_DISK_FLAG_NONE = 0x00000000,
 | 
					 | 
				
			||||||
	ATTACH_VIRTUAL_DISK_FLAG_READ_ONLY = 0x00000001,
 | 
					 | 
				
			||||||
	ATTACH_VIRTUAL_DISK_FLAG_NO_DRIVE_LETTER = 0x00000002,
 | 
					 | 
				
			||||||
	ATTACH_VIRTUAL_DISK_FLAG_PERMANENT_LIFETIME = 0x00000004,
 | 
					 | 
				
			||||||
	ATTACH_VIRTUAL_DISK_FLAG_NO_LOCAL_HOST = 0x00000008
 | 
					 | 
				
			||||||
} ATTACH_VIRTUAL_DISK_FLAG;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef enum _ATTACH_VIRTUAL_DISK_VERSION {
 | 
					 | 
				
			||||||
	ATTACH_VIRTUAL_DISK_VERSION_UNSPECIFIED = 0,
 | 
					 | 
				
			||||||
	ATTACH_VIRTUAL_DISK_VERSION_1 = 1
 | 
					 | 
				
			||||||
} ATTACH_VIRTUAL_DISK_VERSION;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef enum _DETACH_VIRTUAL_DISK_FLAG {
 | 
					 | 
				
			||||||
	DETACH_VIRTUAL_DISK_FLAG_NONE = 0x00000000
 | 
					 | 
				
			||||||
} DETACH_VIRTUAL_DISK_FLAG;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef _VIRTUAL_STORAGE_TYPE_DEFINED
 | 
					 | 
				
			||||||
#define _VIRTUAL_STORAGE_TYPE_DEFINED
 | 
					 | 
				
			||||||
typedef struct _VIRTUAL_STORAGE_TYPE {
 | 
					 | 
				
			||||||
	ULONG DeviceId;
 | 
					 | 
				
			||||||
	GUID  VendorId;
 | 
					 | 
				
			||||||
} VIRTUAL_STORAGE_TYPE, *PVIRTUAL_STORAGE_TYPE;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef struct _OPEN_VIRTUAL_DISK_PARAMETERS {
 | 
					 | 
				
			||||||
	OPEN_VIRTUAL_DISK_VERSION Version;
 | 
					 | 
				
			||||||
	union {
 | 
					 | 
				
			||||||
		struct {
 | 
					 | 
				
			||||||
			ULONG RWDepth;
 | 
					 | 
				
			||||||
		} Version1;
 | 
					 | 
				
			||||||
		struct {
 | 
					 | 
				
			||||||
			BOOL GetInfoOnly;
 | 
					 | 
				
			||||||
			BOOL ReadOnly;
 | 
					 | 
				
			||||||
			GUID ResiliencyGuid;
 | 
					 | 
				
			||||||
		} Version2;
 | 
					 | 
				
			||||||
	};
 | 
					 | 
				
			||||||
} OPEN_VIRTUAL_DISK_PARAMETERS, *POPEN_VIRTUAL_DISK_PARAMETERS;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef struct _ATTACH_VIRTUAL_DISK_PARAMETERS {
 | 
					 | 
				
			||||||
	ATTACH_VIRTUAL_DISK_VERSION Version;
 | 
					 | 
				
			||||||
	union {
 | 
					 | 
				
			||||||
		struct {
 | 
					 | 
				
			||||||
			ULONG Reserved;
 | 
					 | 
				
			||||||
		} Version1;
 | 
					 | 
				
			||||||
	};
 | 
					 | 
				
			||||||
} ATTACH_VIRTUAL_DISK_PARAMETERS, *PATTACH_VIRTUAL_DISK_PARAMETERS;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// VirtDisk API Prototypes - Only available for Windows 8 or later
 | 
					// VirtDisk API Prototypes - Only available for Windows 8 or later
 | 
				
			||||||
PF_TYPE_DECL(WINAPI, DWORD, OpenVirtualDisk, (PVIRTUAL_STORAGE_TYPE, PCWSTR,
 | 
					PF_TYPE_DECL(WINAPI, DWORD, OpenVirtualDisk, (PVIRTUAL_STORAGE_TYPE, PCWSTR,
 | 
				
			||||||
	VIRTUAL_DISK_ACCESS_MASK, OPEN_VIRTUAL_DISK_FLAG, POPEN_VIRTUAL_DISK_PARAMETERS, PHANDLE));
 | 
						VIRTUAL_DISK_ACCESS_MASK, OPEN_VIRTUAL_DISK_FLAG, POPEN_VIRTUAL_DISK_PARAMETERS, PHANDLE));
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -39,21 +39,8 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Define to 1 if you have the `fseeko64' function. */
 | 
					/* Define to 1 if you have the `fseeko64' function. */
 | 
				
			||||||
#define HAVE_FSEEKO64 1
 | 
					#define HAVE_FSEEKO64 1
 | 
				
			||||||
#if defined(_MSC_VER)
 | 
					/* The equivalent of fseeko64 for MSVC is _fseeki64 */
 | 
				
			||||||
/* The equivalent of fseeko64 for MSVC is _fseeki64, however this */
 | 
					 | 
				
			||||||
/* is not available on XP when build with WDK (but _lseeki64 is)  */
 | 
					 | 
				
			||||||
#if defined(DDKBUILD)
 | 
					 | 
				
			||||||
#include <windows.h>
 | 
					 | 
				
			||||||
#include <stdio.h>
 | 
					 | 
				
			||||||
#include <io.h>
 | 
					 | 
				
			||||||
static __inline int fseeko64(FILE *stream, __int64 offset, int origin) {
 | 
					 | 
				
			||||||
	fflush(stream);		/* VERY IMPORTANT! */
 | 
					 | 
				
			||||||
	return (lseek64(_fileno(stream), offset, origin) == -1LL)?-1:0;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
#define fseeko64 _fseeki64
 | 
					#define fseeko64 _fseeki64
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Define to 1 if you have the `ftruncate' function. */
 | 
					/* Define to 1 if you have the `ftruncate' function. */
 | 
				
			||||||
/* #undef HAVE_FTRUNCATE */
 | 
					/* #undef HAVE_FTRUNCATE */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -108,8 +108,9 @@ const char* additional_copyrights =
 | 
				
			||||||
"https://www.gnupg.org\\line\n"
 | 
					"https://www.gnupg.org\\line\n"
 | 
				
			||||||
"GNU General Public License (GPL) v3 or later\\line\n"
 | 
					"GNU General Public License (GPL) v3 or later\\line\n"
 | 
				
			||||||
"\\line\n"
 | 
					"\\line\n"
 | 
				
			||||||
"SHA-256 checksum from Brad Conte's crypto-algorithms:\\line\n"
 | 
					"SHA-256 checksum from 7-zip by Igor Pavlov and Crypto++ by Wei Dai:\\line\n"
 | 
				
			||||||
"https://github.com/B-Con/crypto-algorithms\\line\n"
 | 
					"http://7-zip.org\\line\n"
 | 
				
			||||||
 | 
					"https://github.com/weidai11/cryptopp/\\line\n"
 | 
				
			||||||
"Public Domain\\line\n"
 | 
					"Public Domain\\line\n"
 | 
				
			||||||
"\\line\n"
 | 
					"\\line\n"
 | 
				
			||||||
"About and License dialogs inspired by WinSCP by Martin Prikryl\\line\n"
 | 
					"About and License dialogs inspired by WinSCP by Martin Prikryl\\line\n"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,7 +1,7 @@
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Rufus: The Reliable USB Formatting Utility
 | 
					 * Rufus: The Reliable USB Formatting Utility
 | 
				
			||||||
 * Localization functions, a.k.a. "Everybody is doing it wrong but me!"
 | 
					 * Localization functions, a.k.a. "Everybody is doing it wrong but me!"
 | 
				
			||||||
 * Copyright © 2013-2015 Pete Batard <pete@akeo.ie>
 | 
					 * Copyright © 2013-2016 Pete Batard <pete@akeo.ie>
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * This program is free software: you can redistribute it and/or modify
 | 
					 * This program is free software: you can redistribute it and/or modify
 | 
				
			||||||
 * it under the terms of the GNU General Public License as published by
 | 
					 * it under the terms of the GNU General Public License as published by
 | 
				
			||||||
| 
						 | 
					@ -420,14 +420,54 @@ char* lmprintf(uint32_t msg_id, ...)
 | 
				
			||||||
#define MSG_HIGH_PRI 1
 | 
					#define MSG_HIGH_PRI 1
 | 
				
			||||||
char szMessage[2][2][MSG_LEN] = { {"", ""}, {"", ""} };
 | 
					char szMessage[2][2][MSG_LEN] = { {"", ""}, {"", ""} };
 | 
				
			||||||
char* szStatusMessage = szMessage[MSG_STATUS][MSG_HIGH_PRI];
 | 
					char* szStatusMessage = szMessage[MSG_STATUS][MSG_HIGH_PRI];
 | 
				
			||||||
static BOOL bStatusTimerArmed = FALSE;
 | 
					static BOOL bStatusTimerArmed = FALSE, bOutputTimerArmed[2] = { FALSE, FALSE };
 | 
				
			||||||
 | 
					static char *output_msg[2];
 | 
				
			||||||
 | 
					static uint64_t last_msg_time[2] = { 0, 0 };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void __inline OutputMessage(BOOL info, char* msg)
 | 
					static void PrintInfoMessage(char* msg) {
 | 
				
			||||||
 | 
						SetWindowTextU(hInfo, msg);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					static void PrintStatusMessage(char* msg) {
 | 
				
			||||||
 | 
						SendMessageLU(hStatus, SB_SETTEXTW, SBT_OWNERDRAW | SB_SECTION_LEFT, msg);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					typedef void PRINT_FUNCTION(char*);
 | 
				
			||||||
 | 
					PRINT_FUNCTION *PrintMessage[2] = { PrintInfoMessage, PrintStatusMessage };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * The following timer call is used, along with MAX_REFRESH, to prevent obnoxious flicker
 | 
				
			||||||
 | 
					 * on the Info and Status fields due to messages being updated too quickly.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					static void CALLBACK OutputMessageTimeout(HWND hWnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (info)
 | 
						int i = (idEvent == TID_OUTPUT_INFO)? 0 : 1;
 | 
				
			||||||
		SetWindowTextU(hInfo, msg);
 | 
					
 | 
				
			||||||
	else
 | 
						KillTimer(hMainDialog, idEvent);
 | 
				
			||||||
		SendMessageLU(hStatus, SB_SETTEXTW, SBT_OWNERDRAW | SB_SECTION_LEFT, msg);
 | 
						bOutputTimerArmed[i] = FALSE;
 | 
				
			||||||
 | 
						PrintMessage[i](output_msg[i]);
 | 
				
			||||||
 | 
						last_msg_time[i] = _GetTickCount64();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void OutputMessage(BOOL info, char* msg)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						uint64_t delta;
 | 
				
			||||||
 | 
						int i = info ? 0 : 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (bOutputTimerArmed[i]) {
 | 
				
			||||||
 | 
							// Already have a delayed message going - just change that message to latest
 | 
				
			||||||
 | 
							output_msg[i] = msg;
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							// Find if we need to arm a timer
 | 
				
			||||||
 | 
							delta = _GetTickCount64() - last_msg_time[i];
 | 
				
			||||||
 | 
							if (delta < (2 * MAX_REFRESH)) {
 | 
				
			||||||
 | 
								// Not enough time has elapsed since our last output => arm a timer
 | 
				
			||||||
 | 
								output_msg[i] = msg;
 | 
				
			||||||
 | 
								SetTimer(hMainDialog, TID_OUTPUT_INFO + i, (UINT)((2 * MAX_REFRESH) - delta), OutputMessageTimeout);
 | 
				
			||||||
 | 
								bOutputTimerArmed[i] = TRUE;
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								PrintMessage[i](msg);
 | 
				
			||||||
 | 
								last_msg_time[i] = _GetTickCount64();
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void CALLBACK PrintMessageTimeout(HWND hWnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
 | 
					static void CALLBACK PrintMessageTimeout(HWND hWnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
 | 
				
			||||||
| 
						 | 
					@ -602,13 +642,15 @@ WORD get_language_id(loc_cmd* lcmd)
 | 
				
			||||||
	wchar_t wlang[5];
 | 
						wchar_t wlang[5];
 | 
				
			||||||
	LANGID lang_id = GetUserDefaultUILanguage();
 | 
						LANGID lang_id = GetUserDefaultUILanguage();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Log will be reset, so we need to use the buffered uprintf() to get our messages to the user
 | 
				
			||||||
 | 
						ubclear();
 | 
				
			||||||
	if (lcmd == NULL)
 | 
						if (lcmd == NULL)
 | 
				
			||||||
		return MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT);
 | 
							return MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Find if the selected language is the user default
 | 
						// Find if the selected language is the user default
 | 
				
			||||||
	for (i = 0; i<lcmd->unum_size; i++) {
 | 
						for (i = 0; i<lcmd->unum_size; i++) {
 | 
				
			||||||
		if (lcmd->unum[i] == lang_id) {
 | 
							if (lcmd->unum[i] == lang_id) {
 | 
				
			||||||
			uprintf("localization: will use default UI language 0x%04X", lang_id);
 | 
								ubpushf("Will use default UI locale 0x%04X", lang_id);
 | 
				
			||||||
			return MAKELANGID(lang_id, SUBLANG_DEFAULT);
 | 
								return MAKELANGID(lang_id, SUBLANG_DEFAULT);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -622,11 +664,12 @@ WORD get_language_id(loc_cmd* lcmd)
 | 
				
			||||||
		// boolean to tell us that we found what we were after.
 | 
							// boolean to tell us that we found what we were after.
 | 
				
			||||||
		EnumUILanguages(EnumUILanguagesProc, 0x4, (LONG_PTR)wlang);	// 0x04 = MUI_LANGUAGE_ID
 | 
							EnumUILanguages(EnumUILanguagesProc, 0x4, (LONG_PTR)wlang);	// 0x04 = MUI_LANGUAGE_ID
 | 
				
			||||||
		if (found_lang) {
 | 
							if (found_lang) {
 | 
				
			||||||
			uprintf("localization: detected installed language pack for 0x%04X", lcmd->unum[i]);
 | 
								ubpushf("Detected installed Windows Language Pack for 0x%04X (%s)", lcmd->unum[i], lcmd->txt[1]);
 | 
				
			||||||
			return MAKELANGID(lcmd->unum[i], SUBLANG_DEFAULT);
 | 
								return MAKELANGID(lcmd->unum[i], SUBLANG_DEFAULT);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	uprintf("localization: no matching language pack - some messages will be displayed using default locale");
 | 
						ubpushf("NOTE: No Windows Language Pack is installed for %s on this system.\r\n"
 | 
				
			||||||
 | 
							"This means that some controls may still be displayed using the system locale.", lcmd->txt[1]);
 | 
				
			||||||
	return MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT);
 | 
						return MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,7 +1,7 @@
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Rufus: The Reliable USB Formatting Utility
 | 
					 * Rufus: The Reliable USB Formatting Utility
 | 
				
			||||||
 * Localization functions, a.k.a. "Everybody is doing it wrong but me!"
 | 
					 * Localization functions, a.k.a. "Everybody is doing it wrong but me!"
 | 
				
			||||||
 * Copyright © 2013-2014 Pete Batard <pete@akeo.ie>
 | 
					 * Copyright © 2013-2016 Pete Batard <pete@akeo.ie>
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * This program is free software: you can redistribute it and/or modify
 | 
					 * This program is free software: you can redistribute it and/or modify
 | 
				
			||||||
 * it under the terms of the GNU General Public License as published by
 | 
					 * it under the terms of the GNU General Public License as published by
 | 
				
			||||||
| 
						 | 
					@ -30,8 +30,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Attributes that can be set by a translation
 | 
					// Attributes that can be set by a translation
 | 
				
			||||||
#define LOC_RIGHT_TO_LEFT       0x00000001
 | 
					#define LOC_RIGHT_TO_LEFT       0x00000001
 | 
				
			||||||
#define LOC_ARABIC_NUMERALS     0x00000002
 | 
					#define LOC_NEEDS_UPDATE        0x00000002
 | 
				
			||||||
#define LOC_JAPANESE_NUMERALS   0x00000004
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
// The [v]ersion major from a translation must match this number or
 | 
					// The [v]ersion major from a translation must match this number or
 | 
				
			||||||
// the translation will be ignored
 | 
					// the translation will be ignored
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										571
									
								
								src/missing.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										571
									
								
								src/missing.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,571 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					* Rufus: The Reliable USB Formatting Utility
 | 
				
			||||||
 | 
					* Constants and defines missing from various toolchains
 | 
				
			||||||
 | 
					* Copyright © 2016 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 <commctrl.h>
 | 
				
			||||||
 | 
					#include <shlobj.h>
 | 
				
			||||||
 | 
					#include <wininet.h>
 | 
				
			||||||
 | 
					#include <stdint.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Convenient to have around */
 | 
				
			||||||
 | 
					#define KB                   1024LL
 | 
				
			||||||
 | 
					#define MB                1048576LL
 | 
				
			||||||
 | 
					#define GB             1073741824LL
 | 
				
			||||||
 | 
					#define TB          1099511627776LL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef MIN
 | 
				
			||||||
 | 
					#define MIN(a,b) (((a) < (b)) ? (a) : (b))
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined(__GNUC__)
 | 
				
			||||||
 | 
					#define ALIGNED(m) __attribute__ ((__aligned__(m)))
 | 
				
			||||||
 | 
					#elif defined(_MSC_VER)
 | 
				
			||||||
 | 
					#define ALIGNED(m) __declspec(align(m))
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Prefetch 64 bytes at address m, for read-only operation
 | 
				
			||||||
 | 
					 * We account for these built-in calls doing nothing if the
 | 
				
			||||||
 | 
					 * line has already been fetched, or if the address is invalid.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#if defined(__GNUC__)
 | 
				
			||||||
 | 
					#define PREFETCH64(m) do { __builtin_prefetch(m, 0, 0); __builtin_prefetch(m+32, 0, 0); } while(0)
 | 
				
			||||||
 | 
					#elif defined(_MSC_VER)
 | 
				
			||||||
 | 
					#define PREFETCH64(m) do { _m_prefetch(m); _m_prefetch(m+32); } while(0)
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Read/write with endianness swap */
 | 
				
			||||||
 | 
					#if defined (_MSC_VER) && (_MSC_VER >= 1300)
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#pragma intrinsic(_byteswap_ushort)
 | 
				
			||||||
 | 
					#pragma intrinsic(_byteswap_ulong)
 | 
				
			||||||
 | 
					#pragma intrinsic(_byteswap_uint64)
 | 
				
			||||||
 | 
					#define bswap_uint64 _byteswap_uint64
 | 
				
			||||||
 | 
					#define bswap_uint32 _byteswap_ulong
 | 
				
			||||||
 | 
					#define bswap_uint16 _byteswap_ushort
 | 
				
			||||||
 | 
					#elif defined (__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3)))
 | 
				
			||||||
 | 
					#define bswap_uint64 __builtin_bswap64
 | 
				
			||||||
 | 
					#define bswap_uint32 __builtin_bswap32
 | 
				
			||||||
 | 
					#define bswap_uint16 __builtin_bswap16
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#define read_swap16(p) bswap_uint16(*(const uint16_t*)(const uint8_t*)(p))
 | 
				
			||||||
 | 
					#define read_swap32(p) bswap_uint32(*(const uint32_t*)(const uint8_t*)(p))
 | 
				
			||||||
 | 
					#define read_swap64(p) bswap_uint64(*(const uint64_t*)(const uint8_t*)(p))
 | 
				
			||||||
 | 
					#define write_swap16(p,v) (*(uint16_t*)(void*)(p)) = bswap_uint16(v)
 | 
				
			||||||
 | 
					#define write_swap32(p,v) (*(uint32_t*)(void*)(p)) = bswap_uint32(v)
 | 
				
			||||||
 | 
					#define write_swap64(p,v) (*(uint32_t*)(void*)(p)) = bswap_uint64(v)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Nibbled from https://github.com/hanji/popcnt/blob/master/populationcount.cpp
 | 
				
			||||||
 | 
					 * Since MSVC x86_32 does not have intrinsic popcount64 and I don't have all day
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					static __inline int popcnt64(register uint64_t u)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						u = (u & 0x5555555555555555) + ((u >> 1) & 0x5555555555555555);
 | 
				
			||||||
 | 
						u = (u & 0x3333333333333333) + ((u >> 2) & 0x3333333333333333);
 | 
				
			||||||
 | 
						u = (u & 0x0f0f0f0f0f0f0f0f) + ((u >> 4) & 0x0f0f0f0f0f0f0f0f);
 | 
				
			||||||
 | 
						u = (u & 0x00ff00ff00ff00ff) + ((u >> 8) & 0x00ff00ff00ff00ff);
 | 
				
			||||||
 | 
						u = (u & 0x0000ffff0000ffff) + ((u >> 16) & 0x0000ffff0000ffff);
 | 
				
			||||||
 | 
						u = (u & 0x00000000ffffffff) + ((u >> 32) & 0x00000000ffffffff);
 | 
				
			||||||
 | 
						return (int)u;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static __inline void *_reallocf(void *ptr, size_t size) {
 | 
				
			||||||
 | 
						void *ret = realloc(ptr, size);
 | 
				
			||||||
 | 
						if (!ret)
 | 
				
			||||||
 | 
							free(ptr);
 | 
				
			||||||
 | 
						return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Why oh why does Microsoft have to make everybody suffer with their braindead use of Unicode? */
 | 
				
			||||||
 | 
					#define _RT_ICON			MAKEINTRESOURCEA(3)
 | 
				
			||||||
 | 
					#define _RT_DIALOG			MAKEINTRESOURCEA(5)
 | 
				
			||||||
 | 
					#define _RT_RCDATA			MAKEINTRESOURCEA(10)
 | 
				
			||||||
 | 
					#define _RT_GROUP_ICON		MAKEINTRESOURCEA((ULONG_PTR)(MAKEINTRESOURCEA(3) + 11))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* UI redefinitions for WDK and MinGW */
 | 
				
			||||||
 | 
					#ifndef PBM_SETSTATE
 | 
				
			||||||
 | 
					#define PBM_SETSTATE (WM_USER+16)
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#ifndef PBST_NORMAL
 | 
				
			||||||
 | 
					#define PBST_NORMAL 1
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#ifndef PBST_ERROR
 | 
				
			||||||
 | 
					#define PBST_ERROR 2
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#ifndef PBST_PAUSED
 | 
				
			||||||
 | 
					#define PBST_PAUSED 3
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#ifndef BUTTON_IMAGELIST_ALIGN_CENTER
 | 
				
			||||||
 | 
					#define BUTTON_IMAGELIST_ALIGN_CENTER 4
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#ifndef BCM_SETIMAGELIST
 | 
				
			||||||
 | 
					#define BCM_SETIMAGELIST 0x1602
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#ifndef DBT_CUSTOMEVENT
 | 
				
			||||||
 | 
					#define DBT_CUSTOMEVENT 0x8006
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#ifndef ERROR_FILE_TOO_LARGE
 | 
				
			||||||
 | 
					#define ERROR_FILE_TOO_LARGE 223
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#ifndef MSGFLT_ADD
 | 
				
			||||||
 | 
					#define MSGFLT_ADD 1
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#ifndef WM_CLIENTSHUTDOWN
 | 
				
			||||||
 | 
					#define WM_CLIENTSHUTDOWN 0x3B
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#ifndef WM_COPYGLOBALDATA
 | 
				
			||||||
 | 
					#define WM_COPYGLOBALDATA 0x49
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#ifndef PBS_MARQUEE
 | 
				
			||||||
 | 
					#define PBS_MARQUEE 0x08
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#ifndef PBM_SETMARQUEE
 | 
				
			||||||
 | 
					#define PBM_SETMARQUEE (WM_USER+10)
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct {
 | 
				
			||||||
 | 
						HIMAGELIST himl;
 | 
				
			||||||
 | 
						RECT margin;
 | 
				
			||||||
 | 
						UINT uAlign;
 | 
				
			||||||
 | 
					} MY_BUTTON_IMAGELIST;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						LPCITEMIDLIST pidl;
 | 
				
			||||||
 | 
						BOOL fRecursive;
 | 
				
			||||||
 | 
					} MY_SHChangeNotifyEntry;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* The following is used for native ISO mounting in Windows 8 or later */
 | 
				
			||||||
 | 
					#define VIRTUAL_STORAGE_TYPE_VENDOR_MICROSOFT \
 | 
				
			||||||
 | 
						{ 0xEC984AECL, 0xA0F9, 0x47e9, { 0x90, 0x1F, 0x71, 0x41, 0x5A, 0x66, 0x34, 0x5B } }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum _VIRTUAL_DISK_ACCESS_MASK {
 | 
				
			||||||
 | 
						VIRTUAL_DISK_ACCESS_NONE = 0x00000000,
 | 
				
			||||||
 | 
						VIRTUAL_DISK_ACCESS_ATTACH_RO = 0x00010000,
 | 
				
			||||||
 | 
						VIRTUAL_DISK_ACCESS_ATTACH_RW = 0x00020000,
 | 
				
			||||||
 | 
						VIRTUAL_DISK_ACCESS_DETACH = 0x00040000,
 | 
				
			||||||
 | 
						VIRTUAL_DISK_ACCESS_GET_INFO = 0x00080000,
 | 
				
			||||||
 | 
						VIRTUAL_DISK_ACCESS_CREATE = 0x00100000,
 | 
				
			||||||
 | 
						VIRTUAL_DISK_ACCESS_METAOPS = 0x00200000,
 | 
				
			||||||
 | 
						VIRTUAL_DISK_ACCESS_READ = 0x000d0000,
 | 
				
			||||||
 | 
						VIRTUAL_DISK_ACCESS_ALL = 0x003f0000,
 | 
				
			||||||
 | 
						VIRTUAL_DISK_ACCESS_WRITABLE = 0x00320000
 | 
				
			||||||
 | 
					} VIRTUAL_DISK_ACCESS_MASK;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum _OPEN_VIRTUAL_DISK_FLAG {
 | 
				
			||||||
 | 
						OPEN_VIRTUAL_DISK_FLAG_NONE = 0x00000000,
 | 
				
			||||||
 | 
						OPEN_VIRTUAL_DISK_FLAG_NO_PARENTS = 0x00000001,
 | 
				
			||||||
 | 
						OPEN_VIRTUAL_DISK_FLAG_BLANK_FILE = 0x00000002,
 | 
				
			||||||
 | 
						OPEN_VIRTUAL_DISK_FLAG_BOOT_DRIVE = 0x00000004,
 | 
				
			||||||
 | 
						OPEN_VIRTUAL_DISK_FLAG_CACHED_IO = 0x00000008,
 | 
				
			||||||
 | 
						OPEN_VIRTUAL_DISK_FLAG_CUSTOM_DIFF_CHAIN = 0x00000010
 | 
				
			||||||
 | 
					} OPEN_VIRTUAL_DISK_FLAG;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum _OPEN_VIRTUAL_DISK_VERSION {
 | 
				
			||||||
 | 
						OPEN_VIRTUAL_DISK_VERSION_UNSPECIFIED = 0,
 | 
				
			||||||
 | 
						OPEN_VIRTUAL_DISK_VERSION_1 = 1,
 | 
				
			||||||
 | 
						OPEN_VIRTUAL_DISK_VERSION_2 = 2
 | 
				
			||||||
 | 
					} OPEN_VIRTUAL_DISK_VERSION;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum _ATTACH_VIRTUAL_DISK_FLAG {
 | 
				
			||||||
 | 
						ATTACH_VIRTUAL_DISK_FLAG_NONE = 0x00000000,
 | 
				
			||||||
 | 
						ATTACH_VIRTUAL_DISK_FLAG_READ_ONLY = 0x00000001,
 | 
				
			||||||
 | 
						ATTACH_VIRTUAL_DISK_FLAG_NO_DRIVE_LETTER = 0x00000002,
 | 
				
			||||||
 | 
						ATTACH_VIRTUAL_DISK_FLAG_PERMANENT_LIFETIME = 0x00000004,
 | 
				
			||||||
 | 
						ATTACH_VIRTUAL_DISK_FLAG_NO_LOCAL_HOST = 0x00000008
 | 
				
			||||||
 | 
					} ATTACH_VIRTUAL_DISK_FLAG;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum _ATTACH_VIRTUAL_DISK_VERSION {
 | 
				
			||||||
 | 
						ATTACH_VIRTUAL_DISK_VERSION_UNSPECIFIED = 0,
 | 
				
			||||||
 | 
						ATTACH_VIRTUAL_DISK_VERSION_1 = 1
 | 
				
			||||||
 | 
					} ATTACH_VIRTUAL_DISK_VERSION;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum _DETACH_VIRTUAL_DISK_FLAG {
 | 
				
			||||||
 | 
						DETACH_VIRTUAL_DISK_FLAG_NONE = 0x00000000
 | 
				
			||||||
 | 
					} DETACH_VIRTUAL_DISK_FLAG;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef _VIRTUAL_STORAGE_TYPE_DEFINED
 | 
				
			||||||
 | 
					#define _VIRTUAL_STORAGE_TYPE_DEFINED
 | 
				
			||||||
 | 
					typedef struct _VIRTUAL_STORAGE_TYPE {
 | 
				
			||||||
 | 
						ULONG DeviceId;
 | 
				
			||||||
 | 
						GUID  VendorId;
 | 
				
			||||||
 | 
					} VIRTUAL_STORAGE_TYPE, *PVIRTUAL_STORAGE_TYPE;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct _OPEN_VIRTUAL_DISK_PARAMETERS {
 | 
				
			||||||
 | 
						OPEN_VIRTUAL_DISK_VERSION Version;
 | 
				
			||||||
 | 
						union {
 | 
				
			||||||
 | 
							struct {
 | 
				
			||||||
 | 
								ULONG RWDepth;
 | 
				
			||||||
 | 
							} Version1;
 | 
				
			||||||
 | 
							struct {
 | 
				
			||||||
 | 
								BOOL GetInfoOnly;
 | 
				
			||||||
 | 
								BOOL ReadOnly;
 | 
				
			||||||
 | 
								GUID ResiliencyGuid;
 | 
				
			||||||
 | 
							} Version2;
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					} OPEN_VIRTUAL_DISK_PARAMETERS, *POPEN_VIRTUAL_DISK_PARAMETERS;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct _ATTACH_VIRTUAL_DISK_PARAMETERS {
 | 
				
			||||||
 | 
						ATTACH_VIRTUAL_DISK_VERSION Version;
 | 
				
			||||||
 | 
						union {
 | 
				
			||||||
 | 
							struct {
 | 
				
			||||||
 | 
								ULONG Reserved;
 | 
				
			||||||
 | 
							} Version1;
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					} ATTACH_VIRTUAL_DISK_PARAMETERS, *PATTACH_VIRTUAL_DISK_PARAMETERS;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Networking constants missing from MinGW */
 | 
				
			||||||
 | 
					#if !defined(ERROR_INTERNET_DISCONNECTED)
 | 
				
			||||||
 | 
					#define ERROR_INTERNET_DISCONNECTED (INTERNET_ERROR_BASE + 163)
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#if !defined(ERROR_INTERNET_SERVER_UNREACHABLE)
 | 
				
			||||||
 | 
					#define ERROR_INTERNET_SERVER_UNREACHABLE (INTERNET_ERROR_BASE + 164)
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#if !defined(ERROR_INTERNET_PROXY_SERVER_UNREACHABLE)
 | 
				
			||||||
 | 
					#define ERROR_INTERNET_PROXY_SERVER_UNREACHABLE (INTERNET_ERROR_BASE + 165)
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#if !defined(ERROR_INTERNET_BAD_AUTO_PROXY_SCRIPT)
 | 
				
			||||||
 | 
					#define ERROR_INTERNET_BAD_AUTO_PROXY_SCRIPT (INTERNET_ERROR_BASE + 166)
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#if !defined(ERROR_INTERNET_UNABLE_TO_DOWNLOAD_SCRIPT)
 | 
				
			||||||
 | 
					#define ERROR_INTERNET_UNABLE_TO_DOWNLOAD_SCRIPT (INTERNET_ERROR_BASE + 167)
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#if !defined(ERROR_INTERNET_FAILED_DUETOSECURITYCHECK)
 | 
				
			||||||
 | 
					#define ERROR_INTERNET_FAILED_DUETOSECURITYCHECK (INTERNET_ERROR_BASE + 171)
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#if !defined(ERROR_INTERNET_NOT_INITIALIZED)
 | 
				
			||||||
 | 
					#define ERROR_INTERNET_NOT_INITIALIZED (INTERNET_ERROR_BASE + 172)
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#if !defined(ERROR_INTERNET_NEED_MSN_SSPI_PKG)
 | 
				
			||||||
 | 
					#define ERROR_INTERNET_NEED_MSN_SSPI_PKG (INTERNET_ERROR_BASE + 173)
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#if !defined(ERROR_INTERNET_LOGIN_FAILURE_DISPLAY_ENTITY_BODY)
 | 
				
			||||||
 | 
					#define ERROR_INTERNET_LOGIN_FAILURE_DISPLAY_ENTITY_BODY (INTERNET_ERROR_BASE + 174)
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Clang/MinGW32 has an issue with intptr_t */
 | 
				
			||||||
 | 
					#ifndef _UINTPTR_T_DEFINED
 | 
				
			||||||
 | 
					#define _UINTPTR_T_DEFINED
 | 
				
			||||||
 | 
					#ifdef _WIN64
 | 
				
			||||||
 | 
					typedef unsigned __int64 uintptr_t;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					typedef unsigned int uintptr_t;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * IFile[Open]Dialog interface for Vista and later (from MinGW headers)
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#ifndef __IFileDialog_INTERFACE_DEFINED__
 | 
				
			||||||
 | 
					#define __IFileDialog_INTERFACE_DEFINED__
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum _FILEOPENDIALOGOPTIONS {
 | 
				
			||||||
 | 
						FOS_OVERWRITEPROMPT = 0x2,
 | 
				
			||||||
 | 
						FOS_STRICTFILETYPES = 0x4,
 | 
				
			||||||
 | 
						FOS_NOCHANGEDIR = 0x8,
 | 
				
			||||||
 | 
						FOS_PICKFOLDERS = 0x20,
 | 
				
			||||||
 | 
						FOS_FORCEFILESYSTEM = 0x40,
 | 
				
			||||||
 | 
						FOS_ALLNONSTORAGEITEMS = 0x80,
 | 
				
			||||||
 | 
						FOS_NOVALIDATE = 0x100,
 | 
				
			||||||
 | 
						FOS_ALLOWMULTISELECT = 0x200,
 | 
				
			||||||
 | 
						FOS_PATHMUSTEXIST = 0x800,
 | 
				
			||||||
 | 
						FOS_FILEMUSTEXIST = 0x1000,
 | 
				
			||||||
 | 
						FOS_CREATEPROMPT = 0x2000,
 | 
				
			||||||
 | 
						FOS_SHAREAWARE = 0x4000,
 | 
				
			||||||
 | 
						FOS_NOREADONLYRETURN = 0x8000,
 | 
				
			||||||
 | 
						FOS_NOTESTFILECREATE = 0x10000,
 | 
				
			||||||
 | 
						FOS_HIDEMRUPLACES = 0x20000,
 | 
				
			||||||
 | 
						FOS_HIDEPINNEDPLACES = 0x40000,
 | 
				
			||||||
 | 
						FOS_NODEREFERENCELINKS = 0x100000,
 | 
				
			||||||
 | 
						FOS_DONTADDTORECENT = 0x2000000,
 | 
				
			||||||
 | 
						FOS_FORCESHOWHIDDEN = 0x10000000,
 | 
				
			||||||
 | 
						FOS_DEFAULTNOMINIMODE = 0x20000000,
 | 
				
			||||||
 | 
						FOS_FORCEPREVIEWPANEON = 0x40000000
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum FDAP {
 | 
				
			||||||
 | 
						FDAP_BOTTOM = 0,
 | 
				
			||||||
 | 
						FDAP_TOP = 1
 | 
				
			||||||
 | 
					} FDAP;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef DWORD FILEOPENDIALOGOPTIONS;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEFINE_GUID(IID_IFileDialog, 0x42f85136, 0xdb7e, 0x439c, 0x85, 0xf1, 0xe4, 0x07, 0x5d, 0x13, 0x5f, 0xc8);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct IFileDialogVtbl {
 | 
				
			||||||
 | 
						BEGIN_INTERFACE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							/*** IUnknown methods ***/
 | 
				
			||||||
 | 
							HRESULT(STDMETHODCALLTYPE *QueryInterface)(
 | 
				
			||||||
 | 
								IFileDialog* This,
 | 
				
			||||||
 | 
								REFIID riid,
 | 
				
			||||||
 | 
								void **ppvObject);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ULONG(STDMETHODCALLTYPE *AddRef)(
 | 
				
			||||||
 | 
							IFileDialog* This);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ULONG(STDMETHODCALLTYPE *Release)(
 | 
				
			||||||
 | 
							IFileDialog* This);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/*** IModalWindow methods ***/
 | 
				
			||||||
 | 
						HRESULT(STDMETHODCALLTYPE *Show)(
 | 
				
			||||||
 | 
							IFileDialog* This,
 | 
				
			||||||
 | 
							HWND hwndOwner);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/*** IFileDialog methods ***/
 | 
				
			||||||
 | 
						HRESULT(STDMETHODCALLTYPE *SetFileTypes)(
 | 
				
			||||||
 | 
							IFileDialog* This,
 | 
				
			||||||
 | 
							UINT cFileTypes,
 | 
				
			||||||
 | 
							const COMDLG_FILTERSPEC *rgFilterSpec);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						HRESULT(STDMETHODCALLTYPE *SetFileTypeIndex)(
 | 
				
			||||||
 | 
							IFileDialog* This,
 | 
				
			||||||
 | 
							UINT iFileType);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						HRESULT(STDMETHODCALLTYPE *GetFileTypeIndex)(
 | 
				
			||||||
 | 
							IFileDialog* This,
 | 
				
			||||||
 | 
							UINT *piFileType);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						HRESULT(STDMETHODCALLTYPE *Advise)(
 | 
				
			||||||
 | 
							IFileDialog* This,
 | 
				
			||||||
 | 
							IFileDialogEvents *pfde,
 | 
				
			||||||
 | 
							DWORD *pdwCookie);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						HRESULT(STDMETHODCALLTYPE *Unadvise)(
 | 
				
			||||||
 | 
							IFileDialog* This,
 | 
				
			||||||
 | 
							DWORD dwCookie);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						HRESULT(STDMETHODCALLTYPE *SetOptions)(
 | 
				
			||||||
 | 
							IFileDialog* This,
 | 
				
			||||||
 | 
							FILEOPENDIALOGOPTIONS fos);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						HRESULT(STDMETHODCALLTYPE *GetOptions)(
 | 
				
			||||||
 | 
							IFileDialog* This,
 | 
				
			||||||
 | 
							FILEOPENDIALOGOPTIONS *pfos);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						HRESULT(STDMETHODCALLTYPE *SetDefaultFolder)(
 | 
				
			||||||
 | 
							IFileDialog* This,
 | 
				
			||||||
 | 
							IShellItem *psi);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						HRESULT(STDMETHODCALLTYPE *SetFolder)(
 | 
				
			||||||
 | 
							IFileDialog* This,
 | 
				
			||||||
 | 
							IShellItem *psi);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						HRESULT(STDMETHODCALLTYPE *GetFolder)(
 | 
				
			||||||
 | 
							IFileDialog* This,
 | 
				
			||||||
 | 
							IShellItem **ppsi);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						HRESULT(STDMETHODCALLTYPE *GetCurrentSelection)(
 | 
				
			||||||
 | 
							IFileDialog* This,
 | 
				
			||||||
 | 
							IShellItem **ppsi);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						HRESULT(STDMETHODCALLTYPE *SetFileName)(
 | 
				
			||||||
 | 
							IFileDialog* This,
 | 
				
			||||||
 | 
							LPCWSTR pszName);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						HRESULT(STDMETHODCALLTYPE *GetFileName)(
 | 
				
			||||||
 | 
							IFileDialog* This,
 | 
				
			||||||
 | 
							LPWSTR *pszName);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						HRESULT(STDMETHODCALLTYPE *SetTitle)(
 | 
				
			||||||
 | 
							IFileDialog* This,
 | 
				
			||||||
 | 
							LPCWSTR pszTitle);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						HRESULT(STDMETHODCALLTYPE *SetOkButtonLabel)(
 | 
				
			||||||
 | 
							IFileDialog* This,
 | 
				
			||||||
 | 
							LPCWSTR pszText);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						HRESULT(STDMETHODCALLTYPE *SetFileNameLabel)(
 | 
				
			||||||
 | 
							IFileDialog* This,
 | 
				
			||||||
 | 
							LPCWSTR pszLabel);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						HRESULT(STDMETHODCALLTYPE *GetResult)(
 | 
				
			||||||
 | 
							IFileDialog* This,
 | 
				
			||||||
 | 
							IShellItem **ppsi);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						HRESULT(STDMETHODCALLTYPE *AddPlace)(
 | 
				
			||||||
 | 
							IFileDialog* This,
 | 
				
			||||||
 | 
							IShellItem *psi,
 | 
				
			||||||
 | 
							FDAP fdap);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						HRESULT(STDMETHODCALLTYPE *SetDefaultExtension)(
 | 
				
			||||||
 | 
							IFileDialog* This,
 | 
				
			||||||
 | 
							LPCWSTR pszDefaultExtension);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						HRESULT(STDMETHODCALLTYPE *Close)(
 | 
				
			||||||
 | 
							IFileDialog* This,
 | 
				
			||||||
 | 
							HRESULT hr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						HRESULT(STDMETHODCALLTYPE *SetClientGuid)(
 | 
				
			||||||
 | 
							IFileDialog* This,
 | 
				
			||||||
 | 
							REFGUID guid);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						HRESULT(STDMETHODCALLTYPE *ClearClientData)(
 | 
				
			||||||
 | 
							IFileDialog* This);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						HRESULT(STDMETHODCALLTYPE *SetFilter)(
 | 
				
			||||||
 | 
							IFileDialog* This,
 | 
				
			||||||
 | 
							IShellItemFilter *pFilter);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						END_INTERFACE
 | 
				
			||||||
 | 
					} IFileDialogVtbl;
 | 
				
			||||||
 | 
					interface IFileDialog {
 | 
				
			||||||
 | 
						CONST_VTBL IFileDialogVtbl* lpVtbl;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef __IFileOpenDialog_INTERFACE_DEFINED__
 | 
				
			||||||
 | 
					#define __IFileOpenDialog_INTERFACE_DEFINED__
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEFINE_GUID(IID_IFileOpenDialog, 0xd57c7288, 0xd4ad, 0x4768, 0xbe, 0x02, 0x9d, 0x96, 0x95, 0x32, 0xd9, 0x60);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct IFileOpenDialogVtbl {
 | 
				
			||||||
 | 
						BEGIN_INTERFACE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							/*** IUnknown methods ***/
 | 
				
			||||||
 | 
							HRESULT(STDMETHODCALLTYPE *QueryInterface)(
 | 
				
			||||||
 | 
								IFileOpenDialog* This,
 | 
				
			||||||
 | 
								REFIID riid,
 | 
				
			||||||
 | 
								void **ppvObject);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ULONG(STDMETHODCALLTYPE *AddRef)(
 | 
				
			||||||
 | 
							IFileOpenDialog* This);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ULONG(STDMETHODCALLTYPE *Release)(
 | 
				
			||||||
 | 
							IFileOpenDialog* This);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/*** IModalWindow methods ***/
 | 
				
			||||||
 | 
						HRESULT(STDMETHODCALLTYPE *Show)(
 | 
				
			||||||
 | 
							IFileOpenDialog* This,
 | 
				
			||||||
 | 
							HWND hwndOwner);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/*** IFileDialog methods ***/
 | 
				
			||||||
 | 
						HRESULT(STDMETHODCALLTYPE *SetFileTypes)(
 | 
				
			||||||
 | 
							IFileOpenDialog* This,
 | 
				
			||||||
 | 
							UINT cFileTypes,
 | 
				
			||||||
 | 
							const COMDLG_FILTERSPEC *rgFilterSpec);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						HRESULT(STDMETHODCALLTYPE *SetFileTypeIndex)(
 | 
				
			||||||
 | 
							IFileOpenDialog* This,
 | 
				
			||||||
 | 
							UINT iFileType);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						HRESULT(STDMETHODCALLTYPE *GetFileTypeIndex)(
 | 
				
			||||||
 | 
							IFileOpenDialog* This,
 | 
				
			||||||
 | 
							UINT *piFileType);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						HRESULT(STDMETHODCALLTYPE *Advise)(
 | 
				
			||||||
 | 
							IFileOpenDialog* This,
 | 
				
			||||||
 | 
							IFileDialogEvents *pfde,
 | 
				
			||||||
 | 
							DWORD *pdwCookie);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						HRESULT(STDMETHODCALLTYPE *Unadvise)(
 | 
				
			||||||
 | 
							IFileOpenDialog* This,
 | 
				
			||||||
 | 
							DWORD dwCookie);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						HRESULT(STDMETHODCALLTYPE *SetOptions)(
 | 
				
			||||||
 | 
							IFileOpenDialog* This,
 | 
				
			||||||
 | 
							FILEOPENDIALOGOPTIONS fos);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						HRESULT(STDMETHODCALLTYPE *GetOptions)(
 | 
				
			||||||
 | 
							IFileOpenDialog* This,
 | 
				
			||||||
 | 
							FILEOPENDIALOGOPTIONS *pfos);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						HRESULT(STDMETHODCALLTYPE *SetDefaultFolder)(
 | 
				
			||||||
 | 
							IFileOpenDialog* This,
 | 
				
			||||||
 | 
							IShellItem *psi);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						HRESULT(STDMETHODCALLTYPE *SetFolder)(
 | 
				
			||||||
 | 
							IFileOpenDialog* This,
 | 
				
			||||||
 | 
							IShellItem *psi);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						HRESULT(STDMETHODCALLTYPE *GetFolder)(
 | 
				
			||||||
 | 
							IFileOpenDialog* This,
 | 
				
			||||||
 | 
							IShellItem **ppsi);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						HRESULT(STDMETHODCALLTYPE *GetCurrentSelection)(
 | 
				
			||||||
 | 
							IFileOpenDialog* This,
 | 
				
			||||||
 | 
							IShellItem **ppsi);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						HRESULT(STDMETHODCALLTYPE *SetFileName)(
 | 
				
			||||||
 | 
							IFileOpenDialog* This,
 | 
				
			||||||
 | 
							LPCWSTR pszName);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						HRESULT(STDMETHODCALLTYPE *GetFileName)(
 | 
				
			||||||
 | 
							IFileOpenDialog* This,
 | 
				
			||||||
 | 
							LPWSTR *pszName);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						HRESULT(STDMETHODCALLTYPE *SetTitle)(
 | 
				
			||||||
 | 
							IFileOpenDialog* This,
 | 
				
			||||||
 | 
							LPCWSTR pszTitle);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						HRESULT(STDMETHODCALLTYPE *SetOkButtonLabel)(
 | 
				
			||||||
 | 
							IFileOpenDialog* This,
 | 
				
			||||||
 | 
							LPCWSTR pszText);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						HRESULT(STDMETHODCALLTYPE *SetFileNameLabel)(
 | 
				
			||||||
 | 
							IFileOpenDialog* This,
 | 
				
			||||||
 | 
							LPCWSTR pszLabel);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						HRESULT(STDMETHODCALLTYPE *GetResult)(
 | 
				
			||||||
 | 
							IFileOpenDialog* This,
 | 
				
			||||||
 | 
							IShellItem **ppsi);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						HRESULT(STDMETHODCALLTYPE *AddPlace)(
 | 
				
			||||||
 | 
							IFileOpenDialog* This,
 | 
				
			||||||
 | 
							IShellItem *psi,
 | 
				
			||||||
 | 
							FDAP fdap);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						HRESULT(STDMETHODCALLTYPE *SetDefaultExtension)(
 | 
				
			||||||
 | 
							IFileOpenDialog* This,
 | 
				
			||||||
 | 
							LPCWSTR pszDefaultExtension);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						HRESULT(STDMETHODCALLTYPE *Close)(
 | 
				
			||||||
 | 
							IFileOpenDialog* This,
 | 
				
			||||||
 | 
							HRESULT hr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						HRESULT(STDMETHODCALLTYPE *SetClientGuid)(
 | 
				
			||||||
 | 
							IFileOpenDialog* This,
 | 
				
			||||||
 | 
							REFGUID guid);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						HRESULT(STDMETHODCALLTYPE *ClearClientData)(
 | 
				
			||||||
 | 
							IFileOpenDialog* This);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						HRESULT(STDMETHODCALLTYPE *SetFilter)(
 | 
				
			||||||
 | 
							IFileOpenDialog* This,
 | 
				
			||||||
 | 
							IShellItemFilter *pFilter);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/*** IFileOpenDialog methods ***/
 | 
				
			||||||
 | 
						HRESULT(STDMETHODCALLTYPE *GetResults)(
 | 
				
			||||||
 | 
							IFileOpenDialog* This,
 | 
				
			||||||
 | 
							IShellItemArray **ppenum);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						HRESULT(STDMETHODCALLTYPE *GetSelectedItems)(
 | 
				
			||||||
 | 
							IFileOpenDialog* This,
 | 
				
			||||||
 | 
							IShellItemArray **ppsai);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						END_INTERFACE
 | 
				
			||||||
 | 
					} IFileOpenDialogVtbl;
 | 
				
			||||||
 | 
					interface IFileOpenDialog {
 | 
				
			||||||
 | 
						CONST_VTBL IFileOpenDialogVtbl* lpVtbl;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -46,6 +46,7 @@
 | 
				
			||||||
    <ClInclude Include="..\inc\fat32.h" />
 | 
					    <ClInclude Include="..\inc\fat32.h" />
 | 
				
			||||||
    <ClInclude Include="..\inc\file.h" />
 | 
					    <ClInclude Include="..\inc\file.h" />
 | 
				
			||||||
    <ClInclude Include="..\inc\label_11_char.h" />
 | 
					    <ClInclude Include="..\inc\label_11_char.h" />
 | 
				
			||||||
 | 
					    <ClInclude Include="..\inc\libintl.h" />
 | 
				
			||||||
    <ClInclude Include="..\inc\mbr_2000.h" />
 | 
					    <ClInclude Include="..\inc\mbr_2000.h" />
 | 
				
			||||||
    <ClInclude Include="..\inc\mbr_95b.h" />
 | 
					    <ClInclude Include="..\inc\mbr_95b.h" />
 | 
				
			||||||
    <ClInclude Include="..\inc\mbr_dos.h" />
 | 
					    <ClInclude Include="..\inc\mbr_dos.h" />
 | 
				
			||||||
| 
						 | 
					@ -59,6 +60,7 @@
 | 
				
			||||||
    <ClInclude Include="..\inc\mbr_vista.h" />
 | 
					    <ClInclude Include="..\inc\mbr_vista.h" />
 | 
				
			||||||
    <ClInclude Include="..\inc\mbr_win7.h" />
 | 
					    <ClInclude Include="..\inc\mbr_win7.h" />
 | 
				
			||||||
    <ClInclude Include="..\inc\mbr_zero.h" />
 | 
					    <ClInclude Include="..\inc\mbr_zero.h" />
 | 
				
			||||||
 | 
					    <ClInclude Include="..\inc\nls.h" />
 | 
				
			||||||
    <ClInclude Include="..\inc\ntfs.h" />
 | 
					    <ClInclude Include="..\inc\ntfs.h" />
 | 
				
			||||||
    <ClInclude Include="..\inc\partition_info.h" />
 | 
					    <ClInclude Include="..\inc\partition_info.h" />
 | 
				
			||||||
  </ItemGroup>
 | 
					  </ItemGroup>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -137,6 +137,12 @@
 | 
				
			||||||
    <ClInclude Include="..\inc\mbr_grub2.h">
 | 
					    <ClInclude Include="..\inc\mbr_grub2.h">
 | 
				
			||||||
      <Filter>Header Files</Filter>
 | 
					      <Filter>Header Files</Filter>
 | 
				
			||||||
    </ClInclude>
 | 
					    </ClInclude>
 | 
				
			||||||
 | 
					    <ClInclude Include="..\inc\nls.h">
 | 
				
			||||||
 | 
					      <Filter>Header Files</Filter>
 | 
				
			||||||
 | 
					    </ClInclude>
 | 
				
			||||||
 | 
					    <ClInclude Include="..\inc\libintl.h">
 | 
				
			||||||
 | 
					      <Filter>Header Files</Filter>
 | 
				
			||||||
 | 
					    </ClInclude>
 | 
				
			||||||
  </ItemGroup>
 | 
					  </ItemGroup>
 | 
				
			||||||
  <ItemGroup>
 | 
					  <ItemGroup>
 | 
				
			||||||
    <ClCompile Include="..\br.c">
 | 
					    <ClCompile Include="..\br.c">
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -18,6 +18,7 @@
 | 
				
			||||||
#include <stdio.h>
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "file.h"
 | 
					#include "file.h"
 | 
				
			||||||
 | 
					#include "nls.h"
 | 
				
			||||||
#include "br.h"
 | 
					#include "br.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
unsigned long ulBytesPerSector = 512;
 | 
					unsigned long ulBytesPerSector = 512;
 | 
				
			||||||
| 
						 | 
					@ -42,6 +43,28 @@ int write_windows_disk_signature(FILE *fp, uint32_t tWDS)
 | 
				
			||||||
   return write_data(fp, 0x1b8, &tWDS, 4);
 | 
					   return write_data(fp, 0x1b8, &tWDS, 4);
 | 
				
			||||||
} /* write_windows_disk_signature */
 | 
					} /* write_windows_disk_signature */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					uint16_t read_mbr_copy_protect_bytes(FILE *fp)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					   uint16_t tOut;
 | 
				
			||||||
 | 
					   if(!read_data(fp, 0x1bc, &tOut, 2))
 | 
				
			||||||
 | 
					      return 0xffff;
 | 
				
			||||||
 | 
					   return tOut;
 | 
				
			||||||
 | 
					} /* read_mbr_copy_protect_bytes */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const char *read_mbr_copy_protect_bytes_explained(FILE *fp)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					   uint16_t t = read_mbr_copy_protect_bytes(fp);
 | 
				
			||||||
 | 
					   switch(t)
 | 
				
			||||||
 | 
					   {
 | 
				
			||||||
 | 
					      case 0:
 | 
				
			||||||
 | 
						 return _("not copy protected");
 | 
				
			||||||
 | 
					      case 0x5a5a:
 | 
				
			||||||
 | 
						 return _("copy protected");
 | 
				
			||||||
 | 
					      default:
 | 
				
			||||||
 | 
						 return _("unknown value");
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					} /* read_mbr_copy_protect_bytes_explained */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int is_br(FILE *fp)
 | 
					int is_br(FILE *fp)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
   /* A "file" is probably some kind of boot record if it contains the magic
 | 
					   /* A "file" is probably some kind of boot record if it contains the magic
 | 
				
			||||||
| 
						 | 
					@ -189,17 +212,6 @@ int is_zero_mbr(FILE *fp)
 | 
				
			||||||
	/* Don't bother to check 55AA signature */
 | 
						/* Don't bother to check 55AA signature */
 | 
				
			||||||
} /* is_zero_mbr */
 | 
					} /* is_zero_mbr */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int is_zero_mbr_with_other_windows_disk_signature(FILE *fp)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
   #include "mbr_zero.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   return
 | 
					 | 
				
			||||||
      (!contains_data(fp, 0x0, mbr_zero_0x0, sizeof(mbr_zero_0x0))) &&
 | 
					 | 
				
			||||||
      contains_data(fp, 0x0, mbr_zero_0x0, 0x1b8);
 | 
					 | 
				
			||||||
      contains_data(fp, 0x1bc, mbr_zero_0x0, 2);
 | 
					 | 
				
			||||||
	/* Don't bother to check 55AA signature */
 | 
					 | 
				
			||||||
} /* is_zero_mbr_with_other_windows_disk_signature */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
int is_zero_mbr_not_including_disk_signature_or_copy_protect(FILE *fp)
 | 
					int is_zero_mbr_not_including_disk_signature_or_copy_protect(FILE *fp)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
   #include "mbr_zero.h"
 | 
					   #include "mbr_zero.h"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -13,6 +13,10 @@ uint32_t read_windows_disk_signature(FILE *fp);
 | 
				
			||||||
/* Sets a new Windows Disk Signature to MBR */
 | 
					/* Sets a new Windows Disk Signature to MBR */
 | 
				
			||||||
int write_windows_disk_signature(FILE *fp, uint32_t tWDS);
 | 
					int write_windows_disk_signature(FILE *fp, uint32_t tWDS);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Reads copy protect bytes after Windows Disk Signature from MBR */
 | 
				
			||||||
 | 
					uint16_t read_mbr_copy_protect_bytes(FILE *fp);
 | 
				
			||||||
 | 
					const char *read_mbr_copy_protect_bytes_explained(FILE *fp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* returns TRUE if the file has a boot record, otherwise FALSE.
 | 
					/* returns TRUE if the file has a boot record, otherwise FALSE.
 | 
				
			||||||
   The file position will change when this function is called! */
 | 
					   The file position will change when this function is called! */
 | 
				
			||||||
int is_br(FILE *fp);
 | 
					int is_br(FILE *fp);
 | 
				
			||||||
| 
						 | 
					@ -77,7 +81,6 @@ int is_syslinux_gpt_mbr(FILE *fp);
 | 
				
			||||||
/* returns TRUE if the file has a zeroed master boot record, otherwise
 | 
					/* returns TRUE if the file has a zeroed master boot record, otherwise
 | 
				
			||||||
   FALSE.The file position will change when this function is called! */
 | 
					   FALSE.The file position will change when this function is called! */
 | 
				
			||||||
int is_zero_mbr(FILE *fp);
 | 
					int is_zero_mbr(FILE *fp);
 | 
				
			||||||
int is_zero_mbr_with_other_windows_disk_signature(FILE *fp);
 | 
					 | 
				
			||||||
int is_zero_mbr_not_including_disk_signature_or_copy_protect(FILE *fp);
 | 
					int is_zero_mbr_not_including_disk_signature_or_copy_protect(FILE *fp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Writes a dos master boot record to a file, returns TRUE on success, otherwise
 | 
					/* Writes a dos master boot record to a file, returns TRUE on success, otherwise
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										9
									
								
								src/ms-sys/inc/libintl.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								src/ms-sys/inc/libintl.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,9 @@
 | 
				
			||||||
 | 
					#ifndef LIBINTL_H
 | 
				
			||||||
 | 
					#define LIBINTL_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* This file is only supposed to be used on systems which doesn't have a
 | 
				
			||||||
 | 
					   builtin libintl.h and which also miss gnu gettext */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define NO_LIBINTL_OR_GETTEXT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
							
								
								
									
										17
									
								
								src/ms-sys/inc/nls.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								src/ms-sys/inc/nls.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,17 @@
 | 
				
			||||||
 | 
					#ifndef NLS_H
 | 
				
			||||||
 | 
					#define NLS_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <libintl.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef NO_LIBINTL_OR_GETTEXT
 | 
				
			||||||
 | 
					#define _(String) (String)
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define _(String) gettext(String)
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#define gettext_noop(String) (String)
 | 
				
			||||||
 | 
					#define N_(String) gettext_noop(String)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Init Native language support */
 | 
				
			||||||
 | 
					void nls_init(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
							
								
								
									
										61
									
								
								src/net.c
									
										
									
									
									
								
							
							
						
						
									
										61
									
								
								src/net.c
									
										
									
									
									
								
							| 
						 | 
					@ -1,7 +1,7 @@
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Rufus: The Reliable USB Formatting Utility
 | 
					 * Rufus: The Reliable USB Formatting Utility
 | 
				
			||||||
 * Networking functionality (web file download, check for update, etc.)
 | 
					 * Networking functionality (web file download, check for update, etc.)
 | 
				
			||||||
 * Copyright © 2012-2015 Pete Batard <pete@akeo.ie>
 | 
					 * Copyright © 2012-2016 Pete Batard <pete@akeo.ie>
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * This program is free software: you can redistribute it and/or modify
 | 
					 * This program is free software: you can redistribute it and/or modify
 | 
				
			||||||
 * it under the terms of the GNU General Public License as published by
 | 
					 * it under the terms of the GNU General Public License as published by
 | 
				
			||||||
| 
						 | 
					@ -30,14 +30,16 @@
 | 
				
			||||||
#include <string.h>
 | 
					#include <string.h>
 | 
				
			||||||
#include <inttypes.h>
 | 
					#include <inttypes.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "msapi_utf8.h"
 | 
					 | 
				
			||||||
#include "rufus.h"
 | 
					#include "rufus.h"
 | 
				
			||||||
#include "settings.h"
 | 
					#include "missing.h"
 | 
				
			||||||
#include "resource.h"
 | 
					#include "resource.h"
 | 
				
			||||||
 | 
					#include "msapi_utf8.h"
 | 
				
			||||||
#include "localization.h"
 | 
					#include "localization.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "settings.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Maximum download chunk size, in bytes */
 | 
					/* Maximum download chunk size, in bytes */
 | 
				
			||||||
#define DOWNLOAD_BUFFER_SIZE    10240
 | 
					#define DOWNLOAD_BUFFER_SIZE    10*KB
 | 
				
			||||||
/* Default delay between update checks (1 day) */
 | 
					/* Default delay between update checks (1 day) */
 | 
				
			||||||
#define DEFAULT_UPDATE_INTERVAL (24*3600)
 | 
					#define DEFAULT_UPDATE_INTERVAL (24*3600)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -49,38 +51,9 @@ static DWORD error_code;
 | 
				
			||||||
static BOOL update_check_in_progress = FALSE;
 | 
					static BOOL update_check_in_progress = FALSE;
 | 
				
			||||||
static BOOL force_update_check = FALSE;
 | 
					static BOOL force_update_check = FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* MinGW is missing some of those */
 | 
					 | 
				
			||||||
#if !defined(ERROR_INTERNET_DISCONNECTED)
 | 
					 | 
				
			||||||
#define ERROR_INTERNET_DISCONNECTED (INTERNET_ERROR_BASE + 163)
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#if !defined(ERROR_INTERNET_SERVER_UNREACHABLE)
 | 
					 | 
				
			||||||
#define ERROR_INTERNET_SERVER_UNREACHABLE (INTERNET_ERROR_BASE + 164)
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#if !defined(ERROR_INTERNET_PROXY_SERVER_UNREACHABLE)
 | 
					 | 
				
			||||||
#define ERROR_INTERNET_PROXY_SERVER_UNREACHABLE (INTERNET_ERROR_BASE + 165)
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#if !defined(ERROR_INTERNET_BAD_AUTO_PROXY_SCRIPT)
 | 
					 | 
				
			||||||
#define ERROR_INTERNET_BAD_AUTO_PROXY_SCRIPT (INTERNET_ERROR_BASE + 166)
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#if !defined(ERROR_INTERNET_UNABLE_TO_DOWNLOAD_SCRIPT)
 | 
					 | 
				
			||||||
#define ERROR_INTERNET_UNABLE_TO_DOWNLOAD_SCRIPT (INTERNET_ERROR_BASE + 167)
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#if !defined(ERROR_INTERNET_FAILED_DUETOSECURITYCHECK)
 | 
					 | 
				
			||||||
#define ERROR_INTERNET_FAILED_DUETOSECURITYCHECK (INTERNET_ERROR_BASE + 171)
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#if !defined(ERROR_INTERNET_NOT_INITIALIZED)
 | 
					 | 
				
			||||||
#define ERROR_INTERNET_NOT_INITIALIZED (INTERNET_ERROR_BASE + 172)
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#if !defined(ERROR_INTERNET_NEED_MSN_SSPI_PKG)
 | 
					 | 
				
			||||||
#define ERROR_INTERNET_NEED_MSN_SSPI_PKG (INTERNET_ERROR_BASE + 173)
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#if !defined(ERROR_INTERNET_LOGIN_FAILURE_DISPLAY_ENTITY_BODY)
 | 
					 | 
				
			||||||
#define ERROR_INTERNET_LOGIN_FAILURE_DISPLAY_ENTITY_BODY (INTERNET_ERROR_BASE + 174)
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * FormatMessage does not handle internet errors
 | 
					 * FormatMessage does not handle internet errors
 | 
				
			||||||
 * http://support.microsoft.com/kb/193625
 | 
					 * https://msdn.microsoft.com/en-us/library/windows/desktop/aa385465.aspx
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
const char* WinInetErrorString(void)
 | 
					const char* WinInetErrorString(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -300,7 +273,7 @@ DWORD DownloadFile(const char* url, const char* file, HWND hProgressDialog)
 | 
				
			||||||
		uprintf("Network is unavailable: %s\n", WinInetErrorString());
 | 
							uprintf("Network is unavailable: %s\n", WinInetErrorString());
 | 
				
			||||||
		goto out;
 | 
							goto out;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	_snprintf(agent, ARRAYSIZE(agent), APPLICATION_NAME "/%d.%d.%d (WinNT %d.%d%s)",
 | 
						safe_sprintf(agent, ARRAYSIZE(agent), APPLICATION_NAME "/%d.%d.%d (Windows NT %d.%d%s)",
 | 
				
			||||||
		rufus_version[0], rufus_version[1], rufus_version[2],
 | 
							rufus_version[0], rufus_version[1], rufus_version[2],
 | 
				
			||||||
		nWindowsVersion>>4, nWindowsVersion&0x0F, is_x64()?"; WOW64":"");
 | 
							nWindowsVersion>>4, nWindowsVersion&0x0F, is_x64()?"; WOW64":"");
 | 
				
			||||||
	hSession = InternetOpenA(agent, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
 | 
						hSession = InternetOpenA(agent, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
 | 
				
			||||||
| 
						 | 
					@ -429,9 +402,9 @@ static DWORD WINAPI CheckForUpdatesThread(LPVOID param)
 | 
				
			||||||
	BOOL releases_only, found_new_version = FALSE;
 | 
						BOOL releases_only, found_new_version = FALSE;
 | 
				
			||||||
	int status = 0;
 | 
						int status = 0;
 | 
				
			||||||
	const char* server_url = RUFUS_URL "/";
 | 
						const char* server_url = RUFUS_URL "/";
 | 
				
			||||||
	int i, j, k, verbose = 0, verpos[4];
 | 
						int i, j, k, max_channel, verbose = 0, verpos[4];
 | 
				
			||||||
	static const char* archname[] = {"win_x86", "win_x64"};
 | 
						static const char* archname[] = {"win_x86", "win_x64"};
 | 
				
			||||||
	static const char* channel[] = {"release", "beta"};		// release channel
 | 
						static const char* channel[] = {"release", "beta", "test"};		// release channel
 | 
				
			||||||
	const char* accept_types[] = {"*/*\0", NULL};
 | 
						const char* accept_types[] = {"*/*\0", NULL};
 | 
				
			||||||
	DWORD dwFlags, dwSize, dwDownloaded, dwTotalSize, dwStatus;
 | 
						DWORD dwFlags, dwSize, dwDownloaded, dwTotalSize, dwStatus;
 | 
				
			||||||
	char* buf = NULL;
 | 
						char* buf = NULL;
 | 
				
			||||||
| 
						 | 
					@ -474,8 +447,6 @@ static DWORD WINAPI CheckForUpdatesThread(LPVOID param)
 | 
				
			||||||
			vvuprintf("Local time: %" PRId64 "\n", local_time);
 | 
								vvuprintf("Local time: %" PRId64 "\n", local_time);
 | 
				
			||||||
			if (local_time < reg_time + update_interval) {
 | 
								if (local_time < reg_time + update_interval) {
 | 
				
			||||||
				vuprintf("Next update check in %" PRId64 " seconds.\n", reg_time + update_interval - local_time);
 | 
									vuprintf("Next update check in %" PRId64 " seconds.\n", reg_time + update_interval - local_time);
 | 
				
			||||||
				// This is as good a place as any to ask for translation help
 | 
					 | 
				
			||||||
				LostTranslatorCheck();
 | 
					 | 
				
			||||||
				goto out;
 | 
									goto out;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					@ -493,7 +464,9 @@ static DWORD WINAPI CheckForUpdatesThread(LPVOID param)
 | 
				
			||||||
		goto out;
 | 
							goto out;
 | 
				
			||||||
	hostname[sizeof(hostname)-1] = 0;
 | 
						hostname[sizeof(hostname)-1] = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	safe_sprintf(agent, ARRAYSIZE(agent), APPLICATION_NAME "/%d.%d.%d", rufus_version[0], rufus_version[1], rufus_version[2]);
 | 
						safe_sprintf(agent, ARRAYSIZE(agent), APPLICATION_NAME "/%d.%d.%d (Windows NT %d.%d%s)",
 | 
				
			||||||
 | 
							rufus_version[0], rufus_version[1], rufus_version[2],
 | 
				
			||||||
 | 
							nWindowsVersion >> 4, nWindowsVersion & 0x0F, is_x64() ? "; WOW64" : "");
 | 
				
			||||||
	hSession = InternetOpenA(agent, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
 | 
						hSession = InternetOpenA(agent, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
 | 
				
			||||||
	if (hSession == NULL)
 | 
						if (hSession == NULL)
 | 
				
			||||||
		goto out;
 | 
							goto out;
 | 
				
			||||||
| 
						 | 
					@ -504,7 +477,13 @@ static DWORD WINAPI CheckForUpdatesThread(LPVOID param)
 | 
				
			||||||
	status++;	// 2
 | 
						status++;	// 2
 | 
				
			||||||
	releases_only = !ReadSettingBool(SETTING_INCLUDE_BETAS);
 | 
						releases_only = !ReadSettingBool(SETTING_INCLUDE_BETAS);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (k=0; (k<(releases_only?1:(int)ARRAYSIZE(channel))) && (!found_new_version); k++) {
 | 
						// Test releases get their own distribution channel (and also force beta checks)
 | 
				
			||||||
 | 
					#if defined(TEST)
 | 
				
			||||||
 | 
						max_channel = (int)ARRAYSIZE(channel);
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
						max_channel = releases_only ? 1 : (int)ARRAYSIZE(channel) - 1;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
						for (k=0; (k<max_channel) && (!found_new_version); k++) {
 | 
				
			||||||
		uprintf("Checking %s channel...\n", channel[k]);
 | 
							uprintf("Checking %s channel...\n", channel[k]);
 | 
				
			||||||
		// At this stage we can query the server for various update version files.
 | 
							// At this stage we can query the server for various update version files.
 | 
				
			||||||
		// We first try to lookup for "<appname>_<os_arch>_<os_version_major>_<os_version_minor>.ver"
 | 
							// We first try to lookup for "<appname>_<os_arch>_<os_version_major>_<os_version_minor>.ver"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										15
									
								
								src/parser.c
									
										
									
									
									
								
							
							
						
						
									
										15
									
								
								src/parser.c
									
										
									
									
									
								
							| 
						 | 
					@ -1,7 +1,7 @@
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Rufus: The Reliable USB Formatting Utility
 | 
					 * Rufus: The Reliable USB Formatting Utility
 | 
				
			||||||
 * Elementary Unicode compliant find/replace parser
 | 
					 * Elementary Unicode compliant find/replace parser
 | 
				
			||||||
 * Copyright © 2012-2014 Pete Batard <pete@akeo.ie>
 | 
					 * Copyright © 2012-2016 Pete Batard <pete@akeo.ie>
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * This program is free software: you can redistribute it and/or modify
 | 
					 * This program is free software: you can redistribute it and/or modify
 | 
				
			||||||
 * it under the terms of the GNU General Public License as published by
 | 
					 * it under the terms of the GNU General Public License as published by
 | 
				
			||||||
| 
						 | 
					@ -32,6 +32,7 @@
 | 
				
			||||||
#include <fcntl.h>
 | 
					#include <fcntl.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "rufus.h"
 | 
					#include "rufus.h"
 | 
				
			||||||
 | 
					#include "missing.h"
 | 
				
			||||||
#include "msapi_utf8.h"
 | 
					#include "msapi_utf8.h"
 | 
				
			||||||
#include "localization.h"
 | 
					#include "localization.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -41,8 +42,6 @@ static const char* conversion_error = "Could not convert '%s' to UTF-16";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const struct {char c; int flag;} attr_parse[] = {
 | 
					const struct {char c; int flag;} attr_parse[] = {
 | 
				
			||||||
	{ 'r', LOC_RIGHT_TO_LEFT },
 | 
						{ 'r', LOC_RIGHT_TO_LEFT },
 | 
				
			||||||
	{ 'a', LOC_ARABIC_NUMERALS },	// NOT IMPLEMENTED
 | 
					 | 
				
			||||||
	{ 'j', LOC_JAPANESE_NUMERALS },	// NOT IMPLEMENTED
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
| 
						 | 
					@ -239,7 +238,6 @@ BOOL get_supported_locales(const char* filename)
 | 
				
			||||||
	FILE* fd = NULL;
 | 
						FILE* fd = NULL;
 | 
				
			||||||
	BOOL r = FALSE;
 | 
						BOOL r = FALSE;
 | 
				
			||||||
	char line[1024];
 | 
						char line[1024];
 | 
				
			||||||
	char* LT[] = LOST_TRANSLATORS;	//just to get the arraysize...
 | 
					 | 
				
			||||||
	size_t i, j, k;
 | 
						size_t i, j, k;
 | 
				
			||||||
	loc_cmd *lcmd = NULL, *last_lcmd = NULL;
 | 
						loc_cmd *lcmd = NULL, *last_lcmd = NULL;
 | 
				
			||||||
	long end_of_block;
 | 
						long end_of_block;
 | 
				
			||||||
| 
						 | 
					@ -344,18 +342,11 @@ BOOL get_supported_locales(const char* filename)
 | 
				
			||||||
					LOC_FRAMEWORK_VERSION, loc_base_minor);
 | 
										LOC_FRAMEWORK_VERSION, loc_base_minor);
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
				if (lcmd->unum[2] < loc_base_micro) {
 | 
									if (lcmd->unum[2] < loc_base_micro) {
 | 
				
			||||||
 | 
										last_lcmd->ctrl_id |= LOC_NEEDS_UPDATE;
 | 
				
			||||||
					luprintf("the version of this translation is older than the base one and may result in some messages not being properly translated.\n"
 | 
										luprintf("the version of this translation is older than the base one and may result in some messages not being properly translated.\n"
 | 
				
			||||||
						"If you are the translator, please update your translation with the changes that intervened between v%d.%d.%d and v%d.%d.%d.\n"
 | 
											"If you are the translator, please update your translation with the changes that intervened between v%d.%d.%d and v%d.%d.%d.\n"
 | 
				
			||||||
						"See https://github.com/pbatard/rufus/blob/master/res/localization/ChangeLog.txt",
 | 
											"See https://github.com/pbatard/rufus/blob/master/res/localization/ChangeLog.txt",
 | 
				
			||||||
						LOC_FRAMEWORK_VERSION, loc_base_minor, lcmd->unum[2], LOC_FRAMEWORK_VERSION, loc_base_minor, loc_base_micro);
 | 
											LOC_FRAMEWORK_VERSION, loc_base_minor, lcmd->unum[2], LOC_FRAMEWORK_VERSION, loc_base_minor, loc_base_micro);
 | 
				
			||||||
				} else if (lcmd->unum[2] >= loc_base_micro) {
 | 
					 | 
				
			||||||
					// Don't bug users about a locale that may already have been upgraded
 | 
					 | 
				
			||||||
					for (i=0; i<ARRAYSIZE(LT); i++) {
 | 
					 | 
				
			||||||
						if (safe_strcmp(last_lcmd->txt[0], lost_translators[i]) == 0) {
 | 
					 | 
				
			||||||
							uprintf("NOTE: This translation appears up to date - Removing it from LOST_TRANSLATORS");
 | 
					 | 
				
			||||||
							lost_translators[i][0] = 0;
 | 
					 | 
				
			||||||
						}
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				version_line_nr = loc_line_nr;
 | 
									version_line_nr = loc_line_nr;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,7 +1,7 @@
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Rufus: The Reliable USB Formatting Utility
 | 
					 * Rufus: The Reliable USB Formatting Utility
 | 
				
			||||||
 * PKI functions (code signing, etc.)
 | 
					 * PKI functions (code signing, etc.)
 | 
				
			||||||
 * Copyright © 2015 Pete Batard <pete@akeo.ie>
 | 
					 * Copyright © 2015-2016 Pete Batard <pete@akeo.ie>
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * This program is free software: you can redistribute it and/or modify
 | 
					 * This program is free software: you can redistribute it and/or modify
 | 
				
			||||||
 * it under the terms of the GNU General Public License as published by
 | 
					 * it under the terms of the GNU General Public License as published by
 | 
				
			||||||
| 
						 | 
					@ -29,8 +29,8 @@
 | 
				
			||||||
#include <wintrust.h>
 | 
					#include <wintrust.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "rufus.h"
 | 
					#include "rufus.h"
 | 
				
			||||||
#include "msapi_utf8.h"
 | 
					 | 
				
			||||||
#include "resource.h"
 | 
					#include "resource.h"
 | 
				
			||||||
 | 
					#include "msapi_utf8.h"
 | 
				
			||||||
#include "localization.h"
 | 
					#include "localization.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define ENCODING (X509_ASN_ENCODING | PKCS_7_ASN_ENCODING)
 | 
					#define ENCODING (X509_ASN_ENCODING | PKCS_7_ASN_ENCODING)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -54,13 +54,14 @@ static __inline BOOL DeleteRegistryKey(HKEY key_root, const char* key_name)
 | 
				
			||||||
   the application and create the app subkey if required */
 | 
					   the application and create the app subkey if required */
 | 
				
			||||||
static __inline BOOL _GetRegistryKey(HKEY key_root, const char* key_name, DWORD reg_type, LPBYTE dest, DWORD dest_size)
 | 
					static __inline BOOL _GetRegistryKey(HKEY key_root, const char* key_name, DWORD reg_type, LPBYTE dest, DWORD dest_size)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						const char software_prefix[] = "SOFTWARE\\";
 | 
				
			||||||
 | 
						char long_key_name[MAX_PATH] = { 0 };
 | 
				
			||||||
	BOOL r = FALSE;
 | 
						BOOL r = FALSE;
 | 
				
			||||||
	size_t i = 0;
 | 
						size_t i;
 | 
				
			||||||
	LONG s;
 | 
						LONG s;
 | 
				
			||||||
	HKEY hSoftware = NULL, hApp = NULL;
 | 
						HKEY hSoftware = NULL, hApp = NULL;
 | 
				
			||||||
	DWORD dwDisp, dwType = -1, dwSize = dest_size;
 | 
						DWORD dwDisp, dwType = -1, dwSize = dest_size;
 | 
				
			||||||
	// VS Code Analysis complains if we don't break our initialization into chars
 | 
					
 | 
				
			||||||
	char long_key_name[256] = { 0 };
 | 
					 | 
				
			||||||
	memset(dest, 0, dest_size);
 | 
						memset(dest, 0, dest_size);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (key_name == NULL)
 | 
						if (key_name == NULL)
 | 
				
			||||||
| 
						 | 
					@ -72,9 +73,15 @@ static __inline BOOL _GetRegistryKey(HKEY key_root, const char* key_name, DWORD
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (i != 0) {
 | 
						if (i != 0) {
 | 
				
			||||||
		strcpy(long_key_name, "SOFTWARE\\");
 | 
							// Prefix with "SOFTWARE" if needed
 | 
				
			||||||
		safe_strcat(long_key_name, sizeof(long_key_name), key_name);
 | 
							if (_strnicmp(key_name, software_prefix, sizeof(software_prefix) - 1) != 0) {
 | 
				
			||||||
		long_key_name[sizeof("SOFTWARE\\") + i-1] = 0;
 | 
								strcpy(long_key_name, software_prefix);
 | 
				
			||||||
 | 
								safe_strcat(long_key_name, sizeof(long_key_name), key_name);
 | 
				
			||||||
 | 
								long_key_name[sizeof(software_prefix) + i - 1] = 0;
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								safe_strcpy(long_key_name, sizeof(long_key_name), key_name);
 | 
				
			||||||
 | 
								long_key_name[i] = 0;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		i++;
 | 
							i++;
 | 
				
			||||||
		if (RegOpenKeyExA(key_root, long_key_name, 0, KEY_READ, &hApp) != ERROR_SUCCESS) {
 | 
							if (RegOpenKeyExA(key_root, long_key_name, 0, KEY_READ, &hApp) != ERROR_SUCCESS) {
 | 
				
			||||||
			hApp = NULL;
 | 
								hApp = NULL;
 | 
				
			||||||
| 
						 | 
					@ -94,7 +101,7 @@ static __inline BOOL _GetRegistryKey(HKEY key_root, const char* key_name, DWORD
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	s = RegQueryValueExA(hApp, &key_name[i], NULL, &dwType, (LPBYTE)dest, &dwSize);
 | 
						s = RegQueryValueExA(hApp, &key_name[i], NULL, &dwType, (LPBYTE)dest, &dwSize);
 | 
				
			||||||
	// No key means default value of 0 or empty string
 | 
						// No key means default value of 0 or empty string
 | 
				
			||||||
	if ((s == ERROR_FILE_NOT_FOUND) || ((s == ERROR_SUCCESS) && (dwType = reg_type) && (dwSize > 0))) {
 | 
						if ((s == ERROR_FILE_NOT_FOUND) || ((s == ERROR_SUCCESS) && (dwType == reg_type) && (dwSize > 0))) {
 | 
				
			||||||
		r = TRUE;
 | 
							r = TRUE;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
out:
 | 
					out:
 | 
				
			||||||
| 
						 | 
					@ -108,25 +115,57 @@ out:
 | 
				
			||||||
/* Write a generic registry key value (create the key if it doesn't exist) */
 | 
					/* Write a generic registry key value (create the key if it doesn't exist) */
 | 
				
			||||||
static __inline BOOL _SetRegistryKey(HKEY key_root, const char* key_name, DWORD reg_type, LPBYTE src, DWORD src_size)
 | 
					static __inline BOOL _SetRegistryKey(HKEY key_root, const char* key_name, DWORD reg_type, LPBYTE src, DWORD src_size)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						const char software_prefix[] = "SOFTWARE\\";
 | 
				
			||||||
 | 
						char long_key_name[MAX_PATH] = { 0 };
 | 
				
			||||||
	BOOL r = FALSE;
 | 
						BOOL r = FALSE;
 | 
				
			||||||
	HKEY hSoftware = NULL, hApp = NULL;
 | 
						size_t i;
 | 
				
			||||||
 | 
						HKEY hRoot = NULL, hApp = NULL;
 | 
				
			||||||
	DWORD dwDisp, dwType = reg_type;
 | 
						DWORD dwDisp, dwType = reg_type;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (RegOpenKeyExA(key_root, "SOFTWARE", 0, KEY_READ|KEY_CREATE_SUB_KEY, &hSoftware) != ERROR_SUCCESS) {
 | 
						if (key_name == NULL)
 | 
				
			||||||
		hSoftware = NULL;
 | 
							return FALSE;
 | 
				
			||||||
		goto out;
 | 
					
 | 
				
			||||||
	}
 | 
						if (RegOpenKeyExA(key_root, NULL, 0, KEY_READ|KEY_CREATE_SUB_KEY, &hRoot) != ERROR_SUCCESS) {
 | 
				
			||||||
	if (RegCreateKeyExA(hSoftware, COMPANY_NAME "\\" APPLICATION_NAME, 0, NULL, 0,
 | 
							hRoot = NULL;
 | 
				
			||||||
		KEY_SET_VALUE|KEY_QUERY_VALUE|KEY_CREATE_SUB_KEY, NULL, &hApp, &dwDisp) != ERROR_SUCCESS) {
 | 
					 | 
				
			||||||
		hApp = NULL;
 | 
					 | 
				
			||||||
		goto out;
 | 
							goto out;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	r = (RegSetValueExA(hApp, key_name, 0, dwType, src, src_size) == ERROR_SUCCESS);
 | 
						// Find if we're dealing with a short key
 | 
				
			||||||
 | 
						for (i = safe_strlen(key_name); i>0; i--) {
 | 
				
			||||||
 | 
							if (key_name[i] == '\\')
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (i == 0) {
 | 
				
			||||||
 | 
							// If this is a short key name, store the value under our app sub-hive
 | 
				
			||||||
 | 
							if (RegCreateKeyExA(hRoot, "SOFTWARE\\" COMPANY_NAME "\\" APPLICATION_NAME, 0, NULL, 0,
 | 
				
			||||||
 | 
								KEY_SET_VALUE | KEY_QUERY_VALUE | KEY_CREATE_SUB_KEY, NULL, &hApp, &dwDisp) != ERROR_SUCCESS) {
 | 
				
			||||||
 | 
								hApp = NULL;
 | 
				
			||||||
 | 
								goto out;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							// Prefix with "SOFTWARE" if needed
 | 
				
			||||||
 | 
							if (_strnicmp(key_name, software_prefix, sizeof(software_prefix) - 1) != 0) {
 | 
				
			||||||
 | 
								strcpy(long_key_name, software_prefix);
 | 
				
			||||||
 | 
								safe_strcat(long_key_name, sizeof(long_key_name), key_name);
 | 
				
			||||||
 | 
								long_key_name[sizeof(software_prefix) + i - 1] = 0;
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								safe_strcpy(long_key_name, sizeof(long_key_name), key_name);
 | 
				
			||||||
 | 
								long_key_name[i] = 0;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							i++;
 | 
				
			||||||
 | 
							if (RegCreateKeyExA(hRoot, long_key_name, 0, NULL, 0,
 | 
				
			||||||
 | 
								KEY_SET_VALUE | KEY_QUERY_VALUE | KEY_CREATE_SUB_KEY, NULL, &hApp, &dwDisp) != ERROR_SUCCESS) {
 | 
				
			||||||
 | 
								hApp = NULL;
 | 
				
			||||||
 | 
								goto out;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						r = (RegSetValueExA(hApp, &key_name[i], 0, dwType, src, src_size) == ERROR_SUCCESS);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
out:
 | 
					out:
 | 
				
			||||||
	if (hSoftware != NULL)
 | 
						if (hRoot != NULL)
 | 
				
			||||||
		RegCloseKey(hSoftware);
 | 
							RegCloseKey(hRoot);
 | 
				
			||||||
	if (hApp != NULL)
 | 
						if (hApp != NULL)
 | 
				
			||||||
		RegCloseKey(hApp);
 | 
							RegCloseKey(hApp);
 | 
				
			||||||
	return r;
 | 
						return r;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										379
									
								
								src/rufus.c
									
										
									
									
									
								
							
							
						
						
									
										379
									
								
								src/rufus.c
									
										
									
									
									
								
							| 
						 | 
					@ -35,59 +35,23 @@
 | 
				
			||||||
#include <io.h>
 | 
					#include <io.h>
 | 
				
			||||||
#include <getopt.h>
 | 
					#include <getopt.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "msapi_utf8.h"
 | 
					 | 
				
			||||||
#include "resource.h"
 | 
					 | 
				
			||||||
#include "rufus.h"
 | 
					#include "rufus.h"
 | 
				
			||||||
 | 
					#include "missing.h"
 | 
				
			||||||
 | 
					#include "resource.h"
 | 
				
			||||||
 | 
					#include "msapi_utf8.h"
 | 
				
			||||||
 | 
					#include "localization.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "drive.h"
 | 
					#include "drive.h"
 | 
				
			||||||
#include "settings.h"
 | 
					#include "settings.h"
 | 
				
			||||||
#include "localization.h"
 | 
					 | 
				
			||||||
#include "bled/bled.h"
 | 
					#include "bled/bled.h"
 | 
				
			||||||
#include "../res/grub/grub_version.h"
 | 
					#include "../res/grub/grub_version.h"
 | 
				
			||||||
#include "../res/grub2/grub2_version.h"
 | 
					#include "../res/grub2/grub2_version.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Redefinitions for WDK and MinGW */
 | 
					 | 
				
			||||||
// TODO: these would be better in a 'missing.h' file
 | 
					 | 
				
			||||||
#ifndef PBM_SETSTATE
 | 
					 | 
				
			||||||
#define PBM_SETSTATE (WM_USER+16)
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#ifndef PBST_NORMAL
 | 
					 | 
				
			||||||
#define PBST_NORMAL 1
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#ifndef PBST_ERROR
 | 
					 | 
				
			||||||
#define PBST_ERROR 2
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#ifndef PBST_PAUSED
 | 
					 | 
				
			||||||
#define PBST_PAUSED 3
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#ifndef BUTTON_IMAGELIST_ALIGN_CENTER
 | 
					 | 
				
			||||||
#define BUTTON_IMAGELIST_ALIGN_CENTER 4
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#ifndef BCM_SETIMAGELIST
 | 
					 | 
				
			||||||
#define BCM_SETIMAGELIST 0x1602
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#ifndef DBT_CUSTOMEVENT
 | 
					 | 
				
			||||||
#define DBT_CUSTOMEVENT 0x8006
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#ifndef ERROR_FILE_TOO_LARGE
 | 
					 | 
				
			||||||
#define ERROR_FILE_TOO_LARGE 223
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct {
 | 
					 | 
				
			||||||
	HIMAGELIST himl;
 | 
					 | 
				
			||||||
	RECT margin;
 | 
					 | 
				
			||||||
	UINT uAlign;
 | 
					 | 
				
			||||||
} bi_iso = {0}, bi_up = {0}, bi_down = {0};	// BUTTON_IMAGELIST
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef struct
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	LPCITEMIDLIST pidl;
 | 
					 | 
				
			||||||
	BOOL fRecursive;
 | 
					 | 
				
			||||||
} MY_SHChangeNotifyEntry;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// MinGW doesn't know these
 | 
					// MinGW doesn't know these
 | 
				
			||||||
PF_TYPE(WINAPI, HIMAGELIST, ImageList_Create, (int, int, UINT, int, int));
 | 
					PF_TYPE(WINAPI, HIMAGELIST, ImageList_Create, (int, int, UINT, int, int));
 | 
				
			||||||
PF_TYPE(WINAPI, int, ImageList_AddIcon, (HIMAGELIST, HICON));
 | 
					PF_TYPE(WINAPI, int, ImageList_AddIcon, (HIMAGELIST, HICON));
 | 
				
			||||||
PF_TYPE(WINAPI, int, ImageList_ReplaceIcon, (HIMAGELIST, int, HICON));
 | 
					PF_TYPE(WINAPI, int, ImageList_ReplaceIcon, (HIMAGELIST, int, HICON));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// WDK blows up when trying to using PF_TYPE_DECL() for the ImageList calls... so we don't.
 | 
					// WDK blows up when trying to using PF_TYPE_DECL() for the ImageList calls... so we don't.
 | 
				
			||||||
PF_DECL(ImageList_Create);
 | 
					PF_DECL(ImageList_Create);
 | 
				
			||||||
PF_DECL(ImageList_AddIcon);
 | 
					PF_DECL(ImageList_AddIcon);
 | 
				
			||||||
| 
						 | 
					@ -122,7 +86,6 @@ static HBRUSH hInfoBrush;
 | 
				
			||||||
static WNDPROC info_original_proc = NULL;
 | 
					static WNDPROC info_original_proc = NULL;
 | 
				
			||||||
char ClusterSizeLabel[MAX_CLUSTER_SIZES][64];
 | 
					char ClusterSizeLabel[MAX_CLUSTER_SIZES][64];
 | 
				
			||||||
char msgbox[1024], msgbox_title[32], *ini_file = NULL;
 | 
					char msgbox[1024], msgbox_title[32], *ini_file = NULL;
 | 
				
			||||||
char lost_translators[][6] = LOST_TRANSLATORS;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Globals
 | 
					 * Globals
 | 
				
			||||||
| 
						 | 
					@ -130,6 +93,8 @@ char lost_translators[][6] = LOST_TRANSLATORS;
 | 
				
			||||||
OPENED_LIBRARIES_VARS;
 | 
					OPENED_LIBRARIES_VARS;
 | 
				
			||||||
HINSTANCE hMainInstance;
 | 
					HINSTANCE hMainInstance;
 | 
				
			||||||
HWND hMainDialog, hLangToolbar = NULL, hUpdatesDlg = NULL;
 | 
					HWND hMainDialog, hLangToolbar = NULL, hUpdatesDlg = NULL;
 | 
				
			||||||
 | 
					MY_BUTTON_IMAGELIST bi_iso = { 0 }, bi_up = { 0 }, bi_down = { 0 };
 | 
				
			||||||
 | 
					GetTickCount64_t pfGetTickCount64 = NULL;
 | 
				
			||||||
char szFolderPath[MAX_PATH], app_dir[MAX_PATH], system_dir[MAX_PATH], sysnative_dir[MAX_PATH];
 | 
					char szFolderPath[MAX_PATH], app_dir[MAX_PATH], system_dir[MAX_PATH], sysnative_dir[MAX_PATH];
 | 
				
			||||||
char* image_path = NULL;
 | 
					char* image_path = NULL;
 | 
				
			||||||
float fScale = 1.0f;
 | 
					float fScale = 1.0f;
 | 
				
			||||||
| 
						 | 
					@ -143,7 +108,7 @@ BOOL use_own_c32[NB_OLD_C32] = {FALSE, FALSE}, mbr_selected_by_user = FALSE, tog
 | 
				
			||||||
BOOL iso_op_in_progress = FALSE, format_op_in_progress = FALSE, right_to_left_mode = FALSE;
 | 
					BOOL iso_op_in_progress = FALSE, format_op_in_progress = FALSE, right_to_left_mode = FALSE;
 | 
				
			||||||
BOOL enable_HDDs = FALSE, force_update = FALSE, enable_ntfs_compression = FALSE, no_confirmation_on_cancel = FALSE, lock_drive = TRUE;
 | 
					BOOL enable_HDDs = FALSE, force_update = FALSE, enable_ntfs_compression = FALSE, no_confirmation_on_cancel = FALSE, lock_drive = TRUE;
 | 
				
			||||||
BOOL advanced_mode, allow_dual_uefi_bios, detect_fakes, enable_vmdk, force_large_fat32, usb_debug, use_fake_units, preserve_timestamps;
 | 
					BOOL advanced_mode, allow_dual_uefi_bios, detect_fakes, enable_vmdk, force_large_fat32, usb_debug, use_fake_units, preserve_timestamps;
 | 
				
			||||||
BOOL zero_drive = FALSE;
 | 
					BOOL zero_drive = FALSE, list_non_usb_removable_drives = FALSE;
 | 
				
			||||||
int dialog_showing = 0, lang_button_id = 0;
 | 
					int dialog_showing = 0, lang_button_id = 0;
 | 
				
			||||||
uint16_t rufus_version[3], embedded_sl_version[2];
 | 
					uint16_t rufus_version[3], embedded_sl_version[2];
 | 
				
			||||||
char embedded_sl_version_str[2][12] = { "?.??", "?.??" };
 | 
					char embedded_sl_version_str[2][12] = { "?.??", "?.??" };
 | 
				
			||||||
| 
						 | 
					@ -184,11 +149,6 @@ static __inline void SetComboEntry(HWND hDlg, int data) {
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define KB          1024LL
 | 
					 | 
				
			||||||
#define MB       1048576LL
 | 
					 | 
				
			||||||
#define GB    1073741824LL
 | 
					 | 
				
			||||||
#define TB 1099511627776LL
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Fill in the cluster size names
 | 
					 * Fill in the cluster size names
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
| 
						 | 
					@ -218,10 +178,6 @@ static BOOL DefineClusterSizes(void)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	default_fs = FS_UNKNOWN;
 | 
						default_fs = FS_UNKNOWN;
 | 
				
			||||||
	memset(&SelectedDrive.ClusterSize, 0, sizeof(SelectedDrive.ClusterSize));
 | 
						memset(&SelectedDrive.ClusterSize, 0, sizeof(SelectedDrive.ClusterSize));
 | 
				
			||||||
	if (SelectedDrive.DiskSize < 8*MB) {
 | 
					 | 
				
			||||||
		uprintf("Device was eliminated because it is smaller than 8 MB\n");
 | 
					 | 
				
			||||||
		goto out;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * The following are MS's allowed cluster sizes for FAT16 and FAT32:
 | 
					 * The following are MS's allowed cluster sizes for FAT16 and FAT32:
 | 
				
			||||||
| 
						 | 
					@ -286,7 +242,7 @@ static BOOL DefineClusterSizes(void)
 | 
				
			||||||
		if ((SelectedDrive.DiskSize >= 256*MB) && (SelectedDrive.DiskSize < 32*GB)) {
 | 
							if ((SelectedDrive.DiskSize >= 256*MB) && (SelectedDrive.DiskSize < 32*GB)) {
 | 
				
			||||||
			for (i=8; i<=32; i<<=1) {				// 256 MB -> 32 GB
 | 
								for (i=8; i<=32; i<<=1) {				// 256 MB -> 32 GB
 | 
				
			||||||
				if (SelectedDrive.DiskSize*1.0f < i*GB*FAT32_CLUSTER_THRESHOLD) {
 | 
									if (SelectedDrive.DiskSize*1.0f < i*GB*FAT32_CLUSTER_THRESHOLD) {
 | 
				
			||||||
					SelectedDrive.ClusterSize[FS_FAT32].Default = ((ULONG)i/2)*1024;
 | 
										SelectedDrive.ClusterSize[FS_FAT32].Default = ((ULONG)i/2)*KB;
 | 
				
			||||||
					break;
 | 
										break;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
| 
						 | 
					@ -303,7 +259,7 @@ static BOOL DefineClusterSizes(void)
 | 
				
			||||||
		SelectedDrive.ClusterSize[FS_NTFS].Allowed = 0x0001FE00;
 | 
							SelectedDrive.ClusterSize[FS_NTFS].Allowed = 0x0001FE00;
 | 
				
			||||||
		for (i=16; i<=256; i<<=1) {				// 7 MB -> 256 TB
 | 
							for (i=16; i<=256; i<<=1) {				// 7 MB -> 256 TB
 | 
				
			||||||
			if (SelectedDrive.DiskSize < i*TB) {
 | 
								if (SelectedDrive.DiskSize < i*TB) {
 | 
				
			||||||
				SelectedDrive.ClusterSize[FS_NTFS].Default = ((ULONG)i/4)*1024;
 | 
									SelectedDrive.ClusterSize[FS_NTFS].Default = ((ULONG)i/4)*KB;
 | 
				
			||||||
				break;
 | 
									break;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					@ -312,11 +268,11 @@ static BOOL DefineClusterSizes(void)
 | 
				
			||||||
		if (nWindowsVersion > WINDOWS_XP) {
 | 
							if (nWindowsVersion > WINDOWS_XP) {
 | 
				
			||||||
			SelectedDrive.ClusterSize[FS_EXFAT].Allowed = 0x03FFFE00;
 | 
								SelectedDrive.ClusterSize[FS_EXFAT].Allowed = 0x03FFFE00;
 | 
				
			||||||
			if (SelectedDrive.DiskSize < 256*MB)	// < 256 MB
 | 
								if (SelectedDrive.DiskSize < 256*MB)	// < 256 MB
 | 
				
			||||||
				SelectedDrive.ClusterSize[FS_EXFAT].Default = 4*1024;
 | 
									SelectedDrive.ClusterSize[FS_EXFAT].Default = 4*KB;
 | 
				
			||||||
			else if (SelectedDrive.DiskSize < 32*GB)	// < 32 GB
 | 
								else if (SelectedDrive.DiskSize < 32*GB)	// < 32 GB
 | 
				
			||||||
				SelectedDrive.ClusterSize[FS_EXFAT].Default = 32*1024;
 | 
									SelectedDrive.ClusterSize[FS_EXFAT].Default = 32*KB;
 | 
				
			||||||
			else
 | 
								else
 | 
				
			||||||
				SelectedDrive.ClusterSize[FS_EXFAT].Default = 28*1024;
 | 
									SelectedDrive.ClusterSize[FS_EXFAT].Default = 128*KB;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// UDF (only supported for Vista and later)
 | 
							// UDF (only supported for Vista and later)
 | 
				
			||||||
| 
						 | 
					@ -334,7 +290,6 @@ static BOOL DefineClusterSizes(void)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
out:
 | 
					 | 
				
			||||||
	// Only add the filesystems we can service
 | 
						// Only add the filesystems we can service
 | 
				
			||||||
	for (fs=0; fs<FS_MAX; fs++) {
 | 
						for (fs=0; fs<FS_MAX; fs++) {
 | 
				
			||||||
		// Remove all cluster sizes that are below the sector size
 | 
							// Remove all cluster sizes that are below the sector size
 | 
				
			||||||
| 
						 | 
					@ -366,10 +321,6 @@ out:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return r;
 | 
						return r;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#undef KB
 | 
					 | 
				
			||||||
#undef MB
 | 
					 | 
				
			||||||
#undef GB
 | 
					 | 
				
			||||||
#undef TB
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Populate the Allocation unit size field
 | 
					 * Populate the Allocation unit size field
 | 
				
			||||||
| 
						 | 
					@ -645,7 +596,7 @@ static void SetTargetSystem(void)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void SetProposedLabel(int ComboIndex)
 | 
					static void SetProposedLabel(int ComboIndex)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	const char no_label[] = STR_NO_LABEL;
 | 
						const char no_label[] = STR_NO_LABEL, empty[] = "";
 | 
				
			||||||
	int bt = (int)ComboBox_GetItemData(hBootType, ComboBox_GetCurSel(hBootType));
 | 
						int bt = (int)ComboBox_GetItemData(hBootType, ComboBox_GetCurSel(hBootType));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	app_changed_label = TRUE;
 | 
						app_changed_label = TRUE;
 | 
				
			||||||
| 
						 | 
					@ -671,7 +622,7 @@ static void SetProposedLabel(int ComboIndex)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Else if no existing label is available, propose one according to the size (eg: "256MB", "8GB")
 | 
						// Else if no existing label is available, propose one according to the size (eg: "256MB", "8GB")
 | 
				
			||||||
	if ((safe_stricmp(no_label, DriveLabel.String[ComboIndex]) == 0) || (safe_stricmp(no_label, "") == 0)
 | 
						if ((safe_stricmp(no_label, DriveLabel.String[ComboIndex]) == 0) || (safe_stricmp(no_label, empty) == 0)
 | 
				
			||||||
		|| (safe_stricmp(lmprintf(MSG_207), DriveLabel.String[ComboIndex]) == 0)) {
 | 
							|| (safe_stricmp(lmprintf(MSG_207), DriveLabel.String[ComboIndex]) == 0)) {
 | 
				
			||||||
		SetWindowTextU(hLabel, SelectedDrive.proposed_label);
 | 
							SetWindowTextU(hLabel, SelectedDrive.proposed_label);
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
| 
						 | 
					@ -693,10 +644,12 @@ static BOOL PopulateProperties(int ComboIndex)
 | 
				
			||||||
	memset(&SelectedDrive, 0, sizeof(SelectedDrive));
 | 
						memset(&SelectedDrive, 0, sizeof(SelectedDrive));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (ComboIndex < 0)
 | 
						if (ComboIndex < 0)
 | 
				
			||||||
		return TRUE;
 | 
							goto out;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!SetDriveInfo(ComboIndex))	// This also populates FS
 | 
						if (!SetDriveInfo(ComboIndex)) {	// This also populates FS
 | 
				
			||||||
 | 
							SetProposedLabel(-1);
 | 
				
			||||||
		return FALSE;
 | 
							return FALSE;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	SetTargetSystem();
 | 
						SetTargetSystem();
 | 
				
			||||||
	SetFSFromISO();
 | 
						SetFSFromISO();
 | 
				
			||||||
	EnableBootOptions(TRUE, TRUE);
 | 
						EnableBootOptions(TRUE, TRUE);
 | 
				
			||||||
| 
						 | 
					@ -714,8 +667,8 @@ static BOOL PopulateProperties(int ComboIndex)
 | 
				
			||||||
		free(device_tooltip);
 | 
							free(device_tooltip);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					out:
 | 
				
			||||||
	SetProposedLabel(ComboIndex);
 | 
						SetProposedLabel(ComboIndex);
 | 
				
			||||||
 | 
					 | 
				
			||||||
	return TRUE;
 | 
						return TRUE;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -810,6 +763,7 @@ static void InitProgress(BOOL bOnlyFormat)
 | 
				
			||||||
void UpdateProgress(int op, float percent)
 | 
					void UpdateProgress(int op, float percent)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int pos;
 | 
						int pos;
 | 
				
			||||||
 | 
						static uint64_t LastRefresh = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ((op < 0) || (op >= OP_MAX)) {
 | 
						if ((op < 0) || (op >= OP_MAX)) {
 | 
				
			||||||
		duprintf("UpdateProgress: invalid op %d\n", op);
 | 
							duprintf("UpdateProgress: invalid op %d\n", op);
 | 
				
			||||||
| 
						 | 
					@ -841,8 +795,12 @@ void UpdateProgress(int op, float percent)
 | 
				
			||||||
		pos = MAX_PROGRESS;
 | 
							pos = MAX_PROGRESS;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	SendMessage(hProgress, PBM_SETPOS, (WPARAM)pos, 0);
 | 
						// Reduce the refresh rate, to avoid weird effects on the sliding part of progress bar
 | 
				
			||||||
	SetTaskbarProgressValue(pos, MAX_PROGRESS);
 | 
						if (_GetTickCount64() > LastRefresh + (2 * MAX_REFRESH)) {
 | 
				
			||||||
 | 
							LastRefresh = _GetTickCount64();
 | 
				
			||||||
 | 
							SendMessage(hProgress, PBM_SETPOS, (WPARAM)pos, 0);
 | 
				
			||||||
 | 
							SetTaskbarProgressValue(pos, MAX_PROGRESS);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
| 
						 | 
					@ -879,7 +837,7 @@ BOOL CALLBACK LogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	HDC hdc;
 | 
						HDC hdc;
 | 
				
			||||||
	HFONT hf;
 | 
						HFONT hf;
 | 
				
			||||||
	long lfHeight;
 | 
						long lfHeight, style;
 | 
				
			||||||
	DWORD log_size;
 | 
						DWORD log_size;
 | 
				
			||||||
	char *log_buffer = NULL, *filepath;
 | 
						char *log_buffer = NULL, *filepath;
 | 
				
			||||||
	EXT_DECL(log_ext, "rufus.log", __VA_GROUP__("*.log"), __VA_GROUP__("Rufus log"));
 | 
						EXT_DECL(log_ext, "rufus.log", __VA_GROUP__("*.log"), __VA_GROUP__("Rufus log"));
 | 
				
			||||||
| 
						 | 
					@ -887,6 +845,7 @@ BOOL CALLBACK LogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
 | 
				
			||||||
	case WM_INITDIALOG:
 | 
						case WM_INITDIALOG:
 | 
				
			||||||
		apply_localization(IDD_LOG, hDlg);
 | 
							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);
 | 
				
			||||||
		// Set the font to Unicode so that we can display anything
 | 
							// Set the font to Unicode so that we can display anything
 | 
				
			||||||
| 
						 | 
					@ -899,6 +858,18 @@ BOOL CALLBACK LogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
 | 
				
			||||||
		SendDlgItemMessageA(hDlg, IDC_LOG_EDIT, WM_SETFONT, (WPARAM)hf, TRUE);
 | 
							SendDlgItemMessageA(hDlg, IDC_LOG_EDIT, WM_SETFONT, (WPARAM)hf, TRUE);
 | 
				
			||||||
		// Set 'Close Log' as the selected button
 | 
							// Set 'Close Log' as the selected button
 | 
				
			||||||
		SendMessage(hDlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem(hDlg, IDCANCEL), TRUE);
 | 
							SendMessage(hDlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem(hDlg, IDCANCEL), TRUE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Suppress any inherited RTL flags from our edit control's style. Otherwise
 | 
				
			||||||
 | 
							// the displayed text becomes a mess due to Windows trying to interpret
 | 
				
			||||||
 | 
							// dots, parenthesis, columns and so on in an RTL context...
 | 
				
			||||||
 | 
							// We also take this opportunity to fix the scroll bar and text alignment.
 | 
				
			||||||
 | 
							style = GetWindowLong(hLog, GWL_EXSTYLE);
 | 
				
			||||||
 | 
							style &= ~(WS_EX_RTLREADING | WS_EX_RIGHT | WS_EX_LEFTSCROLLBAR);
 | 
				
			||||||
 | 
							SetWindowLong(hLog, GWL_EXSTYLE, style);
 | 
				
			||||||
 | 
							style = GetWindowLong(hLog, GWL_STYLE);
 | 
				
			||||||
 | 
							style &= ~(ES_RIGHT);
 | 
				
			||||||
 | 
							SetWindowLong(hLog, GWL_STYLE, style);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	case WM_COMMAND:
 | 
						case WM_COMMAND:
 | 
				
			||||||
		switch (LOWORD(wParam)) {
 | 
							switch (LOWORD(wParam)) {
 | 
				
			||||||
| 
						 | 
					@ -980,68 +951,41 @@ static void CALLBACK BlockingTimer(HWND hWnd, UINT uMsg, UINT_PTR idEvent, DWORD
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Randomly nag users about translations that have been left behind
 | 
					 | 
				
			||||||
void LostTranslatorCheck(void)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	char *p;
 | 
					 | 
				
			||||||
	char* lang = safe_strdup(selected_locale->txt[1]);
 | 
					 | 
				
			||||||
	int i, r = rand() * LOST_TRANSLATOR_PROBABILITY / RAND_MAX;
 | 
					 | 
				
			||||||
	for (i=0; i<ARRAYSIZE(lost_translators); i++)
 | 
					 | 
				
			||||||
		if (strcmp(selected_locale->txt[0], lost_translators[i]) == 0)
 | 
					 | 
				
			||||||
			break;
 | 
					 | 
				
			||||||
	if ((r == 0) && (i != ARRAYSIZE(lost_translators)) && (lang != NULL) && ((p = strchr(lang, '(')) != NULL)) {
 | 
					 | 
				
			||||||
		p[-1] = 0;
 | 
					 | 
				
			||||||
		safe_sprintf(msgbox, sizeof(msgbox), "Note: The %s translation requires an update, but the original "
 | 
					 | 
				
			||||||
			"translator is no longer contributing to it...\nIf you can read English and want to help complete "
 | 
					 | 
				
			||||||
			"this translation, please visit: http://rufus.akeo.ie/translate.", lang);
 | 
					 | 
				
			||||||
		MessageBoxU(hMainDialog, msgbox, "Translation help needed", MB_OK|MB_ICONINFORMATION);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	safe_free(lang);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Report the features of the selected ISO images
 | 
					// Report the features of the selected ISO images
 | 
				
			||||||
static const char* YesNo(BOOL b) {
 | 
					#define PRINT_ISO_PROP(b, ...) do {if (b) uprintf(__VA_ARGS__);} while(0)
 | 
				
			||||||
	return (b) ? "Yes" : "No";
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
static void DisplayISOProps(void)
 | 
					static void DisplayISOProps(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int i;
 | 
						int i;
 | 
				
			||||||
	char isolinux_str[16] = "No";
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (HAS_SYSLINUX(img_report)) {
 | 
					 | 
				
			||||||
		safe_sprintf(isolinux_str, sizeof(isolinux_str), "Yes (%s)", img_report.sl_version_str);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// TODO: Only report features that are present
 | 
					 | 
				
			||||||
	uprintf("ISO label: '%s'", img_report.label);
 | 
						uprintf("ISO label: '%s'", img_report.label);
 | 
				
			||||||
	uprintf("  Size: %" PRIu64 " bytes", img_report.projected_size);
 | 
						uprintf("  Size: %" PRIu64 " bytes", img_report.projected_size);
 | 
				
			||||||
	uprintf("  Has a >64 chars filename: %s", YesNo(img_report.has_long_filename));
 | 
						PRINT_ISO_PROP(img_report.has_4GB_file, "  Has a >4GB file");
 | 
				
			||||||
	uprintf("  Has Symlinks: %s", YesNo(img_report.has_symlinks));
 | 
						PRINT_ISO_PROP(img_report.has_long_filename, "  Has a >64 chars filename");
 | 
				
			||||||
	uprintf("  Has a >4GB file: %s", YesNo(img_report.has_4GB_file));
 | 
						PRINT_ISO_PROP(HAS_SYSLINUX(img_report), "  Uses: Syslinux/Isolinux v%s", img_report.sl_version_str);
 | 
				
			||||||
	uprintf("  Uses Bootmgr: %s", YesNo(img_report.has_bootmgr));
 | 
					 | 
				
			||||||
	uprintf("  Uses EFI: %s%s", YesNo(img_report.has_efi), IS_WIN7_EFI(img_report) ? " (win7_x64)" : "");
 | 
					 | 
				
			||||||
	uprintf("  Uses Grub 2: %s", YesNo(img_report.has_grub2));
 | 
					 | 
				
			||||||
	uprintf("  Uses Grub4DOS: %s", YesNo(img_report.has_grub4dos));
 | 
					 | 
				
			||||||
	uprintf("  Uses isolinux: %s", isolinux_str);
 | 
					 | 
				
			||||||
	if (HAS_SYSLINUX(img_report) && (SL_MAJOR(img_report.sl_version) < 5)) {
 | 
						if (HAS_SYSLINUX(img_report) && (SL_MAJOR(img_report.sl_version) < 5)) {
 | 
				
			||||||
		for (i = 0; i<NB_OLD_C32; i++) {
 | 
							for (i = 0; i<NB_OLD_C32; i++) {
 | 
				
			||||||
			uprintf("    With an old %s: %s\n", old_c32_name[i], img_report.has_old_c32[i] ? "Yes" : "No");
 | 
								PRINT_ISO_PROP(img_report.has_old_c32[i], "    With an old %s", old_c32_name[i]);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	uprintf("  Uses KolibriOS: %s", YesNo(img_report.has_kolibrios));
 | 
						PRINT_ISO_PROP(img_report.has_kolibrios, "  Uses: KolibriOS");
 | 
				
			||||||
	uprintf("  Uses ReactOS: %s", YesNo(IS_REACTOS(img_report)));
 | 
						PRINT_ISO_PROP(IS_REACTOS(img_report), "  Uses: ReactOS");
 | 
				
			||||||
	uprintf("  Uses WinPE: %s%s", YesNo(IS_WINPE(img_report.winpe)), (img_report.uses_minint) ? " (with /minint)" : "");
 | 
						PRINT_ISO_PROP(img_report.has_grub4dos, "  Uses: Grub4DOS");
 | 
				
			||||||
 | 
						PRINT_ISO_PROP(img_report.has_grub2, "  Uses: GRUB2");
 | 
				
			||||||
 | 
						PRINT_ISO_PROP(img_report.has_efi, "  Uses: EFI %s", IS_WIN7_EFI(img_report) ? "(win7_x64)" : "");
 | 
				
			||||||
 | 
						PRINT_ISO_PROP(img_report.has_bootmgr, "  Uses: Bootmgr");
 | 
				
			||||||
 | 
						PRINT_ISO_PROP(IS_WINPE(img_report.winpe), "  Uses: WinPE %s", (img_report.uses_minint) ? "(with /minint)" : "");
 | 
				
			||||||
	if (HAS_INSTALL_WIM(img_report)) {
 | 
						if (HAS_INSTALL_WIM(img_report)) {
 | 
				
			||||||
		uprintf("  Uses Install.wim: Yes (version %d.%d.%d)", (img_report.install_wim_version >> 24) & 0xff,
 | 
							uprintf("  Uses: Install.wim (version %d.%d.%d)", (img_report.install_wim_version >> 24) & 0xff,
 | 
				
			||||||
			(img_report.install_wim_version >> 16) & 0xff, (img_report.install_wim_version >> 8) & 0xff);
 | 
								(img_report.install_wim_version >> 16) & 0xff, (img_report.install_wim_version >> 8) & 0xff);
 | 
				
			||||||
		// Microsoft somehow managed to make their ESD WIMs incompatible with their own APIs
 | 
							// Microsoft somehow managed to make their ESD WIMs incompatible with their own APIs
 | 
				
			||||||
		// (yes, EVEN the Windows 10 APIs), so we must filter them out...
 | 
							// (yes, EVEN the Windows 10 APIs), so we must filter them out...
 | 
				
			||||||
		if (img_report.install_wim_version >= MAX_WIM_VERSION)
 | 
							if (img_report.install_wim_version >= MAX_WIM_VERSION)
 | 
				
			||||||
			uprintf("  Note: This WIM version is NOT compatible with Windows To Go");
 | 
								uprintf("  Note: This WIM version is NOT compatible with Windows To Go");
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						PRINT_ISO_PROP(img_report.has_symlinks, "  Note: This ISO uses symbolic links, which will not be replicated due to file system limitations.");
 | 
				
			||||||
 | 
						PRINT_ISO_PROP(img_report.has_symlinks, "  Because of this, some features from this image may not work...");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// We don't support ToGo on Windows 7 or earlier, for lack of ISO mount capabilities
 | 
						// We don't support ToGo on Windows 7 or earlier, for lack of native ISO mounting capabilities
 | 
				
			||||||
	// TODO: add install.wim extraction workaround for Windows 7
 | 
					 | 
				
			||||||
	if (nWindowsVersion >= WINDOWS_8)
 | 
						if (nWindowsVersion >= WINDOWS_8)
 | 
				
			||||||
		if ( ((!togo_mode) && (HAS_TOGO(img_report))) || ((togo_mode) && (!HAS_TOGO(img_report))) )
 | 
							if ( ((!togo_mode) && (HAS_TOGO(img_report))) || ((togo_mode) && (!HAS_TOGO(img_report))) )
 | 
				
			||||||
			ToggleToGo();
 | 
								ToggleToGo();
 | 
				
			||||||
| 
						 | 
					@ -1060,6 +1004,7 @@ DWORD WINAPI ISOScanThread(LPVOID param)
 | 
				
			||||||
	img_report.is_iso = (BOOLEAN)ExtractISO(image_path, "", TRUE);
 | 
						img_report.is_iso = (BOOLEAN)ExtractISO(image_path, "", TRUE);
 | 
				
			||||||
	img_report.is_bootable_img = (BOOLEAN)IsBootableImage(image_path);
 | 
						img_report.is_bootable_img = (BOOLEAN)IsBootableImage(image_path);
 | 
				
			||||||
	if (!img_report.is_iso && !img_report.is_bootable_img) {
 | 
						if (!img_report.is_iso && !img_report.is_bootable_img) {
 | 
				
			||||||
 | 
							// Failed to scan image
 | 
				
			||||||
		SendMessage(hMainDialog, UM_PROGRESS_EXIT, 0, 0);
 | 
							SendMessage(hMainDialog, UM_PROGRESS_EXIT, 0, 0);
 | 
				
			||||||
		PrintInfoDebug(0, MSG_203);
 | 
							PrintInfoDebug(0, MSG_203);
 | 
				
			||||||
		safe_free(image_path);
 | 
							safe_free(image_path);
 | 
				
			||||||
| 
						 | 
					@ -1075,15 +1020,24 @@ DWORD WINAPI ISOScanThread(LPVOID param)
 | 
				
			||||||
			(img_report.compression_type != BLED_COMPRESSION_NONE) ? "compressed " : "", img_report.is_vhd ? "VHD" : "disk");
 | 
								(img_report.compression_type != BLED_COMPRESSION_NONE) ? "compressed " : "", img_report.is_vhd ? "VHD" : "disk");
 | 
				
			||||||
		selection_default = BT_IMG;
 | 
							selection_default = BT_IMG;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (img_report.is_iso) {
 | 
						if (img_report.is_iso) {
 | 
				
			||||||
		// Will override BT_IMG above for ISOHybrid
 | 
					 | 
				
			||||||
		selection_default = BT_ISO;
 | 
					 | 
				
			||||||
		DisplayISOProps();
 | 
							DisplayISOProps();
 | 
				
			||||||
 | 
							// If we have an ISOHybrid, but without an ISO method we support, disable ISO support altogether
 | 
				
			||||||
 | 
							if ((img_report.is_bootable_img) && (!img_report.has_bootmgr) && (!HAS_SYSLINUX(img_report)) && (!IS_WINPE(img_report.winpe))
 | 
				
			||||||
 | 
								&& (!IS_GRUB(img_report)) && (!img_report.has_efi) && (!IS_REACTOS(img_report)) && (!img_report.has_kolibrios)) {
 | 
				
			||||||
 | 
								uprintf("This ISOHybrid is not compatible with any of the ISO boot methods we support");
 | 
				
			||||||
 | 
								img_report.is_iso = FALSE;
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								// Will override BT_IMG above for ISOHybrid
 | 
				
			||||||
 | 
								selection_default = BT_ISO;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	// Only enable AFTER we have determined the image type
 | 
						// Only enable AFTER we have determined the image type
 | 
				
			||||||
	EnableControls(TRUE);
 | 
						EnableControls(TRUE);
 | 
				
			||||||
	if ( (!img_report.has_bootmgr) && (!HAS_SYSLINUX(img_report)) && (!IS_WINPE(img_report.winpe)) && (!IS_GRUB(img_report))
 | 
						if ( (!img_report.has_bootmgr) && (!HAS_SYSLINUX(img_report)) && (!IS_WINPE(img_report.winpe)) && (!IS_GRUB(img_report))
 | 
				
			||||||
	  && (!img_report.has_efi) && (!IS_REACTOS(img_report) && (!img_report.has_kolibrios) && (!img_report.is_bootable_img)) ) {
 | 
						  && (!img_report.has_efi) && (!IS_REACTOS(img_report)) && (!img_report.has_kolibrios) && (!img_report.is_bootable_img) ) {
 | 
				
			||||||
 | 
							// No boot method that we support
 | 
				
			||||||
		PrintInfo(0, MSG_081);
 | 
							PrintInfo(0, MSG_081);
 | 
				
			||||||
		safe_free(image_path);
 | 
							safe_free(image_path);
 | 
				
			||||||
		EnableWindow(hStatusToolbar, FALSE);
 | 
							EnableWindow(hStatusToolbar, FALSE);
 | 
				
			||||||
| 
						 | 
					@ -1519,8 +1473,13 @@ static BOOL BootCheck(void)
 | 
				
			||||||
							}
 | 
												}
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
						if (syslinux_ldlinux_len[i] == 0) {
 | 
											if (syslinux_ldlinux_len[i] == 0) {
 | 
				
			||||||
							uprintf("Could not download the file - cancelling\n");
 | 
												// If the version matches our embedded one, try to use that as a last ditch effort
 | 
				
			||||||
							return FALSE;
 | 
												if (img_report.sl_version == embedded_sl_version[1]) {
 | 
				
			||||||
 | 
													uprintf("Could not download the file - will try to use embedded %s version instead", img_report.sl_version_str);
 | 
				
			||||||
 | 
												} else {
 | 
				
			||||||
 | 
													uprintf("Could not download the file - cancelling\n");
 | 
				
			||||||
 | 
													return FALSE;
 | 
				
			||||||
 | 
												}
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
| 
						 | 
					@ -1744,7 +1703,13 @@ void InitDialog(HWND hDlg)
 | 
				
			||||||
	uprintf("Syslinux versions: %s%s, %s%s", embedded_sl_version_str[0], embedded_sl_version_ext[0],
 | 
						uprintf("Syslinux versions: %s%s, %s%s", embedded_sl_version_str[0], embedded_sl_version_ext[0],
 | 
				
			||||||
		embedded_sl_version_str[1], embedded_sl_version_ext[1]);
 | 
							embedded_sl_version_str[1], embedded_sl_version_ext[1]);
 | 
				
			||||||
	uprintf("Grub versions: %s, %s", GRUB4DOS_VERSION, GRUB2_PACKAGE_VERSION);
 | 
						uprintf("Grub versions: %s, %s", GRUB4DOS_VERSION, GRUB2_PACKAGE_VERSION);
 | 
				
			||||||
	uprintf("Locale ID: 0x%04X", GetUserDefaultUILanguage());
 | 
						uprintf("System locale ID: 0x%04X", GetUserDefaultUILanguage());
 | 
				
			||||||
 | 
						ubpop();
 | 
				
			||||||
 | 
						if (selected_locale->ctrl_id & LOC_NEEDS_UPDATE) {
 | 
				
			||||||
 | 
							uprintf("NOTE: The %s translation requires an update, but the current translator hasn't submitted "
 | 
				
			||||||
 | 
								"one. Because of this, some messages will only be displayed in English.", selected_locale->txt[1]);
 | 
				
			||||||
 | 
							uprintf("If you think you can help update this translation, please e-mail the author of this application");
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	SetClusterSizeLabels();
 | 
						SetClusterSizeLabels();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1855,9 +1820,8 @@ void InitDialog(HWND hDlg)
 | 
				
			||||||
		rcSelectImage.right - rcSelectImage.left, rcBootType.bottom - rcBootType.top + 2, SWP_NOZORDER);
 | 
							rcSelectImage.right - rcSelectImage.left, rcBootType.bottom - rcBootType.top + 2, SWP_NOZORDER);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// The things one needs to do to keep things looking good...
 | 
						// The things one needs to do to keep things looking good...
 | 
				
			||||||
	if (nWindowsVersion == WINDOWS_7) {
 | 
						if (fScale > 1.4f) {
 | 
				
			||||||
		ResizeMoveCtrl(hDlg, GetDlgItem(hMainDialog, IDS_ADVANCED_OPTIONS_GRP), 0, -1, 0, 2, fScale);
 | 
							ResizeMoveCtrl(hDlg, GetDlgItem(hMainDialog, IDS_ADVANCED_OPTIONS_GRP), 0, +1, 0, 0, fScale);
 | 
				
			||||||
		ResizeMoveCtrl(hDlg, hProgress, 0, 1, 0, 0, fScale);
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Subclass the Info box so that we can align its text vertically
 | 
						// Subclass the Info box so that we can align its text vertically
 | 
				
			||||||
| 
						 | 
					@ -1925,9 +1889,9 @@ void InitDialog(HWND hDlg)
 | 
				
			||||||
	PrintInfo(0, MSG_210);
 | 
						PrintInfo(0, MSG_210);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void PrintStatus2000(const char* str, BOOL val)
 | 
					static void PrintStatusTimeout(const char* str, BOOL val)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	PrintStatus(2000, (val)?MSG_250:MSG_251, str);
 | 
						PrintStatus(STATUS_MSG_TIMEOUT, (val)?MSG_250:MSG_251, str);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ShowLanguageMenu(RECT rcExclude)
 | 
					void ShowLanguageMenu(RECT rcExclude)
 | 
				
			||||||
| 
						 | 
					@ -2085,18 +2049,22 @@ void SaveVHD(void)
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
 | 
					static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	static DWORD DeviceNum = 0, LastRefresh = 0;
 | 
						static DWORD DeviceNum = 0;
 | 
				
			||||||
 | 
						static uint64_t LastRefresh = 0;
 | 
				
			||||||
	static BOOL first_log_display = TRUE, isMarquee = FALSE;
 | 
						static BOOL first_log_display = TRUE, isMarquee = FALSE;
 | 
				
			||||||
	static ULONG ulRegister = 0;
 | 
						static ULONG ulRegister = 0;
 | 
				
			||||||
	static LPITEMIDLIST pidlDesktop = NULL;
 | 
						static LPITEMIDLIST pidlDesktop = NULL;
 | 
				
			||||||
	static MY_SHChangeNotifyEntry NotifyEntry;
 | 
						static MY_SHChangeNotifyEntry NotifyEntry;
 | 
				
			||||||
 | 
						static DWORD_PTR thread_affinity[4];
 | 
				
			||||||
	DRAWITEMSTRUCT* pDI;
 | 
						DRAWITEMSTRUCT* pDI;
 | 
				
			||||||
 | 
						HDROP droppedFileInfo;
 | 
				
			||||||
	POINT Point;
 | 
						POINT Point;
 | 
				
			||||||
	RECT DialogRect, DesktopRect, LangToolbarRect;
 | 
						RECT DialogRect, DesktopRect, LangToolbarRect;
 | 
				
			||||||
	LONG progress_style;
 | 
						LONG progress_style;
 | 
				
			||||||
	HDC hDC;
 | 
						HDC hDC;
 | 
				
			||||||
	int nDeviceIndex, fs, tt, i, nWidth, nHeight, nb_devices, selected_language, offset;
 | 
						int nDeviceIndex, fs, tt, i, nWidth, nHeight, nb_devices, selected_language, offset;
 | 
				
			||||||
	char tmp[128];
 | 
						char tmp[128];
 | 
				
			||||||
 | 
						wchar_t* wbuffer = NULL;
 | 
				
			||||||
	loc_cmd* lcmd = NULL;
 | 
						loc_cmd* lcmd = NULL;
 | 
				
			||||||
	EXT_DECL(img_ext, NULL, __VA_GROUP__("*.img;*.vhd;*.gz;*.bzip2;*.xz;*.lzma;*.Z;*.zip"), __VA_GROUP__(lmprintf(MSG_095)));
 | 
						EXT_DECL(img_ext, NULL, __VA_GROUP__("*.img;*.vhd;*.gz;*.bzip2;*.xz;*.lzma;*.Z;*.zip"), __VA_GROUP__(lmprintf(MSG_095)));
 | 
				
			||||||
	EXT_DECL(iso_ext, NULL, __VA_GROUP__("*.iso"), __VA_GROUP__(lmprintf(MSG_036)));
 | 
						EXT_DECL(iso_ext, NULL, __VA_GROUP__("*.iso"), __VA_GROUP__(lmprintf(MSG_036)));
 | 
				
			||||||
| 
						 | 
					@ -2123,15 +2091,15 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
 | 
				
			||||||
			case DBT_DEVICEARRIVAL:
 | 
								case DBT_DEVICEARRIVAL:
 | 
				
			||||||
			case DBT_DEVICEREMOVECOMPLETE:
 | 
								case DBT_DEVICEREMOVECOMPLETE:
 | 
				
			||||||
			case DBT_CUSTOMEVENT:	// Sent by our timer refresh function or for card reader media change
 | 
								case DBT_CUSTOMEVENT:	// Sent by our timer refresh function or for card reader media change
 | 
				
			||||||
				LastRefresh = GetTickCount();	// Don't care about 49.7 days rollback of GetTickCount()
 | 
									LastRefresh = _GetTickCount64();
 | 
				
			||||||
				KillTimer(hMainDialog, TID_REFRESH_TIMER);
 | 
									KillTimer(hMainDialog, TID_REFRESH_TIMER);
 | 
				
			||||||
				GetUSBDevices((DWORD)ComboBox_GetItemData(hDeviceList, ComboBox_GetCurSel(hDeviceList)));
 | 
									GetDevices((DWORD)ComboBox_GetItemData(hDeviceList, ComboBox_GetCurSel(hDeviceList)));
 | 
				
			||||||
				user_changed_label = FALSE;
 | 
									user_changed_label = FALSE;
 | 
				
			||||||
				return (INT_PTR)TRUE;
 | 
									return (INT_PTR)TRUE;
 | 
				
			||||||
			case DBT_DEVNODES_CHANGED:
 | 
								case DBT_DEVNODES_CHANGED:
 | 
				
			||||||
				// If it's been more than a second since last device refresh, arm a refresh timer
 | 
									// If it's been more than a second since last device refresh, arm a refresh timer
 | 
				
			||||||
				if (GetTickCount() > LastRefresh + 1000) {
 | 
									if (_GetTickCount64() > LastRefresh + 1000) {
 | 
				
			||||||
					LastRefresh = GetTickCount();
 | 
										LastRefresh = _GetTickCount64();
 | 
				
			||||||
					SetTimer(hMainDialog, TID_REFRESH_TIMER, 1000, RefreshTimer);
 | 
										SetTimer(hMainDialog, TID_REFRESH_TIMER, 1000, RefreshTimer);
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				break;
 | 
									break;
 | 
				
			||||||
| 
						 | 
					@ -2156,7 +2124,7 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
 | 
				
			||||||
		log_displayed = FALSE;
 | 
							log_displayed = FALSE;
 | 
				
			||||||
		hLogDlg = MyCreateDialog(hMainInstance, IDD_LOG, hDlg, (DLGPROC)LogProc);
 | 
							hLogDlg = MyCreateDialog(hMainInstance, IDD_LOG, hDlg, (DLGPROC)LogProc);
 | 
				
			||||||
		InitDialog(hDlg);
 | 
							InitDialog(hDlg);
 | 
				
			||||||
		GetUSBDevices(0);
 | 
							GetDevices(0);
 | 
				
			||||||
		CheckForUpdates(FALSE);
 | 
							CheckForUpdates(FALSE);
 | 
				
			||||||
		// Register MEDIA_INSERTED/MEDIA_REMOVED notifications for card readers
 | 
							// Register MEDIA_INSERTED/MEDIA_REMOVED notifications for card readers
 | 
				
			||||||
		if ((pfSHChangeNotifyRegister != NULL) && (SUCCEEDED(SHGetSpecialFolderLocation(0, CSIDL_DESKTOP, &pidlDesktop)))) {
 | 
							if ((pfSHChangeNotifyRegister != NULL) && (SUCCEEDED(SHGetSpecialFolderLocation(0, CSIDL_DESKTOP, &pidlDesktop)))) {
 | 
				
			||||||
| 
						 | 
					@ -2426,7 +2394,7 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
 | 
				
			||||||
			return (INT_PTR)TRUE;
 | 
								return (INT_PTR)TRUE;
 | 
				
			||||||
		case IDC_SELECT_ISO:
 | 
							case IDC_SELECT_ISO:
 | 
				
			||||||
			if (iso_provided) {
 | 
								if (iso_provided) {
 | 
				
			||||||
				uprintf("Image provided: '%s'\n", image_path);
 | 
									uprintf("\r\nImage provided: '%s'", image_path);
 | 
				
			||||||
				iso_provided = FALSE;	// One off thing...
 | 
									iso_provided = FALSE;	// One off thing...
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
				safe_free(image_path);
 | 
									safe_free(image_path);
 | 
				
			||||||
| 
						 | 
					@ -2460,8 +2428,8 @@ 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_HDDs = !enable_HDDs;
 | 
									enable_HDDs = !enable_HDDs;
 | 
				
			||||||
				PrintStatus2000(lmprintf(MSG_253), enable_HDDs);
 | 
									PrintStatusTimeout(lmprintf(MSG_253), enable_HDDs);
 | 
				
			||||||
				GetUSBDevices(0);
 | 
									GetDevices(0);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
		case IDC_START:
 | 
							case IDC_START:
 | 
				
			||||||
| 
						 | 
					@ -2572,7 +2540,8 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
 | 
				
			||||||
				// Disable all controls except cancel
 | 
									// Disable all controls except cancel
 | 
				
			||||||
				EnableControls(FALSE);
 | 
									EnableControls(FALSE);
 | 
				
			||||||
				InitProgress(FALSE);
 | 
									InitProgress(FALSE);
 | 
				
			||||||
				format_thid = CreateThread(NULL, 0, SumThread, NULL, 0, NULL);
 | 
									SetThreadAffinity(thread_affinity, NUM_CHECKSUMS + 1);
 | 
				
			||||||
 | 
									format_thid = CreateThread(NULL, 0, SumThread, (LPVOID)thread_affinity, 0, NULL);
 | 
				
			||||||
				if (format_thid != NULL) {
 | 
									if (format_thid != NULL) {
 | 
				
			||||||
					PrintInfo(0, -1);
 | 
										PrintInfo(0, -1);
 | 
				
			||||||
					timer = 0;
 | 
										timer = 0;
 | 
				
			||||||
| 
						 | 
					@ -2613,12 +2582,42 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case WM_DROPFILES:
 | 
				
			||||||
 | 
							droppedFileInfo = (HDROP)wParam;
 | 
				
			||||||
 | 
							wbuffer = calloc(MAX_PATH, sizeof(wchar_t));
 | 
				
			||||||
 | 
							if (wbuffer == NULL) {
 | 
				
			||||||
 | 
								uprintf("Failed to alloc buffer for drag-n-drop");
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							DragQueryFileW(droppedFileInfo, 0, wbuffer, MAX_PATH);
 | 
				
			||||||
 | 
							safe_free(image_path);
 | 
				
			||||||
 | 
							image_path = wchar_to_utf8(wbuffer);
 | 
				
			||||||
 | 
							safe_free(wbuffer);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (image_path != NULL) {
 | 
				
			||||||
 | 
								iso_provided = TRUE;
 | 
				
			||||||
 | 
								// Simulate ISO selection click
 | 
				
			||||||
 | 
								SendMessage(hDlg, WM_COMMAND, IDC_SELECT_ISO, 0);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// This is >>>SUPER WEIRD<<<. After a successful ISO or DD write (e.g. Arch 2016.01)
 | 
				
			||||||
 | 
						// we no longer receive WM_QUERYENDSESSION messages, only WM_ENDSESSION.
 | 
				
			||||||
 | 
						// But if we do a FreeDOS format, WM_QUERYENDSESSION is still sent to us alright.
 | 
				
			||||||
 | 
						// What the heck is going on here?!?
 | 
				
			||||||
 | 
						// Also, even as we try to work around this, WM_ENDSESSION comes too late in the game
 | 
				
			||||||
 | 
						// to prevent shutdown block. So we need to handle the _undocumented_ WM_CLIENTSHUTDOWN.
 | 
				
			||||||
	case WM_CLOSE:
 | 
						case WM_CLOSE:
 | 
				
			||||||
 | 
						case WM_CLIENTSHUTDOWN:
 | 
				
			||||||
 | 
						case WM_QUERYENDSESSION:
 | 
				
			||||||
	case WM_ENDSESSION:
 | 
						case WM_ENDSESSION:
 | 
				
			||||||
		if (format_thid != NULL) {
 | 
							// TODO: Do we want to use ShutdownBlockReasonCreate() in Vista and later to stop
 | 
				
			||||||
 | 
							// forced shutdown? See https://msdn.microsoft.com/en-us/library/ms700677.aspx
 | 
				
			||||||
 | 
							if (format_op_in_progress) {
 | 
				
			||||||
 | 
								// WM_QUERYENDSESSION uses this value to prevent shutdown
 | 
				
			||||||
			return (INT_PTR)TRUE;
 | 
								return (INT_PTR)TRUE;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		PostQuitMessage(0);
 | 
							SendMessage(hDlg, WM_COMMAND, (WPARAM)IDCANCEL, (LPARAM)0);
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	case UM_PROGRESS_INIT:
 | 
						case UM_PROGRESS_INIT:
 | 
				
			||||||
| 
						 | 
					@ -2670,7 +2669,7 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
 | 
				
			||||||
		EnableControls(TRUE);
 | 
							EnableControls(TRUE);
 | 
				
			||||||
		if (wParam) {
 | 
							if (wParam) {
 | 
				
			||||||
			uprintf("\r\n");
 | 
								uprintf("\r\n");
 | 
				
			||||||
			GetUSBDevices(DeviceNum);
 | 
								GetDevices(DeviceNum);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if (!IS_ERROR(FormatStatus)) {
 | 
							if (!IS_ERROR(FormatStatus)) {
 | 
				
			||||||
			// This is the only way to achieve instantaneous progress transition to 100%
 | 
								// This is the only way to achieve instantaneous progress transition to 100%
 | 
				
			||||||
| 
						 | 
					@ -2776,12 +2775,14 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
 | 
				
			||||||
	int wait_for_mutex = 0;
 | 
						int wait_for_mutex = 0;
 | 
				
			||||||
	FILE* fd;
 | 
						FILE* fd;
 | 
				
			||||||
	BOOL attached_console = FALSE, external_loc_file = FALSE, lgp_set = FALSE, automount, disable_hogger = FALSE;
 | 
						BOOL attached_console = FALSE, external_loc_file = FALSE, lgp_set = FALSE, automount, disable_hogger = FALSE;
 | 
				
			||||||
 | 
						BOOL previous_enable_HDDs = FALSE;
 | 
				
			||||||
	BYTE *loc_data;
 | 
						BYTE *loc_data;
 | 
				
			||||||
	DWORD loc_size, size;
 | 
						DWORD loc_size, size;
 | 
				
			||||||
	char tmp_path[MAX_PATH] = "", loc_file[MAX_PATH] = "", ini_path[MAX_PATH], ini_flags[] = "rb";
 | 
						char tmp_path[MAX_PATH] = "", loc_file[MAX_PATH] = "", ini_path[MAX_PATH] = "", ini_flags[] = "rb";
 | 
				
			||||||
	char *tmp, *locale_name = NULL, **argv = NULL;
 | 
						char *tmp, *locale_name = NULL, **argv = NULL;
 | 
				
			||||||
	wchar_t **wenv, **wargv;
 | 
						wchar_t **wenv, **wargv;
 | 
				
			||||||
	PF_TYPE_DECL(CDECL, int, __wgetmainargs, (int*, wchar_t***, wchar_t***, int, int*));
 | 
						PF_TYPE_DECL(CDECL, int, __wgetmainargs, (int*, wchar_t***, wchar_t***, int, int*));
 | 
				
			||||||
 | 
						PF_TYPE_DECL(WINAPI, BOOL, ChangeWindowMessageFilter, (UINT message, DWORD dwFlag));
 | 
				
			||||||
	HANDLE mutex = NULL, hogmutex = NULL, hFile = NULL;
 | 
						HANDLE mutex = NULL, hogmutex = NULL, hFile = NULL;
 | 
				
			||||||
	HWND hDlg = NULL;
 | 
						HWND hDlg = NULL;
 | 
				
			||||||
	HDC hDC;
 | 
						HDC hDC;
 | 
				
			||||||
| 
						 | 
					@ -2796,7 +2797,11 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
 | 
				
			||||||
		{0, 0, NULL, 0}
 | 
							{0, 0, NULL, 0}
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Disable loading system DLLs from the current directory (sideloading mitigation)
 | 
				
			||||||
 | 
						SetDllDirectoryA("");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	uprintf("*** " APPLICATION_NAME " init ***\n");
 | 
						uprintf("*** " APPLICATION_NAME " init ***\n");
 | 
				
			||||||
 | 
						PF_INIT(GetTickCount64, kernel32);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Reattach the console, if we were started from commandline
 | 
						// Reattach the console, if we were started from commandline
 | 
				
			||||||
	if (AttachConsole(ATTACH_PARENT_PROCESS) != 0) {
 | 
						if (AttachConsole(ATTACH_PARENT_PROCESS) != 0) {
 | 
				
			||||||
| 
						 | 
					@ -2947,12 +2952,12 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		hFile = CreateFileU(loc_file, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE,
 | 
							hFile = CreateFileU(loc_file, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE,
 | 
				
			||||||
			NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
 | 
								NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
 | 
				
			||||||
		if ((hFile == INVALID_HANDLE_VALUE) || (!WriteFile(hFile, loc_data, loc_size, &size, 0)) || (loc_size != size)) {
 | 
							if ((hFile == INVALID_HANDLE_VALUE) || (!WriteFileWithRetry(hFile, loc_data, loc_size, &size, WRITE_RETRIES))) {
 | 
				
			||||||
			uprintf("localization: unable to extract '%s': %s.\n", loc_file, WindowsErrorString());
 | 
								uprintf("localization: unable to extract '%s': %s", loc_file, WindowsErrorString());
 | 
				
			||||||
			safe_closehandle(hFile);
 | 
								safe_closehandle(hFile);
 | 
				
			||||||
			goto out;
 | 
								goto out;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		uprintf("localization: extracted data to '%s'\n", loc_file);
 | 
							uprintf("localization: extracted data to '%s'", loc_file);
 | 
				
			||||||
		safe_closehandle(hFile);
 | 
							safe_closehandle(hFile);
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		safe_sprintf(loc_file, sizeof(loc_file), "%s\\%s", app_dir, rufus_loc);
 | 
							safe_sprintf(loc_file, sizeof(loc_file), "%s\\%s", app_dir, rufus_loc);
 | 
				
			||||||
| 
						 | 
					@ -2962,7 +2967,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ( (!get_supported_locales(loc_file))
 | 
						if ( (!get_supported_locales(loc_file))
 | 
				
			||||||
	  || ((selected_locale = ((locale_name == NULL)?get_locale_from_lcid(lcid, TRUE):get_locale_from_name(locale_name, TRUE))) == NULL) ) {
 | 
						  || ((selected_locale = ((locale_name == NULL)?get_locale_from_lcid(lcid, TRUE):get_locale_from_name(locale_name, TRUE))) == NULL) ) {
 | 
				
			||||||
		uprintf("FATAL: Could not access locale!\n");
 | 
							uprintf("FATAL: Could not access locale!");
 | 
				
			||||||
		MessageBoxU(NULL, "The locale data is missing or invalid. This application will now exit.",
 | 
							MessageBoxU(NULL, "The locale data is missing or invalid. This application will now exit.",
 | 
				
			||||||
			"Fatal error", MB_ICONSTOP|MB_SYSTEMMODAL);
 | 
								"Fatal error", MB_ICONSTOP|MB_SYSTEMMODAL);
 | 
				
			||||||
		goto out;
 | 
							goto out;
 | 
				
			||||||
| 
						 | 
					@ -3017,7 +3022,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
 | 
				
			||||||
				uprintf("Failed to enable AutoMount");
 | 
									uprintf("Failed to enable AutoMount");
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	srand((unsigned int)GetTickCount());
 | 
						srand((unsigned int)_GetTickCount64());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
relaunch:
 | 
					relaunch:
 | 
				
			||||||
	uprintf("localization: using locale '%s'\n", selected_locale->txt[0]);
 | 
						uprintf("localization: using locale '%s'\n", selected_locale->txt[0]);
 | 
				
			||||||
| 
						 | 
					@ -3037,6 +3042,20 @@ relaunch:
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if ((relaunch_rc.left > -65536) && (relaunch_rc.top > -65536))
 | 
						if ((relaunch_rc.left > -65536) && (relaunch_rc.top > -65536))
 | 
				
			||||||
		SetWindowPos(hDlg, HWND_TOP, relaunch_rc.left, relaunch_rc.top, 0, 0, SWP_NOSIZE);
 | 
							SetWindowPos(hDlg, HWND_TOP, relaunch_rc.left, relaunch_rc.top, 0, 0, SWP_NOSIZE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Enable drag-n-drop through the message filter (for Vista or later)
 | 
				
			||||||
 | 
						if (nWindowsVersion >= WINDOWS_VISTA) {
 | 
				
			||||||
 | 
							PF_INIT(ChangeWindowMessageFilter, user32);
 | 
				
			||||||
 | 
							if (pfChangeWindowMessageFilter != NULL) {
 | 
				
			||||||
 | 
								// NB: We use ChangeWindowMessageFilter() here because
 | 
				
			||||||
 | 
								// ChangeWindowMessageFilterEx() is not available on Vista
 | 
				
			||||||
 | 
								pfChangeWindowMessageFilter(WM_DROPFILES, MSGFLT_ADD);
 | 
				
			||||||
 | 
								pfChangeWindowMessageFilter(WM_COPYDATA, MSGFLT_ADD);
 | 
				
			||||||
 | 
								// CopyGlobalData is needed sine we are running elevated
 | 
				
			||||||
 | 
								pfChangeWindowMessageFilter(WM_COPYGLOBALDATA, MSGFLT_ADD);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ShowWindow(hDlg, SW_SHOWNORMAL);
 | 
						ShowWindow(hDlg, SW_SHOWNORMAL);
 | 
				
			||||||
	UpdateWindow(hDlg);
 | 
						UpdateWindow(hDlg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3053,14 +3072,14 @@ relaunch:
 | 
				
			||||||
		if ((msg.message == WM_SYSKEYDOWN) && (msg.wParam == VK_OEM_PERIOD)) {
 | 
							if ((msg.message == WM_SYSKEYDOWN) && (msg.wParam == VK_OEM_PERIOD)) {
 | 
				
			||||||
			usb_debug = !usb_debug;
 | 
								usb_debug = !usb_debug;
 | 
				
			||||||
			WriteSettingBool(SETTING_ENABLE_USB_DEBUG, usb_debug);
 | 
								WriteSettingBool(SETTING_ENABLE_USB_DEBUG, usb_debug);
 | 
				
			||||||
			PrintStatus2000(lmprintf(MSG_270), usb_debug);
 | 
								PrintStatusTimeout(lmprintf(MSG_270), usb_debug);
 | 
				
			||||||
			GetUSBDevices(0);
 | 
								GetDevices(0);
 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		// Alt-, => Disable physical drive locking
 | 
							// Alt-, => Disable physical drive locking
 | 
				
			||||||
		if ((msg.message == WM_SYSKEYDOWN) && (msg.wParam == VK_OEM_COMMA)) {
 | 
							if ((msg.message == WM_SYSKEYDOWN) && (msg.wParam == VK_OEM_COMMA)) {
 | 
				
			||||||
			lock_drive = !lock_drive;
 | 
								lock_drive = !lock_drive;
 | 
				
			||||||
			PrintStatus2000(lmprintf(MSG_282), lock_drive);
 | 
								PrintStatusTimeout(lmprintf(MSG_282), lock_drive);
 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		// Alt-B => Toggle fake drive detection during bad blocks check
 | 
							// Alt-B => Toggle fake drive detection during bad blocks check
 | 
				
			||||||
| 
						 | 
					@ -3071,7 +3090,7 @@ relaunch:
 | 
				
			||||||
		if ((msg.message == WM_SYSKEYDOWN) && (msg.wParam == 'B')) {
 | 
							if ((msg.message == WM_SYSKEYDOWN) && (msg.wParam == 'B')) {
 | 
				
			||||||
			detect_fakes = !detect_fakes;
 | 
								detect_fakes = !detect_fakes;
 | 
				
			||||||
			WriteSettingBool(SETTING_DISABLE_FAKE_DRIVES_CHECK, !detect_fakes);
 | 
								WriteSettingBool(SETTING_DISABLE_FAKE_DRIVES_CHECK, !detect_fakes);
 | 
				
			||||||
			PrintStatus2000(lmprintf(MSG_256), detect_fakes);
 | 
								PrintStatusTimeout(lmprintf(MSG_256), detect_fakes);
 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		// Alt C => Force the update check to be successful
 | 
							// Alt C => Force the update check to be successful
 | 
				
			||||||
| 
						 | 
					@ -3079,7 +3098,7 @@ relaunch:
 | 
				
			||||||
		// check, so that it always succeeds. This is useful for translators.
 | 
							// check, so that it always succeeds. This is useful for translators.
 | 
				
			||||||
		if ((msg.message == WM_SYSKEYDOWN) && (msg.wParam == 'C')) {
 | 
							if ((msg.message == WM_SYSKEYDOWN) && (msg.wParam == 'C')) {
 | 
				
			||||||
			force_update = !force_update;
 | 
								force_update = !force_update;
 | 
				
			||||||
			PrintStatus2000(lmprintf(MSG_259), force_update);
 | 
								PrintStatusTimeout(lmprintf(MSG_259), force_update);
 | 
				
			||||||
			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)
 | 
				
			||||||
| 
						 | 
					@ -3093,7 +3112,7 @@ relaunch:
 | 
				
			||||||
		if ((msg.message == WM_SYSKEYDOWN) && (msg.wParam == 'E')) {
 | 
							if ((msg.message == WM_SYSKEYDOWN) && (msg.wParam == 'E')) {
 | 
				
			||||||
			allow_dual_uefi_bios = !allow_dual_uefi_bios;
 | 
								allow_dual_uefi_bios = !allow_dual_uefi_bios;
 | 
				
			||||||
			WriteSettingBool(SETTING_ENABLE_WIN_DUAL_EFI_BIOS, allow_dual_uefi_bios);
 | 
								WriteSettingBool(SETTING_ENABLE_WIN_DUAL_EFI_BIOS, allow_dual_uefi_bios);
 | 
				
			||||||
			PrintStatus2000(lmprintf(MSG_266), allow_dual_uefi_bios);
 | 
								PrintStatusTimeout(lmprintf(MSG_266), allow_dual_uefi_bios);
 | 
				
			||||||
			SetMBRForUEFI(TRUE);
 | 
								SetMBRForUEFI(TRUE);
 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					@ -3103,8 +3122,8 @@ relaunch:
 | 
				
			||||||
		// When enabled, Rufus will list and allow the formatting of USB HDDs.
 | 
							// When enabled, Rufus will list and allow the formatting of USB HDDs.
 | 
				
			||||||
		if ((msg.message == WM_SYSKEYDOWN) && (msg.wParam == 'F')) {
 | 
							if ((msg.message == WM_SYSKEYDOWN) && (msg.wParam == 'F')) {
 | 
				
			||||||
			enable_HDDs = !enable_HDDs;
 | 
								enable_HDDs = !enable_HDDs;
 | 
				
			||||||
			PrintStatus2000(lmprintf(MSG_253), enable_HDDs);
 | 
								PrintStatusTimeout(lmprintf(MSG_253), enable_HDDs);
 | 
				
			||||||
			GetUSBDevices(0);
 | 
								GetDevices(0);
 | 
				
			||||||
			CheckDlgButton(hMainDialog, IDC_ENABLE_FIXED_DISKS, enable_HDDs?BST_CHECKED:BST_UNCHECKED);
 | 
								CheckDlgButton(hMainDialog, IDC_ENABLE_FIXED_DISKS, enable_HDDs?BST_CHECKED:BST_UNCHECKED);
 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					@ -3113,7 +3132,7 @@ relaunch:
 | 
				
			||||||
		// DD-mode when writing the data.
 | 
							// DD-mode when writing the data.
 | 
				
			||||||
		if ((msg.message == WM_SYSKEYDOWN) && (msg.wParam == 'I')) {
 | 
							if ((msg.message == WM_SYSKEYDOWN) && (msg.wParam == 'I')) {
 | 
				
			||||||
			enable_iso = !enable_iso;
 | 
								enable_iso = !enable_iso;
 | 
				
			||||||
			PrintStatus2000(lmprintf(MSG_262), enable_iso);
 | 
								PrintStatusTimeout(lmprintf(MSG_262), enable_iso);
 | 
				
			||||||
			if (image_path != NULL) {
 | 
								if (image_path != NULL) {
 | 
				
			||||||
				iso_provided = TRUE;
 | 
									iso_provided = TRUE;
 | 
				
			||||||
				dont_display_image_name = TRUE;
 | 
									dont_display_image_name = TRUE;
 | 
				
			||||||
| 
						 | 
					@ -3127,27 +3146,27 @@ relaunch:
 | 
				
			||||||
		// 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(lmprintf(MSG_257), enable_joliet);
 | 
								PrintStatusTimeout(lmprintf(MSG_257), enable_joliet);
 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		// Alt K => Toggle Rock Ridge support for ISO9660 images
 | 
							// 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(lmprintf(MSG_258), enable_rockridge);
 | 
								PrintStatusTimeout(lmprintf(MSG_258), enable_rockridge);
 | 
				
			||||||
			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;
 | 
				
			||||||
			WriteSettingBool(SETTING_FORCE_LARGE_FAT32_FORMAT, force_large_fat32);
 | 
								WriteSettingBool(SETTING_FORCE_LARGE_FAT32_FORMAT, force_large_fat32);
 | 
				
			||||||
			PrintStatus2000(lmprintf(MSG_254), force_large_fat32);
 | 
								PrintStatusTimeout(lmprintf(MSG_254), force_large_fat32);
 | 
				
			||||||
			GetUSBDevices(0);
 | 
								GetDevices(0);
 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		// Alt N => Enable NTFS compression
 | 
							// Alt N => Enable NTFS compression
 | 
				
			||||||
		if ((msg.message == WM_SYSKEYDOWN) && (msg.wParam == 'N')) {
 | 
							if ((msg.message == WM_SYSKEYDOWN) && (msg.wParam == 'N')) {
 | 
				
			||||||
			enable_ntfs_compression = !enable_ntfs_compression;
 | 
								enable_ntfs_compression = !enable_ntfs_compression;
 | 
				
			||||||
			PrintStatus2000(lmprintf(MSG_260), enable_ntfs_compression);
 | 
								PrintStatusTimeout(lmprintf(MSG_260), enable_ntfs_compression);
 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		// Alt-R => Remove all the registry keys that may have been created by Rufus
 | 
							// Alt-R => Remove all the registry keys that may have been created by Rufus
 | 
				
			||||||
| 
						 | 
					@ -3162,23 +3181,23 @@ relaunch:
 | 
				
			||||||
		// 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(lmprintf(MSG_252), size_check);
 | 
								PrintStatusTimeout(lmprintf(MSG_252), size_check);
 | 
				
			||||||
			GetUSBDevices(0);
 | 
								GetDevices(0);
 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		// Alt-T => Preserve timestamps when extracting ISO files
 | 
							// Alt-T => Preserve timestamps when extracting ISO files
 | 
				
			||||||
		if ((msg.message == WM_SYSKEYDOWN) && (msg.wParam == 'T')) {
 | 
							if ((msg.message == WM_SYSKEYDOWN) && (msg.wParam == 'T')) {
 | 
				
			||||||
			preserve_timestamps = !preserve_timestamps;
 | 
								preserve_timestamps = !preserve_timestamps;
 | 
				
			||||||
			WriteSettingBool(SETTING_PRESERVE_TIMESTAMPS, preserve_timestamps);
 | 
								WriteSettingBool(SETTING_PRESERVE_TIMESTAMPS, preserve_timestamps);
 | 
				
			||||||
			PrintStatus2000(lmprintf(MSG_269), preserve_timestamps);
 | 
								PrintStatusTimeout(lmprintf(MSG_269), preserve_timestamps);
 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		// Alt-U => Use PROPER size units, instead of this whole Kibi/Gibi nonsense
 | 
							// Alt-U => Use PROPER size units, instead of this whole Kibi/Gibi nonsense
 | 
				
			||||||
		if ((msg.message == WM_SYSKEYDOWN) && (msg.wParam == 'U')) {
 | 
							if ((msg.message == WM_SYSKEYDOWN) && (msg.wParam == 'U')) {
 | 
				
			||||||
			use_fake_units = !use_fake_units;
 | 
								use_fake_units = !use_fake_units;
 | 
				
			||||||
			WriteSettingBool(SETTING_USE_PROPER_SIZE_UNITS, !use_fake_units);
 | 
								WriteSettingBool(SETTING_USE_PROPER_SIZE_UNITS, !use_fake_units);
 | 
				
			||||||
			PrintStatus2000(lmprintf(MSG_263), !use_fake_units);
 | 
								PrintStatusTimeout(lmprintf(MSG_263), !use_fake_units);
 | 
				
			||||||
			GetUSBDevices(0);
 | 
								GetDevices(0);
 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		// Alt-V => Save selected device to *UNCOMPRESSED* VHD
 | 
							// Alt-V => Save selected device to *UNCOMPRESSED* VHD
 | 
				
			||||||
| 
						 | 
					@ -3190,8 +3209,8 @@ relaunch:
 | 
				
			||||||
		if ((msg.message == WM_SYSKEYDOWN) && (msg.wParam == 'W')) {
 | 
							if ((msg.message == WM_SYSKEYDOWN) && (msg.wParam == 'W')) {
 | 
				
			||||||
			enable_vmdk = !enable_vmdk;
 | 
								enable_vmdk = !enable_vmdk;
 | 
				
			||||||
			WriteSettingBool(SETTING_ENABLE_VMDK_DETECTION, enable_vmdk);
 | 
								WriteSettingBool(SETTING_ENABLE_VMDK_DETECTION, enable_vmdk);
 | 
				
			||||||
			PrintStatus2000(lmprintf(MSG_265), enable_vmdk);
 | 
								PrintStatusTimeout(lmprintf(MSG_265), enable_vmdk);
 | 
				
			||||||
			GetUSBDevices(0);
 | 
								GetDevices(0);
 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		// Alt-X => Delete the 'rufus_files' subdirectory
 | 
							// Alt-X => Delete the 'rufus_files' subdirectory
 | 
				
			||||||
| 
						 | 
					@ -3208,6 +3227,27 @@ relaunch:
 | 
				
			||||||
			PostMessage(hDlg, WM_COMMAND, (WPARAM)IDC_START, 0);
 | 
								PostMessage(hDlg, WM_COMMAND, (WPARAM)IDC_START, 0);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Hazardous cheat modes require Ctrl + Alt
 | 
				
			||||||
 | 
							// Ctrl-Alt-F => List non USB removable drives such as eSATA, etc - CAUTION!!!
 | 
				
			||||||
 | 
							if ((msg.message == WM_KEYDOWN) && (msg.wParam == 'F') &&
 | 
				
			||||||
 | 
								(GetKeyState(VK_CONTROL) & 0x8000) && (GetKeyState(VK_MENU) & 0x8000)) {
 | 
				
			||||||
 | 
								list_non_usb_removable_drives = !list_non_usb_removable_drives;
 | 
				
			||||||
 | 
								if (list_non_usb_removable_drives) {
 | 
				
			||||||
 | 
									previous_enable_HDDs = enable_HDDs;
 | 
				
			||||||
 | 
									enable_HDDs = TRUE;
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									enable_HDDs = previous_enable_HDDs;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								CheckDlgButton(hMainDialog, IDC_ENABLE_FIXED_DISKS, enable_HDDs ? BST_CHECKED : BST_UNCHECKED);
 | 
				
			||||||
 | 
								PrintStatusTimeout(lmprintf(MSG_287), list_non_usb_removable_drives);
 | 
				
			||||||
 | 
								uprintf("%sListing of non-USB removable drives %s",
 | 
				
			||||||
 | 
									(list_non_usb_removable_drives)?"CAUTION: ":"", (list_non_usb_removable_drives)?"enabled":"disabled");
 | 
				
			||||||
 | 
								if (list_non_usb_removable_drives)
 | 
				
			||||||
 | 
									uprintf("By using this unofficial cheat mode you forfeit ANY RIGHT to complain if you lose valuable data!");
 | 
				
			||||||
 | 
								GetDevices(0);
 | 
				
			||||||
 | 
								continue;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Let the system handle dialog messages (e.g. those from the tab key)
 | 
							// Let the system handle dialog messages (e.g. those from the tab key)
 | 
				
			||||||
		if (!IsDialogMessage(hDlg, &msg) && !IsDialogMessage(hLogDlg, &msg)) {
 | 
							if (!IsDialogMessage(hDlg, &msg) && !IsDialogMessage(hLogDlg, &msg)) {
 | 
				
			||||||
			TranslateMessage(&msg);
 | 
								TranslateMessage(&msg);
 | 
				
			||||||
| 
						 | 
					@ -3243,14 +3283,15 @@ out:
 | 
				
			||||||
		SetLGP(TRUE, &existing_key, "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer", "NoDriveTypeAutorun", 0);
 | 
							SetLGP(TRUE, &existing_key, "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer", "NoDriveTypeAutorun", 0);
 | 
				
			||||||
	if ((nWindowsVersion > WINDOWS_XP) && (!automount) && (!SetAutoMount(FALSE)))
 | 
						if ((nWindowsVersion > WINDOWS_XP) && (!automount) && (!SetAutoMount(FALSE)))
 | 
				
			||||||
		uprintf("Failed to restore AutoMount to disabled");
 | 
							uprintf("Failed to restore AutoMount to disabled");
 | 
				
			||||||
 | 
						// Unconditional delete with retry, just in case...
 | 
				
			||||||
 | 
						for (i = 0; (!DeleteFileA(cmdline_hogger)) && (i <= 10); i++)
 | 
				
			||||||
 | 
							Sleep(200);
 | 
				
			||||||
 | 
						CloseHandle(mutex);
 | 
				
			||||||
 | 
						CLOSE_OPENED_LIBRARIES;
 | 
				
			||||||
	if (attached_console) {
 | 
						if (attached_console) {
 | 
				
			||||||
		SetWindowPos(GetConsoleWindow(), HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
 | 
							SetWindowPos(GetConsoleWindow(), HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
 | 
				
			||||||
		FreeConsole();
 | 
							FreeConsole();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	// Unconditional delete, just in case...
 | 
					 | 
				
			||||||
	DeleteFileA(cmdline_hogger);
 | 
					 | 
				
			||||||
	CloseHandle(mutex);
 | 
					 | 
				
			||||||
	CLOSE_OPENED_LIBRARIES;
 | 
					 | 
				
			||||||
	uprintf("*** " APPLICATION_NAME " exit ***\n");
 | 
						uprintf("*** " APPLICATION_NAME " exit ***\n");
 | 
				
			||||||
#ifdef _CRTDBG_MAP_ALLOC
 | 
					#ifdef _CRTDBG_MAP_ALLOC
 | 
				
			||||||
	_CrtDumpMemoryLeaks();
 | 
						_CrtDumpMemoryLeaks();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										110
									
								
								src/rufus.h
									
										
									
									
									
								
							
							
						
						
									
										110
									
								
								src/rufus.h
									
										
									
									
									
								
							| 
						 | 
					@ -1,6 +1,6 @@
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Rufus: The Reliable USB Formatting Utility
 | 
					 * Rufus: The Reliable USB Formatting Utility
 | 
				
			||||||
 * Copyright © 2011-2015 Pete Batard <pete@akeo.ie>
 | 
					 * Copyright © 2011-2016 Pete Batard <pete@akeo.ie>
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * This program is free software: you can redistribute it and/or modify
 | 
					 * This program is free software: you can redistribute it and/or modify
 | 
				
			||||||
 * it under the terms of the GNU General Public License as published by
 | 
					 * it under the terms of the GNU General Public License as published by
 | 
				
			||||||
| 
						 | 
					@ -16,15 +16,20 @@
 | 
				
			||||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
					 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
#include <windows.h>
 | 
					#include <windows.h>
 | 
				
			||||||
#include <winioctl.h>				// for DISK_GEOMETRY
 | 
					 | 
				
			||||||
#include <malloc.h>
 | 
					#include <malloc.h>
 | 
				
			||||||
#include <inttypes.h>
 | 
					#include <inttypes.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(_MSC_VER)
 | 
					#if defined(_MSC_VER)
 | 
				
			||||||
// Disable some VS2012 Code Analysis warnings
 | 
					// Disable some VS2012 Code Analysis warnings
 | 
				
			||||||
#pragma warning(disable: 4996)		// Ignore deprecated (eg. GetVersionEx()), as we have to contend with XP
 | 
					#pragma warning(disable: 4996)		// Ignore deprecated (eg. GetVersionEx()), as we have to contend with XP
 | 
				
			||||||
#pragma warning(disable: 28159)		// VS2012 wants us to use GetTickCount64(), but it's not available on XP
 | 
					#pragma warning(disable: 28159)		// We use GetTickCount64() where possible, but it's not available on XP
 | 
				
			||||||
#pragma warning(disable: 6258)		// I know what I'm using TerminateThread for
 | 
					#pragma warning(disable: 6258)		// I know what I'm using TerminateThread for
 | 
				
			||||||
 | 
					// Burn in HELL Windows XP!!!
 | 
				
			||||||
 | 
					#ifdef DDKBUILD
 | 
				
			||||||
 | 
					#if (_WIN32_WINNT < _WIN32_WINNT_VISTA)
 | 
				
			||||||
 | 
					#error The Windows XP target is no longer supported for WDK compilation.
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#pragma once
 | 
					#pragma once
 | 
				
			||||||
| 
						 | 
					@ -33,10 +38,6 @@
 | 
				
			||||||
#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
 | 
				
			||||||
/* Languages for which translators are M.I.A. and that we could use help with */
 | 
					 | 
				
			||||||
#define LOST_TRANSLATORS            { "ms-MY" }	// NB: locales MUST be <= 5 chars
 | 
					 | 
				
			||||||
/* Probability of getting the M.I.A. translator message. For more on this, see LostTranslatorCheck() */
 | 
					 | 
				
			||||||
#define LOST_TRANSLATOR_PROBABILITY 1000
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define APPLICATION_NAME            "Rufus"
 | 
					#define APPLICATION_NAME            "Rufus"
 | 
				
			||||||
#define COMPANY_NAME                "Akeo Consulting"
 | 
					#define COMPANY_NAME                "Akeo Consulting"
 | 
				
			||||||
| 
						 | 
					@ -52,6 +53,7 @@
 | 
				
			||||||
#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 MIN_DRIVE_SIZE              8			// Minimum size a drive must have, to be formattable (in MB)
 | 
				
			||||||
#define MIN_EXTRA_PART_SIZE         (1024*1024)		// Minimum size of the extra partition, in bytes
 | 
					#define MIN_EXTRA_PART_SIZE         (1024*1024)		// Minimum size of the extra partition, in bytes
 | 
				
			||||||
#define MAX_DRIVES                  (DRIVE_INDEX_MAX - DRIVE_INDEX_MIN)
 | 
					#define MAX_DRIVES                  (DRIVE_INDEX_MAX - DRIVE_INDEX_MIN)
 | 
				
			||||||
#define MAX_TOOLTIPS                128
 | 
					#define MAX_TOOLTIPS                128
 | 
				
			||||||
| 
						 | 
					@ -59,11 +61,14 @@
 | 
				
			||||||
#define MAX_CLUSTER_SIZES           18
 | 
					#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_REFRESH                 25			// How long we should wait to refresh UI elements (in ms)
 | 
				
			||||||
#define MAX_GUID_STRING_LENGTH      40
 | 
					#define MAX_GUID_STRING_LENGTH      40
 | 
				
			||||||
#define MAX_GPT_PARTITIONS          128
 | 
					#define MAX_GPT_PARTITIONS          128
 | 
				
			||||||
#define MAX_SECTORS_TO_CLEAR        128			// nb sectors to zap when clearing the MBR/GPT (must be >34)
 | 
					#define MAX_SECTORS_TO_CLEAR        128			// nb sectors to zap when clearing the MBR/GPT (must be >34)
 | 
				
			||||||
#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 STATUS_MSG_TIMEOUT          3500		// How long should cheat mode messages appear for on the status bar
 | 
				
			||||||
#define WRITE_RETRIES               3
 | 
					#define WRITE_RETRIES               3
 | 
				
			||||||
 | 
					#define NUM_CHECKSUMS               3			// Number of checksum algorithms we support (MD5, SHA1, SHA256)
 | 
				
			||||||
#define FS_DEFAULT                  FS_FAT32
 | 
					#define FS_DEFAULT                  FS_FAT32
 | 
				
			||||||
#define SINGLE_CLUSTERSIZE_DEFAULT  0x00000100
 | 
					#define SINGLE_CLUSTERSIZE_DEFAULT  0x00000100
 | 
				
			||||||
#define BADBLOCK_PATTERNS           {0xaa, 0x55, 0xff, 0x00}
 | 
					#define BADBLOCK_PATTERNS           {0xaa, 0x55, 0xff, 0x00}
 | 
				
			||||||
| 
						 | 
					@ -102,7 +107,6 @@
 | 
				
			||||||
#define safe_strncmp(str1, str2, count) strncmp(((str1==NULL)?"<NULL>":str1), ((str2==NULL)?"<NULL>":str2), count)
 | 
					#define safe_strncmp(str1, str2, count) strncmp(((str1==NULL)?"<NULL>":str1), ((str2==NULL)?"<NULL>":str2), count)
 | 
				
			||||||
#define safe_strnicmp(str1, str2, count) _strnicmp(((str1==NULL)?"<NULL>":str1), ((str2==NULL)?"<NULL>":str2), count)
 | 
					#define safe_strnicmp(str1, str2, count) _strnicmp(((str1==NULL)?"<NULL>":str1), ((str2==NULL)?"<NULL>":str2), count)
 | 
				
			||||||
#define safe_closehandle(h) do {if ((h != INVALID_HANDLE_VALUE) && (h != NULL)) {CloseHandle(h); h = INVALID_HANDLE_VALUE;}} while(0)
 | 
					#define safe_closehandle(h) do {if ((h != INVALID_HANDLE_VALUE) && (h != NULL)) {CloseHandle(h); h = INVALID_HANDLE_VALUE;}} while(0)
 | 
				
			||||||
#define safe_unlockclose(h) do {if ((h != INVALID_HANDLE_VALUE) && (h != NULL)) {UnlockDrive(h); CloseHandle(h); h = INVALID_HANDLE_VALUE;}} while(0)
 | 
					 | 
				
			||||||
#define safe_release_dc(hDlg, hDC) do {if ((hDC != INVALID_HANDLE_VALUE) && (hDC != NULL)) {ReleaseDC(hDlg, hDC); hDC = NULL;}} while(0)
 | 
					#define safe_release_dc(hDlg, hDC) do {if ((hDC != INVALID_HANDLE_VALUE) && (hDC != NULL)) {ReleaseDC(hDlg, hDC); hDC = NULL;}} while(0)
 | 
				
			||||||
#define safe_sprintf(dst, count, ...) do {_snprintf(dst, count, __VA_ARGS__); (dst)[(count)-1] = 0; } while(0)
 | 
					#define safe_sprintf(dst, count, ...) do {_snprintf(dst, count, __VA_ARGS__); (dst)[(count)-1] = 0; } while(0)
 | 
				
			||||||
#define static_sprintf(dst, ...) safe_sprintf(dst, sizeof(dst), __VA_ARGS__)
 | 
					#define static_sprintf(dst, ...) safe_sprintf(dst, sizeof(dst), __VA_ARGS__)
 | 
				
			||||||
| 
						 | 
					@ -117,6 +121,9 @@
 | 
				
			||||||
#ifdef RUFUS_DEBUG
 | 
					#ifdef RUFUS_DEBUG
 | 
				
			||||||
extern void _uprintf(const char *format, ...);
 | 
					extern void _uprintf(const char *format, ...);
 | 
				
			||||||
#define uprintf(...) _uprintf(__VA_ARGS__)
 | 
					#define uprintf(...) _uprintf(__VA_ARGS__)
 | 
				
			||||||
 | 
					#define ubclear() do { ubuffer[0] = 0; } while (0);
 | 
				
			||||||
 | 
					#define ubpushf(...) static_sprintf(ubuffer, __VA_ARGS__)
 | 
				
			||||||
 | 
					#define ubpop() uprintf("%s", ubuffer)
 | 
				
			||||||
#define vuprintf(...) if (verbose) _uprintf(__VA_ARGS__)
 | 
					#define vuprintf(...) if (verbose) _uprintf(__VA_ARGS__)
 | 
				
			||||||
#define vvuprintf(...) if (verbose > 1) _uprintf(__VA_ARGS__)
 | 
					#define vvuprintf(...) if (verbose > 1) _uprintf(__VA_ARGS__)
 | 
				
			||||||
#define suprintf(...) if (!bSilent) _uprintf(__VA_ARGS__)
 | 
					#define suprintf(...) if (!bSilent) _uprintf(__VA_ARGS__)
 | 
				
			||||||
| 
						 | 
					@ -168,6 +175,8 @@ typedef struct {
 | 
				
			||||||
enum timer_type {
 | 
					enum timer_type {
 | 
				
			||||||
	TID_MESSAGE_INFO = 0x1000,
 | 
						TID_MESSAGE_INFO = 0x1000,
 | 
				
			||||||
	TID_MESSAGE_STATUS,
 | 
						TID_MESSAGE_STATUS,
 | 
				
			||||||
 | 
						TID_OUTPUT_INFO,
 | 
				
			||||||
 | 
						TID_OUTPUT_STATUS,
 | 
				
			||||||
	TID_BADBLOCKS_UPDATE,
 | 
						TID_BADBLOCKS_UPDATE,
 | 
				
			||||||
	TID_APP_TIMER,
 | 
						TID_APP_TIMER,
 | 
				
			||||||
	TID_BLOCKING_TIMER,
 | 
						TID_BLOCKING_TIMER,
 | 
				
			||||||
| 
						 | 
					@ -223,24 +232,6 @@ enum target_type {
 | 
				
			||||||
#define GETTARGETTYPE(x) (((x)>0)?(((x) >> 16) & 0xFFFF):0)
 | 
					#define GETTARGETTYPE(x) (((x)>0)?(((x) >> 16) & 0xFFFF):0)
 | 
				
			||||||
#define GETPARTTYPE(x)   (((x)>0)?((x) & 0xFFFF):0);
 | 
					#define GETPARTTYPE(x)   (((x)>0)?((x) & 0xFFFF):0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Current drive info */
 | 
					 | 
				
			||||||
typedef struct {
 | 
					 | 
				
			||||||
	DWORD DeviceNumber;
 | 
					 | 
				
			||||||
	LONGLONG DiskSize;
 | 
					 | 
				
			||||||
	DISK_GEOMETRY Geometry;
 | 
					 | 
				
			||||||
	DWORD FirstSector;
 | 
					 | 
				
			||||||
	char proposed_label[16];
 | 
					 | 
				
			||||||
	int PartitionType;
 | 
					 | 
				
			||||||
	int nPartitions;	// number of partitions we actually care about
 | 
					 | 
				
			||||||
	int FSType;
 | 
					 | 
				
			||||||
	BOOL has_protective_mbr;
 | 
					 | 
				
			||||||
	BOOL has_mbr_uefi_marker;
 | 
					 | 
				
			||||||
	struct {
 | 
					 | 
				
			||||||
		ULONG Allowed;
 | 
					 | 
				
			||||||
		ULONG Default;
 | 
					 | 
				
			||||||
	} ClusterSize[FS_MAX];
 | 
					 | 
				
			||||||
} RUFUS_DRIVE_INFO;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Special handling for old .c32 files we need to replace */
 | 
					/* Special handling for old .c32 files we need to replace */
 | 
				
			||||||
#define NB_OLD_C32          2
 | 
					#define NB_OLD_C32          2
 | 
				
			||||||
#define OLD_C32_NAMES       { "menu.c32", "vesamenu.c32" }
 | 
					#define OLD_C32_NAMES       { "menu.c32", "vesamenu.c32" }
 | 
				
			||||||
| 
						 | 
					@ -369,8 +360,7 @@ extern char szFolderPath[MAX_PATH], app_dir[MAX_PATH], system_dir[MAX_PATH], sys
 | 
				
			||||||
extern char* image_path;
 | 
					extern char* image_path;
 | 
				
			||||||
extern DWORD FormatStatus, DownloadStatus;
 | 
					extern DWORD FormatStatus, DownloadStatus;
 | 
				
			||||||
extern BOOL PromptOnError;
 | 
					extern BOOL PromptOnError;
 | 
				
			||||||
extern DWORD syslinux_ldlinux_len[2];
 | 
					extern unsigned long syslinux_ldlinux_len[2];
 | 
				
			||||||
extern RUFUS_DRIVE_INFO SelectedDrive;
 | 
					 | 
				
			||||||
extern const int nb_steps[FS_MAX];
 | 
					extern const int nb_steps[FS_MAX];
 | 
				
			||||||
extern BOOL use_own_c32[NB_OLD_C32], detect_fakes, iso_op_in_progress, format_op_in_progress, right_to_left_mode;
 | 
					extern BOOL use_own_c32[NB_OLD_C32], detect_fakes, iso_op_in_progress, format_op_in_progress, right_to_left_mode;
 | 
				
			||||||
extern BOOL allow_dual_uefi_bios, togo_mode;
 | 
					extern BOOL allow_dual_uefi_bios, togo_mode;
 | 
				
			||||||
| 
						 | 
					@ -379,6 +369,7 @@ extern int64_t iso_blocking_status;
 | 
				
			||||||
extern uint16_t rufus_version[3], embedded_sl_version[2];
 | 
					extern uint16_t rufus_version[3], embedded_sl_version[2];
 | 
				
			||||||
extern int nWindowsVersion;
 | 
					extern int nWindowsVersion;
 | 
				
			||||||
extern char WindowsVersionStr[128];
 | 
					extern char WindowsVersionStr[128];
 | 
				
			||||||
 | 
					extern char ubuffer[256];
 | 
				
			||||||
extern char embedded_sl_version_str[2][12];
 | 
					extern char embedded_sl_version_str[2][12];
 | 
				
			||||||
extern RUFUS_UPDATE update;
 | 
					extern RUFUS_UPDATE update;
 | 
				
			||||||
extern int dialog_showing;
 | 
					extern int dialog_showing;
 | 
				
			||||||
| 
						 | 
					@ -431,7 +422,7 @@ extern unsigned char* GetResource(HMODULE module, char* name, char* type, const
 | 
				
			||||||
extern DWORD GetResourceSize(HMODULE module, char* name, char* type, const char* desc);
 | 
					extern DWORD GetResourceSize(HMODULE module, char* name, char* type, const char* desc);
 | 
				
			||||||
extern DWORD RunCommand(const char* cmdline, const char* dir, BOOL log);
 | 
					extern DWORD RunCommand(const char* cmdline, const char* dir, BOOL log);
 | 
				
			||||||
extern BOOL CompareGUID(const GUID *guid1, const GUID *guid2);
 | 
					extern BOOL CompareGUID(const GUID *guid1, const GUID *guid2);
 | 
				
			||||||
extern BOOL GetUSBDevices(DWORD devnum);
 | 
					extern BOOL GetDevices(DWORD devnum);
 | 
				
			||||||
extern BOOL SetLGP(BOOL bRestore, BOOL* bExistingKey, const char* szPath, const char* szPolicy, DWORD dwValue);
 | 
					extern BOOL SetLGP(BOOL bRestore, BOOL* bExistingKey, const char* szPath, const char* szPolicy, DWORD dwValue);
 | 
				
			||||||
extern LONG GetEntryWidth(HWND hDropDown, const char* entry);
 | 
					extern LONG GetEntryWidth(HWND hDropDown, const char* entry);
 | 
				
			||||||
extern DWORD DownloadFile(const char* url, const char* file, HWND hProgressDialog);
 | 
					extern DWORD DownloadFile(const char* url, const char* file, HWND hProgressDialog);
 | 
				
			||||||
| 
						 | 
					@ -454,38 +445,19 @@ extern BOOL WimApplyImage(const char* image, int index, const char* dst);
 | 
				
			||||||
extern BOOL IsBootableImage(const char* path);
 | 
					extern BOOL IsBootableImage(const char* path);
 | 
				
			||||||
extern BOOL AppendVHDFooter(const char* vhd_path);
 | 
					extern BOOL AppendVHDFooter(const char* vhd_path);
 | 
				
			||||||
extern int IsHDD(DWORD DriveIndex, uint16_t vid, uint16_t pid, const char* strid);
 | 
					extern int IsHDD(DWORD DriveIndex, uint16_t vid, uint16_t pid, const char* strid);
 | 
				
			||||||
extern void LostTranslatorCheck(void);
 | 
					 | 
				
			||||||
extern LONG ValidateSignature(HWND hDlg, const char* path);
 | 
					extern LONG ValidateSignature(HWND hDlg, const char* path);
 | 
				
			||||||
extern BOOL IsFontAvailable(const char* font_name);
 | 
					extern BOOL IsFontAvailable(const char* font_name);
 | 
				
			||||||
 | 
					extern BOOL WriteFileWithRetry(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite,
 | 
				
			||||||
 | 
						LPDWORD lpNumberOfBytesWritten, DWORD nNumRetries);
 | 
				
			||||||
 | 
					extern BOOL SetThreadAffinity(DWORD_PTR* thread_affinity, size_t num_threads);
 | 
				
			||||||
 | 
					#define printbits(x) _printbits(sizeof(x), &x, 0)
 | 
				
			||||||
 | 
					#define printbitslz(x) _printbits(sizeof(x), &x, 1)
 | 
				
			||||||
 | 
					extern char* _printbits(size_t const size, void const * const ptr, int leading_zeroes);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
DWORD WINAPI FormatThread(void* param);
 | 
					DWORD WINAPI FormatThread(void* param);
 | 
				
			||||||
DWORD WINAPI SaveImageThread(void* param);
 | 
					DWORD WINAPI SaveImageThread(void* param);
 | 
				
			||||||
DWORD WINAPI SumThread(void* param);
 | 
					DWORD WINAPI SumThread(void* param);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static __inline BOOL UnlockDrive(HANDLE hDrive) {
 | 
					 | 
				
			||||||
	DWORD size;
 | 
					 | 
				
			||||||
	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;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static __inline uint16_t bswap_16(uint16_t x) {
 | 
					 | 
				
			||||||
	return (x >> 8) | (x << 8);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static __inline uint32_t bswap_32(uint32_t x) {
 | 
					 | 
				
			||||||
	return (bswap_16(x & 0xffff) << 16) | (bswap_16(x >> 16));
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static __inline uint64_t bswap_64(uint64_t x) {
 | 
					 | 
				
			||||||
	return (((uint64_t) bswap_32(x & 0xffffffffull)) << 32) | (bswap_32(x >> 32));
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Hash tables */
 | 
					/* Hash tables */
 | 
				
			||||||
typedef struct htab_entry {
 | 
					typedef struct htab_entry {
 | 
				
			||||||
	uint32_t used;
 | 
						uint32_t used;
 | 
				
			||||||
| 
						 | 
					@ -552,16 +524,6 @@ static __inline HMODULE GetLibraryHandle(char* szLibraryName) {
 | 
				
			||||||
	if (pf##proc == NULL) {uprintf("Unable to locate %s() in %s.dll: %s\n",  \
 | 
						if (pf##proc == NULL) {uprintf("Unable to locate %s() in %s.dll: %s\n",  \
 | 
				
			||||||
	#proc, #name, WindowsErrorString()); goto out;} } while(0)
 | 
						#proc, #name, WindowsErrorString()); goto out;} } while(0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Clang/MinGW32 has an issue with intptr_t */
 | 
					 | 
				
			||||||
#ifndef _UINTPTR_T_DEFINED
 | 
					 | 
				
			||||||
#define _UINTPTR_T_DEFINED
 | 
					 | 
				
			||||||
#ifdef _WIN64
 | 
					 | 
				
			||||||
  typedef unsigned __int64 uintptr_t;
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
  typedef unsigned int uintptr_t;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Custom application errors */
 | 
					/* Custom application errors */
 | 
				
			||||||
#define FAC(f)                         (f<<16)
 | 
					#define FAC(f)                         (f<<16)
 | 
				
			||||||
#define APPERR(err)                    (APPLICATION_ERROR_MASK|err)
 | 
					#define APPERR(err)                    (APPLICATION_ERROR_MASK|err)
 | 
				
			||||||
| 
						 | 
					@ -578,19 +540,7 @@ static __inline HMODULE GetLibraryHandle(char* szLibraryName) {
 | 
				
			||||||
#define ERROR_CANT_ASSIGN_LETTER       0x120B
 | 
					#define ERROR_CANT_ASSIGN_LETTER       0x120B
 | 
				
			||||||
#define ERROR_CANT_MOUNT_VOLUME        0x120C
 | 
					#define ERROR_CANT_MOUNT_VOLUME        0x120C
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* More niceties */
 | 
					/* GetTickCount64 not being available on XP is a massive bother */
 | 
				
			||||||
#ifndef MIN
 | 
					PF_TYPE(WINAPI, ULONGLONG, GetTickCount64, (void));
 | 
				
			||||||
#define MIN(a,b) (((a) < (b)) ? (a) : (b))
 | 
					extern GetTickCount64_t pfGetTickCount64;
 | 
				
			||||||
#endif
 | 
					#define _GetTickCount64() ((pfGetTickCount64 != NULL)?(uint64_t)pfGetTickCount64():(uint64_t)GetTickCount())
 | 
				
			||||||
#ifndef PBS_MARQUEE
 | 
					 | 
				
			||||||
#define PBS_MARQUEE 0x08
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#ifndef PBM_SETMARQUEE
 | 
					 | 
				
			||||||
#define PBM_SETMARQUEE (WM_USER+10)
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Why oh why does Microsoft have to make everybody suffer with their braindead use of Unicode? */
 | 
					 | 
				
			||||||
#define _RT_ICON			MAKEINTRESOURCEA(3)
 | 
					 | 
				
			||||||
#define _RT_DIALOG			MAKEINTRESOURCEA(5)
 | 
					 | 
				
			||||||
#define _RT_RCDATA			MAKEINTRESOURCEA(10)
 | 
					 | 
				
			||||||
#define _RT_GROUP_ICON		MAKEINTRESOURCEA((ULONG_PTR)(MAKEINTRESOURCEA(3) + 11))
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										11
									
								
								src/rufus.rc
									
										
									
									
									
								
							
							
						
						
									
										11
									
								
								src/rufus.rc
									
										
									
									
									
								
							| 
						 | 
					@ -32,7 +32,8 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
IDD_DIALOG DIALOGEX 12, 12, 242, 376
 | 
					IDD_DIALOG DIALOGEX 12, 12, 242, 376
 | 
				
			||||||
STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
 | 
					STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
 | 
				
			||||||
CAPTION "Rufus 2.7.830"
 | 
					EXSTYLE WS_EX_ACCEPTFILES
 | 
				
			||||||
 | 
					CAPTION "Rufus 2.9.921"
 | 
				
			||||||
FONT 8, "Segoe UI Symbol", 400, 0, 0x0
 | 
					FONT 8, "Segoe UI Symbol", 400, 0, 0x0
 | 
				
			||||||
BEGIN
 | 
					BEGIN
 | 
				
			||||||
    LTEXT           "Device",IDS_DEVICE_TXT,9,6,200,8
 | 
					    LTEXT           "Device",IDS_DEVICE_TXT,9,6,200,8
 | 
				
			||||||
| 
						 | 
					@ -319,8 +320,8 @@ END
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VS_VERSION_INFO VERSIONINFO
 | 
					VS_VERSION_INFO VERSIONINFO
 | 
				
			||||||
 FILEVERSION 2,7,830,0
 | 
					 FILEVERSION 2,9,921,0
 | 
				
			||||||
 PRODUCTVERSION 2,7,830,0
 | 
					 PRODUCTVERSION 2,9,921,0
 | 
				
			||||||
 FILEFLAGSMASK 0x3fL
 | 
					 FILEFLAGSMASK 0x3fL
 | 
				
			||||||
#ifdef _DEBUG
 | 
					#ifdef _DEBUG
 | 
				
			||||||
 FILEFLAGS 0x1L
 | 
					 FILEFLAGS 0x1L
 | 
				
			||||||
| 
						 | 
					@ -337,13 +338,13 @@ BEGIN
 | 
				
			||||||
        BEGIN
 | 
					        BEGIN
 | 
				
			||||||
            VALUE "CompanyName", "Akeo Consulting (http://akeo.ie)"
 | 
					            VALUE "CompanyName", "Akeo Consulting (http://akeo.ie)"
 | 
				
			||||||
            VALUE "FileDescription", "Rufus"
 | 
					            VALUE "FileDescription", "Rufus"
 | 
				
			||||||
            VALUE "FileVersion", "2.7.830"
 | 
					            VALUE "FileVersion", "2.9.921"
 | 
				
			||||||
            VALUE "InternalName", "Rufus"
 | 
					            VALUE "InternalName", "Rufus"
 | 
				
			||||||
            VALUE "LegalCopyright", "© 2011-2016 Pete Batard (GPL v3)"
 | 
					            VALUE "LegalCopyright", "© 2011-2016 Pete Batard (GPL v3)"
 | 
				
			||||||
            VALUE "LegalTrademarks", "http://www.gnu.org/copyleft/gpl.html"
 | 
					            VALUE "LegalTrademarks", "http://www.gnu.org/copyleft/gpl.html"
 | 
				
			||||||
            VALUE "OriginalFilename", "rufus.exe"
 | 
					            VALUE "OriginalFilename", "rufus.exe"
 | 
				
			||||||
            VALUE "ProductName", "Rufus"
 | 
					            VALUE "ProductName", "Rufus"
 | 
				
			||||||
            VALUE "ProductVersion", "2.7.830"
 | 
					            VALUE "ProductVersion", "2.9.921"
 | 
				
			||||||
        END
 | 
					        END
 | 
				
			||||||
    END
 | 
					    END
 | 
				
			||||||
    BLOCK "VarFileInfo"
 | 
					    BLOCK "VarFileInfo"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,7 +1,7 @@
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Rufus: The Reliable USB Formatting Utility
 | 
					 * Rufus: The Reliable USB Formatting Utility
 | 
				
			||||||
 * Settings access, through either registry or INI file
 | 
					 * Settings access, through either registry or INI file
 | 
				
			||||||
 * Copyright © 2015 Pete Batard <pete@akeo.ie>
 | 
					 * Copyright © 2015-2016 Pete Batard <pete@akeo.ie>
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * This program is free software: you can redistribute it and/or modify
 | 
					 * This program is free software: you can redistribute it and/or modify
 | 
				
			||||||
 * it under the terms of the GNU General Public License as published by
 | 
					 * it under the terms of the GNU General Public License as published by
 | 
				
			||||||
| 
						 | 
					@ -27,11 +27,11 @@ extern char* ini_file;
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * List of setting names used by this application
 | 
					 * List of setting names used by this application
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
#define SETTING_VERBOSE_UPDATES			    "VerboseUpdateCheck"
 | 
					#define SETTING_VERBOSE_UPDATES             "VerboseUpdateCheck"
 | 
				
			||||||
#define SETTING_LAST_UPDATE                 "LastUpdateCheck"
 | 
					#define SETTING_LAST_UPDATE                 "LastUpdateCheck"
 | 
				
			||||||
#define SETTING_UPDATE_INTERVAL             "UpdateCheckInterval"
 | 
					#define SETTING_UPDATE_INTERVAL             "UpdateCheckInterval"
 | 
				
			||||||
#define SETTING_INCLUDE_BETAS               "CheckForBetas"
 | 
					#define SETTING_INCLUDE_BETAS               "CheckForBetas"
 | 
				
			||||||
#define SETTING_COMM_CHECK                  "CommCheck"
 | 
					#define SETTING_COMM_CHECK                  "CommCheck64"
 | 
				
			||||||
#define SETTING_LOCALE                      "Locale"
 | 
					#define SETTING_LOCALE                      "Locale"
 | 
				
			||||||
#define SETTING_DISABLE_LGP                 "DisableLGP"
 | 
					#define SETTING_DISABLE_LGP                 "DisableLGP"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,7 +1,7 @@
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Rufus: The Reliable USB Formatting Utility
 | 
					 * Rufus: The Reliable USB Formatting Utility
 | 
				
			||||||
 * SMART HDD vs Flash detection (using ATA over USB, S.M.A.R.T., etc.)
 | 
					 * SMART HDD vs Flash detection (using ATA over USB, S.M.A.R.T., etc.)
 | 
				
			||||||
 * Copyright © 2013-2014 Pete Batard <pete@akeo.ie>
 | 
					 * Copyright © 2013-2016 Pete Batard <pete@akeo.ie>
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * Based in part on scsiata.cpp from Smartmontools: http://smartmontools.sourceforge.net
 | 
					 * Based in part on scsiata.cpp from Smartmontools: http://smartmontools.sourceforge.net
 | 
				
			||||||
 * Copyright © 2006-12 Douglas Gilbert <dgilbert@interlog.com>
 | 
					 * Copyright © 2006-12 Douglas Gilbert <dgilbert@interlog.com>
 | 
				
			||||||
| 
						 | 
					@ -31,8 +31,10 @@
 | 
				
			||||||
#include <ctype.h>
 | 
					#include <ctype.h>
 | 
				
			||||||
#include <stddef.h>
 | 
					#include <stddef.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "msapi_utf8.h"
 | 
					 | 
				
			||||||
#include "rufus.h"
 | 
					#include "rufus.h"
 | 
				
			||||||
 | 
					#include "missing.h"
 | 
				
			||||||
 | 
					#include "msapi_utf8.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "drive.h"
 | 
					#include "drive.h"
 | 
				
			||||||
#include "smart.h"
 | 
					#include "smart.h"
 | 
				
			||||||
#include "hdd_vs_ufd.h"
 | 
					#include "hdd_vs_ufd.h"
 | 
				
			||||||
| 
						 | 
					@ -436,7 +438,6 @@ BOOL SmartGetVersion(HANDLE hdevice)
 | 
				
			||||||
 *   from the above) => there is no magic API we can query that will tell us what we're
 | 
					 *   from the above) => there is no magic API we can query that will tell us what we're
 | 
				
			||||||
 *   really looking at.
 | 
					 *   really looking at.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
#define GB 1073741824LL
 | 
					 | 
				
			||||||
int IsHDD(DWORD DriveIndex, uint16_t vid, uint16_t pid, const char* strid)
 | 
					int IsHDD(DWORD DriveIndex, uint16_t vid, uint16_t pid, const char* strid)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int score = 0;
 | 
						int score = 0;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										45
									
								
								src/stdfn.c
									
										
									
									
									
								
							
							
						
						
									
										45
									
								
								src/stdfn.c
									
										
									
									
									
								
							| 
						 | 
					@ -1,7 +1,7 @@
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Rufus: The Reliable USB Formatting Utility
 | 
					 * Rufus: The Reliable USB Formatting Utility
 | 
				
			||||||
 * Standard Windows function calls
 | 
					 * Standard Windows function calls
 | 
				
			||||||
 * Copyright © 2013-2015 Pete Batard <pete@akeo.ie>
 | 
					 * Copyright © 2013-2016 Pete Batard <pete@akeo.ie>
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * This program is free software: you can redistribute it and/or modify
 | 
					 * This program is free software: you can redistribute it and/or modify
 | 
				
			||||||
 * it under the terms of the GNU General Public License as published by
 | 
					 * it under the terms of the GNU General Public License as published by
 | 
				
			||||||
| 
						 | 
					@ -24,12 +24,15 @@
 | 
				
			||||||
#include <windows.h>
 | 
					#include <windows.h>
 | 
				
			||||||
#include <sddl.h>
 | 
					#include <sddl.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "msapi_utf8.h"
 | 
					 | 
				
			||||||
#include "rufus.h"
 | 
					#include "rufus.h"
 | 
				
			||||||
 | 
					#include "missing.h"
 | 
				
			||||||
#include "resource.h"
 | 
					#include "resource.h"
 | 
				
			||||||
#include "settings.h"
 | 
					#include "msapi_utf8.h"
 | 
				
			||||||
#include "localization.h"
 | 
					#include "localization.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "settings.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern BOOL usb_debug;	// For uuprintf
 | 
				
			||||||
int  nWindowsVersion = WINDOWS_UNDEFINED;
 | 
					int  nWindowsVersion = WINDOWS_UNDEFINED;
 | 
				
			||||||
char WindowsVersionStr[128] = "Windows ";
 | 
					char WindowsVersionStr[128] = "Windows ";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -800,7 +803,7 @@ BOOL SetLGP(BOOL bRestore, BOOL* bExistingKey, const char* szPath, const char* s
 | 
				
			||||||
		uprintf("SetLGP: Unable to start thread");
 | 
							uprintf("SetLGP: Unable to start thread");
 | 
				
			||||||
		return FALSE;
 | 
							return FALSE;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if (WaitForSingleObject(thread_id, 2500) != WAIT_OBJECT_0) {
 | 
						if (WaitForSingleObject(thread_id, 5000) != WAIT_OBJECT_0) {
 | 
				
			||||||
		uprintf("SetLGP: Killing stuck thread!");
 | 
							uprintf("SetLGP: Killing stuck thread!");
 | 
				
			||||||
		TerminateThread(thread_id, 0);
 | 
							TerminateThread(thread_id, 0);
 | 
				
			||||||
		CloseHandle(thread_id);
 | 
							CloseHandle(thread_id);
 | 
				
			||||||
| 
						 | 
					@ -810,3 +813,37 @@ BOOL SetLGP(BOOL bRestore, BOOL* bExistingKey, const char* szPath, const char* s
 | 
				
			||||||
		return FALSE;
 | 
							return FALSE;
 | 
				
			||||||
	return (BOOL) r;
 | 
						return (BOOL) r;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * This call tries to evenly balance the affinities for an array of
 | 
				
			||||||
 | 
					 * num_threads, according to the number of cores at our disposal...
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					BOOL SetThreadAffinity(DWORD_PTR* thread_affinity, size_t num_threads)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						size_t i, j, pc;
 | 
				
			||||||
 | 
						DWORD_PTR affinity, dummy;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						memset(thread_affinity, 0, num_threads * sizeof(DWORD_PTR));
 | 
				
			||||||
 | 
						if (!GetProcessAffinityMask(GetCurrentProcess(), &affinity, &dummy))
 | 
				
			||||||
 | 
							return FALSE;
 | 
				
			||||||
 | 
						uuprintf("\r\nThread affinities:");
 | 
				
			||||||
 | 
						uuprintf("  avail:\t%s", printbitslz(affinity));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// If we don't have enough virtual cores to evenly spread our load forget it
 | 
				
			||||||
 | 
						pc = popcnt64(affinity);
 | 
				
			||||||
 | 
						if (pc < num_threads)
 | 
				
			||||||
 | 
							return FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Spread the affinity as evenly as we can
 | 
				
			||||||
 | 
						thread_affinity[num_threads - 1] = affinity;
 | 
				
			||||||
 | 
						for (i = 0; i < num_threads - 1; i++) {
 | 
				
			||||||
 | 
							for (j = 0; j < pc / num_threads; j++) {
 | 
				
			||||||
 | 
								thread_affinity[i] |= affinity & (-1LL * affinity);
 | 
				
			||||||
 | 
								affinity ^= affinity & (-1LL * affinity);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							uuprintf("  thr_%d:\t%s", i, printbitslz(thread_affinity[i]));
 | 
				
			||||||
 | 
							thread_affinity[num_threads - 1] ^= thread_affinity[i];
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						uuprintf("  thr_%d:\t%s", i, printbitslz(thread_affinity[i]));
 | 
				
			||||||
 | 
						return TRUE;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										87
									
								
								src/stdio.c
									
										
									
									
									
								
							
							
						
						
									
										87
									
								
								src/stdio.c
									
										
									
									
									
								
							| 
						 | 
					@ -1,7 +1,7 @@
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Rufus: The Reliable USB Formatting Utility
 | 
					 * Rufus: The Reliable USB Formatting Utility
 | 
				
			||||||
 * Standard User I/O Routines (logging, status, etc.)
 | 
					 * Standard User I/O Routines (logging, status, etc.)
 | 
				
			||||||
 * Copyright © 2011-2015 Pete Batard <pete@akeo.ie>
 | 
					 * Copyright © 2011-2016 Pete Batard <pete@akeo.ie>
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * This program is free software: you can redistribute it and/or modify
 | 
					 * This program is free software: you can redistribute it and/or modify
 | 
				
			||||||
 * it under the terms of the GNU General Public License as published by
 | 
					 * it under the terms of the GNU General Public License as published by
 | 
				
			||||||
| 
						 | 
					@ -29,15 +29,16 @@
 | 
				
			||||||
#include <ctype.h>
 | 
					#include <ctype.h>
 | 
				
			||||||
#include <math.h>
 | 
					#include <math.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "msapi_utf8.h"
 | 
					 | 
				
			||||||
#include "rufus.h"
 | 
					#include "rufus.h"
 | 
				
			||||||
#include "resource.h"
 | 
					#include "resource.h"
 | 
				
			||||||
 | 
					#include "msapi_utf8.h"
 | 
				
			||||||
#include "localization.h"
 | 
					#include "localization.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Globals
 | 
					 * Globals
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
HWND hStatus;
 | 
					HWND hStatus;
 | 
				
			||||||
 | 
					char ubuffer[256];	// Buffer for ubpushf() messages we don't log right away
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef RUFUS_DEBUG
 | 
					#ifdef RUFUS_DEBUG
 | 
				
			||||||
void _uprintf(const char *format, ...)
 | 
					void _uprintf(const char *format, ...)
 | 
				
			||||||
| 
						 | 
					@ -62,15 +63,45 @@ void _uprintf(const char *format, ...)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Send output to Windows debug facility
 | 
						// Send output to Windows debug facility
 | 
				
			||||||
	OutputDebugStringA(buf);
 | 
						OutputDebugStringA(buf);
 | 
				
			||||||
	// Send output to our log Window
 | 
						if ((hLog != NULL) && (hLog != INVALID_HANDLE_VALUE)) {
 | 
				
			||||||
	Edit_SetSel(hLog, MAX_LOG_SIZE, MAX_LOG_SIZE);
 | 
							// Send output to our log Window
 | 
				
			||||||
	Edit_ReplaceSelU(hLog, buf);
 | 
							Edit_SetSel(hLog, MAX_LOG_SIZE, MAX_LOG_SIZE);
 | 
				
			||||||
	// Make sure the message scrolls into view
 | 
							Edit_ReplaceSelU(hLog, buf);
 | 
				
			||||||
	// (Or see code commented in LogProc:WM_SHOWWINDOW for a less forceful scroll)
 | 
							// Make sure the message scrolls into view
 | 
				
			||||||
	SendMessage(hLog, EM_LINESCROLL, 0, SendMessage(hLog, EM_GETLINECOUNT, 0, 0));
 | 
							// (Or see code commented in LogProc:WM_SHOWWINDOW for a less forceful scroll)
 | 
				
			||||||
 | 
							SendMessage(hLog, EM_LINESCROLL, 0, SendMessage(hLog, EM_GETLINECOUNT, 0, 0));
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Prints a bitstring of a number of any size, with or without leading zeroes.
 | 
				
			||||||
 | 
					// See also the printbits() and printbitslz() helper macros in rufus.h
 | 
				
			||||||
 | 
					char *_printbits(size_t const size, void const * const ptr, int leading_zeroes)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						// sizeof(uintmax_t) so that we have enough space to store whatever is thrown at us
 | 
				
			||||||
 | 
						static char str[sizeof(uintmax_t) * 8 + 3];
 | 
				
			||||||
 | 
						size_t i;
 | 
				
			||||||
 | 
						uint8_t* b = (uint8_t*)ptr;
 | 
				
			||||||
 | 
						uintmax_t mask, lzmask = 0, val = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Little endian, the SCOURGE of any rational computing
 | 
				
			||||||
 | 
						for (i = 0; i < size; i++)
 | 
				
			||||||
 | 
							val |= ((uintmax_t)b[i]) << (8 * i);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						str[0] = '0';
 | 
				
			||||||
 | 
						str[1] = 'b';
 | 
				
			||||||
 | 
						if (leading_zeroes)
 | 
				
			||||||
 | 
							lzmask = 1ULL << (size * 8 - 1);
 | 
				
			||||||
 | 
						for (i = 2, mask = 1ULL << (sizeof(uintmax_t) * 8 - 1); mask != 0; mask >>= 1) {
 | 
				
			||||||
 | 
							if ((i > 2) || (lzmask & mask))
 | 
				
			||||||
 | 
								str[i++] = (val & mask) ? '1' : '0';
 | 
				
			||||||
 | 
							else if (val & mask)
 | 
				
			||||||
 | 
								str[i++] = '1';
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						str[i] = '\0';
 | 
				
			||||||
 | 
						return str;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void DumpBufferHex(void *buf, size_t size)
 | 
					void DumpBufferHex(void *buf, size_t size)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	unsigned char* buffer = (unsigned char*)buf;
 | 
						unsigned char* buffer = (unsigned char*)buf;
 | 
				
			||||||
| 
						 | 
					@ -280,3 +311,43 @@ const char* StrError(DWORD error_code, BOOL use_default_locale)
 | 
				
			||||||
		toggle_default_locale();
 | 
							toggle_default_locale();
 | 
				
			||||||
	return ret;
 | 
						return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					BOOL WriteFileWithRetry(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite,
 | 
				
			||||||
 | 
						LPDWORD lpNumberOfBytesWritten, DWORD nNumRetries)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						DWORD nTry;
 | 
				
			||||||
 | 
						BOOL readFilePointer;
 | 
				
			||||||
 | 
						LARGE_INTEGER liFilePointer, liZero = { { 0,0 } };
 | 
				
			||||||
 | 
						static char* retry_msg = " - retrying...";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Need to get the current file pointer in case we need to retry
 | 
				
			||||||
 | 
						readFilePointer = SetFilePointerEx(hFile, liZero, &liFilePointer, FILE_CURRENT);
 | 
				
			||||||
 | 
						if (!readFilePointer)
 | 
				
			||||||
 | 
							uprintf("  Warning - Could not read file pointer: %s", WindowsErrorString());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (nNumRetries == 0)
 | 
				
			||||||
 | 
							nNumRetries = 1;
 | 
				
			||||||
 | 
						for (nTry = 1; nTry <= nNumRetries; nTry++) {
 | 
				
			||||||
 | 
							// Need to rewind our file position on retry - if we can't even do that, just give up
 | 
				
			||||||
 | 
							if ((nTry > 1) && (!SetFilePointerEx(hFile, liFilePointer, NULL, FILE_BEGIN))) {
 | 
				
			||||||
 | 
								uprintf("  Could not set file pointer - aborting");
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if (WriteFile(hFile, lpBuffer, nNumberOfBytesToWrite, lpNumberOfBytesWritten, NULL)) {
 | 
				
			||||||
 | 
								if (nNumberOfBytesToWrite == *lpNumberOfBytesWritten)
 | 
				
			||||||
 | 
									return TRUE;
 | 
				
			||||||
 | 
								uprintf("  Wrote %d bytes but requested %d%s", *lpNumberOfBytesWritten,
 | 
				
			||||||
 | 
									nNumberOfBytesToWrite, nTry < nNumRetries ? retry_msg : "");
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else {
 | 
				
			||||||
 | 
								uprintf("  Write error [0x%8X]%s", GetLastError(), nTry < nNumRetries ? retry_msg : "");
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							// If we can't reposition for the next run, just abort
 | 
				
			||||||
 | 
							if (!readFilePointer)
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							Sleep(200);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if (SCODE_CODE(GetLastError()) == ERROR_SUCCESS)
 | 
				
			||||||
 | 
							SetLastError(ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_WRITE_FAULT);
 | 
				
			||||||
 | 
						return FALSE;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										316
									
								
								src/stdlg.c
									
										
									
									
									
								
							
							
						
						
									
										316
									
								
								src/stdlg.c
									
										
									
									
									
								
							| 
						 | 
					@ -35,16 +35,16 @@
 | 
				
			||||||
#include <richedit.h>
 | 
					#include <richedit.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "rufus.h"
 | 
					#include "rufus.h"
 | 
				
			||||||
#include "msapi_utf8.h"
 | 
					#include "missing.h"
 | 
				
			||||||
#include "registry.h"
 | 
					 | 
				
			||||||
#include "settings.h"
 | 
					 | 
				
			||||||
#include "resource.h"
 | 
					#include "resource.h"
 | 
				
			||||||
#include "license.h"
 | 
					#include "msapi_utf8.h"
 | 
				
			||||||
#include "localization.h"
 | 
					#include "localization.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if (_WIN32_WINNT >= _WIN32_WINNT_VISTA)
 | 
					#include "registry.h"
 | 
				
			||||||
 | 
					#include "settings.h"
 | 
				
			||||||
 | 
					#include "license.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
PF_TYPE_DECL(WINAPI, HRESULT, SHCreateItemFromParsingName, (PCWSTR, IBindCtx*, REFIID, void **));
 | 
					PF_TYPE_DECL(WINAPI, HRESULT, SHCreateItemFromParsingName, (PCWSTR, IBindCtx*, REFIID, void **));
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
PF_TYPE_DECL(WINAPI, LPITEMIDLIST, SHSimpleIDListFromPath, (PCWSTR pszPath));
 | 
					PF_TYPE_DECL(WINAPI, LPITEMIDLIST, SHSimpleIDListFromPath, (PCWSTR pszPath));
 | 
				
			||||||
#define INIT_VISTA_SHELL32         PF_INIT(SHCreateItemFromParsingName, Shell32)
 | 
					#define INIT_VISTA_SHELL32         PF_INIT(SHCreateItemFromParsingName, Shell32)
 | 
				
			||||||
#define INIT_XP_SHELL32            PF_INIT(SHSimpleIDListFromPath, Shell32)
 | 
					#define INIT_XP_SHELL32            PF_INIT(SHSimpleIDListFromPath, Shell32)
 | 
				
			||||||
| 
						 | 
					@ -133,8 +133,6 @@ void BrowseForFolder(void) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	BROWSEINFOW bi;
 | 
						BROWSEINFOW bi;
 | 
				
			||||||
	LPITEMIDLIST pidl;
 | 
						LPITEMIDLIST pidl;
 | 
				
			||||||
 | 
					 | 
				
			||||||
#if (_WIN32_WINNT >= _WIN32_WINNT_VISTA)
 | 
					 | 
				
			||||||
	WCHAR *wpath;
 | 
						WCHAR *wpath;
 | 
				
			||||||
	size_t i;
 | 
						size_t i;
 | 
				
			||||||
	HRESULT hr;
 | 
						HRESULT hr;
 | 
				
			||||||
| 
						 | 
					@ -145,79 +143,77 @@ void BrowseForFolder(void) {
 | 
				
			||||||
	char* tmp_path = NULL;
 | 
						char* tmp_path = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	dialog_showing++;
 | 
						dialog_showing++;
 | 
				
			||||||
	// Even if we have Vista support with the compiler,
 | 
						if (nWindowsVersion >= WINDOWS_VISTA) {
 | 
				
			||||||
	// it does not mean we have the Vista API available
 | 
							INIT_VISTA_SHELL32;
 | 
				
			||||||
	INIT_VISTA_SHELL32;
 | 
							if (IS_VISTA_SHELL32_AVAILABLE) {
 | 
				
			||||||
	if (IS_VISTA_SHELL32_AVAILABLE) {
 | 
								hr = CoCreateInstance(&CLSID_FileOpenDialog, NULL, CLSCTX_INPROC,
 | 
				
			||||||
		hr = CoCreateInstance(&CLSID_FileOpenDialog, NULL, CLSCTX_INPROC,
 | 
									&IID_IFileOpenDialog, (LPVOID)&pfod);
 | 
				
			||||||
			&IID_IFileOpenDialog, (LPVOID)&pfod);
 | 
								if (FAILED(hr)) {
 | 
				
			||||||
		if (FAILED(hr)) {
 | 
									uprintf("CoCreateInstance for FileOpenDialog failed: error %X\n", hr);
 | 
				
			||||||
			uprintf("CoCreateInstance for FileOpenDialog failed: error %X\n", hr);
 | 
									pfod = NULL;	// Just in case
 | 
				
			||||||
			pfod = NULL;	// Just in case
 | 
									goto fallback;
 | 
				
			||||||
			goto fallback;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		hr = pfod->lpVtbl->SetOptions(pfod, FOS_PICKFOLDERS);
 | 
					 | 
				
			||||||
		if (FAILED(hr)) {
 | 
					 | 
				
			||||||
			uprintf("Failed to set folder option for FileOpenDialog: error %X\n", hr);
 | 
					 | 
				
			||||||
			goto fallback;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		// Set the initial folder (if the path is invalid, will simply use last)
 | 
					 | 
				
			||||||
		wpath = utf8_to_wchar(szFolderPath);
 | 
					 | 
				
			||||||
		// The new IFileOpenDialog makes us split the path
 | 
					 | 
				
			||||||
		fname = NULL;
 | 
					 | 
				
			||||||
		if ((wpath != NULL) && (wcslen(wpath) >= 1)) {
 | 
					 | 
				
			||||||
			for (i=wcslen(wpath)-1; i!=0; i--) {
 | 
					 | 
				
			||||||
				if (wpath[i] == L'\\') {
 | 
					 | 
				
			||||||
					wpath[i] = 0;
 | 
					 | 
				
			||||||
					fname = &wpath[i+1];
 | 
					 | 
				
			||||||
					break;
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
								hr = pfod->lpVtbl->SetOptions(pfod, FOS_PICKFOLDERS);
 | 
				
			||||||
 | 
								if (FAILED(hr)) {
 | 
				
			||||||
		hr = (*pfSHCreateItemFromParsingName)(wpath, NULL, &IID_IShellItem, (LPVOID)&si_path);
 | 
					 | 
				
			||||||
		if (SUCCEEDED(hr)) {
 | 
					 | 
				
			||||||
			if (wpath != NULL) {
 | 
					 | 
				
			||||||
				hr = pfod->lpVtbl->SetFolder(pfod, si_path);
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if (fname != NULL) {
 | 
					 | 
				
			||||||
				hr = pfod->lpVtbl->SetFileName(pfod, fname);
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		safe_free(wpath);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		hr = pfod->lpVtbl->Show(pfod, hMainDialog);
 | 
					 | 
				
			||||||
		if (SUCCEEDED(hr)) {
 | 
					 | 
				
			||||||
			hr = pfod->lpVtbl->GetResult(pfod, &psi);
 | 
					 | 
				
			||||||
			if (SUCCEEDED(hr)) {
 | 
					 | 
				
			||||||
				psi->lpVtbl->GetDisplayName(psi, SIGDN_FILESYSPATH, &wpath);
 | 
					 | 
				
			||||||
				tmp_path = wchar_to_utf8(wpath);
 | 
					 | 
				
			||||||
				CoTaskMemFree(wpath);
 | 
					 | 
				
			||||||
				if (tmp_path == NULL) {
 | 
					 | 
				
			||||||
					uprintf("Could not convert path\n");
 | 
					 | 
				
			||||||
				} else {
 | 
					 | 
				
			||||||
					safe_strcpy(szFolderPath, MAX_PATH, tmp_path);
 | 
					 | 
				
			||||||
					safe_free(tmp_path);
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			} else {
 | 
					 | 
				
			||||||
				uprintf("Failed to set folder option for FileOpenDialog: error %X\n", hr);
 | 
									uprintf("Failed to set folder option for FileOpenDialog: error %X\n", hr);
 | 
				
			||||||
 | 
									goto fallback;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		} else if ((hr & 0xFFFF) != ERROR_CANCELLED) {
 | 
								// Set the initial folder (if the path is invalid, will simply use last)
 | 
				
			||||||
			// If it's not a user cancel, assume the dialog didn't show and fallback
 | 
								wpath = utf8_to_wchar(szFolderPath);
 | 
				
			||||||
			uprintf("Could not show FileOpenDialog: error %X\n", hr);
 | 
								// The new IFileOpenDialog makes us split the path
 | 
				
			||||||
			goto fallback;
 | 
								fname = NULL;
 | 
				
			||||||
 | 
								if ((wpath != NULL) && (wcslen(wpath) >= 1)) {
 | 
				
			||||||
 | 
									for (i = wcslen(wpath) - 1; i != 0; i--) {
 | 
				
			||||||
 | 
										if (wpath[i] == L'\\') {
 | 
				
			||||||
 | 
											wpath[i] = 0;
 | 
				
			||||||
 | 
											fname = &wpath[i + 1];
 | 
				
			||||||
 | 
											break;
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								hr = (*pfSHCreateItemFromParsingName)(wpath, NULL, &IID_IShellItem, (LPVOID)&si_path);
 | 
				
			||||||
 | 
								if (SUCCEEDED(hr)) {
 | 
				
			||||||
 | 
									if (wpath != NULL) {
 | 
				
			||||||
 | 
										pfod->lpVtbl->SetFolder(pfod, si_path);
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									if (fname != NULL) {
 | 
				
			||||||
 | 
										pfod->lpVtbl->SetFileName(pfod, fname);
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								safe_free(wpath);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								hr = pfod->lpVtbl->Show(pfod, hMainDialog);
 | 
				
			||||||
 | 
								if (SUCCEEDED(hr)) {
 | 
				
			||||||
 | 
									hr = pfod->lpVtbl->GetResult(pfod, &psi);
 | 
				
			||||||
 | 
									if (SUCCEEDED(hr)) {
 | 
				
			||||||
 | 
										psi->lpVtbl->GetDisplayName(psi, SIGDN_FILESYSPATH, &wpath);
 | 
				
			||||||
 | 
										tmp_path = wchar_to_utf8(wpath);
 | 
				
			||||||
 | 
										CoTaskMemFree(wpath);
 | 
				
			||||||
 | 
										if (tmp_path == NULL) {
 | 
				
			||||||
 | 
											uprintf("Could not convert path\n");
 | 
				
			||||||
 | 
										} else {
 | 
				
			||||||
 | 
											safe_strcpy(szFolderPath, MAX_PATH, tmp_path);
 | 
				
			||||||
 | 
											safe_free(tmp_path);
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									} else {
 | 
				
			||||||
 | 
										uprintf("Failed to set folder option for FileOpenDialog: error %X\n", hr);
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								} else if ((hr & 0xFFFF) != ERROR_CANCELLED) {
 | 
				
			||||||
 | 
									// If it's not a user cancel, assume the dialog didn't show and fallback
 | 
				
			||||||
 | 
									uprintf("Could not show FileOpenDialog: error %X\n", hr);
 | 
				
			||||||
 | 
									goto fallback;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								pfod->lpVtbl->Release(pfod);
 | 
				
			||||||
 | 
								dialog_showing--;
 | 
				
			||||||
 | 
								return;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		pfod->lpVtbl->Release(pfod);
 | 
					 | 
				
			||||||
		dialog_showing--;
 | 
					 | 
				
			||||||
		return;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
fallback:
 | 
					fallback:
 | 
				
			||||||
	if (pfod != NULL) {
 | 
							if (pfod != NULL) {
 | 
				
			||||||
		pfod->lpVtbl->Release(pfod);
 | 
								pfod->lpVtbl->Release(pfod);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
#else
 | 
					
 | 
				
			||||||
	dialog_showing++;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
	INIT_XP_SHELL32;
 | 
						INIT_XP_SHELL32;
 | 
				
			||||||
	memset(&bi, 0, sizeof(BROWSEINFOW));
 | 
						memset(&bi, 0, sizeof(BROWSEINFOW));
 | 
				
			||||||
	bi.hwndOwner = hMainDialog;
 | 
						bi.hwndOwner = hMainDialog;
 | 
				
			||||||
| 
						 | 
					@ -251,101 +247,98 @@ char* FileDialog(BOOL save, char* path, const ext_t* ext, DWORD options)
 | 
				
			||||||
	size_t i, j, ext_strlen;
 | 
						size_t i, j, ext_strlen;
 | 
				
			||||||
	BOOL r;
 | 
						BOOL r;
 | 
				
			||||||
	char* filepath = NULL;
 | 
						char* filepath = NULL;
 | 
				
			||||||
 | 
					 | 
				
			||||||
#if (_WIN32_WINNT >= _WIN32_WINNT_VISTA)
 | 
					 | 
				
			||||||
	HRESULT hr = FALSE;
 | 
						HRESULT hr = FALSE;
 | 
				
			||||||
	IFileDialog *pfd = NULL;
 | 
						IFileDialog *pfd = NULL;
 | 
				
			||||||
	IShellItem *psiResult;
 | 
						IShellItem *psiResult;
 | 
				
			||||||
	COMDLG_FILTERSPEC* filter_spec;
 | 
						COMDLG_FILTERSPEC* filter_spec = NULL;
 | 
				
			||||||
	wchar_t *wpath = NULL, *wfilename = NULL;
 | 
						wchar_t *wpath = NULL, *wfilename = NULL;
 | 
				
			||||||
	IShellItem *si_path = NULL;	// Automatically freed
 | 
						IShellItem *si_path = NULL;	// Automatically freed
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ((ext == NULL) || (ext->count == 0) || (ext->extension == NULL) || (ext->description == NULL))
 | 
						if ((ext == NULL) || (ext->count == 0) || (ext->extension == NULL) || (ext->description == NULL))
 | 
				
			||||||
		return NULL;
 | 
							return NULL;
 | 
				
			||||||
	dialog_showing++;
 | 
						dialog_showing++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if (_WIN32_WINNT >= _WIN32_WINNT_VISTA)
 | 
						if (nWindowsVersion >= WINDOWS_VISTA) {
 | 
				
			||||||
	INIT_VISTA_SHELL32;
 | 
							INIT_VISTA_SHELL32;
 | 
				
			||||||
	filter_spec = (COMDLG_FILTERSPEC*)calloc(ext->count + 1, sizeof(COMDLG_FILTERSPEC));
 | 
							filter_spec = (COMDLG_FILTERSPEC*)calloc(ext->count + 1, sizeof(COMDLG_FILTERSPEC));
 | 
				
			||||||
	if ((IS_VISTA_SHELL32_AVAILABLE) && (filter_spec != NULL)) {
 | 
							if ((IS_VISTA_SHELL32_AVAILABLE) && (filter_spec != NULL)) {
 | 
				
			||||||
		// Setup the file extension filter table
 | 
								// Setup the file extension filter table
 | 
				
			||||||
		for (i=0; i<ext->count; i++) {
 | 
								for (i = 0; i < ext->count; i++) {
 | 
				
			||||||
			filter_spec[i].pszSpec = utf8_to_wchar(ext->extension[i]);
 | 
									filter_spec[i].pszSpec = utf8_to_wchar(ext->extension[i]);
 | 
				
			||||||
			filter_spec[i].pszName = utf8_to_wchar(ext->description[i]);
 | 
									filter_spec[i].pszName = utf8_to_wchar(ext->description[i]);
 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		filter_spec[i].pszSpec = L"*.*";
 | 
					 | 
				
			||||||
		filter_spec[i].pszName = utf8_to_wchar(lmprintf(MSG_107));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		hr = CoCreateInstance(save?&CLSID_FileSaveDialog:&CLSID_FileOpenDialog, NULL, CLSCTX_INPROC,
 | 
					 | 
				
			||||||
			&IID_IFileDialog, (LPVOID)&pfd);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if (FAILED(hr)) {
 | 
					 | 
				
			||||||
			SetLastError(hr);
 | 
					 | 
				
			||||||
			uprintf("CoCreateInstance for FileOpenDialog failed: %s\n", WindowsErrorString());
 | 
					 | 
				
			||||||
			pfd = NULL;	// Just in case
 | 
					 | 
				
			||||||
			goto fallback;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// Set the file extension filters
 | 
					 | 
				
			||||||
		pfd->lpVtbl->SetFileTypes(pfd, (UINT)ext->count+1, filter_spec);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// Set the default directory
 | 
					 | 
				
			||||||
		wpath = utf8_to_wchar(path);
 | 
					 | 
				
			||||||
		hr = (*pfSHCreateItemFromParsingName)(wpath, NULL, &IID_IShellItem, (LPVOID) &si_path);
 | 
					 | 
				
			||||||
		if (SUCCEEDED(hr)) {
 | 
					 | 
				
			||||||
			pfd->lpVtbl->SetFolder(pfd, si_path);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		safe_free(wpath);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// Set the default filename
 | 
					 | 
				
			||||||
		wfilename = utf8_to_wchar((ext->filename == NULL)?"":ext->filename);
 | 
					 | 
				
			||||||
		if (wfilename != NULL) {
 | 
					 | 
				
			||||||
			pfd->lpVtbl->SetFileName(pfd, wfilename);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// Display the dialog
 | 
					 | 
				
			||||||
		hr = pfd->lpVtbl->Show(pfd, hMainDialog);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// Cleanup
 | 
					 | 
				
			||||||
		safe_free(wfilename);
 | 
					 | 
				
			||||||
		for (i=0; i<ext->count; i++) {
 | 
					 | 
				
			||||||
			safe_free(filter_spec[i].pszSpec);
 | 
					 | 
				
			||||||
			safe_free(filter_spec[i].pszName);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		safe_free(filter_spec[i].pszName);
 | 
					 | 
				
			||||||
		safe_free(filter_spec);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if (SUCCEEDED(hr)) {
 | 
					 | 
				
			||||||
			// Obtain the result of the user's interaction with the dialog.
 | 
					 | 
				
			||||||
			hr = pfd->lpVtbl->GetResult(pfd, &psiResult);
 | 
					 | 
				
			||||||
			if (SUCCEEDED(hr)) {
 | 
					 | 
				
			||||||
				hr = psiResult->lpVtbl->GetDisplayName(psiResult, SIGDN_FILESYSPATH, &wpath);
 | 
					 | 
				
			||||||
				if (SUCCEEDED(hr)) {
 | 
					 | 
				
			||||||
					filepath = wchar_to_utf8(wpath);
 | 
					 | 
				
			||||||
					CoTaskMemFree(wpath);
 | 
					 | 
				
			||||||
				} else {
 | 
					 | 
				
			||||||
					SetLastError(hr);
 | 
					 | 
				
			||||||
					uprintf("Unable to access file path: %s\n", WindowsErrorString());
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				psiResult->lpVtbl->Release(psiResult);
 | 
					 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		} else if ((hr & 0xFFFF) != ERROR_CANCELLED) {
 | 
								filter_spec[i].pszSpec = L"*.*";
 | 
				
			||||||
			// If it's not a user cancel, assume the dialog didn't show and fallback
 | 
								filter_spec[i].pszName = utf8_to_wchar(lmprintf(MSG_107));
 | 
				
			||||||
			SetLastError(hr);
 | 
					 | 
				
			||||||
			uprintf("Could not show FileOpenDialog: %s\n", WindowsErrorString());
 | 
					 | 
				
			||||||
			goto fallback;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		pfd->lpVtbl->Release(pfd);
 | 
					 | 
				
			||||||
		dialog_showing--;
 | 
					 | 
				
			||||||
		return filepath;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
fallback:
 | 
								hr = CoCreateInstance(save ? &CLSID_FileSaveDialog : &CLSID_FileOpenDialog, NULL, CLSCTX_INPROC,
 | 
				
			||||||
	if (pfd != NULL) {
 | 
									&IID_IFileDialog, (LPVOID)&pfd);
 | 
				
			||||||
		pfd->lpVtbl->Release(pfd);
 | 
					
 | 
				
			||||||
 | 
								if (FAILED(hr)) {
 | 
				
			||||||
 | 
									SetLastError(hr);
 | 
				
			||||||
 | 
									uprintf("CoCreateInstance for FileOpenDialog failed: %s\n", WindowsErrorString());
 | 
				
			||||||
 | 
									pfd = NULL;	// Just in case
 | 
				
			||||||
 | 
									goto fallback;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// Set the file extension filters
 | 
				
			||||||
 | 
								pfd->lpVtbl->SetFileTypes(pfd, (UINT)ext->count + 1, filter_spec);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// Set the default directory
 | 
				
			||||||
 | 
								wpath = utf8_to_wchar(path);
 | 
				
			||||||
 | 
								hr = (*pfSHCreateItemFromParsingName)(wpath, NULL, &IID_IShellItem, (LPVOID)&si_path);
 | 
				
			||||||
 | 
								if (SUCCEEDED(hr)) {
 | 
				
			||||||
 | 
									pfd->lpVtbl->SetFolder(pfd, si_path);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								safe_free(wpath);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// Set the default filename
 | 
				
			||||||
 | 
								wfilename = utf8_to_wchar((ext->filename == NULL) ? "" : ext->filename);
 | 
				
			||||||
 | 
								if (wfilename != NULL) {
 | 
				
			||||||
 | 
									pfd->lpVtbl->SetFileName(pfd, wfilename);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// Display the dialog
 | 
				
			||||||
 | 
								hr = pfd->lpVtbl->Show(pfd, hMainDialog);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// Cleanup
 | 
				
			||||||
 | 
								safe_free(wfilename);
 | 
				
			||||||
 | 
								for (i = 0; i < ext->count; i++) {
 | 
				
			||||||
 | 
									safe_free(filter_spec[i].pszSpec);
 | 
				
			||||||
 | 
									safe_free(filter_spec[i].pszName);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								safe_free(filter_spec[i].pszName);
 | 
				
			||||||
 | 
								safe_free(filter_spec);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (SUCCEEDED(hr)) {
 | 
				
			||||||
 | 
									// Obtain the result of the user's interaction with the dialog.
 | 
				
			||||||
 | 
									hr = pfd->lpVtbl->GetResult(pfd, &psiResult);
 | 
				
			||||||
 | 
									if (SUCCEEDED(hr)) {
 | 
				
			||||||
 | 
										hr = psiResult->lpVtbl->GetDisplayName(psiResult, SIGDN_FILESYSPATH, &wpath);
 | 
				
			||||||
 | 
										if (SUCCEEDED(hr)) {
 | 
				
			||||||
 | 
											filepath = wchar_to_utf8(wpath);
 | 
				
			||||||
 | 
											CoTaskMemFree(wpath);
 | 
				
			||||||
 | 
										} else {
 | 
				
			||||||
 | 
											SetLastError(hr);
 | 
				
			||||||
 | 
											uprintf("Unable to access file path: %s\n", WindowsErrorString());
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										psiResult->lpVtbl->Release(psiResult);
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								} else if ((hr & 0xFFFF) != ERROR_CANCELLED) {
 | 
				
			||||||
 | 
									// If it's not a user cancel, assume the dialog didn't show and fallback
 | 
				
			||||||
 | 
									SetLastError(hr);
 | 
				
			||||||
 | 
									uprintf("Could not show FileOpenDialog: %s\n", WindowsErrorString());
 | 
				
			||||||
 | 
									goto fallback;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								pfd->lpVtbl->Release(pfd);
 | 
				
			||||||
 | 
								dialog_showing--;
 | 
				
			||||||
 | 
								return filepath;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						fallback:
 | 
				
			||||||
 | 
							safe_free(filter_spec);
 | 
				
			||||||
 | 
							if (pfd != NULL) {
 | 
				
			||||||
 | 
								pfd->lpVtbl->Release(pfd);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	memset(&ofn, 0, sizeof(ofn));
 | 
						memset(&ofn, 0, sizeof(ofn));
 | 
				
			||||||
	ofn.lStructSize = sizeof(ofn);
 | 
						ofn.lStructSize = sizeof(ofn);
 | 
				
			||||||
| 
						 | 
					@ -1357,14 +1350,14 @@ INT_PTR CALLBACK UpdateCallback(HWND hDlg, UINT message, WPARAM wParam, LPARAM l
 | 
				
			||||||
BOOL SetUpdateCheck(void)
 | 
					BOOL SetUpdateCheck(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	BOOL enable_updates;
 | 
						BOOL enable_updates;
 | 
				
			||||||
	DWORD commcheck = GetTickCount();
 | 
						uint64_t commcheck = _GetTickCount64();
 | 
				
			||||||
	notification_info more_info = { IDD_UPDATE_POLICY, UpdateCallback };
 | 
						notification_info more_info = { IDD_UPDATE_POLICY, UpdateCallback };
 | 
				
			||||||
	char filename[MAX_PATH] = "", exename[] = APPLICATION_NAME ".exe";
 | 
						char filename[MAX_PATH] = "", exename[] = APPLICATION_NAME ".exe";
 | 
				
			||||||
	size_t fn_len, exe_len;
 | 
						size_t fn_len, exe_len;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Test if we can read and write settings. If not, forget it.
 | 
						// Test if we can read and write settings. If not, forget it.
 | 
				
			||||||
	WriteSetting32(SETTING_COMM_CHECK, commcheck);
 | 
						WriteSetting64(SETTING_COMM_CHECK, commcheck);
 | 
				
			||||||
	if (ReadSetting32(SETTING_COMM_CHECK) != commcheck)
 | 
						if (ReadSetting64(SETTING_COMM_CHECK) != commcheck)
 | 
				
			||||||
		return FALSE;
 | 
							return FALSE;
 | 
				
			||||||
	settings_commcheck = TRUE;
 | 
						settings_commcheck = TRUE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1648,6 +1641,7 @@ out:
 | 
				
			||||||
LPCDLGTEMPLATE GetDialogTemplate(int Dialog_ID)
 | 
					LPCDLGTEMPLATE GetDialogTemplate(int Dialog_ID)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int i;
 | 
						int i;
 | 
				
			||||||
 | 
						const char thai_id[] = "th-TH";
 | 
				
			||||||
	size_t len;
 | 
						size_t len;
 | 
				
			||||||
	DWORD size;
 | 
						DWORD size;
 | 
				
			||||||
	DWORD* dwBuf;
 | 
						DWORD* dwBuf;
 | 
				
			||||||
| 
						 | 
					@ -1672,7 +1666,7 @@ LPCDLGTEMPLATE GetDialogTemplate(int Dialog_ID)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// If 'Segoe UI Symbol' is available, and we are using Thai, we're done here
 | 
						// If 'Segoe UI Symbol' is available, and we are using Thai, we're done here
 | 
				
			||||||
	if (IsFontAvailable("Segoe UI Symbol") && (selected_locale != NULL)
 | 
						if (IsFontAvailable("Segoe UI Symbol") && (selected_locale != NULL)
 | 
				
			||||||
		&& (safe_strcmp(selected_locale->txt[0], "th-TH") == 0))
 | 
							&& (safe_strcmp(selected_locale->txt[0], thai_id) == 0))
 | 
				
			||||||
		return rcTemplate;
 | 
							return rcTemplate;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// 'Segoe UI Symbol' cannot be used => Fall back to the best we have
 | 
						// 'Segoe UI Symbol' cannot be used => Fall back to the best we have
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,7 +2,7 @@
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 *   Copyright 2003 Lars Munch Christensen - All Rights Reserved
 | 
					 *   Copyright 2003 Lars Munch Christensen - All Rights Reserved
 | 
				
			||||||
 *   Copyright 1998-2008 H. Peter Anvin - All Rights Reserved
 | 
					 *   Copyright 1998-2008 H. Peter Anvin - All Rights Reserved
 | 
				
			||||||
 *   Copyright 2012-2015 Pete Batard
 | 
					 *   Copyright 2012-2016 Pete Batard
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 *   Based on the Linux installer program for SYSLINUX by H. Peter Anvin
 | 
					 *   Based on the Linux installer program for SYSLINUX by H. Peter Anvin
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
| 
						 | 
					@ -27,10 +27,12 @@
 | 
				
			||||||
#include <ctype.h>
 | 
					#include <ctype.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "rufus.h"
 | 
					#include "rufus.h"
 | 
				
			||||||
#include "drive.h"
 | 
					#include "missing.h"
 | 
				
			||||||
#include "resource.h"
 | 
					#include "resource.h"
 | 
				
			||||||
#include "localization.h"
 | 
					 | 
				
			||||||
#include "msapi_utf8.h"
 | 
					#include "msapi_utf8.h"
 | 
				
			||||||
 | 
					#include "localization.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "drive.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "syslinux.h"
 | 
					#include "syslinux.h"
 | 
				
			||||||
#include "syslxfs.h"
 | 
					#include "syslxfs.h"
 | 
				
			||||||
| 
						 | 
					@ -39,9 +41,9 @@
 | 
				
			||||||
#include "ntfssect.h"
 | 
					#include "ntfssect.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
unsigned char* syslinux_ldlinux[2] = { NULL, NULL };
 | 
					unsigned char* syslinux_ldlinux[2] = { NULL, NULL };
 | 
				
			||||||
DWORD syslinux_ldlinux_len[2];
 | 
					unsigned long syslinux_ldlinux_len[2];
 | 
				
			||||||
unsigned char* syslinux_mboot = NULL;
 | 
					unsigned char* syslinux_mboot = NULL;
 | 
				
			||||||
DWORD syslinux_mboot_len;
 | 
					unsigned long syslinux_mboot_len;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Workaround for 4K support
 | 
					// Workaround for 4K support
 | 
				
			||||||
uint32_t SECTOR_SHIFT = 9;
 | 
					uint32_t SECTOR_SHIFT = 9;
 | 
				
			||||||
| 
						 | 
					@ -137,16 +139,16 @@ BOOL InstallSyslinux(DWORD drive_index, char drive_letter, int fs_type)
 | 
				
			||||||
				img_report.sl_version_ext, ldlinux, i==0?"sys":"bss");
 | 
									img_report.sl_version_ext, ldlinux, i==0?"sys":"bss");
 | 
				
			||||||
			fd = fopen(path, "rb");
 | 
								fd = fopen(path, "rb");
 | 
				
			||||||
			if (fd == NULL) {
 | 
								if (fd == NULL) {
 | 
				
			||||||
				uprintf("Could not open %s\n", path);
 | 
									uprintf("Could not open %s", path);
 | 
				
			||||||
				goto out;
 | 
									goto out;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			length = fread(syslinux_ldlinux[i], 1, (size_t)syslinux_ldlinux_len[i], fd);
 | 
								length = fread(syslinux_ldlinux[i], 1, (size_t)syslinux_ldlinux_len[i], fd);
 | 
				
			||||||
			fclose(fd);
 | 
								fclose(fd);
 | 
				
			||||||
			if (length != (size_t)syslinux_ldlinux_len[i]) {
 | 
								if (length != (size_t)syslinux_ldlinux_len[i]) {
 | 
				
			||||||
				uprintf("Could not read %s\n", path);
 | 
									uprintf("Could not read %s", path);
 | 
				
			||||||
				goto out;
 | 
									goto out;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			uprintf("Using existing './%s'\n", path);
 | 
								uprintf("Using existing './%s'", path);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		for (i=0; i<2; i++) {
 | 
							for (i=0; i<2; i++) {
 | 
				
			||||||
| 
						 | 
					@ -167,38 +169,36 @@ BOOL InstallSyslinux(DWORD drive_index, char drive_letter, int fs_type)
 | 
				
			||||||
			  FILE_ATTRIBUTE_HIDDEN, NULL);
 | 
								  FILE_ATTRIBUTE_HIDDEN, NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (f_handle == INVALID_HANDLE_VALUE) {
 | 
						if (f_handle == INVALID_HANDLE_VALUE) {
 | 
				
			||||||
		uprintf("Unable to create '%s'\n", &path[3]);
 | 
							uprintf("Unable to create '%s'", &path[3]);
 | 
				
			||||||
		goto out;
 | 
							goto out;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Write ldlinux.sys file */
 | 
						/* Write ldlinux.sys file */
 | 
				
			||||||
	if (!WriteFile(f_handle, (const char _force *)syslinux_ldlinux[0],
 | 
						if (!WriteFileWithRetry(f_handle, (const char _force *)syslinux_ldlinux[0],
 | 
				
			||||||
		   syslinux_ldlinux_len[0], &bytes_written, NULL) ||
 | 
							   syslinux_ldlinux_len[0], &bytes_written, WRITE_RETRIES)) {
 | 
				
			||||||
		bytes_written != syslinux_ldlinux_len[0]) {
 | 
							uprintf("Could not write '%s': %s", &path[3], WindowsErrorString());
 | 
				
			||||||
		uprintf("Could not write '%s'\n", &path[3]);
 | 
					 | 
				
			||||||
		goto out;
 | 
							goto out;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if (!WriteFile(f_handle, syslinux_adv, 2 * ADV_SIZE,
 | 
						if (!WriteFileWithRetry(f_handle, syslinux_adv, 2 * ADV_SIZE,
 | 
				
			||||||
		   &bytes_written, NULL) ||
 | 
							   &bytes_written, WRITE_RETRIES)) {
 | 
				
			||||||
		bytes_written != 2 * ADV_SIZE) {
 | 
							uprintf("Could not write ADV to '%s': %s", &path[3], WindowsErrorString());
 | 
				
			||||||
		uprintf("Could not write ADV to '%s'\n", &path[3]);
 | 
					 | 
				
			||||||
		goto out;
 | 
							goto out;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	uprintf("Successfully wrote '%s'\n", &path[3]);
 | 
						uprintf("Successfully wrote '%s'", &path[3]);
 | 
				
			||||||
	if (bt != BT_ISO)
 | 
						if (bt != BT_ISO)
 | 
				
			||||||
		UpdateProgress(OP_DOS, -1.0f);
 | 
							UpdateProgress(OP_DOS, -1.0f);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Now flush the media */
 | 
						/* Now flush the media */
 | 
				
			||||||
	if (!FlushFileBuffers(f_handle)) {
 | 
						if (!FlushFileBuffers(f_handle)) {
 | 
				
			||||||
		uprintf("FlushFileBuffers failed\n");
 | 
							uprintf("FlushFileBuffers failed");
 | 
				
			||||||
		goto out;
 | 
							goto out;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Reopen the volume (we already have a lock) */
 | 
						/* Reopen the volume (we already have a lock) */
 | 
				
			||||||
	d_handle = GetLogicalHandle(drive_index, TRUE, FALSE);
 | 
						d_handle = GetLogicalHandle(drive_index, TRUE, FALSE);
 | 
				
			||||||
	if (d_handle == INVALID_HANDLE_VALUE) {
 | 
						if (d_handle == INVALID_HANDLE_VALUE) {
 | 
				
			||||||
		uprintf("Could open volume for Syslinux installation\n");
 | 
							uprintf("Could open volume for Syslinux installation");
 | 
				
			||||||
		goto out;
 | 
							goto out;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -242,7 +242,7 @@ BOOL InstallSyslinux(DWORD drive_index, char drive_letter, int fs_type)
 | 
				
			||||||
	case FS_EXFAT:
 | 
						case FS_EXFAT:
 | 
				
			||||||
		fs = libfat_open(libfat_readfile, (intptr_t) d_handle);
 | 
							fs = libfat_open(libfat_readfile, (intptr_t) d_handle);
 | 
				
			||||||
		if (fs == NULL) {
 | 
							if (fs == NULL) {
 | 
				
			||||||
			uprintf("Syslinux FAT access error\n");
 | 
								uprintf("Syslinux FAT access error");
 | 
				
			||||||
			goto out;
 | 
								goto out;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		ldlinux_cluster = libfat_searchdir(fs, 0, "LDLINUX SYS", NULL);
 | 
							ldlinux_cluster = libfat_searchdir(fs, 0, "LDLINUX SYS", NULL);
 | 
				
			||||||
| 
						 | 
					@ -257,7 +257,7 @@ BOOL InstallSyslinux(DWORD drive_index, char drive_letter, int fs_type)
 | 
				
			||||||
		libfat_close(fs);
 | 
							libfat_close(fs);
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
		uprintf("Unsupported Syslinux filesystem\n");
 | 
							uprintf("Unsupported Syslinux filesystem");
 | 
				
			||||||
		goto out;
 | 
							goto out;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -269,9 +269,8 @@ BOOL InstallSyslinux(DWORD drive_index, char drive_letter, int fs_type)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Rewrite the file */
 | 
						/* Rewrite the file */
 | 
				
			||||||
	if (SetFilePointer(f_handle, 0, NULL, FILE_BEGIN) != 0 ||
 | 
						if (SetFilePointer(f_handle, 0, NULL, FILE_BEGIN) != 0 ||
 | 
				
			||||||
		!WriteFile(f_handle, syslinux_ldlinux[0], syslinux_ldlinux_len[0],
 | 
							!WriteFileWithRetry(f_handle, syslinux_ldlinux[0], syslinux_ldlinux_len[0],
 | 
				
			||||||
			   &bytes_written, NULL)
 | 
								   &bytes_written, WRITE_RETRIES)) {
 | 
				
			||||||
		|| bytes_written != syslinux_ldlinux_len[0]) {
 | 
					 | 
				
			||||||
		uprintf("Could not write '%s': %s\n", &path[3], WindowsErrorString());
 | 
							uprintf("Could not write '%s': %s\n", &path[3], WindowsErrorString());
 | 
				
			||||||
		goto out;
 | 
							goto out;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -282,9 +281,12 @@ BOOL InstallSyslinux(DWORD drive_index, char drive_letter, int fs_type)
 | 
				
			||||||
	/* Read existing FAT data into boot sector */
 | 
						/* Read existing FAT data into boot sector */
 | 
				
			||||||
	if (SetFilePointer(d_handle, 0, NULL, FILE_BEGIN) != 0 ||
 | 
						if (SetFilePointer(d_handle, 0, NULL, FILE_BEGIN) != 0 ||
 | 
				
			||||||
		!ReadFile(d_handle, sectbuf, SECTOR_SIZE,
 | 
							!ReadFile(d_handle, sectbuf, SECTOR_SIZE,
 | 
				
			||||||
			   &bytes_read, NULL)
 | 
								   &bytes_read, NULL)) {
 | 
				
			||||||
		|| bytes_read != SECTOR_SIZE) {
 | 
							uprintf("Could not read Syslinux boot record: %s", WindowsErrorString());
 | 
				
			||||||
		uprintf("Could not read boot record: %s\n", WindowsErrorString());
 | 
							goto out;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if (bytes_read < SECTOR_SIZE) {
 | 
				
			||||||
 | 
							uprintf("Partial read of Syslinux boot record: read %d bytes but requested %d", bytes_read, SECTOR_SIZE);
 | 
				
			||||||
		goto out;
 | 
							goto out;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -293,14 +295,12 @@ BOOL InstallSyslinux(DWORD drive_index, char drive_letter, int fs_type)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Write boot sector back */
 | 
						/* Write boot sector back */
 | 
				
			||||||
	if (SetFilePointer(d_handle, 0, NULL, FILE_BEGIN) != 0 ||
 | 
						if (SetFilePointer(d_handle, 0, NULL, FILE_BEGIN) != 0 ||
 | 
				
			||||||
		!WriteFile(d_handle, sectbuf, SECTOR_SIZE,
 | 
							!WriteFileWithRetry(d_handle, sectbuf, SECTOR_SIZE,
 | 
				
			||||||
			   &bytes_written, NULL)
 | 
								   &bytes_written, WRITE_RETRIES)) {
 | 
				
			||||||
		|| bytes_written != SECTOR_SIZE) {
 | 
							uprintf("Could not write Syslinux boot record: %s", WindowsErrorString());
 | 
				
			||||||
		uprintf("Could not write Syslinux boot record: %s\n", WindowsErrorString());
 | 
					 | 
				
			||||||
		goto out;
 | 
							goto out;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						uprintf("Successfully wrote Syslinux boot record");
 | 
				
			||||||
	uprintf("Successfully wrote Syslinux boot record\n");
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (bt == BT_SYSLINUX_V6) {
 | 
						if (bt == BT_SYSLINUX_V6) {
 | 
				
			||||||
		IGNORE_RETVAL(_chdirU(app_dir));
 | 
							IGNORE_RETVAL(_chdirU(app_dir));
 | 
				
			||||||
| 
						 | 
					@ -309,17 +309,17 @@ BOOL InstallSyslinux(DWORD drive_index, char drive_letter, int fs_type)
 | 
				
			||||||
		static_sprintf(path, "%C:\\%s.%s", drive_letter, ldlinux, ldlinux_ext[2]);
 | 
							static_sprintf(path, "%C:\\%s.%s", drive_letter, ldlinux, ldlinux_ext[2]);
 | 
				
			||||||
		fd = fopen(&path[3], "rb");
 | 
							fd = fopen(&path[3], "rb");
 | 
				
			||||||
		if (fd == NULL) {
 | 
							if (fd == NULL) {
 | 
				
			||||||
			uprintf("Caution: No '%s' was provided. The target will be missing a required Syslinux file!\n", &path[3]);
 | 
								uprintf("Caution: No '%s' was provided. The target will be missing a required Syslinux file!", &path[3]);
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			fclose(fd);
 | 
								fclose(fd);
 | 
				
			||||||
			if (CopyFileA(&path[3], path, TRUE)) {
 | 
								if (CopyFileA(&path[3], path, TRUE)) {
 | 
				
			||||||
				uprintf("Created '%s' (from '%s/%s-%s/%s')", path, FILES_DIR, syslinux, embedded_sl_version_str[1], &path[3]);
 | 
									uprintf("Created '%s' (from '%s/%s-%s/%s')", path, FILES_DIR, syslinux, embedded_sl_version_str[1], &path[3]);
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
				uprintf("Failed to create '%s': %s\n", path, WindowsErrorString());
 | 
									uprintf("Failed to create '%s': %s", path, WindowsErrorString());
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	} else if (IS_REACTOS(img_report)) {
 | 
						} else if (IS_REACTOS(img_report)) {
 | 
				
			||||||
		uprintf("Setting up ReactOS...\n");
 | 
							uprintf("Setting up ReactOS...");
 | 
				
			||||||
		syslinux_mboot = GetResource(hMainInstance, MAKEINTRESOURCEA(IDR_SL_MBOOT_C32),
 | 
							syslinux_mboot = GetResource(hMainInstance, MAKEINTRESOURCEA(IDR_SL_MBOOT_C32),
 | 
				
			||||||
			_RT_RCDATA, "mboot.c32", &syslinux_mboot_len, FALSE);
 | 
								_RT_RCDATA, "mboot.c32", &syslinux_mboot_len, FALSE);
 | 
				
			||||||
		if (syslinux_mboot == NULL) {
 | 
							if (syslinux_mboot == NULL) {
 | 
				
			||||||
| 
						 | 
					@ -334,21 +334,20 @@ BOOL InstallSyslinux(DWORD drive_index, char drive_letter, int fs_type)
 | 
				
			||||||
			uprintf("Unable to create '%s'\n", path);
 | 
								uprintf("Unable to create '%s'\n", path);
 | 
				
			||||||
			goto out;
 | 
								goto out;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if (!WriteFile(f_handle, syslinux_mboot, syslinux_mboot_len,
 | 
							if (!WriteFileWithRetry(f_handle, syslinux_mboot, syslinux_mboot_len,
 | 
				
			||||||
			   &bytes_written, NULL) ||
 | 
								   &bytes_written, WRITE_RETRIES)) {
 | 
				
			||||||
			bytes_written != syslinux_mboot_len) {
 | 
								uprintf("Could not write '%s'", path);
 | 
				
			||||||
			uprintf("Could not write '%s'\n", path);
 | 
					 | 
				
			||||||
			goto out;
 | 
								goto out;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		safe_closehandle(f_handle);
 | 
							safe_closehandle(f_handle);
 | 
				
			||||||
		static_sprintf(path, "%C:\\syslinux.cfg", drive_letter);
 | 
							static_sprintf(path, "%C:\\syslinux.cfg", drive_letter);
 | 
				
			||||||
		fd = fopen(path, "w");
 | 
							fd = fopen(path, "w");
 | 
				
			||||||
		if (fd == NULL) {
 | 
							if (fd == NULL) {
 | 
				
			||||||
			uprintf("Could not create ReactOS 'syslinux.cfg'\n");
 | 
								uprintf("Could not create ReactOS 'syslinux.cfg'");
 | 
				
			||||||
			goto out;
 | 
								goto out;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		/* Write the syslinux.cfg for ReactOS */
 | 
							/* Write the syslinux.cfg for ReactOS */
 | 
				
			||||||
		fprintf(fd, "DEFAULT ReactOS\nLABEL ReactOS\n  KERNEL %s\n  APPEND %s\n",
 | 
							fprintf(fd, "DEFAULT ReactOS\nLABEL ReactOS\n  KERNEL %s\n  APPEND %s",
 | 
				
			||||||
			mboot_c32, img_report.reactos_path);
 | 
								mboot_c32, img_report.reactos_path);
 | 
				
			||||||
		fclose(fd);
 | 
							fclose(fd);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -104,6 +104,7 @@
 | 
				
			||||||
      <AdditionalIncludeDirectories>..;..\..\..\msvc-missing;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
 | 
					      <AdditionalIncludeDirectories>..;..\..\..\msvc-missing;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
 | 
				
			||||||
      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
 | 
					      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
 | 
				
			||||||
      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
 | 
					      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
 | 
				
			||||||
 | 
					      <DisableSpecificWarnings>4018;4244</DisableSpecificWarnings>
 | 
				
			||||||
    </ClCompile>
 | 
					    </ClCompile>
 | 
				
			||||||
    <Link>
 | 
					    <Link>
 | 
				
			||||||
      <SubSystem>Windows</SubSystem>
 | 
					      <SubSystem>Windows</SubSystem>
 | 
				
			||||||
| 
						 | 
					@ -124,6 +125,7 @@
 | 
				
			||||||
      <AdditionalIncludeDirectories>..;..\..\..\msvc-missing;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
 | 
					      <AdditionalIncludeDirectories>..;..\..\..\msvc-missing;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
 | 
				
			||||||
      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
 | 
					      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
 | 
				
			||||||
      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
 | 
					      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
 | 
				
			||||||
 | 
					      <DisableSpecificWarnings>4018;4244</DisableSpecificWarnings>
 | 
				
			||||||
    </ClCompile>
 | 
					    </ClCompile>
 | 
				
			||||||
    <Lib>
 | 
					    <Lib>
 | 
				
			||||||
      <TargetMachine>MachineX86</TargetMachine>
 | 
					      <TargetMachine>MachineX86</TargetMachine>
 | 
				
			||||||
| 
						 | 
					@ -139,6 +141,7 @@
 | 
				
			||||||
      <AdditionalIncludeDirectories>..;..\..\..\msvc-missing;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
 | 
					      <AdditionalIncludeDirectories>..;..\..\..\msvc-missing;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
 | 
				
			||||||
      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
 | 
					      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
 | 
				
			||||||
      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
 | 
					      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
 | 
				
			||||||
 | 
					      <DisableSpecificWarnings>4018;4244</DisableSpecificWarnings>
 | 
				
			||||||
    </ClCompile>
 | 
					    </ClCompile>
 | 
				
			||||||
    <Link>
 | 
					    <Link>
 | 
				
			||||||
      <SubSystem>Windows</SubSystem>
 | 
					      <SubSystem>Windows</SubSystem>
 | 
				
			||||||
| 
						 | 
					@ -159,6 +162,7 @@
 | 
				
			||||||
      <AdditionalIncludeDirectories>..;..\..\..\msvc-missing;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
 | 
					      <AdditionalIncludeDirectories>..;..\..\..\msvc-missing;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
 | 
				
			||||||
      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
 | 
					      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
 | 
				
			||||||
      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
 | 
					      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
 | 
				
			||||||
 | 
					      <DisableSpecificWarnings>4018;4244</DisableSpecificWarnings>
 | 
				
			||||||
    </ClCompile>
 | 
					    </ClCompile>
 | 
				
			||||||
    <Link>
 | 
					    <Link>
 | 
				
			||||||
      <SubSystem>Windows</SubSystem>
 | 
					      <SubSystem>Windows</SubSystem>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,7 +5,7 @@ INCLUDES=$(DDK_INC_PATH);..\..\msvc-missing
 | 
				
			||||||
C_DEFINES=$(C_DEFINES) /Dinline=__inline /DDDKBUILD /DUNICODE /D_UNICODE /DISOLATION_AWARE_ENABLED
 | 
					C_DEFINES=$(C_DEFINES) /Dinline=__inline /DDDKBUILD /DUNICODE /D_UNICODE /DISOLATION_AWARE_ENABLED
 | 
				
			||||||
 | 
					
 | 
				
			||||||
!IFNDEF MSC_WARNING_LEVEL
 | 
					!IFNDEF MSC_WARNING_LEVEL
 | 
				
			||||||
MSC_WARNING_LEVEL=/W3
 | 
					MSC_WARNING_LEVEL=/W2
 | 
				
			||||||
!ENDIF
 | 
					!ENDIF
 | 
				
			||||||
USE_MSVCRT=1
 | 
					USE_MSVCRT=1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -66,7 +66,7 @@ libfat_sector_t libfat_nextsector(struct libfat_filesystem * fs,
 | 
				
			||||||
    if (~rs & clustmask)
 | 
					    if (~rs & clustmask)
 | 
				
			||||||
	return s + 1;		/* Next sector in cluster */
 | 
						return s + 1;		/* Next sector in cluster */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    cluster = (int32_t) (2 + (rs >> fs->clustshift));
 | 
					    cluster = 2 + (rs >> fs->clustshift);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (cluster >= fs->endcluster)
 | 
					    if (cluster >= fs->endcluster)
 | 
				
			||||||
	return -1;
 | 
						return -1;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -77,7 +77,7 @@ libfat_open(int (*readfunc) (intptr_t, void *, size_t, libfat_sector_t),
 | 
				
			||||||
	goto barf;
 | 
						goto barf;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* Figure out how many clusters */
 | 
					    /* Figure out how many clusters */
 | 
				
			||||||
    nclusters = (uint32_t) ((fs->end - fs->data) >> fs->clustshift);
 | 
					    nclusters = (fs->end - fs->data) >> fs->clustshift;
 | 
				
			||||||
    fs->endcluster = nclusters + 2;
 | 
					    fs->endcluster = nclusters + 2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (nclusters <= 0xff4) {
 | 
					    if (nclusters <= 0xff4) {
 | 
				
			||||||
| 
						 | 
					@ -92,15 +92,10 @@ libfat_open(int (*readfunc) (intptr_t, void *, size_t, libfat_sector_t),
 | 
				
			||||||
    } else
 | 
					    } else
 | 
				
			||||||
	goto barf;		/* Impossibly many clusters */
 | 
						goto barf;		/* Impossibly many clusters */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* This check doesn't hold for Large FAT32 => remove it */
 | 
						minfatsize = (minfatsize + LIBFAT_SECTOR_SIZE - 1) >> LIBFAT_SECTOR_SHIFT;
 | 
				
			||||||
#if 0
 | 
					 | 
				
			||||||
    minfatsize = (minfatsize + LIBFAT_SECTOR_SIZE - 1) >> LIBFAT_SECTOR_SHIFT;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (minfatsize > fatsize)
 | 
					    if (minfatsize > fatsize)
 | 
				
			||||||
	goto barf;		/* The FATs don't fit */
 | 
						goto barf;		/* The FATs don't fit */
 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
    (void)(minfatsize);		/* silence an unused warning in MinGW */
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (fs->fat_type == FAT28)
 | 
					    if (fs->fat_type == FAT28)
 | 
				
			||||||
	fs->rootcluster = read32(&bs->u.fat32.bpb_rootclus);
 | 
						fs->rootcluster = read32(&bs->u.fat32.bpb_rootclus);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -25,7 +25,7 @@ int32_t libfat_searchdir(struct libfat_filesystem *fs, int32_t dirclust,
 | 
				
			||||||
			 const void *name, struct libfat_direntry *direntry)
 | 
								 const void *name, struct libfat_direntry *direntry)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    struct fat_dirent *dep;
 | 
					    struct fat_dirent *dep;
 | 
				
			||||||
    unsigned int nent;
 | 
					    int nent;
 | 
				
			||||||
    libfat_sector_t s = libfat_clustertosector(fs, dirclust);
 | 
					    libfat_sector_t s = libfat_clustertosector(fs, dirclust);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    while (1) {
 | 
					    while (1) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -20,7 +20,6 @@
 | 
				
			||||||
  </ItemGroup>
 | 
					  </ItemGroup>
 | 
				
			||||||
  <ItemGroup>
 | 
					  <ItemGroup>
 | 
				
			||||||
    <ClInclude Include="..\advconst.h" />
 | 
					    <ClInclude Include="..\advconst.h" />
 | 
				
			||||||
    <ClInclude Include="..\ntfssect.h" />
 | 
					 | 
				
			||||||
    <ClInclude Include="..\syslinux.h" />
 | 
					    <ClInclude Include="..\syslinux.h" />
 | 
				
			||||||
    <ClInclude Include="..\syslxcom.h" />
 | 
					    <ClInclude Include="..\syslxcom.h" />
 | 
				
			||||||
    <ClInclude Include="..\syslxfs.h" />
 | 
					    <ClInclude Include="..\syslxfs.h" />
 | 
				
			||||||
| 
						 | 
					@ -28,7 +27,6 @@
 | 
				
			||||||
  </ItemGroup>
 | 
					  </ItemGroup>
 | 
				
			||||||
  <ItemGroup>
 | 
					  <ItemGroup>
 | 
				
			||||||
    <ClCompile Include="..\fs.c" />
 | 
					    <ClCompile Include="..\fs.c" />
 | 
				
			||||||
    <ClCompile Include="..\ntfssect.c" />
 | 
					 | 
				
			||||||
    <ClCompile Include="..\setadv.c" />
 | 
					    <ClCompile Include="..\setadv.c" />
 | 
				
			||||||
    <ClCompile Include="..\syslxmod.c" />
 | 
					    <ClCompile Include="..\syslxmod.c" />
 | 
				
			||||||
  </ItemGroup>
 | 
					  </ItemGroup>
 | 
				
			||||||
| 
						 | 
					@ -106,6 +104,7 @@
 | 
				
			||||||
      <AdditionalIncludeDirectories>..;..\..\..\msvc-missing;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
 | 
					      <AdditionalIncludeDirectories>..;..\..\..\msvc-missing;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
 | 
				
			||||||
      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
 | 
					      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
 | 
				
			||||||
      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
 | 
					      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
 | 
				
			||||||
 | 
					      <DisableSpecificWarnings>4244;4267</DisableSpecificWarnings>
 | 
				
			||||||
    </ClCompile>
 | 
					    </ClCompile>
 | 
				
			||||||
    <Link>
 | 
					    <Link>
 | 
				
			||||||
      <SubSystem>Windows</SubSystem>
 | 
					      <SubSystem>Windows</SubSystem>
 | 
				
			||||||
| 
						 | 
					@ -126,6 +125,7 @@
 | 
				
			||||||
      <AdditionalIncludeDirectories>..;..\..\..\msvc-missing;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
 | 
					      <AdditionalIncludeDirectories>..;..\..\..\msvc-missing;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
 | 
				
			||||||
      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
 | 
					      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
 | 
				
			||||||
      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
 | 
					      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
 | 
				
			||||||
 | 
					      <DisableSpecificWarnings>4244;4267</DisableSpecificWarnings>
 | 
				
			||||||
    </ClCompile>
 | 
					    </ClCompile>
 | 
				
			||||||
    <Lib>
 | 
					    <Lib>
 | 
				
			||||||
      <TargetMachine>MachineX86</TargetMachine>
 | 
					      <TargetMachine>MachineX86</TargetMachine>
 | 
				
			||||||
| 
						 | 
					@ -141,6 +141,7 @@
 | 
				
			||||||
      <AdditionalIncludeDirectories>..;..\..\..\msvc-missing;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
 | 
					      <AdditionalIncludeDirectories>..;..\..\..\msvc-missing;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
 | 
				
			||||||
      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
 | 
					      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
 | 
				
			||||||
      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
 | 
					      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
 | 
				
			||||||
 | 
					      <DisableSpecificWarnings>4244;4267</DisableSpecificWarnings>
 | 
				
			||||||
    </ClCompile>
 | 
					    </ClCompile>
 | 
				
			||||||
    <Link>
 | 
					    <Link>
 | 
				
			||||||
      <SubSystem>Windows</SubSystem>
 | 
					      <SubSystem>Windows</SubSystem>
 | 
				
			||||||
| 
						 | 
					@ -161,6 +162,7 @@
 | 
				
			||||||
      <AdditionalIncludeDirectories>..;..\..\..\msvc-missing;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
 | 
					      <AdditionalIncludeDirectories>..;..\..\..\msvc-missing;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
 | 
				
			||||||
      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
 | 
					      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
 | 
				
			||||||
      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
 | 
					      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
 | 
				
			||||||
 | 
					      <DisableSpecificWarnings>4244;4267</DisableSpecificWarnings>
 | 
				
			||||||
    </ClCompile>
 | 
					    </ClCompile>
 | 
				
			||||||
    <Link>
 | 
					    <Link>
 | 
				
			||||||
      <SubSystem>Windows</SubSystem>
 | 
					      <SubSystem>Windows</SubSystem>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -26,9 +26,6 @@
 | 
				
			||||||
    <ClInclude Include="..\syslxcom.h">
 | 
					    <ClInclude Include="..\syslxcom.h">
 | 
				
			||||||
      <Filter>Header Files</Filter>
 | 
					      <Filter>Header Files</Filter>
 | 
				
			||||||
    </ClInclude>
 | 
					    </ClInclude>
 | 
				
			||||||
    <ClInclude Include="..\ntfssect.h">
 | 
					 | 
				
			||||||
      <Filter>Header Files</Filter>
 | 
					 | 
				
			||||||
    </ClInclude>
 | 
					 | 
				
			||||||
  </ItemGroup>
 | 
					  </ItemGroup>
 | 
				
			||||||
  <ItemGroup>
 | 
					  <ItemGroup>
 | 
				
			||||||
    <ClCompile Include="..\fs.c">
 | 
					    <ClCompile Include="..\fs.c">
 | 
				
			||||||
| 
						 | 
					@ -40,8 +37,5 @@
 | 
				
			||||||
    <ClCompile Include="..\syslxmod.c">
 | 
					    <ClCompile Include="..\syslxmod.c">
 | 
				
			||||||
      <Filter>Source Files</Filter>
 | 
					      <Filter>Source Files</Filter>
 | 
				
			||||||
    </ClCompile>
 | 
					    </ClCompile>
 | 
				
			||||||
    <ClCompile Include="..\ntfssect.c">
 | 
					 | 
				
			||||||
      <Filter>Source Files</Filter>
 | 
					 | 
				
			||||||
    </ClCompile>
 | 
					 | 
				
			||||||
  </ItemGroup>
 | 
					  </ItemGroup>
 | 
				
			||||||
</Project>
 | 
					</Project>
 | 
				
			||||||
| 
						 | 
					@ -5,7 +5,7 @@ INCLUDES=$(DDK_INC_PATH);..\..\msvc-missing
 | 
				
			||||||
C_DEFINES=$(C_DEFINES) /Dinline=__inline /DDDKBUILD /DUNICODE /D_UNICODE /DISOLATION_AWARE_ENABLED
 | 
					C_DEFINES=$(C_DEFINES) /Dinline=__inline /DDDKBUILD /DUNICODE /D_UNICODE /DISOLATION_AWARE_ENABLED
 | 
				
			||||||
 | 
					
 | 
				
			||||||
!IFNDEF MSC_WARNING_LEVEL
 | 
					!IFNDEF MSC_WARNING_LEVEL
 | 
				
			||||||
MSC_WARNING_LEVEL=/W3
 | 
					MSC_WARNING_LEVEL=/W2
 | 
				
			||||||
!ENDIF
 | 
					!ENDIF
 | 
				
			||||||
USE_MSVCRT=1
 | 
					USE_MSVCRT=1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -13,6 +13,5 @@ TARGETLIBS=$(SDK_LIB_PATH)\kernel32.lib \
 | 
				
			||||||
           $(SDK_LIB_PATH)\user32.lib
 | 
					           $(SDK_LIB_PATH)\user32.lib
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SOURCES=fs.c          \
 | 
					SOURCES=fs.c          \
 | 
				
			||||||
        ntfssect.c    \
 | 
					 | 
				
			||||||
        setadv.c      \
 | 
					        setadv.c      \
 | 
				
			||||||
        syslxmod.c
 | 
					        syslxmod.c
 | 
				
			||||||
| 
						 | 
					@ -1,4 +1,4 @@
 | 
				
			||||||
noinst_LIBRARIES = libinstaller.a
 | 
					noinst_LIBRARIES = libinstaller.a
 | 
				
			||||||
 | 
					
 | 
				
			||||||
libinstaller_a_SOURCES = fs.c ntfssect.c setadv.c syslxmod.c
 | 
					libinstaller_a_SOURCES = fs.c setadv.c syslxmod.c
 | 
				
			||||||
libinstaller_a_CFLAGS = $(AM_CFLAGS)
 | 
					libinstaller_a_CFLAGS = $(AM_CFLAGS)
 | 
				
			||||||
| 
						 | 
					@ -94,7 +94,6 @@ am__v_AR_1 =
 | 
				
			||||||
libinstaller_a_AR = $(AR) $(ARFLAGS)
 | 
					libinstaller_a_AR = $(AR) $(ARFLAGS)
 | 
				
			||||||
libinstaller_a_LIBADD =
 | 
					libinstaller_a_LIBADD =
 | 
				
			||||||
am_libinstaller_a_OBJECTS = libinstaller_a-fs.$(OBJEXT) \
 | 
					am_libinstaller_a_OBJECTS = libinstaller_a-fs.$(OBJEXT) \
 | 
				
			||||||
	libinstaller_a-ntfssect.$(OBJEXT) \
 | 
					 | 
				
			||||||
	libinstaller_a-setadv.$(OBJEXT) \
 | 
						libinstaller_a-setadv.$(OBJEXT) \
 | 
				
			||||||
	libinstaller_a-syslxmod.$(OBJEXT)
 | 
						libinstaller_a-syslxmod.$(OBJEXT)
 | 
				
			||||||
libinstaller_a_OBJECTS = $(am_libinstaller_a_OBJECTS)
 | 
					libinstaller_a_OBJECTS = $(am_libinstaller_a_OBJECTS)
 | 
				
			||||||
| 
						 | 
					@ -244,7 +243,7 @@ top_build_prefix = @top_build_prefix@
 | 
				
			||||||
top_builddir = @top_builddir@
 | 
					top_builddir = @top_builddir@
 | 
				
			||||||
top_srcdir = @top_srcdir@
 | 
					top_srcdir = @top_srcdir@
 | 
				
			||||||
noinst_LIBRARIES = libinstaller.a
 | 
					noinst_LIBRARIES = libinstaller.a
 | 
				
			||||||
libinstaller_a_SOURCES = fs.c ntfssect.c setadv.c syslxmod.c
 | 
					libinstaller_a_SOURCES = fs.c setadv.c syslxmod.c
 | 
				
			||||||
libinstaller_a_CFLAGS = $(AM_CFLAGS)
 | 
					libinstaller_a_CFLAGS = $(AM_CFLAGS)
 | 
				
			||||||
all: all-am
 | 
					all: all-am
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -307,12 +306,6 @@ libinstaller_a-fs.o: fs.c
 | 
				
			||||||
libinstaller_a-fs.obj: fs.c
 | 
					libinstaller_a-fs.obj: fs.c
 | 
				
			||||||
	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libinstaller_a_CFLAGS) $(CFLAGS) -c -o libinstaller_a-fs.obj `if test -f 'fs.c'; then $(CYGPATH_W) 'fs.c'; else $(CYGPATH_W) '$(srcdir)/fs.c'; fi`
 | 
						$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libinstaller_a_CFLAGS) $(CFLAGS) -c -o libinstaller_a-fs.obj `if test -f 'fs.c'; then $(CYGPATH_W) 'fs.c'; else $(CYGPATH_W) '$(srcdir)/fs.c'; fi`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
libinstaller_a-ntfssect.o: ntfssect.c
 | 
					 | 
				
			||||||
	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libinstaller_a_CFLAGS) $(CFLAGS) -c -o libinstaller_a-ntfssect.o `test -f 'ntfssect.c' || echo '$(srcdir)/'`ntfssect.c
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
libinstaller_a-ntfssect.obj: ntfssect.c
 | 
					 | 
				
			||||||
	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libinstaller_a_CFLAGS) $(CFLAGS) -c -o libinstaller_a-ntfssect.obj `if test -f 'ntfssect.c'; then $(CYGPATH_W) 'ntfssect.c'; else $(CYGPATH_W) '$(srcdir)/ntfssect.c'; fi`
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
libinstaller_a-setadv.o: setadv.c
 | 
					libinstaller_a-setadv.o: setadv.c
 | 
				
			||||||
	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libinstaller_a_CFLAGS) $(CFLAGS) -c -o libinstaller_a-setadv.o `test -f 'setadv.c' || echo '$(srcdir)/'`setadv.c
 | 
						$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libinstaller_a_CFLAGS) $(CFLAGS) -c -o libinstaller_a-setadv.o `test -f 'setadv.c' || echo '$(srcdir)/'`setadv.c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -20,7 +20,6 @@
 | 
				
			||||||
 * Return 0 on success, -1 on error, and set errno.
 | 
					 * Return 0 on success, -1 on error, and set errno.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
//#define  _GNU_SOURCE
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <stdio.h>
 | 
					#include <stdio.h>
 | 
				
			||||||
#include <stdlib.h>
 | 
					#include <stdlib.h>
 | 
				
			||||||
| 
						 | 
					@ -110,8 +109,8 @@ int syslinux_setadv(int tag, size_t size, const void *data)
 | 
				
			||||||
	    return -1;
 | 
						    return -1;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	*p++ = (uint8_t) tag;
 | 
						*p++ = tag;
 | 
				
			||||||
	*p++ = (uint8_t) size;
 | 
						*p++ = size;
 | 
				
			||||||
	memcpy(p, data, size);
 | 
						memcpy(p, data, size);
 | 
				
			||||||
	p += size;
 | 
						p += size;
 | 
				
			||||||
	left -= size + 2;
 | 
						left -= size + 2;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -13,7 +13,6 @@
 | 
				
			||||||
#ifndef SYSLINUX_H
 | 
					#ifndef SYSLINUX_H
 | 
				
			||||||
#define SYSLINUX_H
 | 
					#define SYSLINUX_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <windows.h>
 | 
					 | 
				
			||||||
#include <inttypes.h>
 | 
					#include <inttypes.h>
 | 
				
			||||||
#include "advconst.h"
 | 
					#include "advconst.h"
 | 
				
			||||||
#include "setadv.h"
 | 
					#include "setadv.h"
 | 
				
			||||||
| 
						 | 
					@ -28,7 +27,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* The standard boot sector and ldlinux image */
 | 
					/* The standard boot sector and ldlinux image */
 | 
				
			||||||
extern unsigned char* syslinux_ldlinux[2];
 | 
					extern unsigned char* syslinux_ldlinux[2];
 | 
				
			||||||
extern DWORD syslinux_ldlinux_len[2];
 | 
					extern unsigned long syslinux_ldlinux_len[2];
 | 
				
			||||||
extern const int syslinux_ldlinux_mtime[2];
 | 
					extern const int syslinux_ldlinux_mtime[2];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define boot_sector	syslinux_ldlinux[1]
 | 
					#define boot_sector	syslinux_ldlinux[1]
 | 
				
			||||||
| 
						 | 
					@ -40,12 +39,9 @@ extern unsigned char syslinux_mbr[];
 | 
				
			||||||
extern const unsigned int syslinux_mbr_len;
 | 
					extern const unsigned int syslinux_mbr_len;
 | 
				
			||||||
extern const int syslinux_mbr_mtime;
 | 
					extern const int syslinux_mbr_mtime;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Sector size assumptions... */
 | 
					/* Sector size variables are defined externally for 4K support */
 | 
				
			||||||
// Workaround for 4K support
 | 
					 | 
				
			||||||
extern uint32_t SECTOR_SHIFT;
 | 
					extern uint32_t SECTOR_SHIFT;
 | 
				
			||||||
extern uint32_t SECTOR_SIZE;
 | 
					extern uint32_t SECTOR_SIZE;
 | 
				
			||||||
//#define SECTOR_SHIFT	9
 | 
					 | 
				
			||||||
//#define SECTOR_SIZE	(1 << SECTOR_SHIFT)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* This takes a boot sector and merges in the syslinux fields */
 | 
					/* This takes a boot sector and merges in the syslinux fields */
 | 
				
			||||||
void syslinux_make_bootsect(void *bs, int fs_type);
 | 
					void syslinux_make_bootsect(void *bs, int fs_type);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -92,8 +92,8 @@ static inline void set_16(uint16_t *p, uint16_t v)
 | 
				
			||||||
    *p = v;
 | 
					    *p = v;
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
    uint8_t *pp = (uint8_t *) p;
 | 
					    uint8_t *pp = (uint8_t *) p;
 | 
				
			||||||
    pp[0] = (v & 0xff);
 | 
					    pp[0] = v;
 | 
				
			||||||
    pp[1] = ((v >> 8) & 0xff);
 | 
					    pp[1] = v >> 8;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -60,7 +60,7 @@ static void generate_extents(struct syslinux_extent _slimg *ex, int nptrs,
 | 
				
			||||||
	    }
 | 
						    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	    set_64_sl(&ex->lba, lba);
 | 
						    set_64_sl(&ex->lba, lba);
 | 
				
			||||||
	    set_16_sl(&ex->len, (uint16_t) len);
 | 
						    set_16_sl(&ex->len, len);
 | 
				
			||||||
	    ex++;
 | 
						    ex++;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -75,7 +75,7 @@ static void generate_extents(struct syslinux_extent _slimg *ex, int nptrs,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (len) {
 | 
					    if (len) {
 | 
				
			||||||
	set_64_sl(&ex->lba, lba);
 | 
						set_64_sl(&ex->lba, lba);
 | 
				
			||||||
	set_16_sl(&ex->len, (uint16_t) len);
 | 
						set_16_sl(&ex->len, len);
 | 
				
			||||||
	ex++;
 | 
						ex++;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -122,18 +122,18 @@ int syslinux_patch(const sector_t *sectp, int nsectors,
 | 
				
			||||||
	return -1;		/* The actual file is too small for content */
 | 
						return -1;		/* The actual file is too small for content */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* Search for LDLINUX_MAGIC to find the patch area */
 | 
					    /* Search for LDLINUX_MAGIC to find the patch area */
 | 
				
			||||||
    for (wp = (const uint32_t _slimg *)boot_image;
 | 
					    dw = (boot_image_len - sizeof(struct patch_area)) >> 2;
 | 
				
			||||||
	 (get_32_sl(wp) != LDLINUX_MAGIC) && (((uintptr_t)wp) < ((uintptr_t)boot_image + boot_image_len));
 | 
					    for (i = 0, wp = (const uint32_t _slimg *)boot_image;
 | 
				
			||||||
	 wp++)
 | 
						 (i <= dw) && ((get_32_sl(wp) != LDLINUX_MAGIC));
 | 
				
			||||||
	;
 | 
						 i++, wp++)
 | 
				
			||||||
    if (((uintptr_t)wp) >= ((uintptr_t)boot_image + boot_image_len))
 | 
					    if (i > dw)	/* Not found */
 | 
				
			||||||
	return -1;
 | 
						return -1;
 | 
				
			||||||
    patcharea = (struct patch_area _slimg *)wp;
 | 
					    patcharea = (struct patch_area _slimg *)wp;
 | 
				
			||||||
    epa = slptr(boot_image, &patcharea->epaoffset);
 | 
					    epa = slptr(boot_image, &patcharea->epaoffset);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* First sector need pointer in boot sector */
 | 
					    /* First sector need pointer in boot sector */
 | 
				
			||||||
    set_32(ptr(sbs, &epa->sect1ptr0), (uint32_t) sectp[0]);
 | 
					    set_32(ptr(sbs, &epa->sect1ptr0), sectp[0]);
 | 
				
			||||||
    set_32(ptr(sbs, &epa->sect1ptr1), (uint32_t) (sectp[0] >> 32));
 | 
					    set_32(ptr(sbs, &epa->sect1ptr1), sectp[0] >> 32);
 | 
				
			||||||
    sectp++;
 | 
					    sectp++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* Handle RAID mode */
 | 
					    /* Handle RAID mode */
 | 
				
			||||||
| 
						 | 
					@ -176,7 +176,7 @@ int syslinux_patch(const sector_t *sectp, int nsectors,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* Poke in the base directory path */
 | 
					    /* Poke in the base directory path */
 | 
				
			||||||
    if (subdir) {
 | 
					    if (subdir) {
 | 
				
			||||||
	int sublen = (int) (strlen(subdir) + 1);
 | 
						int sublen = strlen(subdir) + 1;
 | 
				
			||||||
	if (get_16_sl(&epa->dirlen) < sublen) {
 | 
						if (get_16_sl(&epa->dirlen) < sublen) {
 | 
				
			||||||
	    fprintf(stderr, "Subdirectory path too long... aborting install!\n");
 | 
						    fprintf(stderr, "Subdirectory path too long... aborting install!\n");
 | 
				
			||||||
	    exit(1);
 | 
						    exit(1);
 | 
				
			||||||
| 
						 | 
					@ -186,7 +186,7 @@ int syslinux_patch(const sector_t *sectp, int nsectors,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* Poke in the subvolume information */
 | 
					    /* Poke in the subvolume information */
 | 
				
			||||||
    if (subvol) {
 | 
					    if (subvol) {
 | 
				
			||||||
	int sublen = (int) (strlen(subvol) + 1);
 | 
						int sublen = strlen(subvol) + 1;
 | 
				
			||||||
	if (get_16_sl(&epa->subvollen) < sublen) {
 | 
						if (get_16_sl(&epa->subvollen) < sublen) {
 | 
				
			||||||
	    fprintf(stderr, "Subvol name too long... aborting install!\n");
 | 
						    fprintf(stderr, "Subvol name too long... aborting install!\n");
 | 
				
			||||||
	    exit(1);
 | 
						    exit(1);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										174
									
								
								src/syslinux/win/.msvc/win.vcxproj
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										174
									
								
								src/syslinux/win/.msvc/win.vcxproj
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,174 @@
 | 
				
			||||||
 | 
					<?xml version="1.0" encoding="utf-8"?>
 | 
				
			||||||
 | 
					<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 | 
				
			||||||
 | 
					  <ItemGroup Label="ProjectConfigurations">
 | 
				
			||||||
 | 
					    <ProjectConfiguration Include="Debug|Win32">
 | 
				
			||||||
 | 
					      <Configuration>Debug</Configuration>
 | 
				
			||||||
 | 
					      <Platform>Win32</Platform>
 | 
				
			||||||
 | 
					    </ProjectConfiguration>
 | 
				
			||||||
 | 
					    <ProjectConfiguration Include="Release|Win32">
 | 
				
			||||||
 | 
					      <Configuration>Release</Configuration>
 | 
				
			||||||
 | 
					      <Platform>Win32</Platform>
 | 
				
			||||||
 | 
					    </ProjectConfiguration>
 | 
				
			||||||
 | 
					    <ProjectConfiguration Include="Debug|x64">
 | 
				
			||||||
 | 
					      <Configuration>Debug</Configuration>
 | 
				
			||||||
 | 
					      <Platform>x64</Platform>
 | 
				
			||||||
 | 
					    </ProjectConfiguration>
 | 
				
			||||||
 | 
					    <ProjectConfiguration Include="Release|x64">
 | 
				
			||||||
 | 
					      <Configuration>Release</Configuration>
 | 
				
			||||||
 | 
					      <Platform>x64</Platform>
 | 
				
			||||||
 | 
					    </ProjectConfiguration>
 | 
				
			||||||
 | 
					  </ItemGroup>
 | 
				
			||||||
 | 
					  <ItemGroup>
 | 
				
			||||||
 | 
					    <ClInclude Include="..\ntfssect.h" />
 | 
				
			||||||
 | 
					  </ItemGroup>
 | 
				
			||||||
 | 
					  <ItemGroup>
 | 
				
			||||||
 | 
					    <ClCompile Include="..\ntfssect.c" />
 | 
				
			||||||
 | 
					  </ItemGroup>
 | 
				
			||||||
 | 
					  <PropertyGroup Label="Globals">
 | 
				
			||||||
 | 
					    <ProjectGuid>{7D2E9784-DDF7-4988-A887-CF099BC3B340}</ProjectGuid>
 | 
				
			||||||
 | 
					    <Keyword>Win32Proj</Keyword>
 | 
				
			||||||
 | 
					    <RootNamespace>win</RootNamespace>
 | 
				
			||||||
 | 
					    <ProjectName>syslinux-win</ProjectName>
 | 
				
			||||||
 | 
					  </PropertyGroup>
 | 
				
			||||||
 | 
					  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
 | 
				
			||||||
 | 
					  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
 | 
				
			||||||
 | 
					    <ConfigurationType>StaticLibrary</ConfigurationType>
 | 
				
			||||||
 | 
					    <UseDebugLibraries>true</UseDebugLibraries>
 | 
				
			||||||
 | 
					    <CharacterSet>Unicode</CharacterSet>
 | 
				
			||||||
 | 
					    <PlatformToolset>v140</PlatformToolset>
 | 
				
			||||||
 | 
					  </PropertyGroup>
 | 
				
			||||||
 | 
					  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
 | 
				
			||||||
 | 
					    <ConfigurationType>StaticLibrary</ConfigurationType>
 | 
				
			||||||
 | 
					    <UseDebugLibraries>false</UseDebugLibraries>
 | 
				
			||||||
 | 
					    <WholeProgramOptimization>true</WholeProgramOptimization>
 | 
				
			||||||
 | 
					    <CharacterSet>Unicode</CharacterSet>
 | 
				
			||||||
 | 
					    <PlatformToolset>v140</PlatformToolset>
 | 
				
			||||||
 | 
					  </PropertyGroup>
 | 
				
			||||||
 | 
					  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
 | 
				
			||||||
 | 
					    <ConfigurationType>StaticLibrary</ConfigurationType>
 | 
				
			||||||
 | 
					    <UseDebugLibraries>true</UseDebugLibraries>
 | 
				
			||||||
 | 
					    <CharacterSet>Unicode</CharacterSet>
 | 
				
			||||||
 | 
					    <PlatformToolset>v140</PlatformToolset>
 | 
				
			||||||
 | 
					  </PropertyGroup>
 | 
				
			||||||
 | 
					  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
 | 
				
			||||||
 | 
					    <ConfigurationType>StaticLibrary</ConfigurationType>
 | 
				
			||||||
 | 
					    <UseDebugLibraries>false</UseDebugLibraries>
 | 
				
			||||||
 | 
					    <WholeProgramOptimization>true</WholeProgramOptimization>
 | 
				
			||||||
 | 
					    <CharacterSet>Unicode</CharacterSet>
 | 
				
			||||||
 | 
					    <PlatformToolset>v140</PlatformToolset>
 | 
				
			||||||
 | 
					  </PropertyGroup>
 | 
				
			||||||
 | 
					  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
 | 
				
			||||||
 | 
					  <ImportGroup Label="ExtensionSettings">
 | 
				
			||||||
 | 
					  </ImportGroup>
 | 
				
			||||||
 | 
					  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
 | 
				
			||||||
 | 
					    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
 | 
				
			||||||
 | 
					  </ImportGroup>
 | 
				
			||||||
 | 
					  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
 | 
				
			||||||
 | 
					    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
 | 
				
			||||||
 | 
					  </ImportGroup>
 | 
				
			||||||
 | 
					  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
 | 
				
			||||||
 | 
					    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
 | 
				
			||||||
 | 
					  </ImportGroup>
 | 
				
			||||||
 | 
					  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
 | 
				
			||||||
 | 
					    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
 | 
				
			||||||
 | 
					  </ImportGroup>
 | 
				
			||||||
 | 
					  <PropertyGroup Label="UserMacros" />
 | 
				
			||||||
 | 
					  <PropertyGroup>
 | 
				
			||||||
 | 
					    <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
 | 
				
			||||||
 | 
					    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)x86_32\$(Configuration)\</OutDir>
 | 
				
			||||||
 | 
					    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)x86_32\$(Configuration)\$(ProjectName)\</IntDir>
 | 
				
			||||||
 | 
					    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)x86_32\$(Configuration)\</OutDir>
 | 
				
			||||||
 | 
					    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)x86_32\$(Configuration)\$(ProjectName)\</IntDir>
 | 
				
			||||||
 | 
					    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)x86_64\$(Configuration)\</OutDir>
 | 
				
			||||||
 | 
					    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)x86_64\$(Configuration)\$(ProjectName)\</IntDir>
 | 
				
			||||||
 | 
					    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)x86_64\$(Configuration)\</OutDir>
 | 
				
			||||||
 | 
					    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)x86_64\$(Configuration)\$(ProjectName)\</IntDir>
 | 
				
			||||||
 | 
					    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>
 | 
				
			||||||
 | 
					    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
 | 
				
			||||||
 | 
					    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental>
 | 
				
			||||||
 | 
					    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
 | 
				
			||||||
 | 
					  </PropertyGroup>
 | 
				
			||||||
 | 
					  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
 | 
				
			||||||
 | 
					    <ClCompile>
 | 
				
			||||||
 | 
					      <PrecompiledHeader>
 | 
				
			||||||
 | 
					      </PrecompiledHeader>
 | 
				
			||||||
 | 
					      <WarningLevel>Level3</WarningLevel>
 | 
				
			||||||
 | 
					      <Optimization>Disabled</Optimization>
 | 
				
			||||||
 | 
					      <PreprocessorDefinitions>inline=__inline;_CRTDBG_MAP_ALLOC;%(PreprocessorDefinitions)</PreprocessorDefinitions>
 | 
				
			||||||
 | 
					      <AdditionalIncludeDirectories>..;..\..\..\msvc-missing;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
 | 
				
			||||||
 | 
					      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
 | 
				
			||||||
 | 
					      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
 | 
				
			||||||
 | 
					      <DisableSpecificWarnings>4244;4267;4996</DisableSpecificWarnings>
 | 
				
			||||||
 | 
					    </ClCompile>
 | 
				
			||||||
 | 
					    <Link>
 | 
				
			||||||
 | 
					      <SubSystem>Windows</SubSystem>
 | 
				
			||||||
 | 
					      <GenerateDebugInformation>true</GenerateDebugInformation>
 | 
				
			||||||
 | 
					    </Link>
 | 
				
			||||||
 | 
					    <Lib>
 | 
				
			||||||
 | 
					      <TargetMachine>MachineX86</TargetMachine>
 | 
				
			||||||
 | 
					    </Lib>
 | 
				
			||||||
 | 
					  </ItemDefinitionGroup>
 | 
				
			||||||
 | 
					  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
 | 
				
			||||||
 | 
					    <ClCompile>
 | 
				
			||||||
 | 
					      <WarningLevel>Level3</WarningLevel>
 | 
				
			||||||
 | 
					      <PrecompiledHeader>
 | 
				
			||||||
 | 
					      </PrecompiledHeader>
 | 
				
			||||||
 | 
					      <Optimization>MaxSpeed</Optimization>
 | 
				
			||||||
 | 
					      <IntrinsicFunctions>true</IntrinsicFunctions>
 | 
				
			||||||
 | 
					      <PreprocessorDefinitions>inline=__inline;%(PreprocessorDefinitions)</PreprocessorDefinitions>
 | 
				
			||||||
 | 
					      <AdditionalIncludeDirectories>..;..\..\..\msvc-missing;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
 | 
				
			||||||
 | 
					      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
 | 
				
			||||||
 | 
					      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
 | 
				
			||||||
 | 
					      <DisableSpecificWarnings>4244;4267;4996</DisableSpecificWarnings>
 | 
				
			||||||
 | 
					    </ClCompile>
 | 
				
			||||||
 | 
					    <Lib>
 | 
				
			||||||
 | 
					      <TargetMachine>MachineX86</TargetMachine>
 | 
				
			||||||
 | 
					    </Lib>
 | 
				
			||||||
 | 
					  </ItemDefinitionGroup>
 | 
				
			||||||
 | 
					  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
 | 
				
			||||||
 | 
					    <ClCompile>
 | 
				
			||||||
 | 
					      <PrecompiledHeader>
 | 
				
			||||||
 | 
					      </PrecompiledHeader>
 | 
				
			||||||
 | 
					      <WarningLevel>Level3</WarningLevel>
 | 
				
			||||||
 | 
					      <Optimization>Disabled</Optimization>
 | 
				
			||||||
 | 
					      <PreprocessorDefinitions>inline=__inline;_CRTDBG_MAP_ALLOC;%(PreprocessorDefinitions)</PreprocessorDefinitions>
 | 
				
			||||||
 | 
					      <AdditionalIncludeDirectories>..;..\..\..\msvc-missing;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
 | 
				
			||||||
 | 
					      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
 | 
				
			||||||
 | 
					      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
 | 
				
			||||||
 | 
					      <DisableSpecificWarnings>4244;4267;4996</DisableSpecificWarnings>
 | 
				
			||||||
 | 
					    </ClCompile>
 | 
				
			||||||
 | 
					    <Link>
 | 
				
			||||||
 | 
					      <SubSystem>Windows</SubSystem>
 | 
				
			||||||
 | 
					      <GenerateDebugInformation>true</GenerateDebugInformation>
 | 
				
			||||||
 | 
					    </Link>
 | 
				
			||||||
 | 
					    <Lib>
 | 
				
			||||||
 | 
					      <TargetMachine>MachineX64</TargetMachine>
 | 
				
			||||||
 | 
					    </Lib>
 | 
				
			||||||
 | 
					  </ItemDefinitionGroup>
 | 
				
			||||||
 | 
					  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
 | 
				
			||||||
 | 
					    <ClCompile>
 | 
				
			||||||
 | 
					      <WarningLevel>Level3</WarningLevel>
 | 
				
			||||||
 | 
					      <PrecompiledHeader>
 | 
				
			||||||
 | 
					      </PrecompiledHeader>
 | 
				
			||||||
 | 
					      <Optimization>MaxSpeed</Optimization>
 | 
				
			||||||
 | 
					      <IntrinsicFunctions>true</IntrinsicFunctions>
 | 
				
			||||||
 | 
					      <PreprocessorDefinitions>inline=__inline;%(PreprocessorDefinitions)</PreprocessorDefinitions>
 | 
				
			||||||
 | 
					      <AdditionalIncludeDirectories>..;..\..\..\msvc-missing;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
 | 
				
			||||||
 | 
					      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
 | 
				
			||||||
 | 
					      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
 | 
				
			||||||
 | 
					      <DisableSpecificWarnings>4244;4267;4996</DisableSpecificWarnings>
 | 
				
			||||||
 | 
					    </ClCompile>
 | 
				
			||||||
 | 
					    <Link>
 | 
				
			||||||
 | 
					      <SubSystem>Windows</SubSystem>
 | 
				
			||||||
 | 
					      <GenerateDebugInformation>true</GenerateDebugInformation>
 | 
				
			||||||
 | 
					      <EnableCOMDATFolding>true</EnableCOMDATFolding>
 | 
				
			||||||
 | 
					      <OptimizeReferences>true</OptimizeReferences>
 | 
				
			||||||
 | 
					    </Link>
 | 
				
			||||||
 | 
					    <Lib>
 | 
				
			||||||
 | 
					      <TargetMachine>MachineX64</TargetMachine>
 | 
				
			||||||
 | 
					    </Lib>
 | 
				
			||||||
 | 
					  </ItemDefinitionGroup>
 | 
				
			||||||
 | 
					  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
 | 
				
			||||||
 | 
					  <ImportGroup Label="ExtensionTargets">
 | 
				
			||||||
 | 
					  </ImportGroup>
 | 
				
			||||||
 | 
					</Project>
 | 
				
			||||||
							
								
								
									
										23
									
								
								src/syslinux/win/.msvc/win.vcxproj.filters
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								src/syslinux/win/.msvc/win.vcxproj.filters
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,23 @@
 | 
				
			||||||
 | 
					<?xml version="1.0" encoding="utf-8"?>
 | 
				
			||||||
 | 
					<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 | 
				
			||||||
 | 
					  <ItemGroup>
 | 
				
			||||||
 | 
					    <Filter Include="Source Files">
 | 
				
			||||||
 | 
					      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
 | 
				
			||||||
 | 
					      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
 | 
				
			||||||
 | 
					    </Filter>
 | 
				
			||||||
 | 
					    <Filter Include="Header Files">
 | 
				
			||||||
 | 
					      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
 | 
				
			||||||
 | 
					      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
 | 
				
			||||||
 | 
					    </Filter>
 | 
				
			||||||
 | 
					  </ItemGroup>
 | 
				
			||||||
 | 
					  <ItemGroup>
 | 
				
			||||||
 | 
					    <ClInclude Include="..\ntfssect.h">
 | 
				
			||||||
 | 
					      <Filter>Header Files</Filter>
 | 
				
			||||||
 | 
					    </ClInclude>
 | 
				
			||||||
 | 
					  </ItemGroup>
 | 
				
			||||||
 | 
					  <ItemGroup>
 | 
				
			||||||
 | 
					    <ClCompile Include="..\ntfssect.c">
 | 
				
			||||||
 | 
					      <Filter>Source Files</Filter>
 | 
				
			||||||
 | 
					    </ClCompile>
 | 
				
			||||||
 | 
					  </ItemGroup>
 | 
				
			||||||
 | 
					</Project>
 | 
				
			||||||
							
								
								
									
										15
									
								
								src/syslinux/win/.msvc/win_sources
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								src/syslinux/win/.msvc/win_sources
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,15 @@
 | 
				
			||||||
 | 
					TARGETNAME=win
 | 
				
			||||||
 | 
					TARGETTYPE=LIBRARY
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					INCLUDES=$(DDK_INC_PATH);..\..\msvc-missing
 | 
				
			||||||
 | 
					C_DEFINES=$(C_DEFINES) /Dinline=__inline /DDDKBUILD /DUNICODE /D_UNICODE /DISOLATION_AWARE_ENABLED
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					!IFNDEF MSC_WARNING_LEVEL
 | 
				
			||||||
 | 
					MSC_WARNING_LEVEL=/W2
 | 
				
			||||||
 | 
					!ENDIF
 | 
				
			||||||
 | 
					USE_MSVCRT=1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TARGETLIBS=$(SDK_LIB_PATH)\kernel32.lib \
 | 
				
			||||||
 | 
					           $(SDK_LIB_PATH)\user32.lib
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SOURCES=ntfssect.c
 | 
				
			||||||
							
								
								
									
										4
									
								
								src/syslinux/win/Makefile.am
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								src/syslinux/win/Makefile.am
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,4 @@
 | 
				
			||||||
 | 
					noinst_LIBRARIES = libwin.a
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					libwin_a_SOURCES = ntfssect.c
 | 
				
			||||||
 | 
					libwin_a_CFLAGS = $(AM_CFLAGS)
 | 
				
			||||||
							
								
								
									
										477
									
								
								src/syslinux/win/Makefile.in
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										477
									
								
								src/syslinux/win/Makefile.in
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,477 @@
 | 
				
			||||||
 | 
					# Makefile.in generated by automake 1.14.1 from Makefile.am.
 | 
				
			||||||
 | 
					# @configure_input@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Copyright (C) 1994-2013 Free Software Foundation, Inc.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# This Makefile.in is free software; the Free Software Foundation
 | 
				
			||||||
 | 
					# gives unlimited permission to copy and/or distribute it,
 | 
				
			||||||
 | 
					# with or without modifications, as long as this notice is preserved.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# This program is distributed in the hope that it will be useful,
 | 
				
			||||||
 | 
					# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
 | 
				
			||||||
 | 
					# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
 | 
				
			||||||
 | 
					# PARTICULAR PURPOSE.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@SET_MAKE@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					VPATH = @srcdir@
 | 
				
			||||||
 | 
					am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
 | 
				
			||||||
 | 
					am__make_running_with_option = \
 | 
				
			||||||
 | 
					  case $${target_option-} in \
 | 
				
			||||||
 | 
					      ?) ;; \
 | 
				
			||||||
 | 
					      *) echo "am__make_running_with_option: internal error: invalid" \
 | 
				
			||||||
 | 
					              "target option '$${target_option-}' specified" >&2; \
 | 
				
			||||||
 | 
					         exit 1;; \
 | 
				
			||||||
 | 
					  esac; \
 | 
				
			||||||
 | 
					  has_opt=no; \
 | 
				
			||||||
 | 
					  sane_makeflags=$$MAKEFLAGS; \
 | 
				
			||||||
 | 
					  if $(am__is_gnu_make); then \
 | 
				
			||||||
 | 
					    sane_makeflags=$$MFLAGS; \
 | 
				
			||||||
 | 
					  else \
 | 
				
			||||||
 | 
					    case $$MAKEFLAGS in \
 | 
				
			||||||
 | 
					      *\\[\ \	]*) \
 | 
				
			||||||
 | 
					        bs=\\; \
 | 
				
			||||||
 | 
					        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
 | 
				
			||||||
 | 
					          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
 | 
				
			||||||
 | 
					    esac; \
 | 
				
			||||||
 | 
					  fi; \
 | 
				
			||||||
 | 
					  skip_next=no; \
 | 
				
			||||||
 | 
					  strip_trailopt () \
 | 
				
			||||||
 | 
					  { \
 | 
				
			||||||
 | 
					    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
 | 
				
			||||||
 | 
					  }; \
 | 
				
			||||||
 | 
					  for flg in $$sane_makeflags; do \
 | 
				
			||||||
 | 
					    test $$skip_next = yes && { skip_next=no; continue; }; \
 | 
				
			||||||
 | 
					    case $$flg in \
 | 
				
			||||||
 | 
					      *=*|--*) continue;; \
 | 
				
			||||||
 | 
					        -*I) strip_trailopt 'I'; skip_next=yes;; \
 | 
				
			||||||
 | 
					      -*I?*) strip_trailopt 'I';; \
 | 
				
			||||||
 | 
					        -*O) strip_trailopt 'O'; skip_next=yes;; \
 | 
				
			||||||
 | 
					      -*O?*) strip_trailopt 'O';; \
 | 
				
			||||||
 | 
					        -*l) strip_trailopt 'l'; skip_next=yes;; \
 | 
				
			||||||
 | 
					      -*l?*) strip_trailopt 'l';; \
 | 
				
			||||||
 | 
					      -[dEDm]) skip_next=yes;; \
 | 
				
			||||||
 | 
					      -[JT]) skip_next=yes;; \
 | 
				
			||||||
 | 
					    esac; \
 | 
				
			||||||
 | 
					    case $$flg in \
 | 
				
			||||||
 | 
					      *$$target_option*) has_opt=yes; break;; \
 | 
				
			||||||
 | 
					    esac; \
 | 
				
			||||||
 | 
					  done; \
 | 
				
			||||||
 | 
					  test $$has_opt = yes
 | 
				
			||||||
 | 
					am__make_dryrun = (target_option=n; $(am__make_running_with_option))
 | 
				
			||||||
 | 
					am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
 | 
				
			||||||
 | 
					pkgdatadir = $(datadir)/@PACKAGE@
 | 
				
			||||||
 | 
					pkgincludedir = $(includedir)/@PACKAGE@
 | 
				
			||||||
 | 
					pkglibdir = $(libdir)/@PACKAGE@
 | 
				
			||||||
 | 
					pkglibexecdir = $(libexecdir)/@PACKAGE@
 | 
				
			||||||
 | 
					am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 | 
				
			||||||
 | 
					install_sh_DATA = $(install_sh) -c -m 644
 | 
				
			||||||
 | 
					install_sh_PROGRAM = $(install_sh) -c
 | 
				
			||||||
 | 
					install_sh_SCRIPT = $(install_sh) -c
 | 
				
			||||||
 | 
					INSTALL_HEADER = $(INSTALL_DATA)
 | 
				
			||||||
 | 
					transform = $(program_transform_name)
 | 
				
			||||||
 | 
					NORMAL_INSTALL = :
 | 
				
			||||||
 | 
					PRE_INSTALL = :
 | 
				
			||||||
 | 
					POST_INSTALL = :
 | 
				
			||||||
 | 
					NORMAL_UNINSTALL = :
 | 
				
			||||||
 | 
					PRE_UNINSTALL = :
 | 
				
			||||||
 | 
					POST_UNINSTALL = :
 | 
				
			||||||
 | 
					subdir = src/syslinux/win
 | 
				
			||||||
 | 
					DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am
 | 
				
			||||||
 | 
					ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 | 
				
			||||||
 | 
					am__aclocal_m4_deps = $(top_srcdir)/configure.ac
 | 
				
			||||||
 | 
					am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 | 
				
			||||||
 | 
						$(ACLOCAL_M4)
 | 
				
			||||||
 | 
					mkinstalldirs = $(install_sh) -d
 | 
				
			||||||
 | 
					CONFIG_CLEAN_FILES =
 | 
				
			||||||
 | 
					CONFIG_CLEAN_VPATH_FILES =
 | 
				
			||||||
 | 
					LIBRARIES = $(noinst_LIBRARIES)
 | 
				
			||||||
 | 
					ARFLAGS = cru
 | 
				
			||||||
 | 
					AM_V_AR = $(am__v_AR_@AM_V@)
 | 
				
			||||||
 | 
					am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@)
 | 
				
			||||||
 | 
					am__v_AR_0 = @echo "  AR      " $@;
 | 
				
			||||||
 | 
					am__v_AR_1 = 
 | 
				
			||||||
 | 
					libwin_a_AR = $(AR) $(ARFLAGS)
 | 
				
			||||||
 | 
					libwin_a_LIBADD =
 | 
				
			||||||
 | 
					am_libwin_a_OBJECTS = libwin_a-ntfssect.$(OBJEXT)
 | 
				
			||||||
 | 
					libwin_a_OBJECTS = $(am_libwin_a_OBJECTS)
 | 
				
			||||||
 | 
					AM_V_P = $(am__v_P_@AM_V@)
 | 
				
			||||||
 | 
					am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
 | 
				
			||||||
 | 
					am__v_P_0 = false
 | 
				
			||||||
 | 
					am__v_P_1 = :
 | 
				
			||||||
 | 
					AM_V_GEN = $(am__v_GEN_@AM_V@)
 | 
				
			||||||
 | 
					am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
 | 
				
			||||||
 | 
					am__v_GEN_0 = @echo "  GEN     " $@;
 | 
				
			||||||
 | 
					am__v_GEN_1 = 
 | 
				
			||||||
 | 
					AM_V_at = $(am__v_at_@AM_V@)
 | 
				
			||||||
 | 
					am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
 | 
				
			||||||
 | 
					am__v_at_0 = @
 | 
				
			||||||
 | 
					am__v_at_1 = 
 | 
				
			||||||
 | 
					DEFAULT_INCLUDES = -I.@am__isrc@
 | 
				
			||||||
 | 
					depcomp =
 | 
				
			||||||
 | 
					am__depfiles_maybe =
 | 
				
			||||||
 | 
					AM_V_lt = $(am__v_lt_@AM_V@)
 | 
				
			||||||
 | 
					am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
 | 
				
			||||||
 | 
					am__v_lt_0 = --silent
 | 
				
			||||||
 | 
					am__v_lt_1 = 
 | 
				
			||||||
 | 
					COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
 | 
				
			||||||
 | 
						$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
 | 
				
			||||||
 | 
					AM_V_CC = $(am__v_CC_@AM_V@)
 | 
				
			||||||
 | 
					am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
 | 
				
			||||||
 | 
					am__v_CC_0 = @echo "  CC      " $@;
 | 
				
			||||||
 | 
					am__v_CC_1 = 
 | 
				
			||||||
 | 
					CCLD = $(CC)
 | 
				
			||||||
 | 
					LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
 | 
				
			||||||
 | 
					AM_V_CCLD = $(am__v_CCLD_@AM_V@)
 | 
				
			||||||
 | 
					am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
 | 
				
			||||||
 | 
					am__v_CCLD_0 = @echo "  CCLD    " $@;
 | 
				
			||||||
 | 
					am__v_CCLD_1 = 
 | 
				
			||||||
 | 
					SOURCES = $(libwin_a_SOURCES)
 | 
				
			||||||
 | 
					am__can_run_installinfo = \
 | 
				
			||||||
 | 
					  case $$AM_UPDATE_INFO_DIR in \
 | 
				
			||||||
 | 
					    n|no|NO) false;; \
 | 
				
			||||||
 | 
					    *) (install-info --version) >/dev/null 2>&1;; \
 | 
				
			||||||
 | 
					  esac
 | 
				
			||||||
 | 
					am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
 | 
				
			||||||
 | 
					# Read a list of newline-separated strings from the standard input,
 | 
				
			||||||
 | 
					# and print each of them once, without duplicates.  Input order is
 | 
				
			||||||
 | 
					# *not* preserved.
 | 
				
			||||||
 | 
					am__uniquify_input = $(AWK) '\
 | 
				
			||||||
 | 
					  BEGIN { nonempty = 0; } \
 | 
				
			||||||
 | 
					  { items[$$0] = 1; nonempty = 1; } \
 | 
				
			||||||
 | 
					  END { if (nonempty) { for (i in items) print i; }; } \
 | 
				
			||||||
 | 
					'
 | 
				
			||||||
 | 
					# Make sure the list of sources is unique.  This is necessary because,
 | 
				
			||||||
 | 
					# e.g., the same source file might be shared among _SOURCES variables
 | 
				
			||||||
 | 
					# for different programs/libraries.
 | 
				
			||||||
 | 
					am__define_uniq_tagged_files = \
 | 
				
			||||||
 | 
					  list='$(am__tagged_files)'; \
 | 
				
			||||||
 | 
					  unique=`for i in $$list; do \
 | 
				
			||||||
 | 
					    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 | 
				
			||||||
 | 
					  done | $(am__uniquify_input)`
 | 
				
			||||||
 | 
					ETAGS = etags
 | 
				
			||||||
 | 
					CTAGS = ctags
 | 
				
			||||||
 | 
					ACLOCAL = @ACLOCAL@
 | 
				
			||||||
 | 
					AMTAR = @AMTAR@
 | 
				
			||||||
 | 
					AM_CFLAGS = @AM_CFLAGS@
 | 
				
			||||||
 | 
					AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
 | 
				
			||||||
 | 
					AM_LDFLAGS = @AM_LDFLAGS@
 | 
				
			||||||
 | 
					AR = @AR@
 | 
				
			||||||
 | 
					AUTOCONF = @AUTOCONF@
 | 
				
			||||||
 | 
					AUTOHEADER = @AUTOHEADER@
 | 
				
			||||||
 | 
					AUTOMAKE = @AUTOMAKE@
 | 
				
			||||||
 | 
					AWK = @AWK@
 | 
				
			||||||
 | 
					CC = @CC@
 | 
				
			||||||
 | 
					CFLAGS = @CFLAGS@
 | 
				
			||||||
 | 
					CPPFLAGS = @CPPFLAGS@
 | 
				
			||||||
 | 
					CYGPATH_W = @CYGPATH_W@
 | 
				
			||||||
 | 
					DEFS = @DEFS@
 | 
				
			||||||
 | 
					ECHO_C = @ECHO_C@
 | 
				
			||||||
 | 
					ECHO_N = @ECHO_N@
 | 
				
			||||||
 | 
					ECHO_T = @ECHO_T@
 | 
				
			||||||
 | 
					EXEEXT = @EXEEXT@
 | 
				
			||||||
 | 
					INSTALL = @INSTALL@
 | 
				
			||||||
 | 
					INSTALL_DATA = @INSTALL_DATA@
 | 
				
			||||||
 | 
					INSTALL_PROGRAM = @INSTALL_PROGRAM@
 | 
				
			||||||
 | 
					INSTALL_SCRIPT = @INSTALL_SCRIPT@
 | 
				
			||||||
 | 
					INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 | 
				
			||||||
 | 
					LDFLAGS = @LDFLAGS@
 | 
				
			||||||
 | 
					LIBOBJS = @LIBOBJS@
 | 
				
			||||||
 | 
					LIBS = @LIBS@
 | 
				
			||||||
 | 
					LTLIBOBJS = @LTLIBOBJS@
 | 
				
			||||||
 | 
					MAKEINFO = @MAKEINFO@
 | 
				
			||||||
 | 
					MKDIR_P = @MKDIR_P@
 | 
				
			||||||
 | 
					OBJEXT = @OBJEXT@
 | 
				
			||||||
 | 
					PACKAGE = @PACKAGE@
 | 
				
			||||||
 | 
					PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
 | 
				
			||||||
 | 
					PACKAGE_NAME = @PACKAGE_NAME@
 | 
				
			||||||
 | 
					PACKAGE_STRING = @PACKAGE_STRING@
 | 
				
			||||||
 | 
					PACKAGE_TARNAME = @PACKAGE_TARNAME@
 | 
				
			||||||
 | 
					PACKAGE_URL = @PACKAGE_URL@
 | 
				
			||||||
 | 
					PACKAGE_VERSION = @PACKAGE_VERSION@
 | 
				
			||||||
 | 
					PATH_SEPARATOR = @PATH_SEPARATOR@
 | 
				
			||||||
 | 
					RANLIB = @RANLIB@
 | 
				
			||||||
 | 
					RM = @RM@
 | 
				
			||||||
 | 
					SED = @SED@
 | 
				
			||||||
 | 
					SET_MAKE = @SET_MAKE@
 | 
				
			||||||
 | 
					SHELL = @SHELL@
 | 
				
			||||||
 | 
					STRIP = @STRIP@
 | 
				
			||||||
 | 
					SUFFIX = @SUFFIX@
 | 
				
			||||||
 | 
					VERSION = @VERSION@
 | 
				
			||||||
 | 
					VISIBILITY_CFLAGS = @VISIBILITY_CFLAGS@
 | 
				
			||||||
 | 
					WINDRES = @WINDRES@
 | 
				
			||||||
 | 
					abs_builddir = @abs_builddir@
 | 
				
			||||||
 | 
					abs_srcdir = @abs_srcdir@
 | 
				
			||||||
 | 
					abs_top_builddir = @abs_top_builddir@
 | 
				
			||||||
 | 
					abs_top_srcdir = @abs_top_srcdir@
 | 
				
			||||||
 | 
					ac_ct_CC = @ac_ct_CC@
 | 
				
			||||||
 | 
					am__leading_dot = @am__leading_dot@
 | 
				
			||||||
 | 
					am__tar = @am__tar@
 | 
				
			||||||
 | 
					am__untar = @am__untar@
 | 
				
			||||||
 | 
					bindir = @bindir@
 | 
				
			||||||
 | 
					build_alias = @build_alias@
 | 
				
			||||||
 | 
					builddir = @builddir@
 | 
				
			||||||
 | 
					datadir = @datadir@
 | 
				
			||||||
 | 
					datarootdir = @datarootdir@
 | 
				
			||||||
 | 
					docdir = @docdir@
 | 
				
			||||||
 | 
					dvidir = @dvidir@
 | 
				
			||||||
 | 
					exec_prefix = @exec_prefix@
 | 
				
			||||||
 | 
					host_alias = @host_alias@
 | 
				
			||||||
 | 
					htmldir = @htmldir@
 | 
				
			||||||
 | 
					includedir = @includedir@
 | 
				
			||||||
 | 
					infodir = @infodir@
 | 
				
			||||||
 | 
					install_sh = @install_sh@
 | 
				
			||||||
 | 
					libdir = @libdir@
 | 
				
			||||||
 | 
					libexecdir = @libexecdir@
 | 
				
			||||||
 | 
					localedir = @localedir@
 | 
				
			||||||
 | 
					localstatedir = @localstatedir@
 | 
				
			||||||
 | 
					mandir = @mandir@
 | 
				
			||||||
 | 
					mkdir_p = @mkdir_p@
 | 
				
			||||||
 | 
					oldincludedir = @oldincludedir@
 | 
				
			||||||
 | 
					pdfdir = @pdfdir@
 | 
				
			||||||
 | 
					prefix = @prefix@
 | 
				
			||||||
 | 
					program_transform_name = @program_transform_name@
 | 
				
			||||||
 | 
					psdir = @psdir@
 | 
				
			||||||
 | 
					sbindir = @sbindir@
 | 
				
			||||||
 | 
					sharedstatedir = @sharedstatedir@
 | 
				
			||||||
 | 
					srcdir = @srcdir@
 | 
				
			||||||
 | 
					sysconfdir = @sysconfdir@
 | 
				
			||||||
 | 
					target_alias = @target_alias@
 | 
				
			||||||
 | 
					top_build_prefix = @top_build_prefix@
 | 
				
			||||||
 | 
					top_builddir = @top_builddir@
 | 
				
			||||||
 | 
					top_srcdir = @top_srcdir@
 | 
				
			||||||
 | 
					noinst_LIBRARIES = libwin.a
 | 
				
			||||||
 | 
					libwin_a_SOURCES = ntfssect.c
 | 
				
			||||||
 | 
					libwin_a_CFLAGS = $(AM_CFLAGS)
 | 
				
			||||||
 | 
					all: all-am
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.SUFFIXES:
 | 
				
			||||||
 | 
					.SUFFIXES: .c .o .obj
 | 
				
			||||||
 | 
					$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
 | 
				
			||||||
 | 
						@for dep in $?; do \
 | 
				
			||||||
 | 
						  case '$(am__configure_deps)' in \
 | 
				
			||||||
 | 
						    *$$dep*) \
 | 
				
			||||||
 | 
						      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
 | 
				
			||||||
 | 
						        && { if test -f $@; then exit 0; else break; fi; }; \
 | 
				
			||||||
 | 
						      exit 1;; \
 | 
				
			||||||
 | 
						  esac; \
 | 
				
			||||||
 | 
						done; \
 | 
				
			||||||
 | 
						echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign --ignore-deps src/syslinux/win/Makefile'; \
 | 
				
			||||||
 | 
						$(am__cd) $(top_srcdir) && \
 | 
				
			||||||
 | 
						  $(AUTOMAKE) --foreign --ignore-deps src/syslinux/win/Makefile
 | 
				
			||||||
 | 
					.PRECIOUS: Makefile
 | 
				
			||||||
 | 
					Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 | 
				
			||||||
 | 
						@case '$?' in \
 | 
				
			||||||
 | 
						  *config.status*) \
 | 
				
			||||||
 | 
						    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
 | 
				
			||||||
 | 
						  *) \
 | 
				
			||||||
 | 
						    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
 | 
				
			||||||
 | 
						    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
 | 
				
			||||||
 | 
						esac;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
 | 
				
			||||||
 | 
						cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(top_srcdir)/configure:  $(am__configure_deps)
 | 
				
			||||||
 | 
						cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 | 
				
			||||||
 | 
					$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
 | 
				
			||||||
 | 
						cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 | 
				
			||||||
 | 
					$(am__aclocal_m4_deps):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					clean-noinstLIBRARIES:
 | 
				
			||||||
 | 
						-test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					libwin.a: $(libwin_a_OBJECTS) $(libwin_a_DEPENDENCIES) $(EXTRA_libwin_a_DEPENDENCIES) 
 | 
				
			||||||
 | 
						$(AM_V_at)-rm -f libwin.a
 | 
				
			||||||
 | 
						$(AM_V_AR)$(libwin_a_AR) libwin.a $(libwin_a_OBJECTS) $(libwin_a_LIBADD)
 | 
				
			||||||
 | 
						$(AM_V_at)$(RANLIB) libwin.a
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					mostlyclean-compile:
 | 
				
			||||||
 | 
						-rm -f *.$(OBJEXT)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					distclean-compile:
 | 
				
			||||||
 | 
						-rm -f *.tab.c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.c.o:
 | 
				
			||||||
 | 
						$(AM_V_CC)$(COMPILE) -c -o $@ $<
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.c.obj:
 | 
				
			||||||
 | 
						$(AM_V_CC)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					libwin_a-ntfssect.o: ntfssect.c
 | 
				
			||||||
 | 
						$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libwin_a_CFLAGS) $(CFLAGS) -c -o libwin_a-ntfssect.o `test -f 'ntfssect.c' || echo '$(srcdir)/'`ntfssect.c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					libwin_a-ntfssect.obj: ntfssect.c
 | 
				
			||||||
 | 
						$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libwin_a_CFLAGS) $(CFLAGS) -c -o libwin_a-ntfssect.obj `if test -f 'ntfssect.c'; then $(CYGPATH_W) 'ntfssect.c'; else $(CYGPATH_W) '$(srcdir)/ntfssect.c'; fi`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ID: $(am__tagged_files)
 | 
				
			||||||
 | 
						$(am__define_uniq_tagged_files); mkid -fID $$unique
 | 
				
			||||||
 | 
					tags: tags-am
 | 
				
			||||||
 | 
					TAGS: tags
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
 | 
				
			||||||
 | 
						set x; \
 | 
				
			||||||
 | 
						here=`pwd`; \
 | 
				
			||||||
 | 
						$(am__define_uniq_tagged_files); \
 | 
				
			||||||
 | 
						shift; \
 | 
				
			||||||
 | 
						if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
 | 
				
			||||||
 | 
						  test -n "$$unique" || unique=$$empty_fix; \
 | 
				
			||||||
 | 
						  if test $$# -gt 0; then \
 | 
				
			||||||
 | 
						    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
 | 
				
			||||||
 | 
						      "$$@" $$unique; \
 | 
				
			||||||
 | 
						  else \
 | 
				
			||||||
 | 
						    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
 | 
				
			||||||
 | 
						      $$unique; \
 | 
				
			||||||
 | 
						  fi; \
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
					ctags: ctags-am
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CTAGS: ctags
 | 
				
			||||||
 | 
					ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
 | 
				
			||||||
 | 
						$(am__define_uniq_tagged_files); \
 | 
				
			||||||
 | 
						test -z "$(CTAGS_ARGS)$$unique" \
 | 
				
			||||||
 | 
						  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
 | 
				
			||||||
 | 
						     $$unique
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					GTAGS:
 | 
				
			||||||
 | 
						here=`$(am__cd) $(top_builddir) && pwd` \
 | 
				
			||||||
 | 
						  && $(am__cd) $(top_srcdir) \
 | 
				
			||||||
 | 
						  && gtags -i $(GTAGS_ARGS) "$$here"
 | 
				
			||||||
 | 
					cscopelist: cscopelist-am
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					cscopelist-am: $(am__tagged_files)
 | 
				
			||||||
 | 
						list='$(am__tagged_files)'; \
 | 
				
			||||||
 | 
						case "$(srcdir)" in \
 | 
				
			||||||
 | 
						  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
 | 
				
			||||||
 | 
						  *) sdir=$(subdir)/$(srcdir) ;; \
 | 
				
			||||||
 | 
						esac; \
 | 
				
			||||||
 | 
						for i in $$list; do \
 | 
				
			||||||
 | 
						  if test -f "$$i"; then \
 | 
				
			||||||
 | 
						    echo "$(subdir)/$$i"; \
 | 
				
			||||||
 | 
						  else \
 | 
				
			||||||
 | 
						    echo "$$sdir/$$i"; \
 | 
				
			||||||
 | 
						  fi; \
 | 
				
			||||||
 | 
						done >> $(top_builddir)/cscope.files
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					distclean-tags:
 | 
				
			||||||
 | 
						-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
 | 
				
			||||||
 | 
					check-am: all-am
 | 
				
			||||||
 | 
					check: check-am
 | 
				
			||||||
 | 
					all-am: Makefile $(LIBRARIES)
 | 
				
			||||||
 | 
					installdirs:
 | 
				
			||||||
 | 
					install: install-am
 | 
				
			||||||
 | 
					install-exec: install-exec-am
 | 
				
			||||||
 | 
					install-data: install-data-am
 | 
				
			||||||
 | 
					uninstall: uninstall-am
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					install-am: all-am
 | 
				
			||||||
 | 
						@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					installcheck: installcheck-am
 | 
				
			||||||
 | 
					install-strip:
 | 
				
			||||||
 | 
						if test -z '$(STRIP)'; then \
 | 
				
			||||||
 | 
						  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
 | 
				
			||||||
 | 
						    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
 | 
				
			||||||
 | 
						      install; \
 | 
				
			||||||
 | 
						else \
 | 
				
			||||||
 | 
						  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
 | 
				
			||||||
 | 
						    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
 | 
				
			||||||
 | 
						    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
					mostlyclean-generic:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					clean-generic:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					distclean-generic:
 | 
				
			||||||
 | 
						-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
 | 
				
			||||||
 | 
						-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					maintainer-clean-generic:
 | 
				
			||||||
 | 
						@echo "This command is intended for maintainers to use"
 | 
				
			||||||
 | 
						@echo "it deletes files that may require special tools to rebuild."
 | 
				
			||||||
 | 
					clean: clean-am
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					distclean: distclean-am
 | 
				
			||||||
 | 
						-rm -f Makefile
 | 
				
			||||||
 | 
					distclean-am: clean-am distclean-compile distclean-generic \
 | 
				
			||||||
 | 
						distclean-tags
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					dvi: dvi-am
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					dvi-am:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					html: html-am
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					html-am:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					info: info-am
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					info-am:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					install-data-am:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					install-dvi: install-dvi-am
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					install-dvi-am:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					install-exec-am:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					install-html: install-html-am
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					install-html-am:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					install-info: install-info-am
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					install-info-am:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					install-man:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					install-pdf: install-pdf-am
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					install-pdf-am:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					install-ps: install-ps-am
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					install-ps-am:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					installcheck-am:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					maintainer-clean: maintainer-clean-am
 | 
				
			||||||
 | 
						-rm -f Makefile
 | 
				
			||||||
 | 
					maintainer-clean-am: distclean-am maintainer-clean-generic
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					mostlyclean: mostlyclean-am
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					mostlyclean-am: mostlyclean-compile mostlyclean-generic
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pdf: pdf-am
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pdf-am:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ps: ps-am
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ps-am:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					uninstall-am:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.MAKE: install-am install-strip
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
 | 
				
			||||||
 | 
						clean-noinstLIBRARIES cscopelist-am ctags ctags-am distclean \
 | 
				
			||||||
 | 
						distclean-compile distclean-generic distclean-tags dvi dvi-am \
 | 
				
			||||||
 | 
						html html-am info info-am install install-am install-data \
 | 
				
			||||||
 | 
						install-data-am install-dvi install-dvi-am install-exec \
 | 
				
			||||||
 | 
						install-exec-am install-html install-html-am install-info \
 | 
				
			||||||
 | 
						install-info-am install-man install-pdf install-pdf-am \
 | 
				
			||||||
 | 
						install-ps install-ps-am install-strip installcheck \
 | 
				
			||||||
 | 
						installcheck-am installdirs maintainer-clean \
 | 
				
			||||||
 | 
						maintainer-clean-generic mostlyclean mostlyclean-compile \
 | 
				
			||||||
 | 
						mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \
 | 
				
			||||||
 | 
						uninstall-am
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Tell versions [3.59,3.63) of GNU make to not export all variables.
 | 
				
			||||||
 | 
					# Otherwise a system limit (for SysV at least) may be exceeded.
 | 
				
			||||||
 | 
					.NOEXPORT:
 | 
				
			||||||
| 
						 | 
					@ -18,9 +18,6 @@
 | 
				
			||||||
 * With special thanks to Mark Roddy for his article:
 | 
					 * With special thanks to Mark Roddy for his article:
 | 
				
			||||||
 *   http://www.wd-3.com/archive/luserland.htm
 | 
					 *   http://www.wd-3.com/archive/luserland.htm
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
#if defined(_MSC_VER)
 | 
					 | 
				
			||||||
#pragma warning(disable:4996)
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <windows.h>
 | 
					#include <windows.h>
 | 
				
			||||||
#include <winioctl.h>
 | 
					#include <winioctl.h>
 | 
				
			||||||
| 
						 | 
					@ -33,6 +30,10 @@
 | 
				
			||||||
#define M_ERR(msg) (NtfsSectLastErrorMessage = (msg))
 | 
					#define M_ERR(msg) (NtfsSectLastErrorMessage = (msg))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*** Function declarations */
 | 
					/*** Function declarations */
 | 
				
			||||||
 | 
					static DWORD NtfsSectGetVolumeHandle(
 | 
				
			||||||
 | 
					    CHAR * VolumeName,
 | 
				
			||||||
 | 
					    S_NTFSSECT_VOLINFO * VolumeInfo
 | 
				
			||||||
 | 
					  );
 | 
				
			||||||
static DWORD NtfsSectGetVolumePartitionLba(S_NTFSSECT_VOLINFO * VolumeInfo);
 | 
					static DWORD NtfsSectGetVolumePartitionLba(S_NTFSSECT_VOLINFO * VolumeInfo);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*** Objects */
 | 
					/*** Objects */
 | 
				
			||||||
| 
						 | 
					@ -44,7 +45,7 @@ DWORD M_NTFSSECT_API NtfsSectGetFileVcnExtent(
 | 
				
			||||||
    LARGE_INTEGER * Vcn,
 | 
					    LARGE_INTEGER * Vcn,
 | 
				
			||||||
    S_NTFSSECT_EXTENT * Extent
 | 
					    S_NTFSSECT_EXTENT * Extent
 | 
				
			||||||
  ) {
 | 
					  ) {
 | 
				
			||||||
    BOOL bad, ok;
 | 
					    BOOL bad;
 | 
				
			||||||
    DWORD output_size, rc;
 | 
					    DWORD output_size, rc;
 | 
				
			||||||
    STARTING_VCN_INPUT_BUFFER input;
 | 
					    STARTING_VCN_INPUT_BUFFER input;
 | 
				
			||||||
    RETRIEVAL_POINTERS_BUFFER output;
 | 
					    RETRIEVAL_POINTERS_BUFFER output;
 | 
				
			||||||
| 
						 | 
					@ -59,7 +60,7 @@ DWORD M_NTFSSECT_API NtfsSectGetFileVcnExtent(
 | 
				
			||||||
      return ERROR_INVALID_PARAMETER;
 | 
					      return ERROR_INVALID_PARAMETER;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    input.StartingVcn = *Vcn;
 | 
					    input.StartingVcn = *Vcn;
 | 
				
			||||||
    ok = DeviceIoControl(
 | 
					    DeviceIoControl(
 | 
				
			||||||
        File,
 | 
					        File,
 | 
				
			||||||
        FSCTL_GET_RETRIEVAL_POINTERS,
 | 
					        FSCTL_GET_RETRIEVAL_POINTERS,
 | 
				
			||||||
        &input,
 | 
					        &input,
 | 
				
			||||||
| 
						 | 
					@ -69,7 +70,6 @@ DWORD M_NTFSSECT_API NtfsSectGetFileVcnExtent(
 | 
				
			||||||
        &output_size,
 | 
					        &output_size,
 | 
				
			||||||
        NULL
 | 
					        NULL
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
    ok = ok;
 | 
					 | 
				
			||||||
    rc = GetLastError();
 | 
					    rc = GetLastError();
 | 
				
			||||||
    switch (rc) {
 | 
					    switch (rc) {
 | 
				
			||||||
        case NO_ERROR:
 | 
					        case NO_ERROR:
 | 
				
			||||||
| 
						 | 
					@ -89,6 +89,52 @@ DWORD M_NTFSSECT_API NtfsSectGetFileVcnExtent(
 | 
				
			||||||
    return rc;
 | 
					    return rc;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Internal use only */
 | 
				
			||||||
 | 
					static DWORD NtfsSectGetVolumeHandle(
 | 
				
			||||||
 | 
					    CHAR * VolumeName,
 | 
				
			||||||
 | 
					    S_NTFSSECT_VOLINFO * VolumeInfo
 | 
				
			||||||
 | 
					  ) {
 | 
				
			||||||
 | 
					    #define M_VOL_PREFIX "\\\\.\\"
 | 
				
			||||||
 | 
					    CHAR volname[sizeof M_VOL_PREFIX - 1 + MAX_PATH + 1] = M_VOL_PREFIX;
 | 
				
			||||||
 | 
					    CHAR * const volname_short = volname + sizeof M_VOL_PREFIX - 1;
 | 
				
			||||||
 | 
					    CHAR * c;
 | 
				
			||||||
 | 
					    DWORD rc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Prefix "\\.\" onto the passed volume name */
 | 
				
			||||||
 | 
					    strcpy(volname + sizeof M_VOL_PREFIX - 1, VolumeName);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Find the last non-null character */
 | 
				
			||||||
 | 
					    for (c = volname_short; *c; ++c)
 | 
				
			||||||
 | 
					      ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Remove trailing back-slash */
 | 
				
			||||||
 | 
					    if (c[-1] == '\\')
 | 
				
			||||||
 | 
					      c[-1] = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Open the volume */
 | 
				
			||||||
 | 
					    VolumeInfo->Handle = CreateFileA(
 | 
				
			||||||
 | 
					        volname,
 | 
				
			||||||
 | 
					        GENERIC_READ,
 | 
				
			||||||
 | 
					        FILE_SHARE_READ | FILE_SHARE_WRITE,
 | 
				
			||||||
 | 
					        NULL,
 | 
				
			||||||
 | 
					        OPEN_EXISTING,
 | 
				
			||||||
 | 
					        0,
 | 
				
			||||||
 | 
					        NULL
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
 | 
					    rc = GetLastError();
 | 
				
			||||||
 | 
					    if (VolumeInfo->Handle == INVALID_HANDLE_VALUE) {
 | 
				
			||||||
 | 
					        M_ERR("Unable to open volume handle!");
 | 
				
			||||||
 | 
					        goto err_handle;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return ERROR_SUCCESS;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    CloseHandle(VolumeInfo->Handle);
 | 
				
			||||||
 | 
					    err_handle:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return rc;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
DWORD M_NTFSSECT_API NtfsSectGetVolumeInfo(
 | 
					DWORD M_NTFSSECT_API NtfsSectGetVolumeInfo(
 | 
				
			||||||
    CHAR * VolumeName,
 | 
					    CHAR * VolumeName,
 | 
				
			||||||
    S_NTFSSECT_VOLINFO * VolumeInfo
 | 
					    S_NTFSSECT_VOLINFO * VolumeInfo
 | 
				
			||||||
| 
						 | 
					@ -100,6 +146,10 @@ DWORD M_NTFSSECT_API NtfsSectGetVolumeInfo(
 | 
				
			||||||
    if (!VolumeName || !VolumeInfo)
 | 
					    if (!VolumeName || !VolumeInfo)
 | 
				
			||||||
      return ERROR_INVALID_PARAMETER;
 | 
					      return ERROR_INVALID_PARAMETER;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    rc = NtfsSectGetVolumeHandle(VolumeName, VolumeInfo);
 | 
				
			||||||
 | 
					    if (rc != ERROR_SUCCESS)
 | 
				
			||||||
 | 
					      goto err_handle;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    rc = NtfsSectLoadXpFuncs(&xp_funcs);
 | 
					    rc = NtfsSectLoadXpFuncs(&xp_funcs);
 | 
				
			||||||
    if (rc != ERROR_SUCCESS)
 | 
					    if (rc != ERROR_SUCCESS)
 | 
				
			||||||
      goto err_xp_funcs;
 | 
					      goto err_xp_funcs;
 | 
				
			||||||
| 
						 | 
					@ -135,6 +185,7 @@ DWORD M_NTFSSECT_API NtfsSectGetVolumeInfo(
 | 
				
			||||||
        CloseHandle(VolumeInfo->Handle);
 | 
					        CloseHandle(VolumeInfo->Handle);
 | 
				
			||||||
        VolumeInfo->Handle = INVALID_HANDLE_VALUE;
 | 
					        VolumeInfo->Handle = INVALID_HANDLE_VALUE;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					    err_handle:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return rc;
 | 
					    return rc;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
							
								
								
									
										76
									
								
								src/vhd.c
									
										
									
									
									
								
							
							
						
						
									
										76
									
								
								src/vhd.c
									
										
									
									
									
								
							| 
						 | 
					@ -1,7 +1,7 @@
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Rufus: The Reliable USB Formatting Utility
 | 
					 * Rufus: The Reliable USB Formatting Utility
 | 
				
			||||||
 * Virtual Disk Handling functions
 | 
					 * Virtual Disk Handling functions
 | 
				
			||||||
 * Copyright © 2013-2015 Pete Batard <pete@akeo.ie>
 | 
					 * Copyright © 2013-2016 Pete Batard <pete@akeo.ie>
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * This program is free software: you can redistribute it and/or modify
 | 
					 * This program is free software: you can redistribute it and/or modify
 | 
				
			||||||
 * it under the terms of the GNU General Public License as published by
 | 
					 * it under the terms of the GNU General Public License as published by
 | 
				
			||||||
| 
						 | 
					@ -24,22 +24,14 @@
 | 
				
			||||||
#include <time.h>
 | 
					#include <time.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "rufus.h"
 | 
					#include "rufus.h"
 | 
				
			||||||
 | 
					#include "missing.h"
 | 
				
			||||||
#include "resource.h"
 | 
					#include "resource.h"
 | 
				
			||||||
#include "msapi_utf8.h"
 | 
					#include "msapi_utf8.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "drive.h"
 | 
					#include "drive.h"
 | 
				
			||||||
#include "registry.h"
 | 
					#include "registry.h"
 | 
				
			||||||
#include "bled/bled.h"
 | 
					#include "bled/bled.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(_MSC_VER)
 | 
					 | 
				
			||||||
#define bswap_uint64 _byteswap_uint64
 | 
					 | 
				
			||||||
#define bswap_uint32 _byteswap_ulong
 | 
					 | 
				
			||||||
#define bswap_uint16 _byteswap_ushort
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
#define bswap_uint64 __builtin_bswap64
 | 
					 | 
				
			||||||
#define bswap_uint32 __builtin_bswap32
 | 
					 | 
				
			||||||
#define bswap_uint16 __builtin_bswap16
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define VHD_FOOTER_COOKIE					{ 'c', 'o', 'n', 'e', 'c', 't', 'i', 'x' }
 | 
					#define VHD_FOOTER_COOKIE					{ 'c', 'o', 'n', 'e', 'c', 't', 'i', 'x' }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define VHD_FOOTER_FEATURES_NONE			0x00000000
 | 
					#define VHD_FOOTER_FEATURES_NONE			0x00000000
 | 
				
			||||||
| 
						 | 
					@ -111,7 +103,7 @@ static char sevenzip_path[MAX_PATH];
 | 
				
			||||||
static const char conectix_str[] = VHD_FOOTER_COOKIE;
 | 
					static const char conectix_str[] = VHD_FOOTER_COOKIE;
 | 
				
			||||||
static uint32_t wim_nb_files, wim_proc_files;
 | 
					static uint32_t wim_nb_files, wim_proc_files;
 | 
				
			||||||
static BOOL count_files;
 | 
					static BOOL count_files;
 | 
				
			||||||
static DWORD LastRefresh;
 | 
					static uint64_t LastRefresh;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static BOOL Get7ZipPath(void)
 | 
					static BOOL Get7ZipPath(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -207,7 +199,7 @@ BOOL AppendVHDFooter(const char* vhd_path)
 | 
				
			||||||
		checksum += ((uint8_t*)footer)[i];
 | 
							checksum += ((uint8_t*)footer)[i];
 | 
				
			||||||
	footer->checksum = bswap_uint32(~checksum);
 | 
						footer->checksum = bswap_uint32(~checksum);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!WriteFile(handle, footer, sizeof(vhd_footer), &size, NULL) || (size != sizeof(vhd_footer))) {
 | 
						if (!WriteFileWithRetry(handle, footer, sizeof(vhd_footer), &size, WRITE_RETRIES)) {
 | 
				
			||||||
		uprintf("Could not write VHD footer: %s", WindowsErrorString());
 | 
							uprintf("Could not write VHD footer: %s", WindowsErrorString());
 | 
				
			||||||
		goto out;
 | 
							goto out;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -439,42 +431,54 @@ out:
 | 
				
			||||||
// Extract a file from a WIM image using 7-Zip
 | 
					// Extract a file from a WIM image using 7-Zip
 | 
				
			||||||
static BOOL WimExtractFile_7z(const char* image, int index, const char* src, const char* dst)
 | 
					static BOOL WimExtractFile_7z(const char* image, int index, const char* src, const char* dst)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						int n;
 | 
				
			||||||
	size_t i;
 | 
						size_t i;
 | 
				
			||||||
	STARTUPINFOA si = {0};
 | 
					 | 
				
			||||||
	PROCESS_INFORMATION pi = {0};
 | 
					 | 
				
			||||||
	char cmdline[MAX_PATH];
 | 
						char cmdline[MAX_PATH];
 | 
				
			||||||
	char tmpdst[MAX_PATH];
 | 
						char tmpdst[MAX_PATH];
 | 
				
			||||||
 | 
						char index_prefix[] = "#\\";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	uprintf("Opening: %s:[%d] (7-Zip)", image, index);
 | 
						uprintf("Opening: %s:[%d] (7-Zip)", image, index);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ((image == NULL) || (src == NULL) || (dst == NULL))
 | 
						if ((image == NULL) || (src == NULL) || (dst == NULL))
 | 
				
			||||||
		return FALSE;
 | 
							return FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	safe_strcpy(tmpdst, sizeof(tmpdst), dst);
 | 
						// If you shove more than 9 images in a WIM, don't come complaining
 | 
				
			||||||
	for (i=strlen(tmpdst)-1; i>0; i--) {
 | 
						// that this breaks!
 | 
				
			||||||
		if (tmpdst[i] == '\\')
 | 
						index_prefix[0] = '0' + index;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						uprintf("Extracting: %s (From %s)", dst, src);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 7z has a quirk where the image index MUST be specified if a
 | 
				
			||||||
 | 
						// WIM has multiple indexes, but it MUST be removed if there is
 | 
				
			||||||
 | 
						// only one image. Because of this (and because 7z will not
 | 
				
			||||||
 | 
						// return an error code if it can't extract the file), we need
 | 
				
			||||||
 | 
						// to issue 2 passes. See github issue #680.
 | 
				
			||||||
 | 
						for (n = 0; n < 2; n++) {
 | 
				
			||||||
 | 
							safe_strcpy(tmpdst, sizeof(tmpdst), dst);
 | 
				
			||||||
 | 
							for (i = strlen(tmpdst) - 1; i > 0; i--) {
 | 
				
			||||||
 | 
								if (tmpdst[i] == '\\')
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							tmpdst[i] = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							safe_sprintf(cmdline, sizeof(cmdline), "\"%s\" -y e \"%s\" %s%s", sevenzip_path,
 | 
				
			||||||
 | 
								image, (n == 0) ? index_prefix : "", src);
 | 
				
			||||||
 | 
							if (RunCommand(cmdline, tmpdst, FALSE) != 0) {
 | 
				
			||||||
 | 
								uprintf("  Could not launch 7z.exe: %s", WindowsErrorString());
 | 
				
			||||||
 | 
								return FALSE;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							safe_strcat(tmpdst, sizeof(tmpdst), "\\bootmgfw.efi");
 | 
				
			||||||
 | 
							if (_access(tmpdst, 0) == 0)
 | 
				
			||||||
 | 
								// File was extracted => move on
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	tmpdst[i] = 0;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// TODO: use RunCommand
 | 
						if (n >= 2) {
 | 
				
			||||||
	si.cb = sizeof(si);
 | 
					 | 
				
			||||||
	safe_sprintf(cmdline, sizeof(cmdline), "7z -y e \"%s\" %d\\%s", image, index, src);
 | 
					 | 
				
			||||||
	uprintf("Extracting: %s (From %s)", dst, src);
 | 
					 | 
				
			||||||
	if (!CreateProcessU(sevenzip_path, cmdline, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, tmpdst, &si, &pi)) {
 | 
					 | 
				
			||||||
		uprintf("  Could not launch 7z.exe: %s", WindowsErrorString());
 | 
					 | 
				
			||||||
		return FALSE;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	WaitForSingleObject(pi.hProcess, INFINITE);
 | 
					 | 
				
			||||||
	UpdateProgress(OP_FINALIZE, -1.0f);
 | 
					 | 
				
			||||||
	CloseHandle(pi.hProcess);
 | 
					 | 
				
			||||||
	CloseHandle(pi.hThread);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	safe_strcat(tmpdst, sizeof(tmpdst), "\\bootmgfw.efi");
 | 
					 | 
				
			||||||
	if (_access(tmpdst, 0) == -1) {
 | 
					 | 
				
			||||||
		uprintf("  7z.exe did not extract %s", tmpdst);
 | 
							uprintf("  7z.exe did not extract %s", tmpdst);
 | 
				
			||||||
		return FALSE;
 | 
							return FALSE;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// coverity[toctou]
 | 
						// coverity[toctou]
 | 
				
			||||||
	if (rename(tmpdst, dst) != 0) {
 | 
						if (rename(tmpdst, dst) != 0) {
 | 
				
			||||||
		uprintf("  Could not rename %s to %s", tmpdst, dst);
 | 
							uprintf("  Could not rename %s to %s", tmpdst, dst);
 | 
				
			||||||
| 
						 | 
					@ -569,12 +573,12 @@ DWORD WINAPI WimProgressCallback(DWORD dwMsgId, WPARAM wParam, LPARAM lParam, PV
 | 
				
			||||||
			wim_nb_files++;
 | 
								wim_nb_files++;
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			wim_proc_files++;
 | 
								wim_proc_files++;
 | 
				
			||||||
			if (GetTickCount() > LastRefresh + 100) {
 | 
								if (_GetTickCount64() > LastRefresh + 100) {
 | 
				
			||||||
				// At the end of an actual apply, the WIM API re-lists a bunch of directories it
 | 
									// At the end of an actual apply, the WIM API re-lists a bunch of directories it
 | 
				
			||||||
				// already processed, so we end up with more entries than counted - ignore those.
 | 
									// already processed, so we end up with more entries than counted - ignore those.
 | 
				
			||||||
				if (wim_proc_files > wim_nb_files)
 | 
									if (wim_proc_files > wim_nb_files)
 | 
				
			||||||
					wim_proc_files = wim_nb_files;
 | 
										wim_proc_files = wim_nb_files;
 | 
				
			||||||
				LastRefresh = GetTickCount();
 | 
									LastRefresh = _GetTickCount64();
 | 
				
			||||||
				// x^3 progress, so as not to give a better idea right from the onset
 | 
									// x^3 progress, so as not to give a better idea right from the onset
 | 
				
			||||||
				// as to the dismal speed with which the WIM API can actually apply files...
 | 
									// as to the dismal speed with which the WIM API can actually apply files...
 | 
				
			||||||
				apply_percent = 4.636942595f * ((float)wim_proc_files) / ((float)wim_nb_files);
 | 
									apply_percent = 4.636942595f * ((float)wim_proc_files) / ((float)wim_nb_files);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -70,6 +70,21 @@ copy obj%BUILD_ALT_DIR%\%ARCH_DIR%\libinstaller.lib . >NUL 2>&1
 | 
				
			||||||
if EXIST Makefile.hide ren Makefile.hide Makefile
 | 
					if EXIST Makefile.hide ren Makefile.hide Makefile
 | 
				
			||||||
if EXIST sources del sources >NUL 2>&1
 | 
					if EXIST sources del sources >NUL 2>&1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					::# SysLinux win Library
 | 
				
			||||||
 | 
					cd ..\win
 | 
				
			||||||
 | 
					if EXIST Makefile ren Makefile Makefile.hide
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					copy .msvc\win_sources sources >NUL 2>&1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@echo on
 | 
				
			||||||
 | 
					%BUILD_CMD%
 | 
				
			||||||
 | 
					@echo off
 | 
				
			||||||
 | 
					if errorlevel 1 goto builderror
 | 
				
			||||||
 | 
					copy obj%BUILD_ALT_DIR%\%ARCH_DIR%\win.lib . >NUL 2>&1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if EXIST Makefile.hide ren Makefile.hide Makefile
 | 
				
			||||||
 | 
					if EXIST sources del sources >NUL 2>&1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
::# libcdio iso9660 Library
 | 
					::# libcdio iso9660 Library
 | 
				
			||||||
cd ..\..\libcdio\iso9660
 | 
					cd ..\..\libcdio\iso9660
 | 
				
			||||||
if EXIST Makefile ren Makefile Makefile.hide
 | 
					if EXIST Makefile ren Makefile Makefile.hide
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue