Windows: solve crash caused by system function FormatMessage failure on rare cases.

This commit is contained in:
Mounir IDRASSI 2015-11-26 00:34:30 +01:00
parent 90bd57fe40
commit 59611b8b37
3 changed files with 28 additions and 9 deletions

View File

@ -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))
{ {

View File

@ -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

View File

@ -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;