mirror of
https://github.com/veracrypt/VeraCrypt
synced 2024-11-28 14:03:29 +01:00
Windows: solve crash caused by system function FormatMessage failure on rare cases.
This commit is contained in:
parent
90bd57fe40
commit
59611b8b37
@ -570,6 +570,8 @@ DWORD handleWin32Error (HWND hwndDlg, const char* srcPos)
|
|||||||
{
|
{
|
||||||
PWSTR lpMsgBuf;
|
PWSTR lpMsgBuf;
|
||||||
DWORD dwError = GetLastError ();
|
DWORD dwError = GetLastError ();
|
||||||
|
wchar_t szErrorValue[32];
|
||||||
|
wchar_t* pszDesc;
|
||||||
|
|
||||||
if (Silent || dwError == 0 || dwError == ERROR_INVALID_WINDOW_HANDLE)
|
if (Silent || dwError == 0 || dwError == ERROR_INVALID_WINDOW_HANDLE)
|
||||||
return dwError;
|
return dwError;
|
||||||
@ -583,7 +585,7 @@ DWORD handleWin32Error (HWND hwndDlg, const char* srcPos)
|
|||||||
}
|
}
|
||||||
|
|
||||||
FormatMessageW (
|
FormatMessageW (
|
||||||
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
|
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
|
||||||
NULL,
|
NULL,
|
||||||
dwError,
|
dwError,
|
||||||
MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), /* Default language */
|
MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), /* Default language */
|
||||||
@ -592,8 +594,16 @@ DWORD handleWin32Error (HWND hwndDlg, const char* srcPos)
|
|||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
|
|
||||||
MessageBoxW (hwndDlg, AppendSrcPos (lpMsgBuf, srcPos).c_str (), lpszTitle, ICON_HAND);
|
if (lpMsgBuf)
|
||||||
LocalFree (lpMsgBuf);
|
pszDesc = (wchar_t*) lpMsgBuf;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
StringCbPrintfW (szErrorValue, sizeof (szErrorValue), L"Error 0x%.8X", dwError);
|
||||||
|
pszDesc = szErrorValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
MessageBoxW (hwndDlg, AppendSrcPos (pszDesc, srcPos).c_str (), lpszTitle, ICON_HAND);
|
||||||
|
if (lpMsgBuf) LocalFree (lpMsgBuf);
|
||||||
|
|
||||||
// User-friendly hardware error explanation
|
// User-friendly hardware error explanation
|
||||||
if (IsDiskError (dwError))
|
if (IsDiskError (dwError))
|
||||||
@ -612,7 +622,7 @@ BOOL translateWin32Error (wchar_t *lpszMsgBuf, int nWSizeOfBuf)
|
|||||||
{
|
{
|
||||||
DWORD dwError = GetLastError ();
|
DWORD dwError = GetLastError ();
|
||||||
|
|
||||||
if (FormatMessageW (FORMAT_MESSAGE_FROM_SYSTEM, NULL, dwError,
|
if (FormatMessageW (FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwError,
|
||||||
MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), /* Default language */
|
MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), /* Default language */
|
||||||
lpszMsgBuf, nWSizeOfBuf, NULL))
|
lpszMsgBuf, nWSizeOfBuf, NULL))
|
||||||
{
|
{
|
||||||
|
@ -562,7 +562,7 @@ std::string IntToString (int val);
|
|||||||
std::wstring IntToWideString (int val);
|
std::wstring IntToWideString (int val);
|
||||||
inline std::wstring AppendSrcPos (const wchar_t* msg, const char* srcPos)
|
inline std::wstring AppendSrcPos (const wchar_t* msg, const char* srcPos)
|
||||||
{
|
{
|
||||||
return std::wstring (msg) + L"\n\nSource: " + SingleStringToWide (srcPos);
|
return std::wstring (msg? msg : L"") + L"\n\nSource: " + SingleStringToWide (srcPos);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Display a wait dialog while calling the provided callback with the given parameter
|
// Display a wait dialog while calling the provided callback with the given parameter
|
||||||
|
@ -941,9 +941,11 @@ BOOL DoFilesInstall (HWND hwndDlg, wchar_t *szDestDir)
|
|||||||
LPVOID lpMsgBuf;
|
LPVOID lpMsgBuf;
|
||||||
DWORD dwError = GetLastError ();
|
DWORD dwError = GetLastError ();
|
||||||
wchar_t szTmp2[700];
|
wchar_t szTmp2[700];
|
||||||
|
wchar_t szErrorValue[16];
|
||||||
|
wchar_t* pszDesc;
|
||||||
|
|
||||||
FormatMessage (
|
FormatMessage (
|
||||||
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
|
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
|
||||||
NULL,
|
NULL,
|
||||||
dwError,
|
dwError,
|
||||||
MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), /* Default language */
|
MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), /* Default language */
|
||||||
@ -952,13 +954,20 @@ BOOL DoFilesInstall (HWND hwndDlg, wchar_t *szDestDir)
|
|||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
|
|
||||||
|
if (lpMsgBuf)
|
||||||
|
pszDesc = (wchar_t*) lpMsgBuf;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
StringCbPrintfW (szErrorValue, sizeof (szErrorValue), L"0x%.8X", dwError);
|
||||||
|
pszDesc = szErrorValue;
|
||||||
|
}
|
||||||
|
|
||||||
if (bUninstall == FALSE)
|
if (bUninstall == FALSE)
|
||||||
StringCbPrintfW (szTmp2, sizeof(szTmp2), GetString ("INSTALL_OF_FAILED"), szTmp, lpMsgBuf);
|
StringCbPrintfW (szTmp2, sizeof(szTmp2), GetString ("INSTALL_OF_FAILED"), szTmp, pszDesc);
|
||||||
else
|
else
|
||||||
StringCbPrintfW (szTmp2, sizeof(szTmp2), GetString ("UNINSTALL_OF_FAILED"), szTmp, lpMsgBuf);
|
StringCbPrintfW (szTmp2, sizeof(szTmp2), GetString ("UNINSTALL_OF_FAILED"), szTmp, pszDesc);
|
||||||
|
|
||||||
LocalFree (lpMsgBuf);
|
if (lpMsgBuf) LocalFree (lpMsgBuf);
|
||||||
|
|
||||||
if (!Silent && MessageBoxW (hwndDlg, szTmp2, lpszTitle, MB_YESNO | MB_ICONHAND) != IDYES)
|
if (!Silent && MessageBoxW (hwndDlg, szTmp2, lpszTitle, MB_YESNO | MB_ICONHAND) != IDYES)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
Loading…
Reference in New Issue
Block a user