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