[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
This commit is contained in:
Pete Batard 2020-09-09 17:00:39 +01:00
parent 7df88aa931
commit b3caf638b6
No known key found for this signature in database
GPG Key ID: 38E0CF5E69EDD671
6 changed files with 25 additions and 33 deletions

View File

@ -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;
}

View File

@ -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) {

View File

@ -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));

View File

@ -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

View File

@ -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"

View File

@ -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