diff --git a/resource.h b/resource.h index a46c0d37..c605b375 100644 --- a/resource.h +++ b/resource.h @@ -17,7 +17,7 @@ #define IDC_ABOUT 1007 #define IDC_LABEL 1008 #define IDC_QUICKFORMAT 1009 -#define IDC_DOSSTARTUP 1010 +#define IDC_DOS 1010 #define IDC_PROGRESS 1011 #define IDC_ABOUT_LICENSE 1030 #define IDC_ABOUT_ICON 1031 diff --git a/rufus.c b/rufus.c index 48c5107f..3f27ac9e 100644 --- a/rufus.c +++ b/rufus.c @@ -2,9 +2,6 @@ * Rufus: The Resourceful USB Formatting Utility * Copyright (c) 2011 Pete Batard * - * Device enumeration based in part on TestUSBDriveEject.cpp by ahmd: - * http://www.codeguru.com/forum/showpost.php?p=1951973&postcount=7 - * * 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 @@ -36,34 +33,22 @@ #include #include #include -#include // http://git.kernel.org/?p=fs/ext2/e2fsprogs.git;a=blob;f=misc/badblocks.c // http://thestarman.pcministry.com/asm/mbr/MSWIN41.htm +// http://sourceforge.net/projects/grub4dos/ (bootable NTFS?) #include "msapi_utf8.h" #include "resource.h" #include "rufus.h" #include "sys_types.h" -#if !defined(GUID_DEVINTERFACE_DISK) -const GUID GUID_DEVINTERFACE_DISK = { 0x53f56307L, 0xb6bf, 0x11d0, {0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b} }; -#endif - static const char* FileSystemLabel[FS_MAX] = { "FAT", "FAT32", "NTFS", "exFAT" }; // Don't ask me - just following the MS standard here static 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 -#ifndef PBS_MARQUEE -#define PBS_MARQUEE 0x08 -#endif -#ifndef PBM_SETMARQUEE -#define PBM_SETMARQUEE (WM_USER+10) -#endif - /* * Globals */ @@ -72,10 +57,9 @@ HWND hMainDialog; char szFolderPath[MAX_PATH]; float fScale = 1.0f; int default_fs; -ULONG default_clutersize; HWND hDeviceList, hCapacity, hFileSystem, hClusterSize, hLabel; -static HWND hDeviceTooltip = NULL, hFSTooltip = NULL; +static HWND hDeviceTooltip = NULL, hFSTooltip = NULL; static StrArray DriveID, DriveLabel; /* @@ -473,12 +457,14 @@ static BOOL GetUSBDevices(void) char drive_letter; char *label, entry[MAX_PATH], buffer[MAX_PATH]; const char* usbstor_name = "USBSTOR"; + GUID _GUID_DEVINTERFACE_DISK = // only known to some... + { 0x53f56307L, 0xb6bf, 0x11d0, {0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b} }; IGNORE_RETVAL(ComboBox_ResetContent(hDeviceList)); StrArrayClear(&DriveID); StrArrayClear(&DriveLabel); - dev_info = SetupDiGetClassDevsA(&GUID_DEVINTERFACE_DISK, NULL, NULL, DIGCF_PRESENT|DIGCF_DEVICEINTERFACE); + dev_info = SetupDiGetClassDevsA(&_GUID_DEVINTERFACE_DISK, NULL, NULL, DIGCF_PRESENT|DIGCF_DEVICEINTERFACE); if (dev_info == INVALID_HANDLE_VALUE) { uprintf("SetupDiGetClassDevs (Interface) failed: %d\n", WindowsErrorString()); return FALSE; @@ -510,7 +496,7 @@ static BOOL GetUSBDevices(void) safe_closehandle(hDrive); safe_free(devint_detail_data); - if (!SetupDiEnumDeviceInterfaces(dev_info, &dev_info_data, &GUID_DEVINTERFACE_DISK, j, &devint_data)) { + if (!SetupDiEnumDeviceInterfaces(dev_info, &dev_info_data, &_GUID_DEVINTERFACE_DISK, j, &devint_data)) { if(GetLastError() != ERROR_NO_MORE_ITEMS) { uprintf("SetupDiEnumDeviceInterfaces failed: %s\n", WindowsErrorString()); } @@ -573,13 +559,20 @@ static BOOL GetUSBDevices(void) */ static void EnableControls(BOOL bEnable) { + int fs; + EnableWindow(GetDlgItem(hMainDialog, IDC_DEVICE), bEnable); EnableWindow(GetDlgItem(hMainDialog, IDC_CAPACITY), bEnable); EnableWindow(GetDlgItem(hMainDialog, IDC_FILESYSTEM), bEnable); EnableWindow(GetDlgItem(hMainDialog, IDC_CLUSTERSIZE), bEnable); EnableWindow(GetDlgItem(hMainDialog, IDC_LABEL), bEnable); EnableWindow(GetDlgItem(hMainDialog, IDC_QUICKFORMAT), bEnable); - EnableWindow(GetDlgItem(hMainDialog, IDC_DOSSTARTUP), bEnable); + if (bEnable) { + fs = (int)ComboBox_GetItemData(hFileSystem, ComboBox_GetCurSel(hFileSystem)); + EnableWindow(GetDlgItem(hMainDialog, IDC_DOS), (fs == FS_FAT16) || (fs == FS_FAT32)); + } else { + EnableWindow(GetDlgItem(hMainDialog, IDC_DOS), FALSE); + } EnableWindow(GetDlgItem(hMainDialog, IDC_ABOUT), bEnable); EnableWindow(GetDlgItem(hMainDialog, IDC_START), bEnable); SetDlgItemTextA(hMainDialog, IDCANCEL, bEnable?"Close":"Cancel"); @@ -588,17 +581,24 @@ static void EnableControls(BOOL bEnable) /* * Main dialog callback */ +#ifndef PBS_MARQUEE // Some versions of MinGW don't know these +#define PBS_MARQUEE 0x08 +#endif +#ifndef PBM_SETMARQUEE +#define PBM_SETMARQUEE (WM_USER+10) +#endif static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { HDC hDC; DRAWITEMSTRUCT* pDI; - int nDeviceIndex; + int nDeviceIndex, fs; DWORD DeviceNum; char str[MAX_PATH], tmp[128]; static char app_version[32]; static uintptr_t format_thid = -1L; - static HWND hProgress; + static HWND hProgress, hDOS; static LONG ProgressStyle = 0; + static UINT uDOSChecked = BST_CHECKED; switch (message) { @@ -618,6 +618,7 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA hClusterSize = GetDlgItem(hDlg, IDC_CLUSTERSIZE); hLabel = GetDlgItem(hDlg, IDC_LABEL); hProgress = GetDlgItem(hDlg, IDC_PROGRESS); + hDOS = GetDlgItem(hDlg, IDC_DOS); // High DPI scaling hDC = GetDC(hDlg); fScale = GetDeviceCaps(hDC, LOGPIXELSX) / 96.0f; @@ -632,8 +633,9 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA // Create the string array StrArrayCreate(&DriveID, MAX_DRIVES); StrArrayCreate(&DriveLabel, MAX_DRIVES); - // Set the quick format checkbox + // Set the quick format & create DOS disk checkboxes CheckDlgButton(hDlg, IDC_QUICKFORMAT, BST_CHECKED); + CheckDlgButton(hDlg, IDC_DOS, BST_CHECKED); GetUSBDevices(); return (INT_PTR)TRUE; @@ -687,7 +689,21 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA case IDC_FILESYSTEM: switch (HIWORD(wParam)) { case CBN_SELCHANGE: - SetClusterSizes((int)ComboBox_GetItemData(hFileSystem, ComboBox_GetCurSel(hFileSystem))); + fs = (int)ComboBox_GetItemData(hFileSystem, ComboBox_GetCurSel(hFileSystem)); + SetClusterSizes(fs); + // Disable/Restore the DOS checkbox according to FS + if ((fs == FS_FAT16) || (fs == FS_FAT32)) { + if (!IsWindowEnabled(hDOS)) { + EnableWindow(hDOS, TRUE); + CheckDlgButton(hDlg, IDC_DOS, uDOSChecked); + } + } else { + if (IsWindowEnabled(hDOS)) { + uDOSChecked = IsDlgButtonChecked(hMainDialog, IDC_DOS); + CheckDlgButton(hDlg, IDC_DOS, BST_UNCHECKED); + EnableWindow(hDOS, FALSE); + } + } break; } break; diff --git a/rufus.rc b/rufus.rc index 0a7a7b52..b416d8ba 100644 --- a/rufus.rc +++ b/rufus.rc @@ -63,7 +63,7 @@ BEGIN DEFPUSHBUTTON "OK",IDOK,231,175,50,14,WS_GROUP CONTROL "https://github.com/pbatard/rufus",IDC_ABOUT_RUFUS_URL, "SysLink",WS_TABSTOP,46,47,114,9 - LTEXT "Version 1.0.0 (Build 61)",IDC_STATIC,46,19,78,8 + LTEXT "Version 1.0.0 (Build 62)",IDC_STATIC,46,19,78,8 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 LTEXT "Report bugs or request enhancements at:",IDC_STATIC,46,66,187,8 @@ -162,8 +162,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,0,0,61 - PRODUCTVERSION 1,0,0,61 + FILEVERSION 1,0,0,62 + PRODUCTVERSION 1,0,0,62 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -180,13 +180,13 @@ BEGIN BEGIN VALUE "CompanyName", "akeo.ie" VALUE "FileDescription", "Rufus" - VALUE "FileVersion", "1.0.0.61" + VALUE "FileVersion", "1.0.0.62" VALUE "InternalName", "Rufus" VALUE "LegalCopyright", "© 2011 Pete Batard (GPL v3)" VALUE "LegalTrademarks", "http://www.gnu.org/copyleft/gpl.html" VALUE "OriginalFilename", "rufus.exe" VALUE "ProductName", "Rufus" - VALUE "ProductVersion", "1.0.0.61" + VALUE "ProductVersion", "1.0.0.62" END END BLOCK "VarFileInfo" @@ -212,7 +212,7 @@ IDI_ICON ICON "rufus.ico" STRINGTABLE BEGIN - IDS_VERSION "Rufus v1.0.0.61" + IDS_VERSION "Rufus v1.0.0.62" END #endif // English resources