From af8f68c3052a783e37a82fdfbeaf5d1c5f3c8ceb Mon Sep 17 00:00:00 2001 From: Pete Batard Date: Sat, 1 Apr 2023 15:50:59 +0200 Subject: [PATCH] [msvc] enable Structured Exception Handling (SEH) in process.c * We are seeing reports of access violation exceptions being generated when looking for processes, with the App Store version. * Since this is not critical code, add an SEH handler to ignore those. --- .vs/rufus.vcxproj | 16 ++++++++-------- src/process.c | 11 +++++++++-- src/rufus.h | 8 ++++++++ src/rufus.rc | 10 +++++----- 4 files changed, 30 insertions(+), 15 deletions(-) diff --git a/.vs/rufus.vcxproj b/.vs/rufus.vcxproj index 3c17fc45..d3af1c2e 100644 --- a/.vs/rufus.vcxproj +++ b/.vs/rufus.vcxproj @@ -127,7 +127,7 @@ ..\src;..\src\msvc-missing;..\src\ms-sys\inc;..\src\syslinux\libinstaller;..\src\syslinux\libfat;..\src\syslinux\win;..\src\libcdio;..\src\getopt;%(AdditionalIncludeDirectories) CompileAsC true - false + Async 4091;5255;28251;28252;28253;%(DisableSpecificWarnings) Disabled /utf-8 $(ExternalCompilerOptions) %(AdditionalOptions) @@ -157,7 +157,7 @@ ..\src;..\src\msvc-missing;..\src\ms-sys\inc;..\src\syslinux\libinstaller;..\src\syslinux\libfat;..\src\syslinux\win;..\src\libcdio;..\src\getopt;%(AdditionalIncludeDirectories) CompileAsC true - false + Async 4091;5255;28251;28252;28253;%(DisableSpecificWarnings) /utf-8 $(ExternalCompilerOptions) %(AdditionalOptions) @@ -188,7 +188,7 @@ ..\src;..\src\msvc-missing;..\src\ms-sys\inc;..\src\syslinux\libinstaller;..\src\syslinux\libfat;..\src\syslinux\win;..\src\libcdio;..\src\getopt;%(AdditionalIncludeDirectories) CompileAsC true - false + Async 4091;5255;28251;28252;28253;%(DisableSpecificWarnings) /utf-8 $(ExternalCompilerOptions) %(AdditionalOptions) @@ -223,7 +223,7 @@ ProgramDatabase CompileAsC true - false + Async 4091;5255;28251;28252;28253;%(DisableSpecificWarnings) Disabled /utf-8 $(ExternalCompilerOptions) %(AdditionalOptions) @@ -253,7 +253,7 @@ ..\src;..\src\msvc-missing;..\src\ms-sys\inc;..\src\syslinux\libinstaller;..\src\syslinux\libfat;..\src\syslinux\win;..\src\libcdio;..\src\getopt;%(AdditionalIncludeDirectories) CompileAsC true - false + Async 4091;5255;28251;28252;28253;%(DisableSpecificWarnings) NDEBUG /utf-8 $(ExternalCompilerOptions) %(AdditionalOptions) @@ -285,7 +285,7 @@ ..\src;..\src\msvc-missing;..\src\ms-sys\inc;..\src\syslinux\libinstaller;..\src\syslinux\libfat;..\src\syslinux\win;..\src\libcdio;..\src\getopt;%(AdditionalIncludeDirectories) CompileAsC true - false + Async 4091;5255;28251;28252;28253;%(DisableSpecificWarnings) NDEBUG /utf-8 $(ExternalCompilerOptions) %(AdditionalOptions) @@ -319,7 +319,7 @@ ..\src;..\src\msvc-missing;..\src\ms-sys\inc;..\src\syslinux\libinstaller;..\src\syslinux\libfat;..\src\syslinux\win;..\src\libcdio;..\src\getopt;%(AdditionalIncludeDirectories) CompileAsC true - false + Async 4091;5255;28251;28252;28253;%(DisableSpecificWarnings) NDEBUG /utf-8 $(ExternalCompilerOptions) %(AdditionalOptions) @@ -356,7 +356,7 @@ ..\src;..\src\msvc-missing;..\src\ms-sys\inc;..\src\syslinux\libinstaller;..\src\syslinux\libfat;..\src\syslinux\win;..\src\libcdio;..\src\getopt;%(AdditionalIncludeDirectories) CompileAsC true - false + Async 4091;5255;28251;28252;28253;%(DisableSpecificWarnings) NDEBUG /utf-8 $(ExternalCompilerOptions) %(AdditionalOptions) diff --git a/src/process.c b/src/process.c index c58be973..c6845197 100644 --- a/src/process.c +++ b/src/process.c @@ -4,7 +4,7 @@ * * Modified from Process Hacker: * https://github.com/processhacker2/processhacker2/ - * Copyright © 2017-2021 Pete Batard + * Copyright © 2017-2023 Pete Batard * Copyright © 2017 dmex * Copyright © 2009-2016 wj32 * @@ -478,7 +478,14 @@ static DWORD WINAPI SearchProcessThread(LPVOID param) // Update the current handle's process PID and compare against last // Note: Be careful about not trying to overflow our list! - pid[cur_pid] = (handleInfo != NULL) ? handleInfo->UniqueProcessId : -1; + // Also, we are seeing reports of application crashes due to access + // violation exceptions here, so, since this is not critical code, + // we add an exception handler to ignore them. + TRY_AND_HANDLE( + EXCEPTION_ACCESS_VIOLATION, + { pid[cur_pid] = (handleInfo != NULL) ? handleInfo->UniqueProcessId : -1; }, + { continue; } + ); if (pid[0] != pid[1]) { cur_pid = (cur_pid + 1) % 2; diff --git a/src/rufus.h b/src/rufus.h index 3c0ea76b..f773a555 100644 --- a/src/rufus.h +++ b/src/rufus.h @@ -760,6 +760,14 @@ out: #proc, #name, WindowsErrorString()); goto out;} } while(0) #define PF_INIT_OR_SET_STATUS(proc, name) do {PF_INIT(proc, name); \ if ((pf##proc == NULL) && (NT_SUCCESS(status))) status = STATUS_NOT_IMPLEMENTED; } while(0) +#if defined(_MSC_VER) +#define TRY_AND_HANDLE(exception, TRY_CODE, EXCEPTION_CODE) __try TRY_CODE \ + __except (GetExceptionCode() == exception ? EXCEPTION_EXECUTE_HANDLER : \ + EXCEPTION_CONTINUE_SEARCH) EXCEPTION_CODE +#else +// NB: Eventually we may try __try1 and __except1 from MinGW... +#define TRY_AND_HANDLE(exception, TRY_CODE, EXCEPTION_CODE) TRY_CODE +#endif /* Custom application errors */ #define FAC(f) ((f)<<16) diff --git a/src/rufus.rc b/src/rufus.rc index 007fbc38..e78b9ebd 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.23.2013" +CAPTION "Rufus 3.23.2014" FONT 9, "Segoe UI Symbol", 400, 0, 0x0 BEGIN LTEXT "Drive Properties",IDS_DRIVE_PROPERTIES_TXT,8,6,53,12,NOT WS_GROUP @@ -392,8 +392,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 3,23,2013,0 - PRODUCTVERSION 3,23,2013,0 + FILEVERSION 3,23,2014,0 + PRODUCTVERSION 3,23,2014,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -411,13 +411,13 @@ BEGIN VALUE "Comments", "https://rufus.ie" VALUE "CompanyName", "Akeo Consulting" VALUE "FileDescription", "Rufus" - VALUE "FileVersion", "3.23.2013" + VALUE "FileVersion", "3.23.2014" VALUE "InternalName", "Rufus" VALUE "LegalCopyright", "© 2011-2023 Pete Batard (GPL v3)" VALUE "LegalTrademarks", "https://www.gnu.org/licenses/gpl-3.0.html" VALUE "OriginalFilename", "rufus-3.23.exe" VALUE "ProductName", "Rufus" - VALUE "ProductVersion", "3.23.2013" + VALUE "ProductVersion", "3.23.2014" END END BLOCK "VarFileInfo"