xref: /aosp_15_r20/external/lzma/CPP/Windows/ProcessUtils.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // ProcessUtils.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/StringConvert.h"
6*f6dc9357SAndroid Build Coastguard Worker 
7*f6dc9357SAndroid Build Coastguard Worker #include "ProcessUtils.h"
8*f6dc9357SAndroid Build Coastguard Worker 
9*f6dc9357SAndroid Build Coastguard Worker #ifndef _UNICODE
10*f6dc9357SAndroid Build Coastguard Worker extern bool g_IsNT;
11*f6dc9357SAndroid Build Coastguard Worker #endif
12*f6dc9357SAndroid Build Coastguard Worker 
13*f6dc9357SAndroid Build Coastguard Worker namespace NWindows {
14*f6dc9357SAndroid Build Coastguard Worker 
15*f6dc9357SAndroid Build Coastguard Worker #ifndef UNDER_CE
GetQuotedString(const UString & s)16*f6dc9357SAndroid Build Coastguard Worker static UString GetQuotedString(const UString &s)
17*f6dc9357SAndroid Build Coastguard Worker {
18*f6dc9357SAndroid Build Coastguard Worker   UString s2 ('\"');
19*f6dc9357SAndroid Build Coastguard Worker   s2 += s;
20*f6dc9357SAndroid Build Coastguard Worker   s2.Add_Char('\"');
21*f6dc9357SAndroid Build Coastguard Worker   return s2;
22*f6dc9357SAndroid Build Coastguard Worker }
23*f6dc9357SAndroid Build Coastguard Worker #endif
24*f6dc9357SAndroid Build Coastguard Worker 
Create(LPCWSTR imageName,const UString & params,LPCWSTR curDir)25*f6dc9357SAndroid Build Coastguard Worker WRes CProcess::Create(LPCWSTR imageName, const UString &params, LPCWSTR curDir)
26*f6dc9357SAndroid Build Coastguard Worker {
27*f6dc9357SAndroid Build Coastguard Worker   /*
28*f6dc9357SAndroid Build Coastguard Worker   OutputDebugStringW(L"CProcess::Create");
29*f6dc9357SAndroid Build Coastguard Worker   OutputDebugStringW(imageName);
30*f6dc9357SAndroid Build Coastguard Worker   if (params)
31*f6dc9357SAndroid Build Coastguard Worker   {
32*f6dc9357SAndroid Build Coastguard Worker     OutputDebugStringW(L"params:");
33*f6dc9357SAndroid Build Coastguard Worker     OutputDebugStringW(params);
34*f6dc9357SAndroid Build Coastguard Worker   }
35*f6dc9357SAndroid Build Coastguard Worker   if (curDir)
36*f6dc9357SAndroid Build Coastguard Worker   {
37*f6dc9357SAndroid Build Coastguard Worker     OutputDebugStringW(L"cur dir:");
38*f6dc9357SAndroid Build Coastguard Worker     OutputDebugStringW(curDir);
39*f6dc9357SAndroid Build Coastguard Worker   }
40*f6dc9357SAndroid Build Coastguard Worker   */
41*f6dc9357SAndroid Build Coastguard Worker 
42*f6dc9357SAndroid Build Coastguard Worker   Close();
43*f6dc9357SAndroid Build Coastguard Worker   const UString params2 =
44*f6dc9357SAndroid Build Coastguard Worker       #ifndef UNDER_CE
45*f6dc9357SAndroid Build Coastguard Worker       GetQuotedString(imageName) + L' ' +
46*f6dc9357SAndroid Build Coastguard Worker       #endif
47*f6dc9357SAndroid Build Coastguard Worker       params;
48*f6dc9357SAndroid Build Coastguard Worker   #ifdef UNDER_CE
49*f6dc9357SAndroid Build Coastguard Worker   curDir = NULL;
50*f6dc9357SAndroid Build Coastguard Worker   #else
51*f6dc9357SAndroid Build Coastguard Worker   imageName = NULL;
52*f6dc9357SAndroid Build Coastguard Worker   #endif
53*f6dc9357SAndroid Build Coastguard Worker   PROCESS_INFORMATION pi;
54*f6dc9357SAndroid Build Coastguard Worker   BOOL result;
55*f6dc9357SAndroid Build Coastguard Worker   #ifndef _UNICODE
56*f6dc9357SAndroid Build Coastguard Worker   if (!g_IsNT)
57*f6dc9357SAndroid Build Coastguard Worker   {
58*f6dc9357SAndroid Build Coastguard Worker     STARTUPINFOA si;
59*f6dc9357SAndroid Build Coastguard Worker     si.cb = sizeof(si);
60*f6dc9357SAndroid Build Coastguard Worker     si.lpReserved = NULL;
61*f6dc9357SAndroid Build Coastguard Worker     si.lpDesktop = NULL;
62*f6dc9357SAndroid Build Coastguard Worker     si.lpTitle = NULL;
63*f6dc9357SAndroid Build Coastguard Worker     si.dwFlags = 0;
64*f6dc9357SAndroid Build Coastguard Worker     si.cbReserved2 = 0;
65*f6dc9357SAndroid Build Coastguard Worker     si.lpReserved2 = NULL;
66*f6dc9357SAndroid Build Coastguard Worker 
67*f6dc9357SAndroid Build Coastguard Worker     CSysString curDirA;
68*f6dc9357SAndroid Build Coastguard Worker     if (curDir != 0)
69*f6dc9357SAndroid Build Coastguard Worker       curDirA = GetSystemString(curDir);
70*f6dc9357SAndroid Build Coastguard Worker     const AString s = GetSystemString(params2);
71*f6dc9357SAndroid Build Coastguard Worker     result = ::CreateProcessA(NULL, s.Ptr_non_const(),
72*f6dc9357SAndroid Build Coastguard Worker         NULL, NULL, FALSE, 0, NULL, ((curDir != 0) ? (LPCSTR)curDirA: 0), &si, &pi);
73*f6dc9357SAndroid Build Coastguard Worker   }
74*f6dc9357SAndroid Build Coastguard Worker   else
75*f6dc9357SAndroid Build Coastguard Worker   #endif
76*f6dc9357SAndroid Build Coastguard Worker   {
77*f6dc9357SAndroid Build Coastguard Worker     STARTUPINFOW si;
78*f6dc9357SAndroid Build Coastguard Worker     si.cb = sizeof(si);
79*f6dc9357SAndroid Build Coastguard Worker     si.lpReserved = NULL;
80*f6dc9357SAndroid Build Coastguard Worker     si.lpDesktop = NULL;
81*f6dc9357SAndroid Build Coastguard Worker     si.lpTitle = NULL;
82*f6dc9357SAndroid Build Coastguard Worker     si.dwFlags = 0;
83*f6dc9357SAndroid Build Coastguard Worker     si.cbReserved2 = 0;
84*f6dc9357SAndroid Build Coastguard Worker     si.lpReserved2 = NULL;
85*f6dc9357SAndroid Build Coastguard Worker 
86*f6dc9357SAndroid Build Coastguard Worker     result = CreateProcessW(imageName, params2.Ptr_non_const(),
87*f6dc9357SAndroid Build Coastguard Worker         NULL, NULL, FALSE, 0, NULL, curDir, &si, &pi);
88*f6dc9357SAndroid Build Coastguard Worker   }
89*f6dc9357SAndroid Build Coastguard Worker   if (result == 0)
90*f6dc9357SAndroid Build Coastguard Worker     return ::GetLastError();
91*f6dc9357SAndroid Build Coastguard Worker   ::CloseHandle(pi.hThread);
92*f6dc9357SAndroid Build Coastguard Worker   _handle = pi.hProcess;
93*f6dc9357SAndroid Build Coastguard Worker   return 0;
94*f6dc9357SAndroid Build Coastguard Worker }
95*f6dc9357SAndroid Build Coastguard Worker 
MyCreateProcess(LPCWSTR imageName,const UString & params)96*f6dc9357SAndroid Build Coastguard Worker WRes MyCreateProcess(LPCWSTR imageName, const UString &params)
97*f6dc9357SAndroid Build Coastguard Worker {
98*f6dc9357SAndroid Build Coastguard Worker   CProcess process;
99*f6dc9357SAndroid Build Coastguard Worker   return process.Create(imageName, params, NULL);
100*f6dc9357SAndroid Build Coastguard Worker }
101*f6dc9357SAndroid Build Coastguard Worker 
102*f6dc9357SAndroid Build Coastguard Worker }
103