mirror of
https://github.com/pbatard/rufus.git
synced 2024-08-14 23:57:05 +00:00
[misc] update ChangeLog for 4.3 BETA
* Also minor code cleanups and improvements.
This commit is contained in:
parent
1630e912d4
commit
8edb487ac9
7 changed files with 38 additions and 25 deletions
|
@ -1,3 +1,13 @@
|
||||||
|
o Version 4.3 (2023.10.??)
|
||||||
|
Add support for Rock Ridge symlink preservation when NTFS is used
|
||||||
|
Add an exception to enforce NTFS for Linux Mint's LMDE
|
||||||
|
Add an expert feature to restrict a Windows installation to S Mode
|
||||||
|
Fix persistence support for Debian 12 when booted in BIOS mode
|
||||||
|
Fix a regression that prevented the opening of .vhd images
|
||||||
|
Update UEFI:NTFS to report a more explicit error on bootmgr security issues
|
||||||
|
Improve the search for conflicting processes by running it in a background thread
|
||||||
|
Improve support for Slax Linux
|
||||||
|
|
||||||
o Version 4.2 (2023.07.26)
|
o Version 4.2 (2023.07.26)
|
||||||
Add detection and warning for UEFI revoked bootloaders (including ones revoked through SkuSiPolicy.p7b)
|
Add detection and warning for UEFI revoked bootloaders (including ones revoked through SkuSiPolicy.p7b)
|
||||||
Add ZIP64 support, to extract .zip images that are larger than 4 GB
|
Add ZIP64 support, to extract .zip images that are larger than 4 GB
|
||||||
|
|
|
@ -975,6 +975,10 @@ retry:
|
||||||
* be convenient for our usage (since we might be looking for processes preventing
|
* be convenient for our usage (since we might be looking for processes preventing
|
||||||
* us to open said target in exclusive mode).
|
* us to open said target in exclusive mode).
|
||||||
*
|
*
|
||||||
|
* At least on Windows 11, this no longer seems to work as querying a logical or
|
||||||
|
* physical volume seems to return almost ALL the processes that are running,
|
||||||
|
* including the ones that are not actually accessing the handle.
|
||||||
|
*
|
||||||
* \param HandleName The name of the handle to look for.
|
* \param HandleName The name of the handle to look for.
|
||||||
*
|
*
|
||||||
* \return TRUE if processes were found, FALSE otherwise.
|
* \return TRUE if processes were found, FALSE otherwise.
|
||||||
|
@ -992,7 +996,7 @@ BOOL SearchProcessAlt(char* HandleName)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
// Note that the access rights being used with CreateFile() might matter...
|
// Note that the access rights being used with CreateFile() might matter...
|
||||||
searchHandle = CreateFileA(HandleName, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
|
searchHandle = CreateFileA(HandleName, FILE_READ_ATTRIBUTES | SYNCHRONIZE, FILE_SHARE_READ,
|
||||||
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||||
|
|
||||||
status = PhQueryProcessesUsingVolumeOrFile(searchHandle, &info);
|
status = PhQueryProcessesUsingVolumeOrFile(searchHandle, &info);
|
||||||
|
|
|
@ -45,6 +45,7 @@
|
||||||
#define STATUS_OBJECT_NAME_NOT_FOUND ((NTSTATUS)0xC0000034L)
|
#define STATUS_OBJECT_NAME_NOT_FOUND ((NTSTATUS)0xC0000034L)
|
||||||
#define STATUS_OBJECT_PATH_INVALID ((NTSTATUS)0xC0000039L)
|
#define STATUS_OBJECT_PATH_INVALID ((NTSTATUS)0xC0000039L)
|
||||||
#define STATUS_SHARING_VIOLATION ((NTSTATUS)0xC0000043L)
|
#define STATUS_SHARING_VIOLATION ((NTSTATUS)0xC0000043L)
|
||||||
|
#define STATUS_PROCEDURE_NOT_FOUND ((NTSTATUS)0xC000007AL)
|
||||||
#define STATUS_INSUFFICIENT_RESOURCES ((NTSTATUS)0xC000009AL)
|
#define STATUS_INSUFFICIENT_RESOURCES ((NTSTATUS)0xC000009AL)
|
||||||
#define STATUS_NOT_SUPPORTED ((NTSTATUS)0xC00000BBL)
|
#define STATUS_NOT_SUPPORTED ((NTSTATUS)0xC00000BBL)
|
||||||
|
|
||||||
|
|
|
@ -827,7 +827,7 @@ out:
|
||||||
if (pf##proc == NULL) {uprintf("Unable to locate %s() in '%s.dll': %s", \
|
if (pf##proc == NULL) {uprintf("Unable to locate %s() in '%s.dll': %s", \
|
||||||
#proc, #name, WindowsErrorString()); goto out;} } while(0)
|
#proc, #name, WindowsErrorString()); goto out;} } while(0)
|
||||||
#define PF_INIT_OR_SET_STATUS(proc, name) do {PF_INIT(proc, name); \
|
#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 ((pf##proc == NULL) && (NT_SUCCESS(status))) status = STATUS_PROCEDURE_NOT_FOUND; } while(0)
|
||||||
#if defined(_MSC_VER)
|
#if defined(_MSC_VER)
|
||||||
#define TRY_AND_HANDLE(exception, TRY_CODE, EXCEPTION_CODE) __try TRY_CODE \
|
#define TRY_AND_HANDLE(exception, TRY_CODE, EXCEPTION_CODE) __try TRY_CODE \
|
||||||
__except (GetExceptionCode() == exception ? EXCEPTION_EXECUTE_HANDLER : \
|
__except (GetExceptionCode() == exception ? EXCEPTION_EXECUTE_HANDLER : \
|
||||||
|
|
10
src/rufus.rc
10
src/rufus.rc
|
@ -33,7 +33,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
|
||||||
IDD_DIALOG DIALOGEX 12, 12, 232, 326
|
IDD_DIALOG DIALOGEX 12, 12, 232, 326
|
||||||
STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||||
EXSTYLE WS_EX_ACCEPTFILES
|
EXSTYLE WS_EX_ACCEPTFILES
|
||||||
CAPTION "Rufus 4.3.2088"
|
CAPTION "Rufus 4.3.2089"
|
||||||
FONT 9, "Segoe UI Symbol", 400, 0, 0x0
|
FONT 9, "Segoe UI Symbol", 400, 0, 0x0
|
||||||
BEGIN
|
BEGIN
|
||||||
LTEXT "Drive Properties",IDS_DRIVE_PROPERTIES_TXT,8,6,53,12,NOT WS_GROUP
|
LTEXT "Drive Properties",IDS_DRIVE_PROPERTIES_TXT,8,6,53,12,NOT WS_GROUP
|
||||||
|
@ -392,8 +392,8 @@ END
|
||||||
//
|
//
|
||||||
|
|
||||||
VS_VERSION_INFO VERSIONINFO
|
VS_VERSION_INFO VERSIONINFO
|
||||||
FILEVERSION 4,3,2088,0
|
FILEVERSION 4,3,2089,0
|
||||||
PRODUCTVERSION 4,3,2088,0
|
PRODUCTVERSION 4,3,2089,0
|
||||||
FILEFLAGSMASK 0x3fL
|
FILEFLAGSMASK 0x3fL
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
FILEFLAGS 0x1L
|
FILEFLAGS 0x1L
|
||||||
|
@ -411,13 +411,13 @@ BEGIN
|
||||||
VALUE "Comments", "https://rufus.ie"
|
VALUE "Comments", "https://rufus.ie"
|
||||||
VALUE "CompanyName", "Akeo Consulting"
|
VALUE "CompanyName", "Akeo Consulting"
|
||||||
VALUE "FileDescription", "Rufus"
|
VALUE "FileDescription", "Rufus"
|
||||||
VALUE "FileVersion", "4.3.2088"
|
VALUE "FileVersion", "4.3.2089"
|
||||||
VALUE "InternalName", "Rufus"
|
VALUE "InternalName", "Rufus"
|
||||||
VALUE "LegalCopyright", "© 2011-2023 Pete Batard (GPL v3)"
|
VALUE "LegalCopyright", "© 2011-2023 Pete Batard (GPL v3)"
|
||||||
VALUE "LegalTrademarks", "https://www.gnu.org/licenses/gpl-3.0.html"
|
VALUE "LegalTrademarks", "https://www.gnu.org/licenses/gpl-3.0.html"
|
||||||
VALUE "OriginalFilename", "rufus-4.3.exe"
|
VALUE "OriginalFilename", "rufus-4.3.exe"
|
||||||
VALUE "ProductName", "Rufus"
|
VALUE "ProductName", "Rufus"
|
||||||
VALUE "ProductVersion", "4.3.2088"
|
VALUE "ProductVersion", "4.3.2089"
|
||||||
END
|
END
|
||||||
END
|
END
|
||||||
BLOCK "VarFileInfo"
|
BLOCK "VarFileInfo"
|
||||||
|
|
30
src/stdfn.c
30
src/stdfn.c
|
@ -534,7 +534,7 @@ void StrArrayCreate(StrArray* arr, uint32_t initial_size)
|
||||||
arr->Max = initial_size; arr->Index = 0;
|
arr->Max = initial_size; arr->Index = 0;
|
||||||
arr->String = (char**)calloc(arr->Max, sizeof(char*));
|
arr->String = (char**)calloc(arr->Max, sizeof(char*));
|
||||||
if (arr->String == NULL)
|
if (arr->String == NULL)
|
||||||
uprintf("Could not allocate string array\n");
|
uprintf("Could not allocate string array");
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t StrArrayAdd(StrArray* arr, const char* str, BOOL duplicate)
|
int32_t StrArrayAdd(StrArray* arr, const char* str, BOOL duplicate)
|
||||||
|
@ -548,13 +548,13 @@ int32_t StrArrayAdd(StrArray* arr, const char* str, BOOL duplicate)
|
||||||
arr->String = (char**)realloc(arr->String, arr->Max*sizeof(char*));
|
arr->String = (char**)realloc(arr->String, arr->Max*sizeof(char*));
|
||||||
if (arr->String == NULL) {
|
if (arr->String == NULL) {
|
||||||
free(old_table);
|
free(old_table);
|
||||||
uprintf("Could not reallocate string array\n");
|
uprintf("Could not reallocate string array");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
arr->String[arr->Index] = (duplicate)?safe_strdup(str):(char*)str;
|
arr->String[arr->Index] = (duplicate)?safe_strdup(str):(char*)str;
|
||||||
if (arr->String[arr->Index] == NULL) {
|
if (arr->String[arr->Index] == NULL) {
|
||||||
uprintf("Could not store string in array\n");
|
uprintf("Could not store string in array");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return arr->Index++;
|
return arr->Index++;
|
||||||
|
@ -577,7 +577,7 @@ void StrArrayClear(StrArray* arr)
|
||||||
uint32_t i;
|
uint32_t i;
|
||||||
if ((arr == NULL) || (arr->String == NULL))
|
if ((arr == NULL) || (arr->String == NULL))
|
||||||
return;
|
return;
|
||||||
for (i=0; i<arr->Index; i++) {
|
for (i = 0; i < arr->Index; i++) {
|
||||||
safe_free(arr->String[i]);
|
safe_free(arr->String[i]);
|
||||||
}
|
}
|
||||||
arr->Index = 0;
|
arr->Index = 0;
|
||||||
|
@ -601,13 +601,13 @@ static PSID GetSID(void) {
|
||||||
char* psid_string = NULL;
|
char* psid_string = NULL;
|
||||||
|
|
||||||
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &token)) {
|
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &token)) {
|
||||||
uprintf("OpenProcessToken failed: %s\n", WindowsErrorString());
|
uprintf("OpenProcessToken failed: %s", WindowsErrorString());
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!GetTokenInformation(token, TokenUser, tu, 0, &len)) {
|
if (!GetTokenInformation(token, TokenUser, tu, 0, &len)) {
|
||||||
if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) {
|
if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) {
|
||||||
uprintf("GetTokenInformation (pre) failed: %s\n", WindowsErrorString());
|
uprintf("GetTokenInformation (pre) failed: %s", WindowsErrorString());
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
tu = (TOKEN_USER*)calloc(1, len);
|
tu = (TOKEN_USER*)calloc(1, len);
|
||||||
|
@ -623,11 +623,11 @@ static PSID GetSID(void) {
|
||||||
* The workaround? Convert to string then back to PSID
|
* The workaround? Convert to string then back to PSID
|
||||||
*/
|
*/
|
||||||
if (!ConvertSidToStringSidA(tu->User.Sid, &psid_string)) {
|
if (!ConvertSidToStringSidA(tu->User.Sid, &psid_string)) {
|
||||||
uprintf("Unable to convert SID to string: %s\n", WindowsErrorString());
|
uprintf("Unable to convert SID to string: %s", WindowsErrorString());
|
||||||
ret = NULL;
|
ret = NULL;
|
||||||
} else {
|
} else {
|
||||||
if (!ConvertStringSidToSidA(psid_string, &ret)) {
|
if (!ConvertStringSidToSidA(psid_string, &ret)) {
|
||||||
uprintf("Unable to convert string back to SID: %s\n", WindowsErrorString());
|
uprintf("Unable to convert string back to SID: %s", WindowsErrorString());
|
||||||
ret = NULL;
|
ret = NULL;
|
||||||
}
|
}
|
||||||
// MUST use LocalFree()
|
// MUST use LocalFree()
|
||||||
|
@ -635,7 +635,7 @@ static PSID GetSID(void) {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ret = NULL;
|
ret = NULL;
|
||||||
uprintf("GetTokenInformation (real) failed: %s\n", WindowsErrorString());
|
uprintf("GetTokenInformation (real) failed: %s", WindowsErrorString());
|
||||||
}
|
}
|
||||||
free(tu);
|
free(tu);
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -662,7 +662,7 @@ BOOL FileIO(enum file_io_type io_type, char* path, char** buffer, DWORD* size)
|
||||||
s_attr.lpSecurityDescriptor = &s_desc;
|
s_attr.lpSecurityDescriptor = &s_desc;
|
||||||
sa = &s_attr;
|
sa = &s_attr;
|
||||||
} else {
|
} else {
|
||||||
uprintf("Could not set security descriptor: %s\n", WindowsErrorString());
|
uprintf("Could not set security descriptor: %s", WindowsErrorString());
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (io_type) {
|
switch (io_type) {
|
||||||
|
@ -696,7 +696,7 @@ BOOL FileIO(enum file_io_type io_type, char* path, char** buffer, DWORD* size)
|
||||||
*size = GetFileSize(handle, NULL);
|
*size = GetFileSize(handle, NULL);
|
||||||
*buffer = (char*)malloc(*size);
|
*buffer = (char*)malloc(*size);
|
||||||
if (*buffer == NULL) {
|
if (*buffer == NULL) {
|
||||||
uprintf("Could not allocate buffer for reading file\n");
|
uprintf("Could not allocate buffer for reading file");
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
r = ReadFile(handle, *buffer, *size, size, NULL);
|
r = ReadFile(handle, *buffer, *size, size, NULL);
|
||||||
|
@ -742,12 +742,12 @@ unsigned char* GetResource(HMODULE module, char* name, char* type, const char* d
|
||||||
|
|
||||||
res = FindResourceA(module, name, type);
|
res = FindResourceA(module, name, type);
|
||||||
if (res == NULL) {
|
if (res == NULL) {
|
||||||
uprintf("Could not locate resource '%s': %s\n", desc, WindowsErrorString());
|
uprintf("Could not locate resource '%s': %s", desc, WindowsErrorString());
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
res_handle = LoadResource(module, res);
|
res_handle = LoadResource(module, res);
|
||||||
if (res_handle == NULL) {
|
if (res_handle == NULL) {
|
||||||
uprintf("Could not load resource '%s': %s\n", desc, WindowsErrorString());
|
uprintf("Could not load resource '%s': %s", desc, WindowsErrorString());
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
res_len = SizeofResource(module, res);
|
res_len = SizeofResource(module, res);
|
||||||
|
@ -757,12 +757,12 @@ unsigned char* GetResource(HMODULE module, char* name, char* type, const char* d
|
||||||
*len = res_len;
|
*len = res_len;
|
||||||
p = (unsigned char*)calloc(*len, 1);
|
p = (unsigned char*)calloc(*len, 1);
|
||||||
if (p == NULL) {
|
if (p == NULL) {
|
||||||
uprintf("Could not allocate resource '%s'\n", desc);
|
uprintf("Could not allocate resource '%s'", desc);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
memcpy(p, LockResource(res_handle), min(res_len, *len));
|
memcpy(p, LockResource(res_handle), min(res_len, *len));
|
||||||
if (res_len > *len)
|
if (res_len > *len)
|
||||||
uprintf("WARNING: Resource '%s' was truncated by %d bytes!\n", desc, res_len - *len);
|
uprintf("WARNING: Resource '%s' was truncated by %d bytes!", desc, res_len - *len);
|
||||||
} else {
|
} else {
|
||||||
p = (unsigned char*)LockResource(res_handle);
|
p = (unsigned char*)LockResource(res_handle);
|
||||||
}
|
}
|
||||||
|
|
|
@ -83,7 +83,6 @@ void uprintf(const char *format, ...)
|
||||||
*p++ = '\n';
|
*p++ = '\n';
|
||||||
*p = '\0';
|
*p = '\0';
|
||||||
|
|
||||||
// Yay, Windows 10 *FINALLY* added actual Unicode support for OutputDebugStringW()!
|
|
||||||
wbuf = utf8_to_wchar(buf);
|
wbuf = utf8_to_wchar(buf);
|
||||||
// Send output to Windows debug facility
|
// Send output to Windows debug facility
|
||||||
OutputDebugStringW(wbuf);
|
OutputDebugStringW(wbuf);
|
||||||
|
@ -92,7 +91,6 @@ void uprintf(const char *format, ...)
|
||||||
Edit_SetSel(hLog, MAX_LOG_SIZE, MAX_LOG_SIZE);
|
Edit_SetSel(hLog, MAX_LOG_SIZE, MAX_LOG_SIZE);
|
||||||
Edit_ReplaceSel(hLog, wbuf);
|
Edit_ReplaceSel(hLog, wbuf);
|
||||||
// Make sure the message scrolls into view
|
// Make sure the message scrolls into view
|
||||||
// (Or see code commented in LogProc:WM_SHOWWINDOW for a less forceful scroll)
|
|
||||||
Edit_Scroll(hLog, Edit_GetLineCount(hLog), 0);
|
Edit_Scroll(hLog, Edit_GetLineCount(hLog), 0);
|
||||||
}
|
}
|
||||||
free(wbuf);
|
free(wbuf);
|
||||||
|
@ -608,7 +606,7 @@ DWORD WaitForSingleObjectWithMessages(HANDLE hHandle, DWORD dwMilliseconds)
|
||||||
}
|
}
|
||||||
|
|
||||||
#define STATUS_SUCCESS ((NTSTATUS)0x00000000L)
|
#define STATUS_SUCCESS ((NTSTATUS)0x00000000L)
|
||||||
#define STATUS_NOT_IMPLEMENTED ((NTSTATUS)0xC0000002L)
|
#define STATUS_PROCEDURE_NOT_FOUND ((NTSTATUS)0xC000007AL)
|
||||||
#define FILE_ATTRIBUTE_VALID_FLAGS 0x00007FB7
|
#define FILE_ATTRIBUTE_VALID_FLAGS 0x00007FB7
|
||||||
#define NtCurrentPeb() (NtCurrentTeb()->ProcessEnvironmentBlock)
|
#define NtCurrentPeb() (NtCurrentTeb()->ProcessEnvironmentBlock)
|
||||||
#define RtlGetProcessHeap() (NtCurrentPeb()->Reserved4[1]) // NtCurrentPeb()->ProcessHeap, mangled due to deficiencies in winternl.h
|
#define RtlGetProcessHeap() (NtCurrentPeb()->Reserved4[1]) // NtCurrentPeb()->ProcessHeap, mangled due to deficiencies in winternl.h
|
||||||
|
|
Loading…
Reference in a new issue