ReactOS 0.4.17-dev-470-gf9e3448
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.h>
46#include <shlwapi_undoc.h>
47#include <process.h>
48#undef SubclassWindow
49
50#include "rosui.h"
51#include "dialogs.h"
52#include "misc.h"
53#include "unattended.h"
54
55#ifdef USE_CERT_PINNING
56#define CERT_ISSUER_INFO_PREFIX "US\r\nLet's Encrypt\r\nR"
57#define CERT_ISSUER_INFO_PREFIX2 "US\r\nLet's Encrypt\r\nYR"
58#define CERT_ISSUER_INFO_OLD "US\r\nLet's Encrypt\r\nR3"
59#define CERT_ISSUER_INFO_NEW "US\r\nLet's Encrypt\r\nR11"
60#define CERT_SUBJECT_INFO "rapps.reactos.org"
61
62static bool
63IsTrustedPinnedCert(LPCSTR Subject, LPCSTR Issuer)
64{
65 if (strcmp(Subject, CERT_SUBJECT_INFO))
66 return false;
67#ifdef CERT_ISSUER_INFO_PREFIX
68 return Issuer == StrStrA(Issuer, CERT_ISSUER_INFO_PREFIX) || Issuer == StrStrA(Issuer, CERT_ISSUER_INFO_PREFIX2);
69#else
70 return !strcmp(Issuer, CERT_ISSUER_INFO_OLD) || !strcmp(Issuer, CERT_ISSUER_INFO_NEW);
71#endif
72}
73#endif // USE_CERT_PINNING
74
76{
80};
81
83{
90};
91
94{
95 CStringW szString;
96 szString.LoadStringW(StatusParam);
97 return szString;
98}
99
100#define FILENAME_VALID_CHAR ( \
101 PATH_CHAR_CLASS_LETTER | \
102 PATH_CHAR_CLASS_DOT | \
103 PATH_CHAR_CLASS_SEMICOLON | \
104 PATH_CHAR_CLASS_COMMA | \
105 PATH_CHAR_CLASS_SPACE | \
106 PATH_CHAR_CLASS_OTHER_VALID)
107
108VOID
110{
112 DWORD cchPath = _countof(szPath);
113 UrlUnescapeW(const_cast<LPWSTR>((LPCWSTR)str), szPath, &cchPath, 0);
114
115 for (PWCHAR pch = szPath; *pch; ++pch)
116 {
118 *pch = L'_';
119 }
120
121 str = szPath;
122}
123
124static void
126{
128 DWORD cch = (DWORD)(wcslen(pszUrl) + 1);
129 if (InternetCanonicalizeUrlW(pszUrl, buf.GetBuffer(cch), &cch, ICU_DECODE | ICU_NO_ENCODE))
130 {
131 buf.ReleaseBuffer();
132 pszUrl = buf;
133 }
134 SetWindowTextW(hWnd, pszUrl);
135}
136
138{
140 {
141 }
142 DownloadInfo(const CAppInfo &AppInfo, UINT DAF = 0) : DLType(DLTYPE_APPLICATION), Flags(DAF)
143 {
145 szName = AppInfo.szDisplayName;
146 IType = AppInfo.GetInstallerType();
147 szPackageName = AppInfo.szIdentifier;
148
149 if (Flags & DAF_SILENT)
151
152 CConfigParser *cfg = static_cast<const CAvailableApplicationInfo&>(AppInfo).GetConfigParser();
153 if (cfg)
154 {
157 }
158 }
159
160 bool Equal(const DownloadInfo &other) const
161 {
162 return DLType == other.DLType && !lstrcmpW(szUrl, other.szUrl);
163 }
164
177};
178
179class CDownloaderProgress : public CWindowImpl<CDownloaderProgress, CWindow, CControlWinTraits>
180{
182
183 public:
185 {
186 }
187
188 VOID
190 {
191 if (Enable)
193 else
195
197 }
198
199 VOID
200 SetProgress(ULONG ulProgress, ULONG ulProgressMax)
201 {
202 WCHAR szProgress[100];
203
204 /* format the bits and bytes into pretty and accessible units... */
205 StrFormatByteSizeW(ulProgress, szProgress, _countof(szProgress));
206
207 /* use our subclassed progress bar text subroutine */
208 CStringW ProgressText;
209
210 if (ulProgressMax)
211 {
212 /* total size is known */
213 WCHAR szProgressMax[100];
214 UINT uiPercentage = ((ULONGLONG)ulProgress * 100) / ulProgressMax;
215
216 /* send the current progress to the progress bar */
217 if (!IsWindow())
218 return;
219 SendMessage(PBM_SETPOS, uiPercentage, 0);
220
221 /* format total download size */
222 StrFormatByteSizeW(ulProgressMax, szProgressMax, _countof(szProgressMax));
223
224 /* generate the text on progress bar */
225 ProgressText.Format(L"%u%% \x2014 %ls / %ls", uiPercentage, szProgress, szProgressMax);
226 }
227 else
228 {
229 /* send the current progress to the progress bar */
230 if (!IsWindow())
231 return;
232 SendMessage(PBM_SETPOS, 0, 0);
233
234 /* total size is not known, display only current size */
235 ProgressText.Format(L"%ls...", szProgress);
236 }
237
238 /* and finally display it */
239 if (!IsWindow())
240 return;
241 SetWindowText(ProgressText.GetString());
242 }
243
244 LRESULT
246 {
247 return TRUE;
248 }
249
250 LRESULT
252 {
253 PAINTSTRUCT ps;
254 HDC hDC = BeginPaint(&ps), hdcMem;
255 HBITMAP hbmMem;
256 HANDLE hOld;
257 RECT myRect;
258 UINT win_width, win_height;
259
260 GetClientRect(&myRect);
261
262 /* grab the progress bar rect size */
263 win_width = myRect.right - myRect.left;
264 win_height = myRect.bottom - myRect.top;
265
266 /* create an off-screen DC for double-buffering */
268 hbmMem = CreateCompatibleBitmap(hDC, win_width, win_height);
269
270 hOld = SelectObject(hdcMem, hbmMem);
271
272 /* call the original draw code and redirect it to our memory buffer */
274
275 /* draw our nifty progress text over it */
281
282 /* transfer the off-screen DC to the screen */
283 BitBlt(hDC, 0, 0, win_width, win_height, hdcMem, 0, 0, SRCCOPY);
284
285 /* free the off-screen DC */
286 SelectObject(hdcMem, hOld);
287 DeleteObject(hbmMem);
289
290 EndPaint(&ps);
291 return 0;
292 }
293
294 LRESULT
296 {
297 PCWSTR pszText = (PCWSTR)lParam;
298 if (pszText)
299 {
300 if (m_szProgressText != pszText)
301 {
302 m_szProgressText = pszText;
304 }
305 }
306 else
307 {
309 {
312 }
313 }
314 return TRUE;
315 }
316
322};
323
325{
326 public:
327 HWND
329 {
330 RECT r;
332 r.top = (2 * r.top + 1 * r.bottom) / 3; /* The vertical position at ratio 1 : 2 */
333 const INT MARGIN = 10;
334 ::InflateRect(&r, -MARGIN, -MARGIN);
335
338
340
341 AddColumn(0, 150, LVCFMT_LEFT);
342 AddColumn(1, 120, LVCFMT_LEFT);
343
344 return hwnd;
345 }
346
347 VOID
349 {
350 const INT base = GetItemCount();
351 for (INT i = Start; i < arrInfo.GetSize(); ++i)
352 {
353 AddRow(base + i - Start, arrInfo[i].szName, DLSTATUS_WAITING);
354 }
355 }
356
357 VOID
359 {
360 CStringW szBuffer = LoadStatusString(Status);
361 SetItemText(ItemIndex, 1, szBuffer.GetString());
362 }
363
364 BOOL
365 AddItem(INT ItemIndex, LPWSTR lpText)
366 {
368
369 ZeroMemory(&Item, sizeof(Item));
370
371 Item.mask = LVIF_TEXT | LVIF_STATE;
372 Item.pszText = lpText;
373 Item.iItem = ItemIndex;
374
375 return InsertItem(&Item);
376 }
377
378 VOID
380 {
381 CStringW szStatus = LoadStatusString(Status);
382 AddItem(RowIndex, const_cast<LPWSTR>(szAppName));
383 SetDownloadStatus(RowIndex, Status);
384 }
385
386 BOOL
388 {
389 LVCOLUMNW Column;
390 ZeroMemory(&Column, sizeof(Column));
391
393 Column.iSubItem = Index;
394 Column.cx = Width;
395 Column.fmt = Format;
396
397 return (InsertColumn(Index, &Column) == -1) ? FALSE : TRUE;
398 }
399};
400
401#ifdef USE_CERT_PINNING
402static BOOL
403CertGetSubjectAndIssuer(HINTERNET hFile, CLocalPtr<char> &subjectInfo, CLocalPtr<char> &issuerInfo)
404{
405 DWORD certInfoLength;
408
409 size = sizeof(flags);
411 {
412 return FALSE;
413 }
414
416 {
417 return FALSE;
418 }
419
420 /* Despite what the header indicates, the implementation of INTERNET_CERTIFICATE_INFO is not Unicode-aware. */
421 certInfoLength = sizeof(certInfo);
423 {
424 return FALSE;
425 }
426
427 subjectInfo.Attach(certInfo.lpszSubjectInfo);
428 issuerInfo.Attach(certInfo.lpszIssuerInfo);
429
430 if (certInfo.lpszProtocolName)
431 LocalFree(certInfo.lpszProtocolName);
432 if (certInfo.lpszSignatureAlgName)
434 if (certInfo.lpszEncryptionAlgName)
436
437 return certInfo.lpszSubjectInfo && certInfo.lpszIssuerInfo;
438}
439#endif
440
441static inline VOID
442MessageBox_LoadString(HWND hOwnerWnd, INT StringID)
443{
444 CStringW szMsgText;
445 if (szMsgText.LoadStringW(StringID))
446 {
447 MessageBoxW(hOwnerWnd, szMsgText.GetString(), NULL, MB_OK | MB_ICONERROR);
448 }
449}
450
451static BOOL
452ShowLastError(HWND hWndOwner, BOOL bInetError, DWORD dwLastError)
453{
454 CLocalPtr<WCHAR> lpMsg;
455
456 if (!FormatMessageW(
459 (bInetError ? GetModuleHandleW(L"wininet.dll") : NULL), dwLastError, LANG_USER_DEFAULT, (LPWSTR)&lpMsg, 0,
460 NULL))
461 {
462 DPRINT1("FormatMessageW unexpected failure (err %d)\n", GetLastError());
463 return FALSE;
464 }
465
466 if (hWndOwner && !IsWindowVisible(hWndOwner))
467 hWndOwner = NULL;
468 MessageBoxW(hWndOwner, lpMsg, NULL, MB_OK | MB_ICONERROR);
469 return TRUE;
470}
471
472// Download dialog (loaddlg.cpp)
474
476 public CComCoClass<CDownloadManager, &CLSID_NULL>,
477 public CComObjectRootEx<CComMultiThreadModelNoCS>,
478 public IUnknown
479{
480public:
481 enum {
482 WM_ISCANCELLED = WM_APP, // Return BOOL
483 WM_SETSTATUS, // wParam DownloadStatus
484 WM_GETINSTANCE, // Return CDownloadManager*
485 WM_GETNEXT, // Return DownloadInfo* or NULL
486 };
487
489
490 static CDownloadManager*
492 {
493 if (!(Flags & DAF_MODAL))
494 {
496 if (pExisting)
497 {
498 pExisting->AddRef();
499 return pExisting;
500 }
501 }
503 if (FAILED(ShellObjectCreator(obj)))
504 return NULL;
505 obj->m_fDaf = Flags;
506 obj->m_bModal = !!(Flags & DAF_MODAL);
507 return obj.Detach();
508 }
509
510 static BOOL
512 {
514 if (!p)
515 return FALSE;
516 Obj.Attach(p);
517 return TRUE;
518 }
519
520 static CDownloadManager*
522 {
525 return NULL;
526 }
527
528 BOOL
530 {
532 }
533
534 BOOL
536 {
537 return m_fDaf & DAF_SILENT;
538 }
539
540 void StartWorkerThread();
541 void Add(const DownloadInfo &Info);
542 void Show();
545 void UpdateProgress(ULONG ulProgress, ULONG ulProgressMax);
546 static unsigned int CALLBACK ThreadFunc(void*ThreadParam);
548
553
565};
566
567void
569{
570 AddRef(); // To keep m_List alive in thread
571 unsigned int ThreadId;
572 HANDLE Thread = (HANDLE)_beginthreadex(NULL, 0, ThreadFunc, this, 0, &ThreadId);
573 if (Thread)
575 else
576 Release();
577}
578
579void
581{
582 const UINT count = m_List.GetSize(), start = count;
583 for (UINT i = 0; i < count; ++i)
584 {
585 if (Info.Equal(m_List[i]))
586 return; // Already in the list
587 }
588
589 if (!Info.szDependencies.IsEmpty())
590 {
591 CStringW deps = Info.szDependencies;
592 for (int pos = 1; pos > 0; deps = deps.Mid(pos + 1))
593 {
594 pos = deps.Find(L'|');
595 CStringW pkg = (pos > 0 ? deps.Left(pos) : deps).Trim();
596
597 // In the future a package might need to specify dependency version or WoW64
598 // information ("vcredist*x64" etc), for now, just remove possible modifiers.
599 int suffix = pkg.FindOneOf(L"*<=>:/\\?");
600 if (suffix > 0)
601 pkg = pkg.Left(suffix);
602
604 Deleter <CAvailableApplicationInfo*>del(pApp);
605 if (!pApp || pApp->IsInstalled())
606 continue;
607 // Add the dependency before the application in the list
608 Add(DownloadInfo(*pApp, DAF_SILENT));
609 }
610 }
611
612 m_List.Add(Info);
613 if (m_hDlg)
615}
616
617void
619{
620 HWND hDlg = NULL;
621 const BOOL bSilent = IsSilentDialog(), bModal = m_bModal;
622 if (bModal && !bSilent)
624 else if (!m_hDlg || !IsWindow(m_hDlg))
626
627 // A DialogBox dialog cannot be invisible, it is forced visible after WM_INITDIALOG returns.
628 // We therefore use a modeless dialog when we are both modal and silent.
629 for (MSG msg; bModal && bSilent && hDlg && GetMessageW(&msg, NULL, 0, 0);)
631}
632
635{
637 if (!pThis)
638 {
639 if (uMsg != WM_INITDIALOG)
640 return FALSE;
642 pThis = (CDownloadManager*)lParam;
643 }
644 return pThis->RealDlgProc(hDlg, uMsg, wParam, lParam);
645}
646
649{
650 switch (uMsg)
651 {
652 case WM_INITDIALOG:
653 {
654 g_Busy++;
655 AddRef();
656 m_hDlg = hDlg;
657 if (!m_bModal)
658 g_hDownloadWnd = hDlg;
659
660 HICON hIconSm, hIconBg;
661 if (hMainWnd)
662 {
665 }
666 if (!hMainWnd || (!hIconBg || !hIconSm))
667 {
669 }
670 SendMessageW(hDlg, WM_SETICON, ICON_BIG, (LPARAM)hIconBg);
671 SendMessageW(hDlg, WM_SETICON, ICON_SMALL, (LPARAM)hIconSm);
672
676 buf.Replace(L"%ls", L"");
677 SetWindowTextW(hDlg, buf); // "Downloading..."
678
680 if (hItem)
681 {
682 // initialize the default values for our nifty progress bar
683 // and subclass it so that it learns to print a status text
685 m_ProgressBar.SendMessageW(PBM_SETRANGE, 0, MAKELPARAM(0, 100));
686 m_ProgressBar.SendMessageW(PBM_SETPOS, 0, 0);
687 if (m_List.GetSize() > 0)
688 m_ProgressBar.SetProgress(0, m_List[0].SizeInBytes);
689 }
690
691 if (!m_ListView.Create(hDlg))
692 return FALSE;
694
697 return TRUE;
698 }
699
700 case WM_COMMAND:
701 if (LOWORD(wParam) == IDCANCEL)
702 {
704 PostMessageW(hDlg, WM_CLOSE, 0, 0);
705 }
706 return FALSE;
707
708 case WM_CLOSE:
710 if (m_ProgressBar)
712 return m_bModal && !IsSilentDialog() ? ::EndDialog(hDlg, 0) : ::DestroyWindow(hDlg);
713
714 case WM_DESTROY:
715 if (g_hDownloadWnd == hDlg)
717 g_Busy--;
718 if (hMainWnd)
720 if (m_bModal && IsSilentDialog())
722 Release();
723 break;
724
725 case WM_ISCANCELLED:
726 return SetDlgMsgResult(hDlg, uMsg, m_bCancelled);
727
728 case WM_SETSTATUS:
730 break;
731
732 case WM_GETINSTANCE:
733 return SetDlgMsgResult(hDlg, uMsg, (INT_PTR)this);
734
735 case WM_GETNEXT:
736 {
737 DownloadInfo *pItem = NULL;
739 pItem = &m_List[m_Index++];
740 return SetDlgMsgResult(hDlg, uMsg, (INT_PTR)pItem);
741 }
742 }
743 return FALSE;
744}
745
746void
748{
749 m_ProgressBar.SetProgress(ulProgress, ulProgressMax);
750}
751
752unsigned int CALLBACK
754{
755 CDownloadManager *pThis = (CDownloadManager*)ThreadParam;
756 HWND hDlg = pThis->m_hDlg;
757 for (;;)
758 {
759 DownloadInfo *pItem = (DownloadInfo*)SendMessageW(hDlg, WM_GETNEXT, 0, 0);
760 if (!pItem)
761 break;
762 pThis->PerformDownloadAndInstall(*pItem);
763 }
764 SendMessageW(hDlg, WM_CLOSE, 0, 0);
765 return pThis->Release();
766}
767
768void
770{
771 const HWND hDlg = m_hDlg;
774
776 m_ProgressBar.SendMessageW(PBM_SETPOS, 0, 0);
777 m_ProgressBar.SetProgress(0, Info.SizeInBytes);
778
780 CPathW Path;
781 PCWSTR p;
782
783 ULONG dwContentLen, dwBytesWritten, dwBytesRead, dwStatus, dwStatusLen;
784 ULONG dwCurrentBytesRead = 0;
785 BOOL bTempfile = FALSE, bCancelled = FALSE;
786
787 HINTERNET hOpen = NULL;
790
791
792 LPCWSTR lpszAgent = L"RApps/1.1";
793 const DWORD dwUrlConnectFlags =
795 URL_COMPONENTSW urlComponents;
796 size_t urlLength;
797 unsigned char lpBuffer[4096];
798
799 // Change caption to show the currently downloaded app
800 switch (Info.DLType)
801 {
803 str.Format(m_szCaptionFmt, Info.szName.GetString());
804 break;
805 case DLTYPE_DBUPDATE:
807 break;
810 break;
811 }
812 SetWindowTextW(hDlg, str);
813
814 // is this URL an update package for RAPPS? if so store it in a different place
815 if (Info.DLType != DLTYPE_APPLICATION)
816 {
818 {
820 goto end;
821 }
822 }
823 else
824 {
826 }
827
828 // build the path for the download
829 p = wcsrchr(Info.szUrl.GetString(), L'/');
830
831 // do we have a final slash separator?
832 if (!p)
833 {
835 goto end;
836 }
837
838 // is the path valid? can we access it?
840 {
842 {
844 goto end;
845 }
846 }
847
848 switch (Info.DLType)
849 {
850 case DLTYPE_DBUPDATE:
853 break;
855 {
856 CStringW name = Info.szFileName;
857 if (name.IsEmpty())
858 name = p + 1; // use the filename retrieved from URL
860 Path += name;
861 break;
862 }
863 }
864
865 if ((Info.DLType == DLTYPE_APPLICATION) && Info.szSHA1[0] &&
867 {
868 // only open it in case of total correctness
869 if (VerifyInteg(Info.szSHA1.GetString(), Path))
870 goto run;
871 }
872
873 // Download it
875 /* FIXME: this should just be using the system-wide proxy settings */
876 switch (SettingsInfo.Proxy)
877 {
878 case 0: // preconfig
879 default:
880 hOpen = InternetOpenW(lpszAgent, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
881 break;
882 case 1: // direct (no proxy)
883 hOpen = InternetOpenW(lpszAgent, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
884 break;
885 case 2: // use proxy
886 hOpen = InternetOpenW(
888 break;
889 }
890
891 if (!hOpen)
892 {
894 goto end;
895 }
896
897 bTempfile = TRUE;
898 dwContentLen = 0;
899 dwStatusLen = sizeof(dwStatus);
900 ZeroMemory(&urlComponents, sizeof(urlComponents));
901 urlComponents.dwStructSize = sizeof(urlComponents);
902
903 urlLength = Info.szUrl.GetLength();
904 urlComponents.dwSchemeLength = urlLength + 1;
905 urlComponents.lpszScheme = (LPWSTR)malloc(urlComponents.dwSchemeLength * sizeof(WCHAR));
906
907 if (!InternetCrackUrlW(Info.szUrl, urlLength + 1, ICU_DECODE | ICU_ESCAPE, &urlComponents))
908 {
910 goto end;
911 }
912
913 if (urlComponents.nScheme == INTERNET_SCHEME_HTTP || urlComponents.nScheme == INTERNET_SCHEME_HTTPS)
914 {
915 hFile = InternetOpenUrlW(hOpen, Info.szUrl, NULL, 0, dwUrlConnectFlags, 0);
916 if (!hFile)
917 {
919 {
920 /* Workaround for CORE-17377 */
922 }
923 goto end;
924 }
925
926 // query connection
928 {
930 goto end;
931 }
932
934 {
936 goto end;
937 }
938
939 // query content length
941 }
942 else if (urlComponents.nScheme == INTERNET_SCHEME_FTP)
943 {
944 // force passive mode on FTP
945 hFile =
946 InternetOpenUrlW(hOpen, Info.szUrl, NULL, 0, dwUrlConnectFlags | INTERNET_FLAG_PASSIVE, 0);
947 if (!hFile)
948 {
950 {
951 /* Workaround for CORE-17377 */
953 }
954 goto end;
955 }
956
957 dwContentLen = FtpGetFileSize(hFile, &dwStatus);
958 }
959 else if (urlComponents.nScheme == INTERNET_SCHEME_FILE)
960 {
961 // Add support for the file scheme so testing locally is simpler
962 WCHAR LocalFilePath[MAX_PATH];
963 DWORD cchPath = _countof(LocalFilePath);
964 // Ideally we would use PathCreateFromUrlAlloc here, but that is not exported (yet)
965 HRESULT hr = PathCreateFromUrlW(Info.szUrl, LocalFilePath, &cchPath, 0);
966 if (SUCCEEDED(hr))
967 {
968 if (CopyFileW(LocalFilePath, Path, FALSE))
969 {
970 goto run;
971 }
972 else
973 {
975 goto end;
976 }
977 }
978 else
979 {
981 goto end;
982 }
983 }
984
985 if (!dwContentLen)
986 {
987 // Someone was nice enough to add this, let's use it
988 if (Info.SizeInBytes)
989 {
990 dwContentLen = Info.SizeInBytes;
991 }
992 else
993 {
994 // content-length is not known, enable marquee mode
996 }
997 }
998
999 free(urlComponents.lpszScheme);
1000
1001#ifdef USE_CERT_PINNING
1002 // are we using HTTPS to download the RAPPS update package? check if the certificate is original
1003 if ((urlComponents.nScheme == INTERNET_SCHEME_HTTPS) && (Info.DLType == DLTYPE_DBUPDATE))
1004 {
1005 CLocalPtr<char> subjectName, issuerName;
1006 CStringA szMsgText;
1007 bool bAskQuestion = false;
1008 if (!CertGetSubjectAndIssuer(hFile, subjectName, issuerName))
1009 {
1010 szMsgText.LoadStringW(IDS_UNABLE_TO_QUERY_CERT);
1011 bAskQuestion = true;
1012 }
1013 else if (!IsTrustedPinnedCert(subjectName, issuerName))
1014 {
1015 szMsgText.Format(IDS_MISMATCH_CERT_INFO, (LPCSTR)subjectName, (LPCSTR)issuerName);
1016 bAskQuestion = true;
1017 }
1018
1019 if (bAskQuestion)
1020 {
1021 if (MessageBoxA(hDlg, szMsgText, NULL, MB_YESNO | MB_ICONERROR) != IDYES)
1022 {
1023 goto end;
1024 }
1025 }
1026 }
1027#endif
1028
1030 if (hOut == INVALID_HANDLE_VALUE)
1031 {
1033 goto end;
1034 }
1035
1036 dwCurrentBytesRead = 0;
1037 do
1038 {
1039 bCancelled = IsCancelled();
1040 if (bCancelled)
1041 break;
1042
1043 if (!InternetReadFile(hFile, lpBuffer, _countof(lpBuffer), &dwBytesRead))
1044 {
1046 goto end;
1047 }
1048
1049 if (!WriteFile(hOut, &lpBuffer[0], dwBytesRead, &dwBytesWritten, NULL))
1050 {
1052 goto end;
1053 }
1054
1055 dwCurrentBytesRead += dwBytesRead;
1056 UpdateProgress(dwCurrentBytesRead, dwContentLen);
1057
1058 } while (dwBytesRead);
1059
1060 CloseHandle(hOut);
1061 hOut = INVALID_HANDLE_VALUE;
1062
1063 if (bCancelled)
1064 {
1065 DPRINT1("Operation cancelled\n");
1066 goto end;
1067 }
1068
1069 if (!dwContentLen)
1070 {
1071 // set progress bar to 100%
1073
1074 dwContentLen = dwCurrentBytesRead;
1075 UpdateProgress(dwCurrentBytesRead, dwContentLen);
1076 }
1077
1078 /* if this thing isn't a RAPPS update and it has a SHA-1 checksum
1079 verify its integrity by using the native advapi32.A_SHA1 functions */
1080 if ((Info.DLType == DLTYPE_APPLICATION) && Info.szSHA1[0] != 0)
1081 {
1082 CStringW szMsgText;
1083
1084 // change a few strings in the download dialog to reflect the verification process
1085 if (!szMsgText.LoadStringW(IDS_INTEG_CHECK_TITLE))
1086 {
1087 DPRINT1("Unable to load string\n");
1088 goto end;
1089 }
1090
1091 SetWindowTextW(hDlg, szMsgText);
1093
1094 // this may take a while, depending on the file size
1095 if (!VerifyInteg(Info.szSHA1, Path))
1096 {
1097 if (!szMsgText.LoadStringW(IDS_INTEG_CHECK_FAIL))
1098 {
1099 DPRINT1("Unable to load string\n");
1100 goto end;
1101 }
1102
1103 MessageBoxW(hDlg, szMsgText, NULL, MB_OK | MB_ICONERROR);
1104 goto end;
1105 }
1106 }
1107
1108run:
1110
1111 // run it
1112 if (Info.DLType == DLTYPE_APPLICATION)
1113 {
1114 BOOL bSilentInstall = Info.Flags & DAF_SILENT;
1115 CStringW app, params, tempdir;
1116 SHELLEXECUTEINFOW shExInfo = { sizeof(shExInfo), SEE_MASK_NOCLOSEPROCESS, hDlg };
1117 shExInfo.lpVerb = L"open";
1118 shExInfo.lpFile = Path;
1119 shExInfo.lpParameters = L"";
1120 shExInfo.nShow = SW_SHOW;
1121
1122 if (Info.IType == INSTALLER_GENERATE)
1123 {
1124 params = L"/" CMD_KEY_GENINST + CStringW(bSilentInstall ? L" /S" : L"") +
1125 L" \"" + Info.szPackageName + L"\" \"" + shExInfo.lpFile + L"\"";
1126 shExInfo.lpParameters = params;
1127 shExInfo.lpFile = app.GetBuffer(MAX_PATH);
1128 GetModuleFileNameW(NULL, const_cast<LPWSTR>(shExInfo.lpFile), MAX_PATH);
1129 app.ReleaseBuffer();
1130 }
1131 else if (Info.IType == INSTALLER_EXEINZIP)
1132 {
1133 HRESULT hr = ExtractArchiveForExecution(Path, Info.szPackageName, tempdir, app);
1134 if (FAILED(hr))
1135 {
1136 ShowLastError(hDlg, FALSE, hr);
1137 goto end;
1138 }
1139 shExInfo.lpFile = app;
1140 }
1141
1142 if (bSilentInstall)
1143 {
1144 if (!Info.szSilentInstallArgs.IsEmpty())
1145 {
1146 // The package wants to force specific parameters
1147 shExInfo.lpParameters = Info.szSilentInstallArgs.GetString();
1148 }
1149 else
1150 {
1151 UINT extrainfo = 0;
1152 InstallerType it = Info.IExecType;
1153
1154 if (it == INSTALLER_UNKNOWN || it == INSTALLER_EXEINZIP)
1155 it = GuessInstallerType(shExInfo.lpFile, extrainfo);
1156
1157 if (GetSilentInstallParameters(it, extrainfo, shExInfo.lpFile, params))
1158 {
1159 shExInfo.lpParameters = params;
1160 if (it == INSTALLER_MSI)
1161 shExInfo.lpFile = L"msiexec.exe"; // params contains the .msi path
1162 }
1163 }
1164 }
1165
1166 /* FIXME: Do we want to log installer status? */
1167 WriteLogMessage(EVENTLOG_SUCCESS, MSG_SUCCESS_INSTALL, Info.szName);
1168
1169 if (ShellExecuteExW(&shExInfo))
1170 {
1171 // reflect installation progress in the titlebar
1172 // TODO: make a separate string with a placeholder to include app name?
1174 SetWindowTextW(hDlg, szMsgText);
1175
1177
1178 // TODO: issue an install operation separately so that the apps could be downloaded in the background
1179 if (shExInfo.hProcess)
1180 {
1182 CloseHandle(shExInfo.hProcess);
1184 }
1185 }
1186 else
1187 {
1189 }
1190
1191 if (!tempdir.IsEmpty())
1192 {
1193 DeleteDirectoryTree(tempdir, hDlg);
1194 }
1195 }
1196
1197end:
1198 if (hOut != INVALID_HANDLE_VALUE)
1199 CloseHandle(hOut);
1200
1201 if (hFile)
1203 InternetCloseHandle(hOpen);
1204
1205 if (bTempfile)
1206 {
1207 if (bCancelled || (SettingsInfo.bDelInstaller && Info.DLType == DLTYPE_APPLICATION))
1208 {
1209 // Don't delete .zip/.cab files so the user can extract from them
1210 if (bCancelled || Info.IType == INSTALLER_GENERATE || Info.IType == INSTALLER_EXEINZIP ||
1212 {
1214 }
1215 }
1216 }
1217
1219}
1220
1221BOOL
1223{
1224 if (AppsList.IsEmpty())
1225 return FALSE;
1226
1229 return FALSE;
1230
1231 for (POSITION it = AppsList.GetHeadPosition(); it;)
1232 {
1233 const CAppInfo *Info = AppsList.GetNext(it);
1234 pDM->Add(DownloadInfo(*Info, Flags));
1235 }
1236 pDM->Show();
1237 return TRUE;
1238}
1239
1240BOOL
1242{
1243 if (!pAppInfo)
1244 return FALSE;
1245
1247 list.AddTail(pAppInfo);
1249}
1250
1251VOID
1253{
1256 return;
1257
1258 DownloadInfo DatabaseDLInfo;
1259 DatabaseDLInfo.szUrl = lpUrl;
1260 DatabaseDLInfo.szName.LoadStringW(IDS_DL_DIALOG_DB_DISP);
1261 DatabaseDLInfo.DLType = IsOfficial ? DLTYPE_DBUPDATE : DLTYPE_DBUPDATE_UNOFFICIAL;
1262
1263 pDM->Add(DatabaseDLInfo);
1264 pDM->Show();
1265}
static HDC hDC
Definition: 3dtext.c:33
PRTL_UNICODE_STRING_BUFFER Path
Arabic default style
Definition: afstyles.h:94
#define DB_SAVEAS
Definition: appinfo.h:99
#define DB_DEPENDENCIES
Definition: appinfo.h:102
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:323
BOOL GetStorageDirectory(CStringW &lpDirectory)
Definition: misc.cpp:241
BOOL OpensWithExplorer(PCWSTR Path)
Definition: misc.cpp:164
BOOL GetSilentInstallParameters(InstallerType InstallerType, UINT ExtraInfo, LPCWSTR Installer, CStringW &Parameters)
Definition: misc.cpp:714
BOOL DeleteDirectoryTree(LPCWSTR Dir, HWND hwnd=NULL)
Definition: misc.cpp:553
UINT ClassifyFile(PCWSTR Path)
Definition: misc.cpp:127
InstallerType GuessInstallerType(LPCWSTR Installer, UINT &ExtraInfo)
Definition: misc.cpp:637
#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
static VOID del(LPHIST_ENTRY item)
Definition: history.c:199
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
CStringT Left(int nCount) const
Definition: cstringt.h:776
void __cdecl Format(UINT nFormatID,...)
Definition: cstringt.h:818
int Find(_In_ PCXSTR pszSub, _In_opt_ int iStart=0) const noexcept
Definition: cstringt.h:696
CStringT Mid(int iFirst, int nCount) const
Definition: cstringt.h:748
int FindOneOf(_In_ PCXSTR pszCharSet) const noexcept
Definition: cstringt.h:722
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
static CAvailableApplicationInfo * CreateAvailableAppInstance(const CStringW &PkgName, PCWSTR DBPath=NULL)
Definition: appdb.cpp:110
virtual VOID GetDownloadInfo(CStringW &Url, CStringW &Sha1, ULONG &SizeInBytes) const =0
CStringW szDisplayName
Definition: appinfo.h:123
virtual InstallerType GetInstallerInfo(CStringW &SilentParameters) const
Definition: appinfo.h:144
virtual InstallerType GetInstallerType(bool NestedType=false) const
Definition: appinfo.h:142
const CStringW szIdentifier
Definition: appinfo.h:119
bool IsInstalled(CStringW *pOutKeyName=NULL) const
Definition: appinfo.cpp:124
BOOL GetString(const CStringW &KeyName, CStringW &ResultString)
HWND Create(HWND hwndParent)
Definition: loaddlg.cpp:328
VOID SetDownloadStatus(INT ItemIndex, DownloadStatus Status)
Definition: loaddlg.cpp:358
VOID AddRow(INT RowIndex, LPCWSTR szAppName, const DownloadStatus Status)
Definition: loaddlg.cpp:379
BOOL AddColumn(INT Index, INT Width, INT Format)
Definition: loaddlg.cpp:387
VOID LoadList(ATL::CSimpleArray< DownloadInfo > arrInfo, UINT Start=0)
Definition: loaddlg.cpp:348
BOOL AddItem(INT ItemIndex, LPWSTR lpText)
Definition: loaddlg.cpp:365
static INT_PTR CALLBACK DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: loaddlg.cpp:634
void PerformDownloadAndInstall(const DownloadInfo &Info)
Definition: loaddlg.cpp:769
static CDownloadManager * FindInstance()
Definition: loaddlg.cpp:521
void UpdateProgress(ULONG ulProgress, ULONG ulProgressMax)
Definition: loaddlg.cpp:747
static unsigned int CALLBACK ThreadFunc(void *ThreadParam)
Definition: loaddlg.cpp:753
WCHAR m_szCaptionFmt[100]
Definition: loaddlg.cpp:561
CDownloaderProgress m_ProgressBar
Definition: loaddlg.cpp:564
BOOL IsSilentDialog()
Definition: loaddlg.cpp:535
static CDownloadManager * CreateInstanceHelper(UINT Flags)
Definition: loaddlg.cpp:491
void StartWorkerThread()
Definition: loaddlg.cpp:568
ATL::CSimpleArray< DownloadInfo > m_List
Definition: loaddlg.cpp:562
BOOL IsCancelled()
Definition: loaddlg.cpp:529
CDowloadingAppsListView m_ListView
Definition: loaddlg.cpp:563
INT_PTR RealDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: loaddlg.cpp:648
static BOOL CreateInstance(BOOL Modal, CComPtr< CDownloadManager > &Obj)
Definition: loaddlg.cpp:511
void Add(const DownloadInfo &Info)
Definition: loaddlg.cpp:580
VOID SetMarquee(BOOL Enable)
Definition: loaddlg.cpp:189
VOID SetProgress(ULONG ulProgress, ULONG ulProgressMax)
Definition: loaddlg.cpp:200
CStringW m_szProgressText
Definition: loaddlg.cpp:181
LRESULT OnEraseBkgnd(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: loaddlg.cpp:245
LRESULT OnSetText(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: loaddlg.cpp:295
LRESULT OnPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: loaddlg.cpp:251
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:299
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
HRESULT hr
Definition: delayimp.cpp:582
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:367
BOOL WINAPI DeleteFileW(IN LPCWSTR lpFileName)
Definition: delete.c:39
BOOL WINAPI CreateDirectoryW(IN LPCWSTR lpPathName, IN LPSECURITY_ATTRIBUTES lpSecurityAttributes)
Definition: dir.c:58
DWORD WINAPI GetFileAttributesW(LPCWSTR lpFileName)
Definition: fileinfo.c:636
BOOL WINAPI WriteFile(_In_ HANDLE hFile, _In_reads_bytes_opt_(nNumberOfBytesToWrite) LPCVOID lpBuffer, _In_ DWORD nNumberOfBytesToWrite, _Out_opt_ LPDWORD lpNumberOfBytesWritten, _Inout_opt_ LPOVERLAPPED lpOverlapped)
Definition: rw.c:25
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:4152
HRESULT WINAPI UrlUnescapeW(WCHAR *url, WCHAR *unescaped, DWORD *unescaped_len, DWORD flags)
Definition: path.c:2912
HRESULT WINAPI PathCreateFromUrlW(const WCHAR *url, WCHAR *path, DWORD *pcchPath, DWORD dwReserved)
Definition: path.c:3049
BOOL WINAPI PathIsValidCharW(WCHAR c, DWORD class)
Definition: path.c:2197
_ACRTIMP size_t __cdecl wcslen(const wchar_t *)
Definition: wcs.c:2988
_ACRTIMP uintptr_t __cdecl _beginthreadex(void *, unsigned int, _beginthreadex_start_routine_t, void *, unsigned int, unsigned int *)
Definition: thread.c:207
_ACRTIMP int __cdecl strcmp(const char *, const char *)
Definition: string.c:3324
LPWSTR WINAPI StrFormatByteSizeW(LONGLONG llBytes, LPWSTR lpszDest, UINT cchMax)
Definition: string.c:854
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:3723
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_(Height *Stride) PUCHAR Buffer, _In_ ULONG BitsPerPixel, _In_ ULONG Stride)
Definition: common.c:42
#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:24
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
unsigned int UINT
Definition: sysinfo.c:13
HLOCAL NTAPI LocalFree(HLOCAL hMem)
Definition: heapmem.c:1594
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:1241
static void SetFriendlyUrl(HWND hWnd, LPCWSTR pszUrl)
Definition: loaddlg.cpp:125
HWND g_hDownloadWnd
Definition: loaddlg.cpp:473
VOID UrlUnescapeAndMakeFileNameValid(CStringW &str)
Definition: loaddlg.cpp:109
BOOL DownloadListOfApplications(const CAtlList< CAppInfo * > &AppsList, UINT Flags)
Definition: loaddlg.cpp:1222
static VOID MessageBox_LoadString(HWND hOwnerWnd, INT StringID)
Definition: loaddlg.cpp:442
DownloadStatus
Definition: loaddlg.cpp:83
@ DLSTATUS_DOWNLOADING
Definition: loaddlg.cpp:85
@ DLSTATUS_FINISHED
Definition: loaddlg.cpp:89
@ DLSTATUS_WAITING_INSTALL
Definition: loaddlg.cpp:86
@ DLSTATUS_WAITING
Definition: loaddlg.cpp:84
@ DLSTATUS_INSTALLED
Definition: loaddlg.cpp:88
@ DLSTATUS_INSTALLING
Definition: loaddlg.cpp:87
static BOOL ShowLastError(HWND hWndOwner, BOOL bInetError, DWORD dwLastError)
Definition: loaddlg.cpp:452
CStringW LoadStatusString(DownloadStatus StatusParam)
Definition: loaddlg.cpp:93
#define FILENAME_VALID_CHAR
Definition: loaddlg.cpp:100
DownloadType
Definition: loaddlg.cpp:76
@ DLTYPE_DBUPDATE_UNOFFICIAL
Definition: loaddlg.cpp:79
@ DLTYPE_DBUPDATE
Definition: loaddlg.cpp:78
@ DLTYPE_APPLICATION
Definition: loaddlg.cpp:77
VOID DownloadApplicationsDB(LPCWSTR lpUrl, BOOL IsOfficial)
Definition: loaddlg.cpp:1252
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
_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
short WCHAR
Definition: pedump.c:58
#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
_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
@ 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:170
DownloadType DLType
Definition: loaddlg.cpp:165
CStringW szDependencies
Definition: loaddlg.cpp:175
CStringW szPackageName
Definition: loaddlg.cpp:172
CStringW szUrl
Definition: loaddlg.cpp:169
DownloadInfo(const CAppInfo &AppInfo, UINT DAF=0)
Definition: loaddlg.cpp:142
ULONG SizeInBytes
Definition: loaddlg.cpp:176
InstallerType IType
Definition: loaddlg.cpp:166
CStringW szSilentInstallArgs
Definition: loaddlg.cpp:174
bool Equal(const DownloadInfo &other) const
Definition: loaddlg.cpp:160
CStringW szSHA1
Definition: loaddlg.cpp:171
InstallerType IExecType
Definition: loaddlg.cpp:167
CStringW szFileName
Definition: loaddlg.cpp:173
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
LONG right
Definition: windef.h:108
LONG bottom
Definition: windef.h:109
LONG top
Definition: windef.h:107
LONG left
Definition: windef.h:106
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
const char * LPCSTR
Definition: typedefs.h:52
int32_t INT_PTR
Definition: typedefs.h:64
const uint16_t * PCWSTR
Definition: typedefs.h:57
const uint16_t * LPCWSTR
Definition: typedefs.h:57
uint16_t * LPWSTR
Definition: typedefs.h:56
PVOID HANDLE
Definition: typedefs.h:73
ULONG_PTR SIZE_T
Definition: typedefs.h:80
int32_t INT
Definition: typedefs.h:58
uint64_t ULONGLONG
Definition: typedefs.h:67
uint16_t * PWCHAR
Definition: typedefs.h:56
uint32_t ULONG
Definition: typedefs.h:59
#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:301
#define INTERNET_SCHEME_FTP
Definition: winhttp.h:49
#define ICU_DECODE
Definition: winhttp.h:353
#define INTERNET_SCHEME_HTTP
Definition: winhttp.h:47
#define SECURITY_FLAG_SECURE
Definition: winhttp.h:347
#define ICU_NO_ENCODE
Definition: winhttp.h:352
#define INTERNET_SCHEME_HTTPS
Definition: winhttp.h:48
#define ICU_ESCAPE
Definition: winhttp.h:53
#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:3074
#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:4983
#define GCLP_HICONSM
Definition: winuser.h:683
#define MAKELPARAM(l, h)
Definition: winuser.h:4116
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:6009
#define MB_OK
Definition: winuser.h:801
#define DT_VCENTER
Definition: winuser.h:543
#define PostMessage
Definition: winuser.h:5998
#define GetClassLongPtrW
Definition: winuser.h:4718
#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:6023
#define DispatchMessage
Definition: winuser.h:5931
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:5512
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:2444
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