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