1
1
Fork 0
mirror of https://github.com/pbatard/rufus.git synced 2024-08-14 23:57:05 +00:00

[ntfs] add bootable NTFS support

* NTFS boot records in ms-sys
* also added debug duplication to PrintMessage
* also fixed controls staying enabled during formatting
This commit is contained in:
Pete Batard 2012-02-03 18:19:50 +00:00
parent bb0c0ecb1c
commit d1e4ba278b
17 changed files with 534 additions and 47 deletions

View file

@ -1,8 +1,12 @@
/* Option for Visual Studio and WDK compilation */ /* Option for Visual Studio and WDK compilation */
/* For MinGW, use "./configure <option>" instead */ /* For MinGW, use "./configure <option>" instead */
#if defined(_MSC_VER)
/* Embed FreeDOS files and allow FreeDOS support */ /* Embed FreeDOS files and allow FreeDOS support */
#define WITH_FREEDOS #define WITH_FREEDOS
/* SysLinux support, for ISO -> bootable USB */ /* SysLinux support, for ISO -> bootable USB */
#define WITH_SYSLINUX #define WITH_SYSLINUX
#endif /* _MSC_VER */

View file

@ -324,7 +324,7 @@ static void print_status(void)
percent = calc_percent((unsigned long) currently_testing, percent = calc_percent((unsigned long) currently_testing,
(unsigned long) num_blocks); (unsigned long) num_blocks);
percent = (percent/2.0f) + ((cur_op==OP_READ)? 50.0f : 0.0f); percent = (percent/2.0f) + ((cur_op==OP_READ)? 50.0f : 0.0f);
PrintStatus(0, "Bad Blocks: PASS %d/%d - %0.2f%% (%d/%d/%d errors)", PrintStatus(0, FALSE, "Bad Blocks: PASS %d/%d - %0.2f%% (%d/%d/%d errors)",
cur_pattern, nr_pattern, cur_pattern, nr_pattern,
percent, percent,
num_read_errors, num_read_errors,
@ -355,8 +355,7 @@ static void pattern_fill(unsigned char *buffer, unsigned int pattern,
for (ptr = buffer; ptr < buffer + n; ptr++) { for (ptr = buffer; ptr < buffer + n; ptr++) {
(*ptr) = rand() % (1 << (8 * sizeof(char))); (*ptr) = rand() % (1 << (8 * sizeof(char)));
} }
PrintStatus(3500, "Bad Blocks: Testing with random pattern."); PrintStatus(3500, TRUE, "Bad Blocks: Testing with random pattern.");
uprintf("Bad Blocks: Testing with random pattern.");
} else { } else {
bpattern[0] = 0; bpattern[0] = 0;
for (i = 0; i < sizeof(bpattern); i++) { for (i = 0; i < sizeof(bpattern); i++) {
@ -373,8 +372,7 @@ static void pattern_fill(unsigned char *buffer, unsigned int pattern,
else else
i--; i--;
} }
PrintStatus(3500, "Bad Blocks: Testing with pattern 0x%02X.", bpattern[i]); PrintStatus(3500, TRUE, "Bad Blocks: Testing with pattern 0x%02X.", bpattern[i]);
uprintf("Bad Blocks: Testing with pattern 0x%02X.", bpattern[i]);
cur_pattern++; cur_pattern++;
} }
} }

View file

@ -35,6 +35,7 @@
#include "br.h" #include "br.h"
#include "fat16.h" #include "fat16.h"
#include "fat32.h" #include "fat32.h"
#include "ntfs.h"
#include "partition_info.h" #include "partition_info.h"
#include "file.h" #include "file.h"
#include "format.h" #include "format.h"
@ -63,19 +64,17 @@ static BOOLEAN __stdcall FormatExCallback(FILE_SYSTEM_CALLBACK_COMMAND Command,
switch(Command) { switch(Command) {
case FCC_PROGRESS: case FCC_PROGRESS:
percent = (DWORD*)pData; percent = (DWORD*)pData;
PrintStatus(0, "Formatting: %d%% completed.\n", *percent); PrintStatus(0, FALSE, "Formatting: %d%% completed.", *percent);
// uprintf("%d percent completed.\n", *percent); // uprintf("%d percent completed.\n", *percent);
UpdateProgress(OP_FORMAT, 1.0f * (*percent)); UpdateProgress(OP_FORMAT, 1.0f * (*percent));
break; break;
case FCC_STRUCTURE_PROGRESS: // No progress on quick format case FCC_STRUCTURE_PROGRESS: // No progress on quick format
PrintStatus(0, "Creating file system: Task %d/%d completed.\n", ++task_number, nb_steps[fs_index]); PrintStatus(0, TRUE, "Creating file system: Task %d/%d completed.", ++task_number, nb_steps[fs_index]);
uprintf("Create FS: Task %d/%d completed.\n", task_number, nb_steps[fs_index]);
format_percent += 100.0f / (1.0f * nb_steps[fs_index]); format_percent += 100.0f / (1.0f * nb_steps[fs_index]);
UpdateProgress(OP_CREATE_FS, format_percent); UpdateProgress(OP_CREATE_FS, format_percent);
break; break;
case FCC_DONE: case FCC_DONE:
PrintStatus(0, "Creating file system: Task %d/%d completed.\n", nb_steps[fs_index], nb_steps[fs_index]); PrintStatus(0, TRUE, "Creating file system: Task %d/%d completed.", nb_steps[fs_index], nb_steps[fs_index]);
uprintf("Create FS: Task %d/%d completed.\n", nb_steps[fs_index], nb_steps[fs_index]);
UpdateProgress(OP_CREATE_FS, 100.0f); UpdateProgress(OP_CREATE_FS, 100.0f);
if(*(BOOLEAN*)pData == FALSE) { if(*(BOOLEAN*)pData == FALSE) {
uprintf("Error while formatting.\n"); uprintf("Error while formatting.\n");
@ -150,7 +149,7 @@ static BOOL FormatDrive(char DriveLetter)
size_t i; size_t i;
wDriveRoot[0] = (WCHAR)DriveLetter; wDriveRoot[0] = (WCHAR)DriveLetter;
PrintStatus(0, "Formatting..."); PrintStatus(0, TRUE, "Formatting...");
PF_INIT_OR_OUT(FormatEx, fmifs); PF_INIT_OR_OUT(FormatEx, fmifs);
GetWindowTextW(hFileSystem, wFSType, ARRAYSIZE(wFSType)); GetWindowTextW(hFileSystem, wFSType, ARRAYSIZE(wFSType));
@ -340,7 +339,9 @@ static BOOL WritePBR(HANDLE hLogicalVolume, BOOL bFreeDOS)
uprintf("Confirmed new volume has a FAT16 boot sector\n"); uprintf("Confirmed new volume has a FAT16 boot sector\n");
if (bFreeDOS) { if (bFreeDOS) {
if (!write_fat_16_fd_br(&fake_fd, 0)) break; if (!write_fat_16_fd_br(&fake_fd, 0)) break;
} else if (!write_fat_16_br(&fake_fd, 0)) break; } else {
if (!write_fat_16_br(&fake_fd, 0)) break;
}
// Disk Drive ID needs to be corrected on XP // Disk Drive ID needs to be corrected on XP
if (!write_partition_physical_disk_drive_id_fat16(&fake_fd)) if (!write_partition_physical_disk_drive_id_fat16(&fake_fd))
break; break;
@ -362,6 +363,16 @@ static BOOL WritePBR(HANDLE hLogicalVolume, BOOL bFreeDOS)
fake_fd._cnt += 6 * (int)SelectedDrive.Geometry.BytesPerSector; fake_fd._cnt += 6 * (int)SelectedDrive.Geometry.BytesPerSector;
} }
return TRUE; return TRUE;
case FS_NTFS:
if (!is_ntfs_fs(&fake_fd)) {
uprintf("New volume does not have an NTFS boot sector\n");
break;
}
uprintf("Confirmed new volume has an NTFS boot sector\n");
if (!write_ntfs_br(&fake_fd)) break;
// Note: NTFS requires a full remount after writing the PBR. We dismount when we lock
// so that's not an issue, but if you don't remount, you don't boot!
return TRUE;
default: default:
uprintf("unsupported FS for FS BR processing\n"); uprintf("unsupported FS for FS BR processing\n");
break; break;
@ -407,6 +418,7 @@ void __cdecl FormatThread(void* param)
goto out; goto out;
} }
UnmountDrive(hLogicalVolume); UnmountDrive(hLogicalVolume);
// TODO: DeleteVolumeMountPoint (and GetVolumeNameForVolumeMountPoint unless the GUID changes)
AnalyzeMBR(hPhysicalDrive); AnalyzeMBR(hPhysicalDrive);
AnalyzePBR(hLogicalVolume); AnalyzePBR(hLogicalVolume);
@ -495,7 +507,7 @@ void __cdecl FormatThread(void* param)
goto out; goto out;
} }
PrintStatus(0, "Writing master boot record...\n"); PrintStatus(0, TRUE, "Writing master boot record...");
if (!WriteMBR(hPhysicalDrive)) { if (!WriteMBR(hPhysicalDrive)) {
// Errorcode has already been set // Errorcode has already been set
goto out; goto out;
@ -506,6 +518,7 @@ void __cdecl FormatThread(void* param)
switch (ComboBox_GetItemData(hDOSType, ComboBox_GetCurSel(hDOSType))) { switch (ComboBox_GetItemData(hDOSType, ComboBox_GetCurSel(hDOSType))) {
case DT_FREEDOS: case DT_FREEDOS:
case DT_WINME: case DT_WINME:
case DT_ISO:
// We still have a lock, which we need to modify the volume boot record // We still have a lock, which we need to modify the volume boot record
// => no need to reacquire the lock... // => no need to reacquire the lock...
hLogicalVolume = GetDriveHandle(num, drive_name, TRUE, FALSE); hLogicalVolume = GetDriveHandle(num, drive_name, TRUE, FALSE);
@ -514,7 +527,11 @@ void __cdecl 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;
} }
PrintStatus(0, "Writing partition boot record...\n"); // Make sure the volume is dismounted before writing the PBR
// This is especially critical, as NTFS will only be made bootable
// after the FS is re-mounted by Windows
UnmountDrive(hLogicalVolume);
PrintStatus(0, TRUE, "Writing partition boot record...");
if (!WritePBR(hLogicalVolume, ComboBox_GetItemData(hDOSType, ComboBox_GetCurSel(hDOSType)) == DT_FREEDOS)) { if (!WritePBR(hLogicalVolume, ComboBox_GetItemData(hDOSType, ComboBox_GetCurSel(hDOSType)) == DT_FREEDOS)) {
// Errorcode has already been set // Errorcode has already been set
goto out; goto out;
@ -522,10 +539,12 @@ void __cdecl FormatThread(void* param)
// ...but we must have relinquished that lock to write the MS-DOS files // ...but we must have relinquished that lock to write the MS-DOS files
safe_unlockclose(hLogicalVolume); safe_unlockclose(hLogicalVolume);
UpdateProgress(OP_DOS, -1.0f); UpdateProgress(OP_DOS, -1.0f);
PrintStatus(0, "Copying DOS files...\n"); if (ComboBox_GetItemData(hDOSType, ComboBox_GetCurSel(hDOSType)) != DT_ISO) {
if (!ExtractDOS(drive_name)) { PrintStatus(0, TRUE, "Copying DOS files...");
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_CANNOT_COPY; if (!ExtractDOS(drive_name)) {
goto out; FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_CANNOT_COPY;
goto out;
}
} }
break; break;
// Syslinux requires patching of the PBR after the files have been extracted // Syslinux requires patching of the PBR after the files have been extracted
@ -538,6 +557,8 @@ void __cdecl FormatThread(void* param)
} }
} }
// TODO: SetVolumeMountPoint
out: out:
safe_unlockclose(hLogicalVolume); safe_unlockclose(hLogicalVolume);
safe_unlockclose(hPhysicalDrive); safe_unlockclose(hPhysicalDrive);

View file

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations"> <ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32"> <ProjectConfiguration Include="Debug|Win32">
@ -34,6 +34,8 @@
<ClInclude Include="..\inc\br_fat32_0x0.h" /> <ClInclude Include="..\inc\br_fat32_0x0.h" />
<ClInclude Include="..\inc\br_fat32_0x3f0.h" /> <ClInclude Include="..\inc\br_fat32_0x3f0.h" />
<ClInclude Include="..\inc\br_fat32_0x52.h" /> <ClInclude Include="..\inc\br_fat32_0x52.h" />
<ClInclude Include="..\inc\br_ntfs_0x0.h" />
<ClInclude Include="..\inc\br_ntfs_0x54.h" />
<ClInclude Include="..\inc\fat12.h" /> <ClInclude Include="..\inc\fat12.h" />
<ClInclude Include="..\inc\fat16.h" /> <ClInclude Include="..\inc\fat16.h" />
<ClInclude Include="..\inc\fat32.h" /> <ClInclude Include="..\inc\fat32.h" />
@ -47,6 +49,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\ntfs.h" />
<ClInclude Include="..\inc\partition_info.h" /> <ClInclude Include="..\inc\partition_info.h" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
@ -55,6 +58,7 @@
<ClCompile Include="..\fat16.c" /> <ClCompile Include="..\fat16.c" />
<ClCompile Include="..\fat32.c" /> <ClCompile Include="..\fat32.c" />
<ClCompile Include="..\file.c" /> <ClCompile Include="..\file.c" />
<ClCompile Include="..\ntfs.c" />
<ClCompile Include="..\partition_info.c" /> <ClCompile Include="..\partition_info.c" />
</ItemGroup> </ItemGroup>
<PropertyGroup Label="Globals"> <PropertyGroup Label="Globals">

View file

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup> <ItemGroup>
<Filter Include="Source Files"> <Filter Include="Source Files">
@ -98,6 +98,15 @@
<ClInclude Include="..\inc\mbr_zero.h"> <ClInclude Include="..\inc\mbr_zero.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\inc\ntfs.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\inc\br_ntfs_0x0.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\inc\br_ntfs_0x54.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="..\br.c"> <ClCompile Include="..\br.c">
@ -118,5 +127,8 @@
<ClCompile Include="..\partition_info.c"> <ClCompile Include="..\partition_info.c">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\ntfs.c">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
</Project> </Project>

View file

@ -17,4 +17,5 @@ SOURCES=file.c \
fat12.c \ fat12.c \
fat16.c \ fat16.c \
fat32.c \ fat32.c \
ntfs.c \
partition_info.c partition_info.c

View file

@ -1,4 +1,4 @@
noinst_LIBRARIES = libmssys.a noinst_LIBRARIES = libmssys.a
libmssys_a_SOURCES = fat12.c fat16.c fat32.c partition_info.c br.c file.c libmssys_a_SOURCES = fat12.c fat16.c fat32.c ntfs.c partition_info.c br.c file.c
libmssys_a_CFLAGS = -I./inc $(AM_CFLAGS) libmssys_a_CFLAGS = -I./inc $(AM_CFLAGS)

View file

@ -54,8 +54,8 @@ libmssys_a_AR = $(AR) $(ARFLAGS)
libmssys_a_LIBADD = libmssys_a_LIBADD =
am_libmssys_a_OBJECTS = libmssys_a-fat12.$(OBJEXT) \ am_libmssys_a_OBJECTS = libmssys_a-fat12.$(OBJEXT) \
libmssys_a-fat16.$(OBJEXT) libmssys_a-fat32.$(OBJEXT) \ libmssys_a-fat16.$(OBJEXT) libmssys_a-fat32.$(OBJEXT) \
libmssys_a-partition_info.$(OBJEXT) libmssys_a-br.$(OBJEXT) \ libmssys_a-ntfs.$(OBJEXT) libmssys_a-partition_info.$(OBJEXT) \
libmssys_a-file.$(OBJEXT) libmssys_a-br.$(OBJEXT) libmssys_a-file.$(OBJEXT)
libmssys_a_OBJECTS = $(am_libmssys_a_OBJECTS) libmssys_a_OBJECTS = $(am_libmssys_a_OBJECTS)
DEFAULT_INCLUDES = -I.@am__isrc@ DEFAULT_INCLUDES = -I.@am__isrc@
depcomp = depcomp =
@ -168,7 +168,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 = libmssys.a noinst_LIBRARIES = libmssys.a
libmssys_a_SOURCES = fat12.c fat16.c fat32.c partition_info.c br.c file.c libmssys_a_SOURCES = fat12.c fat16.c fat32.c ntfs.c partition_info.c br.c file.c
libmssys_a_CFLAGS = -I./inc $(AM_CFLAGS) libmssys_a_CFLAGS = -I./inc $(AM_CFLAGS)
all: all-am all: all-am
@ -250,6 +250,14 @@ libmssys_a-fat32.obj: fat32.c
$(AM_V_CC) @AM_BACKSLASH@ $(AM_V_CC) @AM_BACKSLASH@
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmssys_a_CFLAGS) $(CFLAGS) -c -o libmssys_a-fat32.obj `if test -f 'fat32.c'; then $(CYGPATH_W) 'fat32.c'; else $(CYGPATH_W) '$(srcdir)/fat32.c'; fi` $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmssys_a_CFLAGS) $(CFLAGS) -c -o libmssys_a-fat32.obj `if test -f 'fat32.c'; then $(CYGPATH_W) 'fat32.c'; else $(CYGPATH_W) '$(srcdir)/fat32.c'; fi`
libmssys_a-ntfs.o: ntfs.c
$(AM_V_CC) @AM_BACKSLASH@
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmssys_a_CFLAGS) $(CFLAGS) -c -o libmssys_a-ntfs.o `test -f 'ntfs.c' || echo '$(srcdir)/'`ntfs.c
libmssys_a-ntfs.obj: ntfs.c
$(AM_V_CC) @AM_BACKSLASH@
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmssys_a_CFLAGS) $(CFLAGS) -c -o libmssys_a-ntfs.obj `if test -f 'ntfs.c'; then $(CYGPATH_W) 'ntfs.c'; else $(CYGPATH_W) '$(srcdir)/ntfs.c'; fi`
libmssys_a-partition_info.o: partition_info.c libmssys_a-partition_info.o: partition_info.c
$(AM_V_CC) @AM_BACKSLASH@ $(AM_V_CC) @AM_BACKSLASH@
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmssys_a_CFLAGS) $(CFLAGS) -c -o libmssys_a-partition_info.o `test -f 'partition_info.c' || echo '$(srcdir)/'`partition_info.c $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmssys_a_CFLAGS) $(CFLAGS) -c -o libmssys_a-partition_info.o `test -f 'partition_info.c' || echo '$(srcdir)/'`partition_info.c

View file

@ -0,0 +1,3 @@
unsigned char br_ntfs_0x0[] = {
0xEB, 0x52, 0x90, 0x4E, 0x54, 0x46, 0x53, 0x20, 0x20, 0x20, 0x20
};

View file

@ -0,0 +1,340 @@
unsigned char br_ntfs_0x54[] = {
0xFA, 0x33, 0xC0, 0x8E, 0xD0, 0xBC, 0x00, 0x7C, 0xFB, 0x68, 0xC0, 0x07,
0x1F, 0x1E, 0x68, 0x66, 0x00, 0xCB, 0x88, 0x16, 0x0E, 0x00, 0x66, 0x81,
0x3E, 0x03, 0x00, 0x4E, 0x54, 0x46, 0x53, 0x75, 0x15, 0xB4, 0x41, 0xBB,
0xAA, 0x55, 0xCD, 0x13, 0x72, 0x0C, 0x81, 0xFB, 0x55, 0xAA, 0x75, 0x06,
0xF7, 0xC1, 0x01, 0x00, 0x75, 0x03, 0xE9, 0xDD, 0x00, 0x1E, 0x83, 0xEC,
0x18, 0x68, 0x1A, 0x00, 0xB4, 0x48, 0x8A, 0x16, 0x0E, 0x00, 0x8B, 0xF4,
0x16, 0x1F, 0xCD, 0x13, 0x9F, 0x83, 0xC4, 0x18, 0x9E, 0x58, 0x1F, 0x72,
0xE1, 0x3B, 0x06, 0x0B, 0x00, 0x75, 0xDB, 0xA3, 0x0F, 0x00, 0xC1, 0x2E,
0x0F, 0x00, 0x04, 0x1E, 0x5A, 0x33, 0xDB, 0xB9, 0x00, 0x20, 0x2B, 0xC8,
0x66, 0xFF, 0x06, 0x11, 0x00, 0x03, 0x16, 0x0F, 0x00, 0x8E, 0xC2, 0xFF,
0x06, 0x16, 0x00, 0xE8, 0x4B, 0x00, 0x2B, 0xC8, 0x77, 0xEF, 0xB8, 0x00,
0xBB, 0xCD, 0x1A, 0x66, 0x23, 0xC0, 0x75, 0x2D, 0x66, 0x81, 0xFB, 0x54,
0x43, 0x50, 0x41, 0x75, 0x24, 0x81, 0xF9, 0x02, 0x01, 0x72, 0x1E, 0x16,
0x68, 0x07, 0xBB, 0x16, 0x68, 0x70, 0x0E, 0x16, 0x68, 0x09, 0x00, 0x66,
0x53, 0x66, 0x53, 0x66, 0x55, 0x16, 0x16, 0x16, 0x68, 0xB8, 0x01, 0x66,
0x61, 0x0E, 0x07, 0xCD, 0x1A, 0x33, 0xC0, 0xBF, 0x28, 0x10, 0xB9, 0xD8,
0x0F, 0xFC, 0xF3, 0xAA, 0xE9, 0x5F, 0x01, 0x90, 0x90, 0x66, 0x60, 0x1E,
0x06, 0x66, 0xA1, 0x11, 0x00, 0x66, 0x03, 0x06, 0x1C, 0x00, 0x1E, 0x66,
0x68, 0x00, 0x00, 0x00, 0x00, 0x66, 0x50, 0x06, 0x53, 0x68, 0x01, 0x00,
0x68, 0x10, 0x00, 0xB4, 0x42, 0x8A, 0x16, 0x0E, 0x00, 0x16, 0x1F, 0x8B,
0xF4, 0xCD, 0x13, 0x66, 0x59, 0x5B, 0x5A, 0x66, 0x59, 0x66, 0x59, 0x1F,
0x0F, 0x82, 0x16, 0x00, 0x66, 0xFF, 0x06, 0x11, 0x00, 0x03, 0x16, 0x0F,
0x00, 0x8E, 0xC2, 0xFF, 0x0E, 0x16, 0x00, 0x75, 0xBC, 0x07, 0x1F, 0x66,
0x61, 0xC3, 0xA0, 0xF8, 0x01, 0xE8, 0x09, 0x00, 0xA0, 0xFB, 0x01, 0xE8,
0x03, 0x00, 0xF4, 0xEB, 0xFD, 0xB4, 0x01, 0x8B, 0xF0, 0xAC, 0x3C, 0x00,
0x74, 0x09, 0xB4, 0x0E, 0xBB, 0x07, 0x00, 0xCD, 0x10, 0xEB, 0xF2, 0xC3,
0x0D, 0x0A, 0x41, 0x20, 0x64, 0x69, 0x73, 0x6B, 0x20, 0x72, 0x65, 0x61,
0x64, 0x20, 0x65, 0x72, 0x72, 0x6F, 0x72, 0x20, 0x6F, 0x63, 0x63, 0x75,
0x72, 0x72, 0x65, 0x64, 0x00, 0x0D, 0x0A, 0x42, 0x4F, 0x4F, 0x54, 0x4D,
0x47, 0x52, 0x20, 0x69, 0x73, 0x20, 0x6D, 0x69, 0x73, 0x73, 0x69, 0x6E,
0x67, 0x00, 0x0D, 0x0A, 0x42, 0x4F, 0x4F, 0x54, 0x4D, 0x47, 0x52, 0x20,
0x69, 0x73, 0x20, 0x63, 0x6F, 0x6D, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65,
0x64, 0x00, 0x0D, 0x0A, 0x50, 0x72, 0x65, 0x73, 0x73, 0x20, 0x43, 0x74,
0x72, 0x6C, 0x2B, 0x41, 0x6C, 0x74, 0x2B, 0x44, 0x65, 0x6C, 0x20, 0x74,
0x6F, 0x20, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x0D, 0x0A, 0x00,
0x8C, 0xA9, 0xBE, 0xD6, 0x00, 0x00, 0x55, 0xAA, 0x07, 0x00, 0x42, 0x00,
0x4F, 0x00, 0x4F, 0x00, 0x54, 0x00, 0x4D, 0x00, 0x47, 0x00, 0x52, 0x00,
0x04, 0x00, 0x24, 0x00, 0x49, 0x00, 0x33, 0x00, 0x30, 0x00, 0x00, 0xD4,
0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEB, 0x22,
0x90, 0x90, 0x05, 0x00, 0x4E, 0x00, 0x54, 0x00, 0x4C, 0x00, 0x44, 0x00,
0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x0F,
0xB7, 0x06, 0x0B, 0x00, 0x66, 0x0F, 0xB6, 0x1E, 0x0D, 0x00, 0x66, 0xF7,
0xE3, 0x66, 0xA3, 0x52, 0x02, 0x66, 0x8B, 0x0E, 0x40, 0x00, 0x80, 0xF9,
0x00, 0x0F, 0x8F, 0x0E, 0x00, 0xF6, 0xD9, 0x66, 0xB8, 0x01, 0x00, 0x00,
0x00, 0x66, 0xD3, 0xE0, 0xEB, 0x08, 0x90, 0x66, 0xA1, 0x52, 0x02, 0x66,
0xF7, 0xE1, 0x66, 0xA3, 0x66, 0x02, 0x66, 0x0F, 0xB7, 0x1E, 0x0B, 0x00,
0x66, 0x33, 0xD2, 0x66, 0xF7, 0xF3, 0x66, 0xA3, 0x56, 0x02, 0xE8, 0x95,
0x04, 0x66, 0x8B, 0x0E, 0x4E, 0x02, 0x66, 0x89, 0x0E, 0x26, 0x02, 0x66,
0x03, 0x0E, 0x66, 0x02, 0x66, 0x89, 0x0E, 0x2A, 0x02, 0x66, 0x03, 0x0E,
0x66, 0x02, 0x66, 0x89, 0x0E, 0x2E, 0x02, 0x66, 0x03, 0x0E, 0x66, 0x02,
0x66, 0x89, 0x0E, 0x3E, 0x02, 0x66, 0x03, 0x0E, 0x66, 0x02, 0x66, 0x89,
0x0E, 0x46, 0x02, 0x66, 0xB8, 0x90, 0x00, 0x00, 0x00, 0x66, 0x8B, 0x0E,
0x26, 0x02, 0xE8, 0x83, 0x09, 0x66, 0x0B, 0xC0, 0x0F, 0x84, 0x5E, 0xFE,
0x66, 0xA3, 0x32, 0x02, 0x66, 0xB8, 0xA0, 0x00, 0x00, 0x00, 0x66, 0x8B,
0x0E, 0x2A, 0x02, 0xE8, 0x6A, 0x09, 0x66, 0xA3, 0x36, 0x02, 0x66, 0xB8,
0xB0, 0x00, 0x00, 0x00, 0x66, 0x8B, 0x0E, 0x2E, 0x02, 0xE8, 0x58, 0x09,
0x66, 0xA3, 0x3A, 0x02, 0x66, 0xA1, 0x32, 0x02, 0x66, 0x0B, 0xC0, 0x0F,
0x84, 0x2B, 0xFE, 0x67, 0x80, 0x78, 0x08, 0x00, 0x0F, 0x85, 0x22, 0xFE,
0x67, 0x66, 0x8D, 0x50, 0x10, 0x67, 0x03, 0x42, 0x04, 0x67, 0x66, 0x0F,
0xB6, 0x48, 0x0C, 0x66, 0x89, 0x0E, 0x72, 0x02, 0x67, 0x66, 0x8B, 0x48,
0x08, 0x66, 0x89, 0x0E, 0x6E, 0x02, 0x66, 0xA1, 0x6E, 0x02, 0x66, 0x0F,
0xB7, 0x0E, 0x0B, 0x00, 0x66, 0x33, 0xD2, 0x66, 0xF7, 0xF1, 0x66, 0xA3,
0x76, 0x02, 0x66, 0xA1, 0x46, 0x02, 0x66, 0x03, 0x06, 0x6E, 0x02, 0x66,
0xA3, 0x4A, 0x02, 0x66, 0x83, 0x3E, 0x36, 0x02, 0x00, 0x0F, 0x84, 0x1D,
0x00, 0x66, 0x83, 0x3E, 0x3A, 0x02, 0x00, 0x0F, 0x84, 0xCF, 0xFD, 0x66,
0x8B, 0x1E, 0x3A, 0x02, 0x1E, 0x07, 0x66, 0x8B, 0x3E, 0x4A, 0x02, 0x66,
0xA1, 0x2E, 0x02, 0xE8, 0xE0, 0x01, 0x66, 0x0F, 0xB7, 0x0E, 0x00, 0x02,
0x66, 0xB8, 0x02, 0x02, 0x00, 0x00, 0xE8, 0x22, 0x08, 0x66, 0x0B, 0xC0,
0x0F, 0x85, 0x16, 0x00, 0x66, 0x0F, 0xB7, 0x0E, 0x5A, 0x02, 0x66, 0xB8,
0x5C, 0x02, 0x00, 0x00, 0xE8, 0x0C, 0x08, 0x66, 0x0B, 0xC0, 0x0F, 0x84,
0x42, 0x0C, 0x67, 0x66, 0x8B, 0x00, 0x1E, 0x07, 0x66, 0x8B, 0x3E, 0x3E,
0x02, 0xE8, 0x3F, 0x06, 0x66, 0xA1, 0x3E, 0x02, 0x66, 0xBB, 0x20, 0x00,
0x00, 0x00, 0x66, 0xB9, 0x00, 0x00, 0x00, 0x00, 0x66, 0xBA, 0x00, 0x00,
0x00, 0x00, 0xE8, 0xE4, 0x00, 0x66, 0x85, 0xC0, 0x0F, 0x85, 0x23, 0x00,
0x66, 0xA1, 0x3E, 0x02, 0x66, 0xBB, 0x80, 0x00, 0x00, 0x00, 0x66, 0xB9,
0x00, 0x00, 0x00, 0x00, 0x66, 0xBA, 0x00, 0x00, 0x00, 0x00, 0xE8, 0xC4,
0x00, 0x66, 0x0B, 0xC0, 0x0F, 0x85, 0x44, 0x00, 0xE9, 0xF1, 0x0B, 0x66,
0x33, 0xD2, 0x66, 0xB9, 0x80, 0x00, 0x00, 0x00, 0x66, 0xA1, 0x3E, 0x02,
0xE8, 0xCA, 0x08, 0x66, 0x0B, 0xC0, 0x0F, 0x84, 0xDA, 0x0B, 0x1E, 0x07,
0x66, 0x8B, 0x3E, 0x3E, 0x02, 0xE8, 0xDB, 0x05, 0x66, 0xA1, 0x3E, 0x02,
0x66, 0xBB, 0x80, 0x00, 0x00, 0x00, 0x66, 0xB9, 0x00, 0x00, 0x00, 0x00,
0x66, 0xBA, 0x00, 0x00, 0x00, 0x00, 0xE8, 0x80, 0x00, 0x66, 0x0B, 0xC0,
0x0F, 0x84, 0xB0, 0x0B, 0x67, 0x66, 0x0F, 0xB7, 0x58, 0x0C, 0x66, 0x81,
0xE3, 0xFF, 0x00, 0x00, 0x00, 0x0F, 0x85, 0xA5, 0x0B, 0x66, 0x8B, 0xD8,
0x68, 0x00, 0x20, 0x07, 0x66, 0x2B, 0xFF, 0x66, 0xA1, 0x3E, 0x02, 0xE8,
0x00, 0x01, 0x68, 0x00, 0x20, 0x07, 0x66, 0x2B, 0xFF, 0x66, 0xA1, 0x3E,
0x02, 0xE8, 0xAC, 0x0A, 0x8A, 0x16, 0x0E, 0x00, 0xB8, 0xE8, 0x03, 0x8E,
0xC0, 0x8D, 0x36, 0x0B, 0x00, 0x2B, 0xC0, 0x68, 0x00, 0x20, 0x50, 0xCB,
0x06, 0x1E, 0x66, 0x60, 0x66, 0x8B, 0xDA, 0x66, 0x0F, 0xB6, 0x0E, 0x0D,
0x00, 0x66, 0xF7, 0xE1, 0x66, 0xA3, 0x11, 0x00, 0x66, 0x8B, 0xC3, 0x66,
0xF7, 0xE1, 0xA3, 0x16, 0x00, 0x8B, 0xDF, 0x83, 0xE3, 0x0F, 0x8C, 0xC0,
0x66, 0xC1, 0xEF, 0x04, 0x03, 0xC7, 0x50, 0x07, 0xE8, 0x3E, 0xFC, 0x66,
0x61, 0x90, 0x1F, 0x07, 0xC3, 0x67, 0x03, 0x40, 0x14, 0x67, 0x66, 0x83,
0x38, 0xFF, 0x0F, 0x84, 0x4C, 0x00, 0x67, 0x66, 0x39, 0x18, 0x0F, 0x85,
0x33, 0x00, 0x66, 0x0B, 0xC9, 0x0F, 0x85, 0x0A, 0x00, 0x67, 0x80, 0x78,
0x09, 0x00, 0x0F, 0x85, 0x23, 0x00, 0xC3, 0x67, 0x3A, 0x48, 0x09, 0x0F,
0x85, 0x1A, 0x00, 0x66, 0x8B, 0xF0, 0x67, 0x03, 0x70, 0x0A, 0xE8, 0x97,
0x06, 0x66, 0x51, 0x1E, 0x07, 0x66, 0x8B, 0xFA, 0xF3, 0xA7, 0x66, 0x59,
0x0F, 0x85, 0x01, 0x00, 0xC3, 0x67, 0x66, 0x83, 0x78, 0x04, 0x00, 0x0F,
0x84, 0x07, 0x00, 0x67, 0x66, 0x03, 0x40, 0x04, 0xEB, 0xAB, 0x66, 0x2B,
0xC0, 0xC3, 0x66, 0x8B, 0xF3, 0xE8, 0x6C, 0x06, 0x67, 0x66, 0x03, 0x00,
0x67, 0xF7, 0x40, 0x0C, 0x02, 0x00, 0x0F, 0x85, 0x34, 0x00, 0x67, 0x66,
0x8D, 0x50, 0x10, 0x67, 0x3A, 0x4A, 0x40, 0x0F, 0x85, 0x18, 0x00, 0x67,
0x66, 0x8D, 0x72, 0x42, 0xE8, 0x49, 0x06, 0x66, 0x51, 0x1E, 0x07, 0x66,
0x8B, 0xFB, 0xF3, 0xA7, 0x66, 0x59, 0x0F, 0x85, 0x01, 0x00, 0xC3, 0x67,
0x83, 0x78, 0x08, 0x00, 0x0F, 0x84, 0x06, 0x00, 0x67, 0x03, 0x40, 0x08,
0xEB, 0xC2, 0x66, 0x33, 0xC0, 0xC3, 0x67, 0x80, 0x7B, 0x08, 0x00, 0x0F,
0x85, 0x1C, 0x00, 0x06, 0x1E, 0x66, 0x60, 0x67, 0x66, 0x8D, 0x53, 0x10,
0x67, 0x66, 0x8B, 0x0A, 0x66, 0x8B, 0xF3, 0x67, 0x03, 0x72, 0x04, 0xF3,
0xA4, 0x66, 0x61, 0x90, 0x1F, 0x07, 0xC3, 0x66, 0x50, 0x67, 0x66, 0x8D,
0x53, 0x10, 0x66, 0x85, 0xC0, 0x0F, 0x85, 0x0A, 0x00, 0x67, 0x66, 0x8B,
0x4A, 0x08, 0x66, 0x41, 0xEB, 0x11, 0x90, 0x67, 0x66, 0x8B, 0x42, 0x18,
0x66, 0x33, 0xD2, 0x66, 0xF7, 0x36, 0x52, 0x02, 0x66, 0x8B, 0xC8, 0x66,
0x2B, 0xC0, 0x66, 0x5E, 0xE8, 0x01, 0x00, 0xC3, 0x06, 0x1E, 0x66, 0x60,
0x67, 0x80, 0x7B, 0x08, 0x01, 0x0F, 0x84, 0x03, 0x00, 0xE9, 0x76, 0xFB,
0x66, 0x83, 0xF9, 0x00, 0x0F, 0x85, 0x06, 0x00, 0x66, 0x61, 0x90, 0x1F,
0x07, 0xC3, 0x66, 0x53, 0x66, 0x50, 0x66, 0x51, 0x66, 0x56, 0x66, 0x57,
0x06, 0xE8, 0x91, 0x04, 0x66, 0x8B, 0xD1, 0x07, 0x66, 0x5F, 0x66, 0x5E,
0x66, 0x59, 0x66, 0x85, 0xC0, 0x0F, 0x84, 0x34, 0x00, 0x66, 0x3B, 0xCA,
0x0F, 0x8D, 0x03, 0x00, 0x66, 0x8B, 0xD1, 0xE8, 0x82, 0xFE, 0x66, 0x2B,
0xCA, 0x66, 0x8B, 0xDA, 0x66, 0x8B, 0xC2, 0x66, 0x0F, 0xB6, 0x16, 0x0D,
0x00, 0x66, 0xF7, 0xE2, 0x66, 0x0F, 0xB7, 0x16, 0x0B, 0x00, 0x66, 0xF7,
0xE2, 0x66, 0x03, 0xF8, 0x66, 0x58, 0x66, 0x03, 0xC3, 0x66, 0x5B, 0xEB,
0x9F, 0x66, 0x85, 0xF6, 0x0F, 0x84, 0x0E, 0xFB, 0x66, 0x51, 0x66, 0x57,
0x06, 0x67, 0x66, 0x0F, 0xB6, 0x43, 0x09, 0x66, 0x85, 0xC0, 0x0F, 0x84,
0x20, 0x00, 0x66, 0xD1, 0xE0, 0x66, 0x2B, 0xE0, 0x66, 0x8B, 0xFC, 0x66,
0x54, 0x66, 0x56, 0x67, 0x66, 0x0F, 0xB7, 0x73, 0x0A, 0x66, 0x03, 0xF3,
0x66, 0x8B, 0xC8, 0xF3, 0xA4, 0x66, 0x5E, 0xEB, 0x03, 0x90, 0x66, 0x50,
0x66, 0x50, 0x67, 0x66, 0x8B, 0x03, 0x66, 0x50, 0x67, 0x66, 0x8B, 0x43,
0x18, 0x66, 0x50, 0x67, 0x66, 0x8B, 0x56, 0x20, 0x66, 0x85, 0xD2, 0x0F,
0x84, 0x0B, 0x00, 0x66, 0x8B, 0xFE, 0x1E, 0x07, 0x66, 0x8B, 0xC2, 0xE8,
0x71, 0x03, 0x66, 0x8B, 0xC6, 0x66, 0x5A, 0x66, 0x59, 0x66, 0x42, 0x66,
0x51, 0x66, 0x56, 0xE8, 0x3F, 0x06, 0x66, 0x85, 0xC0, 0x0F, 0x84, 0x9D,
0xFA, 0x66, 0x5E, 0x66, 0x59, 0x66, 0x8B, 0xFE, 0x1E, 0x07, 0xE8, 0x4E,
0x03, 0x66, 0x8B, 0xC6, 0x66, 0x8B, 0xD9, 0x66, 0x59, 0x66, 0x5A, 0x66,
0x51, 0x66, 0x56, 0x66, 0xD1, 0xE9, 0xE8, 0xF8, 0xFD, 0x66, 0x85, 0xC0,
0x0F, 0x84, 0x76, 0xFA, 0x66, 0x5E, 0x66, 0x59, 0x66, 0x03, 0xE1, 0x07,
0x66, 0x5F, 0x66, 0x59, 0x66, 0x8B, 0xD0, 0x66, 0x58, 0x66, 0x5B, 0x66,
0x8B, 0xDA, 0xE9, 0xF5, 0xFE, 0x06, 0x1E, 0x66, 0x60, 0x26, 0x67, 0x66,
0x0F, 0xB7, 0x5F, 0x04, 0x26, 0x67, 0x66, 0x0F, 0xB7, 0x4F, 0x06, 0x66,
0x0B, 0xC9, 0x0F, 0x84, 0x44, 0xFA, 0x66, 0x03, 0xDF, 0x66, 0x83, 0xC3,
0x02, 0x66, 0x81, 0xC7, 0xFE, 0x01, 0x00, 0x00, 0x66, 0x49, 0x66, 0x0B,
0xC9, 0x0F, 0x84, 0x17, 0x00, 0x26, 0x67, 0x8B, 0x03, 0x26, 0x67, 0x89,
0x07, 0x66, 0x83, 0xC3, 0x02, 0x66, 0x81, 0xC7, 0x00, 0x02, 0x00, 0x00,
0x66, 0x49, 0xEB, 0xE2, 0x66, 0x61, 0x90, 0x1F, 0x07, 0xC3, 0x06, 0x1E,
0x66, 0x60, 0x66, 0xB8, 0x01, 0x00, 0x00, 0x00, 0x66, 0xA3, 0x22, 0x02,
0x66, 0xA1, 0x1E, 0x02, 0x66, 0x03, 0x06, 0x66, 0x02, 0x66, 0xA3, 0x6A,
0x02, 0x66, 0x03, 0x06, 0x66, 0x02, 0x66, 0xA3, 0x4E, 0x02, 0x66, 0xA1,
0x30, 0x00, 0x66, 0x0F, 0xB6, 0x1E, 0x0D, 0x00, 0x66, 0xF7, 0xE3, 0x66,
0x8B, 0x1E, 0x4E, 0x02, 0x66, 0x89, 0x07, 0x66, 0xA3, 0x11, 0x00, 0x83,
0xC3, 0x04, 0x66, 0xA1, 0x56, 0x02, 0x66, 0x89, 0x07, 0xA3, 0x16, 0x00,
0x83, 0xC3, 0x04, 0x66, 0x89, 0x1E, 0x4E, 0x02, 0x66, 0x8B, 0x1E, 0x1E,
0x02, 0x1E, 0x07, 0xE8, 0x67, 0xF9, 0x66, 0x8B, 0xFB, 0xE8, 0x51, 0xFF,
0x66, 0xA1, 0x1E, 0x02, 0x66, 0xBB, 0x20, 0x00, 0x00, 0x00, 0x66, 0xB9,
0x00, 0x00, 0x00, 0x00, 0x66, 0xBA, 0x00, 0x00, 0x00, 0x00, 0xE8, 0x10,
0xFD, 0x66, 0x0B, 0xC0, 0x0F, 0x84, 0x19, 0x01, 0x66, 0x8B, 0xD8, 0x1E,
0x07, 0x66, 0x8B, 0x3E, 0x1A, 0x02, 0x66, 0x33, 0xC0, 0xE8, 0xA2, 0xFD,
0x66, 0x8B, 0x1E, 0x1A, 0x02, 0x66, 0x81, 0x3F, 0x80, 0x00, 0x00, 0x00,
0x0F, 0x84, 0xEB, 0x00, 0x03, 0x5F, 0x04, 0xEB, 0xF0, 0x66, 0x53, 0x66,
0x8B, 0x47, 0x10, 0x66, 0xF7, 0x26, 0x56, 0x02, 0x66, 0x50, 0x66, 0x33,
0xD2, 0x66, 0x0F, 0xB6, 0x1E, 0x0D, 0x00, 0x66, 0xF7, 0xF3, 0x66, 0x52,
0xE8, 0xDC, 0x00, 0x66, 0x0B, 0xC0, 0x0F, 0x84, 0x44, 0xF9, 0x66, 0x8B,
0x0E, 0x56, 0x02, 0x66, 0x0F, 0xB6, 0x1E, 0x0D, 0x00, 0x66, 0xF7, 0xE3,
0x66, 0x5A, 0x66, 0x03, 0xC2, 0x66, 0x8B, 0x1E, 0x4E, 0x02, 0x66, 0x89,
0x07, 0x83, 0xC3, 0x04, 0x66, 0x0F, 0xB6, 0x06, 0x0D, 0x00, 0x66, 0x2B,
0xC2, 0x66, 0x3B, 0xC1, 0x0F, 0x86, 0x03, 0x00, 0x66, 0x8B, 0xC1, 0x66,
0x89, 0x07, 0x66, 0x2B, 0xC8, 0x66, 0x5A, 0x0F, 0x84, 0x75, 0x00, 0x66,
0x03, 0xC2, 0x66, 0x50, 0x66, 0x33, 0xD2, 0x66, 0x0F, 0xB6, 0x1E, 0x0D,
0x00, 0x66, 0xF7, 0xF3, 0x66, 0x51, 0xE8, 0x82, 0x00, 0x66, 0x59, 0x66,
0x0B, 0xC0, 0x0F, 0x84, 0xE8, 0xF8, 0x66, 0x0F, 0xB6, 0x1E, 0x0D, 0x00,
0x66, 0xF7, 0xE3, 0x66, 0x8B, 0x1E, 0x4E, 0x02, 0x66, 0x8B, 0x17, 0x83,
0xC3, 0x04, 0x66, 0x03, 0x17, 0x66, 0x3B, 0xD0, 0x0F, 0x85, 0x15, 0x00,
0x66, 0x0F, 0xB6, 0x06, 0x0D, 0x00, 0x66, 0x3B, 0xC1, 0x0F, 0x86, 0x03,
0x00, 0x66, 0x8B, 0xC1, 0x66, 0x01, 0x07, 0xEB, 0xA5, 0x83, 0xC3, 0x04,
0x66, 0x89, 0x1E, 0x4E, 0x02, 0x66, 0x89, 0x07, 0x83, 0xC3, 0x04, 0x66,
0x0F, 0xB6, 0x06, 0x0D, 0x00, 0x66, 0x3B, 0xC1, 0x0F, 0x86, 0x03, 0x00,
0x66, 0x8B, 0xC1, 0x66, 0x89, 0x07, 0xEB, 0x82, 0x83, 0xC3, 0x04, 0x66,
0xFF, 0x06, 0x22, 0x02, 0x66, 0x89, 0x1E, 0x4E, 0x02, 0x66, 0x5B, 0x03,
0x5F, 0x04, 0x66, 0x81, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x0C,
0xFF, 0x66, 0x61, 0x90, 0x1F, 0x07, 0xC3, 0x66, 0x8B, 0xD0, 0x66, 0x8B,
0x0E, 0x22, 0x02, 0x66, 0x8B, 0x36, 0x6A, 0x02, 0x66, 0x03, 0x36, 0x66,
0x02, 0x66, 0x52, 0x66, 0x51, 0x66, 0x52, 0x66, 0x8B, 0x1E, 0x6A, 0x02,
0x66, 0x8B, 0x3E, 0x56, 0x02, 0x66, 0x8B, 0x04, 0x66, 0xA3, 0x11, 0x00,
0x83, 0xC6, 0x04, 0x66, 0x8B, 0x04, 0xA3, 0x16, 0x00, 0x83, 0xC6, 0x04,
0x1E, 0x07, 0xE8, 0xE8, 0xF7, 0x66, 0x2B, 0xF8, 0x0F, 0x84, 0x08, 0x00,
0xF7, 0x26, 0x0B, 0x00, 0x03, 0xD8, 0xEB, 0xD9, 0x66, 0x8B, 0x3E, 0x6A,
0x02, 0x1E, 0x07, 0xE8, 0xBF, 0xFD, 0x66, 0xA1, 0x6A, 0x02, 0x66, 0xBB,
0x80, 0x00, 0x00, 0x00, 0x66, 0xB9, 0x00, 0x00, 0x00, 0x00, 0x66, 0x8B,
0xD1, 0xE8, 0x81, 0xFB, 0x66, 0x0B, 0xC0, 0x0F, 0x84, 0xFF, 0xF7, 0x66,
0x8B, 0xD8, 0x66, 0x58, 0x66, 0x56, 0xE8, 0x2C, 0x01, 0x66, 0x5E, 0x66,
0x0B, 0xC0, 0x0F, 0x84, 0x05, 0x00, 0x66, 0x5B, 0x66, 0x5B, 0xC3, 0x66,
0x59, 0x66, 0x5A, 0xE2, 0x84, 0x66, 0x33, 0xC0, 0xC3, 0x06, 0x1E, 0x66,
0x60, 0x66, 0x50, 0x66, 0x51, 0x66, 0x33, 0xD2, 0x66, 0x0F, 0xB6, 0x1E,
0x0D, 0x00, 0x66, 0xF7, 0xF3, 0x66, 0x52, 0x66, 0x57, 0xE8, 0x53, 0xFF,
0x66, 0x5F, 0x66, 0x0B, 0xC0, 0x0F, 0x84, 0xB9, 0xF7, 0x66, 0x0F, 0xB6,
0x1E, 0x0D, 0x00, 0x66, 0xF7, 0xE3, 0x66, 0x5A, 0x66, 0x03, 0xC2, 0x66,
0xA3, 0x11, 0x00, 0x66, 0x59, 0x66, 0x0F, 0xB6, 0x1E, 0x0D, 0x00, 0x66,
0x3B, 0xCB, 0x0F, 0x8E, 0x13, 0x00, 0x89, 0x1E, 0x16, 0x00, 0x66, 0x2B,
0xCB, 0x66, 0x58, 0x66, 0x03, 0xC3, 0x66, 0x50, 0x66, 0x51, 0xEB, 0x14,
0x90, 0x66, 0x58, 0x66, 0x03, 0xC1, 0x66, 0x50, 0x89, 0x0E, 0x16, 0x00,
0x66, 0xB9, 0x00, 0x00, 0x00, 0x00, 0x66, 0x51, 0x06, 0x66, 0x57, 0x8B,
0xDF, 0x83, 0xE3, 0x0F, 0x8C, 0xC0, 0x66, 0xC1, 0xEF, 0x04, 0x03, 0xC7,
0x50, 0x07, 0xE8, 0x10, 0xF7, 0x66, 0x5F, 0x07, 0x66, 0x03, 0x3E, 0x52,
0x02, 0x66, 0x59, 0x66, 0x58, 0x66, 0x83, 0xF9, 0x00, 0x0F, 0x8F, 0x70,
0xFF, 0x66, 0x61, 0x90, 0x1F, 0x07, 0xC3, 0x06, 0x1E, 0x66, 0x60, 0x66,
0xF7, 0x26, 0x56, 0x02, 0x66, 0x8B, 0x0E, 0x56, 0x02, 0xE8, 0x55, 0xFF,
0xE8, 0xD2, 0xFC, 0x66, 0x61, 0x90, 0x1F, 0x07, 0xC3, 0x06, 0x1E, 0x66,
0x60, 0x66, 0xF7, 0x26, 0x72, 0x02, 0x66, 0x8B, 0x1E, 0x36, 0x02, 0x66,
0x8B, 0x0E, 0x72, 0x02, 0x66, 0x8B, 0x36, 0x2A, 0x02, 0x1E, 0x07, 0x66,
0x8B, 0x3E, 0x46, 0x02, 0xE8, 0x81, 0xFB, 0xE8, 0xA7, 0xFC, 0x66, 0x61,
0x90, 0x1F, 0x07, 0xC3, 0x66, 0x50, 0x66, 0x53, 0x66, 0x51, 0x66, 0x8B,
0x1E, 0x4A, 0x02, 0x66, 0x8B, 0xC8, 0x66, 0xC1, 0xE8, 0x03, 0x66, 0x83,
0xE1, 0x07, 0x66, 0x03, 0xD8, 0x66, 0xB8, 0x01, 0x00, 0x00, 0x00, 0x66,
0xD3, 0xE0, 0x67, 0x84, 0x03, 0x0F, 0x84, 0x04, 0x00, 0xF8, 0xEB, 0x02,
0x90, 0xF9, 0x66, 0x59, 0x66, 0x5B, 0x66, 0x58, 0xC3, 0x67, 0x80, 0x7B,
0x08, 0x01, 0x0F, 0x84, 0x04, 0x00, 0x66, 0x2B, 0xC0, 0xC3, 0x67, 0x66,
0x8D, 0x73, 0x10, 0x67, 0x66, 0x8B, 0x56, 0x08, 0x66, 0x3B, 0xC2, 0x0F,
0x87, 0x0B, 0x00, 0x67, 0x66, 0x8B, 0x16, 0x66, 0x3B, 0xC2, 0x0F, 0x83,
0x04, 0x00, 0x66, 0x2B, 0xC0, 0xC3, 0x67, 0x03, 0x5E, 0x10, 0x66, 0x2B,
0xF6, 0x67, 0x80, 0x3B, 0x00, 0x0F, 0x84, 0x3E, 0x00, 0xE8, 0x81, 0x00,
0x66, 0x03, 0xF1, 0xE8, 0x39, 0x00, 0x66, 0x03, 0xCA, 0x66, 0x3B, 0xC1,
0x0F, 0x8C, 0x21, 0x00, 0x66, 0x8B, 0xD1, 0x66, 0x50, 0x67, 0x66, 0x0F,
0xB6, 0x0B, 0x66, 0x8B, 0xC1, 0x66, 0x83, 0xE0, 0x0F, 0x66, 0xC1, 0xE9,
0x04, 0x66, 0x03, 0xD9, 0x66, 0x03, 0xD8, 0x66, 0x43, 0x66, 0x58, 0xEB,
0xC4, 0x66, 0x2B, 0xC8, 0x66, 0x2B, 0xC2, 0x66, 0x03, 0xC6, 0xC3, 0x66,
0x2B, 0xC0, 0xC3, 0x66, 0x2B, 0xC9, 0x67, 0x8A, 0x0B, 0x80, 0xE1, 0x0F,
0x66, 0x83, 0xF9, 0x00, 0x0F, 0x85, 0x04, 0x00, 0x66, 0x2B, 0xC9, 0xC3,
0x66, 0x53, 0x66, 0x52, 0x66, 0x03, 0xD9, 0x67, 0x66, 0x0F, 0xBE, 0x13,
0x66, 0x49, 0x66, 0x4B, 0x66, 0x83, 0xF9, 0x00, 0x0F, 0x84, 0x0D, 0x00,
0x66, 0xC1, 0xE2, 0x08, 0x67, 0x8A, 0x13, 0x66, 0x4B, 0x66, 0x49, 0xEB,
0xEB, 0x66, 0x8B, 0xCA, 0x66, 0x5A, 0x66, 0x5B, 0xC3, 0x66, 0x53, 0x66,
0x52, 0x66, 0x2B, 0xD2, 0x67, 0x8A, 0x13, 0x66, 0x83, 0xE2, 0x0F, 0x66,
0x2B, 0xC9, 0x67, 0x8A, 0x0B, 0xC0, 0xE9, 0x04, 0x66, 0x83, 0xF9, 0x00,
0x0F, 0x85, 0x08, 0x00, 0x66, 0x2B, 0xC9, 0x66, 0x5A, 0x66, 0x5B, 0xC3,
0x66, 0x03, 0xDA, 0x66, 0x03, 0xD9, 0x67, 0x66, 0x0F, 0xBE, 0x13, 0x66,
0x49, 0x66, 0x4B, 0x66, 0x83, 0xF9, 0x00, 0x0F, 0x84, 0x0D, 0x00, 0x66,
0xC1, 0xE2, 0x08, 0x67, 0x8A, 0x13, 0x66, 0x4B, 0x66, 0x49, 0xEB, 0xEB,
0x66, 0x8B, 0xCA, 0x66, 0x5A, 0x66, 0x5B, 0xC3, 0x66, 0x0B, 0xC9, 0x0F,
0x85, 0x01, 0x00, 0xC3, 0x66, 0x51, 0x66, 0x56, 0x67, 0x83, 0x3E, 0x61,
0x0F, 0x8C, 0x0C, 0x00, 0x67, 0x83, 0x3E, 0x7A, 0x0F, 0x8F, 0x04, 0x00,
0x67, 0x83, 0x2E, 0x20, 0x66, 0x83, 0xC6, 0x02, 0xE2, 0xE6, 0x66, 0x5E,
0x66, 0x59, 0xC3, 0x66, 0x50, 0x66, 0x51, 0x66, 0x8B, 0xD0, 0x66, 0xA1,
0x32, 0x02, 0x67, 0x66, 0x8D, 0x58, 0x10, 0x67, 0x03, 0x43, 0x04, 0x67,
0x66, 0x8D, 0x40, 0x10, 0x66, 0x8B, 0xDA, 0xE8, 0x44, 0xF9, 0x66, 0x0B,
0xC0, 0x0F, 0x84, 0x05, 0x00, 0x66, 0x59, 0x66, 0x59, 0xC3, 0x66, 0xA1,
0x36, 0x02, 0x66, 0x0B, 0xC0, 0x0F, 0x85, 0x08, 0x00, 0x66, 0x59, 0x66,
0x59, 0x66, 0x33, 0xC0, 0xC3, 0x66, 0x8B, 0x16, 0x36, 0x02, 0x67, 0x66,
0x8D, 0x52, 0x10, 0x67, 0x66, 0x8B, 0x42, 0x18, 0x66, 0x33, 0xD2, 0x66,
0xF7, 0x36, 0x6E, 0x02, 0x66, 0x33, 0xF6, 0x66, 0x50, 0x66, 0x56, 0x66,
0x58, 0x66, 0x5E, 0x66, 0x3B, 0xC6, 0x0F, 0x84, 0x3A, 0x00, 0x66, 0x56,
0x66, 0x40, 0x66, 0x50, 0x66, 0x48, 0xE8, 0x1B, 0xFE, 0x72, 0xE8, 0xE8,
0xEB, 0xFD, 0x66, 0x5A, 0x66, 0x5E, 0x66, 0x59, 0x66, 0x5B, 0x66, 0x53,
0x66, 0x51, 0x66, 0x56, 0x66, 0x52, 0x66, 0xA1, 0x46, 0x02, 0x67, 0x66,
0x8D, 0x40, 0x18, 0xE8, 0xD0, 0xF8, 0x66, 0x0B, 0xC0, 0x74, 0xC4, 0x66,
0x59, 0x66, 0x59, 0x66, 0x59, 0x66, 0x59, 0xC3, 0x66, 0x59, 0x66, 0x59,
0x66, 0x33, 0xC0, 0xC3, 0x66, 0x51, 0x66, 0x50, 0x66, 0xB8, 0x05, 0x00,
0x00, 0x00, 0x1E, 0x07, 0x66, 0x8B, 0xF9, 0xE8, 0x8D, 0xFD, 0x66, 0x8B,
0xC1, 0x66, 0xBB, 0x20, 0x00, 0x00, 0x00, 0x66, 0xB9, 0x00, 0x00, 0x00,
0x00, 0x66, 0xBA, 0x00, 0x00, 0x00, 0x00, 0xE8, 0x33, 0xF8, 0x66, 0x5B,
0x66, 0x59, 0x66, 0x85, 0xC0, 0x0F, 0x85, 0x15, 0x00, 0x66, 0x8B, 0xC1,
0x66, 0x0F, 0xB7, 0x0E, 0x10, 0x02, 0x66, 0xBA, 0x12, 0x02, 0x00, 0x00,
0xE8, 0x16, 0xF8, 0xEB, 0x33, 0x90, 0x66, 0x33, 0xD2, 0x66, 0x8B, 0xC1,
0x66, 0x8B, 0xCB, 0x66, 0x50, 0x66, 0x53, 0xE8, 0x23, 0x00, 0x66, 0x5B,
0x66, 0x5F, 0x66, 0x0B, 0xC0, 0x0F, 0x84, 0x17, 0x00, 0x1E, 0x07, 0xE8,
0x35, 0xFD, 0x66, 0x8B, 0xC7, 0x66, 0x0F, 0xB7, 0x0E, 0x10, 0x02, 0x66,
0xBA, 0x12, 0x02, 0x00, 0x00, 0xE8, 0xE1, 0xF7, 0xC3, 0x66, 0x52, 0x66,
0x51, 0x66, 0xBB, 0x20, 0x00, 0x00, 0x00, 0x66, 0xB9, 0x00, 0x00, 0x00,
0x00, 0x66, 0xBA, 0x00, 0x00, 0x00, 0x00, 0xE8, 0xC7, 0xF7, 0x66, 0x0B,
0xC0, 0x0F, 0x84, 0x63, 0x00, 0x66, 0x8B, 0xD8, 0x1E, 0x07, 0x66, 0x8B,
0x3E, 0x1A, 0x02, 0x66, 0x33, 0xC0, 0xE8, 0x59, 0xF8, 0x1E, 0x07, 0x66,
0x8B, 0x1E, 0x1A, 0x02, 0x66, 0x59, 0x66, 0x5A, 0x26, 0x66, 0x39, 0x0F,
0x0F, 0x85, 0x0C, 0x00, 0x26, 0x66, 0x39, 0x57, 0x08, 0x0F, 0x84, 0x31,
0x00, 0xEB, 0x13, 0x90, 0x26, 0x66, 0x83, 0x3F, 0xFF, 0x0F, 0x84, 0x2F,
0x00, 0x26, 0x83, 0x7F, 0x04, 0x00, 0x0F, 0x84, 0x26, 0x00, 0x26, 0x66,
0x0F, 0xB7, 0x47, 0x04, 0x03, 0xD8, 0x8B, 0xC3, 0x25, 0x00, 0x80, 0x74,
0xCB, 0x8C, 0xC0, 0x05, 0x00, 0x08, 0x8E, 0xC0, 0x81, 0xE3, 0xFF, 0x7F,
0xEB, 0xBE, 0x26, 0x66, 0x8B, 0x47, 0x10, 0xC3, 0x66, 0x59, 0x66, 0x5A,
0x66, 0x33, 0xC0, 0xC3, 0x66, 0x50, 0x66, 0x51, 0x66, 0x8B, 0xC7, 0x66,
0xC1, 0xE8, 0x04, 0x06, 0x59, 0x03, 0xC8, 0x51, 0x07, 0x66, 0x83, 0xE7,
0x0F, 0x66, 0x59, 0x66, 0x58, 0xC3, 0x60, 0x06, 0xBE, 0xBD, 0x0D, 0xBF,
0x00, 0x20, 0x1E, 0x07, 0xB9, 0x0D, 0x00, 0x90, 0xF3, 0xA5, 0x07, 0x61,
0xC3, 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0xFE, 0xDC, 0xBA,
0x98, 0x76, 0x54, 0x32, 0x10, 0xF0, 0xE1, 0xD2, 0xC3, 0x00, 0x00, 0x00,
0x00, 0x20, 0x20, 0x60, 0x8B, 0x36, 0x18, 0x20, 0x26, 0x8A, 0x05, 0x88,
0x04, 0x47, 0x46, 0x66, 0xFF, 0x06, 0x14, 0x20, 0x81, 0xFE, 0x60, 0x20,
0x75, 0x06, 0xE8, 0x5B, 0x00, 0xBE, 0x20, 0x20, 0xE2, 0xE6, 0x89, 0x36,
0x18, 0x20, 0x61, 0xC3, 0x66, 0x60, 0x8B, 0x36, 0x18, 0x20, 0xB0, 0x80,
0x88, 0x04, 0x46, 0x32, 0xC0, 0x81, 0xFE, 0x60, 0x20, 0x75, 0x06, 0xE8,
0x3A, 0x00, 0xBE, 0x20, 0x20, 0x81, 0xFE, 0x58, 0x20, 0x75, 0xE9, 0x66,
0x33, 0xC0, 0x66, 0xA3, 0x58, 0x20, 0x66, 0xA1, 0x14, 0x20, 0x66, 0xC1,
0xE0, 0x03, 0x66, 0x0F, 0xC8, 0x66, 0xA3, 0x5C, 0x20, 0xE8, 0x18, 0x00,
0xBB, 0x00, 0x20, 0x66, 0x8B, 0x07, 0x66, 0x0F, 0xC8, 0x66, 0x89, 0x07,
0x83, 0xC3, 0x04, 0x81, 0xFB, 0x34, 0x20, 0x75, 0xEE, 0x66, 0x61, 0xC3,
0x66, 0x60, 0xBB, 0x20, 0x20, 0x66, 0x8B, 0x07, 0x66, 0x0F, 0xC8, 0x66,
0x89, 0x07, 0x83, 0xC3, 0x04, 0x81, 0xFB, 0x60, 0x20, 0x75, 0xEE, 0xBB,
0x00, 0x20, 0x66, 0x8B, 0x0F, 0x66, 0x8B, 0x57, 0x04, 0x66, 0x8B, 0x77,
0x08, 0x66, 0x8B, 0x7F, 0x0C, 0x66, 0x8B, 0x6F, 0x10, 0xBB, 0x20, 0x20,
0xC7, 0x06, 0x1A, 0x20, 0x30, 0x0F, 0xC6, 0x06, 0x1C, 0x20, 0x14, 0x90,
0x53, 0x8B, 0x1E, 0x1A, 0x20, 0xFF, 0x17, 0x66, 0x03, 0x47, 0x02, 0x5B,
0x66, 0x03, 0xE8, 0x66, 0x03, 0x2F, 0x66, 0x8B, 0xC1, 0x66, 0xC1, 0xC0,
0x05, 0x66, 0x03, 0xC5, 0x66, 0x8B, 0xEF, 0x66, 0x8B, 0xFE, 0x66, 0x8B,
0xF2, 0x66, 0xC1, 0xC6, 0x1E, 0x66, 0x8B, 0xD1, 0x66, 0x8B, 0xC8, 0x66,
0x8B, 0x07, 0x66, 0x33, 0x47, 0x08, 0x66, 0x33, 0x47, 0x20, 0x66, 0x33,
0x47, 0x34, 0x66, 0xD1, 0xC0, 0x66, 0x89, 0x47, 0x40, 0x83, 0xC3, 0x04,
0xFE, 0x0E, 0x1C, 0x20, 0x75, 0xB2, 0x83, 0x06, 0x1A, 0x20, 0x06, 0x81,
0x3E, 0x1A, 0x20, 0x48, 0x0F, 0x75, 0x9F, 0xBB, 0x00, 0x20, 0x66, 0x01,
0x0F, 0x66, 0x01, 0x57, 0x04, 0x66, 0x01, 0x77, 0x08, 0x66, 0x01, 0x7F,
0x0C, 0x66, 0x01, 0x6F, 0x10, 0x66, 0x61, 0xC3, 0x66, 0x8B, 0xC6, 0x66,
0x33, 0xC7, 0x66, 0x23, 0xC2, 0x66, 0x33, 0xC7, 0xC3, 0x66, 0x8B, 0xC2,
0x66, 0x33, 0xC6, 0x66, 0x33, 0xC7, 0xC3, 0x66, 0x53, 0x66, 0x8B, 0xC2,
0x66, 0x23, 0xC6, 0x66, 0x8B, 0xDA, 0x66, 0x23, 0xDF, 0x66, 0x0B, 0xC3,
0x66, 0x8B, 0xDE, 0x66, 0x23, 0xDF, 0x66, 0x0B, 0xC3, 0x66, 0x5B, 0xC3,
0xFC, 0x0E, 0x99, 0x79, 0x82, 0x5A, 0x09, 0x0F, 0xA1, 0xEB, 0xD9, 0x6E,
0x13, 0x0F, 0xDC, 0xBC, 0x1B, 0x8F, 0x09, 0x0F, 0xD6, 0xC1, 0x62, 0xCA,
0x06, 0x1E, 0x66, 0x60, 0x66, 0x33, 0xDB, 0xB8, 0x00, 0xBB, 0xCD, 0x1A,
0x66, 0x23, 0xC0, 0x0F, 0x85, 0xBB, 0x00, 0x66, 0x81, 0xFB, 0x54, 0x43,
0x50, 0x41, 0x0F, 0x85, 0xB0, 0x00, 0x81, 0xF9, 0x02, 0x01, 0x0F, 0x82,
0xA8, 0x00, 0x66, 0x61, 0x90, 0x1F, 0x07, 0x06, 0x1E, 0x66, 0x60, 0x67,
0x80, 0x7B, 0x08, 0x00, 0x0F, 0x85, 0x0C, 0x00, 0x67, 0x66, 0x8D, 0x53,
0x10, 0x67, 0x66, 0x8B, 0x0A, 0xEB, 0x25, 0x90, 0x67, 0x66, 0x8D, 0x53,
0x10, 0x67, 0x66, 0x8B, 0x4A, 0x28, 0x66, 0x81, 0xF9, 0x00, 0x00, 0x08,
0x00, 0x0F, 0x83, 0x0C, 0x00, 0x67, 0x66, 0x8B, 0x42, 0x2C, 0x66, 0x23,
0xC0, 0x0F, 0x84, 0x03, 0x00, 0x66, 0x33, 0xC9, 0x0E, 0x1F, 0xE8, 0xF5,
0xFD, 0x66, 0x23, 0xC9, 0x0F, 0x84, 0x32, 0x00, 0x66, 0xBA, 0x00, 0x80,
0x00, 0x00, 0x66, 0x3B, 0xCA, 0x0F, 0x86, 0x1F, 0x00, 0x66, 0x2B, 0xCA,
0x06, 0x66, 0x51, 0x66, 0x57, 0x66, 0x52, 0x66, 0x8B, 0xCA, 0xE8, 0xB7,
0xFD, 0xE8, 0xFB, 0xFD, 0x66, 0x5A, 0x66, 0x5F, 0x66, 0x59, 0x07, 0x66,
0x03, 0xFA, 0xEB, 0xDA, 0xE8, 0xA5, 0xFD, 0xE8, 0xE9, 0xFD, 0xE8, 0x0B,
0xFE, 0x0E, 0x07, 0x66, 0xBB, 0x54, 0x43, 0x50, 0x41, 0x66, 0xBF, 0x00,
0x20, 0x00, 0x00, 0x66, 0xB9, 0x14, 0x00, 0x00, 0x00, 0x66, 0xB8, 0x07,
0xBB, 0x00, 0x00, 0x66, 0xBA, 0x0A, 0x00, 0x00, 0x00, 0x66, 0x33, 0xF6,
0xCD, 0x1A, 0x66, 0x61, 0x90, 0x1F, 0x07, 0xC3, 0xA0, 0xF9, 0x01, 0xE9,
0x4B, 0xF1, 0xA0, 0xFA, 0x01, 0xE9, 0x45, 0xF1
};

View file

@ -2,7 +2,7 @@
#define FILE_H #define FILE_H
/* Max valid value of uiLen for contains_data */ /* Max valid value of uiLen for contains_data */
#define MAX_DATA_LEN 4096 #define MAX_DATA_LEN 8192
/* Checks if a file contains a data pattern of length uiLen at position /* Checks if a file contains a data pattern of length uiLen at position
ulPositoin. The file pointer will change when calling this function! */ ulPositoin. The file pointer will change when calling this function! */

23
src/ms-sys/inc/ntfs.h Normal file
View file

@ -0,0 +1,23 @@
#ifndef NTFS_H
#define NTFS_H
#include <stdio.h>
/* returns TRUE if the file has an NFTS file system, otherwise FALSE.
The file position will change when this function is called! */
int is_ntfs_fs(FILE *fp);
/* returns TRUE if the file has a NTFS boot record, otherwise FALSE.
The file position will change when this function is called! */
int is_ntfs_br(FILE *fp);
/* returns TRUE if the file has an exact match of the NTFS boot record
this program would create, otherwise FALSE.
The file position will change when this function is called! */
int entire_ntfs_br_matches(FILE *fp);
/* Writes a FAT32 DOS boot record to a file, returns TRUE on success, otherwise
FALSE */
int write_ntfs_br(FILE *fp);
#endif

67
src/ms-sys/ntfs.c Normal file
View file

@ -0,0 +1,67 @@
/******************************************************************
Copyright (C) 2012 Pete Batard <pete@akeo.ie>
Based on fat16.c Copyright (C) 2009 Henrik Carlqvist
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 2 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, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
******************************************************************/
#include <stdio.h>
#include <string.h>
#include "file.h"
#include "ntfs.h"
int is_ntfs_fs(FILE *fp)
{
char *szMagic = "NTFS";
return contains_data(fp, 0x6F, szMagic, strlen(szMagic));
} /* is_ntfs_fs */
int is_ntfs_br(FILE *fp)
{
/* A "file" is probably some kind of NTFS boot record if it contains the
magic chars 0x55, 0xAA at positions 0x1FE */
unsigned char aucRef[] = {0x55, 0xAA};
unsigned char aucMagic[] = {'N','T','F','S','0','0','0','0'};
if( ! contains_data(fp, 0x1FE, aucRef, sizeof(aucRef)))
return 0;
if( ! contains_data(fp, 0x03, aucMagic, sizeof(aucMagic)))
return 0;
return 1;
} /* is_ntfs_br */
int entire_ntfs_br_matches(FILE *fp)
{
#include "br_ntfs_0x0.h"
#include "br_ntfs_0x54.h"
return
( contains_data(fp, 0x0, br_ntfs_0x0, sizeof(br_ntfs_0x0)) &&
/* BIOS Parameter Block might differ between systems */
contains_data(fp, 0x54, br_ntfs_0x54, sizeof(br_ntfs_0x54)) );
} /* entire_ntfs_br_matches */
int write_ntfs_br(FILE *fp)
{
#include "br_ntfs_0x0.h"
#include "br_ntfs_0x54.h"
return
( write_data(fp, 0x0, br_ntfs_0x0, sizeof(br_ntfs_0x0)) &&
/* BIOS Parameter Block should not be overwritten */
write_data(fp, 0x54, br_ntfs_0x54, sizeof(br_ntfs_0x54)) );
} /* write_ntsf_br */

View file

@ -453,7 +453,7 @@ BOOL CreatePartition(HANDLE hDrive)
BOOL r; BOOL r;
DWORD size; DWORD size;
PrintStatus(0, "Partitioning..."); PrintStatus(0, TRUE, "Partitioning...");
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
DriveLayoutEx->Mbr.Signature = GetTickCount(); DriveLayoutEx->Mbr.Signature = GetTickCount();
@ -625,7 +625,7 @@ static void InitProgress(void)
} }
if (IsChecked(IDC_DOS)) { if (IsChecked(IDC_DOS)) {
// 1 extra slot for PBR writing // 1 extra slot for PBR writing
// TODO: switch // TODO: ISO
switch (ComboBox_GetItemData(hDOSType, ComboBox_GetCurSel(hDOSType))) { switch (ComboBox_GetItemData(hDOSType, ComboBox_GetCurSel(hDOSType))) {
case DT_WINME: case DT_WINME:
nb_slots[OP_DOS] = 3+1; nb_slots[OP_DOS] = 3+1;
@ -861,8 +861,8 @@ static void EnableControls(BOOL bEnable)
EnableWindow(GetDlgItem(hMainDialog, IDC_QUICKFORMAT), bEnable); EnableWindow(GetDlgItem(hMainDialog, IDC_QUICKFORMAT), bEnable);
if (bEnable) { if (bEnable) {
fs = (int)ComboBox_GetItemData(hFileSystem, ComboBox_GetCurSel(hFileSystem)); fs = (int)ComboBox_GetItemData(hFileSystem, ComboBox_GetCurSel(hFileSystem));
EnableWindow(GetDlgItem(hMainDialog, IDC_DOS), (fs == FS_FAT16) || (fs == FS_FAT32)); EnableWindow(GetDlgItem(hMainDialog, IDC_DOS), (fs == FS_FAT16) || (fs == FS_FAT32) || (fs == FS_NTFS));
EnableWindow(GetDlgItem(hMainDialog, IDC_DOSTYPE), (fs == FS_FAT16) || (fs == FS_FAT32)); EnableWindow(GetDlgItem(hMainDialog, IDC_DOSTYPE), (fs == FS_FAT16) || (fs == FS_FAT32) || (fs == FS_NTFS));
} else { } else {
EnableWindow(GetDlgItem(hMainDialog, IDC_DOS), FALSE); EnableWindow(GetDlgItem(hMainDialog, IDC_DOS), FALSE);
EnableWindow(GetDlgItem(hMainDialog, IDC_DOSTYPE), FALSE); EnableWindow(GetDlgItem(hMainDialog, IDC_DOSTYPE), FALSE);
@ -870,6 +870,8 @@ static void EnableControls(BOOL bEnable)
EnableWindow(GetDlgItem(hMainDialog, IDC_BADBLOCKS), bEnable); EnableWindow(GetDlgItem(hMainDialog, IDC_BADBLOCKS), bEnable);
EnableWindow(GetDlgItem(hMainDialog, IDC_ABOUT), bEnable); EnableWindow(GetDlgItem(hMainDialog, IDC_ABOUT), bEnable);
EnableWindow(GetDlgItem(hMainDialog, IDC_START), bEnable); EnableWindow(GetDlgItem(hMainDialog, IDC_START), bEnable);
EnableWindow(GetDlgItem(hMainDialog, IDC_SELECT_ISO), bEnable);
EnableWindow(GetDlgItem(hMainDialog, IDC_NBPASSES), bEnable);
SetDlgItemTextA(hMainDialog, IDCANCEL, bEnable?"Close":"Cancel"); SetDlgItemTextA(hMainDialog, IDCANCEL, bEnable?"Close":"Cancel");
} }
@ -903,7 +905,8 @@ BOOL CALLBACK ISOProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
switch (LOWORD(wParam)) { switch (LOWORD(wParam)) {
case IDC_ISO_ABORT: case IDC_ISO_ABORT:
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_CANCELLED; FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_CANCELLED;
PrintStatus(0, "Cancelling - please wait..."); PrintStatus(0, FALSE, "Cancelling - please wait...");
uprintf("ISO: USER CANCEL\n");
return TRUE; return TRUE;
} }
case WM_CLOSE: // prevent closure using Alt-F4 case WM_CLOSE: // prevent closure using Alt-F4
@ -917,11 +920,11 @@ void __cdecl ISOScanThread(void* param)
{ {
int i; int i;
// ExtractISO(ISO_IMAGE, ISO_DEST, TRUE); // ExtractISO(ISO_IMAGE, ISO_DEST, TRUE);
PrintStatus(0, "Scanning ISO image..."); PrintStatus(0, TRUE, "Scanning ISO image...\n");
ExtractISO(iso_path, "", TRUE); ExtractISO(iso_path, "", TRUE);
uprintf("Projected size: %lld\nHas 4GB: %s\n", iso_report.projected_size, iso_report.has_4GB_file?"TRUE":"FALSE"); uprintf("Projected size: %lld\nHas 4GB: %s\n", iso_report.projected_size, iso_report.has_4GB_file?"TRUE":"FALSE");
for (i=safe_strlen(iso_path); (i>=0)&&(iso_path[i] != '\\'); i--); for (i=safe_strlen(iso_path); (i>=0)&&(iso_path[i] != '\\'); i--);
PrintStatus(0, "Using ISO: '%s'", &iso_path[i+1]); PrintStatus(0, TRUE, "Using ISO: '%s'\n", &iso_path[i+1]);
_endthread(); _endthread();
} }
@ -1083,7 +1086,8 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
// Operation may have completed in the meantime // Operation may have completed in the meantime
if (format_thid != -1L) { if (format_thid != -1L) {
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_CANCELLED; FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_CANCELLED;
PrintStatus(0, "Cancelling - please wait..."); PrintStatus(0, FALSE, "Cancelling - please wait...");
uprintf("USER CANCEL\n");
} }
} }
return (INT_PTR)TRUE; return (INT_PTR)TRUE;
@ -1117,7 +1121,7 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
case IDC_DEVICE: case IDC_DEVICE:
switch (HIWORD(wParam)) { switch (HIWORD(wParam)) {
case CBN_SELCHANGE: case CBN_SELCHANGE:
PrintStatus(0, "%d device%s found.", ComboBox_GetCount(hDeviceList), PrintStatus(0, TRUE, "%d device%s found.", ComboBox_GetCount(hDeviceList),
(ComboBox_GetCount(hDeviceList)!=1)?"s":""); (ComboBox_GetCount(hDeviceList)!=1)?"s":"");
PopulateProperties(ComboBox_GetCurSel(hDeviceList)); PopulateProperties(ComboBox_GetCurSel(hDeviceList));
break; break;
@ -1127,7 +1131,6 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
if (HIWORD(wParam) != CBN_SELCHANGE) if (HIWORD(wParam) != CBN_SELCHANGE)
break; break;
fs = (int)ComboBox_GetItemData(hFileSystem, ComboBox_GetCurSel(hFileSystem)); fs = (int)ComboBox_GetItemData(hFileSystem, ComboBox_GetCurSel(hFileSystem));
uprintf("fs = %d\n", fs);
SetClusterSizes(fs); SetClusterSizes(fs);
if (((fs == FS_EXFAT) || (fs <0)) && IsWindowEnabled(hDOS)) { if (((fs == FS_EXFAT) || (fs <0)) && IsWindowEnabled(hDOS)) {
// unlikely to be supported by BIOSes => don't bother // unlikely to be supported by BIOSes => don't bother
@ -1250,12 +1253,12 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
EnableControls(TRUE); EnableControls(TRUE);
GetUSBDevices(); GetUSBDevices();
if (!IS_ERROR(FormatStatus)) { if (!IS_ERROR(FormatStatus)) {
PrintStatus(0, "DONE"); PrintStatus(0, FALSE, "DONE");
} else if (SCODE_CODE(FormatStatus) == ERROR_CANCELLED) { } else if (SCODE_CODE(FormatStatus) == ERROR_CANCELLED) {
PrintStatus(0, "Cancelled"); PrintStatus(0, FALSE, "Cancelled");
Notification(MSG_INFO, "Cancelled", "Operation cancelled by the user."); Notification(MSG_INFO, "Cancelled", "Operation cancelled by the user.");
} else { } else {
PrintStatus(0, "FAILED"); PrintStatus(0, FALSE, "FAILED");
Notification(MSG_ERROR, "Error", "Error: %s", StrError(FormatStatus)); Notification(MSG_ERROR, "Error", "Error: %s", StrError(FormatStatus));
} }
if (FormatStatus) { if (FormatStatus) {
@ -1332,7 +1335,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
#ifdef DISABLE_AUTORUN #ifdef DISABLE_AUTORUN
// 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)
if ((msg.message == WM_SYSKEYDOWN) && (msg.wParam == 'D')) { if ((msg.message == WM_SYSKEYDOWN) && (msg.wParam == 'D')) {
PrintStatus(0, "NoDriveTypeAutorun will be deleted on exit."); PrintStatus(0, FALSE, "NoDriveTypeAutorun will be deleted on exit.");
existing_key = FALSE; existing_key = FALSE;
continue; continue;
} }

View file

@ -174,7 +174,7 @@ extern RUFUS_ISO_REPORT iso_report;
*/ */
extern const char *WindowsErrorString(void); extern const char *WindowsErrorString(void);
extern void DumpBufferHex(void *buf, size_t size); extern void DumpBufferHex(void *buf, size_t size);
extern void PrintStatus(unsigned int duration, const char *format, ...); extern void PrintStatus(unsigned int duration, BOOL debug, const char *format, ...);
extern void UpdateProgress(int op, float percent); extern void UpdateProgress(int op, float percent);
extern const char* StrError(DWORD error_code); extern const char* StrError(DWORD error_code);
extern void CenterDialog(HWND hDlg); extern void CenterDialog(HWND hDlg);

View file

@ -33,7 +33,7 @@ LANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL
IDD_DIALOG DIALOGEX 12, 12, 206, 278 IDD_DIALOG DIALOGEX 12, 12, 206, 278
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_APPWINDOW EXSTYLE WS_EX_APPWINDOW
CAPTION "Rufus v1.0.7.124" CAPTION "Rufus v1.0.7.125"
FONT 8, "MS Shell Dlg", 400, 0, 0x1 FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN BEGIN
DEFPUSHBUTTON "Start",IDC_START,94,236,50,14 DEFPUSHBUTTON "Start",IDC_START,94,236,50,14
@ -71,7 +71,7 @@ BEGIN
DEFPUSHBUTTON "OK",IDOK,231,175,50,14,WS_GROUP 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, CONTROL "<a href=""http://rufus.akeo.ie"">http://rufus.akeo.ie</a>",IDC_ABOUT_RUFUS_URL,
"SysLink",WS_TABSTOP,46,47,114,9 "SysLink",WS_TABSTOP,46,47,114,9
LTEXT "Version 1.0.7 (Build 124)",IDC_STATIC,46,19,78,8 LTEXT "Version 1.0.7 (Build 125)",IDC_STATIC,46,19,78,8
PUSHBUTTON "License...",IDC_ABOUT_LICENSE,46,175,50,14,WS_GROUP 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 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 LTEXT "Report bugs or request enhancements at:",IDC_STATIC,46,66,187,8
@ -222,8 +222,8 @@ END
// //
VS_VERSION_INFO VERSIONINFO VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,0,7,124 FILEVERSION 1,0,7,125
PRODUCTVERSION 1,0,7,124 PRODUCTVERSION 1,0,7,125
FILEFLAGSMASK 0x3fL FILEFLAGSMASK 0x3fL
#ifdef _DEBUG #ifdef _DEBUG
FILEFLAGS 0x1L FILEFLAGS 0x1L
@ -240,13 +240,13 @@ BEGIN
BEGIN BEGIN
VALUE "CompanyName", "akeo.ie" VALUE "CompanyName", "akeo.ie"
VALUE "FileDescription", "Rufus" VALUE "FileDescription", "Rufus"
VALUE "FileVersion", "1.0.7.124" VALUE "FileVersion", "1.0.7.125"
VALUE "InternalName", "Rufus" VALUE "InternalName", "Rufus"
VALUE "LegalCopyright", "© 2011 Pete Batard (GPL v3)" VALUE "LegalCopyright", "© 2011 Pete Batard (GPL v3)"
VALUE "LegalTrademarks", "http://www.gnu.org/copyleft/gpl.html" VALUE "LegalTrademarks", "http://www.gnu.org/copyleft/gpl.html"
VALUE "OriginalFilename", "rufus.exe" VALUE "OriginalFilename", "rufus.exe"
VALUE "ProductName", "Rufus" VALUE "ProductName", "Rufus"
VALUE "ProductVersion", "1.0.7.124" VALUE "ProductVersion", "1.0.7.125"
END END
END END
BLOCK "VarFileInfo" BLOCK "VarFileInfo"

View file

@ -137,7 +137,7 @@ static void CALLBACK PrintStatusTimeout(HWND hwnd, UINT uMsg, UINT_PTR idEvent,
KillTimer(hMainDialog, TID_MESSAGE); KillTimer(hMainDialog, TID_MESSAGE);
} }
void PrintStatus(unsigned int duration, const char *format, ...) void PrintStatus(unsigned int duration, BOOL debug, const char *format, ...)
{ {
char *p = szStatusMessage; char *p = szStatusMessage;
va_list args; va_list args;
@ -154,6 +154,9 @@ void PrintStatus(unsigned int duration, const char *format, ...)
*p = '\0'; *p = '\0';
if (debug)
uprintf("%s\n", szStatusMessage);
if ((duration) || (!bStatusTimerArmed)) { if ((duration) || (!bStatusTimerArmed)) {
SetDlgItemTextU(hMainDialog, IDC_STATUS, szStatusMessage); SetDlgItemTextU(hMainDialog, IDC_STATUS, szStatusMessage);
} }