From a4e12f5c129783e75b4ffb2c35b36291ea8bb3b7 Mon Sep 17 00:00:00 2001 From: Pete Batard Date: Sat, 20 Dec 2014 17:30:12 +0000 Subject: [PATCH] [vhd] fix VHD detection on localized versions of Windows * SPDRP_FRIENDLYNAME is localized, so we can't use it. * Closes #417 --- src/rufus.rc | 16 ++++++++-------- src/usb.c | 23 +++++++++++++---------- 2 files changed, 21 insertions(+), 18 deletions(-) diff --git a/src/rufus.rc b/src/rufus.rc index 5a33ed80..5cf386fb 100644 --- a/src/rufus.rc +++ b/src/rufus.rc @@ -32,7 +32,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL IDD_DIALOG DIALOGEX 12, 12, 242, 329 STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Rufus 1.5.0.560" +CAPTION "Rufus 1.5.0.561" FONT 8, "Segoe UI", 400, 0, 0x1 BEGIN DEFPUSHBUTTON "Start",IDC_START,127,291,50,14 @@ -164,7 +164,7 @@ END IDD_DIALOG_XP DIALOGEX 12, 12, 242, 329 STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Rufus 1.5.0.560" +CAPTION "Rufus 1.5.0.561" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN DEFPUSHBUTTON "Start",IDC_START,127,291,50,14 @@ -297,7 +297,7 @@ END IDD_DIALOG_RTL DIALOGEX 12, 12, 242, 329 STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU EXSTYLE WS_EX_RTLREADING | WS_EX_APPWINDOW | WS_EX_LAYOUTRTL -CAPTION "Rufus 1.5.0.560" +CAPTION "Rufus 1.5.0.561" FONT 8, "Segoe UI", 400, 0, 0x1 BEGIN DEFPUSHBUTTON "Start",IDC_START,127,291,50,14 @@ -437,7 +437,7 @@ END IDD_DIALOG_RTL_XP DIALOGEX 12, 12, 242, 329 STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU EXSTYLE WS_EX_RTLREADING | WS_EX_APPWINDOW | WS_EX_LAYOUTRTL -CAPTION "Rufus 1.5.0.560" +CAPTION "Rufus 1.5.0.561" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN DEFPUSHBUTTON "Start",IDC_START,127,291,50,14 @@ -703,8 +703,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,5,0,560 - PRODUCTVERSION 1,5,0,560 + FILEVERSION 1,5,0,561 + PRODUCTVERSION 1,5,0,561 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -721,13 +721,13 @@ BEGIN BEGIN VALUE "CompanyName", "Akeo Consulting (http://akeo.ie)" VALUE "FileDescription", "Rufus" - VALUE "FileVersion", "1.5.0.560" + VALUE "FileVersion", "1.5.0.561" VALUE "InternalName", "Rufus" VALUE "LegalCopyright", "© 2011-2014 Pete Batard (GPL v3)" VALUE "LegalTrademarks", "http://www.gnu.org/copyleft/gpl.html" VALUE "OriginalFilename", "rufus.exe" VALUE "ProductName", "Rufus" - VALUE "ProductVersion", "1.5.0.560" + VALUE "ProductVersion", "1.5.0.561" END END BLOCK "VarFileInfo" diff --git a/src/usb.c b/src/usb.c index 7cc917f3..6535a1a3 100644 --- a/src/usb.c +++ b/src/usb.c @@ -109,12 +109,10 @@ static __inline BOOL IsVHD(const char* buffer) int i; // List of the Friendly Names of the VHD devices we know const char* vhd_name[] = { - "Arsenal Virtual", - "Kernsafe Virtual", - "Microsoft Virtual", - "MS Virtual", - "Msft Virtual", -// "VMware Virtual" // Would list primary disks on VMWare instances, so we avoid it + "Arsenal_________Virtual_", + "KernSafeVirtual_________", + "Msft____Virtual_Disk____", +// "VMware__VMware_Virtual_S" // Would list primary disks on VMWare instances, so we avoid it }; for (i = 0; i < ARRAYSIZE(vhd_name); i++) @@ -259,16 +257,21 @@ BOOL GetUSBDevices(DWORD devnum) is_SCSI = (safe_stricmp(buffer, scsi_name) == 0); if ((safe_stricmp(buffer, storage_name[0]) != 0) && (!is_SCSI)) continue; - memset(buffer, 0, sizeof(buffer)); + + // We can't use the friendly name to find if a drive is a VHD, as friendly name string gets translated + // according to your locale, so we poke the Hardware ID memset(&props, 0, sizeof(props)); + memset(buffer, 0, sizeof(buffer)); + props.is_VHD = SetupDiGetDeviceRegistryPropertyA(dev_info, &dev_info_data, SPDRP_HARDWAREID, + &datatype, (LPBYTE)buffer, sizeof(buffer), &size) && IsVHD(buffer); + + memset(buffer, 0, sizeof(buffer)); if (!SetupDiGetDeviceRegistryPropertyA(dev_info, &dev_info_data, SPDRP_FRIENDLYNAME, &datatype, (LPBYTE)buffer, sizeof(buffer), &size)) { uprintf("SetupDiGetDeviceRegistryProperty (Friendly Name) failed: %s\n", WindowsErrorString()); // We can afford a failure on this call - just replace the name with "USB Storage Device (Generic)" safe_strcpy(buffer, sizeof(buffer), lmprintf(MSG_045)); - } else if (IsVHD(buffer)) { - props.is_VHD = TRUE; - } else if (devid_list != NULL) { + } else if ((!props.is_VHD) && (devid_list != NULL)) { // Get the properties of the device. We could avoid doing this lookup every time by keeping // a lookup table, but there shouldn't be that many USB storage devices connected... // NB: Each of these Device IDs have an _only_ child, from which we get the Device Instance match.