ReactOS 0.4.16-dev-752-g47bae01
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 }
141 {
143 szName = AppInfo.szDisplayName;
144 IType = AppInfo.GetInstallerType();
145 szPackageName = AppInfo.szIdentifier;
146
147 CConfigParser *cfg = static_cast<const CAvailableApplicationInfo&>(AppInfo).GetConfigParser();
148 if (cfg)
150 }
151
152 bool Equal(const DownloadInfo &other) const
153 {
154 return DLType == other.DLType && !lstrcmpW(szUrl, other.szUrl);
155 }
156
165};
166
167class CDownloaderProgress : public CWindowImpl<CDownloaderProgress, CWindow, CControlWinTraits>
168{
170
171 public:
173 {
174 }
175
176 VOID
178 {
179 if (Enable)
181 else
183
185 }
186
187 VOID
188 SetProgress(ULONG ulProgress, ULONG ulProgressMax)
189 {
190 WCHAR szProgress[100];
191
192 /* format the bits and bytes into pretty and accessible units... */
193 StrFormatByteSizeW(ulProgress, szProgress, _countof(szProgress));
194
195 /* use our subclassed progress bar text subroutine */
196 CStringW ProgressText;
197
198 if (ulProgressMax)
199 {
200 /* total size is known */
201 WCHAR szProgressMax[100];
202 UINT uiPercentage = ((ULONGLONG)ulProgress * 100) / ulProgressMax;
203
204 /* send the current progress to the progress bar */
205 if (!IsWindow())
206 return;
207 SendMessage(PBM_SETPOS, uiPercentage, 0);
208
209 /* format total download size */
210 StrFormatByteSizeW(ulProgressMax, szProgressMax, _countof(szProgressMax));
211
212 /* generate the text on progress bar */
213 ProgressText.Format(L"%u%% \x2014 %ls / %ls", uiPercentage, szProgress, szProgressMax);
214 }
215 else
216 {
217 /* send the current progress to the progress bar */
218 if (!IsWindow())
219 return;
220 SendMessage(PBM_SETPOS, 0, 0);
221
222 /* total size is not known, display only current size */
223 ProgressText.Format(L"%ls...", szProgress);
224 }
225
226 /* and finally display it */
227 if (!IsWindow())
228 return;
229 SetWindowText(ProgressText.GetString());
230 }
231
232 LRESULT
234 {
235 return TRUE;
236 }
237
238 LRESULT
240 {
241 PAINTSTRUCT ps;
242 HDC hDC = BeginPaint(&ps), hdcMem;
243 HBITMAP hbmMem;
244 HANDLE hOld;
245 RECT myRect;
246 UINT win_width, win_height;
247
248 GetClientRect(&myRect);
249
250 /* grab the progress bar rect size */
251 win_width = myRect.right - myRect.left;
252 win_height = myRect.bottom - myRect.top;
253
254 /* create an off-screen DC for double-buffering */
256 hbmMem = CreateCompatibleBitmap(hDC, win_width, win_height);
257
258 hOld = SelectObject(hdcMem, hbmMem);
259
260 /* call the original draw code and redirect it to our memory buffer */
262
263 /* draw our nifty progress text over it */
269
270 /* transfer the off-screen DC to the screen */
271 BitBlt(hDC, 0, 0, win_width, win_height, hdcMem, 0, 0, SRCCOPY);
272
273 /* free the off-screen DC */
274 SelectObject(hdcMem, hOld);
275 DeleteObject(hbmMem);
277
278 EndPaint(&ps);
279 return 0;
280 }
281
282 LRESULT
284 {
285 PCWSTR pszText = (PCWSTR)lParam;
286 if (pszText)
287 {
288 if (m_szProgressText != pszText)
289 {
290 m_szProgressText = pszText;
292 }
293 }
294 else
295 {
297 {
300 }
301 }
302 return TRUE;
303 }
304
310};
311
313{
314 public:
315 HWND
317 {
318 RECT r;
320 r.top = (2 * r.top + 1 * r.bottom) / 3; /* The vertical position at ratio 1 : 2 */
321 const INT MARGIN = 10;
322 ::InflateRect(&r, -MARGIN, -MARGIN);
323
326
328
329 AddColumn(0, 150, LVCFMT_LEFT);
330 AddColumn(1, 120, LVCFMT_LEFT);
331
332 return hwnd;
333 }
334
335 VOID
337 {
338 const INT base = GetItemCount();
339 for (INT i = Start; i < arrInfo.GetSize(); ++i)
340 {
341 AddRow(base + i - Start, arrInfo[i].szName, DLSTATUS_WAITING);
342 }
343 }
344
345 VOID
347 {
348 CStringW szBuffer = LoadStatusString(Status);
349 SetItemText(ItemIndex, 1, szBuffer.GetString());
350 }
351
352 BOOL
353 AddItem(INT ItemIndex, LPWSTR lpText)
354 {
356
357 ZeroMemory(&Item, sizeof(Item));
358
359 Item.mask = LVIF_TEXT | LVIF_STATE;
360 Item.pszText = lpText;
361 Item.iItem = ItemIndex;
362
363 return InsertItem(&Item);
364 }
365
366 VOID
368 {
369 CStringW szStatus = LoadStatusString(Status);
370 AddItem(RowIndex, const_cast<LPWSTR>(szAppName));
371 SetDownloadStatus(RowIndex, Status);
372 }
373
374 BOOL
376 {
377 LVCOLUMNW Column;
378 ZeroMemory(&Column, sizeof(Column));
379
381 Column.iSubItem = Index;
382 Column.cx = Width;
383 Column.fmt = Format;
384
385 return (InsertColumn(Index, &Column) == -1) ? FALSE : TRUE;
386 }
387};
388
389#ifdef USE_CERT_PINNING
390static BOOL
391CertGetSubjectAndIssuer(HINTERNET hFile, CLocalPtr<char> &subjectInfo, CLocalPtr<char> &issuerInfo)
392{
393 DWORD certInfoLength;
396
397 size = sizeof(flags);
399 {
400 return FALSE;
401 }
402
404 {
405 return FALSE;
406 }
407
408 /* Despite what the header indicates, the implementation of INTERNET_CERTIFICATE_INFO is not Unicode-aware. */
409 certInfoLength = sizeof(certInfo);
411 {
412 return FALSE;
413 }
414
415 subjectInfo.Attach(certInfo.lpszSubjectInfo);
416 issuerInfo.Attach(certInfo.lpszIssuerInfo);
417
418 if (certInfo.lpszProtocolName)
419 LocalFree(certInfo.lpszProtocolName);
420 if (certInfo.lpszSignatureAlgName)
422 if (certInfo.lpszEncryptionAlgName)
424
425 return certInfo.lpszSubjectInfo && certInfo.lpszIssuerInfo;
426}
427#endif
428
429static inline VOID
430MessageBox_LoadString(HWND hOwnerWnd, INT StringID)
431{
432 CStringW szMsgText;
433 if (szMsgText.LoadStringW(StringID))
434 {
435 MessageBoxW(hOwnerWnd, szMsgText.GetString(), NULL, MB_OK | MB_ICONERROR);
436 }
437}
438
439static BOOL
440ShowLastError(HWND hWndOwner, BOOL bInetError, DWORD dwLastError)
441{
442 CLocalPtr<WCHAR> lpMsg;
443
444 if (!FormatMessageW(
447 (bInetError ? GetModuleHandleW(L"wininet.dll") : NULL), dwLastError, LANG_USER_DEFAULT, (LPWSTR)&lpMsg, 0,
448 NULL))
449 {
450 DPRINT1("FormatMessageW unexpected failure (err %d)\n", GetLastError());
451 return FALSE;
452 }
453
454 if (hWndOwner && !IsWindowVisible(hWndOwner))
455 hWndOwner = NULL;
456 MessageBoxW(hWndOwner, lpMsg, NULL, MB_OK | MB_ICONERROR);
457 return TRUE;
458}
459
460// Download dialog (loaddlg.cpp)
462
464 public CComCoClass<CDownloadManager, &CLSID_NULL>,
465 public CComObjectRootEx<CComMultiThreadModelNoCS>,
466 public IUnknown
467{
468public:
469 enum {
470 WM_ISCANCELLED = WM_APP, // Return BOOL
471 WM_SETSTATUS, // wParam DownloadStatus
472 WM_GETINSTANCE, // Return CDownloadManager*
473 WM_GETNEXT, // Return DownloadInfo* or NULL
474 };
475
477
478 static CDownloadManager*
480 {
481 if (!Modal)
482 {
484 if (pExisting)
485 {
486 pExisting->AddRef();
487 return pExisting;
488 }
489 }
491 if (FAILED(ShellObjectCreator(obj)))
492 return NULL;
493 obj->m_bModal = Modal;
494 return obj.Detach();
495 }
496
497 static BOOL
499 {
501 if (!p)
502 return FALSE;
503 Obj.Attach(p);
504 return TRUE;
505 }
506
507 static CDownloadManager*
509 {
510 if (g_hDownloadWnd)
512 return NULL;
513 }
514
515 BOOL
517 {
519 }
520
521 void StartWorkerThread();
522 void Add(const DownloadInfo &Info);
523 void Show();
526 void UpdateProgress(ULONG ulProgress, ULONG ulProgressMax);
527 static unsigned int CALLBACK ThreadFunc(void*ThreadParam);
529
534
545};
546
547void
549{
550 AddRef(); // To keep m_List alive in thread
551 unsigned int ThreadId;
552 HANDLE Thread = (HANDLE)_beginthreadex(NULL, 0, ThreadFunc, this, 0, &ThreadId);
553 if (Thread)
555 else
556 Release();
557}
558
559void
561{
562 const UINT count = m_List.GetSize(), start = count;
563 for (UINT i = 0; i < count; ++i)
564 {
565 if (Info.Equal(m_List[i]))
566 return; // Already in the list
567 }
568 m_List.Add(Info);
569 if (m_hDlg)
571}
572
573void
575{
576 if (m_bModal)
578 else if (!m_hDlg || !IsWindow(m_hDlg))
580}
581
584{
586 if (!pThis)
587 {
588 if (uMsg != WM_INITDIALOG)
589 return FALSE;
591 pThis = (CDownloadManager*)lParam;
592 }
593 return pThis->RealDlgProc(hDlg, uMsg, wParam, lParam);
594}
595
598{
599 switch (uMsg)
600 {
601 case WM_INITDIALOG:
602 {
603 g_Busy++;
604 AddRef();
605 m_hDlg = hDlg;
606 if (!m_bModal)
607 g_hDownloadWnd = hDlg;
608
609 HICON hIconSm, hIconBg;
610 if (hMainWnd)
611 {
614 }
615 if (!hMainWnd || (!hIconBg || !hIconSm))
616 {
618 }
619 SendMessageW(hDlg, WM_SETICON, ICON_BIG, (LPARAM)hIconBg);
620 SendMessageW(hDlg, WM_SETICON, ICON_SMALL, (LPARAM)hIconSm);
621
625 buf.Replace(L"%ls", L"");
626 SetWindowTextW(hDlg, buf); // "Downloading..."
627
629 if (hItem)
630 {
631 // initialize the default values for our nifty progress bar
632 // and subclass it so that it learns to print a status text
634 m_ProgressBar.SendMessageW(PBM_SETRANGE, 0, MAKELPARAM(0, 100));
635 m_ProgressBar.SendMessageW(PBM_SETPOS, 0, 0);
636 if (m_List.GetSize() > 0)
637 m_ProgressBar.SetProgress(0, m_List[0].SizeInBytes);
638 }
639
640 if (!m_ListView.Create(hDlg))
641 return FALSE;
643
644 ShowWindow(hDlg, SW_SHOW);
646 return TRUE;
647 }
648
649 case WM_COMMAND:
650 if (LOWORD(wParam) == IDCANCEL)
651 {
653 PostMessageW(hDlg, WM_CLOSE, 0, 0);
654 }
655 return FALSE;
656
657 case WM_CLOSE:
659 if (m_ProgressBar)
661 return m_bModal ? ::EndDialog(hDlg, 0) : ::DestroyWindow(hDlg);
662
663 case WM_DESTROY:
664 if (g_hDownloadWnd == hDlg)
666 g_Busy--;
667 if (hMainWnd)
669 Release();
670 break;
671
672 case WM_ISCANCELLED:
673 return SetDlgMsgResult(hDlg, uMsg, m_bCancelled);
674
675 case WM_SETSTATUS:
677 break;
678
679 case WM_GETINSTANCE:
680 return SetDlgMsgResult(hDlg, uMsg, (INT_PTR)this);
681
682 case WM_GETNEXT:
683 {
684 DownloadInfo *pItem = NULL;
686 pItem = &m_List[m_Index++];
687 return SetDlgMsgResult(hDlg, uMsg, (INT_PTR)pItem);
688 }
689 }
690 return FALSE;
691}
692
693void
695{
696 m_ProgressBar.SetProgress(ulProgress, ulProgressMax);
697}
698
699unsigned int CALLBACK
701{
702 CDownloadManager *pThis = (CDownloadManager*)ThreadParam;
703 HWND hDlg = pThis->m_hDlg;
704 for (;;)
705 {
706 DownloadInfo *pItem = (DownloadInfo*)SendMessageW(hDlg, WM_GETNEXT, 0, 0);
707 if (!pItem)
708 break;
709 pThis->PerformDownloadAndInstall(*pItem);
710 }
711 SendMessageW(hDlg, WM_CLOSE, 0, 0);
712 return pThis->Release();
713}
714
715void
717{
718 const HWND hDlg = m_hDlg;
721
723 m_ProgressBar.SendMessageW(PBM_SETPOS, 0, 0);
724 m_ProgressBar.SetProgress(0, Info.SizeInBytes);
725
727 CPathW Path;
728 PCWSTR p;
729
730 ULONG dwContentLen, dwBytesWritten, dwBytesRead, dwStatus, dwStatusLen;
731 ULONG dwCurrentBytesRead = 0;
732 BOOL bTempfile = FALSE, bCancelled = FALSE;
733
734 HINTERNET hOpen = NULL;
737
738
739 LPCWSTR lpszAgent = L"RApps/1.1";
740 const DWORD dwUrlConnectFlags =
742 URL_COMPONENTSW urlComponents;
743 size_t urlLength;
744 unsigned char lpBuffer[4096];
745
746 // Change caption to show the currently downloaded app
747 switch (Info.DLType)
748 {
750 str.Format(m_szCaptionFmt, Info.szName.GetString());
751 break;
752 case DLTYPE_DBUPDATE:
754 break;
757 break;
758 }
759 SetWindowTextW(hDlg, str);
760
761 // is this URL an update package for RAPPS? if so store it in a different place
762 if (Info.DLType != DLTYPE_APPLICATION)
763 {
765 {
767 goto end;
768 }
769 }
770 else
771 {
773 }
774
775 // build the path for the download
776 p = wcsrchr(Info.szUrl.GetString(), L'/');
777
778 // do we have a final slash separator?
779 if (!p)
780 {
782 goto end;
783 }
784
785 // is the path valid? can we access it?
787 {
789 {
791 goto end;
792 }
793 }
794
795 switch (Info.DLType)
796 {
797 case DLTYPE_DBUPDATE:
800 break;
802 {
803 CStringW name = Info.szFileName;
804 if (name.IsEmpty())
805 name = p + 1; // use the filename retrieved from URL
807 Path += name;
808 break;
809 }
810 }
811
812 if ((Info.DLType == DLTYPE_APPLICATION) && Info.szSHA1[0] &&
814 {
815 // only open it in case of total correctness
816 if (VerifyInteg(Info.szSHA1.GetString(), Path))
817 goto run;
818 }
819
820 // Download it
822 /* FIXME: this should just be using the system-wide proxy settings */
823 switch (SettingsInfo.Proxy)
824 {
825 case 0: // preconfig
826 default:
827 hOpen = InternetOpenW(lpszAgent, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
828 break;
829 case 1: // direct (no proxy)
830 hOpen = InternetOpenW(lpszAgent, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
831 break;
832 case 2: // use proxy
833 hOpen = InternetOpenW(
835 break;
836 }
837
838 if (!hOpen)
839 {
841 goto end;
842 }
843
844 bTempfile = TRUE;
845 dwContentLen = 0;
846 dwStatusLen = sizeof(dwStatus);
847 ZeroMemory(&urlComponents, sizeof(urlComponents));
848 urlComponents.dwStructSize = sizeof(urlComponents);
849
850 urlLength = Info.szUrl.GetLength();
851 urlComponents.dwSchemeLength = urlLength + 1;
852 urlComponents.lpszScheme = (LPWSTR)malloc(urlComponents.dwSchemeLength * sizeof(WCHAR));
853
854 if (!InternetCrackUrlW(Info.szUrl, urlLength + 1, ICU_DECODE | ICU_ESCAPE, &urlComponents))
855 {
857 goto end;
858 }
859
860 if (urlComponents.nScheme == INTERNET_SCHEME_HTTP || urlComponents.nScheme == INTERNET_SCHEME_HTTPS)
861 {
862 hFile = InternetOpenUrlW(hOpen, Info.szUrl, NULL, 0, dwUrlConnectFlags, 0);
863 if (!hFile)
864 {
866 {
867 /* Workaround for CORE-17377 */
869 }
870 goto end;
871 }
872
873 // query connection
875 {
877 goto end;
878 }
879
881 {
883 goto end;
884 }
885
886 // query content length
888 }
889 else if (urlComponents.nScheme == INTERNET_SCHEME_FTP)
890 {
891 // force passive mode on FTP
892 hFile =
893 InternetOpenUrlW(hOpen, Info.szUrl, NULL, 0, dwUrlConnectFlags | INTERNET_FLAG_PASSIVE, 0);
894 if (!hFile)
895 {
897 {
898 /* Workaround for CORE-17377 */
900 }
901 goto end;
902 }
903
904 dwContentLen = FtpGetFileSize(hFile, &dwStatus);
905 }
906 else if (urlComponents.nScheme == INTERNET_SCHEME_FILE)
907 {
908 // Add support for the file scheme so testing locally is simpler
909 WCHAR LocalFilePath[MAX_PATH];
910 DWORD cchPath = _countof(LocalFilePath);
911 // Ideally we would use PathCreateFromUrlAlloc here, but that is not exported (yet)
912 HRESULT hr = PathCreateFromUrlW(Info.szUrl, LocalFilePath, &cchPath, 0);
913 if (SUCCEEDED(hr))
914 {
915 if (CopyFileW(LocalFilePath, Path, FALSE))
916 {
917 goto run;
918 }
919 else
920 {
922 goto end;
923 }
924 }
925 else
926 {
928 goto end;
929 }
930 }
931
932 if (!dwContentLen)
933 {
934 // Someone was nice enough to add this, let's use it
935 if (Info.SizeInBytes)
936 {
937 dwContentLen = Info.SizeInBytes;
938 }
939 else
940 {
941 // content-length is not known, enable marquee mode
943 }
944 }
945
946 free(urlComponents.lpszScheme);
947
948#ifdef USE_CERT_PINNING
949 // are we using HTTPS to download the RAPPS update package? check if the certificate is original
950 if ((urlComponents.nScheme == INTERNET_SCHEME_HTTPS) && (Info.DLType == DLTYPE_DBUPDATE))
951 {
952 CLocalPtr<char> subjectName, issuerName;
953 CStringA szMsgText;
954 bool bAskQuestion = false;
955 if (!CertGetSubjectAndIssuer(hFile, subjectName, issuerName))
956 {
957 szMsgText.LoadStringW(IDS_UNABLE_TO_QUERY_CERT);
958 bAskQuestion = true;
959 }
960 else if (!IsTrustedPinnedCert(subjectName, issuerName))
961 {
962 szMsgText.Format(IDS_MISMATCH_CERT_INFO, (LPCSTR)subjectName, (LPCSTR)issuerName);
963 bAskQuestion = true;
964 }
965
966 if (bAskQuestion)
967 {
968 if (MessageBoxA(hDlg, szMsgText, NULL, MB_YESNO | MB_ICONERROR) != IDYES)
969 {
970 goto end;
971 }
972 }
973 }
974#endif
975
977 if (hOut == INVALID_HANDLE_VALUE)
978 {
980 goto end;
981 }
982
983 dwCurrentBytesRead = 0;
984 do
985 {
986 bCancelled = IsCancelled();
987 if (bCancelled)
988 break;
989
990 if (!InternetReadFile(hFile, lpBuffer, _countof(lpBuffer), &dwBytesRead))
991 {
993 goto end;
994 }
995
996 if (!WriteFile(hOut, &lpBuffer[0], dwBytesRead, &dwBytesWritten, NULL))
997 {
999 goto end;
1000 }
1001
1002 dwCurrentBytesRead += dwBytesRead;
1003 UpdateProgress(dwCurrentBytesRead, dwContentLen);
1004
1005 } while (dwBytesRead);
1006
1007 CloseHandle(hOut);
1008 hOut = INVALID_HANDLE_VALUE;
1009
1010 if (bCancelled)
1011 {
1012 DPRINT1("Operation cancelled\n");
1013 goto end;
1014 }
1015
1016 if (!dwContentLen)
1017 {
1018 // set progress bar to 100%
1020
1021 dwContentLen = dwCurrentBytesRead;
1022 UpdateProgress(dwCurrentBytesRead, dwContentLen);
1023 }
1024
1025 /* if this thing isn't a RAPPS update and it has a SHA-1 checksum
1026 verify its integrity by using the native advapi32.A_SHA1 functions */
1027 if ((Info.DLType == DLTYPE_APPLICATION) && Info.szSHA1[0] != 0)
1028 {
1029 CStringW szMsgText;
1030
1031 // change a few strings in the download dialog to reflect the verification process
1032 if (!szMsgText.LoadStringW(IDS_INTEG_CHECK_TITLE))
1033 {
1034 DPRINT1("Unable to load string\n");
1035 goto end;
1036 }
1037
1038 SetWindowTextW(hDlg, szMsgText);
1040
1041 // this may take a while, depending on the file size
1042 if (!VerifyInteg(Info.szSHA1, Path))
1043 {
1044 if (!szMsgText.LoadStringW(IDS_INTEG_CHECK_FAIL))
1045 {
1046 DPRINT1("Unable to load string\n");
1047 goto end;
1048 }
1049
1050 MessageBoxW(hDlg, szMsgText, NULL, MB_OK | MB_ICONERROR);
1051 goto end;
1052 }
1053 }
1054
1055run:
1057
1058 // run it
1059 if (Info.DLType == DLTYPE_APPLICATION)
1060 {
1061 CStringW app, params;
1062 SHELLEXECUTEINFOW shExInfo = {0};
1063 shExInfo.cbSize = sizeof(shExInfo);
1064 shExInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
1065 shExInfo.lpVerb = L"open";
1066 shExInfo.lpFile = Path;
1067 shExInfo.lpParameters = L"";
1068 shExInfo.nShow = SW_SHOW;
1069
1070 if (Info.IType == INSTALLER_GENERATE)
1071 {
1072 params = L"/" + CStringW(CMD_KEY_GENINST) + L" \"" +
1073 Info.szPackageName + L"\" \"" +
1074 CStringW(shExInfo.lpFile) + L"\"";
1075 shExInfo.lpParameters = params;
1076 shExInfo.lpFile = app.GetBuffer(MAX_PATH);
1077 GetModuleFileNameW(NULL, const_cast<LPWSTR>(shExInfo.lpFile), MAX_PATH);
1078 app.ReleaseBuffer();
1079 }
1080
1081 /* FIXME: Do we want to log installer status? */
1082 WriteLogMessage(EVENTLOG_SUCCESS, MSG_SUCCESS_INSTALL, Info.szName);
1083
1084 if (ShellExecuteExW(&shExInfo))
1085 {
1086 // reflect installation progress in the titlebar
1087 // TODO: make a separate string with a placeholder to include app name?
1089 SetWindowTextW(hDlg, szMsgText);
1090
1092
1093 // TODO: issue an install operation separately so that the apps could be downloaded in the background
1094 if (shExInfo.hProcess)
1095 {
1097 CloseHandle(shExInfo.hProcess);
1099 }
1100 }
1101 else
1102 {
1104 }
1105 }
1106
1107end:
1108 if (hOut != INVALID_HANDLE_VALUE)
1109 CloseHandle(hOut);
1110
1111 if (hFile)
1113 InternetCloseHandle(hOpen);
1114
1115 if (bTempfile)
1116 {
1117 if (bCancelled || (SettingsInfo.bDelInstaller && Info.DLType == DLTYPE_APPLICATION))
1119 }
1120
1122}
1123
1124BOOL
1126{
1127 if (AppsList.IsEmpty())
1128 return FALSE;
1129
1131 if (!CDownloadManager::CreateInstance(bIsModal, pDM))
1132 return FALSE;
1133
1134 for (POSITION it = AppsList.GetHeadPosition(); it;)
1135 {
1136 const CAppInfo *Info = AppsList.GetNext(it);
1137 pDM->Add(DownloadInfo(*Info));
1138 }
1139 pDM->Show();
1140 return TRUE;
1141}
1142
1143BOOL
1145{
1146 const bool bModal = false;
1147 if (!pAppInfo)
1148 return FALSE;
1149
1151 list.AddTail(pAppInfo);
1152 return DownloadListOfApplications(list, bModal);
1153}
1154
1155VOID
1157{
1158 const bool bModal = true;
1160 if (!CDownloadManager::CreateInstance(bModal, pDM))
1161 return;
1162
1163 DownloadInfo DatabaseDLInfo;
1164 DatabaseDLInfo.szUrl = lpUrl;
1165 DatabaseDLInfo.szName.LoadStringW(IDS_DL_DIALOG_DB_DISP);
1166 DatabaseDLInfo.DLType = IsOfficial ? DLTYPE_DBUPDATE : DLTYPE_DBUPDATE_UNOFFICIAL;
1167
1168 pDM->Add(DatabaseDLInfo);
1169 pDM->Show();
1170}
static HDC hDC
Definition: 3dtext.c:33
PRTL_UNICODE_STRING_BUFFER Path
int strcmp(const char *String1, const char *String2)
Definition: utclib.c:469
Arabic default style
Definition: afstyles.h:94
#define DB_SAVEAS
Definition: appinfo.h:94
InstallerType
Definition: appinfo.h:83
@ INSTALLER_UNKNOWN
Definition: appinfo.h:84
@ INSTALLER_GENERATE
Definition: appinfo.h:85
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:254
BOOL GetStorageDirectory(CStringW &lpDirectory)
Definition: misc.cpp:172
#define IDD_DOWNLOAD_DIALOG
Definition: resource.h:65
#define IDS_UNABLE_TO_DOWNLOAD
Definition: resource.h:114
#define IDS_MISMATCH_CERT_INFO
Definition: resource.h:124
#define IDS_STATUS_FINISHED
Definition: resource.h:206
#define IDS_STATUS_WAITING
Definition: resource.h:205
#define IDS_DL_DIALOG_DB_DISP
Definition: resource.h:222
#define IDS_STATUS_INSTALLING
Definition: resource.h:204
#define IDS_UNABLE_TO_DOWNLOAD2
Definition: resource.h:115
#define IDC_DOWNLOAD_PROGRESS
Definition: resource.h:41
#define IDS_UNABLE_PATH
Definition: resource.h:125
#define IDS_STATUS_DOWNLOADED
Definition: resource.h:201
#define IDS_STATUS_DOWNLOADING
Definition: resource.h:203
#define IDS_UNABLE_TO_QUERY_CERT
Definition: resource.h:116
#define IDC_DOWNLOAD_STATUS
Definition: resource.h:42
#define IDS_STATUS_INSTALLED
Definition: resource.h:199
#define IDS_INTEG_CHECK_TITLE
Definition: resource.h:117
#define IDS_DL_DIALOG_DB_DOWNLOAD_DISP
Definition: resource.h:223
#define IDS_INTEG_CHECK_FAIL
Definition: resource.h:118
#define IDS_DL_DIALOG_DB_UNOFFICIAL_DOWNLOAD_DISP
Definition: resource.h:224
SETTINGS_INFO SettingsInfo
Definition: winmain.cpp:21
#define DPRINT1
Definition: precomp.h:8
bool IsEmpty() const
Definition: atlcoll.h:548
POSITION GetHeadPosition() const
Definition: atlcoll.h:554
E & GetNext(_Inout_ POSITION &pos)
Definition: atlcoll.h:566
int GetSize() const
Definition: atlsimpcoll.h:104
BOOL Add(const T &t)
Definition: atlsimpcoll.h:58
bool IsEmpty() const noexcept
Definition: atlsimpstr.h:394
void ReleaseBuffer(_In_ int nNewLength=-1)
Definition: atlsimpstr.h:387
PXSTR GetString() noexcept
Definition: atlsimpstr.h:367
int GetLength() const noexcept
Definition: atlsimpstr.h:362
void Empty() noexcept
Definition: atlsimpstr.h:253
void __cdecl Format(UINT nFormatID,...)
Definition: cstringt.h:818
BOOL SubclassWindow(HWND hWnd)
Definition: atlwin.h:1552
HWND UnsubclassWindow(BOOL bForce=FALSE)
Definition: atlwin.h:1575
BOOL ModifyStyle(DWORD dwRemove, DWORD dwAdd, UINT nFlags=0)
Definition: atlwin.h:1008
BOOL IsWindow() const
Definition: atlwin.h:947
virtual VOID GetDownloadInfo(CStringW &Url, CStringW &Sha1, ULONG &SizeInBytes) const =0
virtual InstallerType GetInstallerType() const
Definition: appinfo.h:131
CStringW szDisplayName
Definition: appinfo.h:112
const CStringW szIdentifier
Definition: appinfo.h:108
BOOL GetString(const CStringW &KeyName, CStringW &ResultString)
HWND Create(HWND hwndParent)
Definition: loaddlg.cpp:316
VOID SetDownloadStatus(INT ItemIndex, DownloadStatus Status)
Definition: loaddlg.cpp:346
VOID AddRow(INT RowIndex, LPCWSTR szAppName, const DownloadStatus Status)
Definition: loaddlg.cpp:367
BOOL AddColumn(INT Index, INT Width, INT Format)
Definition: loaddlg.cpp:375
VOID LoadList(ATL::CSimpleArray< DownloadInfo > arrInfo, UINT Start=0)
Definition: loaddlg.cpp:336
BOOL AddItem(INT ItemIndex, LPWSTR lpText)
Definition: loaddlg.cpp:353
static INT_PTR CALLBACK DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: loaddlg.cpp:583
void PerformDownloadAndInstall(const DownloadInfo &Info)
Definition: loaddlg.cpp:716
static CDownloadManager * FindInstance()
Definition: loaddlg.cpp:508
void UpdateProgress(ULONG ulProgress, ULONG ulProgressMax)
Definition: loaddlg.cpp:694
static unsigned int CALLBACK ThreadFunc(void *ThreadParam)
Definition: loaddlg.cpp:700
WCHAR m_szCaptionFmt[100]
Definition: loaddlg.cpp:541
CDownloaderProgress m_ProgressBar
Definition: loaddlg.cpp:544
void StartWorkerThread()
Definition: loaddlg.cpp:548
ATL::CSimpleArray< DownloadInfo > m_List
Definition: loaddlg.cpp:542
BOOL IsCancelled()
Definition: loaddlg.cpp:516
CDowloadingAppsListView m_ListView
Definition: loaddlg.cpp:543
INT_PTR RealDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: loaddlg.cpp:597
static BOOL CreateInstance(BOOL Modal, CComPtr< CDownloadManager > &Obj)
Definition: loaddlg.cpp:498
static CDownloadManager * CreateInstanceHelper(BOOL Modal)
Definition: loaddlg.cpp:479
void Add(const DownloadInfo &Info)
Definition: loaddlg.cpp:560
VOID SetMarquee(BOOL Enable)
Definition: loaddlg.cpp:177
VOID SetProgress(ULONG ulProgress, ULONG ulProgressMax)
Definition: loaddlg.cpp:188
CStringW m_szProgressText
Definition: loaddlg.cpp:169
LRESULT OnEraseBkgnd(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: loaddlg.cpp:233
LRESULT OnSetText(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: loaddlg.cpp:283
LRESULT OnPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: loaddlg.cpp:239
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:1852
static HWND hwndParent
Definition: cryptui.c:300
static TAGREF LPCWSTR LPDWORD LPVOID lpBuffer
Definition: db.cpp:175
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
DLGPROC DlgProc
Definition: desk.c:122
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
LPSTR WINAPI StrStrA(LPCSTR lpszStr, LPCSTR lpszSearch)
Definition: string.c:578
#define CloseHandle
Definition: compat.h:739
#define wcsrchr
Definition: compat.h:16
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define MAX_PATH
Definition: compat.h:34
#define CreateFileW
Definition: compat.h:741
#define CALLBACK
Definition: compat.h:35
#define FILE_SHARE_READ
Definition: compat.h:136
BOOL WINAPI CopyFileW(IN LPCWSTR lpExistingFileName, IN LPCWSTR lpNewFileName, IN BOOL bFailIfExists)
Definition: copy.c:439
BOOL WINAPI DeleteFileW(IN LPCWSTR lpFileName)
Definition: delete.c:39
BOOL WINAPI CreateDirectoryW(IN LPCWSTR lpPathName, IN LPSECURITY_ATTRIBUTES lpSecurityAttributes)
Definition: dir.c:90
DWORD WINAPI GetFileAttributesW(LPCWSTR lpFileName)
Definition: fileinfo.c:652
BOOL WINAPI WriteFile(IN HANDLE hFile, IN LPCVOID lpBuffer, IN DWORD nNumberOfBytesToWrite OPTIONAL, OUT LPDWORD lpNumberOfBytesWritten, IN LPOVERLAPPED lpOverlapped OPTIONAL)
Definition: rw.c:24
DWORD WINAPI GetModuleFileNameW(HINSTANCE hModule, LPWSTR lpFilename, DWORD nSize)
Definition: loader.c:600
HMODULE WINAPI GetModuleHandleW(LPCWSTR lpModuleName)
Definition: loader.c:838
DWORD WINAPI FormatMessageW(DWORD dwFlags, LPCVOID lpSource, DWORD dwMessageId, DWORD dwLanguageId, LPWSTR lpBuffer, DWORD nSize, __ms_va_list *args)
Definition: format_msg.c:583
int WINAPI lstrcmpW(LPCWSTR str1, LPCWSTR str2)
Definition: locale.c:4243
HRESULT WINAPI PathCreateFromUrlW(LPCWSTR pszUrl, LPWSTR pszPath, LPDWORD pcchPath, DWORD dwReserved)
Definition: path.c:3361
BOOL WINAPI PathIsValidCharW(WCHAR c, DWORD class)
Definition: path.c:4409
LPWSTR WINAPI StrFormatByteSizeW(LONGLONG llBytes, LPWSTR lpszDest, UINT cchMax)
Definition: string.c:2394
HRESULT WINAPI UrlUnescapeW(LPWSTR pszUrl, LPWSTR pszUnescaped, LPDWORD pcchUnescaped, DWORD dwFlags)
Definition: url.c:1367
DWORD WINAPI FtpGetFileSize(HINTERNET hFile, LPDWORD lpdwFileSizeHigh)
Definition: ftp.c:1757
BOOL WINAPI HttpQueryInfoW(HINTERNET hHttpRequest, DWORD dwInfoLevel, LPVOID lpBuffer, LPDWORD lpdwBufferLength, LPDWORD lpdwIndex)
Definition: http.c:3870
BOOL WINAPI InternetQueryOptionA(HINTERNET hInternet, DWORD dwOption, LPVOID lpBuffer, LPDWORD lpdwBufferLength)
Definition: internet.c:2730
BOOL WINAPI InternetCrackUrlW(const WCHAR *lpszUrl, DWORD dwUrlLength, DWORD dwFlags, URL_COMPONENTSW *lpUC)
Definition: internet.c:1625
BOOL WINAPI InternetCanonicalizeUrlW(LPCWSTR lpszUrl, LPWSTR lpszBuffer, LPDWORD lpdwBufferLength, DWORD dwFlags)
Definition: internet.c:2004
BOOL WINAPI InternetReadFile(HINTERNET hFile, LPVOID lpBuffer, DWORD dwNumOfBytesToRead, LPDWORD pdwNumOfBytesRead)
Definition: internet.c:2154
HINTERNET WINAPI InternetOpenUrlW(HINTERNET hInternet, LPCWSTR lpszUrl, LPCWSTR lpszHeaders, DWORD dwHeadersLength, DWORD dwFlags, DWORD_PTR dwContext)
Definition: internet.c:3722
BOOL WINAPI InternetCloseHandle(HINTERNET hInternet)
Definition: internet.c:1414
HINTERNET WINAPI InternetOpenW(LPCWSTR lpszAgent, DWORD dwAccessType, LPCWSTR lpszProxy, LPCWSTR lpszProxyBypass, DWORD dwFlags)
Definition: internet.c:979
static VOID BitBlt(_In_ ULONG Left, _In_ ULONG Top, _In_ ULONG Width, _In_ ULONG Height, _In_reads_bytes_(Delta *Height) PUCHAR Buffer, _In_ ULONG BitsPerPixel, _In_ ULONG Delta)
Definition: common.c:57
#define INFINITE
Definition: serial.h:102
HINSTANCE hInst
Definition: dxdiag.c:13
#define WM_APP
Definition: eventvwr.h:73
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
_In_opt_ PFILE_OBJECT _In_opt_ PETHREAD Thread
Definition: fltkernel.h:2653
return pTarget Start()
pKey DeleteObject()
Status
Definition: gdiplustypes.h:25
GLuint start
Definition: gl.h:1545
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLuint GLuint end
Definition: gl.h:1545
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
GLsizeiptr size
Definition: glext.h:5919
GLenum const GLfloat * params
Definition: glext.h:5645
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLbitfield flags
Definition: glext.h:7161
GLfloat GLfloat p
Definition: glext.h:8902
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
HLOCAL NTAPI LocalFree(HLOCAL hMem)
Definition: heapmem.c:1594
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
ULONG AddRef()
ULONG Release()
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
#define 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:1144
static void SetFriendlyUrl(HWND hWnd, LPCWSTR pszUrl)
Definition: loaddlg.cpp:123
HWND g_hDownloadWnd
Definition: loaddlg.cpp:461
VOID UrlUnescapeAndMakeFileNameValid(CStringW &str)
Definition: loaddlg.cpp:107
BOOL DownloadListOfApplications(const CAtlList< CAppInfo * > &AppsList, BOOL bIsModal)
Definition: loaddlg.cpp:1125
static VOID MessageBox_LoadString(HWND hOwnerWnd, INT StringID)
Definition: loaddlg.cpp:430
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:440
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:1156
HWND hMainWnd
Definition: magnifier.c:32
#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:63
static BOOL protected
Definition: protectdata.c:37
static DWORD DWORD void LPSTR DWORD cch
Definition: str.c:202
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
#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 L(x)
Definition: ntvdm.h:50
#define LOWORD(l)
Definition: pedump.c:82
#define WS_CHILD
Definition: pedump.c:617
#define WS_VISIBLE
Definition: pedump.c:620
static const WCHAR szName[]
Definition: powrprof.c:45
#define LVS_SINGLESEL
Definition: commctrl.h:2271
#define LVS_NOCOLUMNHEADER
Definition: commctrl.h:2289
#define PBS_MARQUEE
Definition: commctrl.h:2203
#define LVIF_STATE
Definition: commctrl.h:2317
#define LVS_SHOWSELALWAYS
Definition: commctrl.h:2272
#define LVS_REPORT
Definition: commctrl.h:2267
#define LVCF_WIDTH
Definition: commctrl.h:2592
#define PBM_SETPOS
Definition: commctrl.h:2189
#define PBM_SETRANGE
Definition: commctrl.h:2188
#define LVS_NOSORTHEADER
Definition: commctrl.h:2290
#define LVIF_TEXT
Definition: commctrl.h:2314
#define LVCF_FMT
Definition: commctrl.h:2591
#define LVCF_SUBITEM
Definition: commctrl.h:2594
#define LVCFMT_LEFT
Definition: commctrl.h:2603
#define PBM_SETMARQUEE
Definition: commctrl.h:2204
DWORD dwStatus
Definition: mediaobj.idl:95
#define WM_NOTIFY_OPERATIONCOMPLETED
Definition: rapps.h:19
#define WM_NOTIFY_INSTALLERFINISHED
Definition: rapps.h:20
LONG g_Busy
Definition: winmain.cpp:17
#define DefWindowProc
Definition: ros2win.h:31
const WCHAR * str
_CRTIMP uintptr_t __cdecl _beginthreadex(_In_opt_ void *_Security, _In_ unsigned _StackSize, _In_ unsigned(__stdcall *_StartAddress)(void *), _In_opt_ void *_ArgList, _In_ unsigned _InitFlag, _Out_opt_ unsigned *_ThrdAddr)
#define SEE_MASK_NOCLOSEPROCESS
Definition: shellapi.h:31
BOOL WINAPI DECLSPEC_HOTPATCH ShellExecuteExW(LPSHELLEXECUTEINFOW sei)
Definition: shlexec.cpp:2452
HRESULT hr
Definition: shlfolder.c:183
#define _countof(array)
Definition: sndvol32.h:70
TCHAR szAppName[128]
Definition: solitaire.cpp:18
CStringW szName
Definition: loaddlg.cpp:160
DownloadType DLType
Definition: loaddlg.cpp:157
CStringW szPackageName
Definition: loaddlg.cpp:162
CStringW szUrl
Definition: loaddlg.cpp:159
ULONG SizeInBytes
Definition: loaddlg.cpp:164
InstallerType IType
Definition: loaddlg.cpp:158
bool Equal(const DownloadInfo &other) const
Definition: loaddlg.cpp:152
CStringW szSHA1
Definition: loaddlg.cpp:161
DownloadInfo(const CAppInfo &AppInfo)
Definition: loaddlg.cpp:140
CStringW szFileName
Definition: loaddlg.cpp:163
WCHAR szDownloadDir[MAX_PATH]
Definition: settings.h:10
BOOL bDelInstaller
Definition: settings.h:11
WCHAR szNoProxyFor[MAX_PATH]
Definition: settings.h:21
WCHAR szProxyServer[MAX_PATH]
Definition: settings.h:20
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:334
Definition: name.c:39
LONG right
Definition: windef.h:308
LONG bottom
Definition: windef.h:309
LONG top
Definition: windef.h:307
LONG left
Definition: windef.h:306
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
int32_t INT_PTR
Definition: typedefs.h:64
const uint16_t * PCWSTR
Definition: typedefs.h:57
PVOID HANDLE
Definition: typedefs.h:73
ULONG_PTR SIZE_T
Definition: typedefs.h:80
int32_t INT
Definition: typedefs.h:58
uint16_t * PWCHAR
Definition: typedefs.h:56
uint32_t ULONG
Definition: typedefs.h:59
uint64_t ULONGLONG
Definition: typedefs.h:67
#define CMD_KEY_GENINST
Definition: unattended.h:4
_In_ HFONT _Out_ PUINT _Out_ PUINT Width
Definition: font.h:89
#define AddItem
Definition: userenv.h:209
#define INVALID_FILE_ATTRIBUTES
Definition: vfdcmd.c:23
SERVICE_STATUS_HANDLE hStatus
Definition: w32time.c:14
_Must_inspect_result_ _In_ WDFCHILDLIST _In_ PWDF_CHILD_LIST_ITERATOR _Out_ WDFDEVICE _Inout_opt_ PWDF_CHILD_RETRIEVE_INFO Info
Definition: wdfchildlist.h:690
_In_ WDFCOLLECTION _In_ ULONG Index
_In_ WDFCOLLECTION _In_ WDFOBJECT Item
HDC hdcMem
Definition: welcome.c:104
int WINAPI GetWindowTextW(HWND hWnd, LPWSTR lpString, int nMaxCount)
Definition: window.c:1394
#define ZeroMemory
Definition: winbase.h:1737
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define FORMAT_MESSAGE_IGNORE_INSERTS
Definition: winbase.h:446
#define FORMAT_MESSAGE_FROM_SYSTEM
Definition: winbase.h:449
#define FORMAT_MESSAGE_ALLOCATE_BUFFER
Definition: winbase.h:445
#define FORMAT_MESSAGE_FROM_HMODULE
Definition: winbase.h:448
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
LONG_PTR LPARAM
Definition: windef.h:208
LONG_PTR LRESULT
Definition: windef.h:209
UINT_PTR WPARAM
Definition: windef.h:207
#define SelectFont(hdc, hfont)
Definition: windowsx.h:516
#define SetDlgMsgResult(hwnd, msg, result)
Definition: windowsx.h:518
#define GetStockFont(i)
Definition: windowsx.h:308
#define DEFAULT_GUI_FONT
Definition: wingdi.h:909
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
Definition: dc.c:1546
HDC WINAPI CreateCompatibleDC(_In_opt_ HDC hdc)
#define SRCCOPY
Definition: wingdi.h:333
HBITMAP WINAPI CreateCompatibleBitmap(_In_ HDC hdc, _In_ INT cx, _In_ INT cy)
BOOL WINAPI DeleteDC(_In_ HDC)
#define HTTP_STATUS_OK
Definition: winhttp.h:240
#define INTERNET_SCHEME_FTP
Definition: winhttp.h:44
#define ICU_DECODE
Definition: winhttp.h:291
#define INTERNET_SCHEME_HTTP
Definition: winhttp.h:42
#define SECURITY_FLAG_SECURE
Definition: winhttp.h:285
#define ICU_NO_ENCODE
Definition: winhttp.h:290
#define INTERNET_SCHEME_HTTPS
Definition: winhttp.h:43
#define ICU_ESCAPE
Definition: winhttp.h:48
#define INTERNET_FLAG_PRAGMA_NOCACHE
Definition: wininet.h:85
#define INTERNET_OPTION_SECURITY_FLAGS
Definition: wininet.h:725
#define INTERNET_FLAG_DONT_CACHE
Definition: wininet.h:67
#define INTERNET_FLAG_KEEP_CONNECTION
Definition: wininet.h:72
#define INTERNET_FLAG_PASSIVE
Definition: wininet.h:65
#define HTTP_QUERY_FLAG_NUMBER
Definition: wininet.h:1606
#define INTERNET_OPEN_TYPE_DIRECT
Definition: wininet.h:522
@ INTERNET_SCHEME_FILE
Definition: wininet.h:143
#define INTERNET_OPEN_TYPE_PROXY
Definition: wininet.h:523
#define HTTP_QUERY_STATUS_CODE
Definition: wininet.h:1542
#define INTERNET_OPEN_TYPE_PRECONFIG
Definition: wininet.h:521
#define INTERNET_OPTION_SECURITY_CERTIFICATE_STRUCT
Definition: wininet.h:726
#define HTTP_QUERY_CONTENT_LENGTH
Definition: wininet.h:1528
BOOL VerifyInteg(LPCWSTR lpSHA1Hash, LPCWSTR lpFileName)
Definition: integrity.cpp:14
#define EVENTLOG_SUCCESS
Definition: winnt_old.h:2862
#define WM_PAINT
Definition: winuser.h:1623
HWND WINAPI CreateDialogParamW(_In_opt_ HINSTANCE, _In_ LPCWSTR, _In_opt_ HWND, _In_opt_ DLGPROC, _In_ LPARAM)
#define WM_ERASEBKGND
Definition: winuser.h:1628
DWORD WINAPI GetSysColor(_In_ int)
BOOL WINAPI IsWindow(_In_opt_ HWND)
#define WM_CLOSE
Definition: winuser.h:1624
#define DT_NOPREFIX
Definition: winuser.h:537
#define DWLP_USER
Definition: winuser.h:875
#define GetWindowLongPtrW
Definition: winuser.h:4832
#define GCLP_HICONSM
Definition: winuser.h:675
#define MAKELPARAM(l, h)
Definition: winuser.h:4011
BOOL WINAPI ShowWindow(_In_ HWND, _In_ int)
#define DT_CENTER
Definition: winuser.h:527
#define IDCANCEL
Definition: winuser.h:834
BOOL WINAPI PostMessageW(_In_opt_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define GCLP_HICON
Definition: winuser.h:674
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:1743
#define COLOR_3DDKSHADOW
Definition: winuser.h:942
#define WM_INITDIALOG
Definition: winuser.h:1742
#define MB_YESNO
Definition: winuser.h:820
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:790
BOOL WINAPI SetWindowTextW(_In_ HWND, _In_opt_ LPCWSTR)
#define WM_SETTEXT
Definition: winuser.h:1620
BOOL WINAPI GetClientRect(_In_ HWND, _Out_ LPRECT)
BOOL WINAPI EndPaint(_In_ HWND, _In_ const PAINTSTRUCT *)
#define SendMessage
Definition: winuser.h:5855
#define MB_OK
Definition: winuser.h:793
#define DT_VCENTER
Definition: winuser.h:543
#define PostMessage
Definition: winuser.h:5844
#define GetClassLongPtrW
Definition: winuser.h:4567
#define SW_SHOW
Definition: winuser.h:778
#define WM_DESTROY
Definition: winuser.h:1612
#define WS_EX_CLIENTEDGE
Definition: winuser.h:384
#define SetWindowText
Definition: winuser.h:5869
BOOL WINAPI InvalidateRect(_In_opt_ HWND, _In_opt_ LPCRECT, _In_ BOOL)
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
#define IDYES
Definition: winuser.h:838
HDC WINAPI BeginPaint(_In_ HWND, _Out_ LPPAINTSTRUCT)
#define SetWindowLongPtrW
Definition: winuser.h:5358
BOOL WINAPI InflateRect(_Inout_ LPRECT, _In_ int, _In_ int)
#define COLOR_CAPTIONTEXT
Definition: winuser.h:925
BOOL WINAPI IsWindowVisible(_In_ HWND)
BOOL WINAPI DestroyWindow(_In_ HWND)
HICON WINAPI LoadIconW(_In_opt_ HINSTANCE hInstance, _In_ LPCWSTR lpIconName)
Definition: cursoricon.c:2161
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)
const char * LPCSTR
Definition: xmlstorage.h:183
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185