ReactOS 0.4.17-dev-243-g1369312
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)
152 {
155 }
156 }
157
158 bool Equal(const DownloadInfo &other) const
159 {
160 return DLType == other.DLType && !lstrcmpW(szUrl, other.szUrl);
161 }
162
175};
176
177class CDownloaderProgress : public CWindowImpl<CDownloaderProgress, CWindow, CControlWinTraits>
178{
180
181 public:
183 {
184 }
185
186 VOID
188 {
189 if (Enable)
191 else
193
195 }
196
197 VOID
198 SetProgress(ULONG ulProgress, ULONG ulProgressMax)
199 {
200 WCHAR szProgress[100];
201
202 /* format the bits and bytes into pretty and accessible units... */
203 StrFormatByteSizeW(ulProgress, szProgress, _countof(szProgress));
204
205 /* use our subclassed progress bar text subroutine */
206 CStringW ProgressText;
207
208 if (ulProgressMax)
209 {
210 /* total size is known */
211 WCHAR szProgressMax[100];
212 UINT uiPercentage = ((ULONGLONG)ulProgress * 100) / ulProgressMax;
213
214 /* send the current progress to the progress bar */
215 if (!IsWindow())
216 return;
217 SendMessage(PBM_SETPOS, uiPercentage, 0);
218
219 /* format total download size */
220 StrFormatByteSizeW(ulProgressMax, szProgressMax, _countof(szProgressMax));
221
222 /* generate the text on progress bar */
223 ProgressText.Format(L"%u%% \x2014 %ls / %ls", uiPercentage, szProgress, szProgressMax);
224 }
225 else
226 {
227 /* send the current progress to the progress bar */
228 if (!IsWindow())
229 return;
230 SendMessage(PBM_SETPOS, 0, 0);
231
232 /* total size is not known, display only current size */
233 ProgressText.Format(L"%ls...", szProgress);
234 }
235
236 /* and finally display it */
237 if (!IsWindow())
238 return;
239 SetWindowText(ProgressText.GetString());
240 }
241
242 LRESULT
244 {
245 return TRUE;
246 }
247
248 LRESULT
250 {
251 PAINTSTRUCT ps;
252 HDC hDC = BeginPaint(&ps), hdcMem;
253 HBITMAP hbmMem;
254 HANDLE hOld;
255 RECT myRect;
256 UINT win_width, win_height;
257
258 GetClientRect(&myRect);
259
260 /* grab the progress bar rect size */
261 win_width = myRect.right - myRect.left;
262 win_height = myRect.bottom - myRect.top;
263
264 /* create an off-screen DC for double-buffering */
266 hbmMem = CreateCompatibleBitmap(hDC, win_width, win_height);
267
268 hOld = SelectObject(hdcMem, hbmMem);
269
270 /* call the original draw code and redirect it to our memory buffer */
272
273 /* draw our nifty progress text over it */
279
280 /* transfer the off-screen DC to the screen */
281 BitBlt(hDC, 0, 0, win_width, win_height, hdcMem, 0, 0, SRCCOPY);
282
283 /* free the off-screen DC */
284 SelectObject(hdcMem, hOld);
285 DeleteObject(hbmMem);
287
288 EndPaint(&ps);
289 return 0;
290 }
291
292 LRESULT
294 {
295 PCWSTR pszText = (PCWSTR)lParam;
296 if (pszText)
297 {
298 if (m_szProgressText != pszText)
299 {
300 m_szProgressText = pszText;
302 }
303 }
304 else
305 {
307 {
310 }
311 }
312 return TRUE;
313 }
314
320};
321
323{
324 public:
325 HWND
327 {
328 RECT r;
330 r.top = (2 * r.top + 1 * r.bottom) / 3; /* The vertical position at ratio 1 : 2 */
331 const INT MARGIN = 10;
332 ::InflateRect(&r, -MARGIN, -MARGIN);
333
336
338
339 AddColumn(0, 150, LVCFMT_LEFT);
340 AddColumn(1, 120, LVCFMT_LEFT);
341
342 return hwnd;
343 }
344
345 VOID
347 {
348 const INT base = GetItemCount();
349 for (INT i = Start; i < arrInfo.GetSize(); ++i)
350 {
351 AddRow(base + i - Start, arrInfo[i].szName, DLSTATUS_WAITING);
352 }
353 }
354
355 VOID
357 {
358 CStringW szBuffer = LoadStatusString(Status);
359 SetItemText(ItemIndex, 1, szBuffer.GetString());
360 }
361
362 BOOL
363 AddItem(INT ItemIndex, LPWSTR lpText)
364 {
366
367 ZeroMemory(&Item, sizeof(Item));
368
369 Item.mask = LVIF_TEXT | LVIF_STATE;
370 Item.pszText = lpText;
371 Item.iItem = ItemIndex;
372
373 return InsertItem(&Item);
374 }
375
376 VOID
378 {
379 CStringW szStatus = LoadStatusString(Status);
380 AddItem(RowIndex, const_cast<LPWSTR>(szAppName));
381 SetDownloadStatus(RowIndex, Status);
382 }
383
384 BOOL
386 {
387 LVCOLUMNW Column;
388 ZeroMemory(&Column, sizeof(Column));
389
391 Column.iSubItem = Index;
392 Column.cx = Width;
393 Column.fmt = Format;
394
395 return (InsertColumn(Index, &Column) == -1) ? FALSE : TRUE;
396 }
397};
398
399#ifdef USE_CERT_PINNING
400static BOOL
401CertGetSubjectAndIssuer(HINTERNET hFile, CLocalPtr<char> &subjectInfo, CLocalPtr<char> &issuerInfo)
402{
403 DWORD certInfoLength;
406
407 size = sizeof(flags);
409 {
410 return FALSE;
411 }
412
414 {
415 return FALSE;
416 }
417
418 /* Despite what the header indicates, the implementation of INTERNET_CERTIFICATE_INFO is not Unicode-aware. */
419 certInfoLength = sizeof(certInfo);
421 {
422 return FALSE;
423 }
424
425 subjectInfo.Attach(certInfo.lpszSubjectInfo);
426 issuerInfo.Attach(certInfo.lpszIssuerInfo);
427
428 if (certInfo.lpszProtocolName)
429 LocalFree(certInfo.lpszProtocolName);
430 if (certInfo.lpszSignatureAlgName)
432 if (certInfo.lpszEncryptionAlgName)
434
435 return certInfo.lpszSubjectInfo && certInfo.lpszIssuerInfo;
436}
437#endif
438
439static inline VOID
440MessageBox_LoadString(HWND hOwnerWnd, INT StringID)
441{
442 CStringW szMsgText;
443 if (szMsgText.LoadStringW(StringID))
444 {
445 MessageBoxW(hOwnerWnd, szMsgText.GetString(), NULL, MB_OK | MB_ICONERROR);
446 }
447}
448
449static BOOL
450ShowLastError(HWND hWndOwner, BOOL bInetError, DWORD dwLastError)
451{
452 CLocalPtr<WCHAR> lpMsg;
453
454 if (!FormatMessageW(
457 (bInetError ? GetModuleHandleW(L"wininet.dll") : NULL), dwLastError, LANG_USER_DEFAULT, (LPWSTR)&lpMsg, 0,
458 NULL))
459 {
460 DPRINT1("FormatMessageW unexpected failure (err %d)\n", GetLastError());
461 return FALSE;
462 }
463
464 if (hWndOwner && !IsWindowVisible(hWndOwner))
465 hWndOwner = NULL;
466 MessageBoxW(hWndOwner, lpMsg, NULL, MB_OK | MB_ICONERROR);
467 return TRUE;
468}
469
470// Download dialog (loaddlg.cpp)
472
474 public CComCoClass<CDownloadManager, &CLSID_NULL>,
475 public CComObjectRootEx<CComMultiThreadModelNoCS>,
476 public IUnknown
477{
478public:
479 enum {
480 WM_ISCANCELLED = WM_APP, // Return BOOL
481 WM_SETSTATUS, // wParam DownloadStatus
482 WM_GETINSTANCE, // Return CDownloadManager*
483 WM_GETNEXT, // Return DownloadInfo* or NULL
484 };
485
487
488 static CDownloadManager*
490 {
491 if (!(Flags & DAF_MODAL))
492 {
494 if (pExisting)
495 {
496 pExisting->AddRef();
497 return pExisting;
498 }
499 }
501 if (FAILED(ShellObjectCreator(obj)))
502 return NULL;
503 obj->m_fDaf = Flags;
504 obj->m_bModal = !!(Flags & DAF_MODAL);
505 return obj.Detach();
506 }
507
508 static BOOL
510 {
512 if (!p)
513 return FALSE;
514 Obj.Attach(p);
515 return TRUE;
516 }
517
518 static CDownloadManager*
520 {
523 return NULL;
524 }
525
526 BOOL
528 {
530 }
531
532 BOOL
534 {
535 return m_fDaf & DAF_SILENT;
536 }
537
538 void StartWorkerThread();
539 void Add(const DownloadInfo &Info);
540 void Show();
543 void UpdateProgress(ULONG ulProgress, ULONG ulProgressMax);
544 static unsigned int CALLBACK ThreadFunc(void*ThreadParam);
546
551
563};
564
565void
567{
568 AddRef(); // To keep m_List alive in thread
569 unsigned int ThreadId;
570 HANDLE Thread = (HANDLE)_beginthreadex(NULL, 0, ThreadFunc, this, 0, &ThreadId);
571 if (Thread)
573 else
574 Release();
575}
576
577void
579{
580 const UINT count = m_List.GetSize(), start = count;
581 for (UINT i = 0; i < count; ++i)
582 {
583 if (Info.Equal(m_List[i]))
584 return; // Already in the list
585 }
586
587 if (!Info.szDependencies.IsEmpty())
588 {
589 CStringW deps = Info.szDependencies;
590 for (int pos = 1; pos > 0; deps = deps.Mid(pos + 1))
591 {
592 pos = deps.Find(L'|');
593 CStringW pkg = (pos > 0 ? deps.Left(pos) : deps).Trim();
594
595 // In the future a package might need to specify dependency version or WoW64
596 // information ("vcredist*x64" etc), for now, just remove possible modifiers.
597 int suffix = pkg.FindOneOf(L"*<=>:/\\?");
598 if (suffix > 0)
599 pkg = pkg.Left(suffix);
600
602 Deleter <CAvailableApplicationInfo*>del(pApp);
603 if (!pApp || pApp->IsInstalled())
604 continue;
605 // Add the dependency before the application in the list
606 Add(DownloadInfo(*pApp, DAF_SILENT));
607 }
608 }
609
610 m_List.Add(Info);
611 if (m_hDlg)
613}
614
615void
617{
618 HWND hDlg = NULL;
619 const BOOL bSilent = IsSilentDialog(), bModal = m_bModal;
620 if (bModal && !bSilent)
622 else if (!m_hDlg || !IsWindow(m_hDlg))
624
625 // A DialogBox dialog cannot be invisible, it is forced visible after WM_INITDIALOG returns.
626 // We therefore use a modeless dialog when we are both modal and silent.
627 for (MSG msg; bModal && bSilent && hDlg && GetMessageW(&msg, NULL, 0, 0);)
629}
630
633{
635 if (!pThis)
636 {
637 if (uMsg != WM_INITDIALOG)
638 return FALSE;
640 pThis = (CDownloadManager*)lParam;
641 }
642 return pThis->RealDlgProc(hDlg, uMsg, wParam, lParam);
643}
644
647{
648 switch (uMsg)
649 {
650 case WM_INITDIALOG:
651 {
652 g_Busy++;
653 AddRef();
654 m_hDlg = hDlg;
655 if (!m_bModal)
656 g_hDownloadWnd = hDlg;
657
658 HICON hIconSm, hIconBg;
659 if (hMainWnd)
660 {
663 }
664 if (!hMainWnd || (!hIconBg || !hIconSm))
665 {
667 }
668 SendMessageW(hDlg, WM_SETICON, ICON_BIG, (LPARAM)hIconBg);
669 SendMessageW(hDlg, WM_SETICON, ICON_SMALL, (LPARAM)hIconSm);
670
674 buf.Replace(L"%ls", L"");
675 SetWindowTextW(hDlg, buf); // "Downloading..."
676
678 if (hItem)
679 {
680 // initialize the default values for our nifty progress bar
681 // and subclass it so that it learns to print a status text
683 m_ProgressBar.SendMessageW(PBM_SETRANGE, 0, MAKELPARAM(0, 100));
684 m_ProgressBar.SendMessageW(PBM_SETPOS, 0, 0);
685 if (m_List.GetSize() > 0)
686 m_ProgressBar.SetProgress(0, m_List[0].SizeInBytes);
687 }
688
689 if (!m_ListView.Create(hDlg))
690 return FALSE;
692
695 return TRUE;
696 }
697
698 case WM_COMMAND:
699 if (LOWORD(wParam) == IDCANCEL)
700 {
702 PostMessageW(hDlg, WM_CLOSE, 0, 0);
703 }
704 return FALSE;
705
706 case WM_CLOSE:
708 if (m_ProgressBar)
710 return m_bModal && !IsSilentDialog() ? ::EndDialog(hDlg, 0) : ::DestroyWindow(hDlg);
711
712 case WM_DESTROY:
713 if (g_hDownloadWnd == hDlg)
715 g_Busy--;
716 if (hMainWnd)
718 if (m_bModal && IsSilentDialog())
720 Release();
721 break;
722
723 case WM_ISCANCELLED:
724 return SetDlgMsgResult(hDlg, uMsg, m_bCancelled);
725
726 case WM_SETSTATUS:
728 break;
729
730 case WM_GETINSTANCE:
731 return SetDlgMsgResult(hDlg, uMsg, (INT_PTR)this);
732
733 case WM_GETNEXT:
734 {
735 DownloadInfo *pItem = NULL;
737 pItem = &m_List[m_Index++];
738 return SetDlgMsgResult(hDlg, uMsg, (INT_PTR)pItem);
739 }
740 }
741 return FALSE;
742}
743
744void
746{
747 m_ProgressBar.SetProgress(ulProgress, ulProgressMax);
748}
749
750unsigned int CALLBACK
752{
753 CDownloadManager *pThis = (CDownloadManager*)ThreadParam;
754 HWND hDlg = pThis->m_hDlg;
755 for (;;)
756 {
757 DownloadInfo *pItem = (DownloadInfo*)SendMessageW(hDlg, WM_GETNEXT, 0, 0);
758 if (!pItem)
759 break;
760 pThis->PerformDownloadAndInstall(*pItem);
761 }
762 SendMessageW(hDlg, WM_CLOSE, 0, 0);
763 return pThis->Release();
764}
765
766void
768{
769 const HWND hDlg = m_hDlg;
772
774 m_ProgressBar.SendMessageW(PBM_SETPOS, 0, 0);
775 m_ProgressBar.SetProgress(0, Info.SizeInBytes);
776
778 CPathW Path;
779 PCWSTR p;
780
781 ULONG dwContentLen, dwBytesWritten, dwBytesRead, dwStatus, dwStatusLen;
782 ULONG dwCurrentBytesRead = 0;
783 BOOL bTempfile = FALSE, bCancelled = FALSE;
784
785 HINTERNET hOpen = NULL;
788
789
790 LPCWSTR lpszAgent = L"RApps/1.1";
791 const DWORD dwUrlConnectFlags =
793 URL_COMPONENTSW urlComponents;
794 size_t urlLength;
795 unsigned char lpBuffer[4096];
796
797 // Change caption to show the currently downloaded app
798 switch (Info.DLType)
799 {
801 str.Format(m_szCaptionFmt, Info.szName.GetString());
802 break;
803 case DLTYPE_DBUPDATE:
805 break;
808 break;
809 }
810 SetWindowTextW(hDlg, str);
811
812 // is this URL an update package for RAPPS? if so store it in a different place
813 if (Info.DLType != DLTYPE_APPLICATION)
814 {
816 {
818 goto end;
819 }
820 }
821 else
822 {
824 }
825
826 // build the path for the download
827 p = wcsrchr(Info.szUrl.GetString(), L'/');
828
829 // do we have a final slash separator?
830 if (!p)
831 {
833 goto end;
834 }
835
836 // is the path valid? can we access it?
838 {
840 {
842 goto end;
843 }
844 }
845
846 switch (Info.DLType)
847 {
848 case DLTYPE_DBUPDATE:
851 break;
853 {
854 CStringW name = Info.szFileName;
855 if (name.IsEmpty())
856 name = p + 1; // use the filename retrieved from URL
858 Path += name;
859 break;
860 }
861 }
862
863 if ((Info.DLType == DLTYPE_APPLICATION) && Info.szSHA1[0] &&
865 {
866 // only open it in case of total correctness
867 if (VerifyInteg(Info.szSHA1.GetString(), Path))
868 goto run;
869 }
870
871 // Download it
873 /* FIXME: this should just be using the system-wide proxy settings */
874 switch (SettingsInfo.Proxy)
875 {
876 case 0: // preconfig
877 default:
878 hOpen = InternetOpenW(lpszAgent, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
879 break;
880 case 1: // direct (no proxy)
881 hOpen = InternetOpenW(lpszAgent, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
882 break;
883 case 2: // use proxy
884 hOpen = InternetOpenW(
886 break;
887 }
888
889 if (!hOpen)
890 {
892 goto end;
893 }
894
895 bTempfile = TRUE;
896 dwContentLen = 0;
897 dwStatusLen = sizeof(dwStatus);
898 ZeroMemory(&urlComponents, sizeof(urlComponents));
899 urlComponents.dwStructSize = sizeof(urlComponents);
900
901 urlLength = Info.szUrl.GetLength();
902 urlComponents.dwSchemeLength = urlLength + 1;
903 urlComponents.lpszScheme = (LPWSTR)malloc(urlComponents.dwSchemeLength * sizeof(WCHAR));
904
905 if (!InternetCrackUrlW(Info.szUrl, urlLength + 1, ICU_DECODE | ICU_ESCAPE, &urlComponents))
906 {
908 goto end;
909 }
910
911 if (urlComponents.nScheme == INTERNET_SCHEME_HTTP || urlComponents.nScheme == INTERNET_SCHEME_HTTPS)
912 {
913 hFile = InternetOpenUrlW(hOpen, Info.szUrl, NULL, 0, dwUrlConnectFlags, 0);
914 if (!hFile)
915 {
917 {
918 /* Workaround for CORE-17377 */
920 }
921 goto end;
922 }
923
924 // query connection
926 {
928 goto end;
929 }
930
932 {
934 goto end;
935 }
936
937 // query content length
939 }
940 else if (urlComponents.nScheme == INTERNET_SCHEME_FTP)
941 {
942 // force passive mode on FTP
943 hFile =
944 InternetOpenUrlW(hOpen, Info.szUrl, NULL, 0, dwUrlConnectFlags | INTERNET_FLAG_PASSIVE, 0);
945 if (!hFile)
946 {
948 {
949 /* Workaround for CORE-17377 */
951 }
952 goto end;
953 }
954
955 dwContentLen = FtpGetFileSize(hFile, &dwStatus);
956 }
957 else if (urlComponents.nScheme == INTERNET_SCHEME_FILE)
958 {
959 // Add support for the file scheme so testing locally is simpler
960 WCHAR LocalFilePath[MAX_PATH];
961 DWORD cchPath = _countof(LocalFilePath);
962 // Ideally we would use PathCreateFromUrlAlloc here, but that is not exported (yet)
963 HRESULT hr = PathCreateFromUrlW(Info.szUrl, LocalFilePath, &cchPath, 0);
964 if (SUCCEEDED(hr))
965 {
966 if (CopyFileW(LocalFilePath, Path, FALSE))
967 {
968 goto run;
969 }
970 else
971 {
973 goto end;
974 }
975 }
976 else
977 {
979 goto end;
980 }
981 }
982
983 if (!dwContentLen)
984 {
985 // Someone was nice enough to add this, let's use it
986 if (Info.SizeInBytes)
987 {
988 dwContentLen = Info.SizeInBytes;
989 }
990 else
991 {
992 // content-length is not known, enable marquee mode
994 }
995 }
996
997 free(urlComponents.lpszScheme);
998
999#ifdef USE_CERT_PINNING
1000 // are we using HTTPS to download the RAPPS update package? check if the certificate is original
1001 if ((urlComponents.nScheme == INTERNET_SCHEME_HTTPS) && (Info.DLType == DLTYPE_DBUPDATE))
1002 {
1003 CLocalPtr<char> subjectName, issuerName;
1004 CStringA szMsgText;
1005 bool bAskQuestion = false;
1006 if (!CertGetSubjectAndIssuer(hFile, subjectName, issuerName))
1007 {
1008 szMsgText.LoadStringW(IDS_UNABLE_TO_QUERY_CERT);
1009 bAskQuestion = true;
1010 }
1011 else if (!IsTrustedPinnedCert(subjectName, issuerName))
1012 {
1013 szMsgText.Format(IDS_MISMATCH_CERT_INFO, (LPCSTR)subjectName, (LPCSTR)issuerName);
1014 bAskQuestion = true;
1015 }
1016
1017 if (bAskQuestion)
1018 {
1019 if (MessageBoxA(hDlg, szMsgText, NULL, MB_YESNO | MB_ICONERROR) != IDYES)
1020 {
1021 goto end;
1022 }
1023 }
1024 }
1025#endif
1026
1028 if (hOut == INVALID_HANDLE_VALUE)
1029 {
1031 goto end;
1032 }
1033
1034 dwCurrentBytesRead = 0;
1035 do
1036 {
1037 bCancelled = IsCancelled();
1038 if (bCancelled)
1039 break;
1040
1041 if (!InternetReadFile(hFile, lpBuffer, _countof(lpBuffer), &dwBytesRead))
1042 {
1044 goto end;
1045 }
1046
1047 if (!WriteFile(hOut, &lpBuffer[0], dwBytesRead, &dwBytesWritten, NULL))
1048 {
1050 goto end;
1051 }
1052
1053 dwCurrentBytesRead += dwBytesRead;
1054 UpdateProgress(dwCurrentBytesRead, dwContentLen);
1055
1056 } while (dwBytesRead);
1057
1058 CloseHandle(hOut);
1059 hOut = INVALID_HANDLE_VALUE;
1060
1061 if (bCancelled)
1062 {
1063 DPRINT1("Operation cancelled\n");
1064 goto end;
1065 }
1066
1067 if (!dwContentLen)
1068 {
1069 // set progress bar to 100%
1071
1072 dwContentLen = dwCurrentBytesRead;
1073 UpdateProgress(dwCurrentBytesRead, dwContentLen);
1074 }
1075
1076 /* if this thing isn't a RAPPS update and it has a SHA-1 checksum
1077 verify its integrity by using the native advapi32.A_SHA1 functions */
1078 if ((Info.DLType == DLTYPE_APPLICATION) && Info.szSHA1[0] != 0)
1079 {
1080 CStringW szMsgText;
1081
1082 // change a few strings in the download dialog to reflect the verification process
1083 if (!szMsgText.LoadStringW(IDS_INTEG_CHECK_TITLE))
1084 {
1085 DPRINT1("Unable to load string\n");
1086 goto end;
1087 }
1088
1089 SetWindowTextW(hDlg, szMsgText);
1091
1092 // this may take a while, depending on the file size
1093 if (!VerifyInteg(Info.szSHA1, Path))
1094 {
1095 if (!szMsgText.LoadStringW(IDS_INTEG_CHECK_FAIL))
1096 {
1097 DPRINT1("Unable to load string\n");
1098 goto end;
1099 }
1100
1101 MessageBoxW(hDlg, szMsgText, NULL, MB_OK | MB_ICONERROR);
1102 goto end;
1103 }
1104 }
1105
1106run:
1108
1109 // run it
1110 if (Info.DLType == DLTYPE_APPLICATION)
1111 {
1112 BOOL bSilentInstall = Info.Flags & DAF_SILENT;
1113 CStringW app, params, tempdir;
1114 SHELLEXECUTEINFOW shExInfo = { sizeof(shExInfo), SEE_MASK_NOCLOSEPROCESS, hDlg };
1115 shExInfo.lpVerb = L"open";
1116 shExInfo.lpFile = Path;
1117 shExInfo.lpParameters = L"";
1118 shExInfo.nShow = SW_SHOW;
1119
1120 if (Info.IType == INSTALLER_GENERATE)
1121 {
1122 params = L"/" CMD_KEY_GENINST + CStringW(bSilentInstall ? L" /S" : L"") +
1123 L" \"" + Info.szPackageName + L"\" \"" + shExInfo.lpFile + L"\"";
1124 shExInfo.lpParameters = params;
1125 shExInfo.lpFile = app.GetBuffer(MAX_PATH);
1126 GetModuleFileNameW(NULL, const_cast<LPWSTR>(shExInfo.lpFile), MAX_PATH);
1127 app.ReleaseBuffer();
1128 }
1129 else if (Info.IType == INSTALLER_EXEINZIP)
1130 {
1131 HRESULT hr = ExtractArchiveForExecution(Path, Info.szPackageName, tempdir, app);
1132 if (FAILED(hr))
1133 {
1134 ShowLastError(hDlg, FALSE, hr);
1135 goto end;
1136 }
1137 shExInfo.lpFile = app;
1138 }
1139
1140 if (bSilentInstall)
1141 {
1142 if (!Info.szSilentInstallArgs.IsEmpty())
1143 {
1144 // The package wants to force specific parameters
1145 shExInfo.lpParameters = Info.szSilentInstallArgs.GetString();
1146 }
1147 else
1148 {
1149 UINT extrainfo = 0;
1150 InstallerType it = Info.IExecType;
1151
1152 if (it == INSTALLER_UNKNOWN || it == INSTALLER_EXEINZIP)
1153 it = GuessInstallerType(shExInfo.lpFile, extrainfo);
1154
1155 if (GetSilentInstallParameters(it, extrainfo, shExInfo.lpFile, params))
1156 {
1157 shExInfo.lpParameters = params;
1158 if (it == INSTALLER_MSI)
1159 shExInfo.lpFile = L"msiexec.exe"; // params contains the .msi path
1160 }
1161 }
1162 }
1163
1164 /* FIXME: Do we want to log installer status? */
1165 WriteLogMessage(EVENTLOG_SUCCESS, MSG_SUCCESS_INSTALL, Info.szName);
1166
1167 if (ShellExecuteExW(&shExInfo))
1168 {
1169 // reflect installation progress in the titlebar
1170 // TODO: make a separate string with a placeholder to include app name?
1172 SetWindowTextW(hDlg, szMsgText);
1173
1175
1176 // TODO: issue an install operation separately so that the apps could be downloaded in the background
1177 if (shExInfo.hProcess)
1178 {
1180 CloseHandle(shExInfo.hProcess);
1182 }
1183 }
1184 else
1185 {
1187 }
1188
1189 if (!tempdir.IsEmpty())
1190 {
1191 DeleteDirectoryTree(tempdir, hDlg);
1192 }
1193 }
1194
1195end:
1196 if (hOut != INVALID_HANDLE_VALUE)
1197 CloseHandle(hOut);
1198
1199 if (hFile)
1201 InternetCloseHandle(hOpen);
1202
1203 if (bTempfile)
1204 {
1205 if (bCancelled || (SettingsInfo.bDelInstaller && Info.DLType == DLTYPE_APPLICATION))
1206 {
1207 // Don't delete .zip/.cab files so the user can extract from them
1208 if (bCancelled || Info.IType == INSTALLER_GENERATE || Info.IType == INSTALLER_EXEINZIP ||
1210 {
1212 }
1213 }
1214 }
1215
1217}
1218
1219BOOL
1221{
1222 if (AppsList.IsEmpty())
1223 return FALSE;
1224
1227 return FALSE;
1228
1229 for (POSITION it = AppsList.GetHeadPosition(); it;)
1230 {
1231 const CAppInfo *Info = AppsList.GetNext(it);
1232 pDM->Add(DownloadInfo(*Info, Flags));
1233 }
1234 pDM->Show();
1235 return TRUE;
1236}
1237
1238BOOL
1240{
1241 if (!pAppInfo)
1242 return FALSE;
1243
1245 list.AddTail(pAppInfo);
1247}
1248
1249VOID
1251{
1254 return;
1255
1256 DownloadInfo DatabaseDLInfo;
1257 DatabaseDLInfo.szUrl = lpUrl;
1258 DatabaseDLInfo.szName.LoadStringW(IDS_DL_DIALOG_DB_DISP);
1259 DatabaseDLInfo.DLType = IsOfficial ? DLTYPE_DBUPDATE : DLTYPE_DBUPDATE_UNOFFICIAL;
1260
1261 pDM->Add(DatabaseDLInfo);
1262 pDM->Show();
1263}
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:326
VOID SetDownloadStatus(INT ItemIndex, DownloadStatus Status)
Definition: loaddlg.cpp:356
VOID AddRow(INT RowIndex, LPCWSTR szAppName, const DownloadStatus Status)
Definition: loaddlg.cpp:377
BOOL AddColumn(INT Index, INT Width, INT Format)
Definition: loaddlg.cpp:385
VOID LoadList(ATL::CSimpleArray< DownloadInfo > arrInfo, UINT Start=0)
Definition: loaddlg.cpp:346
BOOL AddItem(INT ItemIndex, LPWSTR lpText)
Definition: loaddlg.cpp:363
static INT_PTR CALLBACK DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: loaddlg.cpp:632
void PerformDownloadAndInstall(const DownloadInfo &Info)
Definition: loaddlg.cpp:767
static CDownloadManager * FindInstance()
Definition: loaddlg.cpp:519
void UpdateProgress(ULONG ulProgress, ULONG ulProgressMax)
Definition: loaddlg.cpp:745
static unsigned int CALLBACK ThreadFunc(void *ThreadParam)
Definition: loaddlg.cpp:751
WCHAR m_szCaptionFmt[100]
Definition: loaddlg.cpp:559
CDownloaderProgress m_ProgressBar
Definition: loaddlg.cpp:562
BOOL IsSilentDialog()
Definition: loaddlg.cpp:533
static CDownloadManager * CreateInstanceHelper(UINT Flags)
Definition: loaddlg.cpp:489
void StartWorkerThread()
Definition: loaddlg.cpp:566
ATL::CSimpleArray< DownloadInfo > m_List
Definition: loaddlg.cpp:560
BOOL IsCancelled()
Definition: loaddlg.cpp:527
CDowloadingAppsListView m_ListView
Definition: loaddlg.cpp:561
INT_PTR RealDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: loaddlg.cpp:646
static BOOL CreateInstance(BOOL Modal, CComPtr< CDownloadManager > &Obj)
Definition: loaddlg.cpp:509
void Add(const DownloadInfo &Info)
Definition: loaddlg.cpp:578
VOID SetMarquee(BOOL Enable)
Definition: loaddlg.cpp:187
VOID SetProgress(ULONG ulProgress, ULONG ulProgressMax)
Definition: loaddlg.cpp:198
CStringW m_szProgressText
Definition: loaddlg.cpp:179
LRESULT OnEraseBkgnd(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: loaddlg.cpp:243
LRESULT OnSetText(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: loaddlg.cpp:293
LRESULT OnPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: loaddlg.cpp:249
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:365
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: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
_ACRTIMP size_t __cdecl wcslen(const wchar_t *)
Definition: wcs.c:2983
_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:3319
LPWSTR WINAPI StrFormatByteSizeW(LONGLONG llBytes, LPWSTR lpszDest, UINT cchMax)
Definition: string.c:2524
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
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:1239
static void SetFriendlyUrl(HWND hWnd, LPCWSTR pszUrl)
Definition: loaddlg.cpp:123
HWND g_hDownloadWnd
Definition: loaddlg.cpp:471
VOID UrlUnescapeAndMakeFileNameValid(CStringW &str)
Definition: loaddlg.cpp:107
BOOL DownloadListOfApplications(const CAtlList< CAppInfo * > &AppsList, UINT Flags)
Definition: loaddlg.cpp:1220
static VOID MessageBox_LoadString(HWND hOwnerWnd, INT StringID)
Definition: loaddlg.cpp:440
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:450
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:1250
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
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:168
DownloadType DLType
Definition: loaddlg.cpp:163
CStringW szDependencies
Definition: loaddlg.cpp:173
CStringW szPackageName
Definition: loaddlg.cpp:170
CStringW szUrl
Definition: loaddlg.cpp:167
DownloadInfo(const CAppInfo &AppInfo, UINT DAF=0)
Definition: loaddlg.cpp:140
ULONG SizeInBytes
Definition: loaddlg.cpp:174
InstallerType IType
Definition: loaddlg.cpp:164
CStringW szSilentInstallArgs
Definition: loaddlg.cpp:172
bool Equal(const DownloadInfo &other) const
Definition: loaddlg.cpp:158
CStringW szSHA1
Definition: loaddlg.cpp:169
InstallerType IExecType
Definition: loaddlg.cpp:165
CStringW szFileName
Definition: loaddlg.cpp:171
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