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="..\parser.c" />
|
||||
<ClCompile Include="..\rufus.c" />
|
||||
<ClCompile Include="..\stdfn.c" />
|
||||
<ClCompile Include="..\stdio.c" />
|
||||
<ClCompile Include="..\stdlg.c" />
|
||||
<ClCompile Include="..\syslinux.c" />
|
||||
|
|
|
@ -57,6 +57,9 @@
|
|||
<ClCompile Include="..\vhd.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\stdfn.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="..\rufus.h">
|
||||
|
|
|
@ -31,6 +31,7 @@ SXS_APPLICATION_MANIFEST=..\common_controls_and_elevation.manifest
|
|||
SOURCES=rufus.c \
|
||||
format.c \
|
||||
stdio.c \
|
||||
stdfn.c \
|
||||
stdlg.c \
|
||||
icon.c \
|
||||
parser.c \
|
||||
|
|
|
@ -9,7 +9,7 @@ pkg_v_rc_0 = @echo " RC $@";
|
|||
%_rc.o: %.rc
|
||||
$(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_LDFLAGS = $(AM_LDFLAGS) -mwindows
|
||||
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-badblocks.$(OBJEXT) rufus-syslinux.$(OBJEXT) \
|
||||
rufus-vhd.$(OBJEXT) rufus-format.$(OBJEXT) \
|
||||
rufus-stdio.$(OBJEXT) rufus-stdlg.$(OBJEXT) \
|
||||
rufus-rufus.$(OBJEXT)
|
||||
rufus-stdio.$(OBJEXT) rufus-stdfn.$(OBJEXT) \
|
||||
rufus-stdlg.$(OBJEXT) rufus-rufus.$(OBJEXT)
|
||||
rufus_OBJECTS = $(am_rufus_OBJECTS)
|
||||
rufus_DEPENDENCIES = rufus_rc.o ms-sys/libmssys.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_$(AM_DEFAULT_VERBOSITY))
|
||||
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_LDFLAGS = $(AM_LDFLAGS) -mwindows
|
||||
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@
|
||||
$(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
|
||||
$(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
|
||||
|
|
|
@ -451,7 +451,7 @@ BOOL ExtractFreeDOS(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:
|
||||
return ExtractMSDOS(path);
|
||||
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;
|
||||
}
|
||||
|
||||
/*
|
||||
* 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)
|
||||
{
|
||||
DWORD size;
|
||||
|
|
12
src/format.c
12
src/format.c
|
@ -849,7 +849,7 @@ static BOOL WriteMBR(HANDLE hPhysicalDrive)
|
|||
buf[0x1c2] = 0x0c;
|
||||
break;
|
||||
}
|
||||
if (IsChecked(IDC_DOS)) {
|
||||
if (IsChecked(IDC_BOOT)) {
|
||||
// Set first partition bootable - masquerade as per the DiskID selected
|
||||
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]);
|
||||
|
@ -864,7 +864,7 @@ static BOOL WriteMBR(HANDLE hPhysicalDrive)
|
|||
fake_fd._ptr = (char*)hPhysicalDrive;
|
||||
fake_fd._bufsiz = SelectedDrive.Geometry.BytesPerSector;
|
||||
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))) ) {
|
||||
r = write_syslinux_mbr(&fake_fd);
|
||||
} else {
|
||||
|
@ -889,7 +889,7 @@ static BOOL WritePBR(HANDLE hLogicalVolume)
|
|||
{
|
||||
int i;
|
||||
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._bufsiz = SelectedDrive.Geometry.BytesPerSector;
|
||||
|
@ -1123,7 +1123,7 @@ DWORD WINAPI FormatThread(LPVOID param)
|
|||
FILE* log_fd;
|
||||
|
||||
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)));
|
||||
bt = GETBIOSTYPE((int)ComboBox_GetItemData(hPartitionScheme, ComboBox_GetCurSel(hPartitionScheme)));
|
||||
|
||||
|
@ -1250,7 +1250,7 @@ DWORD WINAPI FormatThread(LPVOID param)
|
|||
UpdateProgress(OP_FIX_MBR, -1.0f);
|
||||
}
|
||||
|
||||
if (IsChecked(IDC_DOS)) {
|
||||
if (IsChecked(IDC_BOOT)) {
|
||||
if (bt == BT_UEFI) {
|
||||
// For once, no need to do anything - just check our sanity
|
||||
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]))
|
||||
goto out;
|
||||
|
||||
if (IsChecked(IDC_DOS)) {
|
||||
if (IsChecked(IDC_BOOT)) {
|
||||
if ((dt == DT_WINME) || (dt == DT_FREEDOS)) {
|
||||
UpdateProgress(OP_DOS, -1.0f);
|
||||
PrintStatus(0, TRUE, "Copying DOS files...");
|
||||
|
|
|
@ -54,10 +54,10 @@
|
|||
#define IDC_ABOUT 1007
|
||||
#define IDC_LABEL 1008
|
||||
#define IDC_QUICKFORMAT 1009
|
||||
#define IDC_DOS 1010
|
||||
#define IDC_BOOT 1010
|
||||
#define IDC_BADBLOCKS 1011
|
||||
#define IDC_PROGRESS 1012
|
||||
#define IDC_DOSTYPE 1013
|
||||
#define IDC_BOOTTYPE 1013
|
||||
#define IDC_NBPASSES 1014
|
||||
#define IDC_TEST 1015
|
||||
#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;
|
||||
float fScale = 1.0f;
|
||||
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;
|
||||
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;
|
||||
|
@ -112,7 +112,7 @@ RUFUS_UPDATE update = { {0,0,0,0}, {0,0}, NULL, NULL};
|
|||
extern char szStatusMessage[256];
|
||||
|
||||
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 StrArray DriveID, DriveLabel;
|
||||
static char szTimer[12] = "00:00:00";
|
||||
|
@ -319,101 +319,23 @@ static BOOL SetClusterSizes(int FSType)
|
|||
*/
|
||||
static BOOL GetDriveInfo(int ComboIndex)
|
||||
{
|
||||
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], fs_type[32];
|
||||
DWORD i, nb_partitions = 0;
|
||||
DWORD i;
|
||||
char fs_type[32];
|
||||
|
||||
memset(&SelectedDrive, 0, sizeof(SelectedDrive));
|
||||
SelectedDrive.DeviceNumber = (DWORD)ComboBox_GetItemData(hDeviceList, ComboIndex);
|
||||
|
||||
hDrive = GetDriveHandle(SelectedDrive.DeviceNumber, DrivePath, FALSE, FALSE);
|
||||
if (hDrive == INVALID_HANDLE_VALUE)
|
||||
if (!GetDrivePartitionData(SelectedDrive.DeviceNumber, fs_type, sizeof(fs_type)))
|
||||
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()) {
|
||||
uprintf("no file system is selectable for this drive\n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// re-select existing FS if it's one we know
|
||||
if (GetVolumeInformationA(DrivePath, NULL, 0, NULL, NULL, NULL,
|
||||
fs_type, sizeof(fs_type))) {
|
||||
SelectedDrive.FSType = FS_UNKNOWN;
|
||||
if (safe_strlen(fs_type) != 0) {
|
||||
for (SelectedDrive.FSType=FS_MAX-1; SelectedDrive.FSType>=0; SelectedDrive.FSType--) {
|
||||
if (safe_strcmp(fs_type, FileSystemLabel[SelectedDrive.FSType]) == 0) {
|
||||
break;
|
||||
|
@ -488,7 +410,7 @@ static void SetFSFromISO(void)
|
|||
void SetMBRProps(void)
|
||||
{
|
||||
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));
|
||||
|
||||
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)
|
||||
{
|
||||
EnableWindow(hDOS, enable);
|
||||
EnableWindow(hDOSType, enable);
|
||||
EnableWindow(hBoot, enable);
|
||||
EnableWindow(hBootType, enable);
|
||||
EnableWindow(hSelectISO, enable);
|
||||
EnableWindow(GetDlgItem(hMainDialog, IDC_RUFUS_MBR), 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;
|
||||
|
||||
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(&slot_end, 0, sizeof(slot_end));
|
||||
previous_end = 0.0f;
|
||||
|
@ -759,7 +681,7 @@ static void InitProgress(void)
|
|||
if (IsChecked(IDC_BADBLOCKS)) {
|
||||
nb_slots[OP_BADBLOCKS] = -1;
|
||||
}
|
||||
if (IsChecked(IDC_DOS)) {
|
||||
if (IsChecked(IDC_BOOT)) {
|
||||
// 1 extra slot for PBR writing
|
||||
switch (dt) {
|
||||
case DT_WINME:
|
||||
|
@ -855,138 +777,6 @@ void UpdateProgress(int op, float percent)
|
|||
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
|
||||
*/
|
||||
|
@ -1002,14 +792,14 @@ static void EnableControls(BOOL bEnable)
|
|||
EnableWindow(GetDlgItem(hMainDialog, IDC_QUICKFORMAT), bEnable);
|
||||
if (bEnable) {
|
||||
fs = (int)ComboBox_GetItemData(hFileSystem, ComboBox_GetCurSel(hFileSystem));
|
||||
EnableWindow(hDOS, (fs == FS_FAT16) || (fs == FS_FAT32) || (fs == FS_NTFS));
|
||||
EnableWindow(hDOSType, (fs == FS_FAT16) || (fs == FS_FAT32) || (fs == FS_NTFS));
|
||||
EnableWindow(hBoot, (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(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));
|
||||
} else {
|
||||
EnableWindow(hDOS, FALSE);
|
||||
EnableWindow(hDOSType, FALSE);
|
||||
EnableWindow(hBoot, FALSE);
|
||||
EnableWindow(hBootType, FALSE);
|
||||
EnableWindow(hDiskID, FALSE);
|
||||
EnableWindow(GetDlgItem(hMainDialog, IDC_RUFUS_MBR), 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
|
||||
CheckDlgButton(hMainDialog, IDC_DOS, BST_CHECKED);
|
||||
CheckDlgButton(hMainDialog, IDC_BOOT, BST_CHECKED);
|
||||
SetFSFromISO();
|
||||
SetMBRProps();
|
||||
for (i=(int)safe_strlen(iso_path); (i>0)&&(iso_path[i]!='\\'); i--);
|
||||
|
@ -1255,7 +1045,6 @@ out:
|
|||
ExitThread(0);
|
||||
}
|
||||
|
||||
|
||||
void MoveControl(int nID, float vertical_shift)
|
||||
{
|
||||
RECT rect;
|
||||
|
@ -1330,8 +1119,8 @@ void InitDialog(HWND hDlg)
|
|||
hClusterSize = GetDlgItem(hDlg, IDC_CLUSTERSIZE);
|
||||
hLabel = GetDlgItem(hDlg, IDC_LABEL);
|
||||
hProgress = GetDlgItem(hDlg, IDC_PROGRESS);
|
||||
hDOS = GetDlgItem(hDlg, IDC_DOS);
|
||||
hDOSType = GetDlgItem(hDlg, IDC_DOSTYPE);
|
||||
hBoot = GetDlgItem(hDlg, IDC_BOOT);
|
||||
hBootType = GetDlgItem(hDlg, IDC_BOOTTYPE);
|
||||
hSelectISO = GetDlgItem(hDlg, IDC_SELECT_ISO);
|
||||
hNBPasses = GetDlgItem(hDlg, IDC_NBPASSES);
|
||||
hDiskID = GetDlgItem(hDlg, IDC_DISK_ID);
|
||||
|
@ -1379,10 +1168,10 @@ void InitDialog(HWND hDlg)
|
|||
IGNORE_RETVAL(ComboBox_SetCurSel(hNBPasses, 1));
|
||||
CreateTooltip(hNBPasses, "Pattern: 0x55, 0xAA", -1);
|
||||
// Fill up the DOS type dropdown
|
||||
IGNORE_RETVAL(ComboBox_SetItemData(hDOSType, ComboBox_AddStringU(hDOSType, "MS-DOS"), DT_WINME));
|
||||
IGNORE_RETVAL(ComboBox_SetItemData(hDOSType, ComboBox_AddStringU(hDOSType, "FreeDOS"), DT_FREEDOS));
|
||||
IGNORE_RETVAL(ComboBox_SetItemData(hDOSType, ComboBox_AddStringU(hDOSType, "ISO Image"), DT_ISO));
|
||||
IGNORE_RETVAL(ComboBox_SetCurSel(hDOSType, selection_default));
|
||||
IGNORE_RETVAL(ComboBox_SetItemData(hBootType, ComboBox_AddStringU(hBootType, "MS-DOS"), DT_WINME));
|
||||
IGNORE_RETVAL(ComboBox_SetItemData(hBootType, ComboBox_AddStringU(hBootType, "FreeDOS"), DT_FREEDOS));
|
||||
IGNORE_RETVAL(ComboBox_SetItemData(hBootType, ComboBox_AddStringU(hBootType, "ISO Image"), DT_ISO));
|
||||
IGNORE_RETVAL(ComboBox_SetCurSel(hBootType, selection_default));
|
||||
// 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));
|
||||
for (i=1; i<=7; i++) {
|
||||
|
@ -1396,7 +1185,7 @@ void InitDialog(HWND hDlg)
|
|||
StrArrayCreate(&DriveLabel, MAX_DRIVES);
|
||||
// Set various checkboxes
|
||||
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);
|
||||
|
||||
// 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_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(hDOS, "Check this box to make the USB drive bootable", -1);
|
||||
CreateTooltip(hDOSType, "Boot method", -1);
|
||||
CreateTooltip(hBoot, "Check this box to make the USB drive bootable", -1);
|
||||
CreateTooltip(hBootType, "Boot method", -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 "
|
||||
"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);
|
||||
SetMBRProps();
|
||||
// Remove the SysLinux option if exists
|
||||
if (ComboBox_GetItemData(hDOSType, ComboBox_GetCount(hDOSType)-1) == DT_SYSLINUX) {
|
||||
IGNORE_RETVAL(ComboBox_DeleteString(hDOSType, ComboBox_GetCount(hDOSType)-1));
|
||||
IGNORE_RETVAL(ComboBox_SetCurSel(hDOSType, 1));
|
||||
if (ComboBox_GetItemData(hBootType, ComboBox_GetCount(hBootType)-1) == DT_SYSLINUX) {
|
||||
IGNORE_RETVAL(ComboBox_DeleteString(hBootType, ComboBox_GetCount(hBootType)-1));
|
||||
IGNORE_RETVAL(ComboBox_SetCurSel(hBootType, 1));
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (fs == FS_EXFAT) {
|
||||
if (IsWindowEnabled(hDOS)) {
|
||||
if (IsWindowEnabled(hBoot)) {
|
||||
// unlikely to be supported by BIOSes => don't bother
|
||||
IGNORE_RETVAL(ComboBox_SetCurSel(hDOSType, 0));
|
||||
uDOSChecked = IsDlgButtonChecked(hMainDialog, IDC_DOS);
|
||||
CheckDlgButton(hDlg, IDC_DOS, BST_UNCHECKED);
|
||||
IGNORE_RETVAL(ComboBox_SetCurSel(hBootType, 0));
|
||||
uDOSChecked = IsDlgButtonChecked(hMainDialog, IDC_BOOT);
|
||||
CheckDlgButton(hDlg, IDC_BOOT, BST_UNCHECKED);
|
||||
EnableBootOptions(FALSE);
|
||||
}
|
||||
SetMBRProps();
|
||||
break;
|
||||
}
|
||||
IGNORE_RETVAL(ComboBox_ResetContent(hDOSType));
|
||||
IGNORE_RETVAL(ComboBox_ResetContent(hBootType));
|
||||
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(hDOSType, ComboBox_AddStringU(hDOSType, "FreeDOS"), DT_FREEDOS));
|
||||
IGNORE_RETVAL(ComboBox_SetItemData(hBootType, ComboBox_AddStringU(hBootType, "MS-DOS"), DT_WINME));
|
||||
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 ( (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)) ) {
|
||||
selection_default = DT_FREEDOS;
|
||||
CheckDlgButton(hDlg, IDC_DISK_ID, BST_UNCHECKED);
|
||||
}
|
||||
for (i=0; i<ComboBox_GetCount(hDOSType); i++) {
|
||||
if (ComboBox_GetItemData(hDOSType, i) == selection_default) {
|
||||
IGNORE_RETVAL(ComboBox_SetCurSel(hDOSType, i));
|
||||
for (i=0; i<ComboBox_GetCount(hBootType); i++) {
|
||||
if (ComboBox_GetItemData(hBootType, i) == selection_default) {
|
||||
IGNORE_RETVAL(ComboBox_SetCurSel(hBootType, i));
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (i == ComboBox_GetCount(hDOSType))
|
||||
IGNORE_RETVAL(ComboBox_SetCurSel(hDOSType, 0));
|
||||
if (!IsWindowEnabled(hDOS)) {
|
||||
EnableWindow(hDOS, TRUE);
|
||||
EnableWindow(hDOSType, TRUE);
|
||||
if (i == ComboBox_GetCount(hBootType))
|
||||
IGNORE_RETVAL(ComboBox_SetCurSel(hBootType, 0));
|
||||
if (!IsWindowEnabled(hBoot)) {
|
||||
EnableWindow(hBoot, TRUE);
|
||||
EnableWindow(hBootType, TRUE);
|
||||
EnableWindow(hSelectISO, TRUE);
|
||||
CheckDlgButton(hDlg, IDC_DOS, uDOSChecked);
|
||||
CheckDlgButton(hDlg, IDC_BOOT, uDOSChecked);
|
||||
}
|
||||
SetMBRProps();
|
||||
break;
|
||||
case IDC_DOSTYPE:
|
||||
case IDC_BOOTTYPE:
|
||||
if (HIWORD(wParam) != CBN_SELCHANGE)
|
||||
break;
|
||||
selection_default = (int) ComboBox_GetItemData(hDOSType, ComboBox_GetCurSel(hDOSType));
|
||||
if (ComboBox_GetItemData(hDOSType, ComboBox_GetCurSel(hDOSType)) == DT_ISO) {
|
||||
selection_default = (int) ComboBox_GetItemData(hBootType, ComboBox_GetCurSel(hBootType));
|
||||
if (ComboBox_GetItemData(hBootType, ComboBox_GetCurSel(hBootType)) == DT_ISO) {
|
||||
if ((iso_path == NULL) || (iso_report.label[0] == 0)) {
|
||||
// Set focus to the Select ISO button
|
||||
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);
|
||||
SetTaskbarProgressValue(0, MAX_PROGRESS);
|
||||
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);
|
||||
if (nDeviceIndex != CB_ERR) {
|
||||
if (IsChecked(IDC_DOS)) {
|
||||
if (ComboBox_GetItemData(hDOSType, ComboBox_GetCurSel(hDOSType)) == DT_ISO) {
|
||||
if (IsChecked(IDC_BOOT)) {
|
||||
if (ComboBox_GetItemData(hBootType, ComboBox_GetCurSel(hBootType)) == DT_ISO) {
|
||||
if (iso_path == NULL) {
|
||||
MessageBoxA(hMainDialog, "Please click on the disc button to select a bootable ISO,\n"
|
||||
"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
|
||||
// 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
|
||||
if ( (hDlg = CreateDialogA(hInstance, MAKEINTRESOURCEA(IDD_DIALOG), NULL, MainCallback)) == NULL ) {
|
||||
|
@ -2003,7 +1792,7 @@ out:
|
|||
safe_free(iso_path);
|
||||
safe_free(update.download_url);
|
||||
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);
|
||||
uprintf("*** RUFUS EXIT ***\n");
|
||||
|
||||
|
|
|
@ -239,7 +239,7 @@ enum WindowsVersion {
|
|||
*/
|
||||
extern HINSTANCE hMainInstance;
|
||||
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 float fScale;
|
||||
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);
|
||||
extern BOOL CreatePartition(HANDLE hDrive, int partition_style, int file_system);
|
||||
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 BOOL GetDriveLabel(DWORD DriveIndex, char* letter, char** label);
|
||||
extern BOOL UnmountDrive(HANDLE hDrive);
|
||||
|
@ -292,6 +293,7 @@ extern BOOL CreateProgress(void);
|
|||
extern BOOL SetAutorun(const char* path);
|
||||
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 SetLGP(BOOL bRestore, BOOL* bExistingKey, const char* szPath, const char* szPolicy, DWORD dwValue);
|
||||
extern LONG GetEntryWidth(HWND hDropDown, const char* entry);
|
||||
extern BOOL DownloadFile(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
|
||||
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
EXSTYLE WS_EX_APPWINDOW
|
||||
CAPTION "Rufus v1.3.2.227"
|
||||
CAPTION "Rufus v1.3.2.228"
|
||||
FONT 8, "MS Shell Dlg", 400, 0, 0x1
|
||||
BEGIN
|
||||
DEFPUSHBUTTON "Start",IDC_START,94,278,50,14
|
||||
|
@ -48,13 +48,13 @@ BEGIN
|
|||
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 "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,
|
||||
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,198,131,10
|
||||
LTEXT "New volume label",IDC_STATIC,9,121,105,10
|
||||
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_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 "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
|
||||
|
@ -274,8 +274,8 @@ END
|
|||
//
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION 1,3,2,227
|
||||
PRODUCTVERSION 1,3,2,227
|
||||
FILEVERSION 1,3,2,228
|
||||
PRODUCTVERSION 1,3,2,228
|
||||
FILEFLAGSMASK 0x3fL
|
||||
#ifdef _DEBUG
|
||||
FILEFLAGS 0x1L
|
||||
|
@ -292,13 +292,13 @@ BEGIN
|
|||
BEGIN
|
||||
VALUE "CompanyName", "Akeo Consulting (http://akeo.ie)"
|
||||
VALUE "FileDescription", "Rufus"
|
||||
VALUE "FileVersion", "1.3.2.227"
|
||||
VALUE "FileVersion", "1.3.2.228"
|
||||
VALUE "InternalName", "Rufus"
|
||||
VALUE "LegalCopyright", "(c) 2011-2012 Pete Batard (GPL v3)"
|
||||
VALUE "LegalTrademarks", "http://www.gnu.org/copyleft/gpl.html"
|
||||
VALUE "OriginalFilename", "rufus.exe"
|
||||
VALUE "ProductName", "Rufus"
|
||||
VALUE "ProductVersion", "1.3.2.227"
|
||||
VALUE "ProductVersion", "1.3.2.228"
|
||||
END
|
||||
END
|
||||
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
|
||||
* Standard I/O Routines (logging, status, etc.)
|
||||
* Standard User I/O Routines (logging, status, etc.)
|
||||
* Copyright (c) 2011-2013 Pete Batard <pete@akeo.ie>
|
||||
*
|
||||
* 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
|
||||
* is displayed for at least duration ms regardless, regardless of any other incoming
|
||||
* message
|
||||
* is displayed for at least duration ms, regardless of any other incoming message
|
||||
*/
|
||||
static BOOL bStatusTimerArmed = FALSE;
|
||||
char szStatusMessage[256] = { 0 };
|
||||
|
|
205
src/stdlg.c
205
src/stdlg.c
|
@ -32,7 +32,6 @@
|
|||
#include <string.h>
|
||||
#include <shlobj.h>
|
||||
#include <commdlg.h>
|
||||
#include <sddl.h>
|
||||
#include <richedit.h>
|
||||
|
||||
#include "rufus.h"
|
||||
|
@ -61,7 +60,6 @@ static LPITEMIDLIST (WINAPI *pSHSimpleIDListFromPath)(PCWSTR pszPath) = NULL;
|
|||
static HICON hMessageIcon = (HICON)INVALID_HANDLE_VALUE;
|
||||
static char* szMessageText = NULL;
|
||||
static char* szMessageTitle = NULL;
|
||||
enum WindowsVersion nWindowsVersion = WINDOWS_UNDEFINED;
|
||||
static HWND hBrowseEdit;
|
||||
static WNDPROC pOrgBrowseWndproc;
|
||||
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 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
|
||||
* our path, else if what the user typed does match the selection, it is discarded.
|
||||
|
@ -369,76 +234,6 @@ fallback:
|
|||
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
|
||||
* 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;
|
||||
uint32_t ldlinux_cluster;
|
||||
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];
|
||||
|
||||
|
|
Loading…
Reference in a new issue