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 ¶ms, 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 ¶ms); 135*f6dc9357SAndroid Build Coastguard Worker 136*f6dc9357SAndroid Build Coastguard Worker } 137*f6dc9357SAndroid Build Coastguard Worker 138*f6dc9357SAndroid Build Coastguard Worker #endif 139