mirror of
https://github.com/pbatard/rufus.git
synced 2024-08-14 23:57:05 +00:00
[fs] set default cluster size according to MS defs
* see http://support.microsoft.com/kb/140365 * also added exFAT as supported FS
This commit is contained in:
parent
70a5116bb7
commit
a7d714cefd
3 changed files with 137 additions and 30 deletions
154
rufus.c
154
rufus.c
|
@ -57,6 +57,11 @@
|
||||||
const GUID GUID_DEVINTERFACE_DISK = { 0x53f56307L, 0xb6bf, 0x11d0, {0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b} };
|
const GUID GUID_DEVINTERFACE_DISK = { 0x53f56307L, 0xb6bf, 0x11d0, {0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b} };
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Don't ask me - just following the MS standard here
|
||||||
|
const char* ClusterSizeLabel[] = {"512 bytes", "1024 bytes","2048 bytes","4096 bytes","8192 bytes",
|
||||||
|
"16 kilobytes", "32 kilobytes", "64 kilobytes", "128 kilobytes", "256 kilobytes", "512 kilobytes",
|
||||||
|
"1024 kilobytes","2048 kilobytes","4096 kilobytes","8192 kilobytes","16 megabytes","32 megabytes"};
|
||||||
|
|
||||||
// For MinGW
|
// For MinGW
|
||||||
#ifndef PBS_MARQUEE
|
#ifndef PBS_MARQUEE
|
||||||
#define PBS_MARQUEE 0x08
|
#define PBS_MARQUEE 0x08
|
||||||
|
@ -80,10 +85,13 @@ BOOL bQuickFormat;
|
||||||
struct {
|
struct {
|
||||||
DWORD DeviceNumber;
|
DWORD DeviceNumber;
|
||||||
LONGLONG DiskSize;
|
LONGLONG DiskSize;
|
||||||
LONGLONG PartitionSize;
|
|
||||||
DISK_GEOMETRY Geometry;
|
DISK_GEOMETRY Geometry;
|
||||||
DWORD FirstSector;
|
DWORD FirstSector;
|
||||||
enum _FSType FSType;
|
enum _FSType FSType;
|
||||||
|
struct {
|
||||||
|
ULONG Allowed;
|
||||||
|
ULONG Default;
|
||||||
|
} ClusterSize[FS_MAX];
|
||||||
} SelectedDrive;
|
} SelectedDrive;
|
||||||
|
|
||||||
static HWND hDeviceList, hCapacity, hFileSystem, hClusterSize, hLabel;
|
static HWND hDeviceList, hCapacity, hFileSystem, hClusterSize, hLabel;
|
||||||
|
@ -305,32 +313,119 @@ static BOOL GetDriveLabel(DWORD DriveIndex, char* letter, char** label)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void SetClusterSizes(enum _FSType FSType)
|
|
||||||
|
#define KB 1024LL
|
||||||
|
#define MB 1048576LL
|
||||||
|
#define GB 1073741824LL
|
||||||
|
#define TB 1099511627776LL
|
||||||
|
|
||||||
|
// Set cluster size values according to http://support.microsoft.com/kb/140365
|
||||||
|
static BOOL DefineClusterSizes(void)
|
||||||
{
|
{
|
||||||
|
LONGLONG i;
|
||||||
|
// int j;
|
||||||
|
memset(&SelectedDrive.ClusterSize, 0, sizeof(SelectedDrive.ClusterSize));
|
||||||
|
if (SelectedDrive.DiskSize < 8*MB) {
|
||||||
|
// TODO: muck with FAT12 and Small FAT16 like Microsoft does
|
||||||
|
uprintf("This application does not support volumes smaller than 8 MB yet\n");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// FAT 16
|
||||||
|
if (SelectedDrive.DiskSize < 4*GB) {
|
||||||
|
// TODO: Refine the following according to size
|
||||||
|
SelectedDrive.ClusterSize[FS_FAT16].Allowed = 0x0001FE00;
|
||||||
|
for (i=32; i<=4096; i<<=1) { // 8 MB -> 4 GB
|
||||||
|
if (SelectedDrive.DiskSize < i*MB) {
|
||||||
|
SelectedDrive.ClusterSize[FS_FAT16].Default = 16*(ULONG)i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// FAT 32
|
||||||
|
if (SelectedDrive.DiskSize < 256*MB) {
|
||||||
|
// TODO: Refine the following according to size
|
||||||
|
SelectedDrive.ClusterSize[FS_FAT32].Allowed = 0x0001FE00;
|
||||||
|
for (i=64; i<=256; i<<=1) { // 8 MB -> 256 MB
|
||||||
|
if (SelectedDrive.DiskSize < i*MB) {
|
||||||
|
SelectedDrive.ClusterSize[FS_FAT32].Default = 8*(ULONG)i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (SelectedDrive.DiskSize < 32*GB) {
|
||||||
|
SelectedDrive.ClusterSize[FS_FAT32].Allowed = 0x0001FE00;
|
||||||
|
for (i=8; i<=32; i<<=1) { // 256 MB -> 32 GB
|
||||||
|
if (SelectedDrive.DiskSize < i*GB) {
|
||||||
|
SelectedDrive.ClusterSize[FS_FAT32].Default = ((ULONG)i/2)*1024;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// NTFS
|
||||||
|
if (SelectedDrive.DiskSize < 256*TB) {
|
||||||
|
SelectedDrive.ClusterSize[FS_NTFS].Allowed = 0x0001FE00;
|
||||||
|
for (i=16; i<=256; i<<=1) { // 7 MB -> 256 TB
|
||||||
|
if (SelectedDrive.DiskSize < i*TB) {
|
||||||
|
SelectedDrive.ClusterSize[FS_NTFS].Default = ((ULONG)i/4)*1024;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// exFAT
|
||||||
|
if (SelectedDrive.DiskSize < 256*TB) {
|
||||||
|
SelectedDrive.ClusterSize[FS_EXFAT].Allowed = 0x03FFFE00;
|
||||||
|
if (SelectedDrive.DiskSize < 256*MB) // < 256 MB
|
||||||
|
SelectedDrive.ClusterSize[FS_EXFAT].Default = 4*1024;
|
||||||
|
else if (SelectedDrive.DiskSize < 32*GB) // < 32 GB
|
||||||
|
SelectedDrive.ClusterSize[FS_EXFAT].Default = 32*1024;
|
||||||
|
else
|
||||||
|
SelectedDrive.ClusterSize[FS_EXFAT].Default = 28*1024;
|
||||||
|
}
|
||||||
|
|
||||||
|
// for (j=0; j<FS_MAX; j++) {
|
||||||
|
// uprintf("SelectedDrive.ClusterSize[%d].Allowed = %08X\n", j, SelectedDrive.ClusterSize[j].Allowed);
|
||||||
|
// uprintf("SelectedDrive.ClusterSize[%d].Default = %08X\n", j, SelectedDrive.ClusterSize[j].Default);
|
||||||
|
// }
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
#undef KB
|
||||||
|
#undef MB
|
||||||
|
#undef GB
|
||||||
|
#undef TB
|
||||||
|
|
||||||
|
static BOOL SetClusterSizes(enum _FSType FSType)
|
||||||
|
{
|
||||||
|
char szDefault[64];
|
||||||
|
int i;
|
||||||
|
ULONG j;
|
||||||
|
|
||||||
IGNORE_RETVAL(ComboBox_ResetContent(hClusterSize));
|
IGNORE_RETVAL(ComboBox_ResetContent(hClusterSize));
|
||||||
// Don't ask me - just following the MS standard here
|
|
||||||
IGNORE_RETVAL(ComboBox_SetItemData(hClusterSize, ComboBox_AddStringU(hClusterSize, "Default allocation size"), 0x1000));
|
if ( (SelectedDrive.ClusterSize[FSType].Allowed == 0)
|
||||||
// TODO set value above according to FS selected and default cluster sizes from
|
|| (SelectedDrive.ClusterSize[FSType].Default == 0) ) {
|
||||||
// http://support.microsoft.com/kb/140365
|
uprintf("The drive is incompatible with FS type #%d\n", FSType);
|
||||||
IGNORE_RETVAL(ComboBox_SetItemData(hClusterSize, ComboBox_AddStringU(hClusterSize, "512 bytes"), 0x200));
|
return FALSE;
|
||||||
IGNORE_RETVAL(ComboBox_SetItemData(hClusterSize, ComboBox_AddStringU(hClusterSize, "1024 bytes"), 0x400));
|
}
|
||||||
IGNORE_RETVAL(ComboBox_SetItemData(hClusterSize, ComboBox_AddStringU(hClusterSize, "2048 bytes"), 0x800));
|
|
||||||
IGNORE_RETVAL(ComboBox_SetItemData(hClusterSize, ComboBox_AddStringU(hClusterSize, "4096 bytes"), 0x1000));
|
// Yes, I know there exist more efficient ways...
|
||||||
IGNORE_RETVAL(ComboBox_SetItemData(hClusterSize, ComboBox_AddStringU(hClusterSize, "8192 bytes"), 0x2000));
|
for(i=0,j=SelectedDrive.ClusterSize[FSType].Default>>10;j;i++,j>>=1);
|
||||||
IGNORE_RETVAL(ComboBox_SetItemData(hClusterSize, ComboBox_AddStringU(hClusterSize, "16 kilobytes"), 0x4000));
|
safe_sprintf(szDefault, sizeof(szDefault), "Default allocation size (%s)", ClusterSizeLabel[i]);
|
||||||
IGNORE_RETVAL(ComboBox_SetItemData(hClusterSize, ComboBox_AddStringU(hClusterSize, "32 kilobytes"), 0x8000));
|
|
||||||
IGNORE_RETVAL(ComboBox_SetItemData(hClusterSize, ComboBox_AddStringU(hClusterSize, "64 kilobytes"), 0x10000));
|
IGNORE_RETVAL(ComboBox_SetItemData(hClusterSize, ComboBox_AddStringU(hClusterSize, szDefault),
|
||||||
IGNORE_RETVAL(ComboBox_SetItemData(hClusterSize, ComboBox_AddStringU(hClusterSize, "128 kilobytes"), 0x20000));
|
SelectedDrive.ClusterSize[FSType].Default));
|
||||||
IGNORE_RETVAL(ComboBox_SetItemData(hClusterSize, ComboBox_AddStringU(hClusterSize, "256 kilobytes"), 0x40000));
|
|
||||||
IGNORE_RETVAL(ComboBox_SetItemData(hClusterSize, ComboBox_AddStringU(hClusterSize, "512 kilobytes"), 0x80000));
|
for(i=0,j=0x200;j<0x10000000;i++,j<<=1) {
|
||||||
IGNORE_RETVAL(ComboBox_SetItemData(hClusterSize, ComboBox_AddStringU(hClusterSize, "1024 kilobytes"), 0x100000));
|
if (j & SelectedDrive.ClusterSize[FSType].Allowed) {
|
||||||
IGNORE_RETVAL(ComboBox_SetItemData(hClusterSize, ComboBox_AddStringU(hClusterSize, "2048 kilobytes"), 0x200000));
|
IGNORE_RETVAL(ComboBox_SetItemData(hClusterSize, ComboBox_AddStringU(hClusterSize, ClusterSizeLabel[i]), j));
|
||||||
IGNORE_RETVAL(ComboBox_SetItemData(hClusterSize, ComboBox_AddStringU(hClusterSize, "4096 kilobytes"), 0x400000));
|
}
|
||||||
IGNORE_RETVAL(ComboBox_SetItemData(hClusterSize, ComboBox_AddStringU(hClusterSize, "8192 kilobytes"), 0x800000));
|
}
|
||||||
IGNORE_RETVAL(ComboBox_SetItemData(hClusterSize, ComboBox_AddStringU(hClusterSize, "16 megabytes"), 0x1000000));
|
|
||||||
IGNORE_RETVAL(ComboBox_SetItemData(hClusterSize, ComboBox_AddStringU(hClusterSize, "32 megabytes"), 0x2000000));
|
|
||||||
// TODO set value according to disk props
|
|
||||||
IGNORE_RETVAL(ComboBox_SetCurSel(hClusterSize, 0));
|
IGNORE_RETVAL(ComboBox_SetCurSel(hClusterSize, 0));
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -425,6 +520,7 @@ static BOOL GetDriveInfo(void)
|
||||||
SelectedDrive.FSType = FS_DEFAULT;
|
SelectedDrive.FSType = FS_DEFAULT;
|
||||||
}
|
}
|
||||||
IGNORE_RETVAL(ComboBox_SetCurSel(hFileSystem, SelectedDrive.FSType));
|
IGNORE_RETVAL(ComboBox_SetCurSel(hFileSystem, SelectedDrive.FSType));
|
||||||
|
DefineClusterSizes();
|
||||||
SetClusterSizes(SelectedDrive.FSType);
|
SetClusterSizes(SelectedDrive.FSType);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
@ -459,6 +555,7 @@ static BOOL PopulateProperties(int ComboIndex)
|
||||||
IGNORE_RETVAL(ComboBox_AddStringU(hFileSystem, "FAT"));
|
IGNORE_RETVAL(ComboBox_AddStringU(hFileSystem, "FAT"));
|
||||||
IGNORE_RETVAL(ComboBox_AddStringU(hFileSystem, "FAT32"));
|
IGNORE_RETVAL(ComboBox_AddStringU(hFileSystem, "FAT32"));
|
||||||
IGNORE_RETVAL(ComboBox_AddStringU(hFileSystem, "NTFS"));
|
IGNORE_RETVAL(ComboBox_AddStringU(hFileSystem, "NTFS"));
|
||||||
|
IGNORE_RETVAL(ComboBox_AddStringU(hFileSystem, "exFAT"));
|
||||||
|
|
||||||
SelectedDrive.DeviceNumber = (DWORD)ComboBox_GetItemData(hDeviceList, ComboIndex);
|
SelectedDrive.DeviceNumber = (DWORD)ComboBox_GetItemData(hDeviceList, ComboIndex);
|
||||||
if (!GetDriveInfo())
|
if (!GetDriveInfo())
|
||||||
|
@ -523,6 +620,8 @@ static BOOL CreatePartition(HANDLE hDrive)
|
||||||
DriveLayoutEx->PartitionEntry[0].Mbr.PartitionType = 0x0e; // FAT16 LBA
|
DriveLayoutEx->PartitionEntry[0].Mbr.PartitionType = 0x0e; // FAT16 LBA
|
||||||
break;
|
break;
|
||||||
case FS_NTFS:
|
case FS_NTFS:
|
||||||
|
case FS_EXFAT:
|
||||||
|
// TODO: but how do we set this thing up afterwards?
|
||||||
DriveLayoutEx->PartitionEntry[0].Mbr.PartitionType = 0x07; // NTFS
|
DriveLayoutEx->PartitionEntry[0].Mbr.PartitionType = 0x07; // NTFS
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -1149,6 +1248,13 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case IDC_FILESYSTEM:
|
||||||
|
switch (HIWORD(wParam)) {
|
||||||
|
case CBN_SELCHANGE:
|
||||||
|
SetClusterSizes((enum _FSType)ComboBox_GetCurSel(hFileSystem));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
case IDC_START:
|
case IDC_START:
|
||||||
if (format_thid != -1L) {
|
if (format_thid != -1L) {
|
||||||
return (INT_PTR)TRUE;
|
return (INT_PTR)TRUE;
|
||||||
|
|
1
rufus.h
1
rufus.h
|
@ -123,6 +123,7 @@ enum _FSType {
|
||||||
FS_FAT16 = 0,
|
FS_FAT16 = 0,
|
||||||
FS_FAT32,
|
FS_FAT32,
|
||||||
FS_NTFS,
|
FS_NTFS,
|
||||||
|
FS_EXFAT,
|
||||||
FS_MAX
|
FS_MAX
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
12
rufus.rc
12
rufus.rc
|
@ -63,7 +63,7 @@ BEGIN
|
||||||
DEFPUSHBUTTON "OK",IDOK,231,175,50,14,WS_GROUP
|
DEFPUSHBUTTON "OK",IDOK,231,175,50,14,WS_GROUP
|
||||||
CONTROL "<a href=""https://github.com/pbatard/rufus/wiki/Rufus"">https://github.com/pbatard/rufus</a>",IDC_ABOUT_RUFUS_URL,
|
CONTROL "<a href=""https://github.com/pbatard/rufus/wiki/Rufus"">https://github.com/pbatard/rufus</a>",IDC_ABOUT_RUFUS_URL,
|
||||||
"SysLink",WS_TABSTOP,46,47,114,9
|
"SysLink",WS_TABSTOP,46,47,114,9
|
||||||
LTEXT "Version 1.0.0 (Build 53)",IDC_STATIC,46,19,78,8
|
LTEXT "Version 1.0.0 (Build 54)",IDC_STATIC,46,19,78,8
|
||||||
PUSHBUTTON "License...",IDC_ABOUT_LICENSE,46,175,50,14,WS_GROUP
|
PUSHBUTTON "License...",IDC_ABOUT_LICENSE,46,175,50,14,WS_GROUP
|
||||||
EDITTEXT IDC_ABOUT_COPYRIGHTS,46,107,235,63,ES_MULTILINE | ES_READONLY | WS_VSCROLL
|
EDITTEXT IDC_ABOUT_COPYRIGHTS,46,107,235,63,ES_MULTILINE | ES_READONLY | WS_VSCROLL
|
||||||
LTEXT "Report bugs or request enhancements at:",IDC_STATIC,46,66,187,8
|
LTEXT "Report bugs or request enhancements at:",IDC_STATIC,46,66,187,8
|
||||||
|
@ -162,8 +162,8 @@ END
|
||||||
//
|
//
|
||||||
|
|
||||||
VS_VERSION_INFO VERSIONINFO
|
VS_VERSION_INFO VERSIONINFO
|
||||||
FILEVERSION 1,0,0,53
|
FILEVERSION 1,0,0,54
|
||||||
PRODUCTVERSION 1,0,0,53
|
PRODUCTVERSION 1,0,0,54
|
||||||
FILEFLAGSMASK 0x3fL
|
FILEFLAGSMASK 0x3fL
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
FILEFLAGS 0x1L
|
FILEFLAGS 0x1L
|
||||||
|
@ -180,13 +180,13 @@ BEGIN
|
||||||
BEGIN
|
BEGIN
|
||||||
VALUE "CompanyName", "akeo.ie"
|
VALUE "CompanyName", "akeo.ie"
|
||||||
VALUE "FileDescription", "Rufus"
|
VALUE "FileDescription", "Rufus"
|
||||||
VALUE "FileVersion", "1.0.0.53"
|
VALUE "FileVersion", "1.0.0.54"
|
||||||
VALUE "InternalName", "Rufus"
|
VALUE "InternalName", "Rufus"
|
||||||
VALUE "LegalCopyright", "© 2011 Pete Batard (GPL v3)"
|
VALUE "LegalCopyright", "© 2011 Pete Batard (GPL v3)"
|
||||||
VALUE "LegalTrademarks", "http://www.gnu.org/copyleft/gpl.html"
|
VALUE "LegalTrademarks", "http://www.gnu.org/copyleft/gpl.html"
|
||||||
VALUE "OriginalFilename", "rufus.exe"
|
VALUE "OriginalFilename", "rufus.exe"
|
||||||
VALUE "ProductName", "Rufus"
|
VALUE "ProductName", "Rufus"
|
||||||
VALUE "ProductVersion", "1.0.0.53"
|
VALUE "ProductVersion", "1.0.0.54"
|
||||||
END
|
END
|
||||||
END
|
END
|
||||||
BLOCK "VarFileInfo"
|
BLOCK "VarFileInfo"
|
||||||
|
@ -212,7 +212,7 @@ IDI_ICON ICON "rufus.ico"
|
||||||
|
|
||||||
STRINGTABLE
|
STRINGTABLE
|
||||||
BEGIN
|
BEGIN
|
||||||
IDS_VERSION "Rufus v1.0.0.53"
|
IDS_VERSION "Rufus v1.0.0.54"
|
||||||
END
|
END
|
||||||
|
|
||||||
#endif // English resources
|
#endif // English resources
|
||||||
|
|
Loading…
Reference in a new issue