From b3caf638b69c2c095ff5af987c83c8fb648fc838 Mon Sep 17 00:00:00 2001 From: Pete Batard <pete@akeo.ie> Date: Wed, 9 Sep 2020 17:00:39 +0100 Subject: [PATCH] [misc] miscellaneous code cleanup and fixes * Don't use hDrive handle for longer than necessary * Move all the popcount() function calls into missing.h * Ensure that the thread_affinity[] array is properly sized * Improve timeouts for conflicting process search --- src/dev.c | 14 ++------------ src/missing.h | 15 ++++++++++++--- src/rufus.c | 4 ++-- src/rufus.h | 5 ++++- src/rufus.rc | 10 +++++----- src/stdfn.c | 10 ---------- 6 files changed, 25 insertions(+), 33 deletions(-) diff --git a/src/dev.c b/src/dev.c index c4a0312b..be8e96af 100644 --- a/src/dev.c +++ b/src/dev.c @@ -799,10 +799,8 @@ BOOL GetDevices(DWORD devnum) uprintf("NOTE: This device is a USB 3.%c device operating at lower speed...", '0' + props.lower_speed - 1); } devint_data.cbSize = sizeof(devint_data); - hDrive = INVALID_HANDLE_VALUE; devint_detail_data = NULL; - for (j=0; ;j++) { - safe_closehandle(hDrive); + for (j = 0; ; j++) { safe_free(devint_detail_data); if (!SetupDiEnumDeviceInterfaces(dev_info, &dev_info_data, &GUID_DEVINTERFACE_DISK, j, &devint_data)) { @@ -844,19 +842,18 @@ BOOL GetDevices(DWORD devnum) } drive_number = GetDriveNumber(hDrive, devint_detail_data->DevicePath); + CloseHandle(hDrive); if (drive_number < 0) continue; drive_index = drive_number + DRIVE_INDEX_MIN; if (!IsMediaPresent(drive_index)) { uprintf("Device eliminated because it appears to contain no media"); - safe_closehandle(hDrive); safe_free(devint_detail_data); break; } if (GetDriveSize(drive_index) < (MIN_DRIVE_SIZE*MB)) { uprintf("Device eliminated because it is smaller than %d MB", MIN_DRIVE_SIZE); - safe_closehandle(hDrive); safe_free(devint_detail_data); break; } @@ -866,7 +863,6 @@ BOOL GetDevices(DWORD devnum) if (!props.is_Removable) { // Non removables should have been eliminated above, but since we // are potentially dealing with system drives, better safe than sorry - safe_closehandle(hDrive); safe_free(devint_detail_data); break; } @@ -880,7 +876,6 @@ BOOL GetDevices(DWORD devnum) } if (*p) { uprintf("Device eliminated because it contains a mounted partition that is set as non-removable"); - safe_closehandle(hDrive); safe_free(devint_detail_data); break; } @@ -892,20 +887,17 @@ BOOL GetDevices(DWORD devnum) if (!list_non_usb_removable_drives) uprintf("If this device is not a Hard Drive, please e-mail the author of this application"); uprintf("NOTE: You can enable the listing of Hard Drives under 'advanced drive properties'"); - safe_closehandle(hDrive); safe_free(devint_detail_data); break; } // Windows 10 19H1 mounts a 'PortableBaseLayer' for its Windows Sandbox feature => unlist those if (safe_strcmp(label, windows_sandbox_vhd_label) == 0) { uprintf("Device eliminated because it is a Windows Sandbox VHD"); - safe_closehandle(hDrive); safe_free(devint_detail_data); break; } if (props.is_VHD && (!enable_VHDs)) { uprintf("Device eliminated because listing of VHDs is disabled (Alt-G)"); - safe_closehandle(hDrive); safe_free(devint_detail_data); break; } @@ -943,7 +935,6 @@ BOOL GetDevices(DWORD devnum) if (remove_drive) { uprintf("Removing %C: from the list: This is the %s!", drive_letters[--k], (remove_drive==1)?"disk from which " APPLICATION_NAME " is running":"system disk"); - safe_closehandle(hDrive); safe_free(devint_detail_data); break; } @@ -961,7 +952,6 @@ BOOL GetDevices(DWORD devnum) IGNORE_RETVAL(ComboBox_SetItemData(hDeviceList, ComboBox_AddStringU(hDeviceList, entry), drive_index)); maxwidth = max(maxwidth, GetEntryWidth(hDeviceList, entry)); - safe_closehandle(hDrive); safe_free(devint_detail_data); break; } diff --git a/src/missing.h b/src/missing.h index be0b2c23..729ec66c 100644 --- a/src/missing.h +++ b/src/missing.h @@ -76,9 +76,18 @@ /* * Nibbled from https://github.com/hanji/popcnt/blob/master/populationcount.cpp - * Since MSVC x86_32 does not have intrinsic popcount64 and I don't have all day + * Since MSVC x86_32 and/or ARM don't have intrinsic popcount and I don't have all day */ -static __inline int popcnt64(register uint64_t u) +static __inline uint8_t popcnt8(uint8_t val) +{ + static const uint8_t nibble_lookup[16] = { + 0, 1, 1, 2, 1, 2, 2, 3, + 1, 2, 2, 3, 2, 3, 3, 4 + }; + return nibble_lookup[val & 0x0F] + nibble_lookup[val >> 4]; +} + +static __inline uint8_t popcnt64(register uint64_t u) { u = (u & 0x5555555555555555) + ((u >> 1) & 0x5555555555555555); u = (u & 0x3333333333333333) + ((u >> 2) & 0x3333333333333333); @@ -86,7 +95,7 @@ static __inline int popcnt64(register uint64_t u) u = (u & 0x00ff00ff00ff00ff) + ((u >> 8) & 0x00ff00ff00ff00ff); u = (u & 0x0000ffff0000ffff) + ((u >> 16) & 0x0000ffff0000ffff); u = (u & 0x00000000ffffffff) + ((u >> 32) & 0x00000000ffffffff); - return (int)u; + return (uint8_t)u; } static __inline void *_reallocf(void *ptr, size_t size) { diff --git a/src/rufus.c b/src/rufus.c index c170759f..4704df36 100755 --- a/src/rufus.c +++ b/src/rufus.c @@ -2052,7 +2052,7 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA static ULONG ulRegister = 0; static LPITEMIDLIST pidlDesktop = NULL; static SHChangeNotifyEntry NotifyEntry; - static DWORD_PTR thread_affinity[4]; + static DWORD_PTR thread_affinity[CHECKSUM_MAX + 1]; static HFONT hyperlink_font = NULL; LONG lPos; BOOL set_selected_fs; @@ -2851,7 +2851,7 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA } } - if (!CheckDriveAccess(CHECK_DRIVE_TIMEOUT, TRUE)) + if (!CheckDriveAccess(SEARCH_PROCESS_TIMEOUT, TRUE)) goto aborted_start; GetWindowTextU(hDeviceList, tmp, ARRAYSIZE(tmp)); diff --git a/src/rufus.h b/src/rufus.h index 2dac7be2..eb5297e5 100644 --- a/src/rufus.h +++ b/src/rufus.h @@ -81,9 +81,12 @@ #define STATUS_MSG_TIMEOUT 3500 // How long should cheat mode messages appear for on the status bar #define WRITE_RETRIES 4 #define WRITE_TIMEOUT 5000 // How long we should wait between write retries (in ms) +#if defined(_DEBUG) +#define SEARCH_PROCESS_TIMEOUT 60000 +#else #define SEARCH_PROCESS_TIMEOUT 10000 // How long we should search for conflicting processes before giving up (in ms) +#endif #define NET_SESSION_TIMEOUT 3500 // How long we should wait to connect, send or receive internet data -#define CHECK_DRIVE_TIMEOUT 2000 #define MARQUEE_TIMER_REFRESH 10 // Time between progress bar marquee refreshes, in ms #define FS_DEFAULT FS_FAT32 #define SINGLE_CLUSTERSIZE_DEFAULT 0x00000100 diff --git a/src/rufus.rc b/src/rufus.rc index 0b61f971..c1c99517 100644 --- a/src/rufus.rc +++ b/src/rufus.rc @@ -33,7 +33,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL IDD_DIALOG DIALOGEX 12, 12, 232, 326 STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU EXSTYLE WS_EX_ACCEPTFILES -CAPTION "Rufus 3.12.1696" +CAPTION "Rufus 3.12.1697" FONT 9, "Segoe UI Symbol", 400, 0, 0x0 BEGIN LTEXT "Drive Properties",IDS_DRIVE_PROPERTIES_TXT,8,6,53,12,NOT WS_GROUP @@ -395,8 +395,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 3,12,1696,0 - PRODUCTVERSION 3,12,1696,0 + FILEVERSION 3,12,1697,0 + PRODUCTVERSION 3,12,1697,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -414,13 +414,13 @@ BEGIN VALUE "Comments", "https://rufus.ie" VALUE "CompanyName", "Akeo Consulting" VALUE "FileDescription", "Rufus" - VALUE "FileVersion", "3.12.1696" + VALUE "FileVersion", "3.12.1697" VALUE "InternalName", "Rufus" VALUE "LegalCopyright", "© 2011-2020 Pete Batard (GPL v3)" VALUE "LegalTrademarks", "https://www.gnu.org/licenses/gpl-3.0.html" VALUE "OriginalFilename", "rufus-3.12.exe" VALUE "ProductName", "Rufus" - VALUE "ProductVersion", "3.12.1696" + VALUE "ProductVersion", "3.12.1697" END END BLOCK "VarFileInfo" diff --git a/src/stdfn.c b/src/stdfn.c index 11b89eee..6b2f6464 100644 --- a/src/stdfn.c +++ b/src/stdfn.c @@ -37,16 +37,6 @@ int nWindowsVersion = WINDOWS_UNDEFINED; int nWindowsBuildNumber = -1; char WindowsVersionStr[128] = "Windows "; -// __popcnt16, __popcnt, __popcnt64 are not available for ARM :( -uint8_t popcnt8(uint8_t val) -{ - static const uint8_t nibble_lookup[16] = { - 0, 1, 1, 2, 1, 2, 2, 3, - 1, 2, 2, 3, 2, 3, 3, 4 - }; - return nibble_lookup[val & 0x0F] + nibble_lookup[val >> 4]; -} - /* * Hash table functions - modified From glibc 2.3.2: * [Aho,Sethi,Ullman] Compilers: Principles, Techniques and Tools, 1986