diff --git a/src/checksum.c b/src/checksum.c index abca0332..0b8c1d4b 100644 --- a/src/checksum.c +++ b/src/checksum.c @@ -1134,7 +1134,11 @@ DWORD WINAPI SumThread(void* param) int num_checksums = CHECKSUM_MAX - (enable_extra_hashes ? 0 : 1); if ((image_path == NULL) || (thread_affinity == NULL)) +#if _MSC_VER && !__INTEL_COMPILER + _endthreadex(r); +#else ExitThread(r); +#endif uprintf("\r\nComputing checksum for '%s'...", image_path); @@ -1155,7 +1159,11 @@ DWORD WINAPI SumThread(void* param) uprintf("Unable to create checksum thread event: %s", WindowsErrorString()); goto out; } +#if _MSC_VER && !__INTEL_COMPILER + sum_thread[i] = (HANDLE)_beginthreadex(NULL, 0, &IndividualSumThread, (LPVOID)(uintptr_t)i, 0, NULL); +#else sum_thread[i] = CreateThread(NULL, 0, IndividualSumThread, (LPVOID)(uintptr_t)i, 0, NULL); +#endif if (sum_thread[i] == NULL) { uprintf("Unable to start checksum thread #%d", i); goto out; @@ -1250,7 +1258,11 @@ out: PostMessage(hMainDialog, UM_FORMAT_COMPLETED, (WPARAM)FALSE, 0); if (r == 0) MyDialogBox(hMainInstance, IDD_CHECKSUM, hMainDialog, ChecksumCallback); +#if _MSC_VER && !__INTEL_COMPILER + _endthreadex(r); +#else ExitThread(r); +#endif } /* diff --git a/src/format.c b/src/format.c index a3fcc63b..e5f5b25e 100644 --- a/src/format.c +++ b/src/format.c @@ -2419,7 +2419,11 @@ out: } } PostMessage(hMainDialog, UM_FORMAT_COMPLETED, (WPARAM)TRUE, 0); +#if _MSC_VER && !__INTEL_COMPILER + _endthreadex(0); +#else ExitThread(0); +#endif } DWORD WINAPI SaveImageThread(void* param) @@ -2542,5 +2546,9 @@ out: safe_closehandle(hDestImage); safe_unlockclose(hPhysicalDrive); PostMessage(hMainDialog, UM_FORMAT_COMPLETED, (WPARAM)TRUE, 0); +#if _MSC_VER && !__INTEL_COMPILER + _endthreadex(0); +#else ExitThread(0); +#endif } diff --git a/src/net.c b/src/net.c index abc16b40..d0cd510b 100644 --- a/src/net.c +++ b/src/net.c @@ -594,7 +594,11 @@ typedef struct { static DWORD WINAPI DownloadSignedFileThread(LPVOID param) { DownloadSignedFileThreadArgs* args = (DownloadSignedFileThreadArgs*)param; +#if _MSC_VER && !__INTEL_COMPILER + _endthreadex(DownloadSignedFile(args->url, args->file, args->hProgressDialog, args->bPromptOnError)); +#else ExitThread(DownloadSignedFile(args->url, args->file, args->hProgressDialog, args->bPromptOnError)); +#endif } HANDLE DownloadSignedFileThreaded(const char* url, const char* file, HWND hProgressDialog, BOOL bPromptOnError) @@ -604,7 +608,11 @@ HANDLE DownloadSignedFileThreaded(const char* url, const char* file, HWND hProgr args.file = file; args.hProgressDialog = hProgressDialog; args.bPromptOnError = bPromptOnError; +#if _MSC_VER && !__INTEL_COMPILER + return (HANDLE)_beginthreadex(NULL, 0, &DownloadSignedFileThread, &args, 0, NULL); +#else return CreateThread(NULL, 0, DownloadSignedFileThread, &args, 0, NULL); +#endif } static __inline uint64_t to_uint64_t(uint16_t x[4]) { @@ -865,7 +873,11 @@ out: force_update_check = FALSE; update_check_thread = NULL; CoUninitialize(); +#if _MSC_VER && !__INTEL_COMPILER + _endthreadex(0); +#else ExitThread(0); +#endif } /* @@ -877,7 +889,11 @@ BOOL CheckForUpdates(BOOL force) if (update_check_thread != NULL) return FALSE; +#if _MSC_VER && !__INTEL_COMPILER + update_check_thread = (HANDLE)_beginthreadex(NULL, 0, &CheckForUpdatesThread, NULL, 0, NULL); +#else update_check_thread = CreateThread(NULL, 0, CheckForUpdatesThread, NULL, 0, NULL); +#endif if (update_check_thread == NULL) { uprintf("Unable to start update check thread"); return FALSE; @@ -1071,12 +1087,22 @@ out: SendMessage(hMainDialog, UM_ENABLE_CONTROLS, 0, 0); dialog_showing--; CoUninitialize(); +#if _MSC_VER && !__INTEL_COMPILER + _endthreadex(dwExitCode); +#else ExitThread(dwExitCode); +#endif } BOOL DownloadISO() { - if (CreateThread(NULL, 0, DownloadISOThread, NULL, 0, NULL) == NULL) { + HANDLE hDownloadIso; +#if _MSC_VER && !__INTEL_COMPILER + hDownloadIso = (HANDLE)_beginthreadex(NULL, 0, &DownloadISOThread, NULL, 0, NULL); +#else + hDownloadIso = CreateThread(NULL, 0, DownloadISOThread, NULL, 0, NULL); +#endif + if (hDownloadIso == NULL) { uprintf("Unable to start Windows ISO download thread"); FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | APPERR(ERROR_CANT_START_THREAD); SendMessage(hMainDialog, UM_ENABLE_CONTROLS, 0, 0); diff --git a/src/process.c b/src/process.c index b5e91abc..389ce5a2 100644 --- a/src/process.c +++ b/src/process.c @@ -641,7 +641,11 @@ out: PhFree(buffer); PhFree(handles); PhDestroyHeap(); +#if _MSC_VER && !__INTEL_COMPILER + _endthreadex(0); +#else ExitThread(0); +#endif } /** @@ -669,7 +673,11 @@ BYTE SearchProcess(char* HandleName, DWORD dwTimeOut, BOOL bPartialMatch, BOOL b assert(_wHandleName != NULL); +#if _MSC_VER && !__INTEL_COMPILER + handle = (HANDLE)_beginthreadex(NULL, 0, &SearchProcessThread, NULL, 0, NULL); +#else handle = CreateThread(NULL, 0, SearchProcessThread, NULL, 0, NULL); +#endif if (handle == NULL) { uprintf("Warning: Unable to create conflicting process search thread"); goto out; diff --git a/src/rufus.c b/src/rufus.c index a03266b0..a1e87c91 100755 --- a/src/rufus.c +++ b/src/rufus.c @@ -1399,7 +1399,11 @@ DWORD WINAPI ImageScanThread(LPVOID param) out: dont_display_image_name = FALSE; PrintInfo(0, MSG_210); +#if _MSC_VER && !__INTEL_COMPILER + _endthreadex(0); +#else ExitThread(0); +#endif } // Likewise, boot check will block message processing => use a thread @@ -1799,7 +1803,11 @@ uefi_target: out: PostMessage(hMainDialog, UM_FORMAT_START, ret, 0); +#if _MSC_VER && !__INTEL_COMPILER + _endthreadex((DWORD)ret); +#else ExitThread((DWORD)ret); +#endif } static __inline const char* IsAlphaOrBeta(void) @@ -2047,7 +2055,11 @@ static void SaveVHD(void) EnableControls(FALSE, FALSE); FormatStatus = 0; InitProgress(TRUE); +#if _MSC_VER && !__INTEL_COMPILER + format_thread = (HANDLE)_beginthreadex(NULL, 0, &SaveImageThread, &img_save, 0, NULL); +#else format_thread = CreateThread(NULL, 0, SaveImageThread, &img_save, 0, NULL); +#endif if (format_thread != NULL) { uprintf("\r\nSave to VHD operation started"); PrintInfo(0, -1); @@ -2102,7 +2114,11 @@ static void SaveISO(void) // Disable all controls except cancel EnableControls(FALSE, FALSE); InitProgress(TRUE); +#if _MSC_VER && !__INTEL_COMPILER + format_thread = (HANDLE)_beginthreadex(NULL, 0, &SaveImageThread, &img_save, 0, NULL); +#else format_thread = CreateThread(NULL, 0, SaveImageThread, &img_save, 0, NULL); +#endif if (format_thread != NULL) { uprintf("\r\nSave to ISO operation started"); PrintInfo(0, -1); @@ -2584,7 +2600,13 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA } } FormatStatus = 0; - if (CreateThread(NULL, 0, ImageScanThread, NULL, 0, NULL) == NULL) { + HANDLE hImgScanThread; +#if _MSC_VER && !__INTEL_COMPILER + hImgScanThread = (HANDLE)_beginthreadex(NULL, 0, &ImageScanThread, NULL, 0, NULL); +#else + hImgScanThread = CreateThread(NULL, 0, ImageScanThread, NULL, 0, NULL); +#endif + if (hImgScanThread == NULL) { uprintf("Unable to start ISO scanning thread"); FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | APPERR(ERROR_CANT_START_THREAD); } @@ -2621,7 +2643,13 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA selection_default = (int)ComboBox_GetCurItemData(hBootType); // Create a thread to validate options and download files as needed (so that we can update the UI). // On exit, this thread sends message UM_FORMAT_START back to this dialog. - if (CreateThread(NULL, 0, BootCheckThread, NULL, 0, NULL) == NULL) { + HANDLE hBootCheck; +#if _MSC_VER && !__INTEL_COMPILER + hBootCheck = (HANDLE)_beginthreadex(NULL, 0, &BootCheckThread, NULL, 0, NULL); +#else + hBootCheck = CreateThread(NULL, 0, BootCheckThread, NULL, 0, NULL); +#endif + if (hBootCheck == NULL) { uprintf("Unable to start boot check thread"); FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | APPERR(ERROR_CANT_START_THREAD); PostMessage(hMainDialog, UM_FORMAT_COMPLETED, (WPARAM)FALSE, 0); @@ -2646,7 +2674,11 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA EnableControls(FALSE, FALSE); InitProgress(FALSE); SetThreadAffinity(thread_affinity, CHECKSUM_MAX + 1); +#if _MSC_VER && !__INTEL_COMPILER + format_thread = (HANDLE)_beginthreadex(NULL, 0, &SumThread, (LPVOID)thread_affinity, 0, NULL); +#else format_thread = CreateThread(NULL, 0, SumThread, (LPVOID)thread_affinity, 0, NULL); +#endif if (format_thread != NULL) { SetThreadPriority(format_thread, default_thread_priority); PrintInfo(0, -1); @@ -3025,7 +3057,11 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA nDeviceIndex = ComboBox_GetCurSel(hDeviceList); DeviceNum = (DWORD)ComboBox_GetItemData(hDeviceList, nDeviceIndex); InitProgress(zero_drive || write_as_image); +#if _MSC_VER && !__INTEL_COMPILER + format_thread = (HANDLE)_beginthreadex(NULL, 0, &FormatThread, (LPVOID)(uintptr_t)DeviceNum, 0, NULL); +#else format_thread = CreateThread(NULL, 0, FormatThread, (LPVOID)(uintptr_t)DeviceNum, 0, NULL); +#endif if (format_thread == NULL) { uprintf("Unable to start formatting thread"); FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | APPERR(ERROR_CANT_START_THREAD); diff --git a/src/rufus.h b/src/rufus.h index 172ce02c..e9deb458 100644 --- a/src/rufus.h +++ b/src/rufus.h @@ -20,6 +20,7 @@ #include #if defined(_MSC_VER) +#include // Disable some VS Code Analysis warnings #pragma warning(disable: 4996) // Ignore deprecated #pragma warning(disable: 6258) // I know what I'm using TerminateThread for diff --git a/src/stdfn.c b/src/stdfn.c index eac6d5b7..8fa599ff 100644 --- a/src/stdfn.c +++ b/src/stdfn.c @@ -927,7 +927,11 @@ BOOL SetLGP(BOOL bRestore, BOOL* bExistingKey, const char* szPath, const char* s return FALSE; } +#if _MSC_VER && !__INTEL_COMPILER + thread_id = (HANDLE)_beginthreadex(NULL, 0, &SetLGPThread, (LPVOID)¶ms, 0, NULL); +#else thread_id = CreateThread(NULL, 0, SetLGPThread, (LPVOID)¶ms, 0, NULL); +#endif if (thread_id == NULL) { ubprintf("SetLGP: Unable to start thread"); return FALSE; diff --git a/src/stdlg.c b/src/stdlg.c index 4db60a4d..8d296f2b 100644 --- a/src/stdlg.c +++ b/src/stdlg.c @@ -1574,7 +1574,11 @@ void SetFidoCheck(void) return; } +#if _MSC_VER && !__INTEL_COMPILER + _beginthreadex(NULL, 0, &CheckForFidoThread, NULL, 0, NULL); +#else CreateThread(NULL, 0, CheckForFidoThread, NULL, 0, NULL); +#endif } /* diff --git a/src/vhd.c b/src/vhd.c index 0af64614..00f0471f 100644 --- a/src/vhd.c +++ b/src/vhd.c @@ -567,7 +567,11 @@ static DWORD WINAPI WimMountImageThread(LPVOID param) out: wfree(temp_dir); safe_free(wimage); +#if _MSC_VER && !__INTEL_COMPILER + _endthreadex((DWORD)r); +#else ExitThread((DWORD)r); +#endif } // Returns the temporary mount path on success, NULL on error. @@ -578,7 +582,11 @@ char* WimMountImage(const char* image, int index) _image = image; _index = index; +#if _MSC_VER && !__INTEL_COMPILER + wim_thread = (HANDLE)_beginthreadex(NULL, 0, &WimMountImageThread, NULL, 0, NULL); +#else wim_thread = CreateThread(NULL, 0, WimMountImageThread, NULL, 0, NULL); +#endif if (wim_thread == NULL) { uprintf("Unable to start mount-image thread"); return NULL; @@ -630,7 +638,11 @@ static DWORD WINAPI WimUnmountImageThread(LPVOID param) wmount_path[0] = 0; out: safe_free(wimage); +#if _MSC_VER && !__INTEL_COMPILER + _endthreadex((DWORD)r); +#else ExitThread((DWORD)r); +#endif } BOOL WimUnmountImage(const char* image, int index) @@ -639,7 +651,11 @@ BOOL WimUnmountImage(const char* image, int index) _image = image; _index = index; +#if _MSC_VER && !__INTEL_COMPILER + wim_thread = (HANDLE)_beginthreadex(NULL, 0, &WimUnmountImageThread, NULL, 0, NULL); +#else wim_thread = CreateThread(NULL, 0, WimUnmountImageThread, NULL, 0, NULL); +#endif if (wim_thread == NULL) { uprintf("Unable to start unmount-image thread"); return FALSE; @@ -905,7 +921,11 @@ out: pfWIMUnregisterMessageCallback(NULL, (FARPROC)WimProgressCallback); safe_free(wimage); safe_free(wdst); +#if _MSC_VER && !__INTEL_COMPILER + _endthreadex((DWORD)r); +#else ExitThread((DWORD)r); +#endif } BOOL WimApplyImage(const char* image, int index, const char* dst) @@ -915,7 +935,11 @@ BOOL WimApplyImage(const char* image, int index, const char* dst) _index = index; _dst = dst; +#if _MSC_VER && !__INTEL_COMPILER + wim_thread = (HANDLE)_beginthreadex(NULL, 0, &WimApplyImageThread, NULL, 0, NULL); +#else wim_thread = CreateThread(NULL, 0, WimApplyImageThread, NULL, 0, NULL); +#endif if (wim_thread == NULL) { uprintf("Unable to start apply-image thread"); return FALSE;