mirror of
https://github.com/pbatard/rufus.git
synced 2024-08-14 23:57:05 +00:00
[misc] refactoring and cleanup - part 1
* add stdfn.c and move the relevant standard calls there * move most of GetDriveInfo() to drive.c * rename IDC_DOS/hDos to IDC_BOOT/hBoot
This commit is contained in:
parent
c8acf1b84a
commit
bba1772940
16 changed files with 555 additions and 496 deletions
|
@ -172,6 +172,7 @@
|
||||||
<ClCompile Include="..\net.c" />
|
<ClCompile Include="..\net.c" />
|
||||||
<ClCompile Include="..\parser.c" />
|
<ClCompile Include="..\parser.c" />
|
||||||
<ClCompile Include="..\rufus.c" />
|
<ClCompile Include="..\rufus.c" />
|
||||||
|
<ClCompile Include="..\stdfn.c" />
|
||||||
<ClCompile Include="..\stdio.c" />
|
<ClCompile Include="..\stdio.c" />
|
||||||
<ClCompile Include="..\stdlg.c" />
|
<ClCompile Include="..\stdlg.c" />
|
||||||
<ClCompile Include="..\syslinux.c" />
|
<ClCompile Include="..\syslinux.c" />
|
||||||
|
|
|
@ -57,6 +57,9 @@
|
||||||
<ClCompile Include="..\vhd.c">
|
<ClCompile Include="..\vhd.c">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\stdfn.c">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="..\rufus.h">
|
<ClInclude Include="..\rufus.h">
|
||||||
|
|
|
@ -31,6 +31,7 @@ SXS_APPLICATION_MANIFEST=..\common_controls_and_elevation.manifest
|
||||||
SOURCES=rufus.c \
|
SOURCES=rufus.c \
|
||||||
format.c \
|
format.c \
|
||||||
stdio.c \
|
stdio.c \
|
||||||
|
stdfn.c \
|
||||||
stdlg.c \
|
stdlg.c \
|
||||||
icon.c \
|
icon.c \
|
||||||
parser.c \
|
parser.c \
|
||||||
|
|
|
@ -9,7 +9,7 @@ pkg_v_rc_0 = @echo " RC $@";
|
||||||
%_rc.o: %.rc
|
%_rc.o: %.rc
|
||||||
$(pkg_v_rc)$(WINDRES) $(AM_RCFLAGS) -i $< -o $@
|
$(pkg_v_rc)$(WINDRES) $(AM_RCFLAGS) -i $< -o $@
|
||||||
|
|
||||||
rufus_SOURCES = drive.c icon.c parser.c iso.c net.c dos.c dos_locale.c badblocks.c syslinux.c vhd.c format.c stdio.c stdlg.c rufus.c
|
rufus_SOURCES = drive.c icon.c parser.c iso.c net.c dos.c dos_locale.c badblocks.c syslinux.c vhd.c format.c stdio.c stdfn.c stdlg.c rufus.c
|
||||||
rufus_CFLAGS = -I./ms-sys/inc -I./syslinux/libfat -I./syslinux/libinstaller -I./libcdio $(AM_CFLAGS)
|
rufus_CFLAGS = -I./ms-sys/inc -I./syslinux/libfat -I./syslinux/libinstaller -I./libcdio $(AM_CFLAGS)
|
||||||
rufus_LDFLAGS = $(AM_LDFLAGS) -mwindows
|
rufus_LDFLAGS = $(AM_LDFLAGS) -mwindows
|
||||||
rufus_LDADD = rufus_rc.o ms-sys/libmssys.a syslinux/libfat/libfat.a syslinux/libinstaller/libinstaller.a \
|
rufus_LDADD = rufus_rc.o ms-sys/libmssys.a syslinux/libfat/libfat.a syslinux/libinstaller/libinstaller.a \
|
||||||
|
|
|
@ -48,8 +48,8 @@ am_rufus_OBJECTS = rufus-drive.$(OBJEXT) rufus-icon.$(OBJEXT) \
|
||||||
rufus-dos.$(OBJEXT) rufus-dos_locale.$(OBJEXT) \
|
rufus-dos.$(OBJEXT) rufus-dos_locale.$(OBJEXT) \
|
||||||
rufus-badblocks.$(OBJEXT) rufus-syslinux.$(OBJEXT) \
|
rufus-badblocks.$(OBJEXT) rufus-syslinux.$(OBJEXT) \
|
||||||
rufus-vhd.$(OBJEXT) rufus-format.$(OBJEXT) \
|
rufus-vhd.$(OBJEXT) rufus-format.$(OBJEXT) \
|
||||||
rufus-stdio.$(OBJEXT) rufus-stdlg.$(OBJEXT) \
|
rufus-stdio.$(OBJEXT) rufus-stdfn.$(OBJEXT) \
|
||||||
rufus-rufus.$(OBJEXT)
|
rufus-stdlg.$(OBJEXT) rufus-rufus.$(OBJEXT)
|
||||||
rufus_OBJECTS = $(am_rufus_OBJECTS)
|
rufus_OBJECTS = $(am_rufus_OBJECTS)
|
||||||
rufus_DEPENDENCIES = rufus_rc.o ms-sys/libmssys.a \
|
rufus_DEPENDENCIES = rufus_rc.o ms-sys/libmssys.a \
|
||||||
syslinux/libfat/libfat.a syslinux/libinstaller/libinstaller.a \
|
syslinux/libfat/libfat.a syslinux/libinstaller/libinstaller.a \
|
||||||
|
@ -184,7 +184,7 @@ SUBDIRS = ms-sys syslinux/libfat syslinux/libinstaller libcdio/iso9660 libcdio/u
|
||||||
pkg_v_rc = $(pkg_v_rc_$(V))
|
pkg_v_rc = $(pkg_v_rc_$(V))
|
||||||
pkg_v_rc_ = $(pkg_v_rc_$(AM_DEFAULT_VERBOSITY))
|
pkg_v_rc_ = $(pkg_v_rc_$(AM_DEFAULT_VERBOSITY))
|
||||||
pkg_v_rc_0 = @echo " RC $@";
|
pkg_v_rc_0 = @echo " RC $@";
|
||||||
rufus_SOURCES = drive.c icon.c parser.c iso.c net.c dos.c dos_locale.c badblocks.c syslinux.c vhd.c format.c stdio.c stdlg.c rufus.c
|
rufus_SOURCES = drive.c icon.c parser.c iso.c net.c dos.c dos_locale.c badblocks.c syslinux.c vhd.c format.c stdio.c stdfn.c stdlg.c rufus.c
|
||||||
rufus_CFLAGS = -I./ms-sys/inc -I./syslinux/libfat -I./syslinux/libinstaller -I./libcdio $(AM_CFLAGS)
|
rufus_CFLAGS = -I./ms-sys/inc -I./syslinux/libfat -I./syslinux/libinstaller -I./libcdio $(AM_CFLAGS)
|
||||||
rufus_LDFLAGS = $(AM_LDFLAGS) -mwindows
|
rufus_LDFLAGS = $(AM_LDFLAGS) -mwindows
|
||||||
rufus_LDADD = rufus_rc.o ms-sys/libmssys.a syslinux/libfat/libfat.a syslinux/libinstaller/libinstaller.a \
|
rufus_LDADD = rufus_rc.o ms-sys/libmssys.a syslinux/libfat/libfat.a syslinux/libinstaller/libinstaller.a \
|
||||||
|
@ -341,6 +341,14 @@ rufus-stdio.obj: stdio.c
|
||||||
$(AM_V_CC) @AM_BACKSLASH@
|
$(AM_V_CC) @AM_BACKSLASH@
|
||||||
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rufus_CFLAGS) $(CFLAGS) -c -o rufus-stdio.obj `if test -f 'stdio.c'; then $(CYGPATH_W) 'stdio.c'; else $(CYGPATH_W) '$(srcdir)/stdio.c'; fi`
|
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rufus_CFLAGS) $(CFLAGS) -c -o rufus-stdio.obj `if test -f 'stdio.c'; then $(CYGPATH_W) 'stdio.c'; else $(CYGPATH_W) '$(srcdir)/stdio.c'; fi`
|
||||||
|
|
||||||
|
rufus-stdfn.o: stdfn.c
|
||||||
|
$(AM_V_CC) @AM_BACKSLASH@
|
||||||
|
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rufus_CFLAGS) $(CFLAGS) -c -o rufus-stdfn.o `test -f 'stdfn.c' || echo '$(srcdir)/'`stdfn.c
|
||||||
|
|
||||||
|
rufus-stdfn.obj: stdfn.c
|
||||||
|
$(AM_V_CC) @AM_BACKSLASH@
|
||||||
|
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rufus_CFLAGS) $(CFLAGS) -c -o rufus-stdfn.obj `if test -f 'stdfn.c'; then $(CYGPATH_W) 'stdfn.c'; else $(CYGPATH_W) '$(srcdir)/stdfn.c'; fi`
|
||||||
|
|
||||||
rufus-stdlg.o: stdlg.c
|
rufus-stdlg.o: stdlg.c
|
||||||
$(AM_V_CC) @AM_BACKSLASH@
|
$(AM_V_CC) @AM_BACKSLASH@
|
||||||
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rufus_CFLAGS) $(CFLAGS) -c -o rufus-stdlg.o `test -f 'stdlg.c' || echo '$(srcdir)/'`stdlg.c
|
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rufus_CFLAGS) $(CFLAGS) -c -o rufus-stdlg.o `test -f 'stdlg.c' || echo '$(srcdir)/'`stdlg.c
|
||||||
|
|
|
@ -451,7 +451,7 @@ BOOL ExtractFreeDOS(const char* path)
|
||||||
|
|
||||||
BOOL ExtractDOS(const char* path)
|
BOOL ExtractDOS(const char* path)
|
||||||
{
|
{
|
||||||
switch(ComboBox_GetItemData(hDOSType, ComboBox_GetCurSel(hDOSType))) {
|
switch(ComboBox_GetItemData(hBootType, ComboBox_GetCurSel(hBootType))) {
|
||||||
case DT_WINME:
|
case DT_WINME:
|
||||||
return ExtractMSDOS(path);
|
return ExtractMSDOS(path);
|
||||||
case DT_FREEDOS:
|
case DT_FREEDOS:
|
||||||
|
|
97
src/drive.c
97
src/drive.c
|
@ -190,6 +190,103 @@ BOOL GetDriveLabel(DWORD DriveIndex, char* letter, char** label)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Fill the drive properties (size, FS, etc)
|
||||||
|
*/
|
||||||
|
BOOL GetDrivePartitionData(DWORD DeviceNumber, char* FileSystemName, DWORD FileSystemNameSize)
|
||||||
|
{
|
||||||
|
BOOL r;
|
||||||
|
HANDLE hDrive;
|
||||||
|
DWORD size;
|
||||||
|
BYTE geometry[128], layout[1024], part_type;
|
||||||
|
void* disk_geometry = (void*)geometry;
|
||||||
|
void* drive_layout = (void*)layout;
|
||||||
|
PDISK_GEOMETRY_EX DiskGeometry = (PDISK_GEOMETRY_EX)disk_geometry;
|
||||||
|
PDRIVE_LAYOUT_INFORMATION_EX DriveLayout = (PDRIVE_LAYOUT_INFORMATION_EX)drive_layout;
|
||||||
|
char DrivePath[] = "#:\\", tmp[256];
|
||||||
|
DWORD i, nb_partitions = 0;
|
||||||
|
|
||||||
|
hDrive = GetDriveHandle(DeviceNumber, DrivePath, FALSE, FALSE);
|
||||||
|
if (hDrive == INVALID_HANDLE_VALUE)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
r = DeviceIoControl(hDrive, IOCTL_DISK_GET_DRIVE_GEOMETRY_EX,
|
||||||
|
NULL, 0, geometry, sizeof(geometry), &size, NULL);
|
||||||
|
if (!r || size <= 0) {
|
||||||
|
uprintf("IOCTL_DISK_GET_DRIVE_GEOMETRY_EX failed for drive %c: %s\n", DrivePath[0], WindowsErrorString());
|
||||||
|
safe_closehandle(hDrive);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
SelectedDrive.DiskSize = DiskGeometry->DiskSize.QuadPart;
|
||||||
|
memcpy(&SelectedDrive.Geometry, &DiskGeometry->Geometry, sizeof(DISK_GEOMETRY));
|
||||||
|
uprintf("Sector Size: %d bytes\n", DiskGeometry->Geometry.BytesPerSector);
|
||||||
|
uprintf("Cylinders: %lld, TracksPerCylinder: %d, SectorsPerTrack: %d\n",
|
||||||
|
DiskGeometry->Geometry.Cylinders, DiskGeometry->Geometry.TracksPerCylinder, DiskGeometry->Geometry.SectorsPerTrack);
|
||||||
|
|
||||||
|
r = DeviceIoControl(hDrive, IOCTL_DISK_GET_DRIVE_LAYOUT_EX,
|
||||||
|
NULL, 0, layout, sizeof(layout), &size, NULL );
|
||||||
|
if (!r || size <= 0) {
|
||||||
|
uprintf("IOCTL_DISK_GET_DRIVE_LAYOUT_EX failed for drive %c: %s\n", DrivePath[0], WindowsErrorString());
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (DriveLayout->PartitionStyle) {
|
||||||
|
case PARTITION_STYLE_MBR:
|
||||||
|
SelectedDrive.PartitionType = PARTITION_STYLE_MBR;
|
||||||
|
for (i=0; i<DriveLayout->PartitionCount; i++) {
|
||||||
|
if (DriveLayout->PartitionEntry[i].Mbr.PartitionType != PARTITION_ENTRY_UNUSED) {
|
||||||
|
nb_partitions++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
uprintf("Partition type: MBR, NB Partitions: %d\n", nb_partitions);
|
||||||
|
uprintf("Disk ID: 0x%08X\n", DriveLayout->Mbr.Signature);
|
||||||
|
for (i=0; i<DriveLayout->PartitionCount; i++) {
|
||||||
|
if (DriveLayout->PartitionEntry[i].Mbr.PartitionType != PARTITION_ENTRY_UNUSED) {
|
||||||
|
uprintf("Partition %d:\n", DriveLayout->PartitionEntry[i].PartitionNumber);
|
||||||
|
part_type = DriveLayout->PartitionEntry[i].Mbr.PartitionType;
|
||||||
|
uprintf(" Type: %s (0x%02x)\r\n Size: %s (%lld bytes)\r\n Start Sector: %d, Boot: %s, Recognized: %s\n",
|
||||||
|
GetPartitionType(part_type), part_type, SizeToHumanReadable(DriveLayout->PartitionEntry[i].PartitionLength),
|
||||||
|
DriveLayout->PartitionEntry[i].PartitionLength, DriveLayout->PartitionEntry[i].Mbr.HiddenSectors,
|
||||||
|
DriveLayout->PartitionEntry[i].Mbr.BootIndicator?"Yes":"No",
|
||||||
|
DriveLayout->PartitionEntry[i].Mbr.RecognizedPartition?"Yes":"No");
|
||||||
|
if (part_type == 0xee) // Flag a protective MBR for non GPT platforms (XP)
|
||||||
|
SelectedDrive.has_protective_mbr = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case PARTITION_STYLE_GPT:
|
||||||
|
SelectedDrive.PartitionType = PARTITION_STYLE_GPT;
|
||||||
|
uprintf("Partition type: GPT, NB Partitions: %d\n", DriveLayout->PartitionCount);
|
||||||
|
uprintf("Disk GUID: %s\n", GuidToString(&DriveLayout->Gpt.DiskId));
|
||||||
|
uprintf("Max parts: %d, Start Offset: %lld, Usable = %lld bytes\n",
|
||||||
|
DriveLayout->Gpt.MaxPartitionCount, DriveLayout->Gpt.StartingUsableOffset.QuadPart, DriveLayout->Gpt.UsableLength.QuadPart);
|
||||||
|
for (i=0; i<DriveLayout->PartitionCount; i++) {
|
||||||
|
nb_partitions++;
|
||||||
|
tmp[0] = 0;
|
||||||
|
wchar_to_utf8_no_alloc(DriveLayout->PartitionEntry[i].Gpt.Name, tmp, sizeof(tmp));
|
||||||
|
uprintf("Partition %d:\r\n Type: %s\r\n Name: '%s'\n", DriveLayout->PartitionEntry[i].PartitionNumber,
|
||||||
|
GuidToString(&DriveLayout->PartitionEntry[i].Gpt.PartitionType), tmp);
|
||||||
|
uprintf(" ID: %s\r\n Size: %s (%lld bytes)\r\n Start Sector: %lld, Attributes: 0x%016llX\n",
|
||||||
|
GuidToString(&DriveLayout->PartitionEntry[i].Gpt.PartitionId), SizeToHumanReadable(DriveLayout->PartitionEntry[i].PartitionLength),
|
||||||
|
DriveLayout->PartitionEntry[i].PartitionLength, DriveLayout->PartitionEntry[i].StartingOffset.QuadPart / DiskGeometry->Geometry.BytesPerSector,
|
||||||
|
DriveLayout->PartitionEntry[i].Gpt.Attributes);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
SelectedDrive.PartitionType = PARTITION_STYLE_MBR;
|
||||||
|
uprintf("Partition type: RAW\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
safe_closehandle(hDrive);
|
||||||
|
|
||||||
|
// Populate the filesystem data
|
||||||
|
if (!GetVolumeInformationA(DrivePath, NULL, 0, NULL, NULL, NULL, FileSystemName, FileSystemNameSize)) {
|
||||||
|
FileSystemName[0] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
BOOL UnmountDrive(HANDLE hDrive)
|
BOOL UnmountDrive(HANDLE hDrive)
|
||||||
{
|
{
|
||||||
DWORD size;
|
DWORD size;
|
||||||
|
|
12
src/format.c
12
src/format.c
|
@ -849,7 +849,7 @@ static BOOL WriteMBR(HANDLE hPhysicalDrive)
|
||||||
buf[0x1c2] = 0x0c;
|
buf[0x1c2] = 0x0c;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (IsChecked(IDC_DOS)) {
|
if (IsChecked(IDC_BOOT)) {
|
||||||
// Set first partition bootable - masquerade as per the DiskID selected
|
// Set first partition bootable - masquerade as per the DiskID selected
|
||||||
buf[0x1be] = (IsChecked(IDC_RUFUS_MBR))?(BYTE)ComboBox_GetItemData(hDiskID, ComboBox_GetCurSel(hDiskID)):0x80;
|
buf[0x1be] = (IsChecked(IDC_RUFUS_MBR))?(BYTE)ComboBox_GetItemData(hDiskID, ComboBox_GetCurSel(hDiskID)):0x80;
|
||||||
uprintf("Set bootable USB partition as 0x%02X\n", buf[0x1be]);
|
uprintf("Set bootable USB partition as 0x%02X\n", buf[0x1be]);
|
||||||
|
@ -864,7 +864,7 @@ static BOOL WriteMBR(HANDLE hPhysicalDrive)
|
||||||
fake_fd._ptr = (char*)hPhysicalDrive;
|
fake_fd._ptr = (char*)hPhysicalDrive;
|
||||||
fake_fd._bufsiz = SelectedDrive.Geometry.BytesPerSector;
|
fake_fd._bufsiz = SelectedDrive.Geometry.BytesPerSector;
|
||||||
fs = (int)ComboBox_GetItemData(hFileSystem, ComboBox_GetCurSel(hFileSystem));
|
fs = (int)ComboBox_GetItemData(hFileSystem, ComboBox_GetCurSel(hFileSystem));
|
||||||
dt = (int)ComboBox_GetItemData(hDOSType, ComboBox_GetCurSel(hDOSType));
|
dt = (int)ComboBox_GetItemData(hBootType, ComboBox_GetCurSel(hBootType));
|
||||||
if ( (dt == DT_SYSLINUX) || ((dt == DT_ISO) && ((fs == FS_FAT16) || (fs == FS_FAT32))) ) {
|
if ( (dt == DT_SYSLINUX) || ((dt == DT_ISO) && ((fs == FS_FAT16) || (fs == FS_FAT32))) ) {
|
||||||
r = write_syslinux_mbr(&fake_fd);
|
r = write_syslinux_mbr(&fake_fd);
|
||||||
} else {
|
} else {
|
||||||
|
@ -889,7 +889,7 @@ static BOOL WritePBR(HANDLE hLogicalVolume)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
FILE fake_fd = { 0 };
|
FILE fake_fd = { 0 };
|
||||||
BOOL bFreeDOS = (ComboBox_GetItemData(hDOSType, ComboBox_GetCurSel(hDOSType)) == DT_FREEDOS);
|
BOOL bFreeDOS = (ComboBox_GetItemData(hBootType, ComboBox_GetCurSel(hBootType)) == DT_FREEDOS);
|
||||||
|
|
||||||
fake_fd._ptr = (char*)hLogicalVolume;
|
fake_fd._ptr = (char*)hLogicalVolume;
|
||||||
fake_fd._bufsiz = SelectedDrive.Geometry.BytesPerSector;
|
fake_fd._bufsiz = SelectedDrive.Geometry.BytesPerSector;
|
||||||
|
@ -1123,7 +1123,7 @@ DWORD WINAPI FormatThread(LPVOID param)
|
||||||
FILE* log_fd;
|
FILE* log_fd;
|
||||||
|
|
||||||
fs = (int)ComboBox_GetItemData(hFileSystem, ComboBox_GetCurSel(hFileSystem));
|
fs = (int)ComboBox_GetItemData(hFileSystem, ComboBox_GetCurSel(hFileSystem));
|
||||||
dt = (int)ComboBox_GetItemData(hDOSType, ComboBox_GetCurSel(hDOSType));
|
dt = (int)ComboBox_GetItemData(hBootType, ComboBox_GetCurSel(hBootType));
|
||||||
pt = GETPARTTYPE((int)ComboBox_GetItemData(hPartitionScheme, ComboBox_GetCurSel(hPartitionScheme)));
|
pt = GETPARTTYPE((int)ComboBox_GetItemData(hPartitionScheme, ComboBox_GetCurSel(hPartitionScheme)));
|
||||||
bt = GETBIOSTYPE((int)ComboBox_GetItemData(hPartitionScheme, ComboBox_GetCurSel(hPartitionScheme)));
|
bt = GETBIOSTYPE((int)ComboBox_GetItemData(hPartitionScheme, ComboBox_GetCurSel(hPartitionScheme)));
|
||||||
|
|
||||||
|
@ -1250,7 +1250,7 @@ DWORD WINAPI FormatThread(LPVOID param)
|
||||||
UpdateProgress(OP_FIX_MBR, -1.0f);
|
UpdateProgress(OP_FIX_MBR, -1.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IsChecked(IDC_DOS)) {
|
if (IsChecked(IDC_BOOT)) {
|
||||||
if (bt == BT_UEFI) {
|
if (bt == BT_UEFI) {
|
||||||
// For once, no need to do anything - just check our sanity
|
// For once, no need to do anything - just check our sanity
|
||||||
if ( (dt != DT_ISO) || (!IS_EFI(iso_report)) || (fs > FS_FAT32) ) {
|
if ( (dt != DT_ISO) || (!IS_EFI(iso_report)) || (fs > FS_FAT32) ) {
|
||||||
|
@ -1294,7 +1294,7 @@ DWORD WINAPI FormatThread(LPVOID param)
|
||||||
if (!RemountVolume(drive_name[0]))
|
if (!RemountVolume(drive_name[0]))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if (IsChecked(IDC_DOS)) {
|
if (IsChecked(IDC_BOOT)) {
|
||||||
if ((dt == DT_WINME) || (dt == DT_FREEDOS)) {
|
if ((dt == DT_WINME) || (dt == DT_FREEDOS)) {
|
||||||
UpdateProgress(OP_DOS, -1.0f);
|
UpdateProgress(OP_DOS, -1.0f);
|
||||||
PrintStatus(0, TRUE, "Copying DOS files...");
|
PrintStatus(0, TRUE, "Copying DOS files...");
|
||||||
|
|
|
@ -54,10 +54,10 @@
|
||||||
#define IDC_ABOUT 1007
|
#define IDC_ABOUT 1007
|
||||||
#define IDC_LABEL 1008
|
#define IDC_LABEL 1008
|
||||||
#define IDC_QUICKFORMAT 1009
|
#define IDC_QUICKFORMAT 1009
|
||||||
#define IDC_DOS 1010
|
#define IDC_BOOT 1010
|
||||||
#define IDC_BADBLOCKS 1011
|
#define IDC_BADBLOCKS 1011
|
||||||
#define IDC_PROGRESS 1012
|
#define IDC_PROGRESS 1012
|
||||||
#define IDC_DOSTYPE 1013
|
#define IDC_BOOTTYPE 1013
|
||||||
#define IDC_NBPASSES 1014
|
#define IDC_NBPASSES 1014
|
||||||
#define IDC_TEST 1015
|
#define IDC_TEST 1015
|
||||||
#define IDC_SELECT_ISO 1016
|
#define IDC_SELECT_ISO 1016
|
||||||
|
|
321
src/rufus.c
321
src/rufus.c
|
@ -102,7 +102,7 @@ char szFolderPath[MAX_PATH], app_dir[MAX_PATH];
|
||||||
char* iso_path = NULL;
|
char* iso_path = NULL;
|
||||||
float fScale = 1.0f;
|
float fScale = 1.0f;
|
||||||
int default_fs;
|
int default_fs;
|
||||||
HWND hDeviceList, hPartitionScheme, hFileSystem, hClusterSize, hLabel, hDOSType, hNBPasses, hLog = NULL;
|
HWND hDeviceList, hPartitionScheme, hFileSystem, hClusterSize, hLabel, hBootType, hNBPasses, hLog = NULL;
|
||||||
HWND hISOProgressDlg = NULL, hLogDlg = NULL, hISOProgressBar, hISOFileName, hDiskID;
|
HWND hISOProgressDlg = NULL, hLogDlg = NULL, hISOProgressBar, hISOFileName, hDiskID;
|
||||||
BOOL use_own_c32[NB_OLD_C32] = {FALSE, FALSE}, detect_fakes = TRUE, mbr_selected_by_user = FALSE;
|
BOOL use_own_c32[NB_OLD_C32] = {FALSE, FALSE}, detect_fakes = TRUE, mbr_selected_by_user = FALSE;
|
||||||
BOOL iso_op_in_progress = FALSE, format_op_in_progress = FALSE;
|
BOOL iso_op_in_progress = FALSE, format_op_in_progress = FALSE;
|
||||||
|
@ -112,7 +112,7 @@ RUFUS_UPDATE update = { {0,0,0,0}, {0,0}, NULL, NULL};
|
||||||
extern char szStatusMessage[256];
|
extern char szStatusMessage[256];
|
||||||
|
|
||||||
static HANDLE format_thid = NULL;
|
static HANDLE format_thid = NULL;
|
||||||
static HWND hProgress = NULL, hDOS = NULL, hSelectISO = NULL;
|
static HWND hProgress = NULL, hBoot = NULL, hSelectISO = NULL;
|
||||||
static HICON hIconDisc, hIconDown, hIconUp;
|
static HICON hIconDisc, hIconDown, hIconUp;
|
||||||
static StrArray DriveID, DriveLabel;
|
static StrArray DriveID, DriveLabel;
|
||||||
static char szTimer[12] = "00:00:00";
|
static char szTimer[12] = "00:00:00";
|
||||||
|
@ -319,101 +319,23 @@ static BOOL SetClusterSizes(int FSType)
|
||||||
*/
|
*/
|
||||||
static BOOL GetDriveInfo(int ComboIndex)
|
static BOOL GetDriveInfo(int ComboIndex)
|
||||||
{
|
{
|
||||||
BOOL r;
|
DWORD i;
|
||||||
HANDLE hDrive;
|
char fs_type[32];
|
||||||
DWORD size;
|
|
||||||
BYTE geometry[128], layout[1024], part_type;
|
|
||||||
void* disk_geometry = (void*)geometry;
|
|
||||||
void* drive_layout = (void*)layout;
|
|
||||||
PDISK_GEOMETRY_EX DiskGeometry = (PDISK_GEOMETRY_EX)disk_geometry;
|
|
||||||
PDRIVE_LAYOUT_INFORMATION_EX DriveLayout = (PDRIVE_LAYOUT_INFORMATION_EX)drive_layout;
|
|
||||||
char DrivePath[] = "#:\\", tmp[256], fs_type[32];
|
|
||||||
DWORD i, nb_partitions = 0;
|
|
||||||
|
|
||||||
memset(&SelectedDrive, 0, sizeof(SelectedDrive));
|
memset(&SelectedDrive, 0, sizeof(SelectedDrive));
|
||||||
SelectedDrive.DeviceNumber = (DWORD)ComboBox_GetItemData(hDeviceList, ComboIndex);
|
SelectedDrive.DeviceNumber = (DWORD)ComboBox_GetItemData(hDeviceList, ComboIndex);
|
||||||
|
|
||||||
hDrive = GetDriveHandle(SelectedDrive.DeviceNumber, DrivePath, FALSE, FALSE);
|
if (!GetDrivePartitionData(SelectedDrive.DeviceNumber, fs_type, sizeof(fs_type)))
|
||||||
if (hDrive == INVALID_HANDLE_VALUE)
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
r = DeviceIoControl(hDrive, IOCTL_DISK_GET_DRIVE_GEOMETRY_EX,
|
|
||||||
NULL, 0, geometry, sizeof(geometry), &size, NULL);
|
|
||||||
if (!r || size <= 0) {
|
|
||||||
uprintf("IOCTL_DISK_GET_DRIVE_GEOMETRY_EX failed for drive %c: %s\n", DrivePath[0], WindowsErrorString());
|
|
||||||
safe_closehandle(hDrive);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
SelectedDrive.DiskSize = DiskGeometry->DiskSize.QuadPart;
|
|
||||||
memcpy(&SelectedDrive.Geometry, &DiskGeometry->Geometry, sizeof(DISK_GEOMETRY));
|
|
||||||
uprintf("Sector Size: %d bytes\n", DiskGeometry->Geometry.BytesPerSector);
|
|
||||||
uprintf("Cylinders: %lld, TracksPerCylinder: %d, SectorsPerTrack: %d\n",
|
|
||||||
DiskGeometry->Geometry.Cylinders, DiskGeometry->Geometry.TracksPerCylinder, DiskGeometry->Geometry.SectorsPerTrack);
|
|
||||||
|
|
||||||
r = DeviceIoControl(hDrive, IOCTL_DISK_GET_DRIVE_LAYOUT_EX,
|
|
||||||
NULL, 0, layout, sizeof(layout), &size, NULL );
|
|
||||||
if (!r || size <= 0) {
|
|
||||||
uprintf("IOCTL_DISK_GET_DRIVE_LAYOUT_EX failed for drive %c: %s\n", DrivePath[0], WindowsErrorString());
|
|
||||||
} else {
|
|
||||||
switch (DriveLayout->PartitionStyle) {
|
|
||||||
case PARTITION_STYLE_MBR:
|
|
||||||
SelectedDrive.PartitionType = PARTITION_STYLE_MBR;
|
|
||||||
for (i=0; i<DriveLayout->PartitionCount; i++) {
|
|
||||||
if (DriveLayout->PartitionEntry[i].Mbr.PartitionType != PARTITION_ENTRY_UNUSED) {
|
|
||||||
nb_partitions++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
uprintf("Partition type: MBR, NB Partitions: %d\n", nb_partitions);
|
|
||||||
uprintf("Disk ID: 0x%08X\n", DriveLayout->Mbr.Signature);
|
|
||||||
for (i=0; i<DriveLayout->PartitionCount; i++) {
|
|
||||||
if (DriveLayout->PartitionEntry[i].Mbr.PartitionType != PARTITION_ENTRY_UNUSED) {
|
|
||||||
uprintf("Partition %d:\n", DriveLayout->PartitionEntry[i].PartitionNumber);
|
|
||||||
part_type = DriveLayout->PartitionEntry[i].Mbr.PartitionType;
|
|
||||||
uprintf(" Type: %s (0x%02x)\r\n Size: %s (%lld bytes)\r\n Start Sector: %d, Boot: %s, Recognized: %s\n",
|
|
||||||
GetPartitionType(part_type), part_type, SizeToHumanReadable(DriveLayout->PartitionEntry[i].PartitionLength),
|
|
||||||
DriveLayout->PartitionEntry[i].PartitionLength, DriveLayout->PartitionEntry[i].Mbr.HiddenSectors,
|
|
||||||
DriveLayout->PartitionEntry[i].Mbr.BootIndicator?"Yes":"No",
|
|
||||||
DriveLayout->PartitionEntry[i].Mbr.RecognizedPartition?"Yes":"No");
|
|
||||||
if (part_type == 0xee) // Flag a protective MBR for non GPT platforms (XP)
|
|
||||||
SelectedDrive.has_protective_mbr = TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case PARTITION_STYLE_GPT:
|
|
||||||
SelectedDrive.PartitionType = PARTITION_STYLE_GPT;
|
|
||||||
uprintf("Partition type: GPT, NB Partitions: %d\n", DriveLayout->PartitionCount);
|
|
||||||
uprintf("Disk GUID: %s\n", GuidToString(&DriveLayout->Gpt.DiskId));
|
|
||||||
uprintf("Max parts: %d, Start Offset: %lld, Usable = %lld bytes\n",
|
|
||||||
DriveLayout->Gpt.MaxPartitionCount, DriveLayout->Gpt.StartingUsableOffset.QuadPart, DriveLayout->Gpt.UsableLength.QuadPart);
|
|
||||||
for (i=0; i<DriveLayout->PartitionCount; i++) {
|
|
||||||
nb_partitions++;
|
|
||||||
tmp[0] = 0;
|
|
||||||
wchar_to_utf8_no_alloc(DriveLayout->PartitionEntry[i].Gpt.Name, tmp, sizeof(tmp));
|
|
||||||
uprintf("Partition %d:\r\n Type: %s\r\n Name: '%s'\n", DriveLayout->PartitionEntry[i].PartitionNumber,
|
|
||||||
GuidToString(&DriveLayout->PartitionEntry[i].Gpt.PartitionType), tmp);
|
|
||||||
uprintf(" ID: %s\r\n Size: %s (%lld bytes)\r\n Start Sector: %lld, Attributes: 0x%016llX\n",
|
|
||||||
GuidToString(&DriveLayout->PartitionEntry[i].Gpt.PartitionId), SizeToHumanReadable(DriveLayout->PartitionEntry[i].PartitionLength),
|
|
||||||
DriveLayout->PartitionEntry[i].PartitionLength, DriveLayout->PartitionEntry[i].StartingOffset.QuadPart / DiskGeometry->Geometry.BytesPerSector,
|
|
||||||
DriveLayout->PartitionEntry[i].Gpt.Attributes);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
SelectedDrive.PartitionType = PARTITION_STYLE_MBR;
|
|
||||||
uprintf("Partition type: RAW\n");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
safe_closehandle(hDrive);
|
|
||||||
|
|
||||||
if (!DefineClusterSizes()) {
|
if (!DefineClusterSizes()) {
|
||||||
uprintf("no file system is selectable for this drive\n");
|
uprintf("no file system is selectable for this drive\n");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// re-select existing FS if it's one we know
|
// re-select existing FS if it's one we know
|
||||||
if (GetVolumeInformationA(DrivePath, NULL, 0, NULL, NULL, NULL,
|
SelectedDrive.FSType = FS_UNKNOWN;
|
||||||
fs_type, sizeof(fs_type))) {
|
if (safe_strlen(fs_type) != 0) {
|
||||||
for (SelectedDrive.FSType=FS_MAX-1; SelectedDrive.FSType>=0; SelectedDrive.FSType--) {
|
for (SelectedDrive.FSType=FS_MAX-1; SelectedDrive.FSType>=0; SelectedDrive.FSType--) {
|
||||||
if (safe_strcmp(fs_type, FileSystemLabel[SelectedDrive.FSType]) == 0) {
|
if (safe_strcmp(fs_type, FileSystemLabel[SelectedDrive.FSType]) == 0) {
|
||||||
break;
|
break;
|
||||||
|
@ -488,7 +410,7 @@ static void SetFSFromISO(void)
|
||||||
void SetMBRProps(void)
|
void SetMBRProps(void)
|
||||||
{
|
{
|
||||||
int fs = (int)ComboBox_GetItemData(hFileSystem, ComboBox_GetCurSel(hFileSystem));
|
int fs = (int)ComboBox_GetItemData(hFileSystem, ComboBox_GetCurSel(hFileSystem));
|
||||||
int dt = (int)ComboBox_GetItemData(hDOSType, ComboBox_GetCurSel(hDOSType));
|
int dt = (int)ComboBox_GetItemData(hBootType, ComboBox_GetCurSel(hBootType));
|
||||||
BOOL needs_masquerading = (IS_WINPE(iso_report.winpe) && (!iso_report.uses_minint));
|
BOOL needs_masquerading = (IS_WINPE(iso_report.winpe) && (!iso_report.uses_minint));
|
||||||
|
|
||||||
if ((!mbr_selected_by_user) && ((iso_path == NULL) || (dt != DT_ISO) || (fs != FS_NTFS))) {
|
if ((!mbr_selected_by_user) && ((iso_path == NULL) || (dt != DT_ISO) || (fs != FS_NTFS))) {
|
||||||
|
@ -504,8 +426,8 @@ void SetMBRProps(void)
|
||||||
|
|
||||||
void EnableBootOptions(BOOL enable)
|
void EnableBootOptions(BOOL enable)
|
||||||
{
|
{
|
||||||
EnableWindow(hDOS, enable);
|
EnableWindow(hBoot, enable);
|
||||||
EnableWindow(hDOSType, enable);
|
EnableWindow(hBootType, enable);
|
||||||
EnableWindow(hSelectISO, enable);
|
EnableWindow(hSelectISO, enable);
|
||||||
EnableWindow(GetDlgItem(hMainDialog, IDC_RUFUS_MBR), enable);
|
EnableWindow(GetDlgItem(hMainDialog, IDC_RUFUS_MBR), enable);
|
||||||
EnableWindow(hDiskID, enable);
|
EnableWindow(hDiskID, enable);
|
||||||
|
@ -746,7 +668,7 @@ static void InitProgress(void)
|
||||||
float last_end = 0.0f, slots_discrete = 0.0f, slots_analog = 0.0f;
|
float last_end = 0.0f, slots_discrete = 0.0f, slots_analog = 0.0f;
|
||||||
|
|
||||||
fs = (int)ComboBox_GetItemData(hFileSystem, ComboBox_GetCurSel(hFileSystem));
|
fs = (int)ComboBox_GetItemData(hFileSystem, ComboBox_GetCurSel(hFileSystem));
|
||||||
dt = (int)ComboBox_GetItemData(hDOSType, ComboBox_GetCurSel(hDOSType));
|
dt = (int)ComboBox_GetItemData(hBootType, ComboBox_GetCurSel(hBootType));
|
||||||
memset(&nb_slots, 0, sizeof(nb_slots));
|
memset(&nb_slots, 0, sizeof(nb_slots));
|
||||||
memset(&slot_end, 0, sizeof(slot_end));
|
memset(&slot_end, 0, sizeof(slot_end));
|
||||||
previous_end = 0.0f;
|
previous_end = 0.0f;
|
||||||
|
@ -759,7 +681,7 @@ static void InitProgress(void)
|
||||||
if (IsChecked(IDC_BADBLOCKS)) {
|
if (IsChecked(IDC_BADBLOCKS)) {
|
||||||
nb_slots[OP_BADBLOCKS] = -1;
|
nb_slots[OP_BADBLOCKS] = -1;
|
||||||
}
|
}
|
||||||
if (IsChecked(IDC_DOS)) {
|
if (IsChecked(IDC_BOOT)) {
|
||||||
// 1 extra slot for PBR writing
|
// 1 extra slot for PBR writing
|
||||||
switch (dt) {
|
switch (dt) {
|
||||||
case DT_WINME:
|
case DT_WINME:
|
||||||
|
@ -855,138 +777,6 @@ void UpdateProgress(int op, float percent)
|
||||||
SetTaskbarProgressValue(pos, MAX_PROGRESS);
|
SetTaskbarProgressValue(pos, MAX_PROGRESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Set or restore a Local Group Policy DWORD key indexed by szPath/SzPolicy
|
|
||||||
*/
|
|
||||||
#pragma push_macro("INTERFACE")
|
|
||||||
#undef INTERFACE
|
|
||||||
#define INTERFACE IGroupPolicyObject
|
|
||||||
#define REGISTRY_EXTENSION_GUID { 0x35378EAC, 0x683F, 0x11D2, {0xA8, 0x9A, 0x00, 0xC0, 0x4F, 0xBB, 0xCF, 0xA2} }
|
|
||||||
#define GPO_OPEN_LOAD_REGISTRY 1
|
|
||||||
#define GPO_SECTION_MACHINE 2
|
|
||||||
typedef enum _GROUP_POLICY_OBJECT_TYPE {
|
|
||||||
GPOTypeLocal = 0, GPOTypeRemote, GPOTypeDS
|
|
||||||
} GROUP_POLICY_OBJECT_TYPE, *PGROUP_POLICY_OBJECT_TYPE;
|
|
||||||
DECLARE_INTERFACE_(IGroupPolicyObject, IUnknown) {
|
|
||||||
STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID *ppvObj) PURE;
|
|
||||||
STDMETHOD_(ULONG, AddRef) (THIS) PURE;
|
|
||||||
STDMETHOD_(ULONG, Release) (THIS) PURE;
|
|
||||||
STDMETHOD(New) (THIS_ LPOLESTR pszDomainName, LPOLESTR pszDisplayName, DWORD dwFlags) PURE;
|
|
||||||
STDMETHOD(OpenDSGPO) (THIS_ LPOLESTR pszPath, DWORD dwFlags) PURE;
|
|
||||||
STDMETHOD(OpenLocalMachineGPO) (THIS_ DWORD dwFlags) PURE;
|
|
||||||
STDMETHOD(OpenRemoteMachineGPO) (THIS_ LPOLESTR pszComputerName, DWORD dwFlags) PURE;
|
|
||||||
STDMETHOD(Save) (THIS_ BOOL bMachine, BOOL bAdd,GUID *pGuidExtension, GUID *pGuid) PURE;
|
|
||||||
STDMETHOD(Delete) (THIS) PURE;
|
|
||||||
STDMETHOD(GetName) (THIS_ LPOLESTR pszName, int cchMaxLength) PURE;
|
|
||||||
STDMETHOD(GetDisplayName) (THIS_ LPOLESTR pszName, int cchMaxLength) PURE;
|
|
||||||
STDMETHOD(SetDisplayName) (THIS_ LPOLESTR pszName) PURE;
|
|
||||||
STDMETHOD(GetPath) (THIS_ LPOLESTR pszPath, int cchMaxPath) PURE;
|
|
||||||
STDMETHOD(GetDSPath) (THIS_ DWORD dwSection, LPOLESTR pszPath ,int cchMaxPath) PURE;
|
|
||||||
STDMETHOD(GetFileSysPath) (THIS_ DWORD dwSection, LPOLESTR pszPath, int cchMaxPath) PURE;
|
|
||||||
STDMETHOD(GetRegistryKey) (THIS_ DWORD dwSection, HKEY *hKey) PURE;
|
|
||||||
STDMETHOD(GetOptions) (THIS_ DWORD *dwOptions) PURE;
|
|
||||||
STDMETHOD(SetOptions) (THIS_ DWORD dwOptions, DWORD dwMask) PURE;
|
|
||||||
STDMETHOD(GetType) (THIS_ GROUP_POLICY_OBJECT_TYPE *gpoType) PURE;
|
|
||||||
STDMETHOD(GetMachineName) (THIS_ LPOLESTR pszName, int cchMaxLength) PURE;
|
|
||||||
STDMETHOD(GetPropertySheetPages) (THIS_ HPROPSHEETPAGE **hPages, UINT *uPageCount) PURE;
|
|
||||||
};
|
|
||||||
typedef IGroupPolicyObject *LPGROUPPOLICYOBJECT;
|
|
||||||
|
|
||||||
BOOL SetLGP(BOOL bRestore, const char* szPath, const char* szPolicy, DWORD dwValue)
|
|
||||||
{
|
|
||||||
LONG r;
|
|
||||||
DWORD disp, regtype, val=0, val_size=sizeof(DWORD);
|
|
||||||
HRESULT hr;
|
|
||||||
IGroupPolicyObject* pLGPO;
|
|
||||||
// Along with global 'existing_key', this static value is used to restore initial state
|
|
||||||
static DWORD original_val;
|
|
||||||
HKEY path_key = NULL, policy_key = NULL;
|
|
||||||
// MSVC is finicky about these ones => redefine them
|
|
||||||
const IID my_IID_IGroupPolicyObject =
|
|
||||||
{ 0xea502723, 0xa23d, 0x11d1, { 0xa7, 0xd3, 0x0, 0x0, 0xf8, 0x75, 0x71, 0xe3 } };
|
|
||||||
const IID my_CLSID_GroupPolicyObject =
|
|
||||||
{ 0xea502722, 0xa23d, 0x11d1, { 0xa7, 0xd3, 0x0, 0x0, 0xf8, 0x75, 0x71, 0xe3 } };
|
|
||||||
GUID ext_guid = REGISTRY_EXTENSION_GUID;
|
|
||||||
// Can be anything really
|
|
||||||
GUID snap_guid = { 0x3D271CFC, 0x2BC6, 0x4AC2, {0xB6, 0x33, 0x3B, 0xDF, 0xF5, 0xBD, 0xAB, 0x2A} };
|
|
||||||
|
|
||||||
// We need an IGroupPolicyObject instance to set a Local Group Policy
|
|
||||||
hr = CoCreateInstance(&my_CLSID_GroupPolicyObject, NULL, CLSCTX_INPROC_SERVER, &my_IID_IGroupPolicyObject, (LPVOID*)&pLGPO);
|
|
||||||
if (FAILED(hr)) {
|
|
||||||
uprintf("SetLGP: CoCreateInstance failed; hr = %x\n", hr);
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
hr = pLGPO->lpVtbl->OpenLocalMachineGPO(pLGPO, GPO_OPEN_LOAD_REGISTRY);
|
|
||||||
if (FAILED(hr)) {
|
|
||||||
uprintf("SetLGP: OpenLocalMachineGPO failed - error %x\n", hr);
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
hr = pLGPO->lpVtbl->GetRegistryKey(pLGPO, GPO_SECTION_MACHINE, &path_key);
|
|
||||||
if (FAILED(hr)) {
|
|
||||||
uprintf("SetLGP: GetRegistryKey failed - error %x\n", hr);
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
// The DisableSystemRestore is set in Software\Policies\Microsoft\Windows\DeviceInstall\Settings
|
|
||||||
r = RegCreateKeyExA(path_key, szPath, 0, NULL, 0, KEY_SET_VALUE | KEY_QUERY_VALUE,
|
|
||||||
NULL, &policy_key, &disp);
|
|
||||||
if (r != ERROR_SUCCESS) {
|
|
||||||
uprintf("SetLGP: Failed to open LGPO path %s - error %x\n", szPath, hr);
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((disp == REG_OPENED_EXISTING_KEY) && (!bRestore) && (!existing_key)) {
|
|
||||||
// backup existing value for restore
|
|
||||||
existing_key = TRUE;
|
|
||||||
regtype = REG_DWORD;
|
|
||||||
r = RegQueryValueExA(policy_key, szPolicy, NULL, ®type, (LPBYTE)&original_val, &val_size);
|
|
||||||
if (r == ERROR_FILE_NOT_FOUND) {
|
|
||||||
// The Key exists but not its value, which is OK
|
|
||||||
existing_key = FALSE;
|
|
||||||
} else if (r != ERROR_SUCCESS) {
|
|
||||||
uprintf("SetLGP: Failed to read original %s policy value - error %x\n", szPolicy, r);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((!bRestore) || (existing_key)) {
|
|
||||||
val = (bRestore)?original_val:dwValue;
|
|
||||||
r = RegSetValueExA(policy_key, szPolicy, 0, REG_DWORD, (BYTE*)&val, sizeof(val));
|
|
||||||
} else {
|
|
||||||
r = RegDeleteValueA(policy_key, szPolicy);
|
|
||||||
}
|
|
||||||
if (r != ERROR_SUCCESS) {
|
|
||||||
uprintf("SetLGP: RegSetValueEx / RegDeleteValue failed - error %x\n", r);
|
|
||||||
}
|
|
||||||
RegCloseKey(policy_key);
|
|
||||||
policy_key = NULL;
|
|
||||||
|
|
||||||
// Apply policy
|
|
||||||
hr = pLGPO->lpVtbl->Save(pLGPO, TRUE, (bRestore)?FALSE:TRUE, &ext_guid, &snap_guid);
|
|
||||||
if (r != S_OK) {
|
|
||||||
uprintf("SetLGP: Unable to apply %s policy - error %x\n", szPolicy, hr);
|
|
||||||
goto error;
|
|
||||||
} else {
|
|
||||||
if ((!bRestore) || (existing_key)) {
|
|
||||||
uprintf("SetLGP: Successfully %s %s policy to 0x%08X\n", (bRestore)?"restored":"set", szPolicy, val);
|
|
||||||
} else {
|
|
||||||
uprintf("SetLGP: Successfully removed %s policy key\n", szPolicy);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
RegCloseKey(path_key);
|
|
||||||
pLGPO->lpVtbl->Release(pLGPO);
|
|
||||||
return TRUE;
|
|
||||||
|
|
||||||
error:
|
|
||||||
if (path_key != NULL) RegCloseKey(path_key);
|
|
||||||
if (policy_key != NULL) RegCloseKey(policy_key);
|
|
||||||
if (pLGPO != NULL) pLGPO->lpVtbl->Release(pLGPO);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
#pragma pop_macro("INTERFACE")
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Toggle controls according to operation
|
* Toggle controls according to operation
|
||||||
*/
|
*/
|
||||||
|
@ -1002,14 +792,14 @@ 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(hDOS, (fs == FS_FAT16) || (fs == FS_FAT32) || (fs == FS_NTFS));
|
EnableWindow(hBoot, (fs == FS_FAT16) || (fs == FS_FAT32) || (fs == FS_NTFS));
|
||||||
EnableWindow(hDOSType, (fs == FS_FAT16) || (fs == FS_FAT32) || (fs == FS_NTFS));
|
EnableWindow(hBootType, (fs == FS_FAT16) || (fs == FS_FAT32) || (fs == FS_NTFS));
|
||||||
EnableWindow(hDiskID, (fs == FS_FAT16) || (fs == FS_FAT32) || (fs == FS_NTFS));
|
EnableWindow(hDiskID, (fs == FS_FAT16) || (fs == FS_FAT32) || (fs == FS_NTFS));
|
||||||
EnableWindow(GetDlgItem(hMainDialog, IDC_RUFUS_MBR), (fs == FS_FAT16) || (fs == FS_FAT32) || (fs == FS_NTFS));
|
EnableWindow(GetDlgItem(hMainDialog, IDC_RUFUS_MBR), (fs == FS_FAT16) || (fs == FS_FAT32) || (fs == FS_NTFS));
|
||||||
EnableWindow(GetDlgItem(hMainDialog, IDC_EXTRA_PARTITION), (fs == FS_FAT16) || (fs == FS_FAT32) || (fs == FS_NTFS));
|
EnableWindow(GetDlgItem(hMainDialog, IDC_EXTRA_PARTITION), (fs == FS_FAT16) || (fs == FS_FAT32) || (fs == FS_NTFS));
|
||||||
} else {
|
} else {
|
||||||
EnableWindow(hDOS, FALSE);
|
EnableWindow(hBoot, FALSE);
|
||||||
EnableWindow(hDOSType, FALSE);
|
EnableWindow(hBootType, FALSE);
|
||||||
EnableWindow(hDiskID, FALSE);
|
EnableWindow(hDiskID, FALSE);
|
||||||
EnableWindow(GetDlgItem(hMainDialog, IDC_RUFUS_MBR), FALSE);
|
EnableWindow(GetDlgItem(hMainDialog, IDC_RUFUS_MBR), FALSE);
|
||||||
EnableWindow(GetDlgItem(hMainDialog, IDC_EXTRA_PARTITION), FALSE);
|
EnableWindow(GetDlgItem(hMainDialog, IDC_EXTRA_PARTITION), FALSE);
|
||||||
|
@ -1234,7 +1024,7 @@ DWORD WINAPI ISOScanThread(LPVOID param)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Enable DOS, set DOS Type to ISO (last item) and set FS accordingly
|
// Enable DOS, set DOS Type to ISO (last item) and set FS accordingly
|
||||||
CheckDlgButton(hMainDialog, IDC_DOS, BST_CHECKED);
|
CheckDlgButton(hMainDialog, IDC_BOOT, BST_CHECKED);
|
||||||
SetFSFromISO();
|
SetFSFromISO();
|
||||||
SetMBRProps();
|
SetMBRProps();
|
||||||
for (i=(int)safe_strlen(iso_path); (i>0)&&(iso_path[i]!='\\'); i--);
|
for (i=(int)safe_strlen(iso_path); (i>0)&&(iso_path[i]!='\\'); i--);
|
||||||
|
@ -1255,7 +1045,6 @@ out:
|
||||||
ExitThread(0);
|
ExitThread(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void MoveControl(int nID, float vertical_shift)
|
void MoveControl(int nID, float vertical_shift)
|
||||||
{
|
{
|
||||||
RECT rect;
|
RECT rect;
|
||||||
|
@ -1330,8 +1119,8 @@ void InitDialog(HWND hDlg)
|
||||||
hClusterSize = GetDlgItem(hDlg, IDC_CLUSTERSIZE);
|
hClusterSize = GetDlgItem(hDlg, IDC_CLUSTERSIZE);
|
||||||
hLabel = GetDlgItem(hDlg, IDC_LABEL);
|
hLabel = GetDlgItem(hDlg, IDC_LABEL);
|
||||||
hProgress = GetDlgItem(hDlg, IDC_PROGRESS);
|
hProgress = GetDlgItem(hDlg, IDC_PROGRESS);
|
||||||
hDOS = GetDlgItem(hDlg, IDC_DOS);
|
hBoot = GetDlgItem(hDlg, IDC_BOOT);
|
||||||
hDOSType = GetDlgItem(hDlg, IDC_DOSTYPE);
|
hBootType = GetDlgItem(hDlg, IDC_BOOTTYPE);
|
||||||
hSelectISO = GetDlgItem(hDlg, IDC_SELECT_ISO);
|
hSelectISO = GetDlgItem(hDlg, IDC_SELECT_ISO);
|
||||||
hNBPasses = GetDlgItem(hDlg, IDC_NBPASSES);
|
hNBPasses = GetDlgItem(hDlg, IDC_NBPASSES);
|
||||||
hDiskID = GetDlgItem(hDlg, IDC_DISK_ID);
|
hDiskID = GetDlgItem(hDlg, IDC_DISK_ID);
|
||||||
|
@ -1379,10 +1168,10 @@ void InitDialog(HWND hDlg)
|
||||||
IGNORE_RETVAL(ComboBox_SetCurSel(hNBPasses, 1));
|
IGNORE_RETVAL(ComboBox_SetCurSel(hNBPasses, 1));
|
||||||
CreateTooltip(hNBPasses, "Pattern: 0x55, 0xAA", -1);
|
CreateTooltip(hNBPasses, "Pattern: 0x55, 0xAA", -1);
|
||||||
// Fill up the DOS type dropdown
|
// Fill up the DOS type dropdown
|
||||||
IGNORE_RETVAL(ComboBox_SetItemData(hDOSType, ComboBox_AddStringU(hDOSType, "MS-DOS"), DT_WINME));
|
IGNORE_RETVAL(ComboBox_SetItemData(hBootType, ComboBox_AddStringU(hBootType, "MS-DOS"), DT_WINME));
|
||||||
IGNORE_RETVAL(ComboBox_SetItemData(hDOSType, ComboBox_AddStringU(hDOSType, "FreeDOS"), DT_FREEDOS));
|
IGNORE_RETVAL(ComboBox_SetItemData(hBootType, ComboBox_AddStringU(hBootType, "FreeDOS"), DT_FREEDOS));
|
||||||
IGNORE_RETVAL(ComboBox_SetItemData(hDOSType, ComboBox_AddStringU(hDOSType, "ISO Image"), DT_ISO));
|
IGNORE_RETVAL(ComboBox_SetItemData(hBootType, ComboBox_AddStringU(hBootType, "ISO Image"), DT_ISO));
|
||||||
IGNORE_RETVAL(ComboBox_SetCurSel(hDOSType, selection_default));
|
IGNORE_RETVAL(ComboBox_SetCurSel(hBootType, selection_default));
|
||||||
// Fill up the MBR masqueraded disk IDs ("8 disks should be enough for anybody")
|
// Fill up the MBR masqueraded disk IDs ("8 disks should be enough for anybody")
|
||||||
IGNORE_RETVAL(ComboBox_SetItemData(hDiskID, ComboBox_AddStringU(hDiskID, "0x80 (default)"), 0x80));
|
IGNORE_RETVAL(ComboBox_SetItemData(hDiskID, ComboBox_AddStringU(hDiskID, "0x80 (default)"), 0x80));
|
||||||
for (i=1; i<=7; i++) {
|
for (i=1; i<=7; i++) {
|
||||||
|
@ -1396,7 +1185,7 @@ void InitDialog(HWND hDlg)
|
||||||
StrArrayCreate(&DriveLabel, MAX_DRIVES);
|
StrArrayCreate(&DriveLabel, MAX_DRIVES);
|
||||||
// Set various checkboxes
|
// Set various checkboxes
|
||||||
CheckDlgButton(hDlg, IDC_QUICKFORMAT, BST_CHECKED);
|
CheckDlgButton(hDlg, IDC_QUICKFORMAT, BST_CHECKED);
|
||||||
CheckDlgButton(hDlg, IDC_DOS, BST_CHECKED);
|
CheckDlgButton(hDlg, IDC_BOOT, BST_CHECKED);
|
||||||
CheckDlgButton(hDlg, IDC_SET_ICON, BST_CHECKED);
|
CheckDlgButton(hDlg, IDC_SET_ICON, BST_CHECKED);
|
||||||
|
|
||||||
// Load system icons (NB: Use the excellent http://www.nirsoft.net/utils/iconsext.html to find icon IDs)
|
// Load system icons (NB: Use the excellent http://www.nirsoft.net/utils/iconsext.html to find icon IDs)
|
||||||
|
@ -1437,8 +1226,8 @@ void InitDialog(HWND hDlg)
|
||||||
CreateTooltip(GetDlgItem(hDlg, IDC_ADVANCED), "Toggle advanced options", -1);
|
CreateTooltip(GetDlgItem(hDlg, IDC_ADVANCED), "Toggle advanced options", -1);
|
||||||
CreateTooltip(GetDlgItem(hDlg, IDC_BADBLOCKS), "Test the device for bad blocks using a byte pattern", -1);
|
CreateTooltip(GetDlgItem(hDlg, IDC_BADBLOCKS), "Test the device for bad blocks using a byte pattern", -1);
|
||||||
CreateTooltip(GetDlgItem(hDlg, IDC_QUICKFORMAT), "Unchek this box to use the \"slow\" format method", -1);
|
CreateTooltip(GetDlgItem(hDlg, IDC_QUICKFORMAT), "Unchek this box to use the \"slow\" format method", -1);
|
||||||
CreateTooltip(hDOS, "Check this box to make the USB drive bootable", -1);
|
CreateTooltip(hBoot, "Check this box to make the USB drive bootable", -1);
|
||||||
CreateTooltip(hDOSType, "Boot method", -1);
|
CreateTooltip(hBootType, "Boot method", -1);
|
||||||
CreateTooltip(hSelectISO, "Click to select an ISO...", -1);
|
CreateTooltip(hSelectISO, "Click to select an ISO...", -1);
|
||||||
CreateTooltip(GetDlgItem(hDlg, IDC_SET_ICON), "Check this box to allow the display of international labels "
|
CreateTooltip(GetDlgItem(hDlg, IDC_SET_ICON), "Check this box to allow the display of international labels "
|
||||||
"and set a device icon (creates an autorun.inf)", 10000);
|
"and set a device icon (creates an autorun.inf)", 10000);
|
||||||
|
@ -1630,57 +1419,57 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
|
||||||
EnableBootOptions(TRUE);
|
EnableBootOptions(TRUE);
|
||||||
SetMBRProps();
|
SetMBRProps();
|
||||||
// Remove the SysLinux option if exists
|
// Remove the SysLinux option if exists
|
||||||
if (ComboBox_GetItemData(hDOSType, ComboBox_GetCount(hDOSType)-1) == DT_SYSLINUX) {
|
if (ComboBox_GetItemData(hBootType, ComboBox_GetCount(hBootType)-1) == DT_SYSLINUX) {
|
||||||
IGNORE_RETVAL(ComboBox_DeleteString(hDOSType, ComboBox_GetCount(hDOSType)-1));
|
IGNORE_RETVAL(ComboBox_DeleteString(hBootType, ComboBox_GetCount(hBootType)-1));
|
||||||
IGNORE_RETVAL(ComboBox_SetCurSel(hDOSType, 1));
|
IGNORE_RETVAL(ComboBox_SetCurSel(hBootType, 1));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (fs == FS_EXFAT) {
|
if (fs == FS_EXFAT) {
|
||||||
if (IsWindowEnabled(hDOS)) {
|
if (IsWindowEnabled(hBoot)) {
|
||||||
// unlikely to be supported by BIOSes => don't bother
|
// unlikely to be supported by BIOSes => don't bother
|
||||||
IGNORE_RETVAL(ComboBox_SetCurSel(hDOSType, 0));
|
IGNORE_RETVAL(ComboBox_SetCurSel(hBootType, 0));
|
||||||
uDOSChecked = IsDlgButtonChecked(hMainDialog, IDC_DOS);
|
uDOSChecked = IsDlgButtonChecked(hMainDialog, IDC_BOOT);
|
||||||
CheckDlgButton(hDlg, IDC_DOS, BST_UNCHECKED);
|
CheckDlgButton(hDlg, IDC_BOOT, BST_UNCHECKED);
|
||||||
EnableBootOptions(FALSE);
|
EnableBootOptions(FALSE);
|
||||||
}
|
}
|
||||||
SetMBRProps();
|
SetMBRProps();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
IGNORE_RETVAL(ComboBox_ResetContent(hDOSType));
|
IGNORE_RETVAL(ComboBox_ResetContent(hBootType));
|
||||||
if ((bt == BT_BIOS) && ((fs == FS_FAT16) || (fs == FS_FAT32))) {
|
if ((bt == BT_BIOS) && ((fs == FS_FAT16) || (fs == FS_FAT32))) {
|
||||||
IGNORE_RETVAL(ComboBox_SetItemData(hDOSType, ComboBox_AddStringU(hDOSType, "MS-DOS"), DT_WINME));
|
IGNORE_RETVAL(ComboBox_SetItemData(hBootType, ComboBox_AddStringU(hBootType, "MS-DOS"), DT_WINME));
|
||||||
IGNORE_RETVAL(ComboBox_SetItemData(hDOSType, ComboBox_AddStringU(hDOSType, "FreeDOS"), DT_FREEDOS));
|
IGNORE_RETVAL(ComboBox_SetItemData(hBootType, ComboBox_AddStringU(hBootType, "FreeDOS"), DT_FREEDOS));
|
||||||
}
|
}
|
||||||
IGNORE_RETVAL(ComboBox_SetItemData(hDOSType, ComboBox_AddStringU(hDOSType, "ISO Image"), DT_ISO));
|
IGNORE_RETVAL(ComboBox_SetItemData(hBootType, ComboBox_AddStringU(hBootType, "ISO Image"), DT_ISO));
|
||||||
// If needed (advanced mode) also append a Syslinux option
|
// If needed (advanced mode) also append a Syslinux option
|
||||||
if ( (bt == BT_BIOS) && (((fs == FS_FAT16) || (fs == FS_FAT32)) && (advanced_mode)) )
|
if ( (bt == BT_BIOS) && (((fs == FS_FAT16) || (fs == FS_FAT32)) && (advanced_mode)) )
|
||||||
IGNORE_RETVAL(ComboBox_SetItemData(hDOSType, ComboBox_AddStringU(hDOSType, "SysLinux"), DT_SYSLINUX));
|
IGNORE_RETVAL(ComboBox_SetItemData(hBootType, ComboBox_AddStringU(hBootType, "SysLinux"), DT_SYSLINUX));
|
||||||
if ( ((!advanced_mode) && (selection_default == DT_SYSLINUX)) ) {
|
if ( ((!advanced_mode) && (selection_default == DT_SYSLINUX)) ) {
|
||||||
selection_default = DT_FREEDOS;
|
selection_default = DT_FREEDOS;
|
||||||
CheckDlgButton(hDlg, IDC_DISK_ID, BST_UNCHECKED);
|
CheckDlgButton(hDlg, IDC_DISK_ID, BST_UNCHECKED);
|
||||||
}
|
}
|
||||||
for (i=0; i<ComboBox_GetCount(hDOSType); i++) {
|
for (i=0; i<ComboBox_GetCount(hBootType); i++) {
|
||||||
if (ComboBox_GetItemData(hDOSType, i) == selection_default) {
|
if (ComboBox_GetItemData(hBootType, i) == selection_default) {
|
||||||
IGNORE_RETVAL(ComboBox_SetCurSel(hDOSType, i));
|
IGNORE_RETVAL(ComboBox_SetCurSel(hBootType, i));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (i == ComboBox_GetCount(hDOSType))
|
if (i == ComboBox_GetCount(hBootType))
|
||||||
IGNORE_RETVAL(ComboBox_SetCurSel(hDOSType, 0));
|
IGNORE_RETVAL(ComboBox_SetCurSel(hBootType, 0));
|
||||||
if (!IsWindowEnabled(hDOS)) {
|
if (!IsWindowEnabled(hBoot)) {
|
||||||
EnableWindow(hDOS, TRUE);
|
EnableWindow(hBoot, TRUE);
|
||||||
EnableWindow(hDOSType, TRUE);
|
EnableWindow(hBootType, TRUE);
|
||||||
EnableWindow(hSelectISO, TRUE);
|
EnableWindow(hSelectISO, TRUE);
|
||||||
CheckDlgButton(hDlg, IDC_DOS, uDOSChecked);
|
CheckDlgButton(hDlg, IDC_BOOT, uDOSChecked);
|
||||||
}
|
}
|
||||||
SetMBRProps();
|
SetMBRProps();
|
||||||
break;
|
break;
|
||||||
case IDC_DOSTYPE:
|
case IDC_BOOTTYPE:
|
||||||
if (HIWORD(wParam) != CBN_SELCHANGE)
|
if (HIWORD(wParam) != CBN_SELCHANGE)
|
||||||
break;
|
break;
|
||||||
selection_default = (int) ComboBox_GetItemData(hDOSType, ComboBox_GetCurSel(hDOSType));
|
selection_default = (int) ComboBox_GetItemData(hBootType, ComboBox_GetCurSel(hBootType));
|
||||||
if (ComboBox_GetItemData(hDOSType, ComboBox_GetCurSel(hDOSType)) == DT_ISO) {
|
if (ComboBox_GetItemData(hBootType, ComboBox_GetCurSel(hBootType)) == DT_ISO) {
|
||||||
if ((iso_path == NULL) || (iso_report.label[0] == 0)) {
|
if ((iso_path == NULL) || (iso_report.label[0] == 0)) {
|
||||||
// Set focus to the Select ISO button
|
// Set focus to the Select ISO button
|
||||||
SendMessage(hMainDialog, WM_NEXTDLGCTL, (WPARAM)FALSE, 0);
|
SendMessage(hMainDialog, WM_NEXTDLGCTL, (WPARAM)FALSE, 0);
|
||||||
|
@ -1730,11 +1519,11 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
|
||||||
SetTaskbarProgressState(TASKBAR_NORMAL);
|
SetTaskbarProgressState(TASKBAR_NORMAL);
|
||||||
SetTaskbarProgressValue(0, MAX_PROGRESS);
|
SetTaskbarProgressValue(0, MAX_PROGRESS);
|
||||||
SendMessage(hProgress, PBM_SETPOS, 0, 0);
|
SendMessage(hProgress, PBM_SETPOS, 0, 0);
|
||||||
selection_default = (int)ComboBox_GetItemData(hDOSType, ComboBox_GetCurSel(hDOSType));
|
selection_default = (int)ComboBox_GetItemData(hBootType, ComboBox_GetCurSel(hBootType));
|
||||||
nDeviceIndex = ComboBox_GetCurSel(hDeviceList);
|
nDeviceIndex = ComboBox_GetCurSel(hDeviceList);
|
||||||
if (nDeviceIndex != CB_ERR) {
|
if (nDeviceIndex != CB_ERR) {
|
||||||
if (IsChecked(IDC_DOS)) {
|
if (IsChecked(IDC_BOOT)) {
|
||||||
if (ComboBox_GetItemData(hDOSType, ComboBox_GetCurSel(hDOSType)) == DT_ISO) {
|
if (ComboBox_GetItemData(hBootType, ComboBox_GetCurSel(hBootType)) == DT_ISO) {
|
||||||
if (iso_path == NULL) {
|
if (iso_path == NULL) {
|
||||||
MessageBoxA(hMainDialog, "Please click on the disc button to select a bootable ISO,\n"
|
MessageBoxA(hMainDialog, "Please click on the disc button to select a bootable ISO,\n"
|
||||||
"or uncheck the \"Create a bootable disk...\" checkbox.",
|
"or uncheck the \"Create a bootable disk...\" checkbox.",
|
||||||
|
@ -1936,7 +1725,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
|
||||||
|
|
||||||
// We use local group policies rather than direct registry manipulation
|
// We use local group policies rather than direct registry manipulation
|
||||||
// 0x9e disables removable and fixed drive notifications
|
// 0x9e disables removable and fixed drive notifications
|
||||||
SetLGP(FALSE, "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer", "NoDriveTypeAutorun", 0x9e);
|
SetLGP(FALSE, &existing_key, "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer", "NoDriveTypeAutorun", 0x9e);
|
||||||
|
|
||||||
// Create the main Window
|
// Create the main Window
|
||||||
if ( (hDlg = CreateDialogA(hInstance, MAKEINTRESOURCEA(IDD_DIALOG), NULL, MainCallback)) == NULL ) {
|
if ( (hDlg = CreateDialogA(hInstance, MAKEINTRESOURCEA(IDD_DIALOG), NULL, MainCallback)) == NULL ) {
|
||||||
|
@ -2003,7 +1792,7 @@ out:
|
||||||
safe_free(iso_path);
|
safe_free(iso_path);
|
||||||
safe_free(update.download_url);
|
safe_free(update.download_url);
|
||||||
safe_free(update.release_notes);
|
safe_free(update.release_notes);
|
||||||
SetLGP(TRUE, "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer", "NoDriveTypeAutorun", 0);
|
SetLGP(TRUE, &existing_key, "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer", "NoDriveTypeAutorun", 0);
|
||||||
CloseHandle(mutex);
|
CloseHandle(mutex);
|
||||||
uprintf("*** RUFUS EXIT ***\n");
|
uprintf("*** RUFUS EXIT ***\n");
|
||||||
|
|
||||||
|
|
|
@ -239,7 +239,7 @@ enum WindowsVersion {
|
||||||
*/
|
*/
|
||||||
extern HINSTANCE hMainInstance;
|
extern HINSTANCE hMainInstance;
|
||||||
extern HWND hMainDialog, hLogDlg, hStatus, hDeviceList, hCapacity;
|
extern HWND hMainDialog, hLogDlg, hStatus, hDeviceList, hCapacity;
|
||||||
extern HWND hPartitionScheme, hFileSystem, hClusterSize, hLabel, hDOSType, hNBPasses, hLog;
|
extern HWND hPartitionScheme, hFileSystem, hClusterSize, hLabel, hBootType, hNBPasses, hLog;
|
||||||
extern HWND hISOProgressDlg, hISOProgressBar, hISOFileName, hDiskID;
|
extern HWND hISOProgressDlg, hISOProgressBar, hISOFileName, hDiskID;
|
||||||
extern float fScale;
|
extern float fScale;
|
||||||
extern char szFolderPath[MAX_PATH], app_dir[MAX_PATH];
|
extern char szFolderPath[MAX_PATH], app_dir[MAX_PATH];
|
||||||
|
@ -285,6 +285,7 @@ extern BOOL InstallSyslinux(DWORD num, const char* drive_name);
|
||||||
DWORD WINAPI FormatThread(void* param);
|
DWORD WINAPI FormatThread(void* param);
|
||||||
extern BOOL CreatePartition(HANDLE hDrive, int partition_style, int file_system);
|
extern BOOL CreatePartition(HANDLE hDrive, int partition_style, int file_system);
|
||||||
extern const char* GetPartitionType(BYTE Type);
|
extern const char* GetPartitionType(BYTE Type);
|
||||||
|
extern BOOL GetDrivePartitionData(DWORD DeviceNumber, char* FileSystemName, DWORD FileSystemNameSize);
|
||||||
extern HANDLE GetDriveHandle(DWORD DriveIndex, char* DriveLetter, BOOL bWriteAccess, BOOL bLockDrive);
|
extern HANDLE GetDriveHandle(DWORD DriveIndex, char* DriveLetter, BOOL bWriteAccess, BOOL bLockDrive);
|
||||||
extern BOOL GetDriveLabel(DWORD DriveIndex, char* letter, char** label);
|
extern BOOL GetDriveLabel(DWORD DriveIndex, char* letter, char** label);
|
||||||
extern BOOL UnmountDrive(HANDLE hDrive);
|
extern BOOL UnmountDrive(HANDLE hDrive);
|
||||||
|
@ -292,6 +293,7 @@ extern BOOL CreateProgress(void);
|
||||||
extern BOOL SetAutorun(const char* path);
|
extern BOOL SetAutorun(const char* path);
|
||||||
extern char* FileDialog(BOOL save, char* path, char* filename, char* ext, char* ext_desc);
|
extern char* FileDialog(BOOL save, char* path, char* filename, char* ext, char* ext_desc);
|
||||||
extern BOOL FileIO(BOOL save, char* path, char** buffer, DWORD* size);
|
extern BOOL FileIO(BOOL save, char* path, char** buffer, DWORD* size);
|
||||||
|
extern BOOL SetLGP(BOOL bRestore, BOOL* bExistingKey, const char* szPath, const char* szPolicy, DWORD dwValue);
|
||||||
extern LONG GetEntryWidth(HWND hDropDown, const char* entry);
|
extern LONG GetEntryWidth(HWND hDropDown, const char* entry);
|
||||||
extern BOOL DownloadFile(const char* url, const char* file, HWND hProgressDialog);
|
extern BOOL DownloadFile(const char* url, const char* file, HWND hProgressDialog);
|
||||||
extern HANDLE DownloadFileThreaded(const char* url, const char* file, HWND hProgressDialog);
|
extern HANDLE DownloadFileThreaded(const char* url, const char* file, HWND hProgressDialog);
|
||||||
|
|
14
src/rufus.rc
14
src/rufus.rc
|
@ -30,7 +30,7 @@ LANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL
|
||||||
IDD_DIALOG DIALOGEX 12, 12, 206, 316
|
IDD_DIALOG DIALOGEX 12, 12, 206, 316
|
||||||
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.3.2.227"
|
CAPTION "Rufus v1.3.2.228"
|
||||||
FONT 8, "MS Shell Dlg", 400, 0, 0x1
|
FONT 8, "MS Shell Dlg", 400, 0, 0x1
|
||||||
BEGIN
|
BEGIN
|
||||||
DEFPUSHBUTTON "Start",IDC_START,94,278,50,14
|
DEFPUSHBUTTON "Start",IDC_START,94,278,50,14
|
||||||
|
@ -48,13 +48,13 @@ BEGIN
|
||||||
EDITTEXT IDC_LABEL,7,131,190,13,ES_AUTOHSCROLL
|
EDITTEXT IDC_LABEL,7,131,190,13,ES_AUTOHSCROLL
|
||||||
CONTROL "Check device for bad blocks:",IDC_BADBLOCKS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,161,101,10
|
CONTROL "Check device for bad blocks:",IDC_BADBLOCKS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,161,101,10
|
||||||
CONTROL "Quick Format",IDC_QUICKFORMAT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,173,55,10
|
CONTROL "Quick Format",IDC_QUICKFORMAT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,173,55,10
|
||||||
CONTROL "Create a bootable disk using:",IDC_DOS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,185,104,10
|
CONTROL "Create a bootable disk using:",IDC_BOOT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,185,104,10
|
||||||
CONTROL "Create extended label and icon files",IDC_SET_ICON,
|
CONTROL "Create extended label and icon files",IDC_SET_ICON,
|
||||||
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,198,131,10
|
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,198,131,10
|
||||||
LTEXT "New volume label",IDC_STATIC,9,121,105,10
|
LTEXT "New volume label",IDC_STATIC,9,121,105,10
|
||||||
CONTROL "",IDC_PROGRESS,"msctls_progress32",PBS_SMOOTH | WS_BORDER,8,259,189,9
|
CONTROL "",IDC_PROGRESS,"msctls_progress32",PBS_SMOOTH | WS_BORDER,8,259,189,9
|
||||||
COMBOBOX IDC_NBPASSES,119,159,49,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
|
COMBOBOX IDC_NBPASSES,119,159,49,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
|
||||||
COMBOBOX IDC_DOSTYPE,119,183,49,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
|
COMBOBOX IDC_BOOTTYPE,119,183,49,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
|
||||||
PUSHBUTTON "...",IDC_SELECT_ISO,171,182,22,14,BS_ICON
|
PUSHBUTTON "...",IDC_SELECT_ISO,171,182,22,14,BS_ICON
|
||||||
PUSHBUTTON "T",IDC_TEST,80,278,12,14,NOT WS_VISIBLE
|
PUSHBUTTON "T",IDC_TEST,80,278,12,14,NOT WS_VISIBLE
|
||||||
CONTROL "Use Rufus MBR with BIOS ID:",IDC_RUFUS_MBR,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,13,222,106,10
|
CONTROL "Use Rufus MBR with BIOS ID:",IDC_RUFUS_MBR,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,13,222,106,10
|
||||||
|
@ -274,8 +274,8 @@ END
|
||||||
//
|
//
|
||||||
|
|
||||||
VS_VERSION_INFO VERSIONINFO
|
VS_VERSION_INFO VERSIONINFO
|
||||||
FILEVERSION 1,3,2,227
|
FILEVERSION 1,3,2,228
|
||||||
PRODUCTVERSION 1,3,2,227
|
PRODUCTVERSION 1,3,2,228
|
||||||
FILEFLAGSMASK 0x3fL
|
FILEFLAGSMASK 0x3fL
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
FILEFLAGS 0x1L
|
FILEFLAGS 0x1L
|
||||||
|
@ -292,13 +292,13 @@ BEGIN
|
||||||
BEGIN
|
BEGIN
|
||||||
VALUE "CompanyName", "Akeo Consulting (http://akeo.ie)"
|
VALUE "CompanyName", "Akeo Consulting (http://akeo.ie)"
|
||||||
VALUE "FileDescription", "Rufus"
|
VALUE "FileDescription", "Rufus"
|
||||||
VALUE "FileVersion", "1.3.2.227"
|
VALUE "FileVersion", "1.3.2.228"
|
||||||
VALUE "InternalName", "Rufus"
|
VALUE "InternalName", "Rufus"
|
||||||
VALUE "LegalCopyright", "(c) 2011-2012 Pete Batard (GPL v3)"
|
VALUE "LegalCopyright", "(c) 2011-2012 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.3.2.227"
|
VALUE "ProductVersion", "1.3.2.228"
|
||||||
END
|
END
|
||||||
END
|
END
|
||||||
BLOCK "VarFileInfo"
|
BLOCK "VarFileInfo"
|
||||||
|
|
364
src/stdfn.c
Normal file
364
src/stdfn.c
Normal file
|
@ -0,0 +1,364 @@
|
||||||
|
/*
|
||||||
|
* Rufus: The Reliable USB Formatting Utility
|
||||||
|
* Standard Windows function calls
|
||||||
|
* Copyright (c) 2013 Pete Batard <pete@akeo.ie>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#ifdef _CRTDBG_MAP_ALLOC
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <crtdbg.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
#include <sddl.h>
|
||||||
|
|
||||||
|
#include "msapi_utf8.h"
|
||||||
|
#include "rufus.h"
|
||||||
|
|
||||||
|
enum WindowsVersion nWindowsVersion = WINDOWS_UNDEFINED;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Detect Windows version
|
||||||
|
*/
|
||||||
|
enum WindowsVersion DetectWindowsVersion(void)
|
||||||
|
{
|
||||||
|
OSVERSIONINFO OSVersion;
|
||||||
|
|
||||||
|
memset(&OSVersion, 0, sizeof(OSVERSIONINFO));
|
||||||
|
OSVersion.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
|
||||||
|
if (GetVersionEx(&OSVersion) == 0)
|
||||||
|
return WINDOWS_UNDEFINED;
|
||||||
|
if (OSVersion.dwPlatformId != VER_PLATFORM_WIN32_NT)
|
||||||
|
return WINDOWS_UNSUPPORTED;
|
||||||
|
// See the Remarks section from http://msdn.microsoft.com/en-us/library/windows/desktop/ms724833.aspx
|
||||||
|
if ((OSVersion.dwMajorVersion < 5) || ((OSVersion.dwMajorVersion == 5) && (OSVersion.dwMinorVersion == 0)))
|
||||||
|
return WINDOWS_UNSUPPORTED; // Win2k or earlier
|
||||||
|
if ((OSVersion.dwMajorVersion == 5) && (OSVersion.dwMinorVersion == 1))
|
||||||
|
return WINDOWS_XP;
|
||||||
|
if ((OSVersion.dwMajorVersion == 5) && (OSVersion.dwMinorVersion == 2))
|
||||||
|
return WINDOWS_2003;
|
||||||
|
if ((OSVersion.dwMajorVersion == 6) && (OSVersion.dwMinorVersion == 0))
|
||||||
|
return WINDOWS_VISTA;
|
||||||
|
if ((OSVersion.dwMajorVersion == 6) && (OSVersion.dwMinorVersion == 1))
|
||||||
|
return WINDOWS_7;
|
||||||
|
if ((OSVersion.dwMajorVersion == 6) && (OSVersion.dwMinorVersion == 2))
|
||||||
|
return WINDOWS_8;
|
||||||
|
if ((OSVersion.dwMajorVersion > 6) || ((OSVersion.dwMajorVersion == 6) && (OSVersion.dwMinorVersion >= 3)))
|
||||||
|
return WINDOWS_9;
|
||||||
|
return WINDOWS_UNSUPPORTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* String array manipulation
|
||||||
|
*/
|
||||||
|
void StrArrayCreate(StrArray* arr, size_t initial_size)
|
||||||
|
{
|
||||||
|
if (arr == NULL) return;
|
||||||
|
arr->Max = initial_size; arr->Index = 0;
|
||||||
|
arr->Table = (char**)calloc(arr->Max, sizeof(char*));
|
||||||
|
if (arr->Table == NULL)
|
||||||
|
uprintf("Could not allocate string array\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void StrArrayAdd(StrArray* arr, const char* str)
|
||||||
|
{
|
||||||
|
char** old_table;
|
||||||
|
if ((arr == NULL) || (arr->Table == NULL))
|
||||||
|
return;
|
||||||
|
if (arr->Index == arr->Max) {
|
||||||
|
arr->Max *= 2;
|
||||||
|
old_table = arr->Table;
|
||||||
|
arr->Table = (char**)realloc(arr->Table, arr->Max*sizeof(char*));
|
||||||
|
if (arr->Table == NULL) {
|
||||||
|
free(old_table);
|
||||||
|
uprintf("Could not reallocate string array\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
arr->Table[arr->Index] = safe_strdup(str);
|
||||||
|
if (arr->Table[arr->Index++] == NULL) {
|
||||||
|
uprintf("Could not store string in array\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void StrArrayClear(StrArray* arr)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
if ((arr == NULL) || (arr->Table == NULL))
|
||||||
|
return;
|
||||||
|
for (i=0; i<arr->Index; i++) {
|
||||||
|
safe_free(arr->Table[i]);
|
||||||
|
}
|
||||||
|
arr->Index = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void StrArrayDestroy(StrArray* arr)
|
||||||
|
{
|
||||||
|
StrArrayClear(arr);
|
||||||
|
if (arr != NULL)
|
||||||
|
safe_free(arr->Table);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Retrieve the SID of the current user. The returned PSID must be freed by the caller using LocalFree()
|
||||||
|
*/
|
||||||
|
static PSID GetSID(void) {
|
||||||
|
TOKEN_USER* tu = NULL;
|
||||||
|
DWORD len;
|
||||||
|
HANDLE token;
|
||||||
|
PSID ret = NULL;
|
||||||
|
char* psid_string = NULL;
|
||||||
|
|
||||||
|
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &token)) {
|
||||||
|
uprintf("OpenProcessToken failed: %s\n", WindowsErrorString());
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!GetTokenInformation(token, TokenUser, tu, 0, &len)) {
|
||||||
|
if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) {
|
||||||
|
uprintf("GetTokenInformation (pre) failed: %s\n", WindowsErrorString());
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
tu = (TOKEN_USER*)calloc(1, len);
|
||||||
|
}
|
||||||
|
if (tu == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GetTokenInformation(token, TokenUser, tu, len, &len)) {
|
||||||
|
/*
|
||||||
|
* now of course, the interesting thing is that if you return tu->User.Sid
|
||||||
|
* but free tu, the PSID pointer becomes invalid after a while.
|
||||||
|
* The workaround? Convert to string then back to PSID
|
||||||
|
*/
|
||||||
|
if (!ConvertSidToStringSidA(tu->User.Sid, &psid_string)) {
|
||||||
|
uprintf("Unable to convert SID to string: %s\n", WindowsErrorString());
|
||||||
|
ret = NULL;
|
||||||
|
} else {
|
||||||
|
if (!ConvertStringSidToSidA(psid_string, &ret)) {
|
||||||
|
uprintf("Unable to convert string back to SID: %s\n", WindowsErrorString());
|
||||||
|
ret = NULL;
|
||||||
|
}
|
||||||
|
// MUST use LocalFree()
|
||||||
|
LocalFree(psid_string);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ret = NULL;
|
||||||
|
uprintf("GetTokenInformation (real) failed: %s\n", WindowsErrorString());
|
||||||
|
}
|
||||||
|
free(tu);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* read or write I/O to a file
|
||||||
|
* buffer is allocated by the procedure. path is UTF-8
|
||||||
|
*/
|
||||||
|
BOOL FileIO(BOOL save, char* path, char** buffer, DWORD* size)
|
||||||
|
{
|
||||||
|
SECURITY_ATTRIBUTES s_attr, *ps = NULL;
|
||||||
|
SECURITY_DESCRIPTOR s_desc;
|
||||||
|
PSID sid = NULL;
|
||||||
|
HANDLE handle;
|
||||||
|
BOOL r;
|
||||||
|
BOOL ret = FALSE;
|
||||||
|
|
||||||
|
// Change the owner from admin to regular user
|
||||||
|
sid = GetSID();
|
||||||
|
if ( (sid != NULL)
|
||||||
|
&& InitializeSecurityDescriptor(&s_desc, SECURITY_DESCRIPTOR_REVISION)
|
||||||
|
&& SetSecurityDescriptorOwner(&s_desc, sid, FALSE) ) {
|
||||||
|
s_attr.nLength = sizeof(SECURITY_ATTRIBUTES);
|
||||||
|
s_attr.bInheritHandle = FALSE;
|
||||||
|
s_attr.lpSecurityDescriptor = &s_desc;
|
||||||
|
ps = &s_attr;
|
||||||
|
} else {
|
||||||
|
uprintf("Could not set security descriptor: %s\n", WindowsErrorString());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!save) {
|
||||||
|
*buffer = NULL;
|
||||||
|
}
|
||||||
|
handle = CreateFileU(path, save?GENERIC_WRITE:GENERIC_READ, FILE_SHARE_READ,
|
||||||
|
ps, save?CREATE_ALWAYS:OPEN_EXISTING, 0, NULL);
|
||||||
|
|
||||||
|
if (handle == INVALID_HANDLE_VALUE) {
|
||||||
|
uprintf("Could not %s file '%s'\n", save?"create":"open", path);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (save) {
|
||||||
|
r = WriteFile(handle, *buffer, *size, size, NULL);
|
||||||
|
} else {
|
||||||
|
*size = GetFileSize(handle, NULL);
|
||||||
|
*buffer = (char*)malloc(*size);
|
||||||
|
if (*buffer == NULL) {
|
||||||
|
uprintf("Could not allocate buffer for reading file\n");
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
r = ReadFile(handle, *buffer, *size, size, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!r) {
|
||||||
|
uprintf("I/O Error: %s\n", WindowsErrorString());
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
PrintStatus(0, TRUE, "%s '%s'", save?"Saved":"Opened", path);
|
||||||
|
ret = TRUE;
|
||||||
|
|
||||||
|
out:
|
||||||
|
CloseHandle(handle);
|
||||||
|
if (!ret) {
|
||||||
|
// Only leave a buffer allocated if successful
|
||||||
|
*size = 0;
|
||||||
|
if (!save) {
|
||||||
|
safe_free(*buffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set or restore a Local Group Policy DWORD key indexed by szPath/SzPolicy
|
||||||
|
*/
|
||||||
|
#pragma push_macro("INTERFACE")
|
||||||
|
#undef INTERFACE
|
||||||
|
#define INTERFACE IGroupPolicyObject
|
||||||
|
#define REGISTRY_EXTENSION_GUID { 0x35378EAC, 0x683F, 0x11D2, {0xA8, 0x9A, 0x00, 0xC0, 0x4F, 0xBB, 0xCF, 0xA2} }
|
||||||
|
#define GPO_OPEN_LOAD_REGISTRY 1
|
||||||
|
#define GPO_SECTION_MACHINE 2
|
||||||
|
typedef enum _GROUP_POLICY_OBJECT_TYPE {
|
||||||
|
GPOTypeLocal = 0, GPOTypeRemote, GPOTypeDS
|
||||||
|
} GROUP_POLICY_OBJECT_TYPE, *PGROUP_POLICY_OBJECT_TYPE;
|
||||||
|
DECLARE_INTERFACE_(IGroupPolicyObject, IUnknown) {
|
||||||
|
STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID *ppvObj) PURE;
|
||||||
|
STDMETHOD_(ULONG, AddRef) (THIS) PURE;
|
||||||
|
STDMETHOD_(ULONG, Release) (THIS) PURE;
|
||||||
|
STDMETHOD(New) (THIS_ LPOLESTR pszDomainName, LPOLESTR pszDisplayName, DWORD dwFlags) PURE;
|
||||||
|
STDMETHOD(OpenDSGPO) (THIS_ LPOLESTR pszPath, DWORD dwFlags) PURE;
|
||||||
|
STDMETHOD(OpenLocalMachineGPO) (THIS_ DWORD dwFlags) PURE;
|
||||||
|
STDMETHOD(OpenRemoteMachineGPO) (THIS_ LPOLESTR pszComputerName, DWORD dwFlags) PURE;
|
||||||
|
STDMETHOD(Save) (THIS_ BOOL bMachine, BOOL bAdd,GUID *pGuidExtension, GUID *pGuid) PURE;
|
||||||
|
STDMETHOD(Delete) (THIS) PURE;
|
||||||
|
STDMETHOD(GetName) (THIS_ LPOLESTR pszName, int cchMaxLength) PURE;
|
||||||
|
STDMETHOD(GetDisplayName) (THIS_ LPOLESTR pszName, int cchMaxLength) PURE;
|
||||||
|
STDMETHOD(SetDisplayName) (THIS_ LPOLESTR pszName) PURE;
|
||||||
|
STDMETHOD(GetPath) (THIS_ LPOLESTR pszPath, int cchMaxPath) PURE;
|
||||||
|
STDMETHOD(GetDSPath) (THIS_ DWORD dwSection, LPOLESTR pszPath ,int cchMaxPath) PURE;
|
||||||
|
STDMETHOD(GetFileSysPath) (THIS_ DWORD dwSection, LPOLESTR pszPath, int cchMaxPath) PURE;
|
||||||
|
STDMETHOD(GetRegistryKey) (THIS_ DWORD dwSection, HKEY *hKey) PURE;
|
||||||
|
STDMETHOD(GetOptions) (THIS_ DWORD *dwOptions) PURE;
|
||||||
|
STDMETHOD(SetOptions) (THIS_ DWORD dwOptions, DWORD dwMask) PURE;
|
||||||
|
STDMETHOD(GetType) (THIS_ GROUP_POLICY_OBJECT_TYPE *gpoType) PURE;
|
||||||
|
STDMETHOD(GetMachineName) (THIS_ LPOLESTR pszName, int cchMaxLength) PURE;
|
||||||
|
STDMETHOD(GetPropertySheetPages) (THIS_ HPROPSHEETPAGE **hPages, UINT *uPageCount) PURE;
|
||||||
|
};
|
||||||
|
typedef IGroupPolicyObject *LPGROUPPOLICYOBJECT;
|
||||||
|
|
||||||
|
BOOL SetLGP(BOOL bRestore, BOOL* bExistingKey, const char* szPath, const char* szPolicy, DWORD dwValue)
|
||||||
|
{
|
||||||
|
LONG r;
|
||||||
|
DWORD disp, regtype, val=0, val_size=sizeof(DWORD);
|
||||||
|
HRESULT hr;
|
||||||
|
IGroupPolicyObject* pLGPO;
|
||||||
|
// Along with global 'existing_key', this static value is used to restore initial state
|
||||||
|
static DWORD original_val;
|
||||||
|
HKEY path_key = NULL, policy_key = NULL;
|
||||||
|
// MSVC is finicky about these ones => redefine them
|
||||||
|
const IID my_IID_IGroupPolicyObject =
|
||||||
|
{ 0xea502723, 0xa23d, 0x11d1, { 0xa7, 0xd3, 0x0, 0x0, 0xf8, 0x75, 0x71, 0xe3 } };
|
||||||
|
const IID my_CLSID_GroupPolicyObject =
|
||||||
|
{ 0xea502722, 0xa23d, 0x11d1, { 0xa7, 0xd3, 0x0, 0x0, 0xf8, 0x75, 0x71, 0xe3 } };
|
||||||
|
GUID ext_guid = REGISTRY_EXTENSION_GUID;
|
||||||
|
// Can be anything really
|
||||||
|
GUID snap_guid = { 0x3D271CFC, 0x2BC6, 0x4AC2, {0xB6, 0x33, 0x3B, 0xDF, 0xF5, 0xBD, 0xAB, 0x2A} };
|
||||||
|
|
||||||
|
// We need an IGroupPolicyObject instance to set a Local Group Policy
|
||||||
|
hr = CoCreateInstance(&my_CLSID_GroupPolicyObject, NULL, CLSCTX_INPROC_SERVER, &my_IID_IGroupPolicyObject, (LPVOID*)&pLGPO);
|
||||||
|
if (FAILED(hr)) {
|
||||||
|
uprintf("SetLGP: CoCreateInstance failed; hr = %x\n", hr);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
hr = pLGPO->lpVtbl->OpenLocalMachineGPO(pLGPO, GPO_OPEN_LOAD_REGISTRY);
|
||||||
|
if (FAILED(hr)) {
|
||||||
|
uprintf("SetLGP: OpenLocalMachineGPO failed - error %x\n", hr);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
hr = pLGPO->lpVtbl->GetRegistryKey(pLGPO, GPO_SECTION_MACHINE, &path_key);
|
||||||
|
if (FAILED(hr)) {
|
||||||
|
uprintf("SetLGP: GetRegistryKey failed - error %x\n", hr);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
// The DisableSystemRestore is set in Software\Policies\Microsoft\Windows\DeviceInstall\Settings
|
||||||
|
r = RegCreateKeyExA(path_key, szPath, 0, NULL, 0, KEY_SET_VALUE | KEY_QUERY_VALUE,
|
||||||
|
NULL, &policy_key, &disp);
|
||||||
|
if (r != ERROR_SUCCESS) {
|
||||||
|
uprintf("SetLGP: Failed to open LGPO path %s - error %x\n", szPath, hr);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((disp == REG_OPENED_EXISTING_KEY) && (!bRestore) && (!(*bExistingKey))) {
|
||||||
|
// backup existing value for restore
|
||||||
|
*bExistingKey = TRUE;
|
||||||
|
regtype = REG_DWORD;
|
||||||
|
r = RegQueryValueExA(policy_key, szPolicy, NULL, ®type, (LPBYTE)&original_val, &val_size);
|
||||||
|
if (r == ERROR_FILE_NOT_FOUND) {
|
||||||
|
// The Key exists but not its value, which is OK
|
||||||
|
*bExistingKey = FALSE;
|
||||||
|
} else if (r != ERROR_SUCCESS) {
|
||||||
|
uprintf("SetLGP: Failed to read original %s policy value - error %x\n", szPolicy, r);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((!bRestore) || (*bExistingKey)) {
|
||||||
|
val = (bRestore)?original_val:dwValue;
|
||||||
|
r = RegSetValueExA(policy_key, szPolicy, 0, REG_DWORD, (BYTE*)&val, sizeof(val));
|
||||||
|
} else {
|
||||||
|
r = RegDeleteValueA(policy_key, szPolicy);
|
||||||
|
}
|
||||||
|
if (r != ERROR_SUCCESS) {
|
||||||
|
uprintf("SetLGP: RegSetValueEx / RegDeleteValue failed - error %x\n", r);
|
||||||
|
}
|
||||||
|
RegCloseKey(policy_key);
|
||||||
|
policy_key = NULL;
|
||||||
|
|
||||||
|
// Apply policy
|
||||||
|
hr = pLGPO->lpVtbl->Save(pLGPO, TRUE, (bRestore)?FALSE:TRUE, &ext_guid, &snap_guid);
|
||||||
|
if (r != S_OK) {
|
||||||
|
uprintf("SetLGP: Unable to apply %s policy - error %x\n", szPolicy, hr);
|
||||||
|
goto error;
|
||||||
|
} else {
|
||||||
|
if ((!bRestore) || (*bExistingKey)) {
|
||||||
|
uprintf("SetLGP: Successfully %s %s policy to 0x%08X\n", (bRestore)?"restored":"set", szPolicy, val);
|
||||||
|
} else {
|
||||||
|
uprintf("SetLGP: Successfully removed %s policy key\n", szPolicy);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
RegCloseKey(path_key);
|
||||||
|
pLGPO->lpVtbl->Release(pLGPO);
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
error:
|
||||||
|
if (path_key != NULL) RegCloseKey(path_key);
|
||||||
|
if (policy_key != NULL) RegCloseKey(policy_key);
|
||||||
|
if (pLGPO != NULL) pLGPO->lpVtbl->Release(pLGPO);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
#pragma pop_macro("INTERFACE")
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Rufus: The Reliable USB Formatting Utility
|
* Rufus: The Reliable USB Formatting Utility
|
||||||
* Standard I/O Routines (logging, status, etc.)
|
* Standard User I/O Routines (logging, status, etc.)
|
||||||
* Copyright (c) 2011-2013 Pete Batard <pete@akeo.ie>
|
* Copyright (c) 2011-2013 Pete Batard <pete@akeo.ie>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
@ -132,8 +132,7 @@ static char err_string[256] = {0};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Display a message on the status bar. If duration is non zero, ensures that message
|
* Display a message on the status bar. If duration is non zero, ensures that message
|
||||||
* is displayed for at least duration ms regardless, regardless of any other incoming
|
* is displayed for at least duration ms, regardless of any other incoming message
|
||||||
* message
|
|
||||||
*/
|
*/
|
||||||
static BOOL bStatusTimerArmed = FALSE;
|
static BOOL bStatusTimerArmed = FALSE;
|
||||||
char szStatusMessage[256] = { 0 };
|
char szStatusMessage[256] = { 0 };
|
||||||
|
|
205
src/stdlg.c
205
src/stdlg.c
|
@ -32,7 +32,6 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <shlobj.h>
|
#include <shlobj.h>
|
||||||
#include <commdlg.h>
|
#include <commdlg.h>
|
||||||
#include <sddl.h>
|
|
||||||
#include <richedit.h>
|
#include <richedit.h>
|
||||||
|
|
||||||
#include "rufus.h"
|
#include "rufus.h"
|
||||||
|
@ -61,7 +60,6 @@ static LPITEMIDLIST (WINAPI *pSHSimpleIDListFromPath)(PCWSTR pszPath) = NULL;
|
||||||
static HICON hMessageIcon = (HICON)INVALID_HANDLE_VALUE;
|
static HICON hMessageIcon = (HICON)INVALID_HANDLE_VALUE;
|
||||||
static char* szMessageText = NULL;
|
static char* szMessageText = NULL;
|
||||||
static char* szMessageTitle = NULL;
|
static char* szMessageTitle = NULL;
|
||||||
enum WindowsVersion nWindowsVersion = WINDOWS_UNDEFINED;
|
|
||||||
static HWND hBrowseEdit;
|
static HWND hBrowseEdit;
|
||||||
static WNDPROC pOrgBrowseWndproc;
|
static WNDPROC pOrgBrowseWndproc;
|
||||||
static const SETTEXTEX friggin_microsoft_unicode_amateurs = {ST_DEFAULT, CP_UTF8};
|
static const SETTEXTEX friggin_microsoft_unicode_amateurs = {ST_DEFAULT, CP_UTF8};
|
||||||
|
@ -69,139 +67,6 @@ static BOOL notification_is_question;
|
||||||
static const notification_info* notification_more_info;
|
static const notification_info* notification_more_info;
|
||||||
static BOOL reg_commcheck = FALSE;
|
static BOOL reg_commcheck = FALSE;
|
||||||
|
|
||||||
/*
|
|
||||||
* Detect Windows version
|
|
||||||
*/
|
|
||||||
enum WindowsVersion DetectWindowsVersion(void)
|
|
||||||
{
|
|
||||||
OSVERSIONINFO OSVersion;
|
|
||||||
|
|
||||||
memset(&OSVersion, 0, sizeof(OSVERSIONINFO));
|
|
||||||
OSVersion.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
|
|
||||||
if (GetVersionEx(&OSVersion) == 0)
|
|
||||||
return WINDOWS_UNDEFINED;
|
|
||||||
if (OSVersion.dwPlatformId != VER_PLATFORM_WIN32_NT)
|
|
||||||
return WINDOWS_UNSUPPORTED;
|
|
||||||
// See the Remarks section from http://msdn.microsoft.com/en-us/library/windows/desktop/ms724833.aspx
|
|
||||||
if ((OSVersion.dwMajorVersion < 5) || ((OSVersion.dwMajorVersion == 5) && (OSVersion.dwMinorVersion == 0)))
|
|
||||||
return WINDOWS_UNSUPPORTED; // Win2k or earlier
|
|
||||||
if ((OSVersion.dwMajorVersion == 5) && (OSVersion.dwMinorVersion == 1))
|
|
||||||
return WINDOWS_XP;
|
|
||||||
if ((OSVersion.dwMajorVersion == 5) && (OSVersion.dwMinorVersion == 2))
|
|
||||||
return WINDOWS_2003;
|
|
||||||
if ((OSVersion.dwMajorVersion == 6) && (OSVersion.dwMinorVersion == 0))
|
|
||||||
return WINDOWS_VISTA;
|
|
||||||
if ((OSVersion.dwMajorVersion == 6) && (OSVersion.dwMinorVersion == 1))
|
|
||||||
return WINDOWS_7;
|
|
||||||
if ((OSVersion.dwMajorVersion == 6) && (OSVersion.dwMinorVersion == 2))
|
|
||||||
return WINDOWS_8;
|
|
||||||
if ((OSVersion.dwMajorVersion > 6) || ((OSVersion.dwMajorVersion == 6) && (OSVersion.dwMinorVersion >= 3)))
|
|
||||||
return WINDOWS_9;
|
|
||||||
return WINDOWS_UNSUPPORTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* String array manipulation
|
|
||||||
*/
|
|
||||||
void StrArrayCreate(StrArray* arr, size_t initial_size)
|
|
||||||
{
|
|
||||||
if (arr == NULL) return;
|
|
||||||
arr->Max = initial_size; arr->Index = 0;
|
|
||||||
arr->Table = (char**)calloc(arr->Max, sizeof(char*));
|
|
||||||
if (arr->Table == NULL)
|
|
||||||
uprintf("Could not allocate string array\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
void StrArrayAdd(StrArray* arr, const char* str)
|
|
||||||
{
|
|
||||||
char** old_table;
|
|
||||||
if ((arr == NULL) || (arr->Table == NULL))
|
|
||||||
return;
|
|
||||||
if (arr->Index == arr->Max) {
|
|
||||||
arr->Max *= 2;
|
|
||||||
old_table = arr->Table;
|
|
||||||
arr->Table = (char**)realloc(arr->Table, arr->Max*sizeof(char*));
|
|
||||||
if (arr->Table == NULL) {
|
|
||||||
free(old_table);
|
|
||||||
uprintf("Could not reallocate string array\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
arr->Table[arr->Index] = safe_strdup(str);
|
|
||||||
if (arr->Table[arr->Index++] == NULL) {
|
|
||||||
uprintf("Could not store string in array\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void StrArrayClear(StrArray* arr)
|
|
||||||
{
|
|
||||||
size_t i;
|
|
||||||
if ((arr == NULL) || (arr->Table == NULL))
|
|
||||||
return;
|
|
||||||
for (i=0; i<arr->Index; i++) {
|
|
||||||
safe_free(arr->Table[i]);
|
|
||||||
}
|
|
||||||
arr->Index = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void StrArrayDestroy(StrArray* arr)
|
|
||||||
{
|
|
||||||
StrArrayClear(arr);
|
|
||||||
if (arr != NULL)
|
|
||||||
safe_free(arr->Table);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Retrieve the SID of the current user. The returned PSID must be freed by the caller using LocalFree()
|
|
||||||
*/
|
|
||||||
static PSID GetSID(void) {
|
|
||||||
TOKEN_USER* tu = NULL;
|
|
||||||
DWORD len;
|
|
||||||
HANDLE token;
|
|
||||||
PSID ret = NULL;
|
|
||||||
char* psid_string = NULL;
|
|
||||||
|
|
||||||
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &token)) {
|
|
||||||
uprintf("OpenProcessToken failed: %s\n", WindowsErrorString());
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!GetTokenInformation(token, TokenUser, tu, 0, &len)) {
|
|
||||||
if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) {
|
|
||||||
uprintf("GetTokenInformation (pre) failed: %s\n", WindowsErrorString());
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
tu = (TOKEN_USER*)calloc(1, len);
|
|
||||||
}
|
|
||||||
if (tu == NULL) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (GetTokenInformation(token, TokenUser, tu, len, &len)) {
|
|
||||||
/*
|
|
||||||
* now of course, the interesting thing is that if you return tu->User.Sid
|
|
||||||
* but free tu, the PSID pointer becomes invalid after a while.
|
|
||||||
* The workaround? Convert to string then back to PSID
|
|
||||||
*/
|
|
||||||
if (!ConvertSidToStringSidA(tu->User.Sid, &psid_string)) {
|
|
||||||
uprintf("Unable to convert SID to string: %s\n", WindowsErrorString());
|
|
||||||
ret = NULL;
|
|
||||||
} else {
|
|
||||||
if (!ConvertStringSidToSidA(psid_string, &ret)) {
|
|
||||||
uprintf("Unable to convert string back to SID: %s\n", WindowsErrorString());
|
|
||||||
ret = NULL;
|
|
||||||
}
|
|
||||||
// MUST use LocalFree()
|
|
||||||
LocalFree(psid_string);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
ret = NULL;
|
|
||||||
uprintf("GetTokenInformation (real) failed: %s\n", WindowsErrorString());
|
|
||||||
}
|
|
||||||
free(tu);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We need a sub-callback to read the content of the edit box on exit and update
|
* We need a sub-callback to read the content of the edit box on exit and update
|
||||||
* our path, else if what the user typed does match the selection, it is discarded.
|
* our path, else if what the user typed does match the selection, it is discarded.
|
||||||
|
@ -369,76 +234,6 @@ fallback:
|
||||||
dialog_showing--;
|
dialog_showing--;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* read or write I/O to a file
|
|
||||||
* buffer is allocated by the procedure. path is UTF-8
|
|
||||||
*/
|
|
||||||
BOOL FileIO(BOOL save, char* path, char** buffer, DWORD* size)
|
|
||||||
{
|
|
||||||
SECURITY_ATTRIBUTES s_attr, *ps = NULL;
|
|
||||||
SECURITY_DESCRIPTOR s_desc;
|
|
||||||
PSID sid = NULL;
|
|
||||||
HANDLE handle;
|
|
||||||
BOOL r;
|
|
||||||
BOOL ret = FALSE;
|
|
||||||
|
|
||||||
// Change the owner from admin to regular user
|
|
||||||
sid = GetSID();
|
|
||||||
if ( (sid != NULL)
|
|
||||||
&& InitializeSecurityDescriptor(&s_desc, SECURITY_DESCRIPTOR_REVISION)
|
|
||||||
&& SetSecurityDescriptorOwner(&s_desc, sid, FALSE) ) {
|
|
||||||
s_attr.nLength = sizeof(SECURITY_ATTRIBUTES);
|
|
||||||
s_attr.bInheritHandle = FALSE;
|
|
||||||
s_attr.lpSecurityDescriptor = &s_desc;
|
|
||||||
ps = &s_attr;
|
|
||||||
} else {
|
|
||||||
uprintf("Could not set security descriptor: %s\n", WindowsErrorString());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!save) {
|
|
||||||
*buffer = NULL;
|
|
||||||
}
|
|
||||||
handle = CreateFileU(path, save?GENERIC_WRITE:GENERIC_READ, FILE_SHARE_READ,
|
|
||||||
ps, save?CREATE_ALWAYS:OPEN_EXISTING, 0, NULL);
|
|
||||||
|
|
||||||
if (handle == INVALID_HANDLE_VALUE) {
|
|
||||||
uprintf("Could not %s file '%s'\n", save?"create":"open", path);
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (save) {
|
|
||||||
r = WriteFile(handle, *buffer, *size, size, NULL);
|
|
||||||
} else {
|
|
||||||
*size = GetFileSize(handle, NULL);
|
|
||||||
*buffer = (char*)malloc(*size);
|
|
||||||
if (*buffer == NULL) {
|
|
||||||
uprintf("Could not allocate buffer for reading file\n");
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
r = ReadFile(handle, *buffer, *size, size, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!r) {
|
|
||||||
uprintf("I/O Error: %s\n", WindowsErrorString());
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
PrintStatus(0, TRUE, "%s '%s'", save?"Saved":"Opened", path);
|
|
||||||
ret = TRUE;
|
|
||||||
|
|
||||||
out:
|
|
||||||
CloseHandle(handle);
|
|
||||||
if (!ret) {
|
|
||||||
// Only leave a buffer allocated if successful
|
|
||||||
*size = 0;
|
|
||||||
if (!save) {
|
|
||||||
safe_free(*buffer);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return the UTF8 path of a file selected through a load or save dialog
|
* Return the UTF8 path of a file selected through a load or save dialog
|
||||||
* Will use the newer IFileOpenDialog if *compiled* for Vista or later
|
* Will use the newer IFileOpenDialog if *compiled* for Vista or later
|
||||||
|
|
|
@ -84,7 +84,7 @@ BOOL InstallSyslinux(DWORD num, const char* drive_name)
|
||||||
int ldlinux_sectors;
|
int ldlinux_sectors;
|
||||||
uint32_t ldlinux_cluster;
|
uint32_t ldlinux_cluster;
|
||||||
int nsectors;
|
int nsectors;
|
||||||
int dt = (int)ComboBox_GetItemData(hDOSType, ComboBox_GetCurSel(hDOSType));
|
int dt = (int)ComboBox_GetItemData(hBootType, ComboBox_GetCurSel(hBootType));
|
||||||
|
|
||||||
ldlinux_name[0] = drive_name[0];
|
ldlinux_name[0] = drive_name[0];
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue