xref: /aosp_15_r20/external/lzma/C/Util/7zipUninstall/7zipUninstall.c (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker /* 7zipUninstall.c - 7-Zip Uninstaller
2*f6dc9357SAndroid Build Coastguard Worker 2024-03-21 : Igor Pavlov : Public domain */
3*f6dc9357SAndroid Build Coastguard Worker 
4*f6dc9357SAndroid Build Coastguard Worker #include "Precomp.h"
5*f6dc9357SAndroid Build Coastguard Worker 
6*f6dc9357SAndroid Build Coastguard Worker // #define SZ_ERROR_ABORT 100
7*f6dc9357SAndroid Build Coastguard Worker 
8*f6dc9357SAndroid Build Coastguard Worker #include "../../7zTypes.h"
9*f6dc9357SAndroid Build Coastguard Worker #include "../../7zWindows.h"
10*f6dc9357SAndroid Build Coastguard Worker 
11*f6dc9357SAndroid Build Coastguard Worker #if defined(_MSC_VER) && _MSC_VER < 1600
12*f6dc9357SAndroid Build Coastguard Worker #pragma warning(disable : 4201) // nonstandard extension used : nameless struct/union
13*f6dc9357SAndroid Build Coastguard Worker #endif
14*f6dc9357SAndroid Build Coastguard Worker 
15*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_OLD_WIN_SDK
16*f6dc9357SAndroid Build Coastguard Worker struct IShellView;
17*f6dc9357SAndroid Build Coastguard Worker #define SHFOLDERAPI  EXTERN_C DECLSPEC_IMPORT HRESULT STDAPICALLTYPE
18*f6dc9357SAndroid Build Coastguard Worker SHFOLDERAPI SHGetFolderPathW(HWND hwnd, int csidl, HANDLE hToken, DWORD dwFlags, LPWSTR pszPath);
19*f6dc9357SAndroid Build Coastguard Worker #define BIF_NEWDIALOGSTYLE     0x0040   // Use the new dialog layout with the ability to resize
20*f6dc9357SAndroid Build Coastguard Worker typedef enum {
21*f6dc9357SAndroid Build Coastguard Worker     SHGFP_TYPE_CURRENT  = 0,   // current value for user, verify it exists
22*f6dc9357SAndroid Build Coastguard Worker     SHGFP_TYPE_DEFAULT  = 1,   // default value, may not exist
23*f6dc9357SAndroid Build Coastguard Worker } SHGFP_TYPE;
24*f6dc9357SAndroid Build Coastguard Worker #endif
25*f6dc9357SAndroid Build Coastguard Worker #if defined(__MINGW32__) || defined(__MINGW64__)
26*f6dc9357SAndroid Build Coastguard Worker #include <shlobj.h>
27*f6dc9357SAndroid Build Coastguard Worker #else
28*f6dc9357SAndroid Build Coastguard Worker #include <ShlObj.h>
29*f6dc9357SAndroid Build Coastguard Worker #endif
30*f6dc9357SAndroid Build Coastguard Worker 
31*f6dc9357SAndroid Build Coastguard Worker #include "../../7zVersion.h"
32*f6dc9357SAndroid Build Coastguard Worker 
33*f6dc9357SAndroid Build Coastguard Worker #include "resource.h"
34*f6dc9357SAndroid Build Coastguard Worker 
35*f6dc9357SAndroid Build Coastguard Worker 
36*f6dc9357SAndroid Build Coastguard Worker 
37*f6dc9357SAndroid Build Coastguard Worker 
38*f6dc9357SAndroid Build Coastguard Worker #define LLL_(quote) L##quote
39*f6dc9357SAndroid Build Coastguard Worker #define LLL(quote) LLL_(quote)
40*f6dc9357SAndroid Build Coastguard Worker 
41*f6dc9357SAndroid Build Coastguard Worker #define wcscat lstrcatW
42*f6dc9357SAndroid Build Coastguard Worker #define wcslen (size_t)lstrlenW
43*f6dc9357SAndroid Build Coastguard Worker #define wcscpy lstrcpyW
44*f6dc9357SAndroid Build Coastguard Worker 
45*f6dc9357SAndroid Build Coastguard Worker // static LPCWSTR const k_7zip = L"7-Zip";
46*f6dc9357SAndroid Build Coastguard Worker 
47*f6dc9357SAndroid Build Coastguard Worker // #define Z7_64BIT_INSTALLER 1
48*f6dc9357SAndroid Build Coastguard Worker 
49*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN64
50*f6dc9357SAndroid Build Coastguard Worker   #define Z7_64BIT_INSTALLER 1
51*f6dc9357SAndroid Build Coastguard Worker #endif
52*f6dc9357SAndroid Build Coastguard Worker 
53*f6dc9357SAndroid Build Coastguard Worker #define k_7zip_with_Ver_base L"7-Zip " LLL(MY_VERSION)
54*f6dc9357SAndroid Build Coastguard Worker 
55*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_64BIT_INSTALLER
56*f6dc9357SAndroid Build Coastguard Worker 
57*f6dc9357SAndroid Build Coastguard Worker   // #define USE_7ZIP_32_DLL
58*f6dc9357SAndroid Build Coastguard Worker 
59*f6dc9357SAndroid Build Coastguard Worker   #if defined(_M_ARM64) || defined(_M_ARM)
60*f6dc9357SAndroid Build Coastguard Worker     #define k_Postfix  L" (arm64)"
61*f6dc9357SAndroid Build Coastguard Worker   #else
62*f6dc9357SAndroid Build Coastguard Worker     #define k_Postfix  L" (x64)"
63*f6dc9357SAndroid Build Coastguard Worker     #define USE_7ZIP_32_DLL
64*f6dc9357SAndroid Build Coastguard Worker   #endif
65*f6dc9357SAndroid Build Coastguard Worker #else
66*f6dc9357SAndroid Build Coastguard Worker   #if defined(_M_ARM64) || defined(_M_ARM)
67*f6dc9357SAndroid Build Coastguard Worker     #define k_Postfix  L" (arm)"
68*f6dc9357SAndroid Build Coastguard Worker   #else
69*f6dc9357SAndroid Build Coastguard Worker     // #define k_Postfix  L" (x86)"
70*f6dc9357SAndroid Build Coastguard Worker     #define k_Postfix
71*f6dc9357SAndroid Build Coastguard Worker   #endif
72*f6dc9357SAndroid Build Coastguard Worker #endif
73*f6dc9357SAndroid Build Coastguard Worker 
74*f6dc9357SAndroid Build Coastguard Worker #define k_7zip_with_Ver  k_7zip_with_Ver_base k_Postfix
75*f6dc9357SAndroid Build Coastguard Worker 
76*f6dc9357SAndroid Build Coastguard Worker static LPCWSTR const k_7zip_with_Ver_Uninstall = k_7zip_with_Ver L" Uninstall";
77*f6dc9357SAndroid Build Coastguard Worker 
78*f6dc9357SAndroid Build Coastguard Worker static LPCWSTR const k_Reg_Software_7zip = L"Software\\7-Zip";
79*f6dc9357SAndroid Build Coastguard Worker 
80*f6dc9357SAndroid Build Coastguard Worker static LPCWSTR const k_Reg_Path = L"Path";
81*f6dc9357SAndroid Build Coastguard Worker 
82*f6dc9357SAndroid Build Coastguard Worker static LPCWSTR const k_Reg_Path32 = L"Path"
83*f6dc9357SAndroid Build Coastguard Worker   #ifdef Z7_64BIT_INSTALLER
84*f6dc9357SAndroid Build Coastguard Worker     L"64"
85*f6dc9357SAndroid Build Coastguard Worker   #else
86*f6dc9357SAndroid Build Coastguard Worker     L"32"
87*f6dc9357SAndroid Build Coastguard Worker   #endif
88*f6dc9357SAndroid Build Coastguard Worker   ;
89*f6dc9357SAndroid Build Coastguard Worker 
90*f6dc9357SAndroid Build Coastguard Worker #if defined(Z7_64BIT_INSTALLER) && !defined(_WIN64)
91*f6dc9357SAndroid Build Coastguard Worker   #define k_Reg_WOW_Flag KEY_WOW64_64KEY
92*f6dc9357SAndroid Build Coastguard Worker #else
93*f6dc9357SAndroid Build Coastguard Worker   #define k_Reg_WOW_Flag 0
94*f6dc9357SAndroid Build Coastguard Worker #endif
95*f6dc9357SAndroid Build Coastguard Worker 
96*f6dc9357SAndroid Build Coastguard Worker #ifdef USE_7ZIP_32_DLL
97*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN64
98*f6dc9357SAndroid Build Coastguard Worker   #define k_Reg_WOW_Flag_32 KEY_WOW64_32KEY
99*f6dc9357SAndroid Build Coastguard Worker #else
100*f6dc9357SAndroid Build Coastguard Worker   #define k_Reg_WOW_Flag_32 0
101*f6dc9357SAndroid Build Coastguard Worker #endif
102*f6dc9357SAndroid Build Coastguard Worker #endif
103*f6dc9357SAndroid Build Coastguard Worker 
104*f6dc9357SAndroid Build Coastguard Worker #define k_7zip_CLSID L"{23170F69-40C1-278A-1000-000100020000}"
105*f6dc9357SAndroid Build Coastguard Worker 
106*f6dc9357SAndroid Build Coastguard Worker static LPCWSTR const k_Reg_CLSID_7zip = L"CLSID\\" k_7zip_CLSID;
107*f6dc9357SAndroid Build Coastguard Worker static LPCWSTR const k_Reg_CLSID_7zip_Inproc = L"CLSID\\" k_7zip_CLSID L"\\InprocServer32";
108*f6dc9357SAndroid Build Coastguard Worker 
109*f6dc9357SAndroid Build Coastguard Worker 
110*f6dc9357SAndroid Build Coastguard Worker #define g_AllUsers True
111*f6dc9357SAndroid Build Coastguard Worker 
112*f6dc9357SAndroid Build Coastguard Worker static BoolInt g_Install_was_Pressed;
113*f6dc9357SAndroid Build Coastguard Worker static BoolInt g_Finished;
114*f6dc9357SAndroid Build Coastguard Worker static BoolInt g_SilentMode;
115*f6dc9357SAndroid Build Coastguard Worker 
116*f6dc9357SAndroid Build Coastguard Worker static HWND g_HWND;
117*f6dc9357SAndroid Build Coastguard Worker static HWND g_Path_HWND;
118*f6dc9357SAndroid Build Coastguard Worker static HWND g_InfoLine_HWND;
119*f6dc9357SAndroid Build Coastguard Worker static HWND g_Progress_HWND;
120*f6dc9357SAndroid Build Coastguard Worker 
121*f6dc9357SAndroid Build Coastguard Worker // RegDeleteKeyExW is supported starting from win2003sp1/xp-pro-x64
122*f6dc9357SAndroid Build Coastguard Worker // Z7_WIN32_WINNT_MIN < 0x0600  // Vista
123*f6dc9357SAndroid Build Coastguard Worker #if !defined(Z7_WIN32_WINNT_MIN) \
124*f6dc9357SAndroid Build Coastguard Worker     || Z7_WIN32_WINNT_MIN  < 0x0502  /* < win2003 */ \
125*f6dc9357SAndroid Build Coastguard Worker     || Z7_WIN32_WINNT_MIN == 0x0502 && !defined(_M_AMD64)
126*f6dc9357SAndroid Build Coastguard Worker #define Z7_USE_DYN_RegDeleteKeyExW
127*f6dc9357SAndroid Build Coastguard Worker #endif
128*f6dc9357SAndroid Build Coastguard Worker 
129*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_USE_DYN_RegDeleteKeyExW
130*f6dc9357SAndroid Build Coastguard Worker Z7_DIAGNOSTIC_IGNORE_CAST_FUNCTION
131*f6dc9357SAndroid Build Coastguard Worker typedef LONG (APIENTRY *Func_RegDeleteKeyExW)(HKEY hKey, LPCWSTR lpSubKey, REGSAM samDesired, DWORD Reserved);
132*f6dc9357SAndroid Build Coastguard Worker static Func_RegDeleteKeyExW func_RegDeleteKeyExW;
133*f6dc9357SAndroid Build Coastguard Worker #endif
134*f6dc9357SAndroid Build Coastguard Worker 
135*f6dc9357SAndroid Build Coastguard Worker static WCHAR cmd[MAX_PATH + 4];
136*f6dc9357SAndroid Build Coastguard Worker static WCHAR cmdError[MAX_PATH + 4];
137*f6dc9357SAndroid Build Coastguard Worker static WCHAR path[MAX_PATH * 2 + 40];
138*f6dc9357SAndroid Build Coastguard Worker static WCHAR workDir[MAX_PATH + 10];
139*f6dc9357SAndroid Build Coastguard Worker static WCHAR modulePath[MAX_PATH + 10];
140*f6dc9357SAndroid Build Coastguard Worker static WCHAR modulePrefix[MAX_PATH + 10];
141*f6dc9357SAndroid Build Coastguard Worker static WCHAR tempPath[MAX_PATH * 2 + 40];
142*f6dc9357SAndroid Build Coastguard Worker static WCHAR cmdLine[MAX_PATH * 3 + 40];
143*f6dc9357SAndroid Build Coastguard Worker static WCHAR copyPath[MAX_PATH * 2 + 40];
144*f6dc9357SAndroid Build Coastguard Worker 
145*f6dc9357SAndroid Build Coastguard Worker static LPCWSTR const kUninstallExe = L"Uninstall.exe";
146*f6dc9357SAndroid Build Coastguard Worker 
147*f6dc9357SAndroid Build Coastguard Worker #define MAKE_CHAR_UPPER(c) ((((c) >= 'a' && (c) <= 'z') ? (c) - 0x20 : (c)))
148*f6dc9357SAndroid Build Coastguard Worker 
149*f6dc9357SAndroid Build Coastguard Worker 
CpyAscii(wchar_t * dest,const char * s)150*f6dc9357SAndroid Build Coastguard Worker static void CpyAscii(wchar_t *dest, const char *s)
151*f6dc9357SAndroid Build Coastguard Worker {
152*f6dc9357SAndroid Build Coastguard Worker   for (;;)
153*f6dc9357SAndroid Build Coastguard Worker   {
154*f6dc9357SAndroid Build Coastguard Worker     const Byte b = (Byte)*s++;
155*f6dc9357SAndroid Build Coastguard Worker     *dest++ = b;
156*f6dc9357SAndroid Build Coastguard Worker     if (b == 0)
157*f6dc9357SAndroid Build Coastguard Worker       return;
158*f6dc9357SAndroid Build Coastguard Worker   }
159*f6dc9357SAndroid Build Coastguard Worker }
160*f6dc9357SAndroid Build Coastguard Worker 
CatAscii(wchar_t * dest,const char * s)161*f6dc9357SAndroid Build Coastguard Worker static void CatAscii(wchar_t *dest, const char *s)
162*f6dc9357SAndroid Build Coastguard Worker {
163*f6dc9357SAndroid Build Coastguard Worker   dest += wcslen(dest);
164*f6dc9357SAndroid Build Coastguard Worker   CpyAscii(dest, s);
165*f6dc9357SAndroid Build Coastguard Worker }
166*f6dc9357SAndroid Build Coastguard Worker 
PrintErrorMessage(const char * s1,const wchar_t * s2)167*f6dc9357SAndroid Build Coastguard Worker static void PrintErrorMessage(const char *s1, const wchar_t *s2)
168*f6dc9357SAndroid Build Coastguard Worker {
169*f6dc9357SAndroid Build Coastguard Worker   WCHAR m[MAX_PATH + 512];
170*f6dc9357SAndroid Build Coastguard Worker   m[0] = 0;
171*f6dc9357SAndroid Build Coastguard Worker   CatAscii(m, "ERROR:");
172*f6dc9357SAndroid Build Coastguard Worker   if (s1)
173*f6dc9357SAndroid Build Coastguard Worker   {
174*f6dc9357SAndroid Build Coastguard Worker     CatAscii(m, "\n");
175*f6dc9357SAndroid Build Coastguard Worker     CatAscii(m, s1);
176*f6dc9357SAndroid Build Coastguard Worker   }
177*f6dc9357SAndroid Build Coastguard Worker   if (s2)
178*f6dc9357SAndroid Build Coastguard Worker   {
179*f6dc9357SAndroid Build Coastguard Worker     CatAscii(m, "\n");
180*f6dc9357SAndroid Build Coastguard Worker     wcscat(m, s2);
181*f6dc9357SAndroid Build Coastguard Worker   }
182*f6dc9357SAndroid Build Coastguard Worker   MessageBoxW(g_HWND, m, k_7zip_with_Ver_Uninstall, MB_ICONERROR | MB_OK);
183*f6dc9357SAndroid Build Coastguard Worker }
184*f6dc9357SAndroid Build Coastguard Worker 
185*f6dc9357SAndroid Build Coastguard Worker 
AreStringsEqual_NoCase(const wchar_t * s1,const wchar_t * s2)186*f6dc9357SAndroid Build Coastguard Worker static BoolInt AreStringsEqual_NoCase(const wchar_t *s1, const wchar_t *s2)
187*f6dc9357SAndroid Build Coastguard Worker {
188*f6dc9357SAndroid Build Coastguard Worker   for (;;)
189*f6dc9357SAndroid Build Coastguard Worker   {
190*f6dc9357SAndroid Build Coastguard Worker     wchar_t c1 = *s1++;
191*f6dc9357SAndroid Build Coastguard Worker     wchar_t c2 = *s2++;
192*f6dc9357SAndroid Build Coastguard Worker     if (c1 != c2 && MAKE_CHAR_UPPER(c1) != MAKE_CHAR_UPPER(c2))
193*f6dc9357SAndroid Build Coastguard Worker       return False;
194*f6dc9357SAndroid Build Coastguard Worker     if (c2 == 0)
195*f6dc9357SAndroid Build Coastguard Worker       return True;
196*f6dc9357SAndroid Build Coastguard Worker   }
197*f6dc9357SAndroid Build Coastguard Worker }
198*f6dc9357SAndroid Build Coastguard Worker 
IsString1PrefixedByString2_NoCase(const wchar_t * s1,const wchar_t * s2)199*f6dc9357SAndroid Build Coastguard Worker static BoolInt IsString1PrefixedByString2_NoCase(const wchar_t *s1, const wchar_t *s2)
200*f6dc9357SAndroid Build Coastguard Worker {
201*f6dc9357SAndroid Build Coastguard Worker   for (;;)
202*f6dc9357SAndroid Build Coastguard Worker   {
203*f6dc9357SAndroid Build Coastguard Worker     wchar_t c1;
204*f6dc9357SAndroid Build Coastguard Worker     const wchar_t c2 = *s2++;
205*f6dc9357SAndroid Build Coastguard Worker     if (c2 == 0)
206*f6dc9357SAndroid Build Coastguard Worker       return True;
207*f6dc9357SAndroid Build Coastguard Worker     c1 = *s1++;
208*f6dc9357SAndroid Build Coastguard Worker     if (c1 != c2 && MAKE_CHAR_UPPER(c1) != MAKE_CHAR_UPPER(c2))
209*f6dc9357SAndroid Build Coastguard Worker       return False;
210*f6dc9357SAndroid Build Coastguard Worker   }
211*f6dc9357SAndroid Build Coastguard Worker }
212*f6dc9357SAndroid Build Coastguard Worker 
NormalizePrefix(WCHAR * s)213*f6dc9357SAndroid Build Coastguard Worker static void NormalizePrefix(WCHAR *s)
214*f6dc9357SAndroid Build Coastguard Worker {
215*f6dc9357SAndroid Build Coastguard Worker   const size_t len = wcslen(s);
216*f6dc9357SAndroid Build Coastguard Worker   if (len != 0)
217*f6dc9357SAndroid Build Coastguard Worker     if (s[len - 1] != WCHAR_PATH_SEPARATOR)
218*f6dc9357SAndroid Build Coastguard Worker     {
219*f6dc9357SAndroid Build Coastguard Worker       s[len] = WCHAR_PATH_SEPARATOR;
220*f6dc9357SAndroid Build Coastguard Worker       s[len + 1] = 0;
221*f6dc9357SAndroid Build Coastguard Worker     }
222*f6dc9357SAndroid Build Coastguard Worker }
223*f6dc9357SAndroid Build Coastguard Worker 
MyRegistry_QueryString(HKEY hKey,LPCWSTR name,LPWSTR dest)224*f6dc9357SAndroid Build Coastguard Worker static int MyRegistry_QueryString(HKEY hKey, LPCWSTR name, LPWSTR dest)
225*f6dc9357SAndroid Build Coastguard Worker {
226*f6dc9357SAndroid Build Coastguard Worker   DWORD cnt = MAX_PATH * sizeof(name[0]);
227*f6dc9357SAndroid Build Coastguard Worker   DWORD type = 0;
228*f6dc9357SAndroid Build Coastguard Worker   const LONG res = RegQueryValueExW(hKey, name, NULL, &type, (LPBYTE)dest, &cnt);
229*f6dc9357SAndroid Build Coastguard Worker   if (type != REG_SZ)
230*f6dc9357SAndroid Build Coastguard Worker     return False;
231*f6dc9357SAndroid Build Coastguard Worker   return res == ERROR_SUCCESS;
232*f6dc9357SAndroid Build Coastguard Worker }
233*f6dc9357SAndroid Build Coastguard Worker 
MyRegistry_QueryString2(HKEY hKey,LPCWSTR keyName,LPCWSTR valName,LPWSTR dest)234*f6dc9357SAndroid Build Coastguard Worker static int MyRegistry_QueryString2(HKEY hKey, LPCWSTR keyName, LPCWSTR valName, LPWSTR dest)
235*f6dc9357SAndroid Build Coastguard Worker {
236*f6dc9357SAndroid Build Coastguard Worker   HKEY key = 0;
237*f6dc9357SAndroid Build Coastguard Worker   const LONG res = RegOpenKeyExW(hKey, keyName, 0, KEY_READ | k_Reg_WOW_Flag, &key);
238*f6dc9357SAndroid Build Coastguard Worker   if (res != ERROR_SUCCESS)
239*f6dc9357SAndroid Build Coastguard Worker     return False;
240*f6dc9357SAndroid Build Coastguard Worker   {
241*f6dc9357SAndroid Build Coastguard Worker     const BoolInt res2 = MyRegistry_QueryString(key, valName, dest);
242*f6dc9357SAndroid Build Coastguard Worker     RegCloseKey(key);
243*f6dc9357SAndroid Build Coastguard Worker     return res2;
244*f6dc9357SAndroid Build Coastguard Worker   }
245*f6dc9357SAndroid Build Coastguard Worker }
246*f6dc9357SAndroid Build Coastguard Worker 
MyRegistry_OpenKey_ReadWrite(HKEY parentKey,LPCWSTR name,HKEY * destKey)247*f6dc9357SAndroid Build Coastguard Worker static LONG MyRegistry_OpenKey_ReadWrite(HKEY parentKey, LPCWSTR name, HKEY *destKey)
248*f6dc9357SAndroid Build Coastguard Worker {
249*f6dc9357SAndroid Build Coastguard Worker   return RegOpenKeyExW(parentKey, name, 0, KEY_READ | KEY_WRITE | k_Reg_WOW_Flag, destKey);
250*f6dc9357SAndroid Build Coastguard Worker }
251*f6dc9357SAndroid Build Coastguard Worker 
MyRegistry_DeleteKey(HKEY parentKey,LPCWSTR name)252*f6dc9357SAndroid Build Coastguard Worker static LONG MyRegistry_DeleteKey(HKEY parentKey, LPCWSTR name)
253*f6dc9357SAndroid Build Coastguard Worker {
254*f6dc9357SAndroid Build Coastguard Worker #if k_Reg_WOW_Flag != 0
255*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_USE_DYN_RegDeleteKeyExW
256*f6dc9357SAndroid Build Coastguard Worker     if (!func_RegDeleteKeyExW)
257*f6dc9357SAndroid Build Coastguard Worker       return E_FAIL;
258*f6dc9357SAndroid Build Coastguard Worker     return func_RegDeleteKeyExW
259*f6dc9357SAndroid Build Coastguard Worker #else
260*f6dc9357SAndroid Build Coastguard Worker     return      RegDeleteKeyExW
261*f6dc9357SAndroid Build Coastguard Worker #endif
262*f6dc9357SAndroid Build Coastguard Worker       (parentKey, name, k_Reg_WOW_Flag, 0);
263*f6dc9357SAndroid Build Coastguard Worker #else
264*f6dc9357SAndroid Build Coastguard Worker     return RegDeleteKeyW(parentKey, name);
265*f6dc9357SAndroid Build Coastguard Worker #endif
266*f6dc9357SAndroid Build Coastguard Worker }
267*f6dc9357SAndroid Build Coastguard Worker 
268*f6dc9357SAndroid Build Coastguard Worker #ifdef USE_7ZIP_32_DLL
269*f6dc9357SAndroid Build Coastguard Worker 
MyRegistry_QueryString2_32(HKEY hKey,LPCWSTR keyName,LPCWSTR valName,LPWSTR dest)270*f6dc9357SAndroid Build Coastguard Worker static int MyRegistry_QueryString2_32(HKEY hKey, LPCWSTR keyName, LPCWSTR valName, LPWSTR dest)
271*f6dc9357SAndroid Build Coastguard Worker {
272*f6dc9357SAndroid Build Coastguard Worker   HKEY key = 0;
273*f6dc9357SAndroid Build Coastguard Worker   const LONG res = RegOpenKeyExW(hKey, keyName, 0, KEY_READ | k_Reg_WOW_Flag_32, &key);
274*f6dc9357SAndroid Build Coastguard Worker   if (res != ERROR_SUCCESS)
275*f6dc9357SAndroid Build Coastguard Worker     return False;
276*f6dc9357SAndroid Build Coastguard Worker   {
277*f6dc9357SAndroid Build Coastguard Worker     const BoolInt res2 = MyRegistry_QueryString(key, valName, dest);
278*f6dc9357SAndroid Build Coastguard Worker     RegCloseKey(key);
279*f6dc9357SAndroid Build Coastguard Worker     return res2;
280*f6dc9357SAndroid Build Coastguard Worker   }
281*f6dc9357SAndroid Build Coastguard Worker }
282*f6dc9357SAndroid Build Coastguard Worker 
MyRegistry_OpenKey_ReadWrite_32(HKEY parentKey,LPCWSTR name,HKEY * destKey)283*f6dc9357SAndroid Build Coastguard Worker static LONG MyRegistry_OpenKey_ReadWrite_32(HKEY parentKey, LPCWSTR name, HKEY *destKey)
284*f6dc9357SAndroid Build Coastguard Worker {
285*f6dc9357SAndroid Build Coastguard Worker   return RegOpenKeyExW(parentKey, name, 0, KEY_READ | KEY_WRITE | k_Reg_WOW_Flag_32, destKey);
286*f6dc9357SAndroid Build Coastguard Worker }
287*f6dc9357SAndroid Build Coastguard Worker 
MyRegistry_DeleteKey_32(HKEY parentKey,LPCWSTR name)288*f6dc9357SAndroid Build Coastguard Worker static LONG MyRegistry_DeleteKey_32(HKEY parentKey, LPCWSTR name)
289*f6dc9357SAndroid Build Coastguard Worker {
290*f6dc9357SAndroid Build Coastguard Worker #if k_Reg_WOW_Flag_32 != 0
291*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_USE_DYN_RegDeleteKeyExW
292*f6dc9357SAndroid Build Coastguard Worker     if (!func_RegDeleteKeyExW)
293*f6dc9357SAndroid Build Coastguard Worker       return E_FAIL;
294*f6dc9357SAndroid Build Coastguard Worker     return func_RegDeleteKeyExW
295*f6dc9357SAndroid Build Coastguard Worker #else
296*f6dc9357SAndroid Build Coastguard Worker     return      RegDeleteKeyExW
297*f6dc9357SAndroid Build Coastguard Worker #endif
298*f6dc9357SAndroid Build Coastguard Worker       (parentKey, name, k_Reg_WOW_Flag_32, 0);
299*f6dc9357SAndroid Build Coastguard Worker #else
300*f6dc9357SAndroid Build Coastguard Worker     return RegDeleteKeyW(parentKey, name);
301*f6dc9357SAndroid Build Coastguard Worker #endif
302*f6dc9357SAndroid Build Coastguard Worker }
303*f6dc9357SAndroid Build Coastguard Worker 
304*f6dc9357SAndroid Build Coastguard Worker #endif
305*f6dc9357SAndroid Build Coastguard Worker 
306*f6dc9357SAndroid Build Coastguard Worker 
307*f6dc9357SAndroid Build Coastguard Worker 
308*f6dc9357SAndroid Build Coastguard Worker 
MyReg_DeleteVal_Path_if_Equal(HKEY hKey,LPCWSTR name)309*f6dc9357SAndroid Build Coastguard Worker static void MyReg_DeleteVal_Path_if_Equal(HKEY hKey, LPCWSTR name)
310*f6dc9357SAndroid Build Coastguard Worker {
311*f6dc9357SAndroid Build Coastguard Worker   WCHAR s[MAX_PATH + 10];
312*f6dc9357SAndroid Build Coastguard Worker   if (MyRegistry_QueryString(hKey, name, s))
313*f6dc9357SAndroid Build Coastguard Worker   {
314*f6dc9357SAndroid Build Coastguard Worker     NormalizePrefix(s);
315*f6dc9357SAndroid Build Coastguard Worker     if (AreStringsEqual_NoCase(s, path))
316*f6dc9357SAndroid Build Coastguard Worker       RegDeleteValueW(hKey, name);
317*f6dc9357SAndroid Build Coastguard Worker   }
318*f6dc9357SAndroid Build Coastguard Worker }
319*f6dc9357SAndroid Build Coastguard Worker 
SetRegKey_Path2(HKEY parentKey)320*f6dc9357SAndroid Build Coastguard Worker static void SetRegKey_Path2(HKEY parentKey)
321*f6dc9357SAndroid Build Coastguard Worker {
322*f6dc9357SAndroid Build Coastguard Worker   HKEY key = 0;
323*f6dc9357SAndroid Build Coastguard Worker   const LONG res = MyRegistry_OpenKey_ReadWrite(parentKey, k_Reg_Software_7zip, &key);
324*f6dc9357SAndroid Build Coastguard Worker   if (res == ERROR_SUCCESS)
325*f6dc9357SAndroid Build Coastguard Worker   {
326*f6dc9357SAndroid Build Coastguard Worker     MyReg_DeleteVal_Path_if_Equal(key, k_Reg_Path32);
327*f6dc9357SAndroid Build Coastguard Worker     MyReg_DeleteVal_Path_if_Equal(key, k_Reg_Path);
328*f6dc9357SAndroid Build Coastguard Worker 
329*f6dc9357SAndroid Build Coastguard Worker     RegCloseKey(key);
330*f6dc9357SAndroid Build Coastguard Worker     // MyRegistry_DeleteKey(parentKey, k_Reg_Software_7zip);
331*f6dc9357SAndroid Build Coastguard Worker   }
332*f6dc9357SAndroid Build Coastguard Worker }
333*f6dc9357SAndroid Build Coastguard Worker 
SetRegKey_Path(void)334*f6dc9357SAndroid Build Coastguard Worker static void SetRegKey_Path(void)
335*f6dc9357SAndroid Build Coastguard Worker {
336*f6dc9357SAndroid Build Coastguard Worker   SetRegKey_Path2(HKEY_CURRENT_USER);
337*f6dc9357SAndroid Build Coastguard Worker   SetRegKey_Path2(HKEY_LOCAL_MACHINE);
338*f6dc9357SAndroid Build Coastguard Worker }
339*f6dc9357SAndroid Build Coastguard Worker 
CreateShellLink(LPCWSTR srcPath,LPCWSTR targetPath)340*f6dc9357SAndroid Build Coastguard Worker static HRESULT CreateShellLink(LPCWSTR srcPath, LPCWSTR targetPath)
341*f6dc9357SAndroid Build Coastguard Worker {
342*f6dc9357SAndroid Build Coastguard Worker   IShellLinkW *sl;
343*f6dc9357SAndroid Build Coastguard Worker 
344*f6dc9357SAndroid Build Coastguard Worker   // CoInitialize has already been called.
345*f6dc9357SAndroid Build Coastguard Worker   HRESULT hres = CoCreateInstance(&CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, &IID_IShellLinkW, (LPVOID*)&sl);
346*f6dc9357SAndroid Build Coastguard Worker 
347*f6dc9357SAndroid Build Coastguard Worker   if (SUCCEEDED(hres))
348*f6dc9357SAndroid Build Coastguard Worker   {
349*f6dc9357SAndroid Build Coastguard Worker     IPersistFile *pf;
350*f6dc9357SAndroid Build Coastguard Worker 
351*f6dc9357SAndroid Build Coastguard Worker     hres = sl->lpVtbl->QueryInterface(sl, &IID_IPersistFile, (LPVOID *)&pf);
352*f6dc9357SAndroid Build Coastguard Worker 
353*f6dc9357SAndroid Build Coastguard Worker     if (SUCCEEDED(hres))
354*f6dc9357SAndroid Build Coastguard Worker     {
355*f6dc9357SAndroid Build Coastguard Worker       WCHAR s[MAX_PATH + 10];
356*f6dc9357SAndroid Build Coastguard Worker       hres = pf->lpVtbl->Load(pf, srcPath, TRUE);
357*f6dc9357SAndroid Build Coastguard Worker       pf->lpVtbl->Release(pf);
358*f6dc9357SAndroid Build Coastguard Worker 
359*f6dc9357SAndroid Build Coastguard Worker       if (SUCCEEDED(hres))
360*f6dc9357SAndroid Build Coastguard Worker       {
361*f6dc9357SAndroid Build Coastguard Worker         hres = sl->lpVtbl->GetPath(sl, s, MAX_PATH, NULL, 0); // SLGP_RAWPATH
362*f6dc9357SAndroid Build Coastguard Worker         if (!AreStringsEqual_NoCase(s, targetPath))
363*f6dc9357SAndroid Build Coastguard Worker           hres = S_FALSE;
364*f6dc9357SAndroid Build Coastguard Worker       }
365*f6dc9357SAndroid Build Coastguard Worker     }
366*f6dc9357SAndroid Build Coastguard Worker 
367*f6dc9357SAndroid Build Coastguard Worker     sl->lpVtbl->Release(sl);
368*f6dc9357SAndroid Build Coastguard Worker   }
369*f6dc9357SAndroid Build Coastguard Worker 
370*f6dc9357SAndroid Build Coastguard Worker   return hres;
371*f6dc9357SAndroid Build Coastguard Worker }
372*f6dc9357SAndroid Build Coastguard Worker 
SetShellProgramsGroup(HWND hwndOwner)373*f6dc9357SAndroid Build Coastguard Worker static void SetShellProgramsGroup(HWND hwndOwner)
374*f6dc9357SAndroid Build Coastguard Worker {
375*f6dc9357SAndroid Build Coastguard Worker   #ifdef UNDER_CE
376*f6dc9357SAndroid Build Coastguard Worker 
377*f6dc9357SAndroid Build Coastguard Worker   UNUSED_VAR(hwndOwner)
378*f6dc9357SAndroid Build Coastguard Worker 
379*f6dc9357SAndroid Build Coastguard Worker   #else
380*f6dc9357SAndroid Build Coastguard Worker 
381*f6dc9357SAndroid Build Coastguard Worker   unsigned i = (g_AllUsers ? 1 : 2);
382*f6dc9357SAndroid Build Coastguard Worker 
383*f6dc9357SAndroid Build Coastguard Worker   for (; i < 3; i++)
384*f6dc9357SAndroid Build Coastguard Worker   {
385*f6dc9357SAndroid Build Coastguard Worker     // BoolInt isOK = True;
386*f6dc9357SAndroid Build Coastguard Worker     WCHAR link[MAX_PATH + 40];
387*f6dc9357SAndroid Build Coastguard Worker     WCHAR destPath[MAX_PATH + 40];
388*f6dc9357SAndroid Build Coastguard Worker 
389*f6dc9357SAndroid Build Coastguard Worker     link[0] = 0;
390*f6dc9357SAndroid Build Coastguard Worker 
391*f6dc9357SAndroid Build Coastguard Worker     if (SHGetFolderPathW(hwndOwner,
392*f6dc9357SAndroid Build Coastguard Worker         i == 1 ? CSIDL_COMMON_PROGRAMS : CSIDL_PROGRAMS,
393*f6dc9357SAndroid Build Coastguard Worker         NULL, SHGFP_TYPE_CURRENT, link) != S_OK)
394*f6dc9357SAndroid Build Coastguard Worker       continue;
395*f6dc9357SAndroid Build Coastguard Worker 
396*f6dc9357SAndroid Build Coastguard Worker     NormalizePrefix(link);
397*f6dc9357SAndroid Build Coastguard Worker     CatAscii(link, "7-Zip\\");
398*f6dc9357SAndroid Build Coastguard Worker 
399*f6dc9357SAndroid Build Coastguard Worker     {
400*f6dc9357SAndroid Build Coastguard Worker       const size_t baseLen = wcslen(link);
401*f6dc9357SAndroid Build Coastguard Worker       unsigned k;
402*f6dc9357SAndroid Build Coastguard Worker       BoolInt needDelete = False;
403*f6dc9357SAndroid Build Coastguard Worker 
404*f6dc9357SAndroid Build Coastguard Worker       for (k = 0; k < 2; k++)
405*f6dc9357SAndroid Build Coastguard Worker       {
406*f6dc9357SAndroid Build Coastguard Worker         CpyAscii(link + baseLen, k == 0 ?
407*f6dc9357SAndroid Build Coastguard Worker             "7-Zip File Manager.lnk" :
408*f6dc9357SAndroid Build Coastguard Worker             "7-Zip Help.lnk");
409*f6dc9357SAndroid Build Coastguard Worker         wcscpy(destPath, path);
410*f6dc9357SAndroid Build Coastguard Worker         CatAscii(destPath, k == 0 ?
411*f6dc9357SAndroid Build Coastguard Worker             "7zFM.exe" :
412*f6dc9357SAndroid Build Coastguard Worker             "7-zip.chm");
413*f6dc9357SAndroid Build Coastguard Worker 
414*f6dc9357SAndroid Build Coastguard Worker         if (CreateShellLink(link, destPath) == S_OK)
415*f6dc9357SAndroid Build Coastguard Worker         {
416*f6dc9357SAndroid Build Coastguard Worker           needDelete = True;
417*f6dc9357SAndroid Build Coastguard Worker           DeleteFileW(link);
418*f6dc9357SAndroid Build Coastguard Worker         }
419*f6dc9357SAndroid Build Coastguard Worker       }
420*f6dc9357SAndroid Build Coastguard Worker 
421*f6dc9357SAndroid Build Coastguard Worker       if (needDelete)
422*f6dc9357SAndroid Build Coastguard Worker       {
423*f6dc9357SAndroid Build Coastguard Worker         link[baseLen] = 0;
424*f6dc9357SAndroid Build Coastguard Worker         RemoveDirectoryW(link);
425*f6dc9357SAndroid Build Coastguard Worker       }
426*f6dc9357SAndroid Build Coastguard Worker     }
427*f6dc9357SAndroid Build Coastguard Worker   }
428*f6dc9357SAndroid Build Coastguard Worker 
429*f6dc9357SAndroid Build Coastguard Worker   #endif
430*f6dc9357SAndroid Build Coastguard Worker }
431*f6dc9357SAndroid Build Coastguard Worker 
432*f6dc9357SAndroid Build Coastguard Worker 
433*f6dc9357SAndroid Build Coastguard Worker static LPCSTR const k_ShellEx_Items[] =
434*f6dc9357SAndroid Build Coastguard Worker {
435*f6dc9357SAndroid Build Coastguard Worker     "*\\shellex\\ContextMenuHandlers"
436*f6dc9357SAndroid Build Coastguard Worker   , "Directory\\shellex\\ContextMenuHandlers"
437*f6dc9357SAndroid Build Coastguard Worker   , "Folder\\shellex\\ContextMenuHandlers"
438*f6dc9357SAndroid Build Coastguard Worker   , "Directory\\shellex\\DragDropHandlers"
439*f6dc9357SAndroid Build Coastguard Worker   , "Drive\\shellex\\DragDropHandlers"
440*f6dc9357SAndroid Build Coastguard Worker };
441*f6dc9357SAndroid Build Coastguard Worker 
442*f6dc9357SAndroid Build Coastguard Worker static LPCWSTR const k_Shell_Approved = L"Software\\Microsoft\\Windows\\CurrentVersion\\Shell Extensions\\Approved";
443*f6dc9357SAndroid Build Coastguard Worker 
444*f6dc9357SAndroid Build Coastguard Worker static LPCWSTR const k_AppPaths_7zFm = L"Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\7zFM.exe";
445*f6dc9357SAndroid Build Coastguard Worker #define k_REG_Uninstall L"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\"
446*f6dc9357SAndroid Build Coastguard Worker static LPCWSTR const k_Uninstall_7zip = k_REG_Uninstall L"7-Zip";
447*f6dc9357SAndroid Build Coastguard Worker 
448*f6dc9357SAndroid Build Coastguard Worker 
RemoveQuotes(wchar_t * s)449*f6dc9357SAndroid Build Coastguard Worker static void RemoveQuotes(wchar_t *s)
450*f6dc9357SAndroid Build Coastguard Worker {
451*f6dc9357SAndroid Build Coastguard Worker   const size_t len = wcslen(s);
452*f6dc9357SAndroid Build Coastguard Worker   size_t i;
453*f6dc9357SAndroid Build Coastguard Worker   if (len == 0 || s[0] != '\"' || s[len - 1] != '\"')
454*f6dc9357SAndroid Build Coastguard Worker     return;
455*f6dc9357SAndroid Build Coastguard Worker   for (i = 0; i < len; i++)
456*f6dc9357SAndroid Build Coastguard Worker     s[i] = s[i + 1];
457*f6dc9357SAndroid Build Coastguard Worker   s[len - 2] = 0;
458*f6dc9357SAndroid Build Coastguard Worker }
459*f6dc9357SAndroid Build Coastguard Worker 
AreEqual_Path_PrefixName(const wchar_t * s,const wchar_t * prefix,const wchar_t * name)460*f6dc9357SAndroid Build Coastguard Worker static BoolInt AreEqual_Path_PrefixName(const wchar_t *s, const wchar_t *prefix, const wchar_t *name)
461*f6dc9357SAndroid Build Coastguard Worker {
462*f6dc9357SAndroid Build Coastguard Worker   if (!IsString1PrefixedByString2_NoCase(s, prefix))
463*f6dc9357SAndroid Build Coastguard Worker     return False;
464*f6dc9357SAndroid Build Coastguard Worker   return AreStringsEqual_NoCase(s + wcslen(prefix), name);
465*f6dc9357SAndroid Build Coastguard Worker }
466*f6dc9357SAndroid Build Coastguard Worker 
WriteCLSID(void)467*f6dc9357SAndroid Build Coastguard Worker static void WriteCLSID(void)
468*f6dc9357SAndroid Build Coastguard Worker {
469*f6dc9357SAndroid Build Coastguard Worker   WCHAR s[MAX_PATH + 30];
470*f6dc9357SAndroid Build Coastguard Worker 
471*f6dc9357SAndroid Build Coastguard Worker   if (MyRegistry_QueryString2(HKEY_CLASSES_ROOT, k_Reg_CLSID_7zip_Inproc, NULL, s))
472*f6dc9357SAndroid Build Coastguard Worker   {
473*f6dc9357SAndroid Build Coastguard Worker     if (AreEqual_Path_PrefixName(s, path, L"7-zip.dll"))
474*f6dc9357SAndroid Build Coastguard Worker     {
475*f6dc9357SAndroid Build Coastguard Worker       {
476*f6dc9357SAndroid Build Coastguard Worker         const LONG res = MyRegistry_DeleteKey(HKEY_CLASSES_ROOT, k_Reg_CLSID_7zip_Inproc);
477*f6dc9357SAndroid Build Coastguard Worker         if (res == ERROR_SUCCESS)
478*f6dc9357SAndroid Build Coastguard Worker           MyRegistry_DeleteKey(HKEY_CLASSES_ROOT, k_Reg_CLSID_7zip);
479*f6dc9357SAndroid Build Coastguard Worker       }
480*f6dc9357SAndroid Build Coastguard Worker 
481*f6dc9357SAndroid Build Coastguard Worker       {
482*f6dc9357SAndroid Build Coastguard Worker         unsigned i;
483*f6dc9357SAndroid Build Coastguard Worker         for (i = 0; i < Z7_ARRAY_SIZE(k_ShellEx_Items); i++)
484*f6dc9357SAndroid Build Coastguard Worker         {
485*f6dc9357SAndroid Build Coastguard Worker           WCHAR destPath[MAX_PATH];
486*f6dc9357SAndroid Build Coastguard Worker           CpyAscii(destPath, k_ShellEx_Items[i]);
487*f6dc9357SAndroid Build Coastguard Worker           CatAscii(destPath, "\\7-Zip");
488*f6dc9357SAndroid Build Coastguard Worker 
489*f6dc9357SAndroid Build Coastguard Worker           MyRegistry_DeleteKey(HKEY_CLASSES_ROOT, destPath);
490*f6dc9357SAndroid Build Coastguard Worker         }
491*f6dc9357SAndroid Build Coastguard Worker       }
492*f6dc9357SAndroid Build Coastguard Worker 
493*f6dc9357SAndroid Build Coastguard Worker       {
494*f6dc9357SAndroid Build Coastguard Worker         HKEY destKey = 0;
495*f6dc9357SAndroid Build Coastguard Worker         const LONG res = MyRegistry_OpenKey_ReadWrite(HKEY_LOCAL_MACHINE, k_Shell_Approved, &destKey);
496*f6dc9357SAndroid Build Coastguard Worker         if (res == ERROR_SUCCESS)
497*f6dc9357SAndroid Build Coastguard Worker         {
498*f6dc9357SAndroid Build Coastguard Worker           RegDeleteValueW(destKey, k_7zip_CLSID);
499*f6dc9357SAndroid Build Coastguard Worker           /* res = */ RegCloseKey(destKey);
500*f6dc9357SAndroid Build Coastguard Worker         }
501*f6dc9357SAndroid Build Coastguard Worker       }
502*f6dc9357SAndroid Build Coastguard Worker     }
503*f6dc9357SAndroid Build Coastguard Worker   }
504*f6dc9357SAndroid Build Coastguard Worker 
505*f6dc9357SAndroid Build Coastguard Worker 
506*f6dc9357SAndroid Build Coastguard Worker   #ifdef USE_7ZIP_32_DLL
507*f6dc9357SAndroid Build Coastguard Worker 
508*f6dc9357SAndroid Build Coastguard Worker   if (MyRegistry_QueryString2_32(HKEY_CLASSES_ROOT, k_Reg_CLSID_7zip_Inproc, NULL, s))
509*f6dc9357SAndroid Build Coastguard Worker   {
510*f6dc9357SAndroid Build Coastguard Worker     if (AreEqual_Path_PrefixName(s, path, L"7-zip32.dll"))
511*f6dc9357SAndroid Build Coastguard Worker     {
512*f6dc9357SAndroid Build Coastguard Worker       {
513*f6dc9357SAndroid Build Coastguard Worker         const LONG res = MyRegistry_DeleteKey_32(HKEY_CLASSES_ROOT, k_Reg_CLSID_7zip_Inproc);
514*f6dc9357SAndroid Build Coastguard Worker         if (res == ERROR_SUCCESS)
515*f6dc9357SAndroid Build Coastguard Worker           MyRegistry_DeleteKey_32(HKEY_CLASSES_ROOT, k_Reg_CLSID_7zip);
516*f6dc9357SAndroid Build Coastguard Worker       }
517*f6dc9357SAndroid Build Coastguard Worker 
518*f6dc9357SAndroid Build Coastguard Worker       {
519*f6dc9357SAndroid Build Coastguard Worker         unsigned i;
520*f6dc9357SAndroid Build Coastguard Worker         for (i = 0; i < Z7_ARRAY_SIZE(k_ShellEx_Items); i++)
521*f6dc9357SAndroid Build Coastguard Worker         {
522*f6dc9357SAndroid Build Coastguard Worker           WCHAR destPath[MAX_PATH];
523*f6dc9357SAndroid Build Coastguard Worker           CpyAscii(destPath, k_ShellEx_Items[i]);
524*f6dc9357SAndroid Build Coastguard Worker           CatAscii(destPath, "\\7-Zip");
525*f6dc9357SAndroid Build Coastguard Worker 
526*f6dc9357SAndroid Build Coastguard Worker           MyRegistry_DeleteKey_32(HKEY_CLASSES_ROOT, destPath);
527*f6dc9357SAndroid Build Coastguard Worker         }
528*f6dc9357SAndroid Build Coastguard Worker       }
529*f6dc9357SAndroid Build Coastguard Worker 
530*f6dc9357SAndroid Build Coastguard Worker       {
531*f6dc9357SAndroid Build Coastguard Worker         HKEY destKey = 0;
532*f6dc9357SAndroid Build Coastguard Worker         const LONG res = MyRegistry_OpenKey_ReadWrite_32(HKEY_LOCAL_MACHINE, k_Shell_Approved, &destKey);
533*f6dc9357SAndroid Build Coastguard Worker         if (res == ERROR_SUCCESS)
534*f6dc9357SAndroid Build Coastguard Worker         {
535*f6dc9357SAndroid Build Coastguard Worker           RegDeleteValueW(destKey, k_7zip_CLSID);
536*f6dc9357SAndroid Build Coastguard Worker           /* res = */ RegCloseKey(destKey);
537*f6dc9357SAndroid Build Coastguard Worker         }
538*f6dc9357SAndroid Build Coastguard Worker       }
539*f6dc9357SAndroid Build Coastguard Worker     }
540*f6dc9357SAndroid Build Coastguard Worker   }
541*f6dc9357SAndroid Build Coastguard Worker 
542*f6dc9357SAndroid Build Coastguard Worker   #endif
543*f6dc9357SAndroid Build Coastguard Worker 
544*f6dc9357SAndroid Build Coastguard Worker 
545*f6dc9357SAndroid Build Coastguard Worker   if (MyRegistry_QueryString2(HKEY_LOCAL_MACHINE, k_AppPaths_7zFm, NULL, s))
546*f6dc9357SAndroid Build Coastguard Worker   {
547*f6dc9357SAndroid Build Coastguard Worker     // RemoveQuotes(s);
548*f6dc9357SAndroid Build Coastguard Worker     if (AreEqual_Path_PrefixName(s, path, L"7zFM.exe"))
549*f6dc9357SAndroid Build Coastguard Worker       MyRegistry_DeleteKey(HKEY_LOCAL_MACHINE, k_AppPaths_7zFm);
550*f6dc9357SAndroid Build Coastguard Worker   }
551*f6dc9357SAndroid Build Coastguard Worker 
552*f6dc9357SAndroid Build Coastguard Worker   if (MyRegistry_QueryString2(HKEY_LOCAL_MACHINE, k_Uninstall_7zip, L"UninstallString", s))
553*f6dc9357SAndroid Build Coastguard Worker   {
554*f6dc9357SAndroid Build Coastguard Worker     RemoveQuotes(s);
555*f6dc9357SAndroid Build Coastguard Worker     if (AreEqual_Path_PrefixName(s, path, kUninstallExe))
556*f6dc9357SAndroid Build Coastguard Worker       MyRegistry_DeleteKey(HKEY_LOCAL_MACHINE, k_Uninstall_7zip);
557*f6dc9357SAndroid Build Coastguard Worker   }
558*f6dc9357SAndroid Build Coastguard Worker }
559*f6dc9357SAndroid Build Coastguard Worker 
560*f6dc9357SAndroid Build Coastguard Worker 
GetCmdParam(const wchar_t * s)561*f6dc9357SAndroid Build Coastguard Worker static const wchar_t *GetCmdParam(const wchar_t *s)
562*f6dc9357SAndroid Build Coastguard Worker {
563*f6dc9357SAndroid Build Coastguard Worker   unsigned pos = 0;
564*f6dc9357SAndroid Build Coastguard Worker   BoolInt quoteMode = False;
565*f6dc9357SAndroid Build Coastguard Worker   for (;; s++)
566*f6dc9357SAndroid Build Coastguard Worker   {
567*f6dc9357SAndroid Build Coastguard Worker     const wchar_t c = *s;
568*f6dc9357SAndroid Build Coastguard Worker     if (c == 0 || (c == L' ' && !quoteMode))
569*f6dc9357SAndroid Build Coastguard Worker       break;
570*f6dc9357SAndroid Build Coastguard Worker     if (c == L'\"')
571*f6dc9357SAndroid Build Coastguard Worker     {
572*f6dc9357SAndroid Build Coastguard Worker       quoteMode = !quoteMode;
573*f6dc9357SAndroid Build Coastguard Worker       continue;
574*f6dc9357SAndroid Build Coastguard Worker     }
575*f6dc9357SAndroid Build Coastguard Worker     if (pos >= Z7_ARRAY_SIZE(cmd) - 1)
576*f6dc9357SAndroid Build Coastguard Worker       exit(1);
577*f6dc9357SAndroid Build Coastguard Worker     cmd[pos++] = c;
578*f6dc9357SAndroid Build Coastguard Worker   }
579*f6dc9357SAndroid Build Coastguard Worker   cmd[pos] = 0;
580*f6dc9357SAndroid Build Coastguard Worker   return s;
581*f6dc9357SAndroid Build Coastguard Worker }
582*f6dc9357SAndroid Build Coastguard Worker 
583*f6dc9357SAndroid Build Coastguard Worker /*
584*f6dc9357SAndroid Build Coastguard Worker static void RemoveQuotes(wchar_t *s)
585*f6dc9357SAndroid Build Coastguard Worker {
586*f6dc9357SAndroid Build Coastguard Worker   const wchar_t *src = s;
587*f6dc9357SAndroid Build Coastguard Worker   for (;;)
588*f6dc9357SAndroid Build Coastguard Worker   {
589*f6dc9357SAndroid Build Coastguard Worker     wchar_t c = *src++;
590*f6dc9357SAndroid Build Coastguard Worker     if (c == '\"')
591*f6dc9357SAndroid Build Coastguard Worker       continue;
592*f6dc9357SAndroid Build Coastguard Worker     *s++ = c;
593*f6dc9357SAndroid Build Coastguard Worker     if (c == 0)
594*f6dc9357SAndroid Build Coastguard Worker       return;
595*f6dc9357SAndroid Build Coastguard Worker   }
596*f6dc9357SAndroid Build Coastguard Worker }
597*f6dc9357SAndroid Build Coastguard Worker */
598*f6dc9357SAndroid Build Coastguard Worker 
DoesFileOrDirExist(void)599*f6dc9357SAndroid Build Coastguard Worker static BoolInt DoesFileOrDirExist(void)
600*f6dc9357SAndroid Build Coastguard Worker {
601*f6dc9357SAndroid Build Coastguard Worker   return (GetFileAttributesW(path) != INVALID_FILE_ATTRIBUTES);
602*f6dc9357SAndroid Build Coastguard Worker }
603*f6dc9357SAndroid Build Coastguard Worker 
RemoveFileAfterReboot2(const WCHAR * s)604*f6dc9357SAndroid Build Coastguard Worker static BOOL RemoveFileAfterReboot2(const WCHAR *s)
605*f6dc9357SAndroid Build Coastguard Worker {
606*f6dc9357SAndroid Build Coastguard Worker   #ifndef UNDER_CE
607*f6dc9357SAndroid Build Coastguard Worker   return MoveFileExW(s, NULL, MOVEFILE_DELAY_UNTIL_REBOOT);
608*f6dc9357SAndroid Build Coastguard Worker   #else
609*f6dc9357SAndroid Build Coastguard Worker   UNUSED_VAR(s)
610*f6dc9357SAndroid Build Coastguard Worker   return TRUE;
611*f6dc9357SAndroid Build Coastguard Worker   #endif
612*f6dc9357SAndroid Build Coastguard Worker }
613*f6dc9357SAndroid Build Coastguard Worker 
RemoveFileAfterReboot(void)614*f6dc9357SAndroid Build Coastguard Worker static BOOL RemoveFileAfterReboot(void)
615*f6dc9357SAndroid Build Coastguard Worker {
616*f6dc9357SAndroid Build Coastguard Worker   return RemoveFileAfterReboot2(path);
617*f6dc9357SAndroid Build Coastguard Worker }
618*f6dc9357SAndroid Build Coastguard Worker 
619*f6dc9357SAndroid Build Coastguard Worker // #define IS_LIMIT_CHAR(c) (c == 0 || c == ' ')
620*f6dc9357SAndroid Build Coastguard Worker 
IsThereSpace(const wchar_t * s)621*f6dc9357SAndroid Build Coastguard Worker static BoolInt IsThereSpace(const wchar_t *s)
622*f6dc9357SAndroid Build Coastguard Worker {
623*f6dc9357SAndroid Build Coastguard Worker   for (;;)
624*f6dc9357SAndroid Build Coastguard Worker   {
625*f6dc9357SAndroid Build Coastguard Worker     const wchar_t c = *s++;
626*f6dc9357SAndroid Build Coastguard Worker     if (c == 0)
627*f6dc9357SAndroid Build Coastguard Worker       return False;
628*f6dc9357SAndroid Build Coastguard Worker     if (c == ' ')
629*f6dc9357SAndroid Build Coastguard Worker       return True;
630*f6dc9357SAndroid Build Coastguard Worker   }
631*f6dc9357SAndroid Build Coastguard Worker }
632*f6dc9357SAndroid Build Coastguard Worker 
AddPathParam(wchar_t * dest,const wchar_t * src)633*f6dc9357SAndroid Build Coastguard Worker static void AddPathParam(wchar_t *dest, const wchar_t *src)
634*f6dc9357SAndroid Build Coastguard Worker {
635*f6dc9357SAndroid Build Coastguard Worker   const BoolInt needQuote = IsThereSpace(src);
636*f6dc9357SAndroid Build Coastguard Worker   if (needQuote)
637*f6dc9357SAndroid Build Coastguard Worker     CatAscii(dest, "\"");
638*f6dc9357SAndroid Build Coastguard Worker   wcscat(dest, src);
639*f6dc9357SAndroid Build Coastguard Worker   if (needQuote)
640*f6dc9357SAndroid Build Coastguard Worker     CatAscii(dest, "\"");
641*f6dc9357SAndroid Build Coastguard Worker }
642*f6dc9357SAndroid Build Coastguard Worker 
643*f6dc9357SAndroid Build Coastguard Worker 
644*f6dc9357SAndroid Build Coastguard Worker 
GetErrorMessage(DWORD errorCode,WCHAR * message)645*f6dc9357SAndroid Build Coastguard Worker static BoolInt GetErrorMessage(DWORD errorCode, WCHAR *message)
646*f6dc9357SAndroid Build Coastguard Worker {
647*f6dc9357SAndroid Build Coastguard Worker   LPWSTR msgBuf;
648*f6dc9357SAndroid Build Coastguard Worker   if (FormatMessageW(
649*f6dc9357SAndroid Build Coastguard Worker           FORMAT_MESSAGE_ALLOCATE_BUFFER
650*f6dc9357SAndroid Build Coastguard Worker         | FORMAT_MESSAGE_FROM_SYSTEM
651*f6dc9357SAndroid Build Coastguard Worker         | FORMAT_MESSAGE_IGNORE_INSERTS,
652*f6dc9357SAndroid Build Coastguard Worker         NULL, errorCode, 0, (LPWSTR) &msgBuf, 0, NULL) == 0)
653*f6dc9357SAndroid Build Coastguard Worker     return False;
654*f6dc9357SAndroid Build Coastguard Worker   wcscpy(message, msgBuf);
655*f6dc9357SAndroid Build Coastguard Worker   LocalFree(msgBuf);
656*f6dc9357SAndroid Build Coastguard Worker   return True;
657*f6dc9357SAndroid Build Coastguard Worker }
658*f6dc9357SAndroid Build Coastguard Worker 
RemoveDir(void)659*f6dc9357SAndroid Build Coastguard Worker static BOOL RemoveDir(void)
660*f6dc9357SAndroid Build Coastguard Worker {
661*f6dc9357SAndroid Build Coastguard Worker   const DWORD attrib = GetFileAttributesW(path);
662*f6dc9357SAndroid Build Coastguard Worker   if (attrib == INVALID_FILE_ATTRIBUTES)
663*f6dc9357SAndroid Build Coastguard Worker     return TRUE;
664*f6dc9357SAndroid Build Coastguard Worker   if (RemoveDirectoryW(path))
665*f6dc9357SAndroid Build Coastguard Worker     return TRUE;
666*f6dc9357SAndroid Build Coastguard Worker   return RemoveFileAfterReboot();
667*f6dc9357SAndroid Build Coastguard Worker }
668*f6dc9357SAndroid Build Coastguard Worker 
669*f6dc9357SAndroid Build Coastguard Worker 
670*f6dc9357SAndroid Build Coastguard Worker 
671*f6dc9357SAndroid Build Coastguard Worker 
672*f6dc9357SAndroid Build Coastguard Worker 
673*f6dc9357SAndroid Build Coastguard Worker #define k_Lang "Lang"
674*f6dc9357SAndroid Build Coastguard Worker 
675*f6dc9357SAndroid Build Coastguard Worker // NUM_LANG_TXT_FILES files are placed before en.ttt
676*f6dc9357SAndroid Build Coastguard Worker #define NUM_LANG_TXT_FILES 92
677*f6dc9357SAndroid Build Coastguard Worker 
678*f6dc9357SAndroid Build Coastguard Worker #ifdef USE_7ZIP_32_DLL
679*f6dc9357SAndroid Build Coastguard Worker   #define NUM_EXTRA_FILES_64BIT 1
680*f6dc9357SAndroid Build Coastguard Worker #else
681*f6dc9357SAndroid Build Coastguard Worker   #define NUM_EXTRA_FILES_64BIT 0
682*f6dc9357SAndroid Build Coastguard Worker #endif
683*f6dc9357SAndroid Build Coastguard Worker 
684*f6dc9357SAndroid Build Coastguard Worker #define NUM_FILES (NUM_LANG_TXT_FILES + 1 + 13 + NUM_EXTRA_FILES_64BIT)
685*f6dc9357SAndroid Build Coastguard Worker 
686*f6dc9357SAndroid Build Coastguard Worker static const char * const k_Names =
687*f6dc9357SAndroid Build Coastguard Worker   "af an ar ast az ba be bg bn br ca co cs cy da de el eo es et eu ext"
688*f6dc9357SAndroid Build Coastguard Worker   " fa fi fr fur fy ga gl gu he hi hr hu hy id io is it ja ka kaa kab kk ko ku ku-ckb ky"
689*f6dc9357SAndroid Build Coastguard Worker   " lij lt lv mk mn mng mng2 mr ms nb ne nl nn pa-in pl ps pt pt-br ro ru"
690*f6dc9357SAndroid Build Coastguard Worker   " sa si sk sl sq sr-spc sr-spl sv sw ta tg th tk tr tt ug uk uz uz-cyrl va vi yo zh-cn zh-tw"
691*f6dc9357SAndroid Build Coastguard Worker   " en.ttt"
692*f6dc9357SAndroid Build Coastguard Worker   " descript.ion"
693*f6dc9357SAndroid Build Coastguard Worker   " History.txt"
694*f6dc9357SAndroid Build Coastguard Worker   " License.txt"
695*f6dc9357SAndroid Build Coastguard Worker   " readme.txt"
696*f6dc9357SAndroid Build Coastguard Worker   " 7-zip.chm"
697*f6dc9357SAndroid Build Coastguard Worker   " 7z.sfx"
698*f6dc9357SAndroid Build Coastguard Worker   " 7zCon.sfx"
699*f6dc9357SAndroid Build Coastguard Worker   " 7z.exe"
700*f6dc9357SAndroid Build Coastguard Worker   " 7zG.exe"
701*f6dc9357SAndroid Build Coastguard Worker   " 7z.dll"
702*f6dc9357SAndroid Build Coastguard Worker   " 7zFM.exe"
703*f6dc9357SAndroid Build Coastguard Worker   #ifdef USE_7ZIP_32_DLL
704*f6dc9357SAndroid Build Coastguard Worker   " 7-zip32.dll"
705*f6dc9357SAndroid Build Coastguard Worker   #endif
706*f6dc9357SAndroid Build Coastguard Worker   " 7-zip.dll"
707*f6dc9357SAndroid Build Coastguard Worker   " Uninstall.exe";
708*f6dc9357SAndroid Build Coastguard Worker 
709*f6dc9357SAndroid Build Coastguard Worker 
710*f6dc9357SAndroid Build Coastguard Worker 
Install(void)711*f6dc9357SAndroid Build Coastguard Worker static int Install(void)
712*f6dc9357SAndroid Build Coastguard Worker {
713*f6dc9357SAndroid Build Coastguard Worker   SRes res = SZ_OK;
714*f6dc9357SAndroid Build Coastguard Worker   WRes winRes = 0;
715*f6dc9357SAndroid Build Coastguard Worker 
716*f6dc9357SAndroid Build Coastguard Worker   // BoolInt needReboot = False;
717*f6dc9357SAndroid Build Coastguard Worker   const size_t pathLen = wcslen(path);
718*f6dc9357SAndroid Build Coastguard Worker 
719*f6dc9357SAndroid Build Coastguard Worker   if (!g_SilentMode)
720*f6dc9357SAndroid Build Coastguard Worker   {
721*f6dc9357SAndroid Build Coastguard Worker     ShowWindow(g_Progress_HWND, SW_SHOW);
722*f6dc9357SAndroid Build Coastguard Worker     ShowWindow(g_InfoLine_HWND, SW_SHOW);
723*f6dc9357SAndroid Build Coastguard Worker     SendMessage(g_Progress_HWND, PBM_SETRANGE32, 0, NUM_FILES);
724*f6dc9357SAndroid Build Coastguard Worker   }
725*f6dc9357SAndroid Build Coastguard Worker 
726*f6dc9357SAndroid Build Coastguard Worker   {
727*f6dc9357SAndroid Build Coastguard Worker     unsigned i;
728*f6dc9357SAndroid Build Coastguard Worker     const char *curName = k_Names;
729*f6dc9357SAndroid Build Coastguard Worker 
730*f6dc9357SAndroid Build Coastguard Worker     for (i = 0; *curName != 0; i++)
731*f6dc9357SAndroid Build Coastguard Worker     {
732*f6dc9357SAndroid Build Coastguard Worker       WCHAR *temp;
733*f6dc9357SAndroid Build Coastguard Worker 
734*f6dc9357SAndroid Build Coastguard Worker       if (!g_SilentMode)
735*f6dc9357SAndroid Build Coastguard Worker       {
736*f6dc9357SAndroid Build Coastguard Worker         MSG msg;
737*f6dc9357SAndroid Build Coastguard Worker 
738*f6dc9357SAndroid Build Coastguard Worker         // g_HWND
739*f6dc9357SAndroid Build Coastguard Worker         while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
740*f6dc9357SAndroid Build Coastguard Worker         {
741*f6dc9357SAndroid Build Coastguard Worker           if (!IsDialogMessage(g_HWND, &msg))
742*f6dc9357SAndroid Build Coastguard Worker           {
743*f6dc9357SAndroid Build Coastguard Worker             TranslateMessage(&msg);
744*f6dc9357SAndroid Build Coastguard Worker             DispatchMessage(&msg);
745*f6dc9357SAndroid Build Coastguard Worker           }
746*f6dc9357SAndroid Build Coastguard Worker           if (!g_HWND)
747*f6dc9357SAndroid Build Coastguard Worker             return 1;
748*f6dc9357SAndroid Build Coastguard Worker         }
749*f6dc9357SAndroid Build Coastguard Worker 
750*f6dc9357SAndroid Build Coastguard Worker         // Sleep(1);
751*f6dc9357SAndroid Build Coastguard Worker         SendMessage(g_Progress_HWND, PBM_SETPOS, i, 0);
752*f6dc9357SAndroid Build Coastguard Worker       }
753*f6dc9357SAndroid Build Coastguard Worker 
754*f6dc9357SAndroid Build Coastguard Worker       path[pathLen] = 0;
755*f6dc9357SAndroid Build Coastguard Worker       temp = path + pathLen;
756*f6dc9357SAndroid Build Coastguard Worker 
757*f6dc9357SAndroid Build Coastguard Worker       if (i <= NUM_LANG_TXT_FILES)
758*f6dc9357SAndroid Build Coastguard Worker         CpyAscii(temp, k_Lang "\\");
759*f6dc9357SAndroid Build Coastguard Worker 
760*f6dc9357SAndroid Build Coastguard Worker       {
761*f6dc9357SAndroid Build Coastguard Worker         WCHAR *dest = temp + wcslen(temp);
762*f6dc9357SAndroid Build Coastguard Worker 
763*f6dc9357SAndroid Build Coastguard Worker         for (;;)
764*f6dc9357SAndroid Build Coastguard Worker         {
765*f6dc9357SAndroid Build Coastguard Worker           const char c = *curName;
766*f6dc9357SAndroid Build Coastguard Worker           if (c == 0)
767*f6dc9357SAndroid Build Coastguard Worker             break;
768*f6dc9357SAndroid Build Coastguard Worker           curName++;
769*f6dc9357SAndroid Build Coastguard Worker           if (c == ' ')
770*f6dc9357SAndroid Build Coastguard Worker             break;
771*f6dc9357SAndroid Build Coastguard Worker           *dest++ = (Byte)c;
772*f6dc9357SAndroid Build Coastguard Worker         }
773*f6dc9357SAndroid Build Coastguard Worker 
774*f6dc9357SAndroid Build Coastguard Worker         *dest = 0;
775*f6dc9357SAndroid Build Coastguard Worker       }
776*f6dc9357SAndroid Build Coastguard Worker 
777*f6dc9357SAndroid Build Coastguard Worker       if (i < NUM_LANG_TXT_FILES)
778*f6dc9357SAndroid Build Coastguard Worker         CatAscii(temp, ".txt");
779*f6dc9357SAndroid Build Coastguard Worker 
780*f6dc9357SAndroid Build Coastguard Worker       if (!g_SilentMode)
781*f6dc9357SAndroid Build Coastguard Worker         SetWindowTextW(g_InfoLine_HWND, temp);
782*f6dc9357SAndroid Build Coastguard Worker 
783*f6dc9357SAndroid Build Coastguard Worker       {
784*f6dc9357SAndroid Build Coastguard Worker         const DWORD attrib = GetFileAttributesW(path);
785*f6dc9357SAndroid Build Coastguard Worker         if (attrib == INVALID_FILE_ATTRIBUTES)
786*f6dc9357SAndroid Build Coastguard Worker           continue;
787*f6dc9357SAndroid Build Coastguard Worker         if (attrib & FILE_ATTRIBUTE_READONLY)
788*f6dc9357SAndroid Build Coastguard Worker           SetFileAttributesW(path, 0);
789*f6dc9357SAndroid Build Coastguard Worker         if (!DeleteFileW(path))
790*f6dc9357SAndroid Build Coastguard Worker         {
791*f6dc9357SAndroid Build Coastguard Worker           if (!RemoveFileAfterReboot())
792*f6dc9357SAndroid Build Coastguard Worker           {
793*f6dc9357SAndroid Build Coastguard Worker             winRes = GetLastError();
794*f6dc9357SAndroid Build Coastguard Worker           }
795*f6dc9357SAndroid Build Coastguard Worker           /*
796*f6dc9357SAndroid Build Coastguard Worker           else
797*f6dc9357SAndroid Build Coastguard Worker             needReboot = True;
798*f6dc9357SAndroid Build Coastguard Worker           */
799*f6dc9357SAndroid Build Coastguard Worker         }
800*f6dc9357SAndroid Build Coastguard Worker       }
801*f6dc9357SAndroid Build Coastguard Worker     }
802*f6dc9357SAndroid Build Coastguard Worker 
803*f6dc9357SAndroid Build Coastguard Worker     CpyAscii(path + pathLen, k_Lang);
804*f6dc9357SAndroid Build Coastguard Worker     RemoveDir();
805*f6dc9357SAndroid Build Coastguard Worker 
806*f6dc9357SAndroid Build Coastguard Worker     path[pathLen] = 0;
807*f6dc9357SAndroid Build Coastguard Worker     RemoveDir();
808*f6dc9357SAndroid Build Coastguard Worker 
809*f6dc9357SAndroid Build Coastguard Worker     if (!g_SilentMode)
810*f6dc9357SAndroid Build Coastguard Worker       SendMessage(g_Progress_HWND, PBM_SETPOS, i, 0);
811*f6dc9357SAndroid Build Coastguard Worker 
812*f6dc9357SAndroid Build Coastguard Worker     if (*curName == 0)
813*f6dc9357SAndroid Build Coastguard Worker     {
814*f6dc9357SAndroid Build Coastguard Worker       SetRegKey_Path();
815*f6dc9357SAndroid Build Coastguard Worker       WriteCLSID();
816*f6dc9357SAndroid Build Coastguard Worker       SetShellProgramsGroup(g_HWND);
817*f6dc9357SAndroid Build Coastguard Worker       if (!g_SilentMode)
818*f6dc9357SAndroid Build Coastguard Worker         SetWindowTextW(g_InfoLine_HWND, k_7zip_with_Ver L" is uninstalled");
819*f6dc9357SAndroid Build Coastguard Worker     }
820*f6dc9357SAndroid Build Coastguard Worker   }
821*f6dc9357SAndroid Build Coastguard Worker 
822*f6dc9357SAndroid Build Coastguard Worker   if (winRes != 0)
823*f6dc9357SAndroid Build Coastguard Worker     res = SZ_ERROR_FAIL;
824*f6dc9357SAndroid Build Coastguard Worker 
825*f6dc9357SAndroid Build Coastguard Worker   if (res == SZ_OK)
826*f6dc9357SAndroid Build Coastguard Worker   {
827*f6dc9357SAndroid Build Coastguard Worker     // if (!g_SilentMode && needReboot);
828*f6dc9357SAndroid Build Coastguard Worker     return 0;
829*f6dc9357SAndroid Build Coastguard Worker   }
830*f6dc9357SAndroid Build Coastguard Worker 
831*f6dc9357SAndroid Build Coastguard Worker   if (!g_SilentMode)
832*f6dc9357SAndroid Build Coastguard Worker   {
833*f6dc9357SAndroid Build Coastguard Worker     WCHAR m[MAX_PATH + 100];
834*f6dc9357SAndroid Build Coastguard Worker     m[0] = 0;
835*f6dc9357SAndroid Build Coastguard Worker     if (winRes == 0 || !GetErrorMessage(winRes, m))
836*f6dc9357SAndroid Build Coastguard Worker       CpyAscii(m, "ERROR");
837*f6dc9357SAndroid Build Coastguard Worker     PrintErrorMessage("System ERROR:", m);
838*f6dc9357SAndroid Build Coastguard Worker   }
839*f6dc9357SAndroid Build Coastguard Worker 
840*f6dc9357SAndroid Build Coastguard Worker   return 1;
841*f6dc9357SAndroid Build Coastguard Worker }
842*f6dc9357SAndroid Build Coastguard Worker 
843*f6dc9357SAndroid Build Coastguard Worker 
OnClose(void)844*f6dc9357SAndroid Build Coastguard Worker static void OnClose(void)
845*f6dc9357SAndroid Build Coastguard Worker {
846*f6dc9357SAndroid Build Coastguard Worker   if (g_Install_was_Pressed && !g_Finished)
847*f6dc9357SAndroid Build Coastguard Worker   {
848*f6dc9357SAndroid Build Coastguard Worker     if (MessageBoxW(g_HWND,
849*f6dc9357SAndroid Build Coastguard Worker         L"Do you want to cancel uninstallation?",
850*f6dc9357SAndroid Build Coastguard Worker         k_7zip_with_Ver_Uninstall,
851*f6dc9357SAndroid Build Coastguard Worker         MB_ICONQUESTION | MB_YESNO | MB_DEFBUTTON2) != IDYES)
852*f6dc9357SAndroid Build Coastguard Worker       return;
853*f6dc9357SAndroid Build Coastguard Worker   }
854*f6dc9357SAndroid Build Coastguard Worker   DestroyWindow(g_HWND);
855*f6dc9357SAndroid Build Coastguard Worker   g_HWND = NULL;
856*f6dc9357SAndroid Build Coastguard Worker }
857*f6dc9357SAndroid Build Coastguard Worker 
858*f6dc9357SAndroid Build Coastguard Worker static
859*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_OLD_WIN_SDK
860*f6dc9357SAndroid Build Coastguard Worker   BOOL
861*f6dc9357SAndroid Build Coastguard Worker #else
862*f6dc9357SAndroid Build Coastguard Worker   INT_PTR
863*f6dc9357SAndroid Build Coastguard Worker #endif
MyDlgProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)864*f6dc9357SAndroid Build Coastguard Worker CALLBACK MyDlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
865*f6dc9357SAndroid Build Coastguard Worker {
866*f6dc9357SAndroid Build Coastguard Worker   UNUSED_VAR(lParam)
867*f6dc9357SAndroid Build Coastguard Worker 
868*f6dc9357SAndroid Build Coastguard Worker   switch (message)
869*f6dc9357SAndroid Build Coastguard Worker   {
870*f6dc9357SAndroid Build Coastguard Worker     case WM_INITDIALOG:
871*f6dc9357SAndroid Build Coastguard Worker       g_Path_HWND = GetDlgItem(hwnd, IDE_EXTRACT_PATH);
872*f6dc9357SAndroid Build Coastguard Worker       g_InfoLine_HWND = GetDlgItem(hwnd, IDT_CUR_FILE);
873*f6dc9357SAndroid Build Coastguard Worker       g_Progress_HWND = GetDlgItem(hwnd, IDC_PROGRESS);
874*f6dc9357SAndroid Build Coastguard Worker 
875*f6dc9357SAndroid Build Coastguard Worker       SetWindowTextW(hwnd, k_7zip_with_Ver_Uninstall);
876*f6dc9357SAndroid Build Coastguard Worker       SetDlgItemTextW(hwnd, IDE_EXTRACT_PATH, path);
877*f6dc9357SAndroid Build Coastguard Worker 
878*f6dc9357SAndroid Build Coastguard Worker       ShowWindow(g_Progress_HWND, SW_HIDE);
879*f6dc9357SAndroid Build Coastguard Worker       ShowWindow(g_InfoLine_HWND, SW_HIDE);
880*f6dc9357SAndroid Build Coastguard Worker 
881*f6dc9357SAndroid Build Coastguard Worker       break;
882*f6dc9357SAndroid Build Coastguard Worker 
883*f6dc9357SAndroid Build Coastguard Worker     case WM_COMMAND:
884*f6dc9357SAndroid Build Coastguard Worker       switch (LOWORD(wParam))
885*f6dc9357SAndroid Build Coastguard Worker       {
886*f6dc9357SAndroid Build Coastguard Worker         case IDOK:
887*f6dc9357SAndroid Build Coastguard Worker         {
888*f6dc9357SAndroid Build Coastguard Worker           if (g_Finished)
889*f6dc9357SAndroid Build Coastguard Worker           {
890*f6dc9357SAndroid Build Coastguard Worker             OnClose();
891*f6dc9357SAndroid Build Coastguard Worker             break;
892*f6dc9357SAndroid Build Coastguard Worker           }
893*f6dc9357SAndroid Build Coastguard Worker           if (!g_Install_was_Pressed)
894*f6dc9357SAndroid Build Coastguard Worker           {
895*f6dc9357SAndroid Build Coastguard Worker             SendMessage(hwnd, WM_NEXTDLGCTL, (WPARAM)(void *)GetDlgItem(hwnd, IDCANCEL), TRUE);
896*f6dc9357SAndroid Build Coastguard Worker 
897*f6dc9357SAndroid Build Coastguard Worker             EnableWindow(g_Path_HWND, FALSE);
898*f6dc9357SAndroid Build Coastguard Worker             EnableWindow(GetDlgItem(hwnd, IDOK), FALSE);
899*f6dc9357SAndroid Build Coastguard Worker 
900*f6dc9357SAndroid Build Coastguard Worker             g_Install_was_Pressed = True;
901*f6dc9357SAndroid Build Coastguard Worker             return TRUE;
902*f6dc9357SAndroid Build Coastguard Worker           }
903*f6dc9357SAndroid Build Coastguard Worker           break;
904*f6dc9357SAndroid Build Coastguard Worker         }
905*f6dc9357SAndroid Build Coastguard Worker 
906*f6dc9357SAndroid Build Coastguard Worker         case IDCANCEL:
907*f6dc9357SAndroid Build Coastguard Worker         {
908*f6dc9357SAndroid Build Coastguard Worker           OnClose();
909*f6dc9357SAndroid Build Coastguard Worker           break;
910*f6dc9357SAndroid Build Coastguard Worker         }
911*f6dc9357SAndroid Build Coastguard Worker 
912*f6dc9357SAndroid Build Coastguard Worker         default: return FALSE;
913*f6dc9357SAndroid Build Coastguard Worker       }
914*f6dc9357SAndroid Build Coastguard Worker       break;
915*f6dc9357SAndroid Build Coastguard Worker 
916*f6dc9357SAndroid Build Coastguard Worker     case WM_CLOSE:
917*f6dc9357SAndroid Build Coastguard Worker       OnClose();
918*f6dc9357SAndroid Build Coastguard Worker       break;
919*f6dc9357SAndroid Build Coastguard Worker     /*
920*f6dc9357SAndroid Build Coastguard Worker     case WM_DESTROY:
921*f6dc9357SAndroid Build Coastguard Worker       PostQuitMessage(0);
922*f6dc9357SAndroid Build Coastguard Worker       return TRUE;
923*f6dc9357SAndroid Build Coastguard Worker     */
924*f6dc9357SAndroid Build Coastguard Worker     default:
925*f6dc9357SAndroid Build Coastguard Worker       return FALSE;
926*f6dc9357SAndroid Build Coastguard Worker   }
927*f6dc9357SAndroid Build Coastguard Worker 
928*f6dc9357SAndroid Build Coastguard Worker   return TRUE;
929*f6dc9357SAndroid Build Coastguard Worker }
930*f6dc9357SAndroid Build Coastguard Worker 
931*f6dc9357SAndroid Build Coastguard Worker 
WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPWSTR lpCmdLine,int nCmdShow)932*f6dc9357SAndroid Build Coastguard Worker int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
933*f6dc9357SAndroid Build Coastguard Worker     #ifdef UNDER_CE
934*f6dc9357SAndroid Build Coastguard Worker       LPWSTR
935*f6dc9357SAndroid Build Coastguard Worker     #else
936*f6dc9357SAndroid Build Coastguard Worker       LPSTR
937*f6dc9357SAndroid Build Coastguard Worker     #endif
938*f6dc9357SAndroid Build Coastguard Worker     lpCmdLine, int nCmdShow)
939*f6dc9357SAndroid Build Coastguard Worker {
940*f6dc9357SAndroid Build Coastguard Worker   const wchar_t *cmdParams;
941*f6dc9357SAndroid Build Coastguard Worker   BoolInt useTemp = True;
942*f6dc9357SAndroid Build Coastguard Worker 
943*f6dc9357SAndroid Build Coastguard Worker   UNUSED_VAR(hPrevInstance)
944*f6dc9357SAndroid Build Coastguard Worker   UNUSED_VAR(lpCmdLine)
945*f6dc9357SAndroid Build Coastguard Worker   UNUSED_VAR(nCmdShow)
946*f6dc9357SAndroid Build Coastguard Worker 
947*f6dc9357SAndroid Build Coastguard Worker #ifndef UNDER_CE
948*f6dc9357SAndroid Build Coastguard Worker   CoInitialize(NULL);
949*f6dc9357SAndroid Build Coastguard Worker #endif
950*f6dc9357SAndroid Build Coastguard Worker 
951*f6dc9357SAndroid Build Coastguard Worker #ifndef UNDER_CE
952*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_USE_DYN_RegDeleteKeyExW
953*f6dc9357SAndroid Build Coastguard Worker    func_RegDeleteKeyExW =
954*f6dc9357SAndroid Build Coastguard Worker   (Func_RegDeleteKeyExW) Z7_CAST_FUNC_C GetProcAddress(GetModuleHandleW(L"advapi32.dll"),
955*f6dc9357SAndroid Build Coastguard Worker        "RegDeleteKeyExW");
956*f6dc9357SAndroid Build Coastguard Worker #endif
957*f6dc9357SAndroid Build Coastguard Worker #endif
958*f6dc9357SAndroid Build Coastguard Worker 
959*f6dc9357SAndroid Build Coastguard Worker   {
960*f6dc9357SAndroid Build Coastguard Worker     const wchar_t *s = GetCommandLineW();
961*f6dc9357SAndroid Build Coastguard Worker 
962*f6dc9357SAndroid Build Coastguard Worker     #ifndef UNDER_CE
963*f6dc9357SAndroid Build Coastguard Worker     s = GetCmdParam(s);
964*f6dc9357SAndroid Build Coastguard Worker     #endif
965*f6dc9357SAndroid Build Coastguard Worker 
966*f6dc9357SAndroid Build Coastguard Worker     cmdParams = s;
967*f6dc9357SAndroid Build Coastguard Worker 
968*f6dc9357SAndroid Build Coastguard Worker     for (;;)
969*f6dc9357SAndroid Build Coastguard Worker     {
970*f6dc9357SAndroid Build Coastguard Worker       {
971*f6dc9357SAndroid Build Coastguard Worker         wchar_t c = *s;
972*f6dc9357SAndroid Build Coastguard Worker         if (c == 0)
973*f6dc9357SAndroid Build Coastguard Worker           break;
974*f6dc9357SAndroid Build Coastguard Worker         if (c == ' ')
975*f6dc9357SAndroid Build Coastguard Worker         {
976*f6dc9357SAndroid Build Coastguard Worker           s++;
977*f6dc9357SAndroid Build Coastguard Worker           continue;
978*f6dc9357SAndroid Build Coastguard Worker         }
979*f6dc9357SAndroid Build Coastguard Worker       }
980*f6dc9357SAndroid Build Coastguard Worker 
981*f6dc9357SAndroid Build Coastguard Worker       {
982*f6dc9357SAndroid Build Coastguard Worker         const wchar_t *s2 = GetCmdParam(s);
983*f6dc9357SAndroid Build Coastguard Worker         BoolInt error = True;
984*f6dc9357SAndroid Build Coastguard Worker         if (cmd[0] == '/')
985*f6dc9357SAndroid Build Coastguard Worker         {
986*f6dc9357SAndroid Build Coastguard Worker           if (cmd[1] == 'S')
987*f6dc9357SAndroid Build Coastguard Worker           {
988*f6dc9357SAndroid Build Coastguard Worker             if (cmd[2] == 0)
989*f6dc9357SAndroid Build Coastguard Worker             {
990*f6dc9357SAndroid Build Coastguard Worker               g_SilentMode = True;
991*f6dc9357SAndroid Build Coastguard Worker               error = False;
992*f6dc9357SAndroid Build Coastguard Worker             }
993*f6dc9357SAndroid Build Coastguard Worker           }
994*f6dc9357SAndroid Build Coastguard Worker           else if (cmd[1] == 'N')
995*f6dc9357SAndroid Build Coastguard Worker           {
996*f6dc9357SAndroid Build Coastguard Worker             if (cmd[2] == 0)
997*f6dc9357SAndroid Build Coastguard Worker             {
998*f6dc9357SAndroid Build Coastguard Worker               useTemp = False;
999*f6dc9357SAndroid Build Coastguard Worker               error = False;
1000*f6dc9357SAndroid Build Coastguard Worker             }
1001*f6dc9357SAndroid Build Coastguard Worker           }
1002*f6dc9357SAndroid Build Coastguard Worker           else if (cmd[1] == 'D' && cmd[2] == '=')
1003*f6dc9357SAndroid Build Coastguard Worker           {
1004*f6dc9357SAndroid Build Coastguard Worker             wcscpy(workDir, cmd + 3);
1005*f6dc9357SAndroid Build Coastguard Worker             // RemoveQuotes(workDir);
1006*f6dc9357SAndroid Build Coastguard Worker             useTemp = False;
1007*f6dc9357SAndroid Build Coastguard Worker             error = False;
1008*f6dc9357SAndroid Build Coastguard Worker           }
1009*f6dc9357SAndroid Build Coastguard Worker         }
1010*f6dc9357SAndroid Build Coastguard Worker         s = s2;
1011*f6dc9357SAndroid Build Coastguard Worker         if (error && cmdError[0] == 0)
1012*f6dc9357SAndroid Build Coastguard Worker           wcscpy(cmdError, cmd);
1013*f6dc9357SAndroid Build Coastguard Worker       }
1014*f6dc9357SAndroid Build Coastguard Worker     }
1015*f6dc9357SAndroid Build Coastguard Worker 
1016*f6dc9357SAndroid Build Coastguard Worker     if (cmdError[0] != 0)
1017*f6dc9357SAndroid Build Coastguard Worker     {
1018*f6dc9357SAndroid Build Coastguard Worker       if (!g_SilentMode)
1019*f6dc9357SAndroid Build Coastguard Worker         PrintErrorMessage("Unsupported command:", cmdError);
1020*f6dc9357SAndroid Build Coastguard Worker       return 1;
1021*f6dc9357SAndroid Build Coastguard Worker     }
1022*f6dc9357SAndroid Build Coastguard Worker   }
1023*f6dc9357SAndroid Build Coastguard Worker 
1024*f6dc9357SAndroid Build Coastguard Worker   {
1025*f6dc9357SAndroid Build Coastguard Worker     wchar_t *name;
1026*f6dc9357SAndroid Build Coastguard Worker     const DWORD len = GetModuleFileNameW(NULL, modulePath, MAX_PATH);
1027*f6dc9357SAndroid Build Coastguard Worker     if (len == 0 || len > MAX_PATH)
1028*f6dc9357SAndroid Build Coastguard Worker       return 1;
1029*f6dc9357SAndroid Build Coastguard Worker 
1030*f6dc9357SAndroid Build Coastguard Worker     name = NULL;
1031*f6dc9357SAndroid Build Coastguard Worker     wcscpy(modulePrefix, modulePath);
1032*f6dc9357SAndroid Build Coastguard Worker 
1033*f6dc9357SAndroid Build Coastguard Worker     {
1034*f6dc9357SAndroid Build Coastguard Worker       wchar_t *s = modulePrefix;
1035*f6dc9357SAndroid Build Coastguard Worker       for (;;)
1036*f6dc9357SAndroid Build Coastguard Worker       {
1037*f6dc9357SAndroid Build Coastguard Worker         const wchar_t c = *s++;
1038*f6dc9357SAndroid Build Coastguard Worker         if (c == 0)
1039*f6dc9357SAndroid Build Coastguard Worker           break;
1040*f6dc9357SAndroid Build Coastguard Worker         if (c == WCHAR_PATH_SEPARATOR)
1041*f6dc9357SAndroid Build Coastguard Worker           name = s;
1042*f6dc9357SAndroid Build Coastguard Worker       }
1043*f6dc9357SAndroid Build Coastguard Worker     }
1044*f6dc9357SAndroid Build Coastguard Worker 
1045*f6dc9357SAndroid Build Coastguard Worker     if (!name)
1046*f6dc9357SAndroid Build Coastguard Worker       return 1;
1047*f6dc9357SAndroid Build Coastguard Worker 
1048*f6dc9357SAndroid Build Coastguard Worker     if (!AreStringsEqual_NoCase(name, kUninstallExe))
1049*f6dc9357SAndroid Build Coastguard Worker       useTemp = False;
1050*f6dc9357SAndroid Build Coastguard Worker 
1051*f6dc9357SAndroid Build Coastguard Worker     *name = 0; // keep only prefix for modulePrefix
1052*f6dc9357SAndroid Build Coastguard Worker   }
1053*f6dc9357SAndroid Build Coastguard Worker 
1054*f6dc9357SAndroid Build Coastguard Worker 
1055*f6dc9357SAndroid Build Coastguard Worker   if (useTemp)
1056*f6dc9357SAndroid Build Coastguard Worker   {
1057*f6dc9357SAndroid Build Coastguard Worker     DWORD winRes = GetTempPathW(MAX_PATH, path);
1058*f6dc9357SAndroid Build Coastguard Worker 
1059*f6dc9357SAndroid Build Coastguard Worker     // GetTempPath: the returned string ends with a backslash
1060*f6dc9357SAndroid Build Coastguard Worker     /*
1061*f6dc9357SAndroid Build Coastguard Worker       {
1062*f6dc9357SAndroid Build Coastguard Worker         WCHAR s[MAX_PATH + 1];
1063*f6dc9357SAndroid Build Coastguard Worker         wcscpy(s, path);
1064*f6dc9357SAndroid Build Coastguard Worker         GetLongPathNameW(s, path, MAX_PATH);
1065*f6dc9357SAndroid Build Coastguard Worker       }
1066*f6dc9357SAndroid Build Coastguard Worker     */
1067*f6dc9357SAndroid Build Coastguard Worker 
1068*f6dc9357SAndroid Build Coastguard Worker     if (winRes != 0 && winRes <= MAX_PATH + 1
1069*f6dc9357SAndroid Build Coastguard Worker         && !IsString1PrefixedByString2_NoCase(modulePrefix, path))
1070*f6dc9357SAndroid Build Coastguard Worker     {
1071*f6dc9357SAndroid Build Coastguard Worker       unsigned i;
1072*f6dc9357SAndroid Build Coastguard Worker       DWORD d;
1073*f6dc9357SAndroid Build Coastguard Worker 
1074*f6dc9357SAndroid Build Coastguard Worker       const size_t pathLen = wcslen(path);
1075*f6dc9357SAndroid Build Coastguard Worker       d = (GetTickCount() << 12) ^ (GetCurrentThreadId() << 14) ^ GetCurrentProcessId();
1076*f6dc9357SAndroid Build Coastguard Worker 
1077*f6dc9357SAndroid Build Coastguard Worker       for (i = 0; i < 100; i++, d += GetTickCount())
1078*f6dc9357SAndroid Build Coastguard Worker       {
1079*f6dc9357SAndroid Build Coastguard Worker         CpyAscii(path + pathLen, "7z");
1080*f6dc9357SAndroid Build Coastguard Worker 
1081*f6dc9357SAndroid Build Coastguard Worker         {
1082*f6dc9357SAndroid Build Coastguard Worker           wchar_t *s = path + wcslen(path);
1083*f6dc9357SAndroid Build Coastguard Worker           UInt32 value = d;
1084*f6dc9357SAndroid Build Coastguard Worker           unsigned k;
1085*f6dc9357SAndroid Build Coastguard Worker           for (k = 0; k < 8; k++)
1086*f6dc9357SAndroid Build Coastguard Worker           {
1087*f6dc9357SAndroid Build Coastguard Worker             const unsigned t = value & 0xF;
1088*f6dc9357SAndroid Build Coastguard Worker             value >>= 4;
1089*f6dc9357SAndroid Build Coastguard Worker             s[7 - k] = (wchar_t)((t < 10) ? ('0' + t) : ('A' + (t - 10)));
1090*f6dc9357SAndroid Build Coastguard Worker           }
1091*f6dc9357SAndroid Build Coastguard Worker           s[k] = 0;
1092*f6dc9357SAndroid Build Coastguard Worker         }
1093*f6dc9357SAndroid Build Coastguard Worker 
1094*f6dc9357SAndroid Build Coastguard Worker         if (DoesFileOrDirExist())
1095*f6dc9357SAndroid Build Coastguard Worker           continue;
1096*f6dc9357SAndroid Build Coastguard Worker         if (CreateDirectoryW(path, NULL))
1097*f6dc9357SAndroid Build Coastguard Worker         {
1098*f6dc9357SAndroid Build Coastguard Worker           CatAscii(path, STRING_PATH_SEPARATOR);
1099*f6dc9357SAndroid Build Coastguard Worker           wcscpy(tempPath, path);
1100*f6dc9357SAndroid Build Coastguard Worker           break;
1101*f6dc9357SAndroid Build Coastguard Worker         }
1102*f6dc9357SAndroid Build Coastguard Worker         if (GetLastError() != ERROR_ALREADY_EXISTS)
1103*f6dc9357SAndroid Build Coastguard Worker           break;
1104*f6dc9357SAndroid Build Coastguard Worker       }
1105*f6dc9357SAndroid Build Coastguard Worker 
1106*f6dc9357SAndroid Build Coastguard Worker       if (tempPath[0] != 0)
1107*f6dc9357SAndroid Build Coastguard Worker       {
1108*f6dc9357SAndroid Build Coastguard Worker         wcscpy(copyPath, tempPath);
1109*f6dc9357SAndroid Build Coastguard Worker         CatAscii(copyPath, "Uninst.exe"); // we need not "Uninstall.exe" here
1110*f6dc9357SAndroid Build Coastguard Worker 
1111*f6dc9357SAndroid Build Coastguard Worker         if (CopyFileW(modulePath, copyPath, TRUE))
1112*f6dc9357SAndroid Build Coastguard Worker         {
1113*f6dc9357SAndroid Build Coastguard Worker           RemoveFileAfterReboot2(copyPath);
1114*f6dc9357SAndroid Build Coastguard Worker           RemoveFileAfterReboot2(tempPath);
1115*f6dc9357SAndroid Build Coastguard Worker 
1116*f6dc9357SAndroid Build Coastguard Worker           {
1117*f6dc9357SAndroid Build Coastguard Worker             STARTUPINFOW si;
1118*f6dc9357SAndroid Build Coastguard Worker             PROCESS_INFORMATION pi;
1119*f6dc9357SAndroid Build Coastguard Worker             cmdLine[0] = 0;
1120*f6dc9357SAndroid Build Coastguard Worker 
1121*f6dc9357SAndroid Build Coastguard Worker             // maybe CreateProcess supports path with spaces even without quotes.
1122*f6dc9357SAndroid Build Coastguard Worker             AddPathParam(cmdLine, copyPath);
1123*f6dc9357SAndroid Build Coastguard Worker             CatAscii(cmdLine, " /N /D=");
1124*f6dc9357SAndroid Build Coastguard Worker             AddPathParam(cmdLine, modulePrefix);
1125*f6dc9357SAndroid Build Coastguard Worker 
1126*f6dc9357SAndroid Build Coastguard Worker             if (cmdParams[0] != 0 && wcslen(cmdParams) < MAX_PATH * 2 + 10)
1127*f6dc9357SAndroid Build Coastguard Worker               wcscat(cmdLine, cmdParams);
1128*f6dc9357SAndroid Build Coastguard Worker 
1129*f6dc9357SAndroid Build Coastguard Worker             memset(&si, 0, sizeof(si));
1130*f6dc9357SAndroid Build Coastguard Worker             si.cb = sizeof(si);
1131*f6dc9357SAndroid Build Coastguard Worker 
1132*f6dc9357SAndroid Build Coastguard Worker             if (CreateProcessW(NULL, cmdLine, NULL, NULL, FALSE, 0, NULL, tempPath, &si, &pi))
1133*f6dc9357SAndroid Build Coastguard Worker             {
1134*f6dc9357SAndroid Build Coastguard Worker               CloseHandle(pi.hThread);
1135*f6dc9357SAndroid Build Coastguard Worker               if (pi.hProcess)
1136*f6dc9357SAndroid Build Coastguard Worker               {
1137*f6dc9357SAndroid Build Coastguard Worker                 CloseHandle(pi.hProcess);
1138*f6dc9357SAndroid Build Coastguard Worker                 return 0;
1139*f6dc9357SAndroid Build Coastguard Worker               }
1140*f6dc9357SAndroid Build Coastguard Worker             }
1141*f6dc9357SAndroid Build Coastguard Worker           }
1142*f6dc9357SAndroid Build Coastguard Worker         }
1143*f6dc9357SAndroid Build Coastguard Worker       }
1144*f6dc9357SAndroid Build Coastguard Worker     }
1145*f6dc9357SAndroid Build Coastguard Worker   }
1146*f6dc9357SAndroid Build Coastguard Worker 
1147*f6dc9357SAndroid Build Coastguard Worker   wcscpy(path, modulePrefix);
1148*f6dc9357SAndroid Build Coastguard Worker 
1149*f6dc9357SAndroid Build Coastguard Worker   if (workDir[0] != 0)
1150*f6dc9357SAndroid Build Coastguard Worker   {
1151*f6dc9357SAndroid Build Coastguard Worker     wcscpy(path, workDir);
1152*f6dc9357SAndroid Build Coastguard Worker     NormalizePrefix(path);
1153*f6dc9357SAndroid Build Coastguard Worker   }
1154*f6dc9357SAndroid Build Coastguard Worker 
1155*f6dc9357SAndroid Build Coastguard Worker   /*
1156*f6dc9357SAndroid Build Coastguard Worker   if (path[0] == 0)
1157*f6dc9357SAndroid Build Coastguard Worker   {
1158*f6dc9357SAndroid Build Coastguard Worker     HKEY key = 0;
1159*f6dc9357SAndroid Build Coastguard Worker     BoolInt ok = False;
1160*f6dc9357SAndroid Build Coastguard Worker     LONG res = RegOpenKeyExW(HKEY_CURRENT_USER, k_Reg_Software_7zip, 0, KEY_READ | k_Reg_WOW_Flag, &key);
1161*f6dc9357SAndroid Build Coastguard Worker     if (res == ERROR_SUCCESS)
1162*f6dc9357SAndroid Build Coastguard Worker     {
1163*f6dc9357SAndroid Build Coastguard Worker       ok = MyRegistry_QueryString(key, k_Reg_Path32, path);
1164*f6dc9357SAndroid Build Coastguard Worker       // ok = MyRegistry_QueryString(key, k_Reg_Path, path);
1165*f6dc9357SAndroid Build Coastguard Worker       RegCloseKey(key);
1166*f6dc9357SAndroid Build Coastguard Worker     }
1167*f6dc9357SAndroid Build Coastguard Worker   }
1168*f6dc9357SAndroid Build Coastguard Worker   */
1169*f6dc9357SAndroid Build Coastguard Worker 
1170*f6dc9357SAndroid Build Coastguard Worker 
1171*f6dc9357SAndroid Build Coastguard Worker   if (g_SilentMode)
1172*f6dc9357SAndroid Build Coastguard Worker     return Install();
1173*f6dc9357SAndroid Build Coastguard Worker 
1174*f6dc9357SAndroid Build Coastguard Worker   {
1175*f6dc9357SAndroid Build Coastguard Worker     int retCode = 1;
1176*f6dc9357SAndroid Build Coastguard Worker     g_HWND = CreateDialog(
1177*f6dc9357SAndroid Build Coastguard Worker         hInstance,
1178*f6dc9357SAndroid Build Coastguard Worker         // GetModuleHandle(NULL),
1179*f6dc9357SAndroid Build Coastguard Worker         MAKEINTRESOURCE(IDD_INSTALL), NULL, MyDlgProc);
1180*f6dc9357SAndroid Build Coastguard Worker     if (!g_HWND)
1181*f6dc9357SAndroid Build Coastguard Worker       return 1;
1182*f6dc9357SAndroid Build Coastguard Worker 
1183*f6dc9357SAndroid Build Coastguard Worker     {
1184*f6dc9357SAndroid Build Coastguard Worker       const HICON hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON));
1185*f6dc9357SAndroid Build Coastguard Worker       // SendMessage(g_HWND, WM_SETICON, (WPARAM)ICON_SMALL, (LPARAM)hIcon);
1186*f6dc9357SAndroid Build Coastguard Worker       SendMessage(g_HWND, WM_SETICON, (WPARAM)ICON_BIG, (LPARAM)hIcon);
1187*f6dc9357SAndroid Build Coastguard Worker     }
1188*f6dc9357SAndroid Build Coastguard Worker 
1189*f6dc9357SAndroid Build Coastguard Worker     {
1190*f6dc9357SAndroid Build Coastguard Worker       BOOL bRet;
1191*f6dc9357SAndroid Build Coastguard Worker       MSG msg;
1192*f6dc9357SAndroid Build Coastguard Worker 
1193*f6dc9357SAndroid Build Coastguard Worker       while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0)
1194*f6dc9357SAndroid Build Coastguard Worker       {
1195*f6dc9357SAndroid Build Coastguard Worker         if (bRet == -1)
1196*f6dc9357SAndroid Build Coastguard Worker           return retCode;
1197*f6dc9357SAndroid Build Coastguard Worker         if (!g_HWND)
1198*f6dc9357SAndroid Build Coastguard Worker           return retCode;
1199*f6dc9357SAndroid Build Coastguard Worker 
1200*f6dc9357SAndroid Build Coastguard Worker         if (!IsDialogMessage(g_HWND, &msg))
1201*f6dc9357SAndroid Build Coastguard Worker         {
1202*f6dc9357SAndroid Build Coastguard Worker           TranslateMessage(&msg);
1203*f6dc9357SAndroid Build Coastguard Worker           DispatchMessage(&msg);
1204*f6dc9357SAndroid Build Coastguard Worker         }
1205*f6dc9357SAndroid Build Coastguard Worker         if (!g_HWND)
1206*f6dc9357SAndroid Build Coastguard Worker           return retCode;
1207*f6dc9357SAndroid Build Coastguard Worker 
1208*f6dc9357SAndroid Build Coastguard Worker         if (g_Install_was_Pressed && !g_Finished)
1209*f6dc9357SAndroid Build Coastguard Worker         {
1210*f6dc9357SAndroid Build Coastguard Worker           retCode = Install();
1211*f6dc9357SAndroid Build Coastguard Worker           g_Finished = True;
1212*f6dc9357SAndroid Build Coastguard Worker           if (retCode != 0)
1213*f6dc9357SAndroid Build Coastguard Worker             break;
1214*f6dc9357SAndroid Build Coastguard Worker           if (!g_HWND)
1215*f6dc9357SAndroid Build Coastguard Worker             break;
1216*f6dc9357SAndroid Build Coastguard Worker           {
1217*f6dc9357SAndroid Build Coastguard Worker             SetDlgItemTextW(g_HWND, IDOK, L"Close");
1218*f6dc9357SAndroid Build Coastguard Worker             EnableWindow(GetDlgItem(g_HWND, IDOK), TRUE);
1219*f6dc9357SAndroid Build Coastguard Worker             EnableWindow(GetDlgItem(g_HWND, IDCANCEL), FALSE);
1220*f6dc9357SAndroid Build Coastguard Worker             SendMessage(g_HWND, WM_NEXTDLGCTL, (WPARAM)(void *)GetDlgItem(g_HWND, IDOK), TRUE);
1221*f6dc9357SAndroid Build Coastguard Worker           }
1222*f6dc9357SAndroid Build Coastguard Worker         }
1223*f6dc9357SAndroid Build Coastguard Worker       }
1224*f6dc9357SAndroid Build Coastguard Worker 
1225*f6dc9357SAndroid Build Coastguard Worker       if (g_HWND)
1226*f6dc9357SAndroid Build Coastguard Worker       {
1227*f6dc9357SAndroid Build Coastguard Worker         DestroyWindow(g_HWND);
1228*f6dc9357SAndroid Build Coastguard Worker         g_HWND = NULL;
1229*f6dc9357SAndroid Build Coastguard Worker       }
1230*f6dc9357SAndroid Build Coastguard Worker     }
1231*f6dc9357SAndroid Build Coastguard Worker 
1232*f6dc9357SAndroid Build Coastguard Worker     return retCode;
1233*f6dc9357SAndroid Build Coastguard Worker   }
1234*f6dc9357SAndroid Build Coastguard Worker }
1235