mirror of
https://github.com/pbatard/rufus.git
synced 2024-08-14 23:57:05 +00:00
[core] add UDF filesystem support
* Only supported on Vista or later * Also disable exFAT for XP (requires a KB => not worth it) * Also improve display of partition data for type 0x07 * Also fix and issue where exFAT/UDF would try to modify PBR * Also logically move and simplify some of the code * Closes #157
This commit is contained in:
parent
081f1eefe7
commit
4ac182830d
6 changed files with 146 additions and 96 deletions
103
src/drive.c
103
src/drive.c
|
@ -413,6 +413,14 @@ BOOL GetDrivePartitionData(DWORD DriveIndex, char* FileSystemName, DWORD FileSys
|
||||||
char tmp[256];
|
char tmp[256];
|
||||||
DWORD i, nb_partitions = 0;
|
DWORD i, nb_partitions = 0;
|
||||||
|
|
||||||
|
// Populate the filesystem data
|
||||||
|
FileSystemName[0] = 0;
|
||||||
|
volume_name = GetLogicalName(DriveIndex, TRUE, FALSE);
|
||||||
|
if ((volume_name == NULL) || (!GetVolumeInformationA(volume_name, NULL, 0, NULL, NULL, NULL, FileSystemName, FileSystemNameSize))) {
|
||||||
|
uprintf("No volume information for disk 0x%02x\n", DriveIndex);
|
||||||
|
}
|
||||||
|
safe_free(volume_name);
|
||||||
|
|
||||||
hPhysical = GetPhysicalHandle(DriveIndex, FALSE, FALSE);
|
hPhysical = GetPhysicalHandle(DriveIndex, FALSE, FALSE);
|
||||||
if (hPhysical == INVALID_HANDLE_VALUE)
|
if (hPhysical == INVALID_HANDLE_VALUE)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -453,7 +461,8 @@ BOOL GetDrivePartitionData(DWORD DriveIndex, char* FileSystemName, DWORD FileSys
|
||||||
uprintf("Partition %d:\n", DriveLayout->PartitionEntry[i].PartitionNumber);
|
uprintf("Partition %d:\n", DriveLayout->PartitionEntry[i].PartitionNumber);
|
||||||
part_type = DriveLayout->PartitionEntry[i].Mbr.PartitionType;
|
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",
|
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),
|
((part_type==0x07)&&(FileSystemName[0]!=0))?FileSystemName:GetPartitionType(part_type), part_type,
|
||||||
|
SizeToHumanReadable(DriveLayout->PartitionEntry[i].PartitionLength),
|
||||||
DriveLayout->PartitionEntry[i].PartitionLength, DriveLayout->PartitionEntry[i].Mbr.HiddenSectors,
|
DriveLayout->PartitionEntry[i].PartitionLength, DriveLayout->PartitionEntry[i].Mbr.HiddenSectors,
|
||||||
DriveLayout->PartitionEntry[i].Mbr.BootIndicator?"Yes":"No",
|
DriveLayout->PartitionEntry[i].Mbr.BootIndicator?"Yes":"No",
|
||||||
DriveLayout->PartitionEntry[i].Mbr.RecognizedPartition?"Yes":"No");
|
DriveLayout->PartitionEntry[i].Mbr.RecognizedPartition?"Yes":"No");
|
||||||
|
@ -487,17 +496,34 @@ BOOL GetDrivePartitionData(DWORD DriveIndex, char* FileSystemName, DWORD FileSys
|
||||||
}
|
}
|
||||||
safe_closehandle(hPhysical);
|
safe_closehandle(hPhysical);
|
||||||
|
|
||||||
// Populate the filesystem data
|
|
||||||
volume_name = GetLogicalName(DriveIndex, TRUE, FALSE);
|
|
||||||
if ((volume_name == NULL) || (!GetVolumeInformationA(volume_name, NULL, 0, NULL, NULL, NULL, FileSystemName, FileSystemNameSize))) {
|
|
||||||
uprintf("No volume information for disk 0x%02x\n", DriveIndex);
|
|
||||||
FileSystemName[0] = 0;
|
|
||||||
}
|
|
||||||
safe_free(volume_name);
|
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Flush file data
|
||||||
|
*/
|
||||||
|
static BOOL FlushDrive(char drive_letter)
|
||||||
|
{
|
||||||
|
HANDLE hDrive = INVALID_HANDLE_VALUE;
|
||||||
|
BOOL r = FALSE;
|
||||||
|
char logical_drive[] = "\\\\.\\#:";
|
||||||
|
|
||||||
|
logical_drive[4] = drive_letter;
|
||||||
|
hDrive = CreateFileA(logical_drive, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE,
|
||||||
|
NULL, OPEN_EXISTING, 0, 0);
|
||||||
|
if (hDrive == INVALID_HANDLE_VALUE) {
|
||||||
|
uprintf("Failed to open %c: for flushing: %s\n", drive_letter, WindowsErrorString());
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
r = FlushFileBuffers(hDrive);
|
||||||
|
if (r == FALSE)
|
||||||
|
uprintf("Failed to flush %c: %s\n", drive_letter, WindowsErrorString());
|
||||||
|
|
||||||
|
out:
|
||||||
|
safe_closehandle(hDrive);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Unmount of volume using the DISMOUNT_VOLUME ioctl
|
* Unmount of volume using the DISMOUNT_VOLUME ioctl
|
||||||
*/
|
*/
|
||||||
|
@ -512,6 +538,63 @@ BOOL UnmountVolume(HANDLE hDrive)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Mount the volume identified by drive_guid to mountpoint drive_name
|
||||||
|
*/
|
||||||
|
BOOL MountVolume(char* drive_name, char *drive_guid)
|
||||||
|
{
|
||||||
|
char mounted_guid[52]; // You need at least 51 characters on XP
|
||||||
|
|
||||||
|
if (!SetVolumeMountPointA(drive_name, drive_guid)) {
|
||||||
|
// If the OS was faster than us at remounting the drive, this operation can fail
|
||||||
|
// with ERROR_DIR_NOT_EMPTY. If that's the case, just check that mountpoints match
|
||||||
|
if (GetLastError() == ERROR_DIR_NOT_EMPTY) {
|
||||||
|
if (!GetVolumeNameForVolumeMountPointA(drive_name, mounted_guid, sizeof(mounted_guid))) {
|
||||||
|
uprintf("%s already mounted, but volume GUID could not be checked: %s\n",
|
||||||
|
drive_name, WindowsErrorString());
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
if (safe_strcmp(drive_guid, mounted_guid) != 0) {
|
||||||
|
uprintf("%s already mounted, but volume GUID doesn't match:\r\n expected %s, got %s\n",
|
||||||
|
drive_name, drive_guid, mounted_guid);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
uprintf("%s was already mounted as %s\n", drive_guid, drive_name);
|
||||||
|
} else {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Issue a complete remount of the volume
|
||||||
|
*/
|
||||||
|
BOOL RemountVolume(char* drive_name)
|
||||||
|
{
|
||||||
|
char drive_guid[51];
|
||||||
|
|
||||||
|
// UDF requires a sync/flush, and it's also a good idea for other FS's
|
||||||
|
FlushDrive(drive_name[0]);
|
||||||
|
if (GetVolumeNameForVolumeMountPointA(drive_name, drive_guid, sizeof(drive_guid))) {
|
||||||
|
if (DeleteVolumeMountPointA(drive_name)) {
|
||||||
|
Sleep(200);
|
||||||
|
if (MountVolume(drive_name, drive_guid)) {
|
||||||
|
uprintf("Successfully remounted %s on %s\n", &drive_guid[4], drive_name);
|
||||||
|
} else {
|
||||||
|
uprintf("Failed to remount %s on %s\n", &drive_guid[4], drive_name);
|
||||||
|
// This will leave the drive inaccessible and must be flagged as an error
|
||||||
|
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|APPERR(ERROR_CANT_REMOUNT_VOLUME);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
uprintf("Could not remount %s %s\n", drive_name, WindowsErrorString());
|
||||||
|
// Try to continue regardless
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
/* MinGW is unhappy about accessing partitions beside the first unless we redef */
|
/* MinGW is unhappy about accessing partitions beside the first unless we redef */
|
||||||
typedef struct _DRIVE_LAYOUT_INFORMATION_EX4 {
|
typedef struct _DRIVE_LAYOUT_INFORMATION_EX4 {
|
||||||
DWORD PartitionStyle;
|
DWORD PartitionStyle;
|
||||||
|
@ -552,6 +635,7 @@ BOOL CreatePartition(HANDLE hDrive, int partition_style, int file_system, BOOL m
|
||||||
DriveLayoutEx.PartitionEntry[0].StartingOffset.QuadPart =
|
DriveLayoutEx.PartitionEntry[0].StartingOffset.QuadPart =
|
||||||
SelectedDrive.Geometry.BytesPerSector * SelectedDrive.Geometry.SectorsPerTrack;
|
SelectedDrive.Geometry.BytesPerSector * SelectedDrive.Geometry.SectorsPerTrack;
|
||||||
}
|
}
|
||||||
|
// TODO: should we try to align the following to the cluster size as well?
|
||||||
size_in_sectors = (SelectedDrive.DiskSize - DriveLayoutEx.PartitionEntry[0].StartingOffset.QuadPart) / SelectedDrive.Geometry.BytesPerSector;
|
size_in_sectors = (SelectedDrive.DiskSize - DriveLayoutEx.PartitionEntry[0].StartingOffset.QuadPart) / SelectedDrive.Geometry.BytesPerSector;
|
||||||
|
|
||||||
switch (partition_style) {
|
switch (partition_style) {
|
||||||
|
@ -617,6 +701,7 @@ BOOL CreatePartition(HANDLE hDrive, int partition_style, int file_system, BOOL m
|
||||||
break;
|
break;
|
||||||
case FS_NTFS:
|
case FS_NTFS:
|
||||||
case FS_EXFAT:
|
case FS_EXFAT:
|
||||||
|
case FS_UDF:
|
||||||
DriveLayoutEx.PartitionEntry[0].Mbr.PartitionType = 0x07; // NTFS
|
DriveLayoutEx.PartitionEntry[0].Mbr.PartitionType = 0x07; // NTFS
|
||||||
break;
|
break;
|
||||||
case FS_FAT32:
|
case FS_FAT32:
|
||||||
|
|
76
src/format.c
76
src/format.c
|
@ -51,8 +51,7 @@ DWORD FormatStatus;
|
||||||
badblocks_report report;
|
badblocks_report report;
|
||||||
static float format_percent = 0.0f;
|
static float format_percent = 0.0f;
|
||||||
static int task_number = 0;
|
static int task_number = 0;
|
||||||
/* Number of steps for each FS for FCC_STRUCTURE_PROGRESS */
|
extern const int nb_steps[FS_MAX];
|
||||||
const int nb_steps[FS_MAX] = { 5, 5, 12, 10 };
|
|
||||||
static int fs_index = 0;
|
static int fs_index = 0;
|
||||||
BOOL force_large_fat32 = FALSE;
|
BOOL force_large_fat32 = FALSE;
|
||||||
|
|
||||||
|
@ -607,13 +606,13 @@ static BOOL FormatDrive(DWORD DriveIndex)
|
||||||
{
|
{
|
||||||
BOOL r = FALSE;
|
BOOL r = FALSE;
|
||||||
PF_DECL(FormatEx);
|
PF_DECL(FormatEx);
|
||||||
char* VolumeName = NULL;
|
|
||||||
WCHAR* wVolumeName = NULL;
|
|
||||||
char FSType[32], format_status[64];
|
char FSType[32], format_status[64];
|
||||||
|
char *locale, *VolumeName = NULL;
|
||||||
|
WCHAR* wVolumeName = NULL;
|
||||||
WCHAR wFSType[32];
|
WCHAR wFSType[32];
|
||||||
WCHAR wLabel[64];
|
WCHAR wLabel[64];
|
||||||
|
ULONG ulClusterSize;
|
||||||
size_t i;
|
size_t i;
|
||||||
char* locale;
|
|
||||||
|
|
||||||
GetWindowTextA(hFileSystem, FSType, ARRAYSIZE(FSType));
|
GetWindowTextA(hFileSystem, FSType, ARRAYSIZE(FSType));
|
||||||
safe_sprintf(format_status, ARRAYSIZE(format_status), "Formatting (%s)...", FSType);
|
safe_sprintf(format_status, ARRAYSIZE(format_status), "Formatting (%s)...", FSType);
|
||||||
|
@ -643,13 +642,19 @@ static BOOL FormatDrive(DWORD DriveIndex)
|
||||||
GetWindowTextW(hLabel, wLabel, ARRAYSIZE(wLabel));
|
GetWindowTextW(hLabel, wLabel, ARRAYSIZE(wLabel));
|
||||||
// Make sure the label is valid
|
// Make sure the label is valid
|
||||||
ToValidLabel(wLabel, (wFSType[0] == 'F') && (wFSType[1] == 'A') && (wFSType[2] == 'T'));
|
ToValidLabel(wLabel, (wFSType[0] == 'F') && (wFSType[1] == 'A') && (wFSType[2] == 'T'));
|
||||||
uprintf("Using cluster size: %d bytes\n", ComboBox_GetItemData(hClusterSize, ComboBox_GetCurSel(hClusterSize)));
|
ulClusterSize = (ULONG)ComboBox_GetItemData(hClusterSize, ComboBox_GetCurSel(hClusterSize));
|
||||||
|
if (ulClusterSize < 0x200) {
|
||||||
|
// 0 is FormatEx's value for default, which we need to use for UDF
|
||||||
|
ulClusterSize = 0;
|
||||||
|
uprintf("Using default cluster size\n");
|
||||||
|
} else {
|
||||||
|
uprintf("Using cluster size: %d bytes\n", ulClusterSize);
|
||||||
|
}
|
||||||
format_percent = 0.0f;
|
format_percent = 0.0f;
|
||||||
task_number = 0;
|
task_number = 0;
|
||||||
fs_index = (int)ComboBox_GetItemData(hFileSystem, ComboBox_GetCurSel(hFileSystem));
|
fs_index = (int)ComboBox_GetItemData(hFileSystem, ComboBox_GetCurSel(hFileSystem));
|
||||||
pfFormatEx(wVolumeName, SelectedDrive.Geometry.MediaType, wFSType, wLabel,
|
pfFormatEx(wVolumeName, SelectedDrive.Geometry.MediaType, wFSType, wLabel,
|
||||||
IsChecked(IDC_QUICKFORMAT), (ULONG)ComboBox_GetItemData(hClusterSize, ComboBox_GetCurSel(hClusterSize)),
|
IsChecked(IDC_QUICKFORMAT), ulClusterSize, FormatExCallback);
|
||||||
FormatExCallback);
|
|
||||||
if (!IS_ERROR(FormatStatus)) {
|
if (!IS_ERROR(FormatStatus)) {
|
||||||
uprintf("Format completed.\n");
|
uprintf("Format completed.\n");
|
||||||
r = TRUE;
|
r = TRUE;
|
||||||
|
@ -1092,61 +1097,6 @@ out:
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Mount the volume identified by drive_guid to mountpoint drive_name
|
|
||||||
*/
|
|
||||||
static BOOL MountVolume(char* drive_name, char *drive_guid)
|
|
||||||
{
|
|
||||||
char mounted_guid[52]; // You need at least 51 characters on XP
|
|
||||||
|
|
||||||
if (!SetVolumeMountPointA(drive_name, drive_guid)) {
|
|
||||||
// If the OS was faster than us at remounting the drive, this operation can fail
|
|
||||||
// with ERROR_DIR_NOT_EMPTY. If that's the case, just check that mountpoints match
|
|
||||||
if (GetLastError() == ERROR_DIR_NOT_EMPTY) {
|
|
||||||
if (!GetVolumeNameForVolumeMountPointA(drive_name, mounted_guid, sizeof(mounted_guid))) {
|
|
||||||
uprintf("%s already mounted, but volume GUID could not be checked: %s\n",
|
|
||||||
drive_name, WindowsErrorString());
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
if (safe_strcmp(drive_guid, mounted_guid) != 0) {
|
|
||||||
uprintf("%s already mounted, but volume GUID doesn't match:\r\n expected %s, got %s\n",
|
|
||||||
drive_name, drive_guid, mounted_guid);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
uprintf("%s was already mounted as %s\n", drive_guid, drive_name);
|
|
||||||
} else {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Issue a complete remount of the volume
|
|
||||||
*/
|
|
||||||
static BOOL RemountVolume(char* drive_name)
|
|
||||||
{
|
|
||||||
char drive_guid[51];
|
|
||||||
|
|
||||||
if (GetVolumeNameForVolumeMountPointA(drive_name, drive_guid, sizeof(drive_guid))) {
|
|
||||||
if (DeleteVolumeMountPointA(drive_name)) {
|
|
||||||
Sleep(200);
|
|
||||||
if (MountVolume(drive_name, drive_guid)) {
|
|
||||||
uprintf("Successfully remounted %s on %s\n", &drive_guid[4], drive_name);
|
|
||||||
} else {
|
|
||||||
uprintf("Failed to remount %s on %s\n", &drive_guid[4], drive_name);
|
|
||||||
// This will leave the drive inaccessible and must be flagged as an error
|
|
||||||
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|APPERR(ERROR_CANT_REMOUNT_VOLUME);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
uprintf("Could not remount %s %s\n", drive_name, WindowsErrorString());
|
|
||||||
// Try to continue regardless
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Detect if a Windows Format prompt is active, by enumerating the
|
* Detect if a Windows Format prompt is active, by enumerating the
|
||||||
* whole Windows tree and looking for the relevant popup
|
* whole Windows tree and looking for the relevant popup
|
||||||
|
|
48
src/rufus.c
48
src/rufus.c
|
@ -85,9 +85,12 @@ struct {
|
||||||
UINT uAlign;
|
UINT uAlign;
|
||||||
} bi_iso = {0}, bi_up = {0}, bi_down = {0}; // BUTTON_IMAGELIST
|
} bi_iso = {0}, bi_up = {0}, bi_down = {0}; // BUTTON_IMAGELIST
|
||||||
|
|
||||||
static const char* FileSystemLabel[FS_MAX] = { "FAT", "FAT32", "NTFS", "exFAT" };
|
const char* FileSystemLabel[FS_MAX] = { "FAT", "FAT32", "NTFS", "UDF", "exFAT" };
|
||||||
|
// Number of steps for each FS for FCC_STRUCTURE_PROGRESS
|
||||||
|
const int nb_steps[FS_MAX] = { 5, 5, 12, 1, 10 };
|
||||||
// Don't ask me - just following the MS "standard" here
|
// Don't ask me - just following the MS "standard" here
|
||||||
static const char* ClusterSizeLabel[] = { "512 bytes", "1024 bytes","2048 bytes","4096 bytes","8192 bytes",
|
// We hijack 256 as a "Default" for UDF, since we can't set clustersize there
|
||||||
|
static const char* ClusterSizeLabel[] = { "Default", "512 bytes", "1024 bytes","2048 bytes","4096 bytes","8192 bytes",
|
||||||
"16 kilobytes", "32 kilobytes", "64 kilobytes", "128 kilobytes", "256 kilobytes", "512 kilobytes",
|
"16 kilobytes", "32 kilobytes", "64 kilobytes", "128 kilobytes", "256 kilobytes", "512 kilobytes",
|
||||||
"1024 kilobytes","2048 kilobytes","4096 kilobytes","8192 kilobytes","16 megabytes","32 megabytes" };
|
"1024 kilobytes","2048 kilobytes","4096 kilobytes","8192 kilobytes","16 megabytes","32 megabytes" };
|
||||||
static const char* BiosTypeLabel[BT_MAX] = { "BIOS", "UEFI" };
|
static const char* BiosTypeLabel[BT_MAX] = { "BIOS", "UEFI" };
|
||||||
|
@ -241,8 +244,8 @@ static BOOL DefineClusterSizes(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// NTFS
|
|
||||||
if (SelectedDrive.DiskSize < 256*TB) {
|
if (SelectedDrive.DiskSize < 256*TB) {
|
||||||
|
// NTFS
|
||||||
SelectedDrive.ClusterSize[FS_NTFS].Allowed = 0x0001FE00;
|
SelectedDrive.ClusterSize[FS_NTFS].Allowed = 0x0001FE00;
|
||||||
for (i=16; i<=256; i<<=1) { // 7 MB -> 256 TB
|
for (i=16; i<=256; i<<=1) { // 7 MB -> 256 TB
|
||||||
if (SelectedDrive.DiskSize < i*TB) {
|
if (SelectedDrive.DiskSize < i*TB) {
|
||||||
|
@ -250,17 +253,23 @@ static BOOL DefineClusterSizes(void)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// exFAT
|
// exFAT (requires KB955704 installed on XP => don't bother)
|
||||||
if (SelectedDrive.DiskSize < 256*TB) {
|
if (nWindowsVersion > WINDOWS_XP) {
|
||||||
SelectedDrive.ClusterSize[FS_EXFAT].Allowed = 0x03FFFE00;
|
SelectedDrive.ClusterSize[FS_EXFAT].Allowed = 0x03FFFE00;
|
||||||
if (SelectedDrive.DiskSize < 256*MB) // < 256 MB
|
if (SelectedDrive.DiskSize < 256*MB) // < 256 MB
|
||||||
SelectedDrive.ClusterSize[FS_EXFAT].Default = 4*1024;
|
SelectedDrive.ClusterSize[FS_EXFAT].Default = 4*1024;
|
||||||
else if (SelectedDrive.DiskSize < 32*GB) // < 32 GB
|
else if (SelectedDrive.DiskSize < 32*GB) // < 32 GB
|
||||||
SelectedDrive.ClusterSize[FS_EXFAT].Default = 32*1024;
|
SelectedDrive.ClusterSize[FS_EXFAT].Default = 32*1024;
|
||||||
else
|
else
|
||||||
SelectedDrive.ClusterSize[FS_EXFAT].Default = 28*1024;
|
SelectedDrive.ClusterSize[FS_EXFAT].Default = 28*1024;
|
||||||
|
}
|
||||||
|
|
||||||
|
// UDF (only supported for Vista and later)
|
||||||
|
if (nWindowsVersion >= WINDOWS_VISTA) {
|
||||||
|
SelectedDrive.ClusterSize[FS_UDF].Allowed = 0x00000100;
|
||||||
|
SelectedDrive.ClusterSize[FS_UDF].Default = 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
@ -310,7 +319,7 @@ static BOOL SetClusterSizes(int FSType)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
for(i=0,j=0x200,k=0;j<0x10000000;i++,j<<=1) {
|
for(i=0,j=0x100,k=0;j<0x10000000;i++,j<<=1) {
|
||||||
if (j & SelectedDrive.ClusterSize[FSType].Allowed) {
|
if (j & SelectedDrive.ClusterSize[FSType].Allowed) {
|
||||||
safe_sprintf(szClustSize, sizeof(szClustSize), "%s", ClusterSizeLabel[i]);
|
safe_sprintf(szClustSize, sizeof(szClustSize), "%s", ClusterSizeLabel[i]);
|
||||||
if (j == SelectedDrive.ClusterSize[FSType].Default) {
|
if (j == SelectedDrive.ClusterSize[FSType].Default) {
|
||||||
|
@ -1452,7 +1461,7 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
|
||||||
int nDeviceIndex, fs, bt, i, nWidth, nHeight;
|
int nDeviceIndex, fs, bt, i, nWidth, nHeight;
|
||||||
static DWORD DeviceNum = 0, LastRefresh = 0;
|
static DWORD DeviceNum = 0, LastRefresh = 0;
|
||||||
char tmp[128], str[MAX_PATH];
|
char tmp[128], str[MAX_PATH];
|
||||||
static UINT uDOSChecked = BST_CHECKED, uQFChecked;
|
static UINT uBootChecked = BST_CHECKED, uQFChecked;
|
||||||
static BOOL first_log_display = TRUE, user_changed_label = FALSE;
|
static BOOL first_log_display = TRUE, user_changed_label = FALSE;
|
||||||
|
|
||||||
switch (message) {
|
switch (message) {
|
||||||
|
@ -1646,13 +1655,16 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (fs == FS_EXFAT) {
|
if ((fs == FS_EXFAT) || (fs == FS_UDF)) {
|
||||||
if (IsWindowEnabled(hBoot)) {
|
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(hBootType, 0));
|
IGNORE_RETVAL(ComboBox_SetCurSel(hBootType, 0));
|
||||||
uDOSChecked = IsDlgButtonChecked(hMainDialog, IDC_BOOT);
|
uBootChecked = IsDlgButtonChecked(hMainDialog, IDC_BOOT);
|
||||||
CheckDlgButton(hDlg, IDC_BOOT, BST_UNCHECKED);
|
CheckDlgButton(hDlg, IDC_BOOT, BST_UNCHECKED);
|
||||||
EnableBootOptions(FALSE);
|
EnableBootOptions(FALSE);
|
||||||
|
} else if (IsDlgButtonChecked(hMainDialog, IDC_BOOT)) {
|
||||||
|
uBootChecked = TRUE;
|
||||||
|
CheckDlgButton(hDlg, IDC_BOOT, BST_UNCHECKED);
|
||||||
}
|
}
|
||||||
SetMBRProps();
|
SetMBRProps();
|
||||||
break;
|
break;
|
||||||
|
@ -1685,7 +1697,7 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
|
||||||
EnableWindow(hBoot, TRUE);
|
EnableWindow(hBoot, TRUE);
|
||||||
EnableWindow(hBootType, TRUE);
|
EnableWindow(hBootType, TRUE);
|
||||||
EnableWindow(hSelectISO, TRUE);
|
EnableWindow(hSelectISO, TRUE);
|
||||||
CheckDlgButton(hDlg, IDC_BOOT, uDOSChecked);
|
CheckDlgButton(hDlg, IDC_BOOT, uBootChecked);
|
||||||
}
|
}
|
||||||
SetMBRProps();
|
SetMBRProps();
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -153,6 +153,7 @@ enum {
|
||||||
FS_FAT16 = 0,
|
FS_FAT16 = 0,
|
||||||
FS_FAT32,
|
FS_FAT32,
|
||||||
FS_NTFS,
|
FS_NTFS,
|
||||||
|
FS_UDF,
|
||||||
FS_EXFAT,
|
FS_EXFAT,
|
||||||
FS_MAX
|
FS_MAX
|
||||||
};
|
};
|
||||||
|
@ -315,7 +316,9 @@ extern BOOL DeletePartitions(HANDLE hDrive);
|
||||||
extern const char* GetPartitionType(BYTE Type);
|
extern const char* GetPartitionType(BYTE Type);
|
||||||
extern BOOL GetDrivePartitionData(DWORD DriveIndex, char* FileSystemName, DWORD FileSystemNameSize);
|
extern BOOL GetDrivePartitionData(DWORD DriveIndex, char* FileSystemName, DWORD FileSystemNameSize);
|
||||||
extern BOOL GetDriveLabel(DWORD DriveIndex, char* letter, char** label);
|
extern BOOL GetDriveLabel(DWORD DriveIndex, char* letter, char** label);
|
||||||
|
extern BOOL MountVolume(char* drive_name, char *drive_guid);
|
||||||
extern BOOL UnmountVolume(HANDLE hDrive);
|
extern BOOL UnmountVolume(HANDLE hDrive);
|
||||||
|
extern BOOL RemountVolume(char* drive_name);
|
||||||
extern BOOL CreateProgress(void);
|
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);
|
||||||
|
|
10
src/rufus.rc
10
src/rufus.rc
|
@ -30,7 +30,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
|
||||||
IDD_DIALOG DIALOGEX 12, 12, 206, 329
|
IDD_DIALOG DIALOGEX 12, 12, 206, 329
|
||||||
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.4.268"
|
CAPTION "Rufus v1.3.4.269"
|
||||||
FONT 8, "MS Shell Dlg", 400, 0, 0x1
|
FONT 8, "MS Shell Dlg", 400, 0, 0x1
|
||||||
BEGIN
|
BEGIN
|
||||||
DEFPUSHBUTTON "Start",IDC_START,94,291,50,14
|
DEFPUSHBUTTON "Start",IDC_START,94,291,50,14
|
||||||
|
@ -278,8 +278,8 @@ END
|
||||||
//
|
//
|
||||||
|
|
||||||
VS_VERSION_INFO VERSIONINFO
|
VS_VERSION_INFO VERSIONINFO
|
||||||
FILEVERSION 1,3,4,268
|
FILEVERSION 1,3,4,269
|
||||||
PRODUCTVERSION 1,3,4,268
|
PRODUCTVERSION 1,3,4,269
|
||||||
FILEFLAGSMASK 0x3fL
|
FILEFLAGSMASK 0x3fL
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
FILEFLAGS 0x1L
|
FILEFLAGS 0x1L
|
||||||
|
@ -296,13 +296,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.4.268"
|
VALUE "FileVersion", "1.3.4.269"
|
||||||
VALUE "InternalName", "Rufus"
|
VALUE "InternalName", "Rufus"
|
||||||
VALUE "LegalCopyright", "© 2011-2013 Pete Batard (GPL v3)"
|
VALUE "LegalCopyright", "© 2011-2013 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.4.268"
|
VALUE "ProductVersion", "1.3.4.269"
|
||||||
END
|
END
|
||||||
END
|
END
|
||||||
BLOCK "VarFileInfo"
|
BLOCK "VarFileInfo"
|
||||||
|
|
|
@ -41,7 +41,7 @@ SysType msdos_systypes[] = {
|
||||||
{ 0x04, N_("Small FAT16") },
|
{ 0x04, N_("Small FAT16") },
|
||||||
{ 0x05, N_("Extended") },
|
{ 0x05, N_("Extended") },
|
||||||
{ 0x06, N_("FAT16") },
|
{ 0x06, N_("FAT16") },
|
||||||
{ 0x07, N_("NTFS") },
|
{ 0x07, N_("NTFS/exFAT/UDF") },
|
||||||
{ 0x08, N_("AIX") },
|
{ 0x08, N_("AIX") },
|
||||||
{ 0x09, N_("AIX Bootable") },
|
{ 0x09, N_("AIX Bootable") },
|
||||||
{ 0x0a, N_("OS/2 Boot Manager") },
|
{ 0x0a, N_("OS/2 Boot Manager") },
|
||||||
|
|
Loading…
Reference in a new issue