mirror of
https://github.com/pbatard/rufus.git
synced 2024-08-14 23:57:05 +00:00
[core] detect memory cards in card readers
* Also remove drives with no media from the list * Closes #18
This commit is contained in:
parent
897becd290
commit
36693d2144
6 changed files with 75 additions and 9 deletions
17
src/drive.c
17
src/drive.c
|
@ -450,6 +450,23 @@ uint64_t GetDriveSize(DWORD DriveIndex)
|
|||
return DiskGeometry->DiskSize.QuadPart;
|
||||
}
|
||||
|
||||
/*
|
||||
* GET_DRIVE_GEOMETRY is used to tell if there is an actual media
|
||||
*/
|
||||
BOOL IsMediaPresent(DWORD DriveIndex)
|
||||
{
|
||||
BOOL r;
|
||||
HANDLE hPhysical;
|
||||
DWORD size;
|
||||
BYTE geometry[128];
|
||||
|
||||
hPhysical = GetPhysicalHandle(DriveIndex, FALSE, FALSE);
|
||||
r = DeviceIoControl(hPhysical, IOCTL_DISK_GET_DRIVE_GEOMETRY_EX,
|
||||
NULL, 0, geometry, sizeof(geometry), &size, NULL) || (size <= 0);
|
||||
safe_closehandle(hPhysical);
|
||||
return r;
|
||||
}
|
||||
|
||||
/*
|
||||
* Fill the drive properties (size, FS, etc)
|
||||
*/
|
||||
|
|
|
@ -1243,7 +1243,7 @@ DWORD WINAPI FormatThread(LPVOID param)
|
|||
// Try to ensure that all messages from Format and Checkdisk, which we report in the log, will be in English
|
||||
pfSetThreadUILanguage(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US));
|
||||
if (PRIMARYLANGID(pfGetThreadUILanguage()) != LANG_ENGLISH)
|
||||
uprintf("Note: the formatting thread could not be set to English");
|
||||
uprintf("Note: some formatting messages may still be localized");
|
||||
|
||||
PrintStatus(0, TRUE, MSG_225);
|
||||
hPhysicalDrive = GetPhysicalHandle(DriveIndex, TRUE, TRUE);
|
||||
|
|
|
@ -134,7 +134,6 @@ static BOOL htab_create(uint32_t nel)
|
|||
nel += 2;
|
||||
|
||||
htab_size = nel;
|
||||
uprintf("localization: using %d entries hash table\n", nel);
|
||||
htab_filled = 0;
|
||||
|
||||
// allocate memory and zero out.
|
||||
|
|
52
src/rufus.c
52
src/rufus.c
|
@ -31,6 +31,7 @@
|
|||
#include <commctrl.h>
|
||||
#include <setupapi.h>
|
||||
#include <winioctl.h>
|
||||
#include <shlobj.h>
|
||||
#include <process.h>
|
||||
#include <dbt.h>
|
||||
#include <io.h>
|
||||
|
@ -65,7 +66,7 @@
|
|||
#define DBT_CUSTOMEVENT 0x8006
|
||||
#endif
|
||||
|
||||
// MinGW fails to link those
|
||||
// MinGW fails to link those...
|
||||
typedef HIMAGELIST (WINAPI *ImageList_Create_t)(
|
||||
int cx,
|
||||
int cy,
|
||||
|
@ -86,6 +87,25 @@ struct {
|
|||
UINT uAlign;
|
||||
} bi_iso = {0}, bi_up = {0}, bi_down = {0}, bi_lang = {0}; // BUTTON_IMAGELIST
|
||||
|
||||
// ...and MinGW doesn't know these.
|
||||
typedef struct
|
||||
{
|
||||
LPCITEMIDLIST pidl;
|
||||
BOOL fRecursive;
|
||||
} MY_SHChangeNotifyEntry;
|
||||
|
||||
typedef BOOL (WINAPI *SHChangeNotifyDeregister_t)(
|
||||
ULONG ulID
|
||||
);
|
||||
typedef ULONG (WINAPI *SHChangeNotifyRegister_t)(
|
||||
HWND hwnd,
|
||||
int fSources,
|
||||
LONG fEvents,
|
||||
UINT wMsg,
|
||||
int cEntries,
|
||||
const MY_SHChangeNotifyEntry *pshcne
|
||||
);
|
||||
|
||||
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 };
|
||||
|
@ -745,6 +765,13 @@ static BOOL GetUSBDevices(DWORD devnum)
|
|||
}
|
||||
|
||||
drive_index = device_number.DeviceNumber + DRIVE_INDEX_MIN;
|
||||
if (!IsMediaPresent(drive_index)) {
|
||||
uprintf("Device eliminated because it appears to contain no media\n");
|
||||
safe_closehandle(hDrive);
|
||||
safe_free(devint_detail_data);
|
||||
break;
|
||||
}
|
||||
|
||||
if (GetDriveLabel(drive_index, &drive_letter, &label)) {
|
||||
if ((!enable_HDDs) && ((score = IsHDD(drive_index, vid, pid, buffer)) > 0)) {
|
||||
uprintf("Device eliminated because it was detected as an USB Hard Drive (score %d > 0)\n", score);
|
||||
|
@ -1512,10 +1539,18 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
|
|||
char tmp[128];
|
||||
static UINT uBootChecked = BST_CHECKED, uQFChecked;
|
||||
static BOOL first_log_display = TRUE, user_changed_label = FALSE;
|
||||
static ULONG ulRegister = 0;
|
||||
static LPITEMIDLIST pidlDesktop = NULL;
|
||||
static MY_SHChangeNotifyEntry NotifyEntry;
|
||||
loc_cmd* lcmd = NULL;
|
||||
PF_DECL(SHChangeNotifyRegister);
|
||||
PF_DECL(SHChangeNotifyDeregister);
|
||||
|
||||
switch (message) {
|
||||
|
||||
case UM_MEDIA_CHANGE:
|
||||
wParam = DBT_CUSTOMEVENT;
|
||||
// Fall through
|
||||
case WM_DEVICECHANGE:
|
||||
// The Windows hotplug subsystem sucks. Among other things, if you insert a GPT partitioned
|
||||
// USB drive with zero partitions, the only device messages you will get are a stream of
|
||||
|
@ -1528,7 +1563,7 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
|
|||
switch (wParam) {
|
||||
case DBT_DEVICEARRIVAL:
|
||||
case DBT_DEVICEREMOVECOMPLETE:
|
||||
case DBT_CUSTOMEVENT: // This last event is sent by our timer refresh function
|
||||
case DBT_CUSTOMEVENT: // Sent by our timer refresh function or for card reader media change
|
||||
LastRefresh = GetTickCount(); // Don't care about 49.7 days rollback of GetTickCount()
|
||||
KillTimer(hMainDialog, TID_REFRESH_TIMER);
|
||||
GetUSBDevices((DWORD)ComboBox_GetItemData(hDeviceList, ComboBox_GetCurSel(hDeviceList)));
|
||||
|
@ -1549,6 +1584,7 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
|
|||
break;
|
||||
|
||||
case WM_INITDIALOG:
|
||||
PF_INIT(SHChangeNotifyRegister, shell32);
|
||||
apply_localization(IDD_DIALOG, hDlg);
|
||||
SetUpdateCheck();
|
||||
advanced_mode = TRUE;
|
||||
|
@ -1559,6 +1595,15 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
|
|||
InitDialog(hDlg);
|
||||
GetUSBDevices(0);
|
||||
CheckForUpdates(FALSE);
|
||||
// Register MEDIA_INSERTED/MEDIA_REMOVED notifications for card readers
|
||||
if ((pfSHChangeNotifyRegister != NULL) && (SUCCEEDED(SHGetSpecialFolderLocation(0, CSIDL_DESKTOP, &pidlDesktop)))) {
|
||||
NotifyEntry.pidl = pidlDesktop;
|
||||
NotifyEntry.fRecursive = TRUE;
|
||||
// NB: The following only works if the media is already formatted.
|
||||
// If you insert a blank card, notifications will not be sent... :(
|
||||
ulRegister = pfSHChangeNotifyRegister(hDlg, 0x0001|0x0002|0x8000,
|
||||
SHCNE_MEDIAINSERTED|SHCNE_MEDIAREMOVED, UM_MEDIA_CHANGE, 1, &NotifyEntry);
|
||||
}
|
||||
PostMessage(hMainDialog, UM_ISO_CREATE, 0, 0);
|
||||
return (INT_PTR)TRUE;
|
||||
|
||||
|
@ -1600,6 +1645,7 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
|
|||
switch(LOWORD(wParam)) {
|
||||
case IDOK: // close application
|
||||
case IDCANCEL:
|
||||
PF_INIT(SHChangeNotifyDeregister, shell32);
|
||||
EnableWindow(GetDlgItem(hISOProgressDlg, IDC_ISO_ABORT), FALSE);
|
||||
EnableWindow(GetDlgItem(hDlg, IDCANCEL), FALSE);
|
||||
if (format_thid != NULL) {
|
||||
|
@ -1622,6 +1668,8 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
|
|||
}
|
||||
return (INT_PTR)TRUE;
|
||||
}
|
||||
if ((pfSHChangeNotifyDeregister != NULL) && (ulRegister != 0))
|
||||
pfSHChangeNotifyDeregister(ulRegister);
|
||||
PostQuitMessage(0);
|
||||
StrArrayDestroy(&DriveID);
|
||||
StrArrayDestroy(&DriveLabel);
|
||||
|
|
|
@ -109,6 +109,7 @@ extern void _uprintf(const char *format, ...);
|
|||
/* Custom Windows messages */
|
||||
enum user_message_type {
|
||||
UM_FORMAT_COMPLETED = WM_APP,
|
||||
UM_MEDIA_CHANGE,
|
||||
// TODO: relabel "ISO" to a more generic "progress"
|
||||
UM_ISO_CREATE,
|
||||
UM_ISO_INIT,
|
||||
|
@ -329,6 +330,7 @@ extern BOOL DeletePartitions(HANDLE hDrive);
|
|||
extern const char* GetPartitionType(BYTE Type);
|
||||
extern BOOL GetDrivePartitionData(DWORD DriveIndex, char* FileSystemName, DWORD FileSystemNameSize);
|
||||
extern BOOL GetDriveLabel(DWORD DriveIndex, char* letter, char** label);
|
||||
extern BOOL IsMediaPresent(DWORD DriveIndex);
|
||||
extern BOOL MountVolume(char* drive_name, char *drive_guid);
|
||||
extern BOOL UnmountVolume(HANDLE hDrive);
|
||||
extern BOOL RemountVolume(char* drive_name);
|
||||
|
|
10
src/rufus.rc
10
src/rufus.rc
|
@ -33,7 +33,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
|
|||
IDD_DIALOG DIALOGEX 12, 12, 206, 329
|
||||
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
EXSTYLE WS_EX_APPWINDOW
|
||||
CAPTION "Rufus v1.4.2.359"
|
||||
CAPTION "Rufus v1.4.2.360"
|
||||
FONT 8, "MS Shell Dlg", 400, 0, 0x1
|
||||
BEGIN
|
||||
DEFPUSHBUTTON "Start",IDC_START,94,291,50,14
|
||||
|
@ -288,8 +288,8 @@ END
|
|||
//
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION 1,4,2,359
|
||||
PRODUCTVERSION 1,4,2,359
|
||||
FILEVERSION 1,4,2,360
|
||||
PRODUCTVERSION 1,4,2,360
|
||||
FILEFLAGSMASK 0x3fL
|
||||
#ifdef _DEBUG
|
||||
FILEFLAGS 0x1L
|
||||
|
@ -306,13 +306,13 @@ BEGIN
|
|||
BEGIN
|
||||
VALUE "CompanyName", "Akeo Consulting (http://akeo.ie)"
|
||||
VALUE "FileDescription", "Rufus"
|
||||
VALUE "FileVersion", "1.4.2.359"
|
||||
VALUE "FileVersion", "1.4.2.360"
|
||||
VALUE "InternalName", "Rufus"
|
||||
VALUE "LegalCopyright", "© 2011-2013 Pete Batard (GPL v3)"
|
||||
VALUE "LegalTrademarks", "http://www.gnu.org/copyleft/gpl.html"
|
||||
VALUE "OriginalFilename", "rufus.exe"
|
||||
VALUE "ProductName", "Rufus"
|
||||
VALUE "ProductVersion", "1.4.2.359"
|
||||
VALUE "ProductVersion", "1.4.2.360"
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
|
|
Loading…
Reference in a new issue