diff --git a/.mingw/Makefile.am b/.mingw/Makefile.am index c5ad8d7c..32c0b48b 100644 --- a/.mingw/Makefile.am +++ b/.mingw/Makefile.am @@ -19,7 +19,7 @@ TARGET := $(word 1,$(subst -, ,$(TUPLE))) DEF_SUFFIX := $(if $(TARGET:x86_64=),.def,.def64) .PHONY: all -all: dwmapi-delaylib.lib wintrust-delaylib.lib +all: dwmapi-delaylib.lib virtdisk-delaylib.lib wintrust-delaylib.lib %.def64: %.def $(AM_V_SED) "s/@.*//" $< >$@ @@ -29,4 +29,3 @@ all: dwmapi-delaylib.lib wintrust-delaylib.lib clean: $(RM) -rf *.lib - \ No newline at end of file diff --git a/.mingw/Makefile.in b/.mingw/Makefile.in index 0af7e49c..fbdc2ce6 100644 --- a/.mingw/Makefile.in +++ b/.mingw/Makefile.in @@ -367,7 +367,7 @@ uninstall-am: .PHONY: all -all: dwmapi-delaylib.lib wintrust-delaylib.lib +all: dwmapi-delaylib.lib virtdisk-delaylib.lib wintrust-delaylib.lib %.def64: %.def $(AM_V_SED) "s/@.*//" $< >$@ diff --git a/.mingw/virtdisk.def b/.mingw/virtdisk.def new file mode 100644 index 00000000..5b727b9d --- /dev/null +++ b/.mingw/virtdisk.def @@ -0,0 +1,5 @@ +EXPORTS + AttachVirtualDisk@24 + GetVirtualDiskPhysicalPath@12 + DetachVirtualDisk@12 + OpenVirtualDisk@24 diff --git a/.vs/rufus.vcxproj b/.vs/rufus.vcxproj index d3af1c2e..effde61e 100644 --- a/.vs/rufus.vcxproj +++ b/.vs/rufus.vcxproj @@ -133,12 +133,12 @@ /utf-8 $(ExternalCompilerOptions) %(AdditionalOptions) - advapi32.lib;comctl32.lib;comdlg32.lib;crypt32.lib;gdi32.lib;ole32.lib;dwmapi.lib;setupapi.lib;shell32.lib;shlwapi.lib;wintrust.lib;%(AdditionalDependencies) + advapi32.lib;comctl32.lib;comdlg32.lib;crypt32.lib;gdi32.lib;ole32.lib;dwmapi.lib;setupapi.lib;shell32.lib;shlwapi.lib;wintrust.lib;virtdisk.lib;%(AdditionalDependencies) RequireAdministrator true Windows MachineX86 - advapi32.dll;comctl32.dll;comdlg32.dll;crypt32.dll;gdi32.dll;ole32.dll;dwmapi.dll;setupapi.dll;shell32.dll;shlwapi.dll;wintrust.dll;%(DelayLoadDLLs) + advapi32.dll;comctl32.dll;comdlg32.dll;crypt32.dll;gdi32.dll;ole32.dll;dwmapi.dll;setupapi.dll;shell32.dll;shlwapi.dll;wintrust.dll;virtdisk.dll;%(DelayLoadDLLs) _UNICODE;UNICODE;%(PreprocessorDefinitions) @@ -162,12 +162,12 @@ /utf-8 $(ExternalCompilerOptions) %(AdditionalOptions) - advapi32.lib;comctl32.lib;comdlg32.lib;crypt32.lib;gdi32.lib;ole32.lib;dwmapi.lib;setupapi.lib;shell32.lib;shlwapi.lib;wintrust.lib;ole32.lib;advapi32.lib;gdi32.lib;shell32.lib;comdlg32.lib;%(AdditionalDependencies) + advapi32.lib;comctl32.lib;comdlg32.lib;crypt32.lib;gdi32.lib;ole32.lib;dwmapi.lib;setupapi.lib;shell32.lib;shlwapi.lib;wintrust.lib;virtdisk.lib;ole32.lib;advapi32.lib;gdi32.lib;shell32.lib;comdlg32.lib;%(AdditionalDependencies) RequireAdministrator true Windows C:\Program Files (x86)\Windows Kits\10\Lib\10.0.15063.0\um\arm - advapi32.dll;comctl32.dll;comdlg32.dll;crypt32.dll;gdi32.dll;ole32.dll;dwmapi.dll;setupapi.dll;shell32.dll;shlwapi.dll;wintrust.dll;ole32.dll;advapi32.dll;gdi32.dll;shell32.dll;comdlg32.dll;%(DelayLoadDLLs) + advapi32.dll;comctl32.dll;comdlg32.dll;crypt32.dll;gdi32.dll;ole32.dll;dwmapi.dll;setupapi.dll;shell32.dll;shlwapi.dll;wintrust.dll;virtdisk.dll;ole32.dll;advapi32.dll;gdi32.dll;shell32.dll;comdlg32.dll;%(DelayLoadDLLs) _UNICODE;UNICODE;%(PreprocessorDefinitions) @@ -193,12 +193,12 @@ /utf-8 $(ExternalCompilerOptions) %(AdditionalOptions) - advapi32.lib;comctl32.lib;comdlg32.lib;crypt32.lib;gdi32.lib;ole32.lib;dwmapi.lib;setupapi.lib;shell32.lib;shlwapi.lib;wintrust.lib;ole32.lib;advapi32.lib;gdi32.lib;shell32.lib;comdlg32.lib;%(AdditionalDependencies) + advapi32.lib;comctl32.lib;comdlg32.lib;crypt32.lib;gdi32.lib;ole32.lib;dwmapi.lib;setupapi.lib;shell32.lib;shlwapi.lib;wintrust.lib;virtdisk.lib;ole32.lib;advapi32.lib;gdi32.lib;shell32.lib;comdlg32.lib;%(AdditionalDependencies) RequireAdministrator true Windows C:\Program Files (x86)\Windows Kits\10\Lib\10.0.16299.0\um\arm64 - advapi32.dll;comctl32.dll;comdlg32.dll;crypt32.dll;gdi32.dll;ole32.dll;dwmapi.dll;setupapi.dll;shell32.dll;shlwapi.dll;wintrust.dll;ole32.dll;advapi32.dll;gdi32.dll;shell32.dll;comdlg32.dll;%(DelayLoadDLLs) + advapi32.dll;comctl32.dll;comdlg32.dll;crypt32.dll;gdi32.dll;ole32.dll;dwmapi.dll;setupapi.dll;shell32.dll;shlwapi.dll;wintrust.dll;virtdisk.dll;ole32.dll;advapi32.dll;gdi32.dll;shell32.dll;comdlg32.dll;%(DelayLoadDLLs) _UNICODE;UNICODE;%(PreprocessorDefinitions) @@ -229,12 +229,12 @@ /utf-8 $(ExternalCompilerOptions) %(AdditionalOptions) - advapi32.lib;comctl32.lib;comdlg32.lib;crypt32.lib;gdi32.lib;ole32.lib;dwmapi.lib;setupapi.lib;shell32.lib;shlwapi.lib;wintrust.lib;%(AdditionalDependencies) + advapi32.lib;comctl32.lib;comdlg32.lib;crypt32.lib;gdi32.lib;ole32.lib;dwmapi.lib;setupapi.lib;shell32.lib;shlwapi.lib;wintrust.lib;virtdisk.lib;%(AdditionalDependencies) RequireAdministrator true Windows MachineX64 - advapi32.dll;comctl32.dll;comdlg32.dll;crypt32.dll;gdi32.dll;ole32.dll;dwmapi.dll;setupapi.dll;shell32.dll;shlwapi.dll;wintrust.dll;%(DelayLoadDLLs) + advapi32.dll;comctl32.dll;comdlg32.dll;crypt32.dll;gdi32.dll;ole32.dll;dwmapi.dll;setupapi.dll;shell32.dll;shlwapi.dll;wintrust.dll;virtdisk.dll;%(DelayLoadDLLs) _UNICODE;UNICODE;%(PreprocessorDefinitions) @@ -260,13 +260,13 @@ true - advapi32.lib;comctl32.lib;comdlg32.lib;crypt32.lib;gdi32.lib;ole32.lib;dwmapi.lib;setupapi.lib;shell32.lib;shlwapi.lib;wintrust.lib;%(AdditionalDependencies) + advapi32.lib;comctl32.lib;comdlg32.lib;crypt32.lib;gdi32.lib;ole32.lib;dwmapi.lib;setupapi.lib;shell32.lib;shlwapi.lib;wintrust.lib;virtdisk.lib;%(AdditionalDependencies) RequireAdministrator false Windows MachineX86 /BREPRO %(AdditionalOptions) - advapi32.dll;comctl32.dll;comdlg32.dll;crypt32.dll;gdi32.dll;ole32.dll;dwmapi.dll;setupapi.dll;shell32.dll;shlwapi.dll;wintrust.dll;%(DelayLoadDLLs) + advapi32.dll;comctl32.dll;comdlg32.dll;crypt32.dll;gdi32.dll;ole32.dll;dwmapi.dll;setupapi.dll;shell32.dll;shlwapi.dll;wintrust.dll;virtdisk.dll;%(DelayLoadDLLs) _UNICODE;UNICODE;%(PreprocessorDefinitions) @@ -292,13 +292,13 @@ true - advapi32.lib;comctl32.lib;comdlg32.lib;crypt32.lib;gdi32.lib;ole32.lib;dwmapi.lib;setupapi.lib;shell32.lib;shlwapi.lib;wintrust.lib;ole32.lib;advapi32.lib;gdi32.lib;shell32.lib;comdlg32.lib;%(AdditionalDependencies) + advapi32.lib;comctl32.lib;comdlg32.lib;crypt32.lib;gdi32.lib;ole32.lib;dwmapi.lib;setupapi.lib;shell32.lib;shlwapi.lib;wintrust.lib;virtdisk.lib;ole32.lib;advapi32.lib;gdi32.lib;shell32.lib;comdlg32.lib;%(AdditionalDependencies) RequireAdministrator false Windows C:\Program Files (x86)\Windows Kits\10\Lib\10.0.15063.0\um\arm /BREPRO %(AdditionalOptions) - advapi32.dll;comctl32.dll;comdlg32.dll;crypt32.dll;gdi32.dll;ole32.dll;dwmapi.dll;setupapi.dll;shell32.dll;shlwapi.dll;wintrust.dll;ole32.dll;advapi32.dll;gdi32.dll;shell32.dll;comdlg32.dll;%(DelayLoadDLLs) + advapi32.dll;comctl32.dll;comdlg32.dll;crypt32.dll;gdi32.dll;ole32.dll;dwmapi.dll;setupapi.dll;shell32.dll;shlwapi.dll;wintrust.dll;virtdisk.dll;ole32.dll;advapi32.dll;gdi32.dll;shell32.dll;comdlg32.dll;%(DelayLoadDLLs) _UNICODE;UNICODE;%(PreprocessorDefinitions) @@ -326,13 +326,13 @@ true - advapi32.lib;comctl32.lib;comdlg32.lib;crypt32.lib;gdi32.lib;ole32.lib;dwmapi.lib;setupapi.lib;shell32.lib;shlwapi.lib;wintrust.lib;ole32.lib;advapi32.lib;gdi32.lib;shell32.lib;comdlg32.lib;%(AdditionalDependencies) + advapi32.lib;comctl32.lib;comdlg32.lib;crypt32.lib;gdi32.lib;ole32.lib;dwmapi.lib;setupapi.lib;shell32.lib;shlwapi.lib;wintrust.lib;virtdisk.lib;ole32.lib;advapi32.lib;gdi32.lib;shell32.lib;comdlg32.lib;%(AdditionalDependencies) RequireAdministrator false Windows C:\Program Files (x86)\Windows Kits\10\Lib\10.0.16299.0\um\arm64 /BREPRO %(AdditionalOptions) - advapi32.dll;comctl32.dll;comdlg32.dll;crypt32.dll;gdi32.dll;ole32.dll;dwmapi.dll;setupapi.dll;shell32.dll;shlwapi.dll;wintrust.dll;ole32.dll;advapi32.dll;gdi32.dll;shell32.dll;comdlg32.dll;%(DelayLoadDLLs) + advapi32.dll;comctl32.dll;comdlg32.dll;crypt32.dll;gdi32.dll;ole32.dll;dwmapi.dll;setupapi.dll;shell32.dll;shlwapi.dll;wintrust.dll;virtdisk.dll;ole32.dll;advapi32.dll;gdi32.dll;shell32.dll;comdlg32.dll;%(DelayLoadDLLs) _UNICODE;UNICODE;%(PreprocessorDefinitions) @@ -363,13 +363,13 @@ true - advapi32.lib;comctl32.lib;comdlg32.lib;crypt32.lib;gdi32.lib;ole32.lib;dwmapi.lib;setupapi.lib;shell32.lib;shlwapi.lib;wintrust.lib;%(AdditionalDependencies) + advapi32.lib;comctl32.lib;comdlg32.lib;crypt32.lib;gdi32.lib;ole32.lib;dwmapi.lib;setupapi.lib;shell32.lib;shlwapi.lib;wintrust.lib;virtdisk.lib;%(AdditionalDependencies) RequireAdministrator false Windows MachineX64 /BREPRO %(AdditionalOptions) - advapi32.dll;comctl32.dll;comdlg32.dll;crypt32.dll;gdi32.dll;ole32.dll;dwmapi.dll;setupapi.dll;shell32.dll;shlwapi.dll;wintrust.dll;%(DelayLoadDLLs) + advapi32.dll;comctl32.dll;comdlg32.dll;crypt32.dll;gdi32.dll;ole32.dll;dwmapi.dll;setupapi.dll;shell32.dll;shlwapi.dll;wintrust.dll;virtdisk.dll;%(DelayLoadDLLs) _UNICODE;UNICODE;%(PreprocessorDefinitions) diff --git a/src/Makefile.am b/src/Makefile.am index 68f0c10e..b04205e3 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -2,7 +2,7 @@ SUBDIRS = ../.mingw bled ext2fs ms-sys syslinux/libfat syslinux/libinstaller sys # As far as I can tell, the following libraries are *not* vulnerable to side-loading, so we link using their regular version: NONVULNERABLE_LIBS = -lsetupapi -lole32 -lgdi32 -lshlwapi -lcrypt32 -lcomdlg32 -lcomctl32 -luuid # The following libraries are vulnerable (or have an unknown vulnerability status), so we link using our delay-loaded replacement: -VULNERABLE_LIBS = -ldwmapi-delaylib -lwintrust-delaylib +VULNERABLE_LIBS = -ldwmapi-delaylib -lvirtdisk-delaylib -lwintrust-delaylib noinst_PROGRAMS = rufus diff --git a/src/Makefile.in b/src/Makefile.in index 2465d1af..493c4dbe 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -276,7 +276,7 @@ SUBDIRS = ../.mingw bled ext2fs ms-sys syslinux/libfat syslinux/libinstaller sys # As far as I can tell, the following libraries are *not* vulnerable to side-loading, so we link using their regular version: NONVULNERABLE_LIBS = -lsetupapi -lole32 -lgdi32 -lshlwapi -lcrypt32 -lcomdlg32 -lcomctl32 -luuid # The following libraries are vulnerable (or have an unknown vulnerability status), so we link using our delay-loaded replacement: -VULNERABLE_LIBS = -ldwmapi-delaylib -lwintrust-delaylib +VULNERABLE_LIBS = -ldwmapi-delaylib -lvirtdisk-delaylib -lwintrust-delaylib AM_V_WINDRES_0 = @echo " RC $@";$(WINDRES) AM_V_WINDRES_1 = $(WINDRES) AM_V_WINDRES_ = $(AM_V_WINDRES_$(AM_DEFAULT_VERBOSITY)) diff --git a/src/iso.c b/src/iso.c index 3ff9b49e..b667555b 100644 --- a/src/iso.c +++ b/src/iso.c @@ -1698,14 +1698,6 @@ out: return ret; } -// VirtDisk API Prototypes - Only available for Windows 8 or later -PF_TYPE_DECL(WINAPI, DWORD, OpenVirtualDisk, (PVIRTUAL_STORAGE_TYPE, PCWSTR, - VIRTUAL_DISK_ACCESS_MASK, OPEN_VIRTUAL_DISK_FLAG, POPEN_VIRTUAL_DISK_PARAMETERS, PHANDLE)); -PF_TYPE_DECL(WINAPI, DWORD, AttachVirtualDisk, (HANDLE, PSECURITY_DESCRIPTOR, - ATTACH_VIRTUAL_DISK_FLAG, ULONG, PATTACH_VIRTUAL_DISK_PARAMETERS, LPOVERLAPPED)); -PF_TYPE_DECL(WINAPI, DWORD, DetachVirtualDisk, (HANDLE, DETACH_VIRTUAL_DISK_FLAG, ULONG)); -PF_TYPE_DECL(WINAPI, DWORD, GetVirtualDiskPhysicalPath, (HANDLE, PULONG, PWSTR)); - static char physical_path[128] = ""; static HANDLE mounted_handle = INVALID_HANDLE_VALUE; @@ -1719,14 +1711,10 @@ char* MountISO(const char* path) wconvert(path); char* ret = NULL; - PF_INIT_OR_OUT(OpenVirtualDisk, VirtDisk); - PF_INIT_OR_OUT(AttachVirtualDisk, VirtDisk); - PF_INIT_OR_OUT(GetVirtualDiskPhysicalPath, VirtDisk); - if ((mounted_handle != NULL) && (mounted_handle != INVALID_HANDLE_VALUE)) UnMountISO(); - r = pfOpenVirtualDisk(&vtype, wpath, VIRTUAL_DISK_ACCESS_READ | VIRTUAL_DISK_ACCESS_GET_INFO, + r = OpenVirtualDisk(&vtype, wpath, VIRTUAL_DISK_ACCESS_READ | VIRTUAL_DISK_ACCESS_GET_INFO, OPEN_VIRTUAL_DISK_FLAG_NONE, NULL, &mounted_handle); if (r != ERROR_SUCCESS) { SetLastError(r); @@ -1735,7 +1723,7 @@ char* MountISO(const char* path) } vparams.Version = ATTACH_VIRTUAL_DISK_VERSION_1; - r = pfAttachVirtualDisk(mounted_handle, NULL, ATTACH_VIRTUAL_DISK_FLAG_READ_ONLY | + r = AttachVirtualDisk(mounted_handle, NULL, ATTACH_VIRTUAL_DISK_FLAG_READ_ONLY | ATTACH_VIRTUAL_DISK_FLAG_NO_DRIVE_LETTER, 0, &vparams, NULL); if (r != ERROR_SUCCESS) { SetLastError(r); @@ -1743,7 +1731,7 @@ char* MountISO(const char* path) goto out; } - r = pfGetVirtualDiskPhysicalPath(mounted_handle, &size, wtmp); + r = GetVirtualDiskPhysicalPath(mounted_handle, &size, wtmp); if (r != ERROR_SUCCESS) { SetLastError(r); uprintf("Could not obtain physical path for mounted ISO '%s': %s", path, WindowsErrorString()); @@ -1761,12 +1749,10 @@ out: void UnMountISO(void) { - PF_INIT_OR_OUT(DetachVirtualDisk, VirtDisk); - if ((mounted_handle == NULL) || (mounted_handle == INVALID_HANDLE_VALUE)) goto out; - pfDetachVirtualDisk(mounted_handle, DETACH_VIRTUAL_DISK_FLAG_NONE, 0); + DetachVirtualDisk(mounted_handle, DETACH_VIRTUAL_DISK_FLAG_NONE, 0); safe_closehandle(mounted_handle); out: physical_path[0] = 0; diff --git a/src/rufus.c b/src/rufus.c index 3db818b5..336cd1c9 100755 --- a/src/rufus.c +++ b/src/rufus.c @@ -3337,7 +3337,6 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine char *tmp, *locale_name = NULL, **argv = NULL; wchar_t **wenv, **wargv; PF_TYPE_DECL(CDECL, int, __wgetmainargs, (int*, wchar_t***, wchar_t***, int, int*)); - PF_TYPE_DECL(WINAPI, BOOL, SetDefaultDllDirectories, (DWORD)); HANDLE mutex = NULL, hogmutex = NULL, hFile = NULL; HWND hDlg = NULL; HDC hDC; @@ -3366,14 +3365,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine // 'somelib.dll;%(DelayLoadDLLs)' must be added to the 'Delay Loaded Dlls' option of // the linker properties in Visual Studio (which means this won't work with MinGW). // For all other DLLs, use SetDefaultDllDirectories(LOAD_LIBRARY_SEARCH_SYSTEM32). - // Finally, we need to perform the whole gymkhana below, where we can't call on - // SetDefaultDllDirectories() directly, because Windows 7 doesn't have the API exposed. - // Also, no, Coverity, we never need to care about freeing kernel32 as a library. - // coverity[leaked_storage] - pfSetDefaultDllDirectories = (SetDefaultDllDirectories_t) - GetProcAddress(LoadLibraryW(L"kernel32.dll"), "SetDefaultDllDirectories"); - if (pfSetDefaultDllDirectories != NULL) - pfSetDefaultDllDirectories(LOAD_LIBRARY_SEARCH_SYSTEM32); + SetDefaultDllDirectories(LOAD_LIBRARY_SEARCH_SYSTEM32); uprintf("*** " APPLICATION_NAME " init ***\n"); its_a_me_mario = GetUserNameA((char*)(uintptr_t)&u, &size) && (u == 7104878); diff --git a/src/rufus.h b/src/rufus.h index 78f966ec..cc260b3d 100644 --- a/src/rufus.h +++ b/src/rufus.h @@ -540,6 +540,7 @@ typedef struct { DWORD Major; DWORD Minor; DWORD BuildNumber; + DWORD Ubr; DWORD Edition; USHORT Arch; char VersionStr[128]; @@ -774,11 +775,6 @@ static __inline HMODULE GetLibraryHandle(char* szLibraryName) { goto out; } h = LoadLibraryExW(wszLibraryName, NULL, LOAD_LIBRARY_SEARCH_SYSTEM32); - // Some Windows 7 platforms (most likely the ones missing KB2533623 per the - // official LoadLibraryEx doc) can return ERROR_INVALID_PARAMETER when using - // the Ex() version. If that's the case, fallback to using LoadLibraryW(). - if ((h == NULL) && (SCODE_CODE(GetLastError()) == ERROR_INVALID_PARAMETER)) - h = LoadLibraryW(wszLibraryName); if (h != NULL) OpenedLibrariesHandle[OpenedLibrariesHandleSize++] = h; else diff --git a/src/rufus.rc b/src/rufus.rc index bb0d4f57..a424cd0f 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 4.0.2036" +CAPTION "Rufus 4.0.2037" 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 4,0,2036,0 - PRODUCTVERSION 4,0,2036,0 + FILEVERSION 4,0,2037,0 + PRODUCTVERSION 4,0,2037,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", "4.0.2036" + VALUE "FileVersion", "4.0.2037" 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-4.0.exe" VALUE "ProductName", "Rufus" - VALUE "ProductVersion", "4.0.2036" + VALUE "ProductVersion", "4.0.2037" END END BLOCK "VarFileInfo" diff --git a/src/stdfn.c b/src/stdfn.c index 5e38ee2b..04727917 100644 --- a/src/stdfn.c +++ b/src/stdfn.c @@ -441,17 +441,15 @@ void GetWindowsVersion(windows_version_t* windows_version) windows_version->Edition = (int)dwProductType; - // Add the build number (including UBR if available) for Windows 8.0 and later + // Add the build number (including UBR if available) windows_version->BuildNumber = vi.dwBuildNumber; - if (windows_version->Version >= WINDOWS_8) { - int nUbr = ReadRegistryKey32(REGKEY_HKLM, "Software\\Microsoft\\Windows NT\\CurrentVersion\\UBR"); - vptr = &windows_version->VersionStr[safe_strlen(windows_version->VersionStr)]; - vlen = sizeof(windows_version->VersionStr) - safe_strlen(windows_version->VersionStr) - 1; - if (nUbr > 0) - safe_sprintf(vptr, vlen, " (Build %lu.%d)", windows_version->BuildNumber, nUbr); - else - safe_sprintf(vptr, vlen, " (Build %lu)", windows_version->BuildNumber); - } + windows_version->Ubr = ReadRegistryKey32(REGKEY_HKLM, "Software\\Microsoft\\Windows NT\\CurrentVersion\\UBR"); + vptr = &windows_version->VersionStr[safe_strlen(windows_version->VersionStr)]; + vlen = sizeof(windows_version->VersionStr) - safe_strlen(windows_version->VersionStr) - 1; + if (windows_version->Ubr != 0) + safe_sprintf(vptr, vlen, " (Build %lu.%lu)", windows_version->BuildNumber, windows_version->Ubr); + else + safe_sprintf(vptr, vlen, " (Build %lu)", windows_version->BuildNumber); } /* diff --git a/src/stdlg.c b/src/stdlg.c index 443cdacb..1bb4e090 100644 --- a/src/stdlg.c +++ b/src/stdlg.c @@ -52,8 +52,7 @@ static char* szMessageText = NULL; static char* szMessageTitle = NULL; static char **szDialogItem; static int nDialogItems; -static HWND hBrowseEdit, hUpdatesDlg; -static WNDPROC pOrgBrowseWndproc; +static HWND hUpdatesDlg; static const SETTEXTEX friggin_microsoft_unicode_amateurs = { ST_DEFAULT, CP_UTF8 }; static BOOL notification_is_question; static const notification_info* notification_more_info; @@ -84,160 +83,6 @@ void SetDialogFocus(HWND hDlg, HWND hCtrl) SendMessage(hDlg, WM_NEXTDLGCTL, (WPARAM)hCtrl, TRUE); } -/* - * We need a sub-callback to read the content of the edit box on exit and update - * our path, else if what the user typed does match the selection, it is discarded. - * Talk about a convoluted way of producing an intuitive folder selection dialog - */ -INT CALLBACK BrowseDlgCallback(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) -{ - switch(message) { - case WM_DESTROY: - GetWindowTextU(hBrowseEdit, szFolderPath, sizeof(szFolderPath)); - break; - } - return (INT)CallWindowProc(pOrgBrowseWndproc, hDlg, message, wParam, lParam); -} - -/* - * Main BrowseInfo callback to set the initial directory and populate the edit control - */ -INT CALLBACK BrowseInfoCallback(HWND hDlg, UINT message, LPARAM lParam, LPARAM pData) -{ - char dir[MAX_PATH]; - wchar_t* wpath; - LPITEMIDLIST pidl; - - switch(message) { - case BFFM_INITIALIZED: - pOrgBrowseWndproc = (WNDPROC)SetWindowLongPtr(hDlg, GWLP_WNDPROC, (LONG_PTR)BrowseDlgCallback); - // Windows hides the full path in the edit box by default, which is bull. - // Get a handle to the edit control to fix that - hBrowseEdit = FindWindowExA(hDlg, NULL, "Edit", NULL); - SetWindowTextU(hBrowseEdit, szFolderPath); - SetDialogFocus(hDlg, hBrowseEdit); - // On Windows 7, MinGW only properly selects the specified folder when using a pidl - wpath = utf8_to_wchar(szFolderPath); - pidl = SHSimpleIDListFromPath(wpath); - safe_free(wpath); - // NB: see http://connect.microsoft.com/VisualStudio/feedback/details/518103/bffm-setselection-does-not-work-with-shbrowseforfolder-on-windows-7 - // for details as to why we send BFFM_SETSELECTION twice. - SendMessageW(hDlg, BFFM_SETSELECTION, (WPARAM)FALSE, (LPARAM)pidl); - Sleep(100); - PostMessageW(hDlg, BFFM_SETSELECTION, (WPARAM)FALSE, (LPARAM)pidl); - break; - case BFFM_SELCHANGED: - // Update the status - if (SHGetPathFromIDListU((LPITEMIDLIST)lParam, dir)) { - SendMessageLU(hDlg, BFFM_SETSTATUSTEXT, 0, dir); - SetWindowTextU(hBrowseEdit, dir); - } - break; - } - return 0; -} - -/* - * Browse for a folder and update the folder edit box - */ -void BrowseForFolder(void) { - - BROWSEINFOW bi; - LPITEMIDLIST pidl; - WCHAR *wpath; - size_t i; - HRESULT hr; - IShellItem *psi = NULL; - IShellItem *si_path = NULL; // Automatically freed - IFileOpenDialog *pfod = NULL; - WCHAR *fname; - char* tmp_path = NULL; - - dialog_showing++; - hr = CoCreateInstance(&CLSID_FileOpenDialog, NULL, CLSCTX_INPROC, - &IID_IFileOpenDialog, (LPVOID)&pfod); - if (FAILED(hr) || pfod == NULL) { - uprintf("CoCreateInstance for FileOpenDialog failed: error %X\n", hr); - if (pfod != NULL) { - IFileOpenDialog_Release(pfod); - pfod = NULL; // Just in case - } - goto fallback; - } - hr = IFileOpenDialog_SetOptions(pfod, FOS_PICKFOLDERS); - if (FAILED(hr)) { - uprintf("Failed to set folder option for FileOpenDialog: error %X\n", hr); - goto fallback; - } - // Set the initial folder (if the path is invalid, will simply use last) - wpath = utf8_to_wchar(szFolderPath); - // The new IFileOpenDialog makes us split the path - fname = NULL; - if ((wpath != NULL) && (wcslen(wpath) >= 1)) { - for (i = wcslen(wpath) - 1; i != 0; i--) { - if (wpath[i] == L'\\') { - wpath[i] = 0; - fname = &wpath[i + 1]; - break; - } - } - } - - hr = SHCreateItemFromParsingName(wpath, NULL, &IID_IShellItem, (LPVOID)&si_path); - if (SUCCEEDED(hr) && pfod != NULL) { - if (wpath != NULL) { - IFileOpenDialog_SetFolder(pfod, si_path); - } - if (fname != NULL) { - IFileOpenDialog_SetFileName(pfod, fname); - } - } - safe_free(wpath); - - hr = IFileOpenDialog_Show(pfod, hMainDialog); - if (SUCCEEDED(hr) && pfod != NULL) { - hr = IFileOpenDialog_GetResult(pfod, &psi); - if (SUCCEEDED(hr)) { - IShellItem_GetDisplayName(psi, SIGDN_FILESYSPATH, &wpath); - tmp_path = wchar_to_utf8(wpath); - CoTaskMemFree(wpath); - if (tmp_path == NULL) { - uprintf("Could not convert path\n"); - } else { - static_strcpy(szFolderPath, tmp_path); - safe_free(tmp_path); - } - } else { - uprintf("Failed to set folder option for FileOpenDialog: error %X\n", hr); - } - } else if ((hr & 0xFFFF) != ERROR_CANCELLED) { - // If it's not a user cancel, assume the dialog didn't show and fallback - uprintf("Could not show FileOpenDialog: error %X\n", hr); - goto fallback; - } - IFileOpenDialog_Release(pfod); - dialog_showing--; - return; -fallback: - if (pfod != NULL) { - IFileOpenDialog_Release(pfod); - } - - memset(&bi, 0, sizeof(BROWSEINFOW)); - bi.hwndOwner = hMainDialog; - bi.lpszTitle = utf8_to_wchar(lmprintf(MSG_106)); - bi.lpfn = BrowseInfoCallback; - // BIF_NONEWFOLDERBUTTON = 0x00000200 is unknown on MinGW - bi.ulFlags = BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS | - BIF_DONTGOBELOWDOMAIN | BIF_EDITBOX | 0x00000200; - pidl = SHBrowseForFolderW(&bi); - if (pidl != NULL) { - CoTaskMemFree(pidl); - } - safe_free(bi.lpszTitle); - dialog_showing--; -} - /* * Return the UTF8 path of a file selected through a load or save dialog * All string parameters are UTF-8 @@ -1626,7 +1471,6 @@ void SetFidoCheck(void) // - Powershell being installed // - Rufus running in AppStore mode or update check being enabled // - URL for the script being reachable - // - Windows version being Windows 8.0 or later if ((ReadRegistryKey32(REGKEY_HKLM, "Software\\Microsoft\\PowerShell\\1\\Install") <= 0) && (ReadRegistryKey32(REGKEY_HKLM, "Software\\Microsoft\\PowerShell\\3\\Install") <= 0)) { ubprintf("Notice: The ISO download feature has been deactivated because " @@ -1640,12 +1484,6 @@ void SetFidoCheck(void) return; } - if (WindowsVersion.Version < WINDOWS_8) { - ubprintf("Notice: The ISO download feature has been deactivated because " - "your version of Windows is too old."); - return; - } - CreateThread(NULL, 0, CheckForFidoThread, NULL, 0, NULL); } diff --git a/src/ui.c b/src/ui.c index 103adf13..09d158ce 100644 --- a/src/ui.c +++ b/src/ui.c @@ -1053,7 +1053,7 @@ void CreateAdditionalControls(HWND hDlg) hDll = GetLibraryHandle("ComDlg32"); hIconDown = (HICON)LoadImage(hDll, MAKEINTRESOURCE(577), IMAGE_ICON, s16, s16, LR_DEFAULTCOLOR | LR_SHARED); hIconUp = (HICON)LoadImage(hDll, MAKEINTRESOURCE(578), IMAGE_ICON, s16, s16, LR_DEFAULTCOLOR | LR_SHARED); - // Fallback to using Shell32 if we can't locate the icons we want in ComDlg32 + // Fallback to using Shell32 if we can't locate the icons we want in ComDlg32 (Windows 8) hDll = GetLibraryHandle("Shell32"); if (hIconUp == NULL) hIconUp = (HICON)LoadImage(hDll, MAKEINTRESOURCE(16749), IMAGE_ICON, s16, s16, LR_DEFAULTCOLOR | LR_SHARED); @@ -1082,9 +1082,6 @@ void CreateAdditionalControls(HWND hDlg) GetWindowRect(GetDlgItem(hDlg, IDC_ADVANCED_DRIVE_PROPERTIES), &rc); MapWindowPoints(NULL, hDlg, (POINT*)&rc, 2); SendMessage(hAdvancedDeviceToolbar, TB_GETIDEALSIZE, (WPARAM)FALSE, (LPARAM)&sz); - // Yeah, so, like, TB_GETIDEALSIZE totally super doesn't work on Windows 7, for low zoom factor and when compiled with MSVC... - if (sz.cx < 16) - sz.cx = fw; SetWindowPos(hAdvancedDeviceToolbar, hTargetSystem, rc.left + toolbar_dx, rc.top, sz.cx, rc.bottom - rc.top, 0); SetAccessibleName(hAdvancedDeviceToolbar, lmprintf(MSG_119)); @@ -1104,8 +1101,6 @@ void CreateAdditionalControls(HWND hDlg) GetWindowRect(GetDlgItem(hDlg, IDC_ADVANCED_FORMAT_OPTIONS), &rc); MapWindowPoints(NULL, hDlg, (POINT*)&rc, 2); SendMessage(hAdvancedFormatToolbar, TB_GETIDEALSIZE, (WPARAM)FALSE, (LPARAM)&sz); - if (sz.cx < 16) - sz.cx = fw; SetWindowPos(hAdvancedFormatToolbar, hClusterSize, rc.left + toolbar_dx, rc.top, sz.cx, rc.bottom - rc.top, 0); SetAccessibleName(hAdvancedFormatToolbar, lmprintf(MSG_120));