ReactOS 0.4.16-dev-1946-g52006dd
geninst.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: Act as installer and uninstaller for applications distributed in archives
5 * COPYRIGHT: Copyright 2024 Whindmar Saksit <whindsaks@proton.me>
6 */
7
8#include "defines.h"
9#include <shlobj.h>
10#include <shlwapi.h>
11#include <setupapi.h>
12#include <commctrl.h>
13#include "resource.h"
14#include "appdb.h"
15#include "appinfo.h"
16#include "misc.h"
17#include "configparser.h"
18#include "unattended.h"
19
20#include "minizip/ioapi.h"
21#include "minizip/iowin32.h"
22#include "minizip/unzip.h"
23extern "C" {
24 #include "minizip/ioapi.c"
25 #include "minizip/iowin32.c"
26 #include "minizip/unzip.c"
27}
28
29#define REGPATH_UNINSTALL L"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall"
30
31#define DB_NONE L"!" // Skip/Ignore
32#define DB_GENINST_FILES L"Files"
33#define DB_GENINST_DIR L"Dir"
34#define DB_GENINST_ICON L"Icon"
35#define DB_GENINST_LNK L"Lnk"
36#define DB_GENINST_LNKARGS L"LnkParameters"
37#define DB_GENINST_DELFILE L"DelFile" // Delete files generated by the application
38#define DB_GENINST_DELDIR L"DelDir"
39#define DB_GENINST_DELDIREMPTY L"DelDirEmpty"
40#define DB_GENINST_DELREG L"DelReg"
41#define DB_GENINST_DELREGEMPTY L"DelRegEmpty"
42
43enum {
44 UNOP_FILE = 'F',
45 UNOP_DIR = 'D',
49};
50
52{
55 unzFile hzf = unzOpen2_64(Path, &zff);
56 if (!hzf)
57 return FALSE;
58 unzClose(hzf);
59 return TRUE;
60}
61
62static int
63ExtractFilesFromZip(LPCWSTR Archive, const CStringW &OutputDir,
65{
66 const UINT pkzefsutf8 = 1 << 11; // APPNOTE; APPENDIX D
69 unzFile hzf = unzOpen2_64(Archive, &zff);
70 if (!hzf)
71 return UNZ_BADZIPFILE;
72 CStringA narrow;
74 int zerr = unzGoToFirstFile(hzf);
75 for (; zerr == UNZ_OK; zerr = unzGoToNextFile(hzf))
76 {
78 zerr = unzGetCurrentFileInfo64(hzf, &fi, NULL, 0, NULL, 0, NULL, 0);
79 if (zerr != UNZ_OK)
80 break;
81 LPSTR file = narrow.GetBuffer(fi.size_filename);
82 zerr = unzGetCurrentFileInfo64(hzf, &fi, file, narrow.GetAllocLength(), NULL, 0, NULL, 0);
83 if (zerr != UNZ_OK)
84 break;
86 narrow.Replace('/', '\\');
87 while (narrow[0] == '\\')
88 narrow = narrow.Mid(1);
89 UINT codepage = (fi.flag & pkzefsutf8) ? CP_UTF8 : 1252;
90 UINT cch = MultiByteToWideChar(codepage, 0, narrow, -1, NULL, 0);
91 cch = MultiByteToWideChar(codepage, 0, narrow, -1, path.GetBuffer(cch - 1), cch);
92 if (!cch)
93 break;
94 path.ReleaseBuffer(cch - 1);
96 BYTE attsys = HIBYTE(fi.version), dos = 0, ntfs = 10, vfat = 14;
97 if ((attsys == dos || attsys == ntfs || attsys == vfat) && LOBYTE(fi.external_fa))
98 fileatt = LOBYTE(fi.external_fa);
99
102 continue; // Skip file
103
104 path = BuildPath(OutputDir, path);
106 if (!dir.IsEmpty() && (err = CreateDirectoryTree(dir)))
107 {
108 zerr = UNZ_ERRNO;
110 break;
111 }
112
113 if ((zerr = unzOpenCurrentFile(hzf)) != UNZ_OK)
114 break;
115 zerr = UNZ_ERRNO;
118 NULL, CREATE_ALWAYS, fileatt, NULL);
120 {
121 DWORD len = 1024 * 4, cb;
122 LPSTR buf = narrow.GetBuffer(len);
123 for (zerr = UNZ_OK; zerr == UNZ_OK;)
124 {
125 len = zerr = unzReadCurrentFile(hzf, buf, len);
126 if (zerr <= 0)
127 break;
128 zerr = WriteFile(hFile, buf, len, &cb, NULL) && cb == len ? UNZ_OK : UNZ_ERRNO;
129 }
131 }
133 }
134 unzClose(hzf);
135 return zerr == UNZ_END_OF_LIST_OF_FILE ? UNZ_OK : zerr;
136}
137
138static UINT
139ExtractZip(LPCWSTR Archive, const CStringW &OutputDir,
141{
142 int zerr = ExtractFilesFromZip(Archive, OutputDir, Callback, Context);
143 return zerr == UNZ_ERRNO ? GetLastError() : zerr ? ERROR_INTERNAL_ERROR : 0;
144}
145
146static UINT
147ExtractCab(LPCWSTR Archive, const CStringW &OutputDir,
149{
150 if (ExtractFilesFromCab(Archive, OutputDir, Callback, Context))
151 return ERROR_SUCCESS;
153 return err ? err : ERROR_INTERNAL_ERROR;
154}
155
156
157static UINT
159{
160 BOOL isCab = LOBYTE(ClassifyFile(Archive)) == 'C';
161 return isCab ? ExtractCab(Archive, OutputDir, Callback, Context)
162 : ExtractZip(Archive, OutputDir, Callback, Context);
163}
164
166
167static struct CommonInfo
168{
174
175 CommonInfo(LPCWSTR DisplayName, BOOL IsSilent = FALSE)
176 : AppName(DisplayName), hDlg(NULL), Error(0), Count(0), Silent(IsSilent), ArpKey(NULL)
177 {
178 }
179 inline HWND GetGuiOwner() const { return Silent ? NULL : hDlg; }
181
183{
189
191 : CommonInfo(AppName), Parser(CP), ArchivePath(Archive)
192 {
193 EntryCount = 0;
194 }
195};
196
197static inline UINT
199{
200 return g_pInfo->Error = ErrorBox(g_pInfo->GetGuiOwner(), Error);
201}
202
203static LPCWSTR
205{
206 InstallInfo &Info = *static_cast<InstallInfo *>(g_pInfo);
208 return (found && !Output.IsEmpty() ? Output : Output = Default).GetString();
209}
210
211static LPCWSTR
213{
214 InstallInfo &Info = *static_cast<InstallInfo *>(g_pInfo);
216 return (r ? Output : Output = Default).GetString();
217}
218
219static void
221{
222 // Write a "Add/Remove programs" value if we have a valid uninstaller key
223 if (g_pInfo->ArpKey)
224 {
225 UINT err = g_pInfo->ArpKey->SetStringValue(Name, Value, Type);
226 if (err)
227 ErrorBox(err);
228 }
229}
230
231static BOOL
233{
234 InstallInfo &Info = *static_cast<InstallInfo *>(g_pInfo);
236 name.Format(L"%c%u", Type, ++Info.EntryCount);
237 UINT err = Info.Entries.SetStringValue(name, Value);
238 if (err)
239 ErrorBox(err);
240 return !err;
241}
242
243static HRESULT
245{
247 {
248 if (Path.Compare(DB_NONE) == 0)
250 Path = BuildPath(Info.InstallDir, Path);
251 int idx = PathParseIconLocation(Path.GetBuffer());
252 Path.ReleaseBuffer();
253 HICON hIco = NULL;
254 if (ExtractIconExW(Path, idx, &hIco, NULL, 1))
255 DestroyIcon(hIco);
256 if (idx)
257 Path.AppendFormat(L",%d", idx);
258 return hIco ? S_OK : S_FALSE;
259 }
261}
262
263static BOOL
265{
266 CRegKey key;
267 if (key.Open(HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\Windows\\CurrentVersion", KEY_READ) == ERROR_SUCCESS &&
268 GetRegString(key, WinVal, Output) && !Output.IsEmpty())
269 {
270 return TRUE;
271 }
272 WCHAR windir[MAX_PATH];
273 GetWindowsDirectoryW(windir, _countof(windir));
274 CStringW path = BuildPath(BuildPath(windir, L"inf"), RosInf), section;
275 DWORD lang = 0, lctype = LOCALE_ILANGUAGE | LOCALE_RETURN_NUMBER;
276 if (GetLocaleInfoW(GetUserDefaultLCID(), lctype, (LPWSTR) &lang, sizeof(lang) / sizeof(WCHAR)))
277 {
278 section.Format(L"Strings.%.4x", lang);
279 if (ReadIniValue(path, section, RosVal, Output) > 0)
280 return TRUE;
281 section.Format(L"Strings.%.2x", PRIMARYLANGID(lang));
282 if (ReadIniValue(path, section, RosVal, Output) > 0)
283 return TRUE;
284 }
285 return ReadIniValue(path, L"Strings", RosVal, Output) > 0;
286}
287
288static CStringW
290{
291 InstallInfo &Info = *static_cast<InstallInfo *>(g_pInfo);
293 CStringW rel = Info.ShortcutFile, path, dir, tmp;
294
295 if (FAILED(GetSpecialPath(csidl, path, Info.GetGuiOwner())))
296 return L""; // Pretend everything is OK
297
298 int cat;
299 if (Info.Parser.GetInt(DB_CATEGORY, cat) && cat == ENUM_CAT_GAMES)
300 {
301 // Try to find the name of the Games folder in the Start Menu
302 if (GetLocalizedSMFolderName(L"SM_GamesName", L"shortcuts.inf", L"Games", tmp))
303 {
304 path = BuildPath(path, tmp);
305 }
306 }
307
308 // SHPathPrepareForWrite will prepare the necessary directories.
309 // Windows and ReactOS SHPathPrepareForWrite do not support '/'.
310 rel.Replace('/', '\\');
311 path = BuildPath(path, rel.GetString());
313 HRESULT hr = SHPathPrepareForWriteW(Info.GetGuiOwner(), NULL, path, SHPPFW);
314 if ((Info.Error = ErrorFromHResult(hr)) != 0)
315 {
316 ErrorBox(Info.Error);
317 return L"";
318 }
319
321 hr = link.CoCreateInstance(CLSID_ShellLink, IID_IShellLinkW);
322 if (SUCCEEDED(hr))
323 {
324 if (SUCCEEDED(hr = link->SetPath(Target)))
325 {
327 link->SetWorkingDirectory(tmp);
328
330 link->SetArguments(tmp);
331
333 {
334 LPWSTR p = tmp.GetBuffer();
336 link->SetIconLocation(p, idx);
337 }
338 CComPtr<IPersistFile> persist;
339 if (SUCCEEDED(hr = link->QueryInterface(IID_IPersistFile, (void**)&persist)))
340 {
341 hr = persist->Save(path, FALSE);
342 }
343 }
344 }
345 if (SUCCEEDED(hr))
346 {
347 if (AddEntry(UNOP_FILE, path))
348 {
351 }
352 }
353 else
354 {
356 }
357 return Info.Error ? L"" : path;
358}
359
360static BOOL
361InstallFiles(const CStringW &SourceDirBase, const CStringW &Spec,
362 const CStringW &DestinationDir)
363{
364 InstallInfo &Info = *static_cast<InstallInfo *>(g_pInfo);
365 CStringW sourcedir, filespec;
366 filespec = SplitFileAndDirectory(Spec, &sourcedir); // Split "[OptionalDir\]*.ext"
367 sourcedir = BuildPath(SourceDirBase, sourcedir);
368 BOOL success = TRUE;
370 HANDLE hFind = FindFirstFileW(BuildPath(sourcedir, filespec), &wfd);
371 if (hFind == INVALID_HANDLE_VALUE)
372 {
375 return TRUE;
376 else
377 return !ErrorBox(error);
378 }
379
380 for (;;)
381 {
382 CStringW from = BuildPath(sourcedir, wfd.cFileName);
383 CStringW to = BuildPath(DestinationDir, wfd.cFileName);
384 CStringW uninstpath = to.Mid(Info.InstallDirLen - 1);
386 {
387 LPWSTR p = wfd.cFileName;
388 BOOL dots = p[0] == '.' && (!p[1] || (p[1] == '.' && !p[2]));
389 if (!dots)
390 {
391 Info.Error = CreateDirectoryTree(to);
392 if (Info.Error)
393 {
394 success = !ErrorBox(Info.Error);
395 }
396
397 if (success)
398 {
399 success = InstallFiles(from, filespec, to);
400 }
401 AddEntry(UNOP_EMPTYDIR, uninstpath);
402 }
403 }
404 else
405 {
407 if (success)
408 {
409 if (Info.MainApp.IsEmpty())
410 {
411 Info.MainApp = to;
412 }
413 success = AddEntry(UNOP_FILE, uninstpath);
414 }
415 else
416 {
417 ErrorBox();
418 }
419 SendMessage(g_pInfo->hDlg, IM_PROGRESS, 0, 0);
420 }
421
422 if (!success || !FindNextFileW(hFind, &wfd))
423 break;
424 }
425 FindClose(hFind);
426 return success;
427}
428
429static void
431{
432 CStringW item, tmp;
433 if (*GetGenerateString(Name, tmp))
434 {
435 for (int pos = 1; pos > 0;)
436 {
437 pos = tmp.Find(L'|');
438 item = pos <= 0 ? tmp : tmp.Left(pos);
439 tmp = tmp.Mid(pos + 1);
440 AddEntry(UnOp, PathPrefix + item);
441 }
442 }
443}
444
445static BOOL CALLBACK
447{
449 Info.Count += 1;
450 return TRUE;
451}
452
453static DWORD CALLBACK
455{
456 const BOOL PerUserModeDefault = TRUE;
457 InstallInfo &Info = *static_cast<InstallInfo *>(g_pInfo);
458 LPCWSTR AppName = Info.AppName, Archive = Info.ArchivePath, None = DB_NONE;
459 CStringW installdir, tempdir, files, shortcut, tmp;
460 HRESULT hr;
461 CRegKey arpkey;
462 Info.ArpKey = &arpkey;
463
464 if (!*GetGenerateString(DB_GENINST_FILES, files, L"*.exe|*.*"))
466
468 if (tmp.CompareNoCase(L"User") == 0)
469 Info.PerUser = TRUE;
470 else if (tmp.CompareNoCase(L"Machine") == 0)
471 Info.PerUser = FALSE;
472 else
473 Info.PerUser = PerUserModeDefault;
474
475 hr = GetProgramFilesPath(installdir, Info.PerUser, Info.GetGuiOwner());
476 if ((Info.Error = ErrorFromHResult(hr)) != 0)
477 return ErrorBox(Info.Error);
478
480 if (tmp.Find('%') == 0 && ExpandEnvStrings(tmp))
481 installdir = tmp;
482 else if (tmp.Compare(None))
483 installdir = BuildPath(installdir, tmp.IsEmpty() ? AppName : tmp.GetString());
484 Info.InstallDir = installdir.GetString();
485 Info.InstallDirLen = installdir.GetLength() + 1;
486 hr = SHPathPrepareForWriteW(Info.GetGuiOwner(), NULL, installdir, SHPPFW_DIRCREATE);
487 if ((Info.Error = ErrorFromHResult(hr)) != 0)
488 return ErrorBox(Info.Error);
489
490 // Create the destination directory, and inside it, a temporary directory
491 // where we will extract the archive to before moving the files to their
492 // final location (adding uninstall entries as we go)
493 tempdir.Format(L"%s\\~RAM%u.tmp", installdir.GetString(), GetCurrentProcessId());
494 Info.Error = CreateDirectoryTree(tempdir.GetString());
495 if (Info.Error)
496 return ErrorBox(Info.Error);
497
498 if (!*GetGenerateString(DB_GENINST_LNK, shortcut))
499 shortcut.Format(L"%s.lnk", AppName);
500 Info.ShortcutFile = shortcut.Compare(None) ? shortcut.GetString() : NULL;
501
502 // Create the uninstall registration key
503 LPCWSTR arpkeyname = AppName;
504 tmp = BuildPath(REGPATH_UNINSTALL, arpkeyname);
507 Info.Error = arpkey.Create(hRoot, tmp, NULL, REG_OPTION_NON_VOLATILE, regsam);
508 if (!Info.Error)
509 {
511 Info.Error = Info.Entries.Create(arpkey, GENERATE_ARPSUBKEY);
512 }
513 if (Info.Error)
514 ErrorBox(Info.Error);
515
516 if (!Info.Error)
517 Info.Error = ExtractArchive(Archive, tempdir, ExtractCallback, &Info);
518
519 if (!Info.Error)
520 {
521 // We now know how many files we extracted, change from marquee to normal progress bar.
522 SendMessage(Info.hDlg, IM_STARTPROGRESS, 0, 0);
523
524 for (int pos = 1; pos > 0 && !Info.Error;)
525 {
526 pos = files.Find(L'|');
527 CStringW item = pos <= 0 ? files : files.Left(pos);
528 files = files.Mid(pos + 1);
529 InstallFiles(tempdir, item, installdir);
530 }
531
532 if (!Info.MainApp.IsEmpty())
533 {
540
541 WriteArpEntry(L"DisplayName", AppName);
542 WriteArpEntry(L"InstallLocation", Info.InstallDir); // Note: This value is used by the uninstaller!
543
544 LPWSTR p = tmp.GetBuffer(1 + MAX_PATH);
545 p[0] = L'\"';
547 tmp.ReleaseBuffer();
548 UINT cch = tmp.GetLength(), bitness = IsSystem64Bit() ? 64 : 32;
549 WCHAR modechar = Info.PerUser ? 'U' : 'M';
550 LPCWSTR unparamsfmt = L"\" /" CMD_KEY_UNINSTALL L" /K%s \"%c%d\\%s\"";
551 (tmp = tmp.Mid(0, cch)).AppendFormat(unparamsfmt, L"", modechar, bitness, arpkeyname);
552 WriteArpEntry(L"UninstallString", tmp);
553 (tmp = tmp.Mid(0, cch)).AppendFormat(unparamsfmt, L" /S", modechar, bitness, arpkeyname);
554 WriteArpEntry(L"QuietUninstallString", tmp);
555
556 hr = GetCustomIconPath(Info, tmp);
558 WriteArpEntry(L"DisplayIcon", hr == S_OK ? tmp : Info.MainApp);
559
560 if (*GetCommonString(DB_VERSION, tmp))
561 WriteArpEntry(L"DisplayVersion", tmp);
562
563 SYSTEMTIME st;
564 GetSystemTime(&st);
565 tmp.Format(L"%.4u%.2u%.2u", st.wYear, st.wMonth, st.wDay);
566 WriteArpEntry(L"InstallDate", tmp);
567
568 if (*GetCommonString(DB_PUBLISHER, tmp))
569 WriteArpEntry(L"Publisher", tmp);
570
571#if DBG
572 tmp.Format(L"sys64=%d rapps%d", IsSystem64Bit(), sizeof(void*) * 8);
573 WriteArpEntry(L"_DEBUG", tmp);
574#endif
575 }
576
577 if (!Info.Error && Info.ShortcutFile)
578 {
579 tmp = CreateMainShortcut(Info.MainApp);
580 if (!tmp.IsEmpty() && !Info.Silent)
581 {
584 message.Format(format, const_cast<PCWSTR>(AppName));
585 if (MessageBoxW(Info.GetGuiOwner(), message, AppName, MB_YESNO | MB_ICONQUESTION) == IDYES)
586 {
587 SHELLEXECUTEINFOW sei = { sizeof(sei), SEE_MASK_NOASYNC, Info.GetGuiOwner() };
588 sei.lpFile = tmp;
589 sei.nShow = SW_SHOW;
590 ShellExecuteExW(&sei);
591 }
592 }
593 }
594 }
595
597 RemoveDirectory(installdir.GetString()); // This is harmless even if we installed something
598 return 0;
599}
600
601static DWORD CALLBACK
603{
605 return SendMessage(g_pInfo->hDlg, IM_END, 0, 0);
606}
607
608static INT_PTR CALLBACK
610{
611 HWND hPB = GetDlgItem(hDlg, 1);
612 switch(uMsg)
613 {
614 case IM_STARTPROGRESS:
617 SendMessageW(hPB, PBM_SETRANGE32, 0, g_pInfo->Count);
618 SendMessageW(hPB, PBM_SETPOS, 0, 0);
619 break;
620 case IM_PROGRESS:
621 SendMessageW(hPB, PBM_DELTAPOS, 1, 0);
622 break;
623 case IM_END:
624 DestroyWindow(hDlg);
625 break;
626 case WM_INITDIALOG:
627 {
629 g_pInfo->hDlg = hDlg;
631 SendMessageW(hDlg, WM_SETICON, ICON_BIG, (LPARAM)hIco);
632 SendMessageW(hDlg, WM_SETTEXT, 0, (LPARAM)g_pInfo->AppName);
634 {
635 ErrorBox();
636 SendMessageW(hDlg, IM_END, 0, 0);
637 }
638 return TRUE;
639 }
640 case WM_CLOSE:
641 return TRUE;
642 case WM_DESTROY:
643 PostMessage(NULL, WM_QUIT, 0, 0);
644 break;
645 }
646 return FALSE;
647}
648
649static BOOL
651{
652 enum { DLGW = 150, DLGH = 20, PAD = 4, PADx2 = PAD * 2, CHILDCOUNT = 1 };
654 static const WORD DlgTmpl[] =
655 {
656 LOWORD(DlgStyle), HIWORD(DlgStyle), 0, 0, CHILDCOUNT, 0, 0, DLGW, DLGH, 0, 0, 0,
657 PBS_MARQUEE, HIWORD(WS_CHILD | WS_VISIBLE), 0, 0, PAD, PAD, DLGW - PADx2, DLGH - PADx2, 1,
658 'm', 's', 'c', 't', 'l', 's', '_', 'p', 'r', 'o', 'g', 'r', 'e', 's', 's', '3', '2', 0, 0,
659 };
662 if (!hWnd)
663 {
664 ErrorBox();
665 return FALSE;
666 }
667 else if (!Silent)
668 {
670 }
671 MSG Msg;
672 while (GetMessageW(&Msg, NULL, 0, 0))
673 {
676 }
677 return TRUE;
678}
679
680BOOL
682{
683 InstallInfo Info(AppInfo.szDisplayName, *AppInfo.GetConfigParser(), Archive);
684 Info.Silent = Silent;
685 g_pInfo = &Info;
686 return CreateUI(Info.Silent, ExtractAndInstallThread) ? !Info.Error : FALSE;
687}
688
690{
693 : CommonInfo(Info.szDisplayName, IsSilent), AppInfo(Info)
694 {
695 ArpKey = &Info.GetRegKey();
696 }
697};
698
700{
705
706static DWORD CALLBACK
708{
709 UninstallInfo &Info = *static_cast<UninstallInfo *>(g_pInfo);
710
711 CStringW tmp, path, installdir;
713 tmp.Format(path.GetString(), Info.AppName);
714 if (!Info.Silent &&
715 MessageBox(Info.GetGuiOwner(), tmp, Info.AppName, MB_YESNO | MB_ICONQUESTION) != IDYES)
716 {
717 Info.Error = ERROR_CANCELLED;
718 SendMessage(Info.hDlg, IM_END, 0, 0);
719 return 0;
720 }
721
722 Info.Error = Info.Entries.Open(*Info.ArpKey, GENERATE_ARPSUBKEY, KEY_READ);
723 if (Info.Error)
724 return ErrorBox(Info.Error);
725
726 RegQueryInfoKey(Info.Entries, NULL, NULL, NULL, NULL, NULL, NULL, &Info.Count, NULL, NULL, NULL, NULL);
727 Info.Count *= UINSTALLSTAGECOUNT;
728 SendMessage(Info.hDlg, IM_STARTPROGRESS, 0, 0);
729
730 if (!GetRegString(*Info.ArpKey, L"InstallLocation", installdir) || installdir.IsEmpty())
732
733 for (UINT stage = 0; stage < UINSTALLSTAGECOUNT; ++stage)
734 {
735 for (UINT vi = 0;; ++vi)
736 {
738 DWORD valsize = _countof(value), size = sizeof(data) - sizeof(WCHAR), rt;
740 UINT err = RegEnumValue(Info.Entries, vi, value, &valsize, NULL, &rt, (BYTE*)data, &size);
741 if (err)
742 {
744 {
745 return ErrorBox(err);
746 }
747 break;
748 }
749
750 LPCWSTR str = data;
751 WORD op = value[0];
752 switch(*data ? MAKEWORD(stage, op) : 0)
753 {
756 {
757 REGSAM wowsam = 0;
758 HKEY hKey = NULL;
759 path.Format(L"%.4s", data);
760 if (path.CompareNoCase(L"HKCR") == 0)
762 else if (path.CompareNoCase(L"HKCU") == 0)
764 else if (path.CompareNoCase(L"HKLM") == 0)
766
767 if (data[4] == '6' && data[5] == '4')
768 wowsam = KEY_WOW64_64KEY;
769 else if (data[4] == '3' && data[5] == '2')
770 wowsam = KEY_WOW64_32KEY;
771
772 str = &data[wowsam ? 6 : 4];
773 if (!hKey || *str != L'\\')
774 break;
775 tmp = SplitFileAndDirectory(++str, &path);
776 if (!tmp.IsEmpty() && !path.IsEmpty())
777 {
778 CRegKey key;
779 err = key.Open(hKey, path, DELETE | wowsam);
780 if (err == ERROR_SUCCESS)
781 {
782 if (op == UNOP_REGKEY)
783 err = key.RecurseDeleteKey(tmp);
784 else if (RegKeyHasValues(hKey, str, wowsam) == S_FALSE)
785 key.DeleteSubKey(tmp); // DelRegEmpty ignores errors
786 }
787 switch(err)
788 {
789 case ERROR_SUCCESS:
792 break;
793 default:
794 return ErrorBox(err);
795 }
796 }
797 break;
798 }
799
801 {
802 if (*data == L'\\')
803 str = (path = BuildPath(installdir, data));
804
805 if (!DeleteFile(str))
806 {
807 err = GetLastError();
809 {
810 return ErrorBox(err);
811 }
812 }
813 break;
814 }
815
818 {
819 if (*data == L'\\')
820 str = (path = BuildPath(installdir, data));
821
822 if (op == UNOP_DIR)
823 DeleteDirectoryTree(str, Info.GetGuiOwner());
824 else
826 break;
827 }
828 }
829 SendMessage(Info.hDlg, IM_PROGRESS, 0, 0);
830 }
831 }
832 if (!Info.Error)
833 {
835 if (Info.Error)
836 return ErrorBox(Info.Error);
837 }
838 return 0;
839}
840
841BOOL
843{
845 g_pInfo = &Info;
846 return CreateUI(Info.Silent, UninstallThread) ? !Info.Error : FALSE;
847}
848
850ExtractArchiveForExecution(PCWSTR pszArchive, const CStringW &PackageName, CStringW &TempDir, CStringW &App)
851{
852 WCHAR TempDirBuf[MAX_PATH], UniqueDir[MAX_PATH];
854 db.UpdateAvailable();
855 CAvailableApplicationInfo *pAppInfo = db.FindAvailableByPackageName(PackageName);
856 if (!pAppInfo)
858 CConfigParser *pCfg = pAppInfo->GetConfigParser();
859
860 if (!GetTempPathW(_countof(TempDirBuf), TempDirBuf))
861 return E_FAIL;
862 wsprintfW(UniqueDir, L"~%s-%u", RAPPS_NAME, GetCurrentProcessId());
863 TempDir = BuildPath(TempDirBuf, UniqueDir);
865 if (FAILED(hr))
866 return hr;
867
868 hr = HResultFromWin32(ExtractArchive(pszArchive, TempDir, NULL, NULL));
869 if (SUCCEEDED(hr))
870 {
873 {
875 HANDLE hFind = FindFirstFileW(Exe = BuildPath(TempDir, L"*.exe"), &wfd);
876 if (hFind != INVALID_HANDLE_VALUE)
877 {
878 FindClose(hFind);
879 Exe = wfd.cFileName;
880 }
881 }
882 App = BuildPath(TempDir, Exe);
885 }
886
887 if (FAILED(hr) && !TempDir.IsEmpty())
889 return hr;
890}
PRTL_UNICODE_STRING_BUFFER Path
DWORD WINAPI ThreadProc(LPVOID lpParam)
Definition: ServiceMain.c:30
Type
Definition: Type.h:7
#define DB_PUBLISHER
Definition: appinfo.h:93
#define GENERATE_ARPSUBKEY
Definition: appinfo.h:103
#define DB_VERSION
Definition: appinfo.h:91
#define DB_EXEINZIPSECTION
Definition: appinfo.h:105
#define DB_EXEINZIP_EXE
Definition: appinfo.h:106
#define DB_CATEGORY
Definition: appinfo.h:92
#define DB_GENINSTSECTION
Definition: appinfo.h:102
#define DB_SCOPE
Definition: appinfo.h:98
UninstallCommandFlags
Definition: appinfo.h:73
@ UCF_SILENT
Definition: appinfo.h:75
@ ENUM_CAT_GAMES
Definition: appinfo.h:29
unsigned int dir
Definition: maze.c:112
HWND hWnd
Definition: settings.c:17
#define IDI_MAIN
Definition: resource.h:4
#define RAPPS_NAME
Definition: defines.h:34
BOOL(CALLBACK * EXTRACTCALLBACK)(const EXTRACTCALLBACKINFO &Info, void *Cookie)
Definition: misc.h:69
bool ExpandEnvStrings(CStringW &Str)
Definition: misc.cpp:487
HRESULT GetSpecialPath(UINT csidl, CStringW &Path, HWND hwnd=NULL)
Definition: misc.cpp:545
static CStringW BuildPath(const T &Base, LPCWSTR Append)
Definition: misc.h:107
BOOL DeleteDirectoryTree(LPCWSTR Dir, HWND hwnd=NULL)
Definition: misc.cpp:513
UINT ClassifyFile(PCWSTR Path)
Definition: misc.cpp:125
UINT CreateDirectoryTree(LPCWSTR Dir)
Definition: misc.cpp:526
static BOOL NotifyFileExtractCallback(const CStringW &ItemPath, UINT64 UncompressedSize, UINT FileAttributes, EXTRACTCALLBACK Callback, void *Cookie)
Definition: misc.h:72
HRESULT RegKeyHasValues(HKEY hKey, LPCWSTR Path, REGSAM wowsam=0)
Definition: misc.cpp:446
static UINT ErrorFromHResult(HRESULT hr)
Definition: misc.h:27
LPCWSTR GetRegString(CRegKey &Key, LPCWSTR Name, CStringW &Value)
Definition: misc.cpp:464
HRESULT GetProgramFilesPath(CStringW &Path, BOOL PerUser, HWND hwnd=NULL)
Definition: misc.cpp:569
CStringW SplitFileAndDirectory(LPCWSTR FullPath, CStringW *pDir=NULL)
Definition: misc.cpp:533
BOOL IsSystem64Bit()
Definition: misc.cpp:382
#define IDS_INSTGEN_CONFIRMUNINST
Definition: resource.h:242
#define IDS_INSTGEN_CONFIRMINSTRUNAPP
Definition: resource.h:243
@ None
Definition: install.h:14
BOOL Error
Definition: chkdsk.c:66
BOOL ExtractFilesFromCab(const CStringW &szCabName, const CStringW &szCabDir, const CStringW &szOutputDir, EXTRACTCALLBACK Callback, void *Cookie)
Definition: cabinet.cpp:250
LONG Create(HKEY hKeyParent, LPCTSTR lpszKeyName, LPTSTR lpszClass=REG_NONE, DWORD dwOptions=REG_OPTION_NON_VOLATILE, REGSAM samDesired=KEY_READ|KEY_WRITE, LPSECURITY_ATTRIBUTES lpSecAttr=NULL, LPDWORD lpdwDisposition=NULL) noexcept
Definition: atlbase.h:1189
LONG RecurseDeleteKey(LPCTSTR lpszKey) noexcept
Definition: atlbase.h:1414
bool IsEmpty() const noexcept
Definition: atlsimpstr.h:394
int GetAllocLength() const noexcept
Definition: atlsimpstr.h:357
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
int CompareNoCase(_In_z_ PCXSTR psz) const
Definition: cstringt.h:743
int Replace(PCXSTR pszOld, PCXSTR pszNew)
Definition: cstringt.h:886
CStringT Left(int nCount) const
Definition: cstringt.h:776
void __cdecl Format(UINT nFormatID,...)
Definition: cstringt.h:818
int Compare(_In_z_ PCXSTR psz) const
Definition: cstringt.h:738
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
Definition: appdb.h:9
static DWORD RemoveInstalledAppFromRegistry(const CAppInfo *Info)
Definition: appdb.cpp:324
VOID UpdateAvailable()
Definition: appdb.cpp:130
CAvailableApplicationInfo * FindAvailableByPackageName(const CStringW &name)
Definition: appdb.cpp:47
static CStringW GetDefaultPath()
Definition: appdb.cpp:39
CStringW szDisplayName
Definition: appinfo.h:121
CConfigParser * GetConfigParser() const
Definition: appinfo.h:176
BOOL GetString(const CStringW &KeyName, CStringW &ResultString)
UINT GetSectionString(LPCWSTR Section, LPCWSTR Name, CStringW &Result)
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
struct @1765 Msg[]
HRESULT ReadIniValue(LPCWSTR File, LPCWSTR Section, LPCWSTR Name, CStringW &Output)
const WCHAR * link
Definition: db.cpp:998
#define E_FAIL
Definition: ddrawi.h:102
static CHAR AppName[MAX_PATH]
Definition: dem.c:252
#define ERROR_SUCCESS
Definition: deptool.c:10
LPWSTR Name
Definition: desk.c:124
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
UINT op
Definition: effect.c:236
unsigned int idx
Definition: utils.c:41
#define CloseHandle
Definition: compat.h:739
#define SetLastError(x)
Definition: compat.h:752
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define ERROR_NO_MORE_ITEMS
Definition: compat.h:105
#define GENERIC_READ
Definition: compat.h:135
#define MAX_PATH
Definition: compat.h:34
#define CreateFileW
Definition: compat.h:741
#define FILE_ATTRIBUTE_NORMAL
Definition: compat.h:137
#define CALLBACK
Definition: compat.h:35
#define MultiByteToWideChar
Definition: compat.h:110
#define FILE_SHARE_READ
Definition: compat.h:136
#define ERROR_INVALID_NAME
Definition: compat.h:103
DWORD WINAPI GetFileAttributesW(LPCWSTR lpFileName)
Definition: fileinfo.c:652
HANDLE WINAPI FindFirstFileW(IN LPCWSTR lpFileName, OUT LPWIN32_FIND_DATAW lpFindFileData)
Definition: find.c:320
BOOL WINAPI FindClose(HANDLE hFindFile)
Definition: find.c:502
BOOL WINAPI FindNextFileW(IN HANDLE hFindFile, OUT LPWIN32_FIND_DATAW lpFindFileData)
Definition: find.c:382
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 GetTempPathW(IN DWORD count, OUT LPWSTR path)
Definition: path.c:2080
UINT WINAPI GetWindowsDirectoryW(OUT LPWSTR lpBuffer, IN UINT uSize)
Definition: path.c:2352
VOID WINAPI GetSystemTime(OUT LPSYSTEMTIME lpSystemTime)
Definition: time.c:327
LCID WINAPI GetUserDefaultLCID(void)
Definition: locale.c:1216
INT WINAPI GetLocaleInfoW(LCID lcid, LCTYPE lctype, LPWSTR buffer, INT len)
Definition: locale.c:1675
BOOL WINAPI SHCreateThread(LPTHREAD_START_ROUTINE pfnThreadProc, VOID *pData, DWORD dwFlags, LPTHREAD_START_ROUTINE pfnCallback)
Definition: thread.c:356
#define CP
Definition: debug.h:64
#define L(x)
Definition: resources.c:13
HINSTANCE hInst
Definition: dxdiag.c:13
#define WM_APP
Definition: eventvwr.h:73
#define MOVEFILE_REPLACE_EXISTING
Definition: filesup.h:28
#define MOVEFILE_COPY_ALLOWED
Definition: filesup.h:29
unsigned short WORD
Definition: ntddk_ex.h:93
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
FxAutoRegKey hKey
static BOOL CALLBACK ExtractCallback(const EXTRACTCALLBACKINFO &, void *Context)
Definition: geninst.cpp:446
#define DB_GENINST_DIR
Definition: geninst.cpp:33
BOOL ExtractAndRunGeneratedInstaller(const CAvailableApplicationInfo &AppInfo, LPCWSTR Archive, bool Silent)
Definition: geninst.cpp:681
static UINT ExtractZip(LPCWSTR Archive, const CStringW &OutputDir, EXTRACTCALLBACK Callback, void *Context)
Definition: geninst.cpp:139
#define DB_GENINST_FILES
Definition: geninst.cpp:32
static UINT ErrorBox(UINT Error=GetLastError())
Definition: geninst.cpp:198
static HRESULT GetCustomIconPath(InstallInfo &Info, CStringW &Path)
Definition: geninst.cpp:244
static BOOL GetLocalizedSMFolderName(LPCWSTR WinVal, LPCWSTR RosInf, LPCWSTR RosVal, CStringW &Output)
Definition: geninst.cpp:264
#define DB_GENINST_DELREG
Definition: geninst.cpp:40
#define DB_GENINST_ICON
Definition: geninst.cpp:34
static DWORD CALLBACK ExtractAndInstallThread(LPVOID Parameter)
Definition: geninst.cpp:454
#define DB_GENINST_DELDIR
Definition: geninst.cpp:38
static UINT ExtractCab(LPCWSTR Archive, const CStringW &OutputDir, EXTRACTCALLBACK Callback, void *Context)
Definition: geninst.cpp:147
static void AddUninstallOperationsFromDB(LPCWSTR Name, WCHAR UnOp, CStringW PathPrefix=CStringW(L""))
Definition: geninst.cpp:430
static UINT ExtractArchive(LPCWSTR Archive, const CStringW &OutputDir, EXTRACTCALLBACK Callback, void *Context)
Definition: geninst.cpp:158
#define DB_GENINST_DELDIREMPTY
Definition: geninst.cpp:39
static BOOL AddEntry(WCHAR Type, LPCWSTR Value)
Definition: geninst.cpp:232
#define DB_NONE
Definition: geninst.cpp:31
static INT_PTR CALLBACK UIDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: geninst.cpp:609
#define DB_GENINST_LNK
Definition: geninst.cpp:35
static struct CommonInfo * g_pInfo
static LPCWSTR GetGenerateString(LPCWSTR Name, CStringW &Output, LPCWSTR Default=L"")
Definition: geninst.cpp:212
#define REGPATH_UNINSTALL
Definition: geninst.cpp:29
#define DB_GENINST_DELFILE
Definition: geninst.cpp:37
@ IM_PROGRESS
Definition: geninst.cpp:165
@ IM_STARTPROGRESS
Definition: geninst.cpp:165
@ IM_END
Definition: geninst.cpp:165
static BOOL InstallFiles(const CStringW &SourceDirBase, const CStringW &Spec, const CStringW &DestinationDir)
Definition: geninst.cpp:361
UninstallStage
Definition: geninst.cpp:700
@ UINSTALLSTAGECOUNT
Definition: geninst.cpp:703
@ US_CONTAINERS
Definition: geninst.cpp:702
@ US_ITEMS
Definition: geninst.cpp:701
static DWORD CALLBACK WorkerThread(LPVOID Parameter)
Definition: geninst.cpp:602
#define DB_GENINST_DELREGEMPTY
Definition: geninst.cpp:41
static int ExtractFilesFromZip(LPCWSTR Archive, const CStringW &OutputDir, EXTRACTCALLBACK Callback, void *Context)
Definition: geninst.cpp:63
static CStringW CreateMainShortcut(const CStringW &Target)
Definition: geninst.cpp:289
HRESULT ExtractArchiveForExecution(PCWSTR pszArchive, const CStringW &PackageName, CStringW &TempDir, CStringW &App)
Definition: geninst.cpp:850
static DWORD CALLBACK UninstallThread(LPVOID Parameter)
Definition: geninst.cpp:707
static void WriteArpEntry(LPCWSTR Name, LPCWSTR Value, UINT Type=REG_SZ)
Definition: geninst.cpp:220
BOOL IsZipFile(PCWSTR Path)
Definition: geninst.cpp:51
static LPCWSTR GetCommonString(LPCWSTR Name, CStringW &Output, LPCWSTR Default=L"")
Definition: geninst.cpp:204
@ UNOP_REGKEY
Definition: geninst.cpp:47
@ UNOP_FILE
Definition: geninst.cpp:44
@ UNOP_DIR
Definition: geninst.cpp:45
@ UNOP_EMPTYDIR
Definition: geninst.cpp:46
@ UNOP_EMPTYREGKEY
Definition: geninst.cpp:48
#define DB_GENINST_LNKARGS
Definition: geninst.cpp:36
static BOOL CreateUI(BOOL Silent, LPTHREAD_START_ROUTINE ThreadProc)
Definition: geninst.cpp:650
BOOL UninstallGenerated(CInstalledApplicationInfo &AppInfo, UninstallCommandFlags Flags)
Definition: geninst.cpp:842
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
GLsizeiptr size
Definition: glext.h:5919
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLfloat GLfloat p
Definition: glext.h:8902
GLenum GLsizei len
Definition: glext.h:6722
UINT WINAPI ExtractIconExW(LPCWSTR lpszFile, INT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIcons)
Definition: iconcache.cpp:855
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
void fill_win32_filefunc64W(zlib_filefunc64_def *pzlib_filefunc_def)
Definition: iowin32.c:457
#define LOBYTE(W)
Definition: jmemdos.c:487
#define HIBYTE(W)
Definition: jmemdos.c:486
#define REG_SZ
Definition: layer.c:22
#define HResultFromWin32
Definition: loader.cpp:14
HWND hMainWnd
Definition: magnifier.c:32
PTHREAD_START_ROUTINE LPTHREAD_START_ROUTINE
Definition: minwinbase.h:124
LONG_PTR LPARAM
Definition: minwindef.h:175
UINT_PTR WPARAM
Definition: minwindef.h:174
struct msdos_volume_info vi
Definition: mkdosfs.c:440
#define error(str)
Definition: mkdosfs.c:1605
#define PAD
Definition: options.h:30
#define CREATE_ALWAYS
Definition: disk.h:72
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
static HICON
Definition: imagelist.c:80
static HTREEITEM hRoot
Definition: treeview.c:383
static HMODULE MODULEINFO DWORD cb
Definition: module.c:33
IMAGE_DOS_HEADER dos
Definition: module.c:49
_In_ HANDLE hFile
Definition: mswsock.h:90
CAtlStringW CStringW
Definition: atlstr.h:130
unsigned int UINT
Definition: ndis.h:50
#define KEY_READ
Definition: nt_native.h:1026
#define REG_OPTION_NON_VOLATILE
Definition: nt_native.h:1060
#define FILE_SHARE_DELETE
Definition: nt_native.h:682
#define FILE_ATTRIBUTE_DIRECTORY
Definition: nt_native.h:705
#define DELETE
Definition: nt_native.h:57
#define KEY_WRITE
Definition: nt_native.h:1034
#define GENERIC_WRITE
Definition: nt_native.h:90
#define UNICODE_NULL
const GUID IID_IPersistFile
#define LOWORD(l)
Definition: pedump.c:82
#define WS_CHILD
Definition: pedump.c:617
#define WS_CAPTION
Definition: pedump.c:624
#define WS_VISIBLE
Definition: pedump.c:620
#define PBM_SETRANGE32
Definition: commctrl.h:2193
#define PBS_MARQUEE
Definition: commctrl.h:2203
#define PBM_DELTAPOS
Definition: commctrl.h:2190
#define PBM_SETPOS
Definition: commctrl.h:2189
#define PBM_SETMARQUEE
Definition: commctrl.h:2204
@ CTF_COINIT
Definition: shlwapi.h:75
#define PathParseIconLocation
Definition: shlwapi.h:497
#define err(...)
const WCHAR * str
#define CP_UTF8
Definition: nls.h:20
#define PRIMARYLANGID(l)
Definition: nls.h:16
@ Output
Definition: arc.h:94
_In_ UINT _In_ UINT cch
Definition: shellapi.h:432
#define SEE_MASK_NOASYNC
Definition: shellapi.h:35
BOOL WINAPI DECLSPEC_HOTPATCH ShellExecuteExW(LPSHELLEXECUTEINFOW sei)
Definition: shlexec.cpp:2723
EXTERN_C HRESULT WINAPI SHPathPrepareForWriteW(HWND hwnd, IUnknown *modless, LPCWSTR path, DWORD flags)
Definition: shlfileop.cpp:2364
HRESULT hr
Definition: shlfolder.c:183
#define CSIDL_COMMON_PROGRAMS
Definition: shlobj.h:2201
#define SHPPFW_IGNOREFILENAME
Definition: shlobj.h:341
#define SHPPFW_DIRCREATE
Definition: shlobj.h:338
#define CSIDL_PROGRAMS
Definition: shlobj.h:2181
#define _countof(array)
Definition: sndvol32.h:70
CardRegion * from
Definition: spigame.cpp:19
CRegKey * ArpKey
Definition: geninst.cpp:173
BOOL Silent
Definition: geninst.cpp:172
HWND hDlg
Definition: geninst.cpp:170
DWORD Error
Definition: geninst.cpp:171
CRegKey Entries
Definition: geninst.cpp:173
DWORD Count
Definition: geninst.cpp:171
CommonInfo(LPCWSTR DisplayName, BOOL IsSilent=FALSE)
Definition: geninst.cpp:175
HWND GetGuiOwner() const
Definition: geninst.cpp:179
LPCWSTR AppName
Definition: geninst.cpp:169
Definition: xml2sdb.h:159
LPCWSTR ArchivePath
Definition: geninst.cpp:185
CConfigParser & Parser
Definition: geninst.cpp:184
UINT EntryCount
Definition: geninst.cpp:187
BOOL PerUser
Definition: geninst.cpp:188
CStringW MainApp
Definition: geninst.cpp:186
UINT InstallDirLen
Definition: geninst.cpp:187
LPCWSTR InstallDir
Definition: geninst.cpp:185
CStringW UninstFile
Definition: geninst.cpp:186
InstallInfo(LPCWSTR AppName, CConfigParser &CP, LPCWSTR Archive)
Definition: geninst.cpp:190
LPCWSTR ShortcutFile
Definition: geninst.cpp:185
UninstallInfo(CInstalledApplicationInfo &Info, BOOL IsSilent)
Definition: geninst.cpp:692
CInstalledApplicationInfo & AppInfo
Definition: geninst.cpp:691
_Field_z_ WCHAR cFileName[MAX_PATH]
Definition: minwinbase.h:291
DWORD dwFileAttributes
Definition: minwinbase.h:283
Definition: fci.c:127
Definition: format.c:58
Definition: copy.c:22
Definition: tftpd.h:60
Definition: name.c:39
Definition: parser.c:56
uLong version
Definition: unzip.h:113
ZPOS64_T uncompressed_size
Definition: unzip.h:120
uLong size_filename
Definition: unzip.h:121
uLong external_fa
Definition: unzip.h:127
#define ICON_BIG
Definition: tnclass.cpp:51
#define SetWindowLongPtr
Definition: treelist.c:70
TW_UINT32 TW_UINT16 TW_UINT16 MSG
Definition: twain.h:1829
int32_t INT_PTR
Definition: typedefs.h:64
const uint16_t * PCWSTR
Definition: typedefs.h:57
#define MAKEWORD(a, b)
Definition: typedefs.h:248
#define HIWORD(l)
Definition: typedefs.h:247
#define CMD_KEY_UNINSTALL
Definition: unattended.h:5
Definition: pdh_main.c:96
unzFile ZEXPORT unzOpen2_64(const void *path, zlib_filefunc64_def *pzlib_filefunc_def)
Definition: unzip.c:783
int ZEXPORT unzGetCurrentFileInfo64(unzFile file, unz_file_info64 *pfile_info, char *szFileName, uLong fileNameBufferSize, void *extraField, uLong extraFieldBufferSize, char *szComment, uLong commentBufferSize)
Definition: unzip.c:1129
int ZEXPORT unzGoToFirstFile(unzFile file)
Definition: unzip.c:1183
int ZEXPORT unzOpenCurrentFile(unzFile file)
Definition: unzip.c:1648
int ZEXPORT unzReadCurrentFile(unzFile file, voidp buf, unsigned len)
Definition: unzip.c:1691
int ZEXPORT unzCloseCurrentFile(unzFile file)
Definition: unzip.c:2014
int ZEXPORT unzGoToNextFile(unzFile file)
Definition: unzip.c:1204
int ZEXPORT unzClose(unzFile file)
Definition: unzip.c:813
#define UNZ_BADZIPFILE
Definition: unzip.h:79
#define UNZ_ERRNO
Definition: unzip.h:76
#define UNZ_END_OF_LIST_OF_FILE
Definition: unzip.h:75
voidp unzFile
Definition: unzip.h:70
#define UNZ_OK
Definition: unzip.h:74
static const WCHAR lang[]
Definition: wbemdisp.c:287
_Must_inspect_result_ _In_ WDFCHILDLIST _In_ PWDF_CHILD_LIST_ITERATOR _Out_ WDFDEVICE _Inout_opt_ PWDF_CHILD_RETRIEVE_INFO Info
Definition: wdfchildlist.h:690
_In_ WDFINTERRUPT _In_ PFN_WDF_INTERRUPT_SYNCHRONIZE Callback
Definition: wdfinterrupt.h:458
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
Definition: wdfregistry.h:413
_In_ WDFIOTARGET Target
Definition: wdfrequest.h:306
int codepage
Definition: win_iconv.c:156
#define success(from, fromstr, to, tostr)
#define RemoveDirectory
Definition: winbase.h:3644
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
DWORD WINAPI GetCurrentProcessId(void)
Definition: proc.c:1158
#define DeleteFile
Definition: winbase.h:3513
#define MoveFileEx
Definition: winbase.h:3627
#define GetModuleFileName
Definition: winbase.h:3580
#define S_FALSE
Definition: winerror.h:3451
static HRESULT HRESULT_FROM_WIN32(unsigned int x)
Definition: winerror.h:210
#define ERROR_PATH_NOT_FOUND
Definition: winerror.h:228
#define ERROR_CANCELLED
Definition: winerror.h:1055
#define ERROR_CAN_NOT_COMPLETE
Definition: winerror.h:906
#define ERROR_BAD_FORMAT
Definition: winerror.h:236
#define ERROR_INTERNAL_ERROR
Definition: winerror.h:1185
#define ERROR_NOT_FOUND
Definition: winerror.h:1014
#define LOCALE_ILANGUAGE
Definition: winnls.h:30
#define HKEY_LOCAL_MACHINE
Definition: winreg.h:12
#define HKEY_CURRENT_USER
Definition: winreg.h:11
#define RegEnumValue
Definition: winreg.h:518
ACCESS_MASK REGSAM
Definition: winreg.h:76
#define RegQueryInfoKey
Definition: winreg.h:528
#define HKEY_CLASSES_ROOT
Definition: winreg.h:10
#define WM_CLOSE
Definition: winuser.h:1649
#define WM_QUIT
Definition: winuser.h:1651
BOOL WINAPI TranslateMessage(_In_ const MSG *)
BOOL WINAPI ShowWindow(_In_ HWND, _In_ int)
BOOL WINAPI GetMessageW(_Out_ LPMSG, _In_opt_ HWND, _In_ UINT, _In_ UINT)
int WINAPIV wsprintfW(_Out_ LPWSTR, _In_ _Printf_format_string_ LPCWSTR,...)
#define DS_MODALFRAME
Definition: winuser.h:375
#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 WM_SETTEXT
Definition: winuser.h:1645
#define DS_CENTER
Definition: winuser.h:369
#define SendMessage
Definition: winuser.h:5954
#define PostMessage
Definition: winuser.h:5943
#define DS_NOFAILCREATE
Definition: winuser.h:376
LRESULT WINAPI DispatchMessageW(_In_ const MSG *)
#define MB_ICONQUESTION
Definition: winuser.h:800
#define MessageBox
Definition: winuser.h:5933
#define SW_SHOW
Definition: winuser.h:786
#define WM_DESTROY
Definition: winuser.h:1637
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
#define IDYES
Definition: winuser.h:846
#define GWL_STYLE
Definition: winuser.h:863
BOOL WINAPI DestroyWindow(_In_ HWND)
HICON WINAPI LoadIconW(_In_opt_ HINSTANCE hInstance, _In_ LPCWSTR lpIconName)
Definition: cursoricon.c:2427
HWND WINAPI CreateDialogIndirectParamW(_In_opt_ HINSTANCE, _In_ LPCDLGTEMPLATE, _In_opt_ HWND, _In_opt_ DLGPROC, _In_ LPARAM)
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
BOOL WINAPI DestroyIcon(_In_ HICON)
Definition: cursoricon.c:2405
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
#define KEY_WOW64_32KEY
Definition: cmtypes.h:45
#define KEY_WOW64_64KEY
Definition: cmtypes.h:46
_Inout_opt_ PVOID Parameter
Definition: rtltypes.h:336
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184
char * LPSTR
Definition: xmlstorage.h:182
unsigned char BYTE
Definition: xxhash.c:193