diff --git a/src/.msvc/rufus_2010.vcxproj b/src/.msvc/rufus_2010.vcxproj
index 9dac45c8..7cee829a 100644
--- a/src/.msvc/rufus_2010.vcxproj
+++ b/src/.msvc/rufus_2010.vcxproj
@@ -154,7 +154,7 @@
-
+
@@ -193,7 +193,7 @@
-
+
diff --git a/src/.msvc/rufus_2010.vcxproj.filters b/src/.msvc/rufus_2010.vcxproj.filters
index f09fe5af..904b0527 100644
--- a/src/.msvc/rufus_2010.vcxproj.filters
+++ b/src/.msvc/rufus_2010.vcxproj.filters
@@ -24,7 +24,7 @@
Source Files
-
+
Source Files
@@ -71,7 +71,7 @@
Header Files
-
+
Header Files
diff --git a/src/.msvc/rufus_fd_2010.vcxproj b/src/.msvc/rufus_fd_2010.vcxproj
index 2fb6a8cc..dfd87c9f 100644
--- a/src/.msvc/rufus_fd_2010.vcxproj
+++ b/src/.msvc/rufus_fd_2010.vcxproj
@@ -160,13 +160,14 @@
+
-
+
@@ -205,7 +206,7 @@
-
+
diff --git a/src/.msvc/rufus_fd_2010.vcxproj.filters b/src/.msvc/rufus_fd_2010.vcxproj.filters
index f09fe5af..cc2ab722 100644
--- a/src/.msvc/rufus_fd_2010.vcxproj.filters
+++ b/src/.msvc/rufus_fd_2010.vcxproj.filters
@@ -24,7 +24,7 @@
Source Files
-
+
Source Files
@@ -57,6 +57,9 @@
Source Files
+
+ Source Files
+
@@ -71,7 +74,7 @@
Header Files
-
+
Header Files
diff --git a/src/.msvc/rufus_sources b/src/.msvc/rufus_sources
index e9f777b6..5d3f4460 100644
--- a/src/.msvc/rufus_sources
+++ b/src/.msvc/rufus_sources
@@ -24,17 +24,18 @@ TARGETLIBS=$(SDK_LIB_PATH)\kernel32.lib \
# http://jpassing.com/2008/02/01/how-to-use-manifests-with-buildexe/
SXS_APPLICATION_MANIFEST=common_controls_and_elevation.manifest
-SOURCES=rufus.c \
- format.c \
- stdio.c \
- stdlg.c \
- msdos.c \
- badblocks.c \
- drive.c \
- file.c \
- br.c \
- fat12.c \
- fat16.c \
- fat32.c \
+SOURCES=rufus.c \
+ format.c \
+ stdio.c \
+ stdlg.c \
+ dos.c \
+ dos_locale.c \
+ badblocks.c \
+ drive.c \
+ file.c \
+ br.c \
+ fat12.c \
+ fat16.c \
+ fat32.c \
partition_info.c \
rufus.rc
diff --git a/src/Makefile.am b/src/Makefile.am
index 2b925f95..16772617 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -13,12 +13,12 @@ rufus_rc.o: rufus.rc
rufus_fd_rc.o: rufus.rc
$(pkg_v_rc)$(WINDRES) -DWITH_FREEDOS -i $< -o $@
-rufus_SOURCES = fat12.c fat16.c fat32.c partition_info.c br.c file.c drive.c msdos.c badblocks.c format.c stdio.c stdlg.c rufus.c
-rufus_CFLAGS = -I./inc $(ARCH_CFLAGS) $(AM_CFLAGS)
+rufus_SOURCES = fat12.c fat16.c fat32.c partition_info.c br.c file.c drive.c dos.c dos_locale.c badblocks.c format.c stdio.c stdlg.c rufus.c
+rufus_CFLAGS = -I./inc $(AM_CFLAGS)
rufus_LDFLAGS = $(AM_LDFLAGS) -mwindows
rufus_LDADD = rufus_rc.o -lsetupapi -lole32 -lgdi32
-rufus_fd_SOURCES = fat12.c fat16.c fat32.c partition_info.c br.c file.c drive.c msdos.c badblocks.c format.c stdio.c stdlg.c rufus.c
-rufus_fd_CFLAGS = -I./inc $(ARCH_CFLAGS) $(AM_CFLAGS)
+rufus_fd_SOURCES = fat12.c fat16.c fat32.c partition_info.c br.c file.c drive.c dos.c dos_locale.c badblocks.c format.c stdio.c stdlg.c rufus.c
+rufus_fd_CFLAGS = -I./inc $(AM_CFLAGS)
rufus_fd_LDFLAGS = $(AM_LDFLAGS) -mwindows
rufus_fd_LDADD = rufus_fd_rc.o -lsetupapi -lole32 -lgdi32
\ No newline at end of file
diff --git a/src/Makefile.in b/src/Makefile.in
index 2a974c11..e7bfa727 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -48,9 +48,10 @@ PROGRAMS = $(noinst_PROGRAMS)
am_rufus_OBJECTS = rufus-fat12.$(OBJEXT) rufus-fat16.$(OBJEXT) \
rufus-fat32.$(OBJEXT) rufus-partition_info.$(OBJEXT) \
rufus-br.$(OBJEXT) rufus-file.$(OBJEXT) rufus-drive.$(OBJEXT) \
- rufus-msdos.$(OBJEXT) rufus-badblocks.$(OBJEXT) \
- rufus-format.$(OBJEXT) rufus-stdio.$(OBJEXT) \
- rufus-stdlg.$(OBJEXT) rufus-rufus.$(OBJEXT)
+ rufus-dos.$(OBJEXT) rufus-dos_locale.$(OBJEXT) \
+ rufus-badblocks.$(OBJEXT) rufus-format.$(OBJEXT) \
+ rufus-stdio.$(OBJEXT) rufus-stdlg.$(OBJEXT) \
+ rufus-rufus.$(OBJEXT)
rufus_OBJECTS = $(am_rufus_OBJECTS)
rufus_DEPENDENCIES = rufus_rc.o
rufus_LINK = $(CCLD) $(rufus_CFLAGS) $(CFLAGS) $(rufus_LDFLAGS) \
@@ -59,9 +60,10 @@ am_rufus_fd_OBJECTS = rufus_fd-fat12.$(OBJEXT) \
rufus_fd-fat16.$(OBJEXT) rufus_fd-fat32.$(OBJEXT) \
rufus_fd-partition_info.$(OBJEXT) rufus_fd-br.$(OBJEXT) \
rufus_fd-file.$(OBJEXT) rufus_fd-drive.$(OBJEXT) \
- rufus_fd-msdos.$(OBJEXT) rufus_fd-badblocks.$(OBJEXT) \
- rufus_fd-format.$(OBJEXT) rufus_fd-stdio.$(OBJEXT) \
- rufus_fd-stdlg.$(OBJEXT) rufus_fd-rufus.$(OBJEXT)
+ rufus_fd-dos.$(OBJEXT) rufus_fd-dos_locale.$(OBJEXT) \
+ rufus_fd-badblocks.$(OBJEXT) rufus_fd-format.$(OBJEXT) \
+ rufus_fd-stdio.$(OBJEXT) rufus_fd-stdlg.$(OBJEXT) \
+ rufus_fd-rufus.$(OBJEXT)
rufus_fd_OBJECTS = $(am_rufus_fd_OBJECTS)
rufus_fd_DEPENDENCIES = rufus_fd_rc.o
rufus_fd_LINK = $(CCLD) $(rufus_fd_CFLAGS) $(CFLAGS) \
@@ -179,12 +181,12 @@ top_srcdir = @top_srcdir@
pkg_v_rc = $(pkg_v_rc_$(V))
pkg_v_rc_ = $(pkg_v_rc_$(AM_DEFAULT_VERBOSITY))
pkg_v_rc_0 = @echo " RC $@";
-rufus_SOURCES = fat12.c fat16.c fat32.c partition_info.c br.c file.c drive.c msdos.c badblocks.c format.c stdio.c stdlg.c rufus.c
-rufus_CFLAGS = -I./inc $(ARCH_CFLAGS) $(AM_CFLAGS)
+rufus_SOURCES = fat12.c fat16.c fat32.c partition_info.c br.c file.c drive.c dos.c dos_locale.c badblocks.c format.c stdio.c stdlg.c rufus.c
+rufus_CFLAGS = -I./inc $(AM_CFLAGS)
rufus_LDFLAGS = $(AM_LDFLAGS) -mwindows
rufus_LDADD = rufus_rc.o -lsetupapi -lole32 -lgdi32
-rufus_fd_SOURCES = fat12.c fat16.c fat32.c partition_info.c br.c file.c drive.c msdos.c badblocks.c format.c stdio.c stdlg.c rufus.c
-rufus_fd_CFLAGS = -I./inc $(ARCH_CFLAGS) $(AM_CFLAGS)
+rufus_fd_SOURCES = fat12.c fat16.c fat32.c partition_info.c br.c file.c drive.c dos.c dos_locale.c badblocks.c format.c stdio.c stdlg.c rufus.c
+rufus_fd_CFLAGS = -I./inc $(AM_CFLAGS)
rufus_fd_LDFLAGS = $(AM_LDFLAGS) -mwindows
rufus_fd_LDADD = rufus_fd_rc.o -lsetupapi -lole32 -lgdi32
all: all-am
@@ -301,13 +303,21 @@ rufus-drive.obj: drive.c
$(AM_V_CC) @AM_BACKSLASH@
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rufus_CFLAGS) $(CFLAGS) -c -o rufus-drive.obj `if test -f 'drive.c'; then $(CYGPATH_W) 'drive.c'; else $(CYGPATH_W) '$(srcdir)/drive.c'; fi`
-rufus-msdos.o: msdos.c
+rufus-dos.o: dos.c
$(AM_V_CC) @AM_BACKSLASH@
- $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rufus_CFLAGS) $(CFLAGS) -c -o rufus-msdos.o `test -f 'msdos.c' || echo '$(srcdir)/'`msdos.c
+ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rufus_CFLAGS) $(CFLAGS) -c -o rufus-dos.o `test -f 'dos.c' || echo '$(srcdir)/'`dos.c
-rufus-msdos.obj: msdos.c
+rufus-dos.obj: dos.c
$(AM_V_CC) @AM_BACKSLASH@
- $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rufus_CFLAGS) $(CFLAGS) -c -o rufus-msdos.obj `if test -f 'msdos.c'; then $(CYGPATH_W) 'msdos.c'; else $(CYGPATH_W) '$(srcdir)/msdos.c'; fi`
+ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rufus_CFLAGS) $(CFLAGS) -c -o rufus-dos.obj `if test -f 'dos.c'; then $(CYGPATH_W) 'dos.c'; else $(CYGPATH_W) '$(srcdir)/dos.c'; fi`
+
+rufus-dos_locale.o: dos_locale.c
+ $(AM_V_CC) @AM_BACKSLASH@
+ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rufus_CFLAGS) $(CFLAGS) -c -o rufus-dos_locale.o `test -f 'dos_locale.c' || echo '$(srcdir)/'`dos_locale.c
+
+rufus-dos_locale.obj: dos_locale.c
+ $(AM_V_CC) @AM_BACKSLASH@
+ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rufus_CFLAGS) $(CFLAGS) -c -o rufus-dos_locale.obj `if test -f 'dos_locale.c'; then $(CYGPATH_W) 'dos_locale.c'; else $(CYGPATH_W) '$(srcdir)/dos_locale.c'; fi`
rufus-badblocks.o: badblocks.c
$(AM_V_CC) @AM_BACKSLASH@
@@ -405,13 +415,21 @@ rufus_fd-drive.obj: drive.c
$(AM_V_CC) @AM_BACKSLASH@
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rufus_fd_CFLAGS) $(CFLAGS) -c -o rufus_fd-drive.obj `if test -f 'drive.c'; then $(CYGPATH_W) 'drive.c'; else $(CYGPATH_W) '$(srcdir)/drive.c'; fi`
-rufus_fd-msdos.o: msdos.c
+rufus_fd-dos.o: dos.c
$(AM_V_CC) @AM_BACKSLASH@
- $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rufus_fd_CFLAGS) $(CFLAGS) -c -o rufus_fd-msdos.o `test -f 'msdos.c' || echo '$(srcdir)/'`msdos.c
+ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rufus_fd_CFLAGS) $(CFLAGS) -c -o rufus_fd-dos.o `test -f 'dos.c' || echo '$(srcdir)/'`dos.c
-rufus_fd-msdos.obj: msdos.c
+rufus_fd-dos.obj: dos.c
$(AM_V_CC) @AM_BACKSLASH@
- $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rufus_fd_CFLAGS) $(CFLAGS) -c -o rufus_fd-msdos.obj `if test -f 'msdos.c'; then $(CYGPATH_W) 'msdos.c'; else $(CYGPATH_W) '$(srcdir)/msdos.c'; fi`
+ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rufus_fd_CFLAGS) $(CFLAGS) -c -o rufus_fd-dos.obj `if test -f 'dos.c'; then $(CYGPATH_W) 'dos.c'; else $(CYGPATH_W) '$(srcdir)/dos.c'; fi`
+
+rufus_fd-dos_locale.o: dos_locale.c
+ $(AM_V_CC) @AM_BACKSLASH@
+ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rufus_fd_CFLAGS) $(CFLAGS) -c -o rufus_fd-dos_locale.o `test -f 'dos_locale.c' || echo '$(srcdir)/'`dos_locale.c
+
+rufus_fd-dos_locale.obj: dos_locale.c
+ $(AM_V_CC) @AM_BACKSLASH@
+ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rufus_fd_CFLAGS) $(CFLAGS) -c -o rufus_fd-dos_locale.obj `if test -f 'dos_locale.c'; then $(CYGPATH_W) 'dos_locale.c'; else $(CYGPATH_W) '$(srcdir)/dos_locale.c'; fi`
rufus_fd-badblocks.o: badblocks.c
$(AM_V_CC) @AM_BACKSLASH@
diff --git a/src/msdos.c b/src/dos.c
similarity index 93%
rename from src/msdos.c
rename to src/dos.c
index b8dabf5f..9bbd55ba 100644
--- a/src/msdos.c
+++ b/src/dos.c
@@ -1,6 +1,7 @@
/*
* Rufus: The Reliable USB Formatting Utility
- * MS-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
* Copyright (c) 2011 Pete Batard
*
* This program is free software: you can redistribute it and/or modify
@@ -28,7 +29,7 @@
#include
#include "rufus.h"
-#include "msdos.h"
+#include "dos.h"
#include "resource.h"
static BYTE* DiskImage;
@@ -292,9 +293,15 @@ static BOOL ExtractMSDOS(const char* path)
BOOL r = TRUE;
HMODULE hDLL;
HRSRC hDiskImage;
+ char locale_path[MAX_PATH];
+ char* extractlist[] = { "MSDOS SYS", "COMMAND COM", "IO SYS", "MODE COM",
+ "KEYB COM", "KEYBOARDSYS", "KEYBRD2 SYS", "KEYBRD3 SYS", "KEYBRD4 SYS",
+ "DISPLAY SYS", "EGA CPI", "EGA2 CPI", "EGA3 CPI" };
- // TODO: optionally extract some more, including "deleted" entries
- char* extractlist[] = {"MSDOS SYS", "COMMAND COM", "IO SYS"};
+ // Reduce the visible mess by placing all the locale files into a subdir
+ safe_strcpy(locale_path, sizeof(locale_path), path);
+ safe_strcat(locale_path, sizeof(locale_path), "\\LOCALE");
+ CreateDirectoryA(locale_path, NULL);
GetSystemDirectoryA(dllname, sizeof(dllname));
safe_strcat(dllname, sizeof(dllname), "\\diskcopy.dll");
@@ -328,13 +335,15 @@ static BOOL ExtractMSDOS(const char* path)
continue;
for (j=0; r && j sizeof(filename))) {
@@ -373,9 +381,7 @@ BOOL ExtractFreeDOS(const char* path)
res_size[i] = SizeofResource(NULL, res[i]);
strcpy(filename, path);
- pos = strlen(path);
- filename[pos++] = '\\';
- filename[pos] = 0;
+ safe_strcat(filename, sizeof(filename), "\\");
safe_strcat(filename, sizeof(filename), res_name[i]);
hFile = CreateFileA(filename, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE,
@@ -400,10 +406,7 @@ BOOL ExtractFreeDOS(const char* path)
// There needs to be at least an AUTOEXEC.BAT to avoid the user being prompted for date and time
strcpy(filename, path);
- pos = strlen(path);
- filename[pos++] = '\\';
- filename[pos] = 0;
- safe_strcat(filename, sizeof(filename), "AUTOEXEC.BAT");
+ safe_strcat(filename, sizeof(filename), "\\AUTOEXEC.BAT");
hFile = CreateFileA(filename, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
if (hFile == INVALID_HANDLE_VALUE) {
diff --git a/src/msdos.h b/src/dos.h
similarity index 98%
rename from src/msdos.h
rename to src/dos.h
index 8f530746..3ad75db6 100644
--- a/src/msdos.h
+++ b/src/dos.h
@@ -136,3 +136,5 @@ typedef struct _LONG_FILE_NAME_ENTRY {
FAT_DIRENT_ATTR_HIDDEN | \
FAT_DIRENT_ATTR_SYSTEM | \
FAT_DIRENT_ATTR_VOLUME_ID)
+
+extern BOOL SetMSDOSLocale(const char* path);
diff --git a/src/dos_locale.c b/src/dos_locale.c
new file mode 100644
index 00000000..de00e673
--- /dev/null
+++ b/src/dos_locale.c
@@ -0,0 +1,417 @@
+/*
+ * Rufus: The Reliable USB Formatting Utility
+ * DOS keyboard locale setup
+ * Copyright (c) 2011 Pete Batard
+ *
+ * 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 .
+ */
+
+/* Memory leaks detection - define _CRTDBG_MAP_ALLOC as preprocessor macro */
+#ifdef _CRTDBG_MAP_ALLOC
+#include
+#include
+#endif
+
+#include
+#include
+#include
+
+#include "rufus.h"
+
+enum kb_layouts {
+ KB_US = 0, KB_GR, KB_HE, KB_FR, KB_SP, KB_IT, KB_SV, KB_NL, KB_BR, KB_NO,
+ KB_DK, KB_SU, KB_RU, KB_CZ, KB_PL, KB_HU, KB_PO, KB_TR, KB_GK, KB_BL,
+ KB_BG, KB_YU, KB_BE, KB_CF, KB_UK, KB_ET, KB_SF, KB_SG, KB_IS, KB_IME,
+ KB_RO, KB_YC, KB_LA, KB_UR, KB_SL, KB_MAX };
+
+static const char* dos_kb_str[KB_MAX] = {
+ "us", "gr", "he", "fr", "sp", "it", "sv", "nl", "br", "no",
+ "dk", "su", "ru", "cz", "pl", "hu", "po", "tr", "gk", "bl",
+ "bg", "yu", "be", "cf", "uk", "et", "sf", "sg", "is", "ime",
+ "ro", "yc", "la", "ur", "sl" };
+
+static const char* dos_kb_human_readable_str[KB_MAX] = {
+ "US", "German", "Hebrew", "French", "Spanish", "Italian", "Swedish", "Dutch", "Portuguese (Brazilian)", "Norwegian", "Danish",
+ "Finnish", "Russian", "Czech", "Polish", "Hungarian", "Portuguese (Portugal)", "Turkish", "Greek", "Russian (Belarus)", "Bulgarian",
+ "Serbian/Croatian/Slovenian", "French (Belgium)", "French (Canada)", "English (UK)", "Estonian", "French (Switzerland)", "German (Switzerland)",
+ "Icelandic", "CJK Input Method Editor", "Romanian", "Serbian Cyrillic", "Spanish (Latin America)", "Ukrainian", "Slovakian" };
+
+static const char* dos_kb_drv_str[] = {
+ "keyboard.sys", "keybrd2.sys", "keybrd3.sys", "keybrd4.sys" };
+
+static const char* dos_con_str[] = {
+ "ega,,1", "ega,,2", "ega,,3", "ega,,4", "ega,,h" };
+
+static const char* dos_cpi_str[] = {
+ "ega.cpi", "ega2.cpi", "ega3.cpi", "ega4.cpi", "hebega.cpi" };
+
+static const int kb_to_drv[KB_MAX] = {
+ -1, 0, 3, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 2, 1, 3, 1, 0, 1, 3, 2,
+ 1, 1, 0, 1, 0, 3, 0, 0, 1, 0,
+ 1, 1, 0, 2, 1 };
+
+/*
+ * These locale to keyboard conversions are lifted from Microsoft's diskcopy.dll
+ * and are unmodified (apart from Simplified Chinese, that was moved to IME, and
+ * Tibet, which was moved out of China)
+ * If you feel they should be altered, please provide your locale ID in hex as well
+ * as the DOS keyboard layout ID you would like to use
+ * For the main IDs ref see http://msdn.microsoft.com/en-us/library/cc233965.aspx or
+ * http://msdn.microsoft.com/en-us/goglobal/bb896001.aspx
+ * Also see http://en.wikipedia.org/wiki/Keyboard_layout for keyboard layouts
+ */
+static unsigned int syslocale_to_kbid(WORD locale)
+{
+ int pass = 0;
+ WORD mask = 0xffff;
+
+ do {
+ switch (locale & mask) {
+ case 0x0000: // ???
+ case 0x0001: // ar Arabic
+ // case 0x0004: // zh-Hans Chinese (Simplified)
+ // moved to KB_IME
+ case 0x0009: // en English
+ case 0x001C: // sq Albanian
+ case 0x001E: // th Thai
+ case 0x0020: // ur Urdu
+ case 0x0021: // id Indonesian
+ case 0x0026: // lv Latvian
+ case 0x0027: // lt Lithuanian
+ case 0x0029: // fa Persian
+ case 0x002A: // vi Vietnamese
+ case 0x002B: // hy Armenian
+ case 0x002C: // az Azeri
+ case 0x002F: // mk Macedonian
+ case 0x0036: // af Afrikaans
+ case 0x0037: // ka Georgian
+ case 0x0039: // hi Hindi
+ case 0x003E: // ms Malay
+ case 0x003F: // kk Kazakh
+ case 0x0041: // sw Kiswahili
+ case 0x0043: // uz Uzbek
+ case 0x0044: // tt Tatar
+ case 0x0045: // bn Bengali
+ case 0x0046: // pa Punjabi
+ case 0x0047: // gu Gujarati
+ case 0x0048: // or Oriya
+ case 0x0049: // ta Tamil
+ case 0x004A: // te Telugu
+ case 0x004B: // kn Kannada
+ case 0x004C: // ml Malayalam
+ case 0x004D: // as Assamese
+ case 0x004E: // mr Marathi
+ case 0x004F: // sa Sanskrit
+ case 0x0051: // bo Tibetan
+ case 0x0057: // kok Konkani
+ case 0x0058: // ???
+ case 0x0059: // ???
+ case 0x0060: // ???
+ case 0x0061: // ne Nepali
+ case 0x0417: // rm-CH Romansh (Switzerland)
+ case 0x0428: // tg-Cyrl-TJ Tajik (Cyrillic, Tajikistan)
+ case 0x042E: // hsb-DE Upper Sorbian (Germany)
+ case 0x0430: // st-ZA Sutu (South Africa)
+ case 0x0431: // ts-ZA Tsonga (South Africa)
+ case 0x0432: // tn-ZA Setswana (South Africa)
+ case 0x0433: // ven-ZA Venda (South Africa)
+ case 0x0434: // xh-ZA isiXhosa (South Africa)
+ case 0x0435: // zu-ZA isiZulu (South Africa)
+ case 0x043A: // mt-MT Maltese (Malta)
+ case 0x043B: // se-NO Sami, Northern (Norway)
+ case 0x043D: // ???
+ case 0x043E: // ms-MY Malay (Malaysia)
+ case 0x0440: // ky-KG Kyrgyz (Kyrgyzstan)
+ case 0x0442: // tk-TM Turkmen (Turkmenistan)
+ case 0x0450: // mn-MN Mongolian (Cyrillic, Mongolia)
+ case 0x0452: // cy-GB Welsh (United Kingdom)
+ case 0x0453: // km-KH Khmer (Cambodia)
+ case 0x0454: // lo-LA Lao (Laos)
+ case 0x0455: // my-MM Myanmar (Burmese)
+ case 0x045A: // syr-SY Syriac (Syria)
+ case 0x045B: // si-LK Sinhala (Sri Lanka)
+ case 0x045C: // chr-US Cherokee (United States)
+ case 0x045E: // am-ET Amharic (Ethiopia)
+ case 0x0462: // fy-NL Frisian (Netherlands)
+ case 0x0463: // ps-AF Pashto (Afghanistan)
+ case 0x0464: // fil-PH Filipino (Philippines)
+ case 0x0850: // mn-Mong-CN Mongolian (Traditional Mongolian, China)
+ case 0x101A: // hr-BA Croatian (Latin, Bosnia and Herzegovina)
+ case 0x4409: // en-MY English (Malaysia)
+ return KB_US; // English (US)
+
+ case 0x0007: // de German
+ return KB_GR; // German
+
+ case 0x000D: // he Hebre
+ return KB_HE; // Hebrew
+
+ case 0x000C: // fr French
+ return KB_FR; // French
+
+ case 0x0003: // ca Catalan
+ case 0x000A: // es Spanish
+ case 0x002D: // eu Basque
+ case 0x0456: // gl-ES Galician (Galicia)
+ case 0x0C0A: // es-ES Spanish (Spain)
+ return KB_SP; // Spanish
+
+ case 0x0010: // it Italian
+ return KB_IT; // Italian
+
+ case 0x001D: // sv Swedish
+ return KB_SV; // Swedish
+
+ case 0x0013: // nl Dutch
+ return KB_NL; // Dutch
+
+ case 0x0416: // pt-BR Portuguese (Brazil)
+ return KB_BR; // Portuguese (Brazil)
+
+ case 0x0014: // no Norwegian
+ return KB_NO; // Norwegian
+
+ case 0x0006: // da Danish
+ case 0x0038: // fo Faroese
+ return KB_DK; // Danish
+
+ case 0x000B: // fi Finnish
+ return KB_SU; // Finnish
+
+ case 0x0019: // ru Russian
+ return KB_RU; // Russian
+
+ case 0x0005: // cs Czech
+ return KB_CZ; // Czech
+
+ case 0x0015: // pl Polish
+ return KB_PL; // Polish
+
+ case 0x000E: // hu Hungarian
+ return KB_HU; // Hungarian
+
+ case 0x0016: // pt Portuguese
+ return KB_PO; // Portuguese (Portugal)
+
+ case 0x001F: // tr Turkish
+ return KB_TR; // Turkish
+
+ case 0x0008: // el Greek
+ return KB_GK; // Greek
+
+ case 0x0023: // be Belarussian
+ return KB_BL; // Russian (Belarus)
+
+ case 0x0002: // bg Bulgarian
+ return KB_BG; // Bulgarian
+
+ case 0x001A: // hr Croatian
+ case 0x0024: // sl Slovenian
+ case 0x081A: // sr-Latn-SP Serbian (Latin, Serbia)
+ return KB_YU; // Yugoslavian Latin
+
+ case 0x080C: // fr-BE French (Belgium)
+ case 0x0813: // nl-BE Dutch (Belgium)
+ return KB_BE; // French (Belgium)
+
+ case 0x0C0C: // fr-CA French (Canada)
+ case 0x1009: // en-CA English (Canada)
+ return KB_CF; // French (Canada)
+
+ case 0x043C: // ga-GB Gaelic (Scotland)
+ case 0x0809: // en-GB English (United Kingdom)
+ case 0x083C: // ga-IE Irish (Ireland)
+ case 0x1809: // en-IE English (Ireland)
+ return KB_UK; // English (UK)
+
+ case 0x0025: // et Estonian
+ return KB_ET; // Estonian
+
+ case 0x100C: // fr-CH French (Switzerland)
+ return KB_SF; // French (Switzerland)
+
+ case 0x0807: // de-CH German (Switzerland)
+ return KB_SG; // German (Switzerland)
+
+ case 0x000F: // is Icelandic
+ return KB_IS; // Icelandic
+
+ case 0x0004: // zh-Hans Chinese (Simplified)
+ case 0x0011: // ja Japanese (Generic)
+ case 0x0012: // ko Korean (Generic)
+ return KB_IME; // CJK Input Method Editor
+
+ case 0x0018: // ro Romanian
+ return KB_RO; // Romanian
+
+ case 0x0C1A: // sr-Cyrl-SP Serbian (Cyrillic, Serbia)
+ return KB_YC; // Yougoslavian Cyrillic
+
+ case 0x080A: // es-MX Spanish (Mexico)
+ case 0x100A: // es-GT Spanish (Guatemala)
+ case 0x140A: // es-CR Spanish (Costa Rica)
+ case 0x180A: // es-PA Spanish (Panama)
+ case 0x1C0A: // es-DO Spanish (Dominican Republic)
+ case 0x200A: // es-VE Spanish (Venezuela)
+ case 0x240A: // es-CO Spanish (Colombia)
+ case 0x280A: // es-PE Spanish (Peru)
+ case 0x2C0A: // es-AR Spanish (Argentina)
+ case 0x300A: // es-EC Spanish (Ecuador)
+ case 0x340A: // es-CL Spanish (Chile)
+ case 0x380A: // es-UY Spanish (Uruguay)
+ case 0x3C0A: // es-PY Spanish (Paraguay)
+ case 0x400A: // es-BO Spanish (Bolivia)
+ case 0x440A: // es-SV Spanish (El Salvador)
+ case 0x480A: // es-HN Spanish (Honduras)
+ case 0x4C0A: // es-NI Spanish (Nicaragua)
+ case 0x500A: // es-PR Spanish (Puerto Rico)
+ return KB_LA; // Spanish (Latin America)
+
+ case 0x0022: // uk Ukrainian
+ return KB_UR; // Ukrainian
+
+ case 0x001B: // sk Slovak
+ return KB_SL; // Slovakian
+
+ default:
+ pass++;
+ if (pass > 1) {
+ uprintf("Could not match a DOS keyboard ID for locale 0x%04X\n", locale);
+ return KB_US;
+ }
+ // If we didn't get a match on first pass, mask with 0x03ff to try more generic pages
+ mask = 0x03ff;
+ break;
+ }
+ } while(1);
+}
+
+// See http://msdn.microsoft.com/en-us/library/windows/desktop/dd317756.aspx
+static int get_egacpi_idx(void)
+{
+ switch(GetOEMCP()) {
+ case 708: // Arabic (ASMO 708)
+ case 709: // Arabic (ASMO 449+, BCON V4)
+ case 710: // Arabic (Transparent Arabic)
+ case 860: // Portuguese
+ case 861: // Icelandic
+ case 863: // French Canadian
+ case 864: // Arabic
+ case 865: // Nordic
+ case 874: // Thai
+ case 932: // Japanese
+ case 936: // Simplified Chinese
+ case 949: // Korean
+ case 950: // Traditional Chinese
+ case 1258: // Vietnamese
+ return 0; // In the original DLL, MS returns 99 here and gets
+ // overflowed string indexes as a result - WTF?
+ case 437: // United States
+ case 850: // Latin 1
+ case 852: // Latin 2
+ return 0;
+ case 737: // The Greek Formerly Known As 437G
+ case 857: // Turkish
+ case 869: // Modern Greek
+ return 1;
+ case 775: // Baltic
+ case 855: // Cyrillic
+ case 866: // Russian
+ return 2;
+ case 720: // Arabic (Transparent ASMO)
+ return 3;
+ case 862: // Hebrew
+ return 4;
+ default:
+ return 0;
+ }
+}
+
+static BOOL is_cjkus(void)
+{
+ switch(GetOEMCP()) {
+ case 437: // United States
+ case 932: // Japanese
+ case 936: // Simplified Chinese
+ case 949: // Korean
+ case 950: // Traditional Chinese
+ return TRUE;
+ default:
+ return FALSE;
+ }
+}
+
+BOOL SetMSDOSLocale(const char* path)
+{
+ char filename[MAX_PATH];
+ int kb_id;
+ int drv_id;
+ int egacpi_id;
+ unsigned int oem_cp;
+ FILE* fd;
+
+ // Microsoft doesn't actually set a locale if the CP is CJK or US
+ if (is_cjkus())
+ return TRUE;
+
+ kb_id = syslocale_to_kbid((WORD)(LONG_PTR)GetKeyboardLayout(0));
+ uprintf("Using DOS keyboard '%s'\n", dos_kb_str[kb_id]);
+ drv_id = kb_to_drv[kb_id];
+ if (drv_id < 0) {
+ kb_id = syslocale_to_kbid((WORD)GetSystemDefaultLangID());
+ }
+ egacpi_id = get_egacpi_idx();
+ oem_cp = GetOEMCP();
+
+ strcpy(filename, path);
+ safe_strcat(filename, sizeof(filename), "\\CONFIG.SYS");
+ fd = fopen(filename, "w+");
+ if (fd == NULL) {
+ uprintf("Unable to create 'CONFIG.SYS': %s.\n", WindowsErrorString());
+ return FALSE;
+ }
+ // TODO: address cases where selection is between US and US
+ fprintf(fd, "[MENU]\n");
+ fprintf(fd, "MENUITEM NON_US, Use %s keyboard locale (default)\n", dos_kb_human_readable_str[kb_id]);
+ fprintf(fd, "MENUITEM US, Use US keyboard locale\n");
+ fprintf(fd, "MENUDEFAULT 1, 5\n");
+ fprintf(fd, "[NON_US]\n");
+ fprintf(fd, "device=C:\\locale\\display.sys con=(%s)\n", dos_con_str[egacpi_id]);
+ fprintf(fd, "[US]\n");
+ fclose(fd);
+ uprintf("Succesfully wrote 'CONFIG.SYS'\n");
+
+ strcpy(filename, path);
+ safe_strcat(filename, sizeof(filename), "\\AUTOEXEC.BAT");
+ fd = fopen(filename, "w+");
+ if (fd == NULL) {
+ uprintf("Unable to create 'AUTOEXEC.BAT': %s.\n", WindowsErrorString());
+ return FALSE;
+ }
+ fprintf(fd, "@echo off\n");
+ fprintf(fd, "set PATH=.;C:\\;C:\\LOCALE\n");
+ fprintf(fd, "GOTO %%CONFIG%%\n");
+ fprintf(fd, ":NON_US\n");
+ fprintf(fd, "mode con codepage prepare=((%d) \\locale\\%s) > NUL\n", oem_cp, dos_cpi_str[egacpi_id]);
+ fprintf(fd, "mode con codepage select=%d > NUL\n", oem_cp);
+ // TODO: specify /ID: for Turkish and Hebrew
+ fprintf(fd, "keyb %s,,\\locale\\%s\n", dos_kb_str[kb_id], dos_kb_drv_str[drv_id]);
+ fprintf(fd, ":US\n");
+ fclose(fd);
+ uprintf("Succesfully wrote 'AUTOEXEC.BAT'\n");
+
+ return TRUE;
+}
+
\ No newline at end of file
diff --git a/src/license.h b/src/license.h
index 93b08a4c..46022d07 100644
--- a/src/license.h
+++ b/src/license.h
@@ -26,6 +26,10 @@ const char* additional_copyrights =
"http://ms-sys.sourceforge.net\r\n"
"GNU General Public License (GPL) v2 or later\r\n"
"\r\n"
+"FreeDOS (Kernel + FreeCOM) support from the FreeDOS project:\r\n"
+"http://www.freedos.org\r\n"
+"GNU General Public License (GPL) v2 or later, with binary redistribution allowed\r\n"
+"\r\n"
"Bad blocks testing from e2fsprogs by Theodore T'so et al:\r\n"
"http://e2fsprogs.sourceforge.net\r\n"
"GNU General Public License (GPL) v3 compatible\r\n"
diff --git a/src/rufus.c b/src/rufus.c
index 3034cd57..b554933e 100644
--- a/src/rufus.c
+++ b/src/rufus.c
@@ -618,7 +618,7 @@ static void InitProgress(void)
nb_slots[OP_BADBLOCKS] = -1;
}
if (IsChecked(IDC_DOS)) {
- // TODO: this should reflect the number of files to copy +1 for PBR writing
+ // 3 slots + 1 for PBR writing
nb_slots[OP_DOS] = 3+1;
}
nb_slots[OP_PARTITION] = 1;
diff --git a/src/rufus.rc b/src/rufus.rc
index dbac1ae0..726698bb 100644
--- a/src/rufus.rc
+++ b/src/rufus.rc
@@ -30,7 +30,7 @@ LANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL
IDD_DIALOG DIALOGEX 12, 12, 206, 278
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_APPWINDOW
-CAPTION "Rufus v1.0.5.101"
+CAPTION "Rufus v1.0.5.102"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
DEFPUSHBUTTON "Start",IDC_START,94,236,50,14
@@ -65,7 +65,7 @@ BEGIN
DEFPUSHBUTTON "OK",IDOK,231,175,50,14,WS_GROUP
CONTROL "http://rufus.akeo.ie",IDC_ABOUT_RUFUS_URL,
"SysLink",WS_TABSTOP,46,47,114,9
- LTEXT "Version 1.0.5 (Build 101)",IDC_STATIC,46,19,78,8
+ LTEXT "Version 1.0.5 (Build 102)",IDC_STATIC,46,19,78,8
PUSHBUTTON "License...",IDC_ABOUT_LICENSE,46,175,50,14,WS_GROUP
EDITTEXT IDC_ABOUT_COPYRIGHTS,46,107,235,63,ES_MULTILINE | ES_READONLY | WS_VSCROLL
LTEXT "Report bugs or request enhancements at:",IDC_STATIC,46,66,187,8
@@ -170,8 +170,8 @@ END
//
VS_VERSION_INFO VERSIONINFO
- FILEVERSION 1,0,5,101
- PRODUCTVERSION 1,0,5,101
+ FILEVERSION 1,0,5,102
+ PRODUCTVERSION 1,0,5,102
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
@@ -188,13 +188,13 @@ BEGIN
BEGIN
VALUE "CompanyName", "akeo.ie"
VALUE "FileDescription", "Rufus"
- VALUE "FileVersion", "1.0.5.101"
+ VALUE "FileVersion", "1.0.5.102"
VALUE "InternalName", "Rufus"
VALUE "LegalCopyright", "© 2011 Pete Batard (GPL v3)"
VALUE "LegalTrademarks", "http://www.gnu.org/copyleft/gpl.html"
VALUE "OriginalFilename", "rufus.exe"
VALUE "ProductName", "Rufus"
- VALUE "ProductVersion", "1.0.5.101"
+ VALUE "ProductVersion", "1.0.5.102"
END
END
BLOCK "VarFileInfo"