xref: /aosp_15_r20/external/lzma/CPP/Windows/ProcessUtils.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // Windows/ProcessUtils.h
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_WINDOWS_PROCESS_UTILS_H
4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_WINDOWS_PROCESS_UTILS_H
5*f6dc9357SAndroid Build Coastguard Worker 
6*f6dc9357SAndroid Build Coastguard Worker #include "../Common/MyWindows.h"
7*f6dc9357SAndroid Build Coastguard Worker 
8*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_OLD_WIN_SDK
9*f6dc9357SAndroid Build Coastguard Worker 
10*f6dc9357SAndroid Build Coastguard Worker #if defined(__MINGW32__) || defined(__MINGW64__)
11*f6dc9357SAndroid Build Coastguard Worker #include <psapi.h>
12*f6dc9357SAndroid Build Coastguard Worker #else
13*f6dc9357SAndroid Build Coastguard Worker #include <Psapi.h>
14*f6dc9357SAndroid Build Coastguard Worker #endif
15*f6dc9357SAndroid Build Coastguard Worker 
16*f6dc9357SAndroid Build Coastguard Worker #else // Z7_OLD_WIN_SDK
17*f6dc9357SAndroid Build Coastguard Worker 
18*f6dc9357SAndroid Build Coastguard Worker typedef struct _MODULEINFO {
19*f6dc9357SAndroid Build Coastguard Worker     LPVOID lpBaseOfDll;
20*f6dc9357SAndroid Build Coastguard Worker     DWORD SizeOfImage;
21*f6dc9357SAndroid Build Coastguard Worker     LPVOID EntryPoint;
22*f6dc9357SAndroid Build Coastguard Worker } MODULEINFO, *LPMODULEINFO;
23*f6dc9357SAndroid Build Coastguard Worker 
24*f6dc9357SAndroid Build Coastguard Worker typedef struct _PROCESS_MEMORY_COUNTERS {
25*f6dc9357SAndroid Build Coastguard Worker     DWORD cb;
26*f6dc9357SAndroid Build Coastguard Worker     DWORD PageFaultCount;
27*f6dc9357SAndroid Build Coastguard Worker     SIZE_T PeakWorkingSetSize;
28*f6dc9357SAndroid Build Coastguard Worker     SIZE_T WorkingSetSize;
29*f6dc9357SAndroid Build Coastguard Worker     SIZE_T QuotaPeakPagedPoolUsage;
30*f6dc9357SAndroid Build Coastguard Worker     SIZE_T QuotaPagedPoolUsage;
31*f6dc9357SAndroid Build Coastguard Worker     SIZE_T QuotaPeakNonPagedPoolUsage;
32*f6dc9357SAndroid Build Coastguard Worker     SIZE_T QuotaNonPagedPoolUsage;
33*f6dc9357SAndroid Build Coastguard Worker     SIZE_T PagefileUsage;
34*f6dc9357SAndroid Build Coastguard Worker     SIZE_T PeakPagefileUsage;
35*f6dc9357SAndroid Build Coastguard Worker } PROCESS_MEMORY_COUNTERS;
36*f6dc9357SAndroid Build Coastguard Worker typedef PROCESS_MEMORY_COUNTERS *PPROCESS_MEMORY_COUNTERS;
37*f6dc9357SAndroid Build Coastguard Worker 
38*f6dc9357SAndroid Build Coastguard Worker #endif // Z7_OLD_WIN_SDK
39*f6dc9357SAndroid Build Coastguard Worker 
40*f6dc9357SAndroid Build Coastguard Worker #include "../Common/MyString.h"
41*f6dc9357SAndroid Build Coastguard Worker 
42*f6dc9357SAndroid Build Coastguard Worker #include "Defs.h"
43*f6dc9357SAndroid Build Coastguard Worker #include "Handle.h"
44*f6dc9357SAndroid Build Coastguard Worker 
45*f6dc9357SAndroid Build Coastguard Worker namespace NWindows {
46*f6dc9357SAndroid Build Coastguard Worker 
47*f6dc9357SAndroid Build Coastguard Worker class CProcess: public CHandle
48*f6dc9357SAndroid Build Coastguard Worker {
49*f6dc9357SAndroid Build Coastguard Worker public:
Open(DWORD desiredAccess,bool inheritHandle,DWORD processId)50*f6dc9357SAndroid Build Coastguard Worker   bool Open(DWORD desiredAccess, bool inheritHandle, DWORD processId)
51*f6dc9357SAndroid Build Coastguard Worker   {
52*f6dc9357SAndroid Build Coastguard Worker     _handle = ::OpenProcess(desiredAccess, inheritHandle, processId);
53*f6dc9357SAndroid Build Coastguard Worker     return (_handle != NULL);
54*f6dc9357SAndroid Build Coastguard Worker   }
55*f6dc9357SAndroid Build Coastguard Worker 
56*f6dc9357SAndroid Build Coastguard Worker   #ifndef UNDER_CE
57*f6dc9357SAndroid Build Coastguard Worker 
GetExitCodeProcess(LPDWORD lpExitCode)58*f6dc9357SAndroid Build Coastguard Worker   bool GetExitCodeProcess(LPDWORD lpExitCode) { return BOOLToBool(::GetExitCodeProcess(_handle, lpExitCode)); }
Terminate(UINT exitCode)59*f6dc9357SAndroid Build Coastguard Worker   bool Terminate(UINT exitCode) { return BOOLToBool(::TerminateProcess(_handle, exitCode)); }
60*f6dc9357SAndroid Build Coastguard Worker   #if (WINVER >= 0x0500)
GetGuiResources(DWORD uiFlags)61*f6dc9357SAndroid Build Coastguard Worker   DWORD GetGuiResources (DWORD uiFlags) { return ::GetGuiResources(_handle, uiFlags); }
62*f6dc9357SAndroid Build Coastguard Worker   #endif
SetPriorityClass(DWORD dwPriorityClass)63*f6dc9357SAndroid Build Coastguard Worker   bool SetPriorityClass(DWORD dwPriorityClass) { return BOOLToBool(::SetPriorityClass(_handle, dwPriorityClass)); }
GetPriorityClass()64*f6dc9357SAndroid Build Coastguard Worker   DWORD GetPriorityClass() { return ::GetPriorityClass(_handle); }
65*f6dc9357SAndroid Build Coastguard Worker   // bool GetIoCounters(PIO_COUNTERS lpIoCounters ) { return BOOLToBool(::GetProcessIoCounters(_handle, lpIoCounters )); }
66*f6dc9357SAndroid Build Coastguard Worker 
GetTimes(LPFILETIME creationTime,LPFILETIME exitTime,LPFILETIME kernelTime,LPFILETIME userTime)67*f6dc9357SAndroid Build Coastguard Worker   bool GetTimes(LPFILETIME creationTime, LPFILETIME exitTime, LPFILETIME kernelTime, LPFILETIME userTime)
68*f6dc9357SAndroid Build Coastguard Worker     { return BOOLToBool(::GetProcessTimes(_handle, creationTime, exitTime, kernelTime, userTime)); }
69*f6dc9357SAndroid Build Coastguard Worker 
WaitForInputIdle(DWORD milliseconds)70*f6dc9357SAndroid Build Coastguard Worker   DWORD WaitForInputIdle(DWORD milliseconds) { return ::WaitForInputIdle(_handle, milliseconds);  }
71*f6dc9357SAndroid Build Coastguard Worker 
72*f6dc9357SAndroid Build Coastguard Worker   // Debug
73*f6dc9357SAndroid Build Coastguard Worker 
ReadMemory(LPCVOID baseAddress,LPVOID buffer,SIZE_T size,SIZE_T * numberOfBytesRead)74*f6dc9357SAndroid Build Coastguard Worker   bool ReadMemory(LPCVOID baseAddress, LPVOID buffer, SIZE_T size, SIZE_T* numberOfBytesRead)
75*f6dc9357SAndroid Build Coastguard Worker     { return BOOLToBool(::ReadProcessMemory(_handle, baseAddress, buffer, size, numberOfBytesRead));  }
76*f6dc9357SAndroid Build Coastguard Worker 
WriteMemory(LPVOID baseAddress,LPCVOID buffer,SIZE_T size,SIZE_T * numberOfBytesWritten)77*f6dc9357SAndroid Build Coastguard Worker   bool WriteMemory(LPVOID baseAddress, LPCVOID buffer, SIZE_T size, SIZE_T* numberOfBytesWritten)
78*f6dc9357SAndroid Build Coastguard Worker     { return BOOLToBool(::WriteProcessMemory(_handle, baseAddress,
79*f6dc9357SAndroid Build Coastguard Worker       #ifdef Z7_OLD_WIN_SDK
80*f6dc9357SAndroid Build Coastguard Worker         (LPVOID)
81*f6dc9357SAndroid Build Coastguard Worker       #endif
82*f6dc9357SAndroid Build Coastguard Worker       buffer,
83*f6dc9357SAndroid Build Coastguard Worker       size, numberOfBytesWritten)); }
84*f6dc9357SAndroid Build Coastguard Worker 
85*f6dc9357SAndroid Build Coastguard Worker   bool FlushInstructionCache(LPCVOID baseAddress = NULL, SIZE_T size = 0)
86*f6dc9357SAndroid Build Coastguard Worker     { return BOOLToBool(::FlushInstructionCache(_handle, baseAddress, size)); }
87*f6dc9357SAndroid Build Coastguard Worker 
VirtualAlloc(LPVOID address,SIZE_T size,DWORD allocationType,DWORD protect)88*f6dc9357SAndroid Build Coastguard Worker   LPVOID VirtualAlloc(LPVOID address, SIZE_T size, DWORD allocationType, DWORD protect)
89*f6dc9357SAndroid Build Coastguard Worker     { return VirtualAllocEx(_handle, address, size, allocationType, protect);  }
90*f6dc9357SAndroid Build Coastguard Worker 
VirtualFree(LPVOID address,SIZE_T size,DWORD freeType)91*f6dc9357SAndroid Build Coastguard Worker   bool VirtualFree(LPVOID address, SIZE_T size, DWORD freeType)
92*f6dc9357SAndroid Build Coastguard Worker     { return BOOLToBool(::VirtualFreeEx(_handle, address, size, freeType)); }
93*f6dc9357SAndroid Build Coastguard Worker 
94*f6dc9357SAndroid Build Coastguard Worker   // Process Status API (PSAPI)
95*f6dc9357SAndroid Build Coastguard Worker 
96*f6dc9357SAndroid Build Coastguard Worker   /*
97*f6dc9357SAndroid Build Coastguard Worker   bool EmptyWorkingSet()
98*f6dc9357SAndroid Build Coastguard Worker     { return BOOLToBool(::EmptyWorkingSet(_handle)); }
99*f6dc9357SAndroid Build Coastguard Worker   bool EnumModules(HMODULE *hModules, DWORD arraySizeInBytes, LPDWORD receivedBytes)
100*f6dc9357SAndroid Build Coastguard Worker     { return BOOLToBool(::EnumProcessModules(_handle, hModules, arraySizeInBytes, receivedBytes)); }
101*f6dc9357SAndroid Build Coastguard Worker   DWORD MyGetModuleBaseName(HMODULE hModule, LPTSTR baseName, DWORD size)
102*f6dc9357SAndroid Build Coastguard Worker     { return ::GetModuleBaseName(_handle, hModule, baseName, size); }
103*f6dc9357SAndroid Build Coastguard Worker   bool MyGetModuleBaseName(HMODULE hModule, CSysString &name)
104*f6dc9357SAndroid Build Coastguard Worker   {
105*f6dc9357SAndroid Build Coastguard Worker     const unsigned len = MAX_PATH + 100;
106*f6dc9357SAndroid Build Coastguard Worker     const DWORD resultLen = MyGetModuleBaseName(hModule, name.GetBuf(len), len);
107*f6dc9357SAndroid Build Coastguard Worker     name.ReleaseBuf_CalcLen(len);
108*f6dc9357SAndroid Build Coastguard Worker     return (resultLen != 0);
109*f6dc9357SAndroid Build Coastguard Worker   }
110*f6dc9357SAndroid Build Coastguard Worker 
111*f6dc9357SAndroid Build Coastguard Worker   DWORD MyGetModuleFileNameEx(HMODULE hModule, LPTSTR baseName, DWORD size)
112*f6dc9357SAndroid Build Coastguard Worker     { return ::GetModuleFileNameEx(_handle, hModule, baseName, size); }
113*f6dc9357SAndroid Build Coastguard Worker   bool MyGetModuleFileNameEx(HMODULE hModule, CSysString &name)
114*f6dc9357SAndroid Build Coastguard Worker   {
115*f6dc9357SAndroid Build Coastguard Worker     const unsigned len = MAX_PATH + 100;
116*f6dc9357SAndroid Build Coastguard Worker     const DWORD resultLen = MyGetModuleFileNameEx(hModule, name.GetBuf(len), len);
117*f6dc9357SAndroid Build Coastguard Worker     name.ReleaseBuf_CalcLen(len);
118*f6dc9357SAndroid Build Coastguard Worker     return (resultLen != 0);
119*f6dc9357SAndroid Build Coastguard Worker   }
120*f6dc9357SAndroid Build Coastguard Worker 
121*f6dc9357SAndroid Build Coastguard Worker   bool GetModuleInformation(HMODULE hModule, LPMODULEINFO moduleInfo)
122*f6dc9357SAndroid Build Coastguard Worker     { return BOOLToBool(::GetModuleInformation(_handle, hModule, moduleInfo, sizeof(MODULEINFO))); }
123*f6dc9357SAndroid Build Coastguard Worker   bool GetMemoryInfo(PPROCESS_MEMORY_COUNTERS memCounters)
124*f6dc9357SAndroid Build Coastguard Worker     { return BOOLToBool(::GetProcessMemoryInfo(_handle, memCounters, sizeof(PROCESS_MEMORY_COUNTERS))); }
125*f6dc9357SAndroid Build Coastguard Worker   */
126*f6dc9357SAndroid Build Coastguard Worker 
127*f6dc9357SAndroid Build Coastguard Worker   #endif
128*f6dc9357SAndroid Build Coastguard Worker 
129*f6dc9357SAndroid Build Coastguard Worker   WRes Create(LPCWSTR imageName, const UString &params, LPCWSTR curDir);
130*f6dc9357SAndroid Build Coastguard Worker 
Wait()131*f6dc9357SAndroid Build Coastguard Worker   DWORD Wait() { return ::WaitForSingleObject(_handle, INFINITE); }
132*f6dc9357SAndroid Build Coastguard Worker };
133*f6dc9357SAndroid Build Coastguard Worker 
134*f6dc9357SAndroid Build Coastguard Worker WRes MyCreateProcess(LPCWSTR imageName, const UString &params);
135*f6dc9357SAndroid Build Coastguard Worker 
136*f6dc9357SAndroid Build Coastguard Worker }
137*f6dc9357SAndroid Build Coastguard Worker 
138*f6dc9357SAndroid Build Coastguard Worker #endif
139