ReactOS 0.4.16-dev-1946-g52006dd
loaddlg.cpp
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS Applications Manager
3 * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
4 * PURPOSE: Displaying a download dialog
5 * COPYRIGHT: Copyright 2001 John R. Sheets (for CodeWeavers)
6 * Copyright 2004 Mike McCormack (for CodeWeavers)
7 * Copyright 2005 Ge van Geldorp (gvg@reactos.org)
8 * Copyright 2009 Dmitry Chapyshev (dmitry@reactos.org)
9 * Copyright 2015 Ismael Ferreras Morezuelas (swyterzone+ros@gmail.com)
10 * Copyright 2017 Alexander Shaposhnikov (sanchaez@reactos.org)
11 */
12
13/*
14 * Based on Wine dlls/shdocvw/shdocvw_main.c
15 *
16 * This library is free software; you can redistribute it and/or
17 * modify it under the terms of the GNU Lesser General Public
18 * License as published by the Free Software Foundation; either
19 * version 2.1 of the License, or (at your option) any later version.
20 *
21 * This library is distributed in the hope that it will be useful,
22 * but WITHOUT ANY WARRANTY; without even the implied warranty of
23 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
24 * Lesser General Public License for more details.
25 *
26 * You should have received a copy of the GNU Lesser General Public
27 * License along with this library; if not, write to the Free Software
28 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
29 */
30#include "rapps.h"
31
32#include <shlobj_undoc.h>
33#include <shlguid_undoc.h>
34
35#include <atlbase.h>
36#include <atlcom.h>
37#include <atlwin.h>
38#include <wininet.h>
39#include <shellutils.h>
40
41#include <debug.h>
42
43#include <ui/rosctrls.h>
44#include <windowsx.h>
45#include <shlwapi_undoc.h>
46#include <process.h>
47#undef SubclassWindow
48
49#include "rosui.h"
50#include "dialogs.h"
51#include "misc.h"
52#include "unattended.h"
53
54#ifdef USE_CERT_PINNING
55#define CERT_ISSUER_INFO_PREFIX "US\r\nLet's Encrypt\r\nR"
56#define CERT_ISSUER_INFO_OLD "US\r\nLet's Encrypt\r\nR3"
57#define CERT_ISSUER_INFO_NEW "US\r\nLet's Encrypt\r\nR11"
58#define CERT_SUBJECT_INFO "rapps.reactos.org"
59
60static bool
61IsTrustedPinnedCert(LPCSTR Subject, LPCSTR Issuer)
62{
63 if (strcmp(Subject, CERT_SUBJECT_INFO))
64 return false;
65#ifdef CERT_ISSUER_INFO_PREFIX
66 return Issuer == StrStrA(Issuer, CERT_ISSUER_INFO_PREFIX);
67#else
68 return !strcmp(Issuer, CERT_ISSUER_INFO_OLD) || !strcmp(Issuer, CERT_ISSUER_INFO_NEW);
69#endif
70}
71#endif // USE_CERT_PINNING
72
74{
78};
79
81{
88};
89
92{
93 CStringW szString;
94 szString.LoadStringW(StatusParam);
95 return szString;
96}
97
98#define FILENAME_VALID_CHAR ( \
99 PATH_CHAR_CLASS_LETTER | \
100 PATH_CHAR_CLASS_DOT | \
101 PATH_CHAR_CLASS_SEMICOLON | \
102 PATH_CHAR_CLASS_COMMA | \
103 PATH_CHAR_CLASS_SPACE | \
104 PATH_CHAR_CLASS_OTHER_VALID)
105
106VOID
108{
110 DWORD cchPath = _countof(szPath);
111 UrlUnescapeW(const_cast<LPWSTR>((LPCWSTR)str), szPath, &cchPath, 0);
112
113 for (PWCHAR pch = szPath; *pch; ++pch)
114 {
116 *pch = L'_';
117 }
118
119 str = szPath;
120}
121
122static void
124{
126 DWORD cch = (DWORD)(wcslen(pszUrl) + 1);
127 if (InternetCanonicalizeUrlW(pszUrl, buf.GetBuffer(cch), &cch, ICU_DECODE | ICU_NO_ENCODE))
128 {
129 buf.ReleaseBuffer();
130 pszUrl = buf;
131 }
132 SetWindowTextW(hWnd, pszUrl);
133}
134
136{
138 {
139 }
140 DownloadInfo(const CAppInfo &AppInfo, UINT DAF = 0) : DLType(DLTYPE_APPLICATION), Flags(DAF)
141 {
143 szName = AppInfo.szDisplayName;
144 IType = AppInfo.GetInstallerType();
145 szPackageName = AppInfo.szIdentifier;
146
147 if (Flags & DAF_SILENT)
149
150 CConfigParser *cfg = static_cast<const CAvailableApplicationInfo&>(AppInfo).GetConfigParser();
151 if (cfg)
153 }
154
155 bool Equal(const DownloadInfo &other) const
156 {
157 return DLType == other.DLType && !lstrcmpW(szUrl, other.szUrl);
158 }
159
171};
172
173class CDownloaderProgress : public CWindowImpl<CDownloaderProgress, CWindow, CControlWinTraits>
174{
176
177 public:
179 {
180 }
181
182 VOID
184 {
185 if (Enable)
187 else
189
191 }
192
193 VOID
194 SetProgress(ULONG ulProgress, ULONG ulProgressMax)
195 {
196 WCHAR szProgress[100];
197
198 /* format the bits and bytes into pretty and accessible units... */
199 StrFormatByteSizeW(ulProgress, szProgress, _countof(szProgress));
200
201 /* use our subclassed progress bar text subroutine */
202 CStringW ProgressText;
203
204 if (ulProgressMax)
205 {
206 /* total size is known */
207 WCHAR szProgressMax[100];
208 UINT uiPercentage = ((ULONGLONG)ulProgress * 100) / ulProgressMax;
209
210 /* send the current progress to the progress bar */
211 if (!IsWindow())
212 return;
213 SendMessage(PBM_SETPOS, uiPercentage, 0);
214
215 /* format total download size */
216 StrFormatByteSizeW(ulProgressMax, szProgressMax, _countof(szProgressMax));
217
218 /* generate the text on progress bar */
219 ProgressText.Format(L"%u%% \x2014 %ls / %ls", uiPercentage, szProgress, szProgressMax);
220 }
221 else
222 {
223 /* send the current progress to the progress bar */
224 if (!IsWindow())
225 return;
226 SendMessage(PBM_SETPOS, 0, 0);
227
228 /* total size is not known, display only current size */
229 ProgressText.Format(L"%ls...", szProgress);
230 }
231
232 /* and finally display it */
233 if (!IsWindow())
234 return;
235 SetWindowText(ProgressText.GetString());
236 }
237
238 LRESULT
240 {
241 return TRUE;
242 }
243
244 LRESULT
246 {
247 PAINTSTRUCT ps;
248 HDC hDC = BeginPaint(&ps), hdcMem;
249 HBITMAP hbmMem;
250 HANDLE hOld;
251 RECT myRect;
252 UINT win_width, win_height;
253
254 GetClientRect(&myRect);
255
256 /* grab the progress bar rect size */
257 win_width = myRect.right - myRect.left;
258 win_height = myRect.bottom - myRect.top;
259
260 /* create an off-screen DC for double-buffering */
262 hbmMem = CreateCompatibleBitmap(hDC, win_width, win_height);
263
264 hOld = SelectObject(hdcMem, hbmMem);
265
266 /* call the original draw code and redirect it to our memory buffer */
268
269 /* draw our nifty progress text over it */
275
276 /* transfer the off-screen DC to the screen */
277 BitBlt(hDC, 0, 0, win_width, win_height, hdcMem, 0, 0, SRCCOPY);
278
279 /* free the off-screen DC */
280 SelectObject(hdcMem, hOld);
281 DeleteObject(hbmMem);
283
284 EndPaint(&ps);
285 return 0;
286 }
287
288 LRESULT
290 {
291 PCWSTR pszText = (PCWSTR)lParam;
292 if (pszText)
293 {
294 if (m_szProgressText != pszText)
295 {
296 m_szProgressText = pszText;
298 }
299 }
300 else
301 {
303 {
306 }
307 }
308 return TRUE;
309 }
310
316};
317
319{
320 public:
321 HWND
323 {
324 RECT r;
326 r.top = (2 * r.top + 1 * r.bottom) / 3; /* The vertical position at ratio 1 : 2 */
327 const INT MARGIN = 10;
328 ::InflateRect(&r, -MARGIN, -MARGIN);
329
332
334
335 AddColumn(0, 150, LVCFMT_LEFT);
336 AddColumn(1, 120, LVCFMT_LEFT);
337
338 return hwnd;
339 }
340
341 VOID
343 {
344 const INT base = GetItemCount();
345 for (INT i = Start; i < arrInfo.GetSize(); ++i)
346 {
347 AddRow(base + i - Start, arrInfo[i].szName, DLSTATUS_WAITING);
348 }
349 }
350
351 VOID
353 {
354 CStringW szBuffer = LoadStatusString(Status);
355 SetItemText(ItemIndex, 1, szBuffer.GetString());
356 }
357
358 BOOL
359 AddItem(INT ItemIndex, LPWSTR lpText)
360 {
362
363 ZeroMemory(&Item, sizeof(Item));
364
365 Item.mask = LVIF_TEXT | LVIF_STATE;
366 Item.pszText = lpText;
367 Item.iItem = ItemIndex;
368
369 return InsertItem(&Item);
370 }
371
372 VOID
374 {
375 CStringW szStatus = LoadStatusString(Status);
376 AddItem(RowIndex, const_cast<LPWSTR>(szAppName));
377 SetDownloadStatus(RowIndex, Status);
378 }
379
380 BOOL
382 {
383 LVCOLUMNW Column;
384 ZeroMemory(&Column, sizeof(Column));
385
387 Column.iSubItem = Index;
388 Column.cx = Width;
389 Column.fmt = Format;
390
391 return (InsertColumn(Index, &Column) == -1) ? FALSE : TRUE;
392 }
393};
394
395#ifdef USE_CERT_PINNING
396static BOOL
397CertGetSubjectAndIssuer(HINTERNET hFile, CLocalPtr<char> &subjectInfo, CLocalPtr<char> &issuerInfo)
398{
399 DWORD certInfoLength;
402
403 size = sizeof(flags);
405 {
406 return FALSE;
407 }
408
410 {
411 return FALSE;
412 }
413
414 /* Despite what the header indicates, the implementation of INTERNET_CERTIFICATE_INFO is not Unicode-aware. */
415 certInfoLength = sizeof(certInfo);
417 {
418 return FALSE;
419 }
420
421 subjectInfo.Attach(certInfo.lpszSubjectInfo);
422 issuerInfo.Attach(certInfo.lpszIssuerInfo);
423
424 if (certInfo.lpszProtocolName)
425 LocalFree(certInfo.lpszProtocolName);
426 if (certInfo.lpszSignatureAlgName)
428 if (certInfo.lpszEncryptionAlgName)
430
431 return certInfo.lpszSubjectInfo && certInfo.lpszIssuerInfo;
432}
433#endif
434
435static inline VOID
436MessageBox_LoadString(HWND hOwnerWnd, INT StringID)
437{
438 CStringW szMsgText;
439 if (szMsgText.LoadStringW(StringID))
440 {
441 MessageBoxW(hOwnerWnd, szMsgText.GetString(), NULL, MB_OK | MB_ICONERROR);
442 }
443}
444
445static BOOL
446ShowLastError(HWND hWndOwner, BOOL bInetError, DWORD dwLastError)
447{
448 CLocalPtr<WCHAR> lpMsg;
449
450 if (!FormatMessageW(
453 (bInetError ? GetModuleHandleW(L"wininet.dll") : NULL), dwLastError, LANG_USER_DEFAULT, (LPWSTR)&lpMsg, 0,
454 NULL))
455 {
456 DPRINT1("FormatMessageW unexpected failure (err %d)\n", GetLastError());
457 return FALSE;
458 }
459
460 if (hWndOwner && !IsWindowVisible(hWndOwner))
461 hWndOwner = NULL;
462 MessageBoxW(hWndOwner, lpMsg, NULL, MB_OK | MB_ICONERROR);
463 return TRUE;
464}
465
466// Download dialog (loaddlg.cpp)
468
470 public CComCoClass<CDownloadManager, &CLSID_NULL>,
471 public CComObjectRootEx<CComMultiThreadModelNoCS>,
472 public IUnknown
473{
474public:
475 enum {
476 WM_ISCANCELLED = WM_APP, // Return BOOL
477 WM_SETSTATUS, // wParam DownloadStatus
478 WM_GETINSTANCE, // Return CDownloadManager*
479 WM_GETNEXT, // Return DownloadInfo* or NULL
480 };
481
483
484 static CDownloadManager*
486 {
487 if (!(Flags & DAF_MODAL))
488 {
490 if (pExisting)
491 {
492 pExisting->AddRef();
493 return pExisting;
494 }
495 }
497 if (FAILED(ShellObjectCreator(obj)))
498 return NULL;
499 obj->m_fDaf = Flags;
500 obj->m_bModal = !!(Flags & DAF_MODAL);
501 return obj.Detach();
502 }
503
504 static BOOL
506 {
508 if (!p)
509 return FALSE;
510 Obj.Attach(p);
511 return TRUE;
512 }
513
514 static CDownloadManager*
516 {
519 return NULL;
520 }
521
522 BOOL
524 {
526 }
527
528 BOOL
530 {
531 return m_fDaf & DAF_SILENT;
532 }
533
534 void StartWorkerThread();
535 void Add(const DownloadInfo &Info);
536 void Show();
539 void UpdateProgress(ULONG ulProgress, ULONG ulProgressMax);
540 static unsigned int CALLBACK ThreadFunc(void*ThreadParam);
542
547
559};
560
561void
563{
564 AddRef(); // To keep m_List alive in thread
565 unsigned int ThreadId;
566 HANDLE Thread = (HANDLE)_beginthreadex(NULL, 0, ThreadFunc, this, 0, &ThreadId);
567 if (Thread)
569 else
570 Release();
571}
572
573void
575{
576 const UINT count = m_List.GetSize(), start = count;
577 for (UINT i = 0; i < count; ++i)
578 {
579 if (Info.Equal(m_List[i]))
580 return; // Already in the list
581 }
582 m_List.Add(Info);
583 if (m_hDlg)
585}
586
587void
589{
590 HWND hDlg = NULL;
591 const BOOL bSilent = IsSilentDialog(), bModal = m_bModal;
592 if (bModal && !bSilent)
594 else if (!m_hDlg || !IsWindow(m_hDlg))
596
597 // A DialogBox dialog cannot be invisible, it is forced visible after WM_INITDIALOG returns.
598 // We therefore use a modeless dialog when we are both modal and silent.
599 for (MSG msg; bModal && bSilent && hDlg && GetMessageW(&msg, NULL, 0, 0);)
601}
602
605{
607 if (!pThis)
608 {
609 if (uMsg != WM_INITDIALOG)
610 return FALSE;
612 pThis = (CDownloadManager*)lParam;
613 }
614 return pThis->RealDlgProc(hDlg, uMsg, wParam, lParam);
615}
616
619{
620 switch (uMsg)
621 {
622 case WM_INITDIALOG:
623 {
624 g_Busy++;
625 AddRef();
626 m_hDlg = hDlg;
627 if (!m_bModal)
628 g_hDownloadWnd = hDlg;
629
630 HICON hIconSm, hIconBg;
631 if (hMainWnd)
632 {
635 }
636 if (!hMainWnd || (!hIconBg || !hIconSm))
637 {
639 }
640 SendMessageW(hDlg, WM_SETICON, ICON_BIG, (LPARAM)hIconBg);
641 SendMessageW(hDlg, WM_SETICON, ICON_SMALL, (LPARAM)hIconSm);
642
646 buf.Replace(L"%ls", L"");
647 SetWindowTextW(hDlg, buf); // "Downloading..."
648
650 if (hItem)
651 {
652 // initialize the default values for our nifty progress bar
653 // and subclass it so that it learns to print a status text
655 m_ProgressBar.SendMessageW(PBM_SETRANGE, 0, MAKELPARAM(0, 100));
656 m_ProgressBar.SendMessageW(PBM_SETPOS, 0, 0);
657 if (m_List.GetSize() > 0)
658 m_ProgressBar.SetProgress(0, m_List[0].SizeInBytes);
659 }
660
661 if (!m_ListView.Create(hDlg))
662 return FALSE;
664
667 return TRUE;
668 }
669
670 case WM_COMMAND:
671 if (LOWORD(wParam) == IDCANCEL)
672 {
674 PostMessageW(hDlg, WM_CLOSE, 0, 0);
675 }
676 return FALSE;
677
678 case WM_CLOSE:
680 if (m_ProgressBar)
682 return m_bModal && !IsSilentDialog() ? ::EndDialog(hDlg, 0) : ::DestroyWindow(hDlg);
683
684 case WM_DESTROY:
685 if (g_hDownloadWnd == hDlg)
687 g_Busy--;
688 if (hMainWnd)
690 if (m_bModal && IsSilentDialog())
692 Release();
693 break;
694
695 case WM_ISCANCELLED:
696 return SetDlgMsgResult(hDlg, uMsg, m_bCancelled);
697
698 case WM_SETSTATUS:
700 break;
701
702 case WM_GETINSTANCE:
703 return SetDlgMsgResult(hDlg, uMsg, (INT_PTR)this);
704
705 case WM_GETNEXT:
706 {
707 DownloadInfo *pItem = NULL;
709 pItem = &m_List[m_Index++];
710 return SetDlgMsgResult(hDlg, uMsg, (INT_PTR)pItem);
711 }
712 }
713 return FALSE;
714}
715
716void
718{
719 m_ProgressBar.SetProgress(ulProgress, ulProgressMax);
720}
721
722unsigned int CALLBACK
724{
725 CDownloadManager *pThis = (CDownloadManager*)ThreadParam;
726 HWND hDlg = pThis->m_hDlg;
727 for (;;)
728 {
729 DownloadInfo *pItem = (DownloadInfo*)SendMessageW(hDlg, WM_GETNEXT, 0, 0);
730 if (!pItem)
731 break;
732 pThis->PerformDownloadAndInstall(*pItem);
733 }
734 SendMessageW(hDlg, WM_CLOSE, 0, 0);
735 return pThis->Release();
736}
737
738void
740{
741 const HWND hDlg = m_hDlg;
744
746 m_ProgressBar.SendMessageW(PBM_SETPOS, 0, 0);
747 m_ProgressBar.SetProgress(0, Info.SizeInBytes);
748
750 CPathW Path;
751 PCWSTR p;
752
753 ULONG dwContentLen, dwBytesWritten, dwBytesRead, dwStatus, dwStatusLen;
754 ULONG dwCurrentBytesRead = 0;
755 BOOL bTempfile = FALSE, bCancelled = FALSE;
756
757 HINTERNET hOpen = NULL;
760
761
762 LPCWSTR lpszAgent = L"RApps/1.1";
763 const DWORD dwUrlConnectFlags =
765 URL_COMPONENTSW urlComponents;
766 size_t urlLength;
767 unsigned char lpBuffer[4096];
768
769 // Change caption to show the currently downloaded app
770 switch (Info.DLType)
771 {
773 str.Format(m_szCaptionFmt, Info.szName.GetString());
774 break;
775 case DLTYPE_DBUPDATE:
777 break;
780 break;
781 }
782 SetWindowTextW(hDlg, str);
783
784 // is this URL an update package for RAPPS? if so store it in a different place
785 if (Info.DLType != DLTYPE_APPLICATION)
786 {
788 {
790 goto end;
791 }
792 }
793 else
794 {
796 }
797
798 // build the path for the download
799 p = wcsrchr(Info.szUrl.GetString(), L'/');
800
801 // do we have a final slash separator?
802 if (!p)
803 {
805 goto end;
806 }
807
808 // is the path valid? can we access it?
810 {
812 {
814 goto end;
815 }
816 }
817
818 switch (Info.DLType)
819 {
820 case DLTYPE_DBUPDATE:
823 break;
825 {
826 CStringW name = Info.szFileName;
827 if (name.IsEmpty())
828 name = p + 1; // use the filename retrieved from URL
830 Path += name;
831 break;
832 }
833 }
834
835 if ((Info.DLType == DLTYPE_APPLICATION) && Info.szSHA1[0] &&
837 {
838 // only open it in case of total correctness
839 if (VerifyInteg(Info.szSHA1.GetString(), Path))
840 goto run;
841 }
842
843 // Download it
845 /* FIXME: this should just be using the system-wide proxy settings */
846 switch (SettingsInfo.Proxy)
847 {
848 case 0: // preconfig
849 default:
850 hOpen = InternetOpenW(lpszAgent, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
851 break;
852 case 1: // direct (no proxy)
853 hOpen = InternetOpenW(lpszAgent, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
854 break;
855 case 2: // use proxy
856 hOpen = InternetOpenW(
858 break;
859 }
860
861 if (!hOpen)
862 {
864 goto end;
865 }
866
867 bTempfile = TRUE;
868 dwContentLen = 0;
869 dwStatusLen = sizeof(dwStatus);
870 ZeroMemory(&urlComponents, sizeof(urlComponents));
871 urlComponents.dwStructSize = sizeof(urlComponents);
872
873 urlLength = Info.szUrl.GetLength();
874 urlComponents.dwSchemeLength = urlLength + 1;
875 urlComponents.lpszScheme = (LPWSTR)malloc(urlComponents.dwSchemeLength * sizeof(WCHAR));
876
877 if (!InternetCrackUrlW(Info.szUrl, urlLength + 1, ICU_DECODE | ICU_ESCAPE, &urlComponents))
878 {
880 goto end;
881 }
882
883 if (urlComponents.nScheme == INTERNET_SCHEME_HTTP || urlComponents.nScheme == INTERNET_SCHEME_HTTPS)
884 {
885 hFile = InternetOpenUrlW(hOpen, Info.szUrl, NULL, 0, dwUrlConnectFlags, 0);
886 if (!hFile)
887 {
889 {
890 /* Workaround for CORE-17377 */
892 }
893 goto end;
894 }
895
896 // query connection
898 {
900 goto end;
901 }
902
904 {
906 goto end;
907 }
908
909 // query content length
911 }
912 else if (urlComponents.nScheme == INTERNET_SCHEME_FTP)
913 {
914 // force passive mode on FTP
915 hFile =
916 InternetOpenUrlW(hOpen, Info.szUrl, NULL, 0, dwUrlConnectFlags | INTERNET_FLAG_PASSIVE, 0);
917 if (!hFile)
918 {
920 {
921 /* Workaround for CORE-17377 */
923 }
924 goto end;
925 }
926
927 dwContentLen = FtpGetFileSize(hFile, &dwStatus);
928 }
929 else if (urlComponents.nScheme == INTERNET_SCHEME_FILE)
930 {
931 // Add support for the file scheme so testing locally is simpler
932 WCHAR LocalFilePath[MAX_PATH];
933 DWORD cchPath = _countof(LocalFilePath);
934 // Ideally we would use PathCreateFromUrlAlloc here, but that is not exported (yet)
935 HRESULT hr = PathCreateFromUrlW(Info.szUrl, LocalFilePath, &cchPath, 0);
936 if (SUCCEEDED(hr))
937 {
938 if (CopyFileW(LocalFilePath, Path, FALSE))
939 {
940 goto run;
941 }
942 else
943 {
945 goto end;
946 }
947 }
948 else
949 {
951 goto end;
952 }
953 }
954
955 if (!dwContentLen)
956 {
957 // Someone was nice enough to add this, let's use it
958 if (Info.SizeInBytes)
959 {
960 dwContentLen = Info.SizeInBytes;
961 }
962 else
963 {
964 // content-length is not known, enable marquee mode
966 }
967 }
968
969 free(urlComponents.lpszScheme);
970
971#ifdef USE_CERT_PINNING
972 // are we using HTTPS to download the RAPPS update package? check if the certificate is original
973 if ((urlComponents.nScheme == INTERNET_SCHEME_HTTPS) && (Info.DLType == DLTYPE_DBUPDATE))
974 {
975 CLocalPtr<char> subjectName, issuerName;
976 CStringA szMsgText;
977 bool bAskQuestion = false;
978 if (!CertGetSubjectAndIssuer(hFile, subjectName, issuerName))
979 {
980 szMsgText.LoadStringW(IDS_UNABLE_TO_QUERY_CERT);
981 bAskQuestion = true;
982 }
983 else if (!IsTrustedPinnedCert(subjectName, issuerName))
984 {
985 szMsgText.Format(IDS_MISMATCH_CERT_INFO, (LPCSTR)subjectName, (LPCSTR)issuerName);
986 bAskQuestion = true;
987 }
988
989 if (bAskQuestion)
990 {
991 if (MessageBoxA(hDlg, szMsgText, NULL, MB_YESNO | MB_ICONERROR) != IDYES)
992 {
993 goto end;
994 }
995 }
996 }
997#endif
998
1000 if (hOut == INVALID_HANDLE_VALUE)
1001 {
1003 goto end;
1004 }
1005
1006 dwCurrentBytesRead = 0;
1007 do
1008 {
1009 bCancelled = IsCancelled();
1010 if (bCancelled)
1011 break;
1012
1013 if (!InternetReadFile(hFile, lpBuffer, _countof(lpBuffer), &dwBytesRead))
1014 {
1016 goto end;
1017 }
1018
1019 if (!WriteFile(hOut, &lpBuffer[0], dwBytesRead, &dwBytesWritten, NULL))
1020 {
1022 goto end;
1023 }
1024
1025 dwCurrentBytesRead += dwBytesRead;
1026 UpdateProgress(dwCurrentBytesRead, dwContentLen);
1027
1028 } while (dwBytesRead);
1029
1030 CloseHandle(hOut);
1031 hOut = INVALID_HANDLE_VALUE;
1032
1033 if (bCancelled)
1034 {
1035 DPRINT1("Operation cancelled\n");
1036 goto end;
1037 }
1038
1039 if (!dwContentLen)
1040 {
1041 // set progress bar to 100%
1043
1044 dwContentLen = dwCurrentBytesRead;
1045 UpdateProgress(dwCurrentBytesRead, dwContentLen);
1046 }
1047
1048 /* if this thing isn't a RAPPS update and it has a SHA-1 checksum
1049 verify its integrity by using the native advapi32.A_SHA1 functions */
1050 if ((Info.DLType == DLTYPE_APPLICATION) && Info.szSHA1[0] != 0)
1051 {
1052 CStringW szMsgText;
1053
1054 // change a few strings in the download dialog to reflect the verification process
1055 if (!szMsgText.LoadStringW(IDS_INTEG_CHECK_TITLE))
1056 {
1057 DPRINT1("Unable to load string\n");
1058 goto end;
1059 }
1060
1061 SetWindowTextW(hDlg, szMsgText);
1063
1064 // this may take a while, depending on the file size
1065 if (!VerifyInteg(Info.szSHA1, Path))
1066 {
1067 if (!szMsgText.LoadStringW(IDS_INTEG_CHECK_FAIL))
1068 {
1069 DPRINT1("Unable to load string\n");
1070 goto end;
1071 }
1072
1073 MessageBoxW(hDlg, szMsgText, NULL, MB_OK | MB_ICONERROR);
1074 goto end;
1075 }
1076 }
1077
1078run:
1080
1081 // run it
1082 if (Info.DLType == DLTYPE_APPLICATION)
1083 {
1084 BOOL bSilentInstall = Info.Flags & DAF_SILENT;
1085 CStringW app, params, tempdir;
1086 SHELLEXECUTEINFOW shExInfo = { sizeof(shExInfo), SEE_MASK_NOCLOSEPROCESS, hDlg };
1087 shExInfo.lpVerb = L"open";
1088 shExInfo.lpFile = Path;
1089 shExInfo.lpParameters = L"";
1090 shExInfo.nShow = SW_SHOW;
1091
1092 if (Info.IType == INSTALLER_GENERATE)
1093 {
1094 params = L"/" CMD_KEY_GENINST + CStringW(bSilentInstall ? L" /S" : L"") +
1095 L" \"" + Info.szPackageName + L"\" \"" + shExInfo.lpFile + L"\"";
1096 shExInfo.lpParameters = params;
1097 shExInfo.lpFile = app.GetBuffer(MAX_PATH);
1098 GetModuleFileNameW(NULL, const_cast<LPWSTR>(shExInfo.lpFile), MAX_PATH);
1099 app.ReleaseBuffer();
1100 }
1101 else if (Info.IType == INSTALLER_EXEINZIP)
1102 {
1103 HRESULT hr = ExtractArchiveForExecution(Path, Info.szPackageName, tempdir, app);
1104 if (FAILED(hr))
1105 {
1106 ShowLastError(hDlg, FALSE, hr);
1107 goto end;
1108 }
1109 shExInfo.lpFile = app;
1110 }
1111
1112 if (bSilentInstall)
1113 {
1114 if (!Info.szSilentInstallArgs.IsEmpty())
1115 {
1116 // The package wants to force specific parameters
1117 shExInfo.lpParameters = Info.szSilentInstallArgs.GetString();
1118 }
1119 else
1120 {
1121 UINT extrainfo = 0;
1122 InstallerType it = Info.IExecType;
1123
1124 if (it == INSTALLER_UNKNOWN || it == INSTALLER_EXEINZIP)
1125 it = GuessInstallerType(shExInfo.lpFile, extrainfo);
1126
1127 if (GetSilentInstallParameters(it, extrainfo, shExInfo.lpFile, params))
1128 {
1129 shExInfo.lpParameters = params;
1130 if (it == INSTALLER_MSI)
1131 shExInfo.lpFile = L"msiexec.exe"; // params contains the .msi path
1132 }
1133 }
1134 }
1135
1136 /* FIXME: Do we want to log installer status? */
1137 WriteLogMessage(EVENTLOG_SUCCESS, MSG_SUCCESS_INSTALL, Info.szName);
1138
1139 if (ShellExecuteExW(&shExInfo))
1140 {
1141 // reflect installation progress in the titlebar
1142 // TODO: make a separate string with a placeholder to include app name?
1144 SetWindowTextW(hDlg, szMsgText);
1145
1147
1148 // TODO: issue an install operation separately so that the apps could be downloaded in the background
1149 if (shExInfo.hProcess)
1150 {
1152 CloseHandle(shExInfo.hProcess);
1154 }
1155 }
1156 else
1157 {
1159 }
1160
1161 if (!tempdir.IsEmpty())
1162 {
1163 DeleteDirectoryTree(tempdir, hDlg);
1164 }
1165 }
1166
1167end:
1168 if (hOut != INVALID_HANDLE_VALUE)
1169 CloseHandle(hOut);
1170
1171 if (hFile)
1173 InternetCloseHandle(hOpen);
1174
1175 if (bTempfile)
1176 {
1177 if (bCancelled || (SettingsInfo.bDelInstaller && Info.DLType == DLTYPE_APPLICATION))
1178 {
1179 // Don't delete .zip/.cab files so the user can extract from them
1180 if (bCancelled || Info.IType == INSTALLER_GENERATE || Info.IType == INSTALLER_EXEINZIP ||
1182 {
1184 }
1185 }
1186 }
1187
1189}
1190
1191BOOL
1193{
1194 if (AppsList.IsEmpty())
1195 return FALSE;
1196
1199 return FALSE;
1200
1201 for (POSITION it = AppsList.GetHeadPosition(); it;)
1202 {
1203 const CAppInfo *Info = AppsList.GetNext(it);
1204 pDM->Add(DownloadInfo(*Info, Flags));
1205 }
1206 pDM->Show();
1207 return TRUE;
1208}
1209
1210BOOL
1212{
1213 if (!pAppInfo)
1214 return FALSE;
1215
1217 list.AddTail(pAppInfo);
1219}
1220
1221VOID
1223{
1226 return;
1227
1228 DownloadInfo DatabaseDLInfo;
1229 DatabaseDLInfo.szUrl = lpUrl;
1230 DatabaseDLInfo.szName.LoadStringW(IDS_DL_DIALOG_DB_DISP);
1231 DatabaseDLInfo.DLType = IsOfficial ? DLTYPE_DBUPDATE : DLTYPE_DBUPDATE_UNOFFICIAL;
1232
1233 pDM->Add(DatabaseDLInfo);
1234 pDM->Show();
1235}
static HDC hDC
Definition: 3dtext.c:33
PRTL_UNICODE_STRING_BUFFER Path
int strcmp(const char *String1, const char *String2)
Definition: utclib.c:469
Arabic default style
Definition: afstyles.h:94
#define DB_SAVEAS
Definition: appinfo.h:99
InstallerType
Definition: appinfo.h:82
@ INSTALLER_UNKNOWN
Definition: appinfo.h:83
@ INSTALLER_EXEINZIP
Definition: appinfo.h:84
@ INSTALLER_GENERATE
Definition: appinfo.h:85
@ INSTALLER_MSI
Definition: appinfo.h:86
#define msg(x)
Definition: auth_time.c:54
HWND hWnd
Definition: settings.c:17
#define IDI_MAIN
Definition: resource.h:4
#define APPLICATION_DATABASE_NAME
Definition: defines.h:41
BOOL WriteLogMessage(WORD wType, DWORD dwEventID, LPCWSTR lpMsg)
Definition: misc.cpp:319
BOOL GetStorageDirectory(CStringW &lpDirectory)
Definition: misc.cpp:237
BOOL OpensWithExplorer(PCWSTR Path)
Definition: misc.cpp:162
BOOL GetSilentInstallParameters(InstallerType InstallerType, UINT ExtraInfo, LPCWSTR Installer, CStringW &Parameters)
Definition: misc.cpp:674
BOOL DeleteDirectoryTree(LPCWSTR Dir, HWND hwnd=NULL)
Definition: misc.cpp:513
UINT ClassifyFile(PCWSTR Path)
Definition: misc.cpp:125
InstallerType GuessInstallerType(LPCWSTR Installer, UINT &ExtraInfo)
Definition: misc.cpp:597
#define IDD_DOWNLOAD_DIALOG
Definition: resource.h:66
#define IDS_UNABLE_TO_DOWNLOAD
Definition: resource.h:115
#define IDS_MISMATCH_CERT_INFO
Definition: resource.h:125
#define IDS_STATUS_FINISHED
Definition: resource.h:211
#define IDS_STATUS_WAITING
Definition: resource.h:210
#define IDS_DL_DIALOG_DB_DISP
Definition: resource.h:227
#define IDS_STATUS_INSTALLING
Definition: resource.h:209
#define IDS_UNABLE_TO_DOWNLOAD2
Definition: resource.h:116
#define IDC_DOWNLOAD_PROGRESS
Definition: resource.h:42
#define IDS_UNABLE_PATH
Definition: resource.h:126
#define IDS_STATUS_DOWNLOADED
Definition: resource.h:206
#define IDS_STATUS_DOWNLOADING
Definition: resource.h:208
#define IDS_UNABLE_TO_QUERY_CERT
Definition: resource.h:117
#define IDC_DOWNLOAD_STATUS
Definition: resource.h:43
#define IDS_STATUS_INSTALLED
Definition: resource.h:204
#define IDS_INTEG_CHECK_TITLE
Definition: resource.h:118
#define IDS_DL_DIALOG_DB_DOWNLOAD_DISP
Definition: resource.h:228
#define IDS_INTEG_CHECK_FAIL
Definition: resource.h:119
#define IDS_DL_DIALOG_DB_UNOFFICIAL_DOWNLOAD_DISP
Definition: resource.h:229
SETTINGS_INFO SettingsInfo
Definition: winmain.cpp:21
#define DPRINT1
Definition: precomp.h:8
bool IsEmpty() const
Definition: atlcoll.h:548
POSITION GetHeadPosition() const
Definition: atlcoll.h:554
E & GetNext(_Inout_ POSITION &pos)
Definition: atlcoll.h:566
int GetSize() const
Definition: atlsimpcoll.h:104
BOOL Add(const T &t)
Definition: atlsimpcoll.h:58
bool IsEmpty() const noexcept
Definition: atlsimpstr.h:394
void ReleaseBuffer(_In_ int nNewLength=-1)
Definition: atlsimpstr.h:387
PXSTR GetString() noexcept
Definition: atlsimpstr.h:367
int GetLength() const noexcept
Definition: atlsimpstr.h:362
void Empty() noexcept
Definition: atlsimpstr.h:253
void __cdecl Format(UINT nFormatID,...)
Definition: cstringt.h:818
BOOL SubclassWindow(HWND hWnd)
Definition: atlwin.h:1552
HWND UnsubclassWindow(BOOL bForce=FALSE)
Definition: atlwin.h:1575
BOOL ModifyStyle(DWORD dwRemove, DWORD dwAdd, UINT nFlags=0)
Definition: atlwin.h:1008
BOOL IsWindow() const
Definition: atlwin.h:947
virtual VOID GetDownloadInfo(CStringW &Url, CStringW &Sha1, ULONG &SizeInBytes) const =0
CStringW szDisplayName
Definition: appinfo.h:121
virtual InstallerType GetInstallerInfo(CStringW &SilentParameters) const
Definition: appinfo.h:142
virtual InstallerType GetInstallerType(bool NestedType=false) const
Definition: appinfo.h:140
const CStringW szIdentifier
Definition: appinfo.h:117
BOOL GetString(const CStringW &KeyName, CStringW &ResultString)
HWND Create(HWND hwndParent)
Definition: loaddlg.cpp:322
VOID SetDownloadStatus(INT ItemIndex, DownloadStatus Status)
Definition: loaddlg.cpp:352
VOID AddRow(INT RowIndex, LPCWSTR szAppName, const DownloadStatus Status)
Definition: loaddlg.cpp:373
BOOL AddColumn(INT Index, INT Width, INT Format)
Definition: loaddlg.cpp:381
VOID LoadList(ATL::CSimpleArray< DownloadInfo > arrInfo, UINT Start=0)
Definition: loaddlg.cpp:342
BOOL AddItem(INT ItemIndex, LPWSTR lpText)
Definition: loaddlg.cpp:359
static INT_PTR CALLBACK DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: loaddlg.cpp:604
void PerformDownloadAndInstall(const DownloadInfo &Info)
Definition: loaddlg.cpp:739
static CDownloadManager * FindInstance()
Definition: loaddlg.cpp:515
void UpdateProgress(ULONG ulProgress, ULONG ulProgressMax)
Definition: loaddlg.cpp:717
static unsigned int CALLBACK ThreadFunc(void *ThreadParam)
Definition: loaddlg.cpp:723
WCHAR m_szCaptionFmt[100]
Definition: loaddlg.cpp:555
CDownloaderProgress m_ProgressBar
Definition: loaddlg.cpp:558
BOOL IsSilentDialog()
Definition: loaddlg.cpp:529
static CDownloadManager * CreateInstanceHelper(UINT Flags)
Definition: loaddlg.cpp:485
void StartWorkerThread()
Definition: loaddlg.cpp:562
ATL::CSimpleArray< DownloadInfo > m_List
Definition: loaddlg.cpp:556
BOOL IsCancelled()
Definition: loaddlg.cpp:523
CDowloadingAppsListView m_ListView
Definition: loaddlg.cpp:557
INT_PTR RealDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: loaddlg.cpp:618
static BOOL CreateInstance(BOOL Modal, CComPtr< CDownloadManager > &Obj)
Definition: loaddlg.cpp:505
void Add(const DownloadInfo &Info)
Definition: loaddlg.cpp:574
VOID SetMarquee(BOOL Enable)
Definition: loaddlg.cpp:183
VOID SetProgress(ULONG ulProgress, ULONG ulProgressMax)
Definition: loaddlg.cpp:194
CStringW m_szProgressText
Definition: loaddlg.cpp:175
LRESULT OnEraseBkgnd(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: loaddlg.cpp:239
LRESULT OnSetText(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: loaddlg.cpp:289
LRESULT OnPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: loaddlg.cpp:245
void Attach(T *lp)
Definition: atlalloc.h:162
int InsertItem(const LV_ITEM *pitem)
Definition: rosctrls.h:96
int GetItemCount()
Definition: rosctrls.h:121
int InsertColumn(int iCol, LV_COLUMN *pcol)
Definition: rosctrls.h:52
BOOL SetItemText(int i, int subItem, LPCWSTR text)
Definition: rosctrls.h:186
HWND Create(HWND hWndParent, _U_RECT rect, LPCTSTR szWindowName=NULL, DWORD dwStyle=0, DWORD dwExStyle=0, _U_MENUorID MenuOrID=0U, LPVOID lpCreateParam=NULL)
Definition: rosctrls.h:8
Definition: list.h:37
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
int WINAPI DrawShadowText(HDC hdc, LPCWSTR pszText, UINT cch, RECT *prc, DWORD dwFlags, COLORREF crText, COLORREF crShadow, int ixOffset, int iyOffset)
Definition: commctrl.c:1856
static HWND hwndParent
Definition: cryptui.c:300
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
DLGPROC DlgProc
Definition: desk.c:122
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
LPSTR WINAPI StrStrA(LPCSTR lpszStr, LPCSTR lpszSearch)
Definition: string.c:578
#define CloseHandle
Definition: compat.h:739
#define wcsrchr
Definition: compat.h:16
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define MAX_PATH
Definition: compat.h:34
#define CreateFileW
Definition: compat.h:741
#define CALLBACK
Definition: compat.h:35
#define FILE_SHARE_READ
Definition: compat.h:136
BOOL WINAPI CopyFileW(IN LPCWSTR lpExistingFileName, IN LPCWSTR lpNewFileName, IN BOOL bFailIfExists)
Definition: copy.c:439
BOOL WINAPI DeleteFileW(IN LPCWSTR lpFileName)
Definition: delete.c:39
BOOL WINAPI CreateDirectoryW(IN LPCWSTR lpPathName, IN LPSECURITY_ATTRIBUTES lpSecurityAttributes)
Definition: dir.c:90
DWORD WINAPI GetFileAttributesW(LPCWSTR lpFileName)
Definition: fileinfo.c:652
BOOL WINAPI WriteFile(IN HANDLE hFile, IN LPCVOID lpBuffer, IN DWORD nNumberOfBytesToWrite OPTIONAL, OUT LPDWORD lpNumberOfBytesWritten, IN LPOVERLAPPED lpOverlapped OPTIONAL)
Definition: rw.c:24
DWORD WINAPI GetModuleFileNameW(HINSTANCE hModule, LPWSTR lpFilename, DWORD nSize)
Definition: loader.c:600
HMODULE WINAPI GetModuleHandleW(LPCWSTR lpModuleName)
Definition: loader.c:838
DWORD WINAPI FormatMessageW(DWORD dwFlags, LPCVOID lpSource, DWORD dwMessageId, DWORD dwLanguageId, LPWSTR lpBuffer, DWORD nSize, __ms_va_list *args)
Definition: format_msg.c:583
int WINAPI lstrcmpW(LPCWSTR str1, LPCWSTR str2)
Definition: locale.c:4246
HRESULT WINAPI UrlUnescapeW(WCHAR *url, WCHAR *unescaped, DWORD *unescaped_len, DWORD flags)
Definition: path.c:2936
HRESULT WINAPI PathCreateFromUrlW(const WCHAR *url, WCHAR *path, DWORD *pcchPath, DWORD dwReserved)
Definition: path.c:3073
BOOL WINAPI PathIsValidCharW(WCHAR c, DWORD class)
Definition: path.c:2221
LPWSTR WINAPI StrFormatByteSizeW(LONGLONG llBytes, LPWSTR lpszDest, UINT cchMax)
Definition: string.c:2394
DWORD WINAPI FtpGetFileSize(HINTERNET hFile, LPDWORD lpdwFileSizeHigh)
Definition: ftp.c:1757
BOOL WINAPI HttpQueryInfoW(HINTERNET hHttpRequest, DWORD dwInfoLevel, LPVOID lpBuffer, LPDWORD lpdwBufferLength, LPDWORD lpdwIndex)
Definition: http.c:3870
BOOL WINAPI InternetQueryOptionA(HINTERNET hInternet, DWORD dwOption, LPVOID lpBuffer, LPDWORD lpdwBufferLength)
Definition: internet.c:2730
BOOL WINAPI InternetCrackUrlW(const WCHAR *lpszUrl, DWORD dwUrlLength, DWORD dwFlags, URL_COMPONENTSW *lpUC)
Definition: internet.c:1625
BOOL WINAPI InternetCanonicalizeUrlW(LPCWSTR lpszUrl, LPWSTR lpszBuffer, LPDWORD lpdwBufferLength, DWORD dwFlags)
Definition: internet.c:2004
BOOL WINAPI InternetReadFile(HINTERNET hFile, LPVOID lpBuffer, DWORD dwNumOfBytesToRead, LPDWORD pdwNumOfBytesRead)
Definition: internet.c:2154
HINTERNET WINAPI InternetOpenUrlW(HINTERNET hInternet, LPCWSTR lpszUrl, LPCWSTR lpszHeaders, DWORD dwHeadersLength, DWORD dwFlags, DWORD_PTR dwContext)
Definition: internet.c:3722
BOOL WINAPI InternetCloseHandle(HINTERNET hInternet)
Definition: internet.c:1414
HINTERNET WINAPI InternetOpenW(LPCWSTR lpszAgent, DWORD dwAccessType, LPCWSTR lpszProxy, LPCWSTR lpszProxyBypass, DWORD dwFlags)
Definition: internet.c:979
static VOID BitBlt(_In_ ULONG Left, _In_ ULONG Top, _In_ ULONG Width, _In_ ULONG Height, _In_reads_bytes_(Delta *Height) PUCHAR Buffer, _In_ ULONG BitsPerPixel, _In_ ULONG Delta)
Definition: common.c:57
#define L(x)
Definition: resources.c:13
#define INFINITE
Definition: serial.h:102
HINSTANCE hInst
Definition: dxdiag.c:13
#define WM_APP
Definition: eventvwr.h:73
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
_In_opt_ PFILE_OBJECT _In_opt_ PETHREAD Thread
Definition: fltkernel.h:2653
return pTarget Start()
pKey DeleteObject()
Status
Definition: gdiplustypes.h:25
HRESULT ExtractArchiveForExecution(PCWSTR pszArchive, const CStringW &PackageName, CStringW &TempDir, CStringW &App)
Definition: geninst.cpp:850
GLuint start
Definition: gl.h:1545
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLuint GLuint end
Definition: gl.h:1545
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
GLsizeiptr size
Definition: glext.h:5919
GLenum const GLfloat * params
Definition: glext.h:5645
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLbitfield flags
Definition: glext.h:7161
GLfloat GLfloat p
Definition: glext.h:8902
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
HLOCAL NTAPI LocalFree(HLOCAL hMem)
Definition: heapmem.c:1594
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
ULONG AddRef()
ULONG Release()
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
#define HIBYTE(W)
Definition: jmemdos.c:486
#define BEGIN_COM_MAP(x)
Definition: atlcom.h:581
#define DECLARE_NOT_AGGREGATABLE(x)
Definition: atlcom.h:651
#define END_COM_MAP()
Definition: atlcom.h:592
#define DECLARE_NO_REGISTRY()
Definition: atlcom.h:639
#define MESSAGE_HANDLER(msg, func)
Definition: atlwin.h:1926
#define BEGIN_MSG_MAP(theClass)
Definition: atlwin.h:1898
#define END_MSG_MAP()
Definition: atlwin.h:1917
BOOL DownloadApplication(CAppInfo *pAppInfo)
Definition: loaddlg.cpp:1211
static void SetFriendlyUrl(HWND hWnd, LPCWSTR pszUrl)
Definition: loaddlg.cpp:123
HWND g_hDownloadWnd
Definition: loaddlg.cpp:467
VOID UrlUnescapeAndMakeFileNameValid(CStringW &str)
Definition: loaddlg.cpp:107
BOOL DownloadListOfApplications(const CAtlList< CAppInfo * > &AppsList, UINT Flags)
Definition: loaddlg.cpp:1192
static VOID MessageBox_LoadString(HWND hOwnerWnd, INT StringID)
Definition: loaddlg.cpp:436
DownloadStatus
Definition: loaddlg.cpp:81
@ DLSTATUS_DOWNLOADING
Definition: loaddlg.cpp:83
@ DLSTATUS_FINISHED
Definition: loaddlg.cpp:87
@ DLSTATUS_WAITING_INSTALL
Definition: loaddlg.cpp:84
@ DLSTATUS_WAITING
Definition: loaddlg.cpp:82
@ DLSTATUS_INSTALLED
Definition: loaddlg.cpp:86
@ DLSTATUS_INSTALLING
Definition: loaddlg.cpp:85
static BOOL ShowLastError(HWND hWndOwner, BOOL bInetError, DWORD dwLastError)
Definition: loaddlg.cpp:446
CStringW LoadStatusString(DownloadStatus StatusParam)
Definition: loaddlg.cpp:91
#define FILENAME_VALID_CHAR
Definition: loaddlg.cpp:98
DownloadType
Definition: loaddlg.cpp:74
@ DLTYPE_DBUPDATE_UNOFFICIAL
Definition: loaddlg.cpp:77
@ DLTYPE_DBUPDATE
Definition: loaddlg.cpp:76
@ DLTYPE_APPLICATION
Definition: loaddlg.cpp:75
VOID DownloadApplicationsDB(LPCWSTR lpUrl, BOOL IsOfficial)
Definition: loaddlg.cpp:1222
HWND hMainWnd
Definition: magnifier.c:32
#define ZeroMemory
Definition: minwinbase.h:31
LONG_PTR LPARAM
Definition: minwindef.h:175
LONG_PTR LRESULT
Definition: minwindef.h:176
UINT_PTR WPARAM
Definition: minwindef.h:174
#define pch(ap)
Definition: match.c:418
#define CREATE_ALWAYS
Definition: disk.h:72
LPCWSTR szPath
Definition: env.c:37
static HBITMAP
Definition: button.c:44
static HDC
Definition: imagelist.c:88
static HICON
Definition: imagelist.c:80
static BYTE subjectName[]
Definition: cert.c:35
static BOOL protected
Definition: protectdata.c:33
int other
Definition: msacm.c:1376
HICON hIconSm
Definition: msconfig.c:44
_In_ HANDLE hFile
Definition: mswsock.h:90
Definition: rosdlgs.h:6
CAtlStringW CStringW
Definition: atlstr.h:130
unsigned int UINT
Definition: ndis.h:50
_Out_ LPWSTR lpBuffer
Definition: netsh.h:68
#define FILE_SHARE_WRITE
Definition: nt_native.h:681
#define DWORD
Definition: nt_native.h:44
#define GENERIC_WRITE
Definition: nt_native.h:90
_In_ ULONGLONG _In_ ULONGLONG _In_ BOOLEAN Enable
Definition: ntddpcm.h:142
#define LOWORD(l)
Definition: pedump.c:82
#define WS_CHILD
Definition: pedump.c:617
#define WS_VISIBLE
Definition: pedump.c:620
static const WCHAR szName[]
Definition: powrprof.c:45
#define LVS_SINGLESEL
Definition: commctrl.h:2271
#define LVS_NOCOLUMNHEADER
Definition: commctrl.h:2289
#define PBS_MARQUEE
Definition: commctrl.h:2203
#define LVIF_STATE
Definition: commctrl.h:2317
#define LVS_SHOWSELALWAYS
Definition: commctrl.h:2272
#define LVS_REPORT
Definition: commctrl.h:2267
#define LVCF_WIDTH
Definition: commctrl.h:2592
#define PBM_SETPOS
Definition: commctrl.h:2189
#define PBM_SETRANGE
Definition: commctrl.h:2188
#define LVS_NOSORTHEADER
Definition: commctrl.h:2290
#define LVIF_TEXT
Definition: commctrl.h:2314
#define LVCF_FMT
Definition: commctrl.h:2591
#define LVCF_SUBITEM
Definition: commctrl.h:2594
#define LVCFMT_LEFT
Definition: commctrl.h:2603
#define PBM_SETMARQUEE
Definition: commctrl.h:2204
DWORD dwStatus
Definition: mediaobj.idl:95
@ DAF_MODAL
Definition: dialogs.h:14
@ DAF_SILENT
Definition: dialogs.h:13
#define WM_NOTIFY_OPERATIONCOMPLETED
Definition: rapps.h:19
#define WM_NOTIFY_INSTALLERFINISHED
Definition: rapps.h:20
LONG g_Busy
Definition: winmain.cpp:17
#define DefWindowProc
Definition: ros2win.h:31
const WCHAR * str
_CRTIMP uintptr_t __cdecl _beginthreadex(_In_opt_ void *_Security, _In_ unsigned _StackSize, _In_ unsigned(__stdcall *_StartAddress)(void *), _In_opt_ void *_ArgList, _In_ unsigned _InitFlag, _Out_opt_ unsigned *_ThrdAddr)
_In_ UINT _In_ UINT cch
Definition: shellapi.h:432
#define SEE_MASK_NOCLOSEPROCESS
Definition: shellapi.h:33
BOOL WINAPI DECLSPEC_HOTPATCH ShellExecuteExW(LPSHELLEXECUTEINFOW sei)
Definition: shlexec.cpp:2723
HRESULT hr
Definition: shlfolder.c:183
@ PERCEIVED_TYPE_COMPRESSED
Definition: shtypes.idl:177
#define _countof(array)
Definition: sndvol32.h:70
TCHAR szAppName[128]
Definition: solitaire.cpp:18
CStringW szName
Definition: loaddlg.cpp:165
DownloadType DLType
Definition: loaddlg.cpp:160
CStringW szPackageName
Definition: loaddlg.cpp:167
CStringW szUrl
Definition: loaddlg.cpp:164
DownloadInfo(const CAppInfo &AppInfo, UINT DAF=0)
Definition: loaddlg.cpp:140
ULONG SizeInBytes
Definition: loaddlg.cpp:170
InstallerType IType
Definition: loaddlg.cpp:161
CStringW szSilentInstallArgs
Definition: loaddlg.cpp:169
bool Equal(const DownloadInfo &other) const
Definition: loaddlg.cpp:155
CStringW szSHA1
Definition: loaddlg.cpp:166
InstallerType IExecType
Definition: loaddlg.cpp:162
CStringW szFileName
Definition: loaddlg.cpp:168
WCHAR szDownloadDir[MAX_PATH]
Definition: settings.h:10
BOOL bDelInstaller
Definition: settings.h:11
WCHAR szNoProxyFor[MAX_PATH]
Definition: settings.h:22
WCHAR szProxyServer[MAX_PATH]
Definition: settings.h:21
DWORD dwStructSize
Definition: wininet.h:211
INTERNET_SCHEME nScheme
Definition: wininet.h:214
LPWSTR lpszScheme
Definition: wininet.h:212
DWORD dwSchemeLength
Definition: wininet.h:213
LPCWSTR lpParameters
Definition: shellapi.h:339
Definition: name.c:39
Definition: windef.h:99
LONG right
Definition: windef.h:102
LONG bottom
Definition: windef.h:103
LONG top
Definition: windef.h:101
LONG left
Definition: windef.h:100
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
Definition: synch.c:82
#define ICON_BIG
Definition: tnclass.cpp:51
#define ICON_SMALL
Definition: tnclass.cpp:48
#define LANG_USER_DEFAULT
Definition: tnerror.cpp:50
TW_UINT32 TW_UINT16 TW_UINT16 MSG
Definition: twain.h:1829
int32_t INT_PTR
Definition: typedefs.h:64
const uint16_t * PCWSTR
Definition: typedefs.h:57
PVOID HANDLE
Definition: typedefs.h:73
ULONG_PTR SIZE_T
Definition: typedefs.h:80
int32_t INT
Definition: typedefs.h:58
uint16_t * PWCHAR
Definition: typedefs.h:56
uint32_t ULONG
Definition: typedefs.h:59
uint64_t ULONGLONG
Definition: typedefs.h:67
#define CMD_KEY_GENINST
Definition: unattended.h:4
_In_ HFONT _Out_ PUINT _Out_ PUINT Width
Definition: font.h:89
#define AddItem
Definition: userenv.h:209
#define INVALID_FILE_ATTRIBUTES
Definition: vfdcmd.c:23
SERVICE_STATUS_HANDLE hStatus
Definition: w32time.c:14
_Must_inspect_result_ _In_ WDFCHILDLIST _In_ PWDF_CHILD_LIST_ITERATOR _Out_ WDFDEVICE _Inout_opt_ PWDF_CHILD_RETRIEVE_INFO Info
Definition: wdfchildlist.h:690
_In_ WDFCOLLECTION _In_ ULONG Index
_In_ WDFCOLLECTION _In_ WDFOBJECT Item
HDC hdcMem
Definition: welcome.c:104
int WINAPI GetWindowTextW(HWND hWnd, LPWSTR lpString, int nMaxCount)
Definition: window.c:1382
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define FORMAT_MESSAGE_IGNORE_INSERTS
Definition: winbase.h:397
#define FORMAT_MESSAGE_FROM_SYSTEM
Definition: winbase.h:400
#define FORMAT_MESSAGE_ALLOCATE_BUFFER
Definition: winbase.h:396
#define FORMAT_MESSAGE_FROM_HMODULE
Definition: winbase.h:399
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
#define SelectFont(hdc, hfont)
Definition: windowsx.h:516
#define SetDlgMsgResult(hwnd, msg, result)
Definition: windowsx.h:518
#define GetStockFont(i)
Definition: windowsx.h:308
#define DEFAULT_GUI_FONT
Definition: wingdi.h:909
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
Definition: dc.c:1546
HDC WINAPI CreateCompatibleDC(_In_opt_ HDC hdc)
#define SRCCOPY
Definition: wingdi.h:333
HBITMAP WINAPI CreateCompatibleBitmap(_In_ HDC hdc, _In_ INT cx, _In_ INT cy)
BOOL WINAPI DeleteDC(_In_ HDC)
#define HTTP_STATUS_OK
Definition: winhttp.h:240
#define INTERNET_SCHEME_FTP
Definition: winhttp.h:44
#define ICU_DECODE
Definition: winhttp.h:291
#define INTERNET_SCHEME_HTTP
Definition: winhttp.h:42
#define SECURITY_FLAG_SECURE
Definition: winhttp.h:285
#define ICU_NO_ENCODE
Definition: winhttp.h:290
#define INTERNET_SCHEME_HTTPS
Definition: winhttp.h:43
#define ICU_ESCAPE
Definition: winhttp.h:48
#define INTERNET_FLAG_PRAGMA_NOCACHE
Definition: wininet.h:85
#define INTERNET_OPTION_SECURITY_FLAGS
Definition: wininet.h:725
#define INTERNET_FLAG_DONT_CACHE
Definition: wininet.h:67
#define INTERNET_FLAG_KEEP_CONNECTION
Definition: wininet.h:72
#define INTERNET_FLAG_PASSIVE
Definition: wininet.h:65
#define HTTP_QUERY_FLAG_NUMBER
Definition: wininet.h:1606
#define INTERNET_OPEN_TYPE_DIRECT
Definition: wininet.h:522
@ INTERNET_SCHEME_FILE
Definition: wininet.h:143
#define INTERNET_OPEN_TYPE_PROXY
Definition: wininet.h:523
#define HTTP_QUERY_STATUS_CODE
Definition: wininet.h:1542
#define INTERNET_OPEN_TYPE_PRECONFIG
Definition: wininet.h:521
#define INTERNET_OPTION_SECURITY_CERTIFICATE_STRUCT
Definition: wininet.h:726
#define HTTP_QUERY_CONTENT_LENGTH
Definition: wininet.h:1528
BOOL VerifyInteg(LPCWSTR lpSHA1Hash, LPCWSTR lpFileName)
Definition: integrity.cpp:14
#define EVENTLOG_SUCCESS
Definition: winnt_old.h:3056
#define WM_PAINT
Definition: winuser.h:1648
HWND WINAPI CreateDialogParamW(_In_opt_ HINSTANCE, _In_ LPCWSTR, _In_opt_ HWND, _In_opt_ DLGPROC, _In_ LPARAM)
#define WM_ERASEBKGND
Definition: winuser.h:1653
DWORD WINAPI GetSysColor(_In_ int)
BOOL WINAPI IsWindow(_In_opt_ HWND)
#define SW_HIDE
Definition: winuser.h:779
#define WM_CLOSE
Definition: winuser.h:1649
#define DT_NOPREFIX
Definition: winuser.h:537
#define DWLP_USER
Definition: winuser.h:883
#define GetWindowLongPtrW
Definition: winuser.h:4931
#define GCLP_HICONSM
Definition: winuser.h:683
#define MAKELPARAM(l, h)
Definition: winuser.h:4110
BOOL WINAPI ShowWindow(_In_ HWND, _In_ int)
#define DT_CENTER
Definition: winuser.h:527
#define IDCANCEL
Definition: winuser.h:842
BOOL WINAPI GetMessageW(_Out_ LPMSG, _In_opt_ HWND, _In_ UINT, _In_ UINT)
BOOL WINAPI PostMessageW(_In_opt_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define GCLP_HICON
Definition: winuser.h:682
__analysis_noreturn void WINAPI PostQuitMessage(_In_ int)
int WINAPI MessageBoxA(_In_opt_ HWND hWnd, _In_opt_ LPCSTR lpText, _In_opt_ LPCSTR lpCaption, _In_ UINT uType)
#define DT_SINGLELINE
Definition: winuser.h:540
#define WM_COMMAND
Definition: winuser.h:1768
#define COLOR_3DDKSHADOW
Definition: winuser.h:950
#define WM_INITDIALOG
Definition: winuser.h:1767
#define MB_YESNO
Definition: winuser.h:828
int WINAPI MessageBoxW(_In_opt_ HWND hWnd, _In_opt_ LPCWSTR lpText, _In_opt_ LPCWSTR lpCaption, _In_ UINT uType)
HWND WINAPI GetDlgItem(_In_opt_ HWND, _In_ int)
#define MB_ICONERROR
Definition: winuser.h:798
BOOL WINAPI SetWindowTextW(_In_ HWND, _In_opt_ LPCWSTR)
#define WM_SETTEXT
Definition: winuser.h:1645
BOOL WINAPI GetClientRect(_In_ HWND, _Out_ LPRECT)
BOOL WINAPI EndPaint(_In_ HWND, _In_ const PAINTSTRUCT *)
#define SendMessage
Definition: winuser.h:5954
#define MB_OK
Definition: winuser.h:801
#define DT_VCENTER
Definition: winuser.h:543
#define PostMessage
Definition: winuser.h:5943
#define GetClassLongPtrW
Definition: winuser.h:4666
#define SW_SHOW
Definition: winuser.h:786
#define WM_DESTROY
Definition: winuser.h:1637
#define WS_EX_CLIENTEDGE
Definition: winuser.h:384
#define SetWindowText
Definition: winuser.h:5968
#define DispatchMessage
Definition: winuser.h:5876
BOOL WINAPI InvalidateRect(_In_opt_ HWND, _In_opt_ LPCRECT, _In_ BOOL)
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
#define IDYES
Definition: winuser.h:846
HDC WINAPI BeginPaint(_In_ HWND, _Out_ LPPAINTSTRUCT)
#define SetWindowLongPtrW
Definition: winuser.h:5457
BOOL WINAPI InflateRect(_Inout_ LPRECT, _In_ int, _In_ int)
#define COLOR_CAPTIONTEXT
Definition: winuser.h:933
BOOL WINAPI IsWindowVisible(_In_ HWND)
BOOL WINAPI DestroyWindow(_In_ HWND)
HICON WINAPI LoadIconW(_In_opt_ HINSTANCE hInstance, _In_ LPCWSTR lpIconName)
Definition: cursoricon.c:2427
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
INT_PTR WINAPI DialogBoxParamW(_In_opt_ HINSTANCE, _In_ LPCWSTR, _In_opt_ HWND, _In_opt_ DLGPROC, _In_ LPARAM)
BOOL WINAPI EndDialog(_In_ HWND, _In_ INT_PTR)
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
const char * LPCSTR
Definition: xmlstorage.h:183
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184