ReactOS 0.4.16-dev-980-g00983aa
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_DELFILE L"DelFile" // Delete files generated by the application
37#define DB_GENINST_DELDIR L"DelDir"
38#define DB_GENINST_DELDIREMPTY L"DelDirEmpty"
39#define DB_GENINST_DELREG L"DelReg"
40#define DB_GENINST_DELREGEMPTY L"DelRegEmpty"
41
42enum {
43 UNOP_FILE = 'F',
44 UNOP_DIR = 'D',
48};
49
51{
54 unzFile hzf = unzOpen2_64(Path, &zff);
55 if (!hzf)
56 return FALSE;
57 unzClose(hzf);
58 return TRUE;
59}
60
61static int
62ExtractFilesFromZip(LPCWSTR Archive, const CStringW &OutputDir,
64{
65 const UINT pkzefsutf8 = 1 << 11; // APPNOTE; APPENDIX D
68 unzFile hzf = unzOpen2_64(Archive, &zff);
69 if (!hzf)
70 return UNZ_BADZIPFILE;
71 CStringA narrow;
73 int zerr = unzGoToFirstFile(hzf);
74 for (; zerr == UNZ_OK; zerr = unzGoToNextFile(hzf))
75 {
77 zerr = unzGetCurrentFileInfo64(hzf, &fi, NULL, 0, NULL, 0, NULL, 0);
78 if (zerr != UNZ_OK)
79 break;
80 LPSTR file = narrow.GetBuffer(fi.size_filename);
81 zerr = unzGetCurrentFileInfo64(hzf, &fi, file, narrow.GetAllocLength(), NULL, 0, NULL, 0);
82 if (zerr != UNZ_OK)
83 break;
85 narrow.Replace('/', '\\');
86 while (narrow[0] == '\\')
87 narrow = narrow.Mid(1);
88 UINT codepage = (fi.flag & pkzefsutf8) ? CP_UTF8 : 1252;
89 UINT cch = MultiByteToWideChar(codepage, 0, narrow, -1, NULL, 0);
90 cch = MultiByteToWideChar(codepage, 0, narrow, -1, path.GetBuffer(cch - 1), cch);
91 if (!cch)
92 break;
93 path.ReleaseBuffer(cch - 1);
95 BYTE attsys = HIBYTE(fi.version), dos = 0, ntfs = 10, vfat = 14;
96 if ((attsys == dos || attsys == ntfs || attsys == vfat) && LOBYTE(fi.external_fa))
97 fileatt = LOBYTE(fi.external_fa);
98
101 continue; // Skip file
102
103 path = BuildPath(OutputDir, path);
105 if (!dir.IsEmpty() && (err = CreateDirectoryTree(dir)))
106 {
107 zerr = UNZ_ERRNO;
109 break;
110 }
111
112 if ((zerr = unzOpenCurrentFile(hzf)) != UNZ_OK)
113 break;
114 zerr = UNZ_ERRNO;
117 NULL, CREATE_ALWAYS, fileatt, NULL);
119 {
120 DWORD len = 1024 * 4, cb;
121 LPSTR buf = narrow.GetBuffer(len);
122 for (zerr = UNZ_OK; zerr == UNZ_OK;)
123 {
124 len = zerr = unzReadCurrentFile(hzf, buf, len);
125 if (zerr <= 0)
126 break;
127 zerr = WriteFile(hFile, buf, len, &cb, NULL) && cb == len ? UNZ_OK : UNZ_ERRNO;
128 }
130 }
132 }
133 unzClose(hzf);
134 return zerr == UNZ_END_OF_LIST_OF_FILE ? UNZ_OK : zerr;
135}
136
137static UINT
138ExtractZip(LPCWSTR Archive, const CStringW &OutputDir,
140{
141 int zerr = ExtractFilesFromZip(Archive, OutputDir, Callback, Cookie);
142 return zerr == UNZ_ERRNO ? GetLastError() : zerr ? ERROR_INTERNAL_ERROR : 0;
143}
144
145static UINT
146ExtractCab(LPCWSTR Archive, const CStringW &OutputDir,
148{
149 if (ExtractFilesFromCab(Archive, OutputDir, Callback, Cookie))
150 return ERROR_SUCCESS;
152 return err ? err : ERROR_INTERNAL_ERROR;
153}
154
156
157static struct CommonInfo
158{
164
165 CommonInfo(LPCWSTR DisplayName, BOOL IsSilent = FALSE)
166 : AppName(DisplayName), hDlg(NULL), Error(0), Count(0), Silent(IsSilent), ArpKey(NULL)
167 {
168 }
169 inline HWND GetGuiOwner() const { return Silent ? NULL : hDlg; }
171
173{
179
181 : CommonInfo(AppName), Parser(CP), ArchivePath(Archive)
182 {
183 EntryCount = 0;
184 }
185};
186
187static inline UINT
189{
190 return g_pInfo->Error = ErrorBox(g_pInfo->GetGuiOwner(), Error);
191}
192
193static LPCWSTR
195{
196 InstallInfo &Info = *static_cast<InstallInfo *>(g_pInfo);
198 return (found && !Output.IsEmpty() ? Output : Output = Default).GetString();
199}
200
201static LPCWSTR
203{
204 InstallInfo &Info = *static_cast<InstallInfo *>(g_pInfo);
206 return (r ? Output : Output = Default).GetString();
207}
208
209static void
211{
212 // Write a "Add/Remove programs" value if we have a valid uninstaller key
213 if (g_pInfo->ArpKey)
214 {
215 UINT err = g_pInfo->ArpKey->SetStringValue(Name, Value, Type);
216 if (err)
217 ErrorBox(err);
218 }
219}
220
221static BOOL
223{
224 InstallInfo &Info = *static_cast<InstallInfo *>(g_pInfo);
226 name.Format(L"%c%u", Type, ++Info.EntryCount);
227 UINT err = Info.Entries.SetStringValue(name, Value);
228 if (err)
229 ErrorBox(err);
230 return !err;
231}
232
233static HRESULT
235{
237 {
238 if (Path.Compare(DB_NONE) == 0)
240 Path = BuildPath(Info.InstallDir, Path);
241 int idx = PathParseIconLocation(Path.GetBuffer());
242 Path.ReleaseBuffer();
243 HICON hIco = NULL;
244 if (ExtractIconExW(Path, idx, &hIco, NULL, 1))
245 DestroyIcon(hIco);
246 if (idx)
247 Path.AppendFormat(L",%d", idx);
248 return hIco ? S_OK : S_FALSE;
249 }
251}
252
253static BOOL
255{
256 CRegKey key;
257 if (key.Open(HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\Windows\\CurrentVersion", KEY_READ) == ERROR_SUCCESS &&
258 GetRegString(key, WinVal, Output) && !Output.IsEmpty())
259 {
260 return TRUE;
261 }
262 WCHAR windir[MAX_PATH];
263 GetWindowsDirectoryW(windir, _countof(windir));
264 CStringW path = BuildPath(BuildPath(windir, L"inf"), RosInf), section;
265 DWORD lang = 0, lctype = LOCALE_ILANGUAGE | LOCALE_RETURN_NUMBER;
266 if (GetLocaleInfoW(GetUserDefaultLCID(), lctype, (LPWSTR) &lang, sizeof(lang) / sizeof(WCHAR)))
267 {
268 section.Format(L"Strings.%.4x", lang);
269 if (ReadIniValue(path, section, RosVal, Output) > 0)
270 return TRUE;
271 section.Format(L"Strings.%.2x", PRIMARYLANGID(lang));
272 if (ReadIniValue(path, section, RosVal, Output) > 0)
273 return TRUE;
274 }
275 return ReadIniValue(path, L"Strings", RosVal, Output) > 0;
276}
277
278static CStringW
280{
281 InstallInfo &Info = *static_cast<InstallInfo *>(g_pInfo);
283 CStringW rel = Info.ShortcutFile, path, dir, tmp;
284
285 if (FAILED(GetSpecialPath(csidl, path, Info.GetGuiOwner())))
286 return L""; // Pretend everything is OK
287
288 int cat;
289 if (Info.Parser.GetInt(DB_CATEGORY, cat) && cat == ENUM_CAT_GAMES)
290 {
291 // Try to find the name of the Games folder in the Start Menu
292 if (GetLocalizedSMFolderName(L"SM_GamesName", L"shortcuts.inf", L"Games", tmp))
293 {
294 path = BuildPath(path, tmp);
295 }
296 }
297
298 // SHPathPrepareForWrite will prepare the necessary directories.
299 // Windows and ReactOS SHPathPrepareForWrite do not support '/'.
300 rel.Replace('/', '\\');
301 path = BuildPath(path, rel.GetString());
303 HRESULT hr = SHPathPrepareForWriteW(Info.GetGuiOwner(), NULL, path, SHPPFW);
304 if ((Info.Error = ErrorFromHResult(hr)) != 0)
305 {
306 ErrorBox(Info.Error);
307 return L"";
308 }
309
311 hr = link.CoCreateInstance(CLSID_ShellLink, IID_IShellLinkW);
312 if (SUCCEEDED(hr))
313 {
314 if (SUCCEEDED(hr = link->SetPath(Target)))
315 {
317 link->SetWorkingDirectory(tmp);
318
320 {
321 LPWSTR p = tmp.GetBuffer();
323 link->SetIconLocation(p, idx);
324 }
325 CComPtr<IPersistFile> persist;
326 if (SUCCEEDED(hr = link->QueryInterface(IID_IPersistFile, (void**)&persist)))
327 {
328 hr = persist->Save(path, FALSE);
329 }
330 }
331 }
332 if (SUCCEEDED(hr))
333 {
334 if (AddEntry(UNOP_FILE, path))
335 {
338 }
339 }
340 else
341 {
343 }
344 return Info.Error ? L"" : path;
345}
346
347static BOOL
348InstallFiles(const CStringW &SourceDirBase, const CStringW &Spec,
349 const CStringW &DestinationDir)
350{
351 InstallInfo &Info = *static_cast<InstallInfo *>(g_pInfo);
352 CStringW sourcedir, filespec;
353 filespec = SplitFileAndDirectory(Spec, &sourcedir); // Split "[OptionalDir\]*.ext"
354 sourcedir = BuildPath(SourceDirBase, sourcedir);
355 BOOL success = TRUE;
357 HANDLE hFind = FindFirstFileW(BuildPath(sourcedir, filespec), &wfd);
358 if (hFind == INVALID_HANDLE_VALUE)
359 {
362 return TRUE;
363 else
364 return !ErrorBox(error);
365 }
366
367 for (;;)
368 {
369 CStringW from = BuildPath(sourcedir, wfd.cFileName);
370 CStringW to = BuildPath(DestinationDir, wfd.cFileName);
371 CStringW uninstpath = to.Mid(Info.InstallDirLen - 1);
372 if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
373 {
374 LPWSTR p = wfd.cFileName;
375 BOOL dots = p[0] == '.' && (!p[1] || (p[1] == '.' && !p[2]));
376 if (!dots)
377 {
378 Info.Error = CreateDirectoryTree(to);
379 if (Info.Error)
380 {
381 success = !ErrorBox(Info.Error);
382 }
383
384 if (success)
385 {
386 success = InstallFiles(from, filespec, to);
387 }
388 AddEntry(UNOP_EMPTYDIR, uninstpath);
389 }
390 }
391 else
392 {
394 if (success)
395 {
396 if (Info.MainApp.IsEmpty())
397 {
398 Info.MainApp = to;
399 }
400 success = AddEntry(UNOP_FILE, uninstpath);
401 }
402 else
403 {
404 ErrorBox();
405 }
406 SendMessage(g_pInfo->hDlg, IM_PROGRESS, 0, 0);
407 }
408
409 if (!success || !FindNextFileW(hFind, &wfd))
410 break;
411 }
412 FindClose(hFind);
413 return success;
414}
415
416static void
418{
419 CStringW item, tmp;
420 if (*GetGenerateString(Name, tmp))
421 {
422 for (int pos = 1; pos > 0;)
423 {
424 pos = tmp.Find(L'|');
425 item = pos <= 0 ? tmp : tmp.Left(pos);
426 tmp = tmp.Mid(pos + 1);
427 AddEntry(UnOp, PathPrefix + item);
428 }
429 }
430}
431
432static BOOL CALLBACK
434{
436 Info.Count += 1;
437 return TRUE;
438}
439
440static DWORD CALLBACK
442{
443 const BOOL PerUserModeDefault = TRUE;
444 InstallInfo &Info = *static_cast<InstallInfo *>(g_pInfo);
445 LPCWSTR AppName = Info.AppName, Archive = Info.ArchivePath, None = DB_NONE;
446 CStringW installdir, tempdir, files, shortcut, tmp;
447 HRESULT hr;
448 CRegKey arpkey;
449 Info.ArpKey = &arpkey;
450
451 if (!*GetGenerateString(DB_GENINST_FILES, files, L"*.exe|*.*"))
453
455 if (tmp.CompareNoCase(L"User") == 0)
456 Info.PerUser = TRUE;
457 else if (tmp.CompareNoCase(L"Machine") == 0)
458 Info.PerUser = FALSE;
459 else
460 Info.PerUser = PerUserModeDefault;
461
462 hr = GetProgramFilesPath(installdir, Info.PerUser, Info.GetGuiOwner());
463 if ((Info.Error = ErrorFromHResult(hr)) != 0)
464 return ErrorBox(Info.Error);
465
467 if (tmp.Find('%') == 0 && ExpandEnvStrings(tmp))
468 installdir = tmp;
469 else if (tmp.Compare(None))
470 installdir = BuildPath(installdir, tmp.IsEmpty() ? AppName : tmp.GetString());
471 Info.InstallDir = installdir.GetString();
472 Info.InstallDirLen = installdir.GetLength() + 1;
473 hr = SHPathPrepareForWriteW(Info.GetGuiOwner(), NULL, installdir, SHPPFW_DIRCREATE);
474 if ((Info.Error = ErrorFromHResult(hr)) != 0)
475 return ErrorBox(Info.Error);
476
477 // Create the destination directory, and inside it, a temporary directory
478 // where we will extract the archive to before moving the files to their
479 // final location (adding uninstall entries as we go)
480 tempdir.Format(L"%s\\~RAM%u.tmp", installdir.GetString(), GetCurrentProcessId());
481 Info.Error = CreateDirectoryTree(tempdir.GetString());
482 if (Info.Error)
483 return ErrorBox(Info.Error);
484
485 if (!*GetGenerateString(DB_GENINST_LNK, shortcut))
486 shortcut.Format(L"%s.lnk", AppName);
487 Info.ShortcutFile = shortcut.Compare(None) ? shortcut.GetString() : NULL;
488
489 // Create the uninstall registration key
490 LPCWSTR arpkeyname = AppName;
491 tmp = BuildPath(REGPATH_UNINSTALL, arpkeyname);
494 Info.Error = arpkey.Create(hRoot, tmp, NULL, REG_OPTION_NON_VOLATILE, regsam);
495 if (!Info.Error)
496 {
498 Info.Error = Info.Entries.Create(arpkey, GENERATE_ARPSUBKEY);
499 }
500 if (Info.Error)
501 ErrorBox(Info.Error);
502
503 if (!Info.Error)
504 {
505 BOOL isCab = LOBYTE(ClassifyFile(tempdir)) == 'C';
506 Info.Error = isCab ? ExtractCab(Archive, tempdir, ExtractCallback, &Info)
507 : ExtractZip(Archive, tempdir, ExtractCallback, &Info);
508 }
509
510 if (!Info.Error)
511 {
512 // We now know how many files we extracted, change from marquee to normal progress bar.
513 SendMessage(Info.hDlg, IM_STARTPROGRESS, 0, 0);
514
515 for (int pos = 1; pos > 0 && !Info.Error;)
516 {
517 pos = files.Find(L'|');
518 CStringW item = pos <= 0 ? files : files.Left(pos);
519 files = files.Mid(pos + 1);
520 InstallFiles(tempdir, item, installdir);
521 }
522
523 if (!Info.MainApp.IsEmpty())
524 {
531
532 WriteArpEntry(L"DisplayName", AppName);
533 WriteArpEntry(L"InstallLocation", Info.InstallDir); // Note: This value is used by the uninstaller!
534
535 LPWSTR p = tmp.GetBuffer(1 + MAX_PATH);
536 p[0] = L'\"';
538 tmp.ReleaseBuffer();
539 UINT cch = tmp.GetLength(), bitness = IsSystem64Bit() ? 64 : 32;
540 WCHAR modechar = Info.PerUser ? 'U' : 'M';
541 LPCWSTR unparamsfmt = L"\" /" CMD_KEY_UNINSTALL L" /K%s \"%c%d\\%s\"";
542 (tmp = tmp.Mid(0, cch)).AppendFormat(unparamsfmt, L"", modechar, bitness, arpkeyname);
543 WriteArpEntry(L"UninstallString", tmp);
544 (tmp = tmp.Mid(0, cch)).AppendFormat(unparamsfmt, L" /S", modechar, bitness, arpkeyname);
545 WriteArpEntry(L"QuietUninstallString", tmp);
546
547 hr = GetCustomIconPath(Info, tmp);
549 WriteArpEntry(L"DisplayIcon", hr == S_OK ? tmp : Info.MainApp);
550
551 if (*GetCommonString(DB_VERSION, tmp))
552 WriteArpEntry(L"DisplayVersion", tmp);
553
554 SYSTEMTIME st;
555 GetSystemTime(&st);
556 tmp.Format(L"%.4u%.2u%.2u", st.wYear, st.wMonth, st.wDay);
557 WriteArpEntry(L"InstallDate", tmp);
558
559 if (*GetCommonString(DB_PUBLISHER, tmp))
560 WriteArpEntry(L"Publisher", tmp);
561
562#if DBG
563 tmp.Format(L"sys64=%d rapps%d", IsSystem64Bit(), sizeof(void*) * 8);
564 WriteArpEntry(L"_DEBUG", tmp);
565#endif
566 }
567
568 if (!Info.Error && Info.ShortcutFile)
569 {
570 tmp = CreateMainShortcut(Info.MainApp);
571 if (!tmp.IsEmpty() && !Info.Silent)
572 {
575 message.Format(format, const_cast<PCWSTR>(AppName));
576 if (MessageBoxW(Info.GetGuiOwner(), message, AppName, MB_YESNO | MB_ICONQUESTION) == IDYES)
577 {
578 SHELLEXECUTEINFOW sei = { sizeof(sei), SEE_MASK_NOASYNC, Info.GetGuiOwner() };
579 sei.lpFile = tmp;
580 sei.nShow = SW_SHOW;
581 ShellExecuteExW(&sei);
582 }
583 }
584 }
585 }
586
588 RemoveDirectory(installdir.GetString()); // This is harmless even if we installed something
589 return 0;
590}
591
592static DWORD CALLBACK
594{
596 return SendMessage(g_pInfo->hDlg, IM_END, 0, 0);
597}
598
599static INT_PTR CALLBACK
601{
602 HWND hPB = GetDlgItem(hDlg, 1);
603 switch(uMsg)
604 {
605 case IM_STARTPROGRESS:
608 SendMessageW(hPB, PBM_SETRANGE32, 0, g_pInfo->Count);
609 SendMessageW(hPB, PBM_SETPOS, 0, 0);
610 break;
611 case IM_PROGRESS:
612 SendMessageW(hPB, PBM_DELTAPOS, 1, 0);
613 break;
614 case IM_END:
615 DestroyWindow(hDlg);
616 break;
617 case WM_INITDIALOG:
618 {
620 g_pInfo->hDlg = hDlg;
622 SendMessageW(hDlg, WM_SETICON, ICON_BIG, (LPARAM)hIco);
623 SendMessageW(hDlg, WM_SETTEXT, 0, (LPARAM)g_pInfo->AppName);
625 {
626 ErrorBox();
627 SendMessageW(hDlg, IM_END, 0, 0);
628 }
629 return TRUE;
630 }
631 case WM_CLOSE:
632 return TRUE;
633 case WM_DESTROY:
634 PostMessage(NULL, WM_QUIT, 0, 0);
635 break;
636 }
637 return FALSE;
638}
639
640static BOOL
642{
643 enum { DLGW = 150, DLGH = 20, PAD = 4, PADx2 = PAD * 2, CHILDCOUNT = 1 };
645 static const WORD DlgTmpl[] =
646 {
647 LOWORD(DlgStyle), HIWORD(DlgStyle), 0, 0, CHILDCOUNT, 0, 0, DLGW, DLGH, 0, 0, 0,
648 PBS_MARQUEE, HIWORD(WS_CHILD | WS_VISIBLE), 0, 0, PAD, PAD, DLGW - PADx2, DLGH - PADx2, 1,
649 'm', 's', 'c', 't', 'l', 's', '_', 'p', 'r', 'o', 'g', 'r', 'e', 's', 's', '3', '2', 0, 0,
650 };
653 if (!hWnd)
654 {
655 ErrorBox();
656 return FALSE;
657 }
658 else if (!Silent)
659 {
661 }
662 MSG Msg;
663 while (GetMessageW(&Msg, NULL, 0, 0))
664 {
667 }
668 return TRUE;
669}
670
671BOOL
673{
674 InstallInfo Info(AppInfo.szDisplayName, *AppInfo.GetConfigParser(), Archive);
675 g_pInfo = &Info;
676 return CreateUI(Info.Silent, ExtractAndInstallThread) ? !Info.Error : FALSE;
677}
678
680{
683 : CommonInfo(Info.szDisplayName, IsSilent), AppInfo(Info)
684 {
685 ArpKey = &Info.GetRegKey();
686 }
687};
688
690{
695
696static DWORD CALLBACK
698{
699 UninstallInfo &Info = *static_cast<UninstallInfo *>(g_pInfo);
700
701 CStringW tmp, path, installdir;
703 tmp.Format(path.GetString(), Info.AppName);
704 if (!Info.Silent &&
705 MessageBox(Info.GetGuiOwner(), tmp, Info.AppName, MB_YESNO | MB_ICONQUESTION) != IDYES)
706 {
707 Info.Error = ERROR_CANCELLED;
708 SendMessage(Info.hDlg, IM_END, 0, 0);
709 return 0;
710 }
711
712 Info.Error = Info.Entries.Open(*Info.ArpKey, GENERATE_ARPSUBKEY, KEY_READ);
713 if (Info.Error)
714 return ErrorBox(Info.Error);
715
716 RegQueryInfoKey(Info.Entries, NULL, NULL, NULL, NULL, NULL, NULL, &Info.Count, NULL, NULL, NULL, NULL);
717 Info.Count *= UINSTALLSTAGECOUNT;
718 SendMessage(Info.hDlg, IM_STARTPROGRESS, 0, 0);
719
720 if (!GetRegString(*Info.ArpKey, L"InstallLocation", installdir) || installdir.IsEmpty())
722
723 for (UINT stage = 0; stage < UINSTALLSTAGECOUNT; ++stage)
724 {
725 for (UINT vi = 0;; ++vi)
726 {
728 DWORD valsize = _countof(value), size = sizeof(data) - sizeof(WCHAR), rt;
730 UINT err = RegEnumValue(Info.Entries, vi, value, &valsize, NULL, &rt, (BYTE*)data, &size);
731 if (err)
732 {
734 {
735 return ErrorBox(err);
736 }
737 break;
738 }
739
740 LPCWSTR str = data;
741 WORD op = value[0];
742 switch(*data ? MAKEWORD(stage, op) : 0)
743 {
746 {
747 REGSAM wowsam = 0;
748 HKEY hKey = NULL;
749 path.Format(L"%.4s", data);
750 if (path.CompareNoCase(L"HKCR") == 0)
752 else if (path.CompareNoCase(L"HKCU") == 0)
754 else if (path.CompareNoCase(L"HKLM") == 0)
756
757 if (data[4] == '6' && data[5] == '4')
758 wowsam = KEY_WOW64_64KEY;
759 else if (data[4] == '3' && data[5] == '2')
760 wowsam = KEY_WOW64_32KEY;
761
762 str = &data[wowsam ? 6 : 4];
763 if (!hKey || *str != L'\\')
764 break;
765 tmp = SplitFileAndDirectory(++str, &path);
766 if (!tmp.IsEmpty() && !path.IsEmpty())
767 {
768 CRegKey key;
769 err = key.Open(hKey, path, DELETE | wowsam);
770 if (err == ERROR_SUCCESS)
771 {
772 if (op == UNOP_REGKEY)
773 err = key.RecurseDeleteKey(tmp);
774 else if (RegKeyHasValues(hKey, str, wowsam) == S_FALSE)
775 key.DeleteSubKey(tmp); // DelRegEmpty ignores errors
776 }
777 switch(err)
778 {
779 case ERROR_SUCCESS:
782 break;
783 default:
784 return ErrorBox(err);
785 }
786 }
787 break;
788 }
789
791 {
792 if (*data == L'\\')
793 str = (path = BuildPath(installdir, data));
794
795 if (!DeleteFile(str))
796 {
797 err = GetLastError();
799 {
800 return ErrorBox(err);
801 }
802 }
803 break;
804 }
805
808 {
809 if (*data == L'\\')
810 str = (path = BuildPath(installdir, data));
811
812 if (op == UNOP_DIR)
813 DeleteDirectoryTree(str, Info.GetGuiOwner());
814 else
816 break;
817 }
818 }
819 SendMessage(Info.hDlg, IM_PROGRESS, 0, 0);
820 }
821 }
822 if (!Info.Error)
823 {
825 if (Info.Error)
826 return ErrorBox(Info.Error);
827 }
828 return 0;
829}
830
831BOOL
833{
835 g_pInfo = &Info;
836 return CreateUI(Info.Silent, UninstallThread) ? !Info.Error : FALSE;
837}
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:90
#define GENERATE_ARPSUBKEY
Definition: appinfo.h:97
#define DB_VERSION
Definition: appinfo.h:88
#define DB_CATEGORY
Definition: appinfo.h:89
#define DB_GENINSTSECTION
Definition: appinfo.h:96
#define DB_SCOPE
Definition: appinfo.h:93
UninstallCommandFlags
Definition: appinfo.h:74
@ UCF_SILENT
Definition: appinfo.h:77
@ ENUM_CAT_GAMES
Definition: appinfo.h:30
unsigned int dir
Definition: maze.c:112
HWND hWnd
Definition: settings.c:17
#define IDI_MAIN
Definition: resource.h:4
BOOL(CALLBACK * EXTRACTCALLBACK)(const EXTRACTCALLBACKINFO &Info, void *Cookie)
Definition: misc.h:62
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:100
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:65
HRESULT RegKeyHasValues(HKEY hKey, LPCWSTR Path, REGSAM wowsam=0)
Definition: misc.cpp:446
static UINT ErrorFromHResult(HRESULT hr)
Definition: misc.h:20
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
static DWORD RemoveInstalledAppFromRegistry(const CAppInfo *Info)
Definition: appdb.cpp:315
CStringW szDisplayName
Definition: appinfo.h:112
CConfigParser * GetConfigParser() const
Definition: appinfo.h:165
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 @1672 Msg[]
HRESULT ReadIniValue(LPCWSTR File, LPCWSTR Section, LPCWSTR Name, CStringW &Output)
const WCHAR * link
Definition: db.cpp:997
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
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
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:1211
INT WINAPI GetLocaleInfoW(LCID lcid, LCTYPE lctype, LPWSTR buffer, INT len)
Definition: locale.c:1666
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
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 int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
unsigned short WORD
Definition: ntddk_ex.h:93
FxAutoRegKey hKey
#define DB_GENINST_DIR
Definition: geninst.cpp:33
#define DB_GENINST_FILES
Definition: geninst.cpp:32
static UINT ErrorBox(UINT Error=GetLastError())
Definition: geninst.cpp:188
BOOL ExtractAndRunGeneratedInstaller(const CAvailableApplicationInfo &AppInfo, LPCWSTR Archive)
Definition: geninst.cpp:672
static HRESULT GetCustomIconPath(InstallInfo &Info, CStringW &Path)
Definition: geninst.cpp:234
static BOOL GetLocalizedSMFolderName(LPCWSTR WinVal, LPCWSTR RosInf, LPCWSTR RosVal, CStringW &Output)
Definition: geninst.cpp:254
static int ExtractFilesFromZip(LPCWSTR Archive, const CStringW &OutputDir, EXTRACTCALLBACK Callback, void *Cookie)
Definition: geninst.cpp:62
#define DB_GENINST_DELREG
Definition: geninst.cpp:39
#define DB_GENINST_ICON
Definition: geninst.cpp:34
static UINT ExtractCab(LPCWSTR Archive, const CStringW &OutputDir, EXTRACTCALLBACK Callback, void *Cookie)
Definition: geninst.cpp:146
static DWORD CALLBACK ExtractAndInstallThread(LPVOID Parameter)
Definition: geninst.cpp:441
#define DB_GENINST_DELDIR
Definition: geninst.cpp:37
static void AddUninstallOperationsFromDB(LPCWSTR Name, WCHAR UnOp, CStringW PathPrefix=CStringW(L""))
Definition: geninst.cpp:417
#define DB_GENINST_DELDIREMPTY
Definition: geninst.cpp:38
static BOOL AddEntry(WCHAR Type, LPCWSTR Value)
Definition: geninst.cpp:222
#define DB_NONE
Definition: geninst.cpp:31
static INT_PTR CALLBACK UIDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: geninst.cpp:600
#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:202
#define REGPATH_UNINSTALL
Definition: geninst.cpp:29
static BOOL CALLBACK ExtractCallback(const EXTRACTCALLBACKINFO &, void *Cookie)
Definition: geninst.cpp:433
#define DB_GENINST_DELFILE
Definition: geninst.cpp:36
static BOOL InstallFiles(const CStringW &SourceDirBase, const CStringW &Spec, const CStringW &DestinationDir)
Definition: geninst.cpp:348
@ UNOP_REGKEY
Definition: geninst.cpp:46
@ UNOP_FILE
Definition: geninst.cpp:43
@ UNOP_DIR
Definition: geninst.cpp:44
@ UNOP_EMPTYDIR
Definition: geninst.cpp:45
@ UNOP_EMPTYREGKEY
Definition: geninst.cpp:47
UninstallStage
Definition: geninst.cpp:690
@ UINSTALLSTAGECOUNT
Definition: geninst.cpp:693
@ US_CONTAINERS
Definition: geninst.cpp:692
@ US_ITEMS
Definition: geninst.cpp:691
static DWORD CALLBACK WorkerThread(LPVOID Parameter)
Definition: geninst.cpp:593
#define DB_GENINST_DELREGEMPTY
Definition: geninst.cpp:40
static CStringW CreateMainShortcut(const CStringW &Target)
Definition: geninst.cpp:279
static DWORD CALLBACK UninstallThread(LPVOID Parameter)
Definition: geninst.cpp:697
static void WriteArpEntry(LPCWSTR Name, LPCWSTR Value, UINT Type=REG_SZ)
Definition: geninst.cpp:210
BOOL IsZipFile(PCWSTR Path)
Definition: geninst.cpp:50
static LPCWSTR GetCommonString(LPCWSTR Name, CStringW &Output, LPCWSTR Default=L"")
Definition: geninst.cpp:194
@ IM_PROGRESS
Definition: geninst.cpp:155
@ IM_STARTPROGRESS
Definition: geninst.cpp:155
@ IM_END
Definition: geninst.cpp:155
static BOOL CreateUI(BOOL Silent, LPTHREAD_START_ROUTINE ThreadProc)
Definition: geninst.cpp:641
static UINT ExtractZip(LPCWSTR Archive, const CStringW &OutputDir, EXTRACTCALLBACK Callback, void *Cookie)
Definition: geninst.cpp:138
BOOL UninstallGenerated(CInstalledApplicationInfo &AppInfo, UninstallCommandFlags Flags)
Definition: geninst.cpp:832
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
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 DWORD DWORD void LPSTR DWORD cch
Definition: str.c:202
static HMODULE MODULEINFO DWORD cb
Definition: module.c:33
IMAGE_DOS_HEADER dos
Definition: module.c:49
static ATOM item
Definition: dde.c:856
_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:1023
#define REG_OPTION_NON_VOLATILE
Definition: nt_native.h:1057
#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:1031
#define GENERIC_WRITE
Definition: nt_native.h:90
#define UNICODE_NULL
#define L(x)
Definition: ntvdm.h:50
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
#define err(...)
const WCHAR * str
#define CP_UTF8
Definition: nls.h:20
#define PRIMARYLANGID(l)
Definition: nls.h:16
@ Output
Definition: arc.h:85
#define SEE_MASK_NOASYNC
Definition: shellapi.h:33
BOOL WINAPI DECLSPEC_HOTPATCH ShellExecuteExW(LPSHELLEXECUTEINFOW sei)
Definition: shlexec.cpp:2452
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:2203
#define SHPPFW_IGNOREFILENAME
Definition: shlobj.h:341
#define SHPPFW_DIRCREATE
Definition: shlobj.h:338
#define CSIDL_PROGRAMS
Definition: shlobj.h:2183
#define PathParseIconLocation
Definition: shlwapi.h:1026
#define CTF_COINIT
Definition: shlwapi.h:1981
#define _countof(array)
Definition: sndvol32.h:70
CardRegion * from
Definition: spigame.cpp:19
CRegKey * ArpKey
Definition: geninst.cpp:163
BOOL Silent
Definition: geninst.cpp:162
HWND hDlg
Definition: geninst.cpp:160
DWORD Error
Definition: geninst.cpp:161
CRegKey Entries
Definition: geninst.cpp:163
DWORD Count
Definition: geninst.cpp:161
CommonInfo(LPCWSTR DisplayName, BOOL IsSilent=FALSE)
Definition: geninst.cpp:165
HWND GetGuiOwner() const
Definition: geninst.cpp:169
LPCWSTR AppName
Definition: geninst.cpp:159
LPCWSTR ArchivePath
Definition: geninst.cpp:175
CConfigParser & Parser
Definition: geninst.cpp:174
UINT EntryCount
Definition: geninst.cpp:177
BOOL PerUser
Definition: geninst.cpp:178
CStringW MainApp
Definition: geninst.cpp:176
UINT InstallDirLen
Definition: geninst.cpp:177
LPCWSTR InstallDir
Definition: geninst.cpp:175
CStringW UninstFile
Definition: geninst.cpp:176
InstallInfo(LPCWSTR AppName, CConfigParser &CP, LPCWSTR Archive)
Definition: geninst.cpp:180
LPCWSTR ShortcutFile
Definition: geninst.cpp:175
UninstallInfo(CInstalledApplicationInfo &Info, BOOL IsSilent)
Definition: geninst.cpp:682
CInstalledApplicationInfo & AppInfo
Definition: geninst.cpp:681
WORD wYear
Definition: winbase.h:936
WORD wMonth
Definition: winbase.h:937
WORD wDay
Definition: winbase.h:939
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:3926
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
DWORD WINAPI GetCurrentProcessId(void)
Definition: proc.c:1158
#define DeleteFile
Definition: winbase.h:3795
#define MoveFileEx
Definition: winbase.h:3909
DWORD(WINAPI * LPTHREAD_START_ROUTINE)(LPVOID)
Definition: winbase.h:754
#define GetModuleFileName
Definition: winbase.h:3862
LONG_PTR LPARAM
Definition: windef.h:208
UINT_PTR WPARAM
Definition: windef.h:207
#define S_FALSE
Definition: winerror.h:2357
#define ERROR_PATH_NOT_FOUND
Definition: winerror.h:106
#define ERROR_CANCELLED
Definition: winerror.h:726
#define ERROR_CAN_NOT_COMPLETE
Definition: winerror.h:582
#define ERROR_BAD_FORMAT
Definition: winerror.h:114
#define HRESULT_FROM_WIN32(x)
Definition: winerror.h:92
#define ERROR_INTERNAL_ERROR
Definition: winerror.h:840
#define LOCALE_ILANGUAGE
Definition: winnls.h:25
#define HKEY_LOCAL_MACHINE
Definition: winreg.h:12
#define HKEY_CURRENT_USER
Definition: winreg.h:11
ACCESS_MASK REGSAM
Definition: winreg.h:69
#define RegEnumValue
Definition: winreg.h:511
#define RegQueryInfoKey
Definition: winreg.h:521
#define HKEY_CLASSES_ROOT
Definition: winreg.h:10
#define WM_CLOSE
Definition: winuser.h:1632
#define WM_QUIT
Definition: winuser.h:1634
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)
#define DS_MODALFRAME
Definition: winuser.h:375
#define WM_INITDIALOG
Definition: winuser.h:1750
#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:1628
#define DS_CENTER
Definition: winuser.h:369
#define SendMessage
Definition: winuser.h:5863
#define PostMessage
Definition: winuser.h:5852
#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:5842
#define SW_SHOW
Definition: winuser.h:786
#define WM_DESTROY
Definition: winuser.h:1620
#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:2412
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:2390
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
_In_opt_ PVOID _Out_ PLARGE_INTEGER Cookie
Definition: cmfuncs.h:14
#define KEY_WOW64_32KEY
Definition: cmtypes.h:45
#define KEY_WOW64_64KEY
Definition: cmtypes.h:46
_Inout_opt_ PVOID Parameter
Definition: rtltypes.h:336
char * LPSTR
Definition: xmlstorage.h:182
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
unsigned char BYTE
Definition: xxhash.c:193