https://git.reactos.org/?p=reactos.git;a=commitdiff;h=059ba9b0c037e76270aa888828cf3355426a7586

commit 059ba9b0c037e76270aa888828cf3355426a7586
Author:     Stanislav Motylkov <[email protected]>
AuthorDate: Fri Nov 20 21:16:37 2020 +0300
Commit:     Stanislav Motylkov <[email protected]>
CommitDate: Fri Nov 20 21:30:29 2020 +0300

    [RAPPS] Properly use FormatMessageW with WinInet message table
    
    Addendum to fb1582d. CORE-17375 CORE-17377
---
 base/applications/rapps/loaddlg.cpp | 47 +++++++++++++++++++++++--------------
 1 file changed, 29 insertions(+), 18 deletions(-)

diff --git a/base/applications/rapps/loaddlg.cpp 
b/base/applications/rapps/loaddlg.cpp
index 7ad7de1d32f..fb060358e55 100644
--- a/base/applications/rapps/loaddlg.cpp
+++ b/base/applications/rapps/loaddlg.cpp
@@ -522,25 +522,28 @@ VOID CDownloadManager::UpdateProgress(
     }
 }
 
-VOID ShowLastError(
+BOOL ShowLastError(
     HWND hWndOwner,
+    BOOL bInetError,
     DWORD dwLastError)
 {
     CLocalPtr<WCHAR> lpMsg;
     
     if (!FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER |
-                        FORMAT_MESSAGE_FROM_SYSTEM |
-                        FORMAT_MESSAGE_IGNORE_INSERTS,
-                        NULL,
+                        FORMAT_MESSAGE_IGNORE_INSERTS |
+                        (bInetError ? FORMAT_MESSAGE_FROM_HMODULE : 
FORMAT_MESSAGE_FROM_SYSTEM),
+                        (bInetError ? GetModuleHandleW(L"wininet.dll") : NULL),
                         dwLastError,
                         LANG_USER_DEFAULT,
                         (LPWSTR)&lpMsg,
                         0, NULL))
     {
-        return;
+        DPRINT1("FormatMessageW unexpected failure (err %d)\n", 
GetLastError());
+        return FALSE;
     }
 
     MessageBoxW(hWndOwner, lpMsg, NULL, MB_OK | MB_ICONERROR);
+    return TRUE;
 }
 
 unsigned int WINAPI CDownloadManager::ThreadFunc(LPVOID param)
@@ -596,7 +599,7 @@ unsigned int WINAPI CDownloadManager::ThreadFunc(LPVOID 
param)
         {
             if (!GetStorageDirectory(Path))
             {
-                ShowLastError(hMainWnd, GetLastError());
+                ShowLastError(hMainWnd, FALSE, GetLastError());
                 goto end;
             }
         }
@@ -646,7 +649,7 @@ unsigned int WINAPI CDownloadManager::ThreadFunc(LPVOID 
param)
         {
             if (!CreateDirectoryW(Path.GetString(), NULL))
             {
-                ShowLastError(hMainWnd, GetLastError());
+                ShowLastError(hMainWnd, FALSE, GetLastError());
                 goto end;
             }
         }
@@ -700,7 +703,7 @@ unsigned int WINAPI CDownloadManager::ThreadFunc(LPVOID 
param)
 
         if (!hOpen)
         {
-            ShowLastError(hMainWnd, GetLastError());
+            ShowLastError(hMainWnd, TRUE, GetLastError());
             goto end;
         }
 
@@ -715,7 +718,7 @@ unsigned int WINAPI CDownloadManager::ThreadFunc(LPVOID 
param)
 
         if (!InternetCrackUrlW(InfoArray[iAppId].szUrl, urlLength + 1, 
ICU_DECODE | ICU_ESCAPE, &urlComponents))
         {
-            ShowLastError(hMainWnd, GetLastError());
+            ShowLastError(hMainWnd, TRUE, GetLastError());
             goto end;
         }
 
@@ -729,14 +732,18 @@ unsigned int WINAPI CDownloadManager::ThreadFunc(LPVOID 
param)
                                      0);
             if (!hFile)
             {
-                ShowLastError(hMainWnd, GetLastError());
+                if (!ShowLastError(hMainWnd, TRUE, GetLastError()))
+                {
+                    /* Workaround for CORE-17377 */
+                    MessageBox_LoadString(hMainWnd, IDS_UNABLE_TO_DOWNLOAD2);
+                }
                 goto end;
             }
 
             // query connection
             if (!HttpQueryInfoW(hFile, HTTP_QUERY_STATUS_CODE | 
HTTP_QUERY_FLAG_NUMBER, &dwStatus, &dwStatusLen, NULL))
             {
-                ShowLastError(hMainWnd, GetLastError());
+                ShowLastError(hMainWnd, TRUE, GetLastError());
                 goto end;
             }
 
@@ -757,7 +764,11 @@ unsigned int WINAPI CDownloadManager::ThreadFunc(LPVOID 
param)
                                      0);
             if (!hFile)
             {
-                ShowLastError(hMainWnd, GetLastError());
+                if (!ShowLastError(hMainWnd, TRUE, GetLastError()))
+                {
+                    /* Workaround for CORE-17377 */
+                    MessageBox_LoadString(hMainWnd, IDS_UNABLE_TO_DOWNLOAD2);
+                }
                 goto end;
             }
 
@@ -778,13 +789,13 @@ unsigned int WINAPI CDownloadManager::ThreadFunc(LPVOID 
param)
                 }
                 else
                 {
-                    ShowLastError(hMainWnd, GetLastError());
+                    ShowLastError(hMainWnd, FALSE, GetLastError());
                     goto end;
                 }
             }
             else
             {
-                ShowLastError(hMainWnd, hr);
+                ShowLastError(hMainWnd, FALSE, hr);
                 goto end;
             }
         }
@@ -842,7 +853,7 @@ unsigned int WINAPI CDownloadManager::ThreadFunc(LPVOID 
param)
 
         if (hOut == INVALID_HANDLE_VALUE)
         {
-            ShowLastError(hMainWnd, GetLastError());
+            ShowLastError(hMainWnd, FALSE, GetLastError());
             goto end;
         }
 
@@ -851,13 +862,13 @@ unsigned int WINAPI CDownloadManager::ThreadFunc(LPVOID 
param)
         {
             if (!InternetReadFile(hFile, lpBuffer, _countof(lpBuffer), 
&dwBytesRead))
             {
-                ShowLastError(hMainWnd, GetLastError());
+                ShowLastError(hMainWnd, TRUE, GetLastError());
                 goto end;
             }
 
             if (!WriteFile(hOut, &lpBuffer[0], dwBytesRead, &dwBytesWritten, 
NULL))
             {
-                ShowLastError(hMainWnd, GetLastError());
+                ShowLastError(hMainWnd, FALSE, GetLastError());
                 goto end;
             }
 
@@ -947,7 +958,7 @@ run:
             }
             else
             {
-                ShowLastError(hMainWnd, GetLastError());
+                ShowLastError(hMainWnd, FALSE, GetLastError());
             }
         }
 

Reply via email to