mirror of
https://github.com/pbatard/rufus.git
synced 2025-05-20 18:05:21 -04:00
[misc] fallback to using LoadLibrary() when LoadLibraryEx() fails or doesn't apply
* Per 2a3e82fa96
, it looks like some Windows 7 system have trouble with
LoadLibraryEx() if they don't have KB2533623 installed (which fixes a MAJOR Windows
vulnerability. Some people sure want to leave their system open to hackers...).
* Work around this by adding a fallback to LoadLibrary() in GetLibraryHandle()
* Also switch to using GetLibraryHandle() in dos.c and using LoadLibrary() in sections
where we have the full path (since these calls are not vulnerable).
This commit is contained in:
parent
d8a2c29a67
commit
1c2884ceba
6 changed files with 63 additions and 53 deletions
|
@ -11,7 +11,7 @@
|
||||||
<Identity
|
<Identity
|
||||||
Name="19453.net.Rufus"
|
Name="19453.net.Rufus"
|
||||||
Publisher="CN=7AC86D13-3E5A-491A-ADD5-80095C212740"
|
Publisher="CN=7AC86D13-3E5A-491A-ADD5-80095C212740"
|
||||||
Version="3.17.1838.0" />
|
Version="3.17.1839.0" />
|
||||||
|
|
||||||
<Properties>
|
<Properties>
|
||||||
<DisplayName>Rufus</DisplayName>
|
<DisplayName>Rufus</DisplayName>
|
||||||
|
|
63
src/dos.c
63
src/dos.c
|
@ -2,7 +2,7 @@
|
||||||
* Rufus: The Reliable USB Formatting Utility
|
* Rufus: The Reliable USB Formatting Utility
|
||||||
* DOS boot file extraction, from the FAT12 floppy image in diskcopy.dll
|
* DOS boot file extraction, from the FAT12 floppy image in diskcopy.dll
|
||||||
* (MS WinME DOS) or from the embedded FreeDOS resource files
|
* (MS WinME DOS) or from the embedded FreeDOS resource files
|
||||||
* Copyright © 2011-2020 Pete Batard <pete@akeo.ie>
|
* Copyright © 2011-2021 Pete Batard <pete@akeo.ie>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -150,7 +150,8 @@ static void FatDateTimeToSystemTime(PLARGE_INTEGER SystemTime, PFAT_DATETIME Fat
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Fix seconds value that might get beyond the bound */
|
/* Fix seconds value that might get beyond the bound */
|
||||||
if (TimeFields.Second > 59) TimeFields.Second = 0;
|
if (TimeFields.Second > 59)
|
||||||
|
TimeFields.Second = 0;
|
||||||
|
|
||||||
/* Perform conversion to system time if possible */
|
/* Perform conversion to system time if possible */
|
||||||
if (!RtlTimeFieldsToTime(&TimeFields, SystemTime)) {
|
if (!RtlTimeFieldsToTime(&TimeFields, SystemTime)) {
|
||||||
|
@ -169,13 +170,13 @@ static BOOL Patch_COMMAND_COM(size_t filestart, size_t filesize)
|
||||||
{
|
{
|
||||||
const BYTE expected[8] = { 0x15, 0x80, 0xFA, 0x03, 0x75, 0x10, 0xB8, 0x0E };
|
const BYTE expected[8] = { 0x15, 0x80, 0xFA, 0x03, 0x75, 0x10, 0xB8, 0x0E };
|
||||||
|
|
||||||
uprintf("Patching COMMAND.COM...\n");
|
uprintf("Patching COMMAND.COM...");
|
||||||
if (filesize != 93040) {
|
if (filesize != 93040) {
|
||||||
uprintf(" unexpected file size\n");
|
uprintf(" unexpected file size");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
if (memcmp(&DiskImage[filestart+0x650c], expected, sizeof(expected)) != 0) {
|
if (memcmp(&DiskImage[filestart+0x650c], expected, sizeof(expected)) != 0) {
|
||||||
uprintf(" unexpected binary data\n");
|
uprintf(" unexpected binary data");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
DiskImage[filestart+0x6510] = 0xeb;
|
DiskImage[filestart+0x6510] = 0xeb;
|
||||||
|
@ -186,13 +187,13 @@ static BOOL Patch_IO_SYS(size_t filestart, size_t filesize)
|
||||||
{
|
{
|
||||||
const BYTE expected[8] = { 0xFA, 0x80, 0x75, 0x09, 0x8D, 0xB6, 0x99, 0x00 };
|
const BYTE expected[8] = { 0xFA, 0x80, 0x75, 0x09, 0x8D, 0xB6, 0x99, 0x00 };
|
||||||
|
|
||||||
uprintf("Patching IO.SYS...\n");
|
uprintf("Patching IO.SYS...");
|
||||||
if (filesize != 116736) {
|
if (filesize != 116736) {
|
||||||
uprintf(" unexpected file size\n");
|
uprintf(" unexpected file size");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
if (memcmp(&DiskImage[filestart+0x3a8], expected, sizeof(expected)) != 0) {
|
if (memcmp(&DiskImage[filestart+0x3a8], expected, sizeof(expected)) != 0) {
|
||||||
uprintf(" unexpected binary data\n");
|
uprintf(" unexpected binary data");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
DiskImage[filestart+0x3aa] = 0xeb;
|
DiskImage[filestart+0x3aa] = 0xeb;
|
||||||
|
@ -213,7 +214,7 @@ static BOOL ExtractFAT(int entry, const char* path)
|
||||||
PDIR_ENTRY dir_entry = (PDIR_ENTRY)&DiskImage[FAT12_ROOTDIR_OFFSET + entry*FAT_BYTES_PER_DIRENT];
|
PDIR_ENTRY dir_entry = (PDIR_ENTRY)&DiskImage[FAT12_ROOTDIR_OFFSET + entry*FAT_BYTES_PER_DIRENT];
|
||||||
|
|
||||||
if ((path == NULL) || ((safe_strlen(path) + 14) > sizeof(filename))) {
|
if ((path == NULL) || ((safe_strlen(path) + 14) > sizeof(filename))) {
|
||||||
uprintf("invalid path supplied for MS-DOS FAT extraction\n");
|
uprintf("invalid path supplied for MS-DOS FAT extraction");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
static_strcpy(filename, path);
|
static_strcpy(filename, path);
|
||||||
|
@ -235,8 +236,8 @@ static BOOL ExtractFAT(int entry, const char* path)
|
||||||
filestart = (dir_entry->FirstCluster + FAT12_CLUSTER_OFFSET)*FAT12_CLUSTER_SIZE;
|
filestart = (dir_entry->FirstCluster + FAT12_CLUSTER_OFFSET)*FAT12_CLUSTER_SIZE;
|
||||||
filesize = dir_entry->FileSize;
|
filesize = dir_entry->FileSize;
|
||||||
if ((filestart + filesize) > DiskImageSize) {
|
if ((filestart + filesize) > DiskImageSize) {
|
||||||
uprintf("FAT File %s would be out of bounds: %X, %X\n", filename, filestart, filesize);
|
uprintf("FAT File %s would be out of bounds: %X, %X", filename, filestart, filesize);
|
||||||
uprintf("%X, %X\n", dir_entry->FirstCluster, dir_entry->FileSize);
|
uprintf("%X, %X", dir_entry->FirstCluster, dir_entry->FileSize);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -251,12 +252,12 @@ static BOOL ExtractFAT(int entry, const char* path)
|
||||||
hFile = CreateFileA(filename, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ,
|
hFile = CreateFileA(filename, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ,
|
||||||
NULL, CREATE_ALWAYS, dir_entry->Attributes, NULL);
|
NULL, CREATE_ALWAYS, dir_entry->Attributes, NULL);
|
||||||
if (hFile == INVALID_HANDLE_VALUE) {
|
if (hFile == INVALID_HANDLE_VALUE) {
|
||||||
uprintf("Unable to create file '%s': %s.\n", filename, WindowsErrorString());
|
uprintf("Unable to create file '%s': %s.", filename, WindowsErrorString());
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!WriteFileWithRetry(hFile, &DiskImage[filestart], (DWORD)filesize, &Size, WRITE_RETRIES)) {
|
if (!WriteFileWithRetry(hFile, &DiskImage[filestart], (DWORD)filesize, &Size, WRITE_RETRIES)) {
|
||||||
uprintf("Could not write file '%s': %s.\n", filename, WindowsErrorString());
|
uprintf("Could not write file '%s': %s.", filename, WindowsErrorString());
|
||||||
safe_closehandle(hFile);
|
safe_closehandle(hFile);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
@ -278,7 +279,7 @@ static BOOL ExtractFAT(int entry, const char* path)
|
||||||
}
|
}
|
||||||
|
|
||||||
safe_closehandle(hFile);
|
safe_closehandle(hFile);
|
||||||
uprintf("Successfully wrote '%s' (%d bytes)\n", filename, filesize);
|
uprintf("Successfully wrote '%s' (%d bytes)", filename, filesize);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
@ -287,9 +288,7 @@ static BOOL ExtractFAT(int entry, const char* path)
|
||||||
image included as resource "BINFILE" in diskcopy.dll */
|
image included as resource "BINFILE" in diskcopy.dll */
|
||||||
static BOOL ExtractMSDOS(const char* path)
|
static BOOL ExtractMSDOS(const char* path)
|
||||||
{
|
{
|
||||||
char dllname[MAX_PATH] = "C:\\Windows\\System32";
|
|
||||||
int i, j;
|
int i, j;
|
||||||
UINT len;
|
|
||||||
BOOL r = FALSE;
|
BOOL r = FALSE;
|
||||||
HMODULE hDLL = NULL;
|
HMODULE hDLL = NULL;
|
||||||
char locale_path[MAX_PATH];
|
char locale_path[MAX_PATH];
|
||||||
|
@ -305,15 +304,9 @@ static BOOL ExtractMSDOS(const char* path)
|
||||||
static_strcat(locale_path, "LOCALE\\");
|
static_strcat(locale_path, "LOCALE\\");
|
||||||
CreateDirectoryA(locale_path, NULL);
|
CreateDirectoryA(locale_path, NULL);
|
||||||
|
|
||||||
len = GetSystemDirectoryA(dllname, sizeof(dllname));
|
hDLL = GetLibraryHandle("diskcopy");
|
||||||
if ((len == 0) || (len >= sizeof(dllname))) {
|
|
||||||
uprintf("Unable to get system directory: %s\n", WindowsErrorString());
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
static_strcat(dllname, "\\diskcopy.dll");
|
|
||||||
hDLL = LoadLibraryExA(dllname, NULL, LOAD_LIBRARY_SEARCH_SYSTEM32);
|
|
||||||
if (hDLL == NULL) {
|
if (hDLL == NULL) {
|
||||||
uprintf("Unable to open %s: %s\n", dllname, WindowsErrorString());
|
uprintf("Unable to open 'diskcopy.dll': %s", WindowsErrorString());
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -324,16 +317,16 @@ static BOOL ExtractMSDOS(const char* path)
|
||||||
|
|
||||||
// Sanity check
|
// Sanity check
|
||||||
if (DiskImageSize < 700*KB) {
|
if (DiskImageSize < 700*KB) {
|
||||||
uprintf("MS-DOS disk image is too small (%d bytes)\n", dllname, DiskImageSize);
|
uprintf("MS-DOS disk image is too small (%d bytes)", DiskImageSize);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i=0, r=TRUE; r && i<FAT_FN_DIR_ENTRY_LAST; i++) {
|
for (i = 0, r = TRUE; r && i < FAT_FN_DIR_ENTRY_LAST; i++) {
|
||||||
if (DiskImage[FAT12_ROOTDIR_OFFSET + i*FAT_BYTES_PER_DIRENT] == FAT_DIRENT_DELETED)
|
if (DiskImage[FAT12_ROOTDIR_OFFSET + i * FAT_BYTES_PER_DIRENT] == FAT_DIRENT_DELETED)
|
||||||
continue;
|
continue;
|
||||||
for (j=0; r && j<ARRAYSIZE(extractlist); j++) {
|
for (j = 0; r && j < ARRAYSIZE(extractlist); j++) {
|
||||||
if (memcmp(extractlist[j], &DiskImage[FAT12_ROOTDIR_OFFSET + i*FAT_BYTES_PER_DIRENT], 8+3) == 0) {
|
if (memcmp(extractlist[j], &DiskImage[FAT12_ROOTDIR_OFFSET + i * FAT_BYTES_PER_DIRENT], 8 + 3) == 0) {
|
||||||
r = ExtractFAT(i, (j<3)?path:locale_path);
|
r = ExtractFAT(i, (j < 3) ? path : locale_path);
|
||||||
if ((j == 2) || (j == 7) || (j == 12))
|
if ((j == 2) || (j == 7) || (j == 12))
|
||||||
UpdateProgress(OP_FILE_COPY, -1.0f);
|
UpdateProgress(OP_FILE_COPY, -1.0f);
|
||||||
}
|
}
|
||||||
|
@ -343,8 +336,6 @@ static BOOL ExtractMSDOS(const char* path)
|
||||||
r = SetDOSLocale(path, FALSE);
|
r = SetDOSLocale(path, FALSE);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
if (hDLL != NULL)
|
|
||||||
FreeLibrary(hDLL);
|
|
||||||
safe_free(DiskImage);
|
safe_free(DiskImage);
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
@ -371,7 +362,7 @@ BOOL ExtractFreeDOS(const char* path)
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if ((path == NULL) || ((safe_strlen(path) + 14) > sizeof(filename))) {
|
if ((path == NULL) || ((safe_strlen(path) + 14) > sizeof(filename))) {
|
||||||
uprintf("invalid path supplied for FreeDOS extraction\n");
|
uprintf("invalid path supplied for FreeDOS extraction");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -389,12 +380,12 @@ BOOL ExtractFreeDOS(const char* path)
|
||||||
hFile = CreateFileA(filename, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ, NULL,
|
hFile = CreateFileA(filename, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ, NULL,
|
||||||
CREATE_ALWAYS, (i<2)?(FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM):FILE_ATTRIBUTE_NORMAL, NULL);
|
CREATE_ALWAYS, (i<2)?(FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM):FILE_ATTRIBUTE_NORMAL, NULL);
|
||||||
if ((hFile == NULL) || (hFile == INVALID_HANDLE_VALUE)) {
|
if ((hFile == NULL) || (hFile == INVALID_HANDLE_VALUE)) {
|
||||||
uprintf("Unable to create file '%s': %s.\n", filename, WindowsErrorString());
|
uprintf("Unable to create file '%s': %s.", filename, WindowsErrorString());
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!WriteFileWithRetry(hFile, res_data, res_size, &Size, WRITE_RETRIES)) {
|
if (!WriteFileWithRetry(hFile, res_data, res_size, &Size, WRITE_RETRIES)) {
|
||||||
uprintf("Could not write file '%s': %s.\n", filename, WindowsErrorString());
|
uprintf("Could not write file '%s': %s.", filename, WindowsErrorString());
|
||||||
safe_closehandle(hFile);
|
safe_closehandle(hFile);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
@ -403,7 +394,7 @@ BOOL ExtractFreeDOS(const char* path)
|
||||||
// thus we would need to have a separate header with each file's timestamps
|
// thus we would need to have a separate header with each file's timestamps
|
||||||
|
|
||||||
safe_closehandle(hFile);
|
safe_closehandle(hFile);
|
||||||
uprintf("Successfully wrote '%s' (%d bytes)\n", filename, res_size);
|
uprintf("Successfully wrote '%s' (%d bytes)", filename, res_size);
|
||||||
|
|
||||||
if ((i == 4) || (i == 10) || (i == 16) || (i == 22) || (i == ARRAYSIZE(res_name)-1))
|
if ((i == 4) || (i == 10) || (i == 16) || (i == 22) || (i == ARRAYSIZE(res_name)-1))
|
||||||
UpdateProgress(OP_FILE_COPY, -1.0f);
|
UpdateProgress(OP_FILE_COPY, -1.0f);
|
||||||
|
|
|
@ -3221,8 +3221,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
|
||||||
// nail... Also, no, Coverity, we never need to care about freeing kernel32 as a library.
|
// nail... Also, no, Coverity, we never need to care about freeing kernel32 as a library.
|
||||||
// coverity[leaked_storage]
|
// coverity[leaked_storage]
|
||||||
pfSetDefaultDllDirectories = (SetDefaultDllDirectories_t)
|
pfSetDefaultDllDirectories = (SetDefaultDllDirectories_t)
|
||||||
GetProcAddress(LoadLibraryExW(kernel32_path, NULL, LOAD_LIBRARY_SEARCH_SYSTEM32),
|
GetProcAddress(LoadLibraryW(kernel32_path), "SetDefaultDllDirectories");
|
||||||
"SetDefaultDllDirectories");
|
|
||||||
if (pfSetDefaultDllDirectories != NULL)
|
if (pfSetDefaultDllDirectories != NULL)
|
||||||
pfSetDefaultDllDirectories(LOAD_LIBRARY_SEARCH_SYSTEM32);
|
pfSetDefaultDllDirectories(LOAD_LIBRARY_SEARCH_SYSTEM32);
|
||||||
|
|
||||||
|
|
25
src/rufus.h
25
src/rufus.h
|
@ -676,22 +676,41 @@ extern void StrArrayDestroy(StrArray* arr);
|
||||||
* pfFormatEx = (FormatEx_t) GetProcAddress(GetDLLHandle("fmifs"), "FormatEx");
|
* pfFormatEx = (FormatEx_t) GetProcAddress(GetDLLHandle("fmifs"), "FormatEx");
|
||||||
* to make it accessible.
|
* to make it accessible.
|
||||||
*/
|
*/
|
||||||
#define MAX_LIBRARY_HANDLES 32
|
#define MAX_LIBRARY_HANDLES 64
|
||||||
extern HMODULE OpenedLibrariesHandle[MAX_LIBRARY_HANDLES];
|
extern HMODULE OpenedLibrariesHandle[MAX_LIBRARY_HANDLES];
|
||||||
extern uint16_t OpenedLibrariesHandleSize;
|
extern uint16_t OpenedLibrariesHandleSize;
|
||||||
#define OPENED_LIBRARIES_VARS HMODULE OpenedLibrariesHandle[MAX_LIBRARY_HANDLES]; uint16_t OpenedLibrariesHandleSize = 0
|
#define OPENED_LIBRARIES_VARS HMODULE OpenedLibrariesHandle[MAX_LIBRARY_HANDLES]; uint16_t OpenedLibrariesHandleSize = 0
|
||||||
#define CLOSE_OPENED_LIBRARIES while(OpenedLibrariesHandleSize > 0) FreeLibrary(OpenedLibrariesHandle[--OpenedLibrariesHandleSize])
|
#define CLOSE_OPENED_LIBRARIES while(OpenedLibrariesHandleSize > 0) FreeLibrary(OpenedLibrariesHandle[--OpenedLibrariesHandleSize])
|
||||||
static __inline HMODULE GetLibraryHandle(char* szLibraryName) {
|
static __inline HMODULE GetLibraryHandle(char* szLibraryName) {
|
||||||
HMODULE h = NULL;
|
HMODULE h = NULL;
|
||||||
if ((h = GetModuleHandleA(szLibraryName)) == NULL) {
|
wchar_t* wszLibraryName = NULL;
|
||||||
|
int size;
|
||||||
|
if (szLibraryName == NULL || szLibraryName[0] == 0)
|
||||||
|
goto out;
|
||||||
|
size = MultiByteToWideChar(CP_UTF8, 0, szLibraryName, -1, NULL, 0);
|
||||||
|
if (size <= 1) // An empty string would be size 1
|
||||||
|
goto out;
|
||||||
|
if ((wszLibraryName = (wchar_t*)calloc(size, sizeof(wchar_t))) == NULL)
|
||||||
|
goto out;
|
||||||
|
if (MultiByteToWideChar(CP_UTF8, 0, szLibraryName, -1, wszLibraryName, size) != size)
|
||||||
|
goto out;
|
||||||
|
// If the library is already opened, just return a handle (that doesn't need to be freed)
|
||||||
|
if ((h = GetModuleHandleW(wszLibraryName)) == NULL) {
|
||||||
if (OpenedLibrariesHandleSize >= MAX_LIBRARY_HANDLES) {
|
if (OpenedLibrariesHandleSize >= MAX_LIBRARY_HANDLES) {
|
||||||
uprintf("Error: MAX_LIBRARY_HANDLES is too small\n");
|
uprintf("Error: MAX_LIBRARY_HANDLES is too small\n");
|
||||||
} else {
|
} else {
|
||||||
h = LoadLibraryExA(szLibraryName, NULL, LOAD_LIBRARY_SEARCH_SYSTEM32);
|
h = LoadLibraryExW(wszLibraryName, NULL, LOAD_LIBRARY_SEARCH_SYSTEM32);
|
||||||
|
// Some Windows 7 platforms (most likely the ones missing KB2533623 per
|
||||||
|
// the official LoadLibraryEx doc) return "[0x####007F] The specified
|
||||||
|
// procedure could not be found" when using the Ex version.
|
||||||
|
if ((h == NULL) && (SCODE_CODE(GetLastError()) == ERROR_PROC_NOT_FOUND))
|
||||||
|
h = LoadLibraryW(wszLibraryName);
|
||||||
if (h != NULL)
|
if (h != NULL)
|
||||||
OpenedLibrariesHandle[OpenedLibrariesHandleSize++] = h;
|
OpenedLibrariesHandle[OpenedLibrariesHandleSize++] = h;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
out:
|
||||||
|
free(wszLibraryName);
|
||||||
return h;
|
return h;
|
||||||
}
|
}
|
||||||
#define PF_TYPE(api, ret, proc, args) typedef ret (api *proc##_t)args
|
#define PF_TYPE(api, ret, proc, args) typedef ret (api *proc##_t)args
|
||||||
|
|
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 3.17.1838"
|
CAPTION "Rufus 3.17.1839"
|
||||||
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
|
||||||
|
@ -395,8 +395,8 @@ END
|
||||||
//
|
//
|
||||||
|
|
||||||
VS_VERSION_INFO VERSIONINFO
|
VS_VERSION_INFO VERSIONINFO
|
||||||
FILEVERSION 3,17,1838,0
|
FILEVERSION 3,17,1839,0
|
||||||
PRODUCTVERSION 3,17,1838,0
|
PRODUCTVERSION 3,17,1839,0
|
||||||
FILEFLAGSMASK 0x3fL
|
FILEFLAGSMASK 0x3fL
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
FILEFLAGS 0x1L
|
FILEFLAGS 0x1L
|
||||||
|
@ -414,13 +414,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", "3.17.1838"
|
VALUE "FileVersion", "3.17.1839"
|
||||||
VALUE "InternalName", "Rufus"
|
VALUE "InternalName", "Rufus"
|
||||||
VALUE "LegalCopyright", "© 2011-2021 Pete Batard (GPL v3)"
|
VALUE "LegalCopyright", "© 2011-2021 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-3.17.exe"
|
VALUE "OriginalFilename", "rufus-3.17.exe"
|
||||||
VALUE "ProductName", "Rufus"
|
VALUE "ProductName", "Rufus"
|
||||||
VALUE "ProductVersion", "3.17.1838"
|
VALUE "ProductVersion", "3.17.1839"
|
||||||
END
|
END
|
||||||
END
|
END
|
||||||
BLOCK "VarFileInfo"
|
BLOCK "VarFileInfo"
|
||||||
|
|
13
src/stdlg.c
13
src/stdlg.c
|
@ -2037,26 +2037,27 @@ static void CALLBACK AlertPromptHook(HWINEVENTHOOK hWinEventHook, DWORD Event, H
|
||||||
|
|
||||||
void SetAlertPromptMessages(void)
|
void SetAlertPromptMessages(void)
|
||||||
{
|
{
|
||||||
HMODULE mui_lib;
|
HMODULE hMui;
|
||||||
char mui_path[MAX_PATH];
|
char mui_path[MAX_PATH];
|
||||||
|
|
||||||
// Fetch the localized strings in the relevant MUI
|
// Fetch the localized strings in the relevant MUI
|
||||||
// Must use sysnative_dir rather than system_dir as we may not find the MUI's otherwise
|
// Must use sysnative_dir rather than system_dir as we may not find the MUI's otherwise
|
||||||
|
// Also don't bother with LibLibraryEx() since we have a full path here.
|
||||||
static_sprintf(mui_path, "%s\\%s\\shell32.dll.mui", sysnative_dir, GetCurrentMUI());
|
static_sprintf(mui_path, "%s\\%s\\shell32.dll.mui", sysnative_dir, GetCurrentMUI());
|
||||||
mui_lib = LoadLibraryExU(mui_path, NULL, LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR);
|
hMui = LoadLibraryU(mui_path);
|
||||||
if (mui_lib != NULL) {
|
if (hMui != NULL) {
|
||||||
// 4097 = "You need to format the disk in drive %c: before you can use it." (dialog text)
|
// 4097 = "You need to format the disk in drive %c: before you can use it." (dialog text)
|
||||||
// 4125 = "Microsoft Windows" (dialog title)
|
// 4125 = "Microsoft Windows" (dialog title)
|
||||||
// 4126 = "Format disk" (button)
|
// 4126 = "Format disk" (button)
|
||||||
if (LoadStringU(mui_lib, 4125, title_str[0], sizeof(title_str[0])) <= 0) {
|
if (LoadStringU(hMui, 4125, title_str[0], sizeof(title_str[0])) <= 0) {
|
||||||
static_strcpy(title_str[0], "Microsoft Windows");
|
static_strcpy(title_str[0], "Microsoft Windows");
|
||||||
uprintf("Warning: Could not locate localized format prompt title string in '%s': %s", mui_path, WindowsErrorString());
|
uprintf("Warning: Could not locate localized format prompt title string in '%s': %s", mui_path, WindowsErrorString());
|
||||||
}
|
}
|
||||||
if (LoadStringU(mui_lib, 4126, button_str, sizeof(button_str)) <= 0) {
|
if (LoadStringU(hMui, 4126, button_str, sizeof(button_str)) <= 0) {
|
||||||
static_strcpy(button_str, "Format disk");
|
static_strcpy(button_str, "Format disk");
|
||||||
uprintf("Warning: Could not locate localized format prompt button string in '%s': %s", mui_path, WindowsErrorString());
|
uprintf("Warning: Could not locate localized format prompt button string in '%s': %s", mui_path, WindowsErrorString());
|
||||||
}
|
}
|
||||||
FreeLibrary(mui_lib);
|
FreeLibrary(hMui);
|
||||||
}
|
}
|
||||||
static_strcpy(title_str[1], lmprintf(MSG_149));
|
static_strcpy(title_str[1], lmprintf(MSG_149));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue