[locale] set DOS keyboard locale (experimental)

* sets DOS locale using the same algorithm as MS' diskcopy.dll
* uses CONFIG.SYS menu to allow US vs non US selection
* only applies to WinME/MS-DOS for now (no FreeDOS)
* also renamed msdos.c -> dos.c with minor improvements
* also added missing FreeDOS credits in about dialog
This commit is contained in:
Pete Batard 2011-12-21 00:53:31 +00:00
parent ae00aa3f59
commit 64949c27e1
13 changed files with 512 additions and 63 deletions

View File

@ -154,7 +154,7 @@
<ClCompile Include="..\fat32.c" />
<ClCompile Include="..\file.c" />
<ClCompile Include="..\format.c" />
<ClCompile Include="..\msdos.c" />
<ClCompile Include="..\dos.c" />
<ClCompile Include="..\partition_info.c" />
<ClCompile Include="..\rufus.c" />
<ClCompile Include="..\stdio.c" />
@ -193,7 +193,7 @@
<ClInclude Include="..\inc\mbr_zero.h" />
<ClInclude Include="..\inc\partition_info.h" />
<ClInclude Include="..\msapi_utf8.h" />
<ClInclude Include="..\msdos.h" />
<ClInclude Include="..\dos.h" />
<ClInclude Include="..\resource.h" />
<ClInclude Include="..\rufus.h" />
<ClInclude Include="..\license.h" />

View File

@ -24,7 +24,7 @@
<ClCompile Include="..\stdlg.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\msdos.c">
<ClCompile Include="..\dos.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\fat32.c">
@ -71,7 +71,7 @@
<ClInclude Include="..\sys_types.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\msdos.h">
<ClInclude Include="..\dos.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\inc\br.h">

View File

@ -160,13 +160,14 @@
<ItemGroup>
<ClCompile Include="..\badblocks.c" />
<ClCompile Include="..\br.c" />
<ClCompile Include="..\dos_locale.c" />
<ClCompile Include="..\drive.c" />
<ClCompile Include="..\fat12.c" />
<ClCompile Include="..\fat16.c" />
<ClCompile Include="..\fat32.c" />
<ClCompile Include="..\file.c" />
<ClCompile Include="..\format.c" />
<ClCompile Include="..\msdos.c" />
<ClCompile Include="..\dos.c" />
<ClCompile Include="..\partition_info.c" />
<ClCompile Include="..\rufus.c" />
<ClCompile Include="..\stdio.c" />
@ -205,7 +206,7 @@
<ClInclude Include="..\inc\mbr_zero.h" />
<ClInclude Include="..\inc\partition_info.h" />
<ClInclude Include="..\msapi_utf8.h" />
<ClInclude Include="..\msdos.h" />
<ClInclude Include="..\dos.h" />
<ClInclude Include="..\resource.h" />
<ClInclude Include="..\rufus.h" />
<ClInclude Include="..\license.h" />

View File

@ -24,7 +24,7 @@
<ClCompile Include="..\stdlg.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\msdos.c">
<ClCompile Include="..\dos.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\fat32.c">
@ -57,6 +57,9 @@
<ClCompile Include="..\partition_info.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\dos_locale.c">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\rufus.h">
@ -71,7 +74,7 @@
<ClInclude Include="..\sys_types.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\msdos.h">
<ClInclude Include="..\dos.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\inc\br.h">

View File

@ -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

View File

@ -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

View File

@ -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@

View File

@ -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 <pete@akeo.ie>
*
* This program is free software: you can redistribute it and/or modify
@ -28,7 +29,7 @@
#include <string.h>
#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<ARRAYSIZE(extractlist); j++) {
if (memcmp(extractlist[j], &DiskImage[FAT12_ROOTDIR_OFFSET + i*FAT_BYTES_PER_DIRENT], 8+3) == 0) {
r = ExtractFAT(i, path);
UpdateProgress(OP_DOS, -1.0f);
r = ExtractFAT(i, (j<3)?path:locale_path);
if ((j == 6) || (j == 12))
UpdateProgress(OP_DOS, -1.0f);
}
}
}
FreeLibrary(hDLL);
SetMSDOSLocale(path);
return r;
}
@ -350,7 +359,6 @@ BOOL ExtractFreeDOS(const char* path)
BYTE* res_data[2];
DWORD res_size[2], Size;
HANDLE hFile;
size_t pos;
int i;
if ((path == NULL) || ((safe_strlen(path) + 14) > 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) {

View File

@ -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);

417
src/dos_locale.c Normal file
View File

@ -0,0 +1,417 @@
/*
* Rufus: The Reliable USB Formatting Utility
* DOS keyboard locale setup
* Copyright (c) 2011 Pete Batard <pete@akeo.ie>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/* Memory leaks detection - define _CRTDBG_MAP_ALLOC as preprocessor macro */
#ifdef _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#endif
#include <windows.h>
#include <stdio.h>
#include <string.h>
#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;
}

View File

@ -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"

View File

@ -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;

View File

@ -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 "<a href=""http://rufus.akeo.ie"">http://rufus.akeo.ie</a>",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"