xref: /aosp_15_r20/external/lzma/CPP/7zip/Bundles/SFXWin/SfxWin.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // Main.cpp
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h"
4*f6dc9357SAndroid Build Coastguard Worker 
5*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/MyWindows.h"
6*f6dc9357SAndroid Build Coastguard Worker 
7*f6dc9357SAndroid Build Coastguard Worker #if defined(__MINGW32__) || defined(__MINGW64__)
8*f6dc9357SAndroid Build Coastguard Worker #include <shlwapi.h>
9*f6dc9357SAndroid Build Coastguard Worker #else
10*f6dc9357SAndroid Build Coastguard Worker #include <Shlwapi.h>
11*f6dc9357SAndroid Build Coastguard Worker #endif
12*f6dc9357SAndroid Build Coastguard Worker 
13*f6dc9357SAndroid Build Coastguard Worker #include "../../../../C/DllSecur.h"
14*f6dc9357SAndroid Build Coastguard Worker 
15*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/MyInitGuid.h"
16*f6dc9357SAndroid Build Coastguard Worker 
17*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/CommandLineParser.h"
18*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/StringConvert.h"
19*f6dc9357SAndroid Build Coastguard Worker 
20*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/DLL.h"
21*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/ErrorMsg.h"
22*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/FileDir.h"
23*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/FileName.h"
24*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/NtCheck.h"
25*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/ResourceString.h"
26*f6dc9357SAndroid Build Coastguard Worker 
27*f6dc9357SAndroid Build Coastguard Worker #include "../../ICoder.h"
28*f6dc9357SAndroid Build Coastguard Worker #include "../../IPassword.h"
29*f6dc9357SAndroid Build Coastguard Worker #include "../../Archive/IArchive.h"
30*f6dc9357SAndroid Build Coastguard Worker #include "../../UI/Common/Extract.h"
31*f6dc9357SAndroid Build Coastguard Worker #include "../../UI/Common/ExitCode.h"
32*f6dc9357SAndroid Build Coastguard Worker #include "../../UI/Explorer/MyMessages.h"
33*f6dc9357SAndroid Build Coastguard Worker #include "../../UI/FileManager/MyWindowsNew.h"
34*f6dc9357SAndroid Build Coastguard Worker #include "../../UI/GUI/ExtractGUI.h"
35*f6dc9357SAndroid Build Coastguard Worker #include "../../UI/GUI/ExtractRes.h"
36*f6dc9357SAndroid Build Coastguard Worker 
37*f6dc9357SAndroid Build Coastguard Worker using namespace NWindows;
38*f6dc9357SAndroid Build Coastguard Worker using namespace NFile;
39*f6dc9357SAndroid Build Coastguard Worker using namespace NDir;
40*f6dc9357SAndroid Build Coastguard Worker 
41*f6dc9357SAndroid Build Coastguard Worker extern
42*f6dc9357SAndroid Build Coastguard Worker HINSTANCE g_hInstance;
43*f6dc9357SAndroid Build Coastguard Worker HINSTANCE g_hInstance;
44*f6dc9357SAndroid Build Coastguard Worker extern
45*f6dc9357SAndroid Build Coastguard Worker bool g_DisableUserQuestions;
46*f6dc9357SAndroid Build Coastguard Worker bool g_DisableUserQuestions;
47*f6dc9357SAndroid Build Coastguard Worker 
48*f6dc9357SAndroid Build Coastguard Worker #ifndef UNDER_CE
49*f6dc9357SAndroid Build Coastguard Worker 
50*f6dc9357SAndroid Build Coastguard Worker #if !defined(Z7_WIN32_WINNT_MIN) || Z7_WIN32_WINNT_MIN < 0x0500 // win2000
51*f6dc9357SAndroid Build Coastguard Worker #define Z7_USE_DYN_ComCtl32Version
52*f6dc9357SAndroid Build Coastguard Worker #endif
53*f6dc9357SAndroid Build Coastguard Worker 
54*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_USE_DYN_ComCtl32Version
55*f6dc9357SAndroid Build Coastguard Worker Z7_DIAGNOSTIC_IGNORE_CAST_FUNCTION
56*f6dc9357SAndroid Build Coastguard Worker 
GetDllVersion(LPCTSTR dllName)57*f6dc9357SAndroid Build Coastguard Worker static DWORD GetDllVersion(LPCTSTR dllName)
58*f6dc9357SAndroid Build Coastguard Worker {
59*f6dc9357SAndroid Build Coastguard Worker   DWORD dwVersion = 0;
60*f6dc9357SAndroid Build Coastguard Worker   const HINSTANCE hinstDll = LoadLibrary(dllName);
61*f6dc9357SAndroid Build Coastguard Worker   if (hinstDll)
62*f6dc9357SAndroid Build Coastguard Worker   {
63*f6dc9357SAndroid Build Coastguard Worker     const
64*f6dc9357SAndroid Build Coastguard Worker     DLLGETVERSIONPROC func_DllGetVersion = Z7_GET_PROC_ADDRESS(
65*f6dc9357SAndroid Build Coastguard Worker     DLLGETVERSIONPROC, hinstDll, "DllGetVersion");
66*f6dc9357SAndroid Build Coastguard Worker     if (func_DllGetVersion)
67*f6dc9357SAndroid Build Coastguard Worker     {
68*f6dc9357SAndroid Build Coastguard Worker       DLLVERSIONINFO dvi;
69*f6dc9357SAndroid Build Coastguard Worker       ZeroMemory(&dvi, sizeof(dvi));
70*f6dc9357SAndroid Build Coastguard Worker       dvi.cbSize = sizeof(dvi);
71*f6dc9357SAndroid Build Coastguard Worker       const HRESULT hr = func_DllGetVersion(&dvi);
72*f6dc9357SAndroid Build Coastguard Worker       if (SUCCEEDED(hr))
73*f6dc9357SAndroid Build Coastguard Worker         dwVersion = (DWORD)MAKELONG(dvi.dwMinorVersion, dvi.dwMajorVersion);
74*f6dc9357SAndroid Build Coastguard Worker     }
75*f6dc9357SAndroid Build Coastguard Worker     FreeLibrary(hinstDll);
76*f6dc9357SAndroid Build Coastguard Worker   }
77*f6dc9357SAndroid Build Coastguard Worker   return dwVersion;
78*f6dc9357SAndroid Build Coastguard Worker }
79*f6dc9357SAndroid Build Coastguard Worker 
80*f6dc9357SAndroid Build Coastguard Worker #endif
81*f6dc9357SAndroid Build Coastguard Worker #endif
82*f6dc9357SAndroid Build Coastguard Worker 
83*f6dc9357SAndroid Build Coastguard Worker extern
84*f6dc9357SAndroid Build Coastguard Worker bool g_LVN_ITEMACTIVATE_Support;
85*f6dc9357SAndroid Build Coastguard Worker bool g_LVN_ITEMACTIVATE_Support = true;
86*f6dc9357SAndroid Build Coastguard Worker 
87*f6dc9357SAndroid Build Coastguard Worker static const wchar_t * const kUnknownExceptionMessage = L"ERROR: Unknown Error!";
88*f6dc9357SAndroid Build Coastguard Worker 
ErrorMessageForHRESULT(HRESULT res)89*f6dc9357SAndroid Build Coastguard Worker static void ErrorMessageForHRESULT(HRESULT res)
90*f6dc9357SAndroid Build Coastguard Worker {
91*f6dc9357SAndroid Build Coastguard Worker   ShowErrorMessage(HResultToMessage(res));
92*f6dc9357SAndroid Build Coastguard Worker }
93*f6dc9357SAndroid Build Coastguard Worker 
WinMain2()94*f6dc9357SAndroid Build Coastguard Worker static int APIENTRY WinMain2()
95*f6dc9357SAndroid Build Coastguard Worker {
96*f6dc9357SAndroid Build Coastguard Worker   // OleInitialize is required for ProgressBar in TaskBar.
97*f6dc9357SAndroid Build Coastguard Worker #ifndef UNDER_CE
98*f6dc9357SAndroid Build Coastguard Worker   OleInitialize(NULL);
99*f6dc9357SAndroid Build Coastguard Worker #endif
100*f6dc9357SAndroid Build Coastguard Worker 
101*f6dc9357SAndroid Build Coastguard Worker #ifndef UNDER_CE
102*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_USE_DYN_ComCtl32Version
103*f6dc9357SAndroid Build Coastguard Worker   {
104*f6dc9357SAndroid Build Coastguard Worker     const DWORD g_ComCtl32Version = ::GetDllVersion(TEXT("comctl32.dll"));
105*f6dc9357SAndroid Build Coastguard Worker     g_LVN_ITEMACTIVATE_Support = (g_ComCtl32Version >= MAKELONG(71, 4));
106*f6dc9357SAndroid Build Coastguard Worker   }
107*f6dc9357SAndroid Build Coastguard Worker #endif
108*f6dc9357SAndroid Build Coastguard Worker #endif
109*f6dc9357SAndroid Build Coastguard Worker 
110*f6dc9357SAndroid Build Coastguard Worker   UString password;
111*f6dc9357SAndroid Build Coastguard Worker   bool assumeYes = false;
112*f6dc9357SAndroid Build Coastguard Worker   bool outputFolderDefined = false;
113*f6dc9357SAndroid Build Coastguard Worker   FString outputFolder;
114*f6dc9357SAndroid Build Coastguard Worker   UStringVector commandStrings;
115*f6dc9357SAndroid Build Coastguard Worker   NCommandLineParser::SplitCommandLine(GetCommandLineW(), commandStrings);
116*f6dc9357SAndroid Build Coastguard Worker 
117*f6dc9357SAndroid Build Coastguard Worker   #ifndef UNDER_CE
118*f6dc9357SAndroid Build Coastguard Worker   if (commandStrings.Size() > 0)
119*f6dc9357SAndroid Build Coastguard Worker     commandStrings.Delete(0);
120*f6dc9357SAndroid Build Coastguard Worker   #endif
121*f6dc9357SAndroid Build Coastguard Worker 
122*f6dc9357SAndroid Build Coastguard Worker   FOR_VECTOR (i, commandStrings)
123*f6dc9357SAndroid Build Coastguard Worker   {
124*f6dc9357SAndroid Build Coastguard Worker     const UString &s = commandStrings[i];
125*f6dc9357SAndroid Build Coastguard Worker     if (s.Len() > 1 && s[0] == '-')
126*f6dc9357SAndroid Build Coastguard Worker     {
127*f6dc9357SAndroid Build Coastguard Worker       const wchar_t c = MyCharLower_Ascii(s[1]);
128*f6dc9357SAndroid Build Coastguard Worker       if (c == 'y')
129*f6dc9357SAndroid Build Coastguard Worker       {
130*f6dc9357SAndroid Build Coastguard Worker         assumeYes = true;
131*f6dc9357SAndroid Build Coastguard Worker         if (s.Len() != 2)
132*f6dc9357SAndroid Build Coastguard Worker         {
133*f6dc9357SAndroid Build Coastguard Worker           ShowErrorMessage(L"Bad command");
134*f6dc9357SAndroid Build Coastguard Worker           return 1;
135*f6dc9357SAndroid Build Coastguard Worker         }
136*f6dc9357SAndroid Build Coastguard Worker       }
137*f6dc9357SAndroid Build Coastguard Worker       else if (c == 'o')
138*f6dc9357SAndroid Build Coastguard Worker       {
139*f6dc9357SAndroid Build Coastguard Worker         outputFolder = us2fs(s.Ptr(2));
140*f6dc9357SAndroid Build Coastguard Worker         NName::NormalizeDirPathPrefix(outputFolder);
141*f6dc9357SAndroid Build Coastguard Worker         outputFolderDefined = !outputFolder.IsEmpty();
142*f6dc9357SAndroid Build Coastguard Worker       }
143*f6dc9357SAndroid Build Coastguard Worker       else if (c == 'p')
144*f6dc9357SAndroid Build Coastguard Worker       {
145*f6dc9357SAndroid Build Coastguard Worker         password = s.Ptr(2);
146*f6dc9357SAndroid Build Coastguard Worker       }
147*f6dc9357SAndroid Build Coastguard Worker     }
148*f6dc9357SAndroid Build Coastguard Worker   }
149*f6dc9357SAndroid Build Coastguard Worker 
150*f6dc9357SAndroid Build Coastguard Worker   g_DisableUserQuestions = assumeYes;
151*f6dc9357SAndroid Build Coastguard Worker 
152*f6dc9357SAndroid Build Coastguard Worker   FString path;
153*f6dc9357SAndroid Build Coastguard Worker   NDLL::MyGetModuleFileName(path);
154*f6dc9357SAndroid Build Coastguard Worker 
155*f6dc9357SAndroid Build Coastguard Worker   FString fullPath;
156*f6dc9357SAndroid Build Coastguard Worker   if (!MyGetFullPathName(path, fullPath))
157*f6dc9357SAndroid Build Coastguard Worker   {
158*f6dc9357SAndroid Build Coastguard Worker     ShowErrorMessage(L"Error 1329484");
159*f6dc9357SAndroid Build Coastguard Worker     return 1;
160*f6dc9357SAndroid Build Coastguard Worker   }
161*f6dc9357SAndroid Build Coastguard Worker 
162*f6dc9357SAndroid Build Coastguard Worker   CCodecs *codecs = new CCodecs;
163*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr<IUnknown> compressCodecsInfo = codecs;
164*f6dc9357SAndroid Build Coastguard Worker   HRESULT result = codecs->Load();
165*f6dc9357SAndroid Build Coastguard Worker   if (result != S_OK)
166*f6dc9357SAndroid Build Coastguard Worker   {
167*f6dc9357SAndroid Build Coastguard Worker     ErrorMessageForHRESULT(result);
168*f6dc9357SAndroid Build Coastguard Worker     return 1;
169*f6dc9357SAndroid Build Coastguard Worker   }
170*f6dc9357SAndroid Build Coastguard Worker 
171*f6dc9357SAndroid Build Coastguard Worker   // COpenCallbackGUI openCallback;
172*f6dc9357SAndroid Build Coastguard Worker 
173*f6dc9357SAndroid Build Coastguard Worker   // openCallback.PasswordIsDefined = !password.IsEmpty();
174*f6dc9357SAndroid Build Coastguard Worker   // openCallback.Password = password;
175*f6dc9357SAndroid Build Coastguard Worker 
176*f6dc9357SAndroid Build Coastguard Worker   CExtractCallbackImp *ecs = new CExtractCallbackImp;
177*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr<IFolderArchiveExtractCallback> extractCallback = ecs;
178*f6dc9357SAndroid Build Coastguard Worker   ecs->Init();
179*f6dc9357SAndroid Build Coastguard Worker 
180*f6dc9357SAndroid Build Coastguard Worker   #ifndef Z7_NO_CRYPTO
181*f6dc9357SAndroid Build Coastguard Worker   ecs->PasswordIsDefined = !password.IsEmpty();
182*f6dc9357SAndroid Build Coastguard Worker   ecs->Password = password;
183*f6dc9357SAndroid Build Coastguard Worker   #endif
184*f6dc9357SAndroid Build Coastguard Worker 
185*f6dc9357SAndroid Build Coastguard Worker   CExtractOptions eo;
186*f6dc9357SAndroid Build Coastguard Worker 
187*f6dc9357SAndroid Build Coastguard Worker   FString dirPrefix;
188*f6dc9357SAndroid Build Coastguard Worker   if (!GetOnlyDirPrefix(path, dirPrefix))
189*f6dc9357SAndroid Build Coastguard Worker   {
190*f6dc9357SAndroid Build Coastguard Worker     ShowErrorMessage(L"Error 1329485");
191*f6dc9357SAndroid Build Coastguard Worker     return 1;
192*f6dc9357SAndroid Build Coastguard Worker   }
193*f6dc9357SAndroid Build Coastguard Worker 
194*f6dc9357SAndroid Build Coastguard Worker   eo.OutputDir = outputFolderDefined ? outputFolder : dirPrefix;
195*f6dc9357SAndroid Build Coastguard Worker   eo.YesToAll = assumeYes;
196*f6dc9357SAndroid Build Coastguard Worker   eo.OverwriteMode = assumeYes ?
197*f6dc9357SAndroid Build Coastguard Worker       NExtract::NOverwriteMode::kOverwrite :
198*f6dc9357SAndroid Build Coastguard Worker       NExtract::NOverwriteMode::kAsk;
199*f6dc9357SAndroid Build Coastguard Worker   eo.PathMode = NExtract::NPathMode::kFullPaths;
200*f6dc9357SAndroid Build Coastguard Worker   eo.TestMode = false;
201*f6dc9357SAndroid Build Coastguard Worker 
202*f6dc9357SAndroid Build Coastguard Worker   UStringVector v1, v2;
203*f6dc9357SAndroid Build Coastguard Worker   v1.Add(fs2us(fullPath));
204*f6dc9357SAndroid Build Coastguard Worker   v2.Add(fs2us(fullPath));
205*f6dc9357SAndroid Build Coastguard Worker   NWildcard::CCensorNode wildcardCensor;
206*f6dc9357SAndroid Build Coastguard Worker   wildcardCensor.Add_Wildcard();
207*f6dc9357SAndroid Build Coastguard Worker 
208*f6dc9357SAndroid Build Coastguard Worker   bool messageWasDisplayed = false;
209*f6dc9357SAndroid Build Coastguard Worker   result = ExtractGUI(codecs,
210*f6dc9357SAndroid Build Coastguard Worker       CObjectVector<COpenType>(), CIntVector(),
211*f6dc9357SAndroid Build Coastguard Worker       v1, v2,
212*f6dc9357SAndroid Build Coastguard Worker       wildcardCensor, eo, (assumeYes ? false: true), messageWasDisplayed, ecs);
213*f6dc9357SAndroid Build Coastguard Worker 
214*f6dc9357SAndroid Build Coastguard Worker   if (result == S_OK)
215*f6dc9357SAndroid Build Coastguard Worker   {
216*f6dc9357SAndroid Build Coastguard Worker     if (!ecs->IsOK())
217*f6dc9357SAndroid Build Coastguard Worker       return NExitCode::kFatalError;
218*f6dc9357SAndroid Build Coastguard Worker     return 0;
219*f6dc9357SAndroid Build Coastguard Worker   }
220*f6dc9357SAndroid Build Coastguard Worker   if (result == E_ABORT)
221*f6dc9357SAndroid Build Coastguard Worker     return NExitCode::kUserBreak;
222*f6dc9357SAndroid Build Coastguard Worker   if (!messageWasDisplayed)
223*f6dc9357SAndroid Build Coastguard Worker   {
224*f6dc9357SAndroid Build Coastguard Worker     if (result == S_FALSE)
225*f6dc9357SAndroid Build Coastguard Worker       ShowErrorMessage(L"Error in archive");
226*f6dc9357SAndroid Build Coastguard Worker     else
227*f6dc9357SAndroid Build Coastguard Worker       ErrorMessageForHRESULT(result);
228*f6dc9357SAndroid Build Coastguard Worker   }
229*f6dc9357SAndroid Build Coastguard Worker   if (result == E_OUTOFMEMORY)
230*f6dc9357SAndroid Build Coastguard Worker     return NExitCode::kMemoryError;
231*f6dc9357SAndroid Build Coastguard Worker   return NExitCode::kFatalError;
232*f6dc9357SAndroid Build Coastguard Worker }
233*f6dc9357SAndroid Build Coastguard Worker 
234*f6dc9357SAndroid Build Coastguard Worker #if defined(_WIN32) && defined(_UNICODE) && !defined(_WIN64) && !defined(UNDER_CE)
235*f6dc9357SAndroid Build Coastguard Worker #define NT_CHECK_FAIL_ACTION ShowErrorMessage(L"Unsupported Windows version"); return NExitCode::kFatalError;
236*f6dc9357SAndroid Build Coastguard Worker #endif
237*f6dc9357SAndroid Build Coastguard Worker 
WinMain(HINSTANCE hInstance,HINSTANCE,LPWSTR,int)238*f6dc9357SAndroid Build Coastguard Worker int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE /* hPrevInstance */,
239*f6dc9357SAndroid Build Coastguard Worker   #ifdef UNDER_CE
240*f6dc9357SAndroid Build Coastguard Worker   LPWSTR
241*f6dc9357SAndroid Build Coastguard Worker   #else
242*f6dc9357SAndroid Build Coastguard Worker   LPSTR
243*f6dc9357SAndroid Build Coastguard Worker   #endif
244*f6dc9357SAndroid Build Coastguard Worker   /* lpCmdLine */, int /* nCmdShow */)
245*f6dc9357SAndroid Build Coastguard Worker {
246*f6dc9357SAndroid Build Coastguard Worker   g_hInstance = (HINSTANCE)hInstance;
247*f6dc9357SAndroid Build Coastguard Worker 
248*f6dc9357SAndroid Build Coastguard Worker   NT_CHECK
249*f6dc9357SAndroid Build Coastguard Worker 
250*f6dc9357SAndroid Build Coastguard Worker   try
251*f6dc9357SAndroid Build Coastguard Worker   {
252*f6dc9357SAndroid Build Coastguard Worker     #ifdef _WIN32
253*f6dc9357SAndroid Build Coastguard Worker     LoadSecurityDlls();
254*f6dc9357SAndroid Build Coastguard Worker     #endif
255*f6dc9357SAndroid Build Coastguard Worker 
256*f6dc9357SAndroid Build Coastguard Worker     return WinMain2();
257*f6dc9357SAndroid Build Coastguard Worker   }
258*f6dc9357SAndroid Build Coastguard Worker   catch(const CNewException &)
259*f6dc9357SAndroid Build Coastguard Worker   {
260*f6dc9357SAndroid Build Coastguard Worker     ErrorMessageForHRESULT(E_OUTOFMEMORY);
261*f6dc9357SAndroid Build Coastguard Worker     return NExitCode::kMemoryError;
262*f6dc9357SAndroid Build Coastguard Worker   }
263*f6dc9357SAndroid Build Coastguard Worker   catch(...)
264*f6dc9357SAndroid Build Coastguard Worker   {
265*f6dc9357SAndroid Build Coastguard Worker     ShowErrorMessage(kUnknownExceptionMessage);
266*f6dc9357SAndroid Build Coastguard Worker     return NExitCode::kFatalError;
267*f6dc9357SAndroid Build Coastguard Worker   }
268*f6dc9357SAndroid Build Coastguard Worker }
269