guiconsole_define.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422
  1. #include "guiconsole_define.h"
  2. #include <winpr/sysinfo.h>
  3. #include <EventCode.h>
  4. #include <unordered_map>
  5. #include <cmath>
  6. std::string GenerateTimeStr()
  7. {
  8. SYSTEMTIME st;
  9. GetLocalTime(&st);
  10. CSimpleString timeStr = CSimpleString::Format("[%04d-%02d-%02d %02d:%02d:%02d]", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
  11. return timeStr.GetData();
  12. }
  13. #ifdef RVC_OS_WIN
  14. #include <windows.h>
  15. #include <psapi.h>
  16. #include <lmcons.h>
  17. #include <tchar.h>
  18. #include <tlhelp32.h>
  19. #include <assert.h>
  20. #include <conio.h>
  21. #include <pdh.h>
  22. #include <math.h>
  23. #include <map>
  24. #include <chrono>
  25. #include <thread>
  26. // memInfo ½á¹¹Ìå
  27. struct memInfo {
  28. ULONGLONG TotalMemory;
  29. ULONGLONG UsedMemory;
  30. double UsedMemoryPerc;
  31. ULONGLONG TotalPageMemory;
  32. ULONGLONG UsedPageMemory;
  33. double UsedPageMemoryPerc;
  34. ULONGLONG UpTime;
  35. // Constructor to initialize the fields
  36. memInfo()
  37. : TotalMemory(0),
  38. UsedMemory(0),
  39. UsedMemoryPerc(0.0),
  40. TotalPageMemory(0),
  41. UsedPageMemory(0),
  42. UsedPageMemoryPerc(0.0),
  43. UpTime(0)
  44. {}
  45. };
  46. static ULONGLONG SubtractTimes(const FILETIME* A, const FILETIME* B)
  47. {
  48. LARGE_INTEGER lA, lB;
  49. lA.LowPart = A->dwLowDateTime;
  50. lA.HighPart = A->dwHighDateTime;
  51. lB.LowPart = B->dwLowDateTime;
  52. lB.HighPart = B->dwHighDateTime;
  53. return lA.QuadPart - lB.QuadPart;
  54. }
  55. void PollMemInfo(memInfo& info)
  56. {
  57. MEMORYSTATUSEX MemoryInfo;
  58. MemoryInfo.dwLength = sizeof(MEMORYSTATUSEX);
  59. GlobalMemoryStatusEx(&MemoryInfo);
  60. info.TotalMemory = TO_MB(MemoryInfo.ullTotalPhys);
  61. info.UsedMemory = TO_MB(MemoryInfo.ullTotalPhys - MemoryInfo.ullAvailPhys);
  62. info.UsedMemoryPerc = (double)info.UsedMemory / (double)info.TotalMemory;
  63. info.TotalPageMemory = TO_MB(MemoryInfo.ullTotalPageFile);
  64. info.UsedPageMemory = TO_MB(MemoryInfo.ullTotalPageFile - MemoryInfo.ullAvailPageFile);
  65. info.UsedPageMemoryPerc = (double)info.UsedPageMemory / (double)info.TotalPageMemory;
  66. info.UpTime = GetTickCount64();
  67. }
  68. typedef struct system_times
  69. {
  70. FILETIME IdleTime, KernelTime, UserTime;
  71. } system_times;
  72. typedef struct process_times
  73. {
  74. FILETIME CreationTime, ExitTime, KernelTime, UserTime;
  75. } process_times;
  76. __int64 Filetime2Int64(const FILETIME& ftime)
  77. {
  78. LARGE_INTEGER li;
  79. li.LowPart = ftime.dwLowDateTime;
  80. li.HighPart = ftime.dwHighDateTime;
  81. return li.QuadPart;
  82. }
  83. __int64 CompareFileTime2(const FILETIME& preTime, const FILETIME& nowTime)
  84. {
  85. return Filetime2Int64(nowTime) - Filetime2Int64(preTime);
  86. }
  87. std::pair<long, std::string> PollProcessList(long UpdateTime, system_monitor_status& curStatus)
  88. {
  89. HANDLE Snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);
  90. if (!Snapshot)
  91. return std::make_pair(0, "");
  92. PROCESSENTRY32 Entry;
  93. Entry.dwSize = sizeof(Entry);
  94. BOOL Status = Process32First(Snapshot, &Entry);
  95. if (!Status)
  96. return std::make_pair(0, "");
  97. memInfo info;
  98. PollMemInfo(info);
  99. HANDLE curHandle = NULL; // curProcess Handle
  100. std::map<int, process_times> cpuTimes;//calculate cpu time
  101. for (; Status; Status = Process32Next(Snapshot, &Entry)) {
  102. processStatus Process;
  103. Process.ID = Entry.th32ProcessID;
  104. if (Process.ID == 0)
  105. continue;
  106. //Process.HandleCount = Entry.cntThreads;
  107. //Process.BasePriority = Entry.pcPriClassBase;
  108. //Process.ParentPID = Entry.th32ParentProcessID;
  109. Process.processName = Entry.szExeFile;
  110. _tcsncpy_s(Process.UserName, UNLEN, _T("SYSTEM"), UNLEN);
  111. curHandle = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, Entry.th32ProcessID);
  112. if (curHandle) {
  113. DWORD handleCount = 0;
  114. GetProcessHandleCount(curHandle, &handleCount);
  115. Process.HandleCount = handleCount;
  116. PROCESS_MEMORY_COUNTERS_EX ProcMemCounters;
  117. if (GetProcessMemoryInfo(curHandle, (PROCESS_MEMORY_COUNTERS*)&ProcMemCounters, sizeof(ProcMemCounters))) {
  118. Process.UsedMemory = (unsigned __int64)TO_MB(ProcMemCounters.WorkingSetSize);
  119. Process.PercentMemory = (double)Process.UsedMemory / (double)info.TotalMemory;
  120. }
  121. HANDLE ProcessTokenHandle;
  122. if (OpenProcessToken(curHandle, TOKEN_READ, &ProcessTokenHandle)) {
  123. DWORD ReturnLength;
  124. GetTokenInformation(ProcessTokenHandle, TokenUser, 0, 0, &ReturnLength);
  125. if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
  126. PTOKEN_USER TokenUserStruct = (PTOKEN_USER)malloc(ReturnLength);
  127. if (GetTokenInformation(ProcessTokenHandle, TokenUser, TokenUserStruct, ReturnLength, &ReturnLength)) {
  128. SID_NAME_USE NameUse;
  129. DWORD NameLength = UNLEN;
  130. TCHAR DomainName[MAX_PATH];
  131. DWORD DomainLength = MAX_PATH;
  132. LookupAccountSid(0, TokenUserStruct->User.Sid, Process.UserName, &NameLength, DomainName, &DomainLength, &NameUse);
  133. Process.UserName[9] = 0;
  134. }
  135. free(TokenUserStruct);
  136. }
  137. CloseHandle(ProcessTokenHandle);
  138. }
  139. CloseHandle(curHandle);
  140. }
  141. curStatus.processList.push_back(Process);
  142. HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, Entry.th32ProcessID);
  143. if (hProcess) {
  144. // »ñÈ¡³õʼ CPU ʱ¼ä
  145. FILETIME ftCreation, ftExit, ftKernel, ftUser;
  146. if (!GetProcessTimes(hProcess, &ftCreation, &ftExit, &ftKernel, &ftUser)) {
  147. CloseHandle(hProcess);
  148. continue;
  149. }
  150. process_times srcTime;
  151. srcTime.CreationTime = ftCreation;
  152. srcTime.ExitTime = ftExit;
  153. srcTime.KernelTime = ftKernel;
  154. srcTime.UserTime = ftUser;
  155. cpuTimes[Process.ID] = srcTime;
  156. CloseHandle(hProcess);
  157. }
  158. }
  159. CloseHandle(Snapshot);
  160. FILETIME preIdleTime;
  161. FILETIME preKernelTime;
  162. FILETIME preUserTime;
  163. GetSystemTimes(&preIdleTime, &preKernelTime, &preUserTime);
  164. std::this_thread::sleep_for(std::chrono::seconds(UpdateTime));
  165. FILETIME idleTime;
  166. FILETIME kernelTime;
  167. FILETIME userTime;
  168. GetSystemTimes(&idleTime, &kernelTime, &userTime);
  169. auto idle = CompareFileTime2(preIdleTime, idleTime);
  170. auto kernel = CompareFileTime2(preKernelTime, kernelTime);
  171. auto user = CompareFileTime2(preUserTime, userTime);
  172. for (auto &it : curStatus.processList)
  173. {
  174. FILETIME ftCreation, ftExit, ftKernel, ftUser;
  175. HANDLE hProcess;
  176. ULARGE_INTEGER ulKernelStart, ulUserStart, ulKernelEnd, ulUserEnd;
  177. hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, it.ID);
  178. if (hProcess == NULL) {
  179. continue;
  180. }
  181. if (!GetProcessTimes(hProcess, &ftCreation, &ftExit, &ftKernel, &ftUser)) {
  182. CloseHandle(hProcess);
  183. continue;
  184. }
  185. if (cpuTimes.find(it.ID) == cpuTimes.end())
  186. continue;
  187. ulKernelStart.LowPart = cpuTimes[it.ID].KernelTime.dwLowDateTime;
  188. ulKernelStart.HighPart = cpuTimes[it.ID].KernelTime.dwHighDateTime;
  189. ulUserStart.LowPart = cpuTimes[it.ID].UserTime.dwLowDateTime;
  190. ulUserStart.HighPart = cpuTimes[it.ID].UserTime.dwHighDateTime;
  191. ulKernelEnd.LowPart = ftKernel.dwLowDateTime;
  192. ulKernelEnd.HighPart = ftKernel.dwHighDateTime;
  193. ulUserEnd.LowPart = ftUser.dwLowDateTime;
  194. ulUserEnd.HighPart = ftUser.dwHighDateTime;
  195. ULONGLONG kernelDiff = ulKernelEnd.QuadPart - ulKernelStart.QuadPart;
  196. ULONGLONG userDiff = ulUserEnd.QuadPart - ulUserStart.QuadPart;
  197. ULONGLONG totalDiff = kernelDiff + userDiff;
  198. double cpuUsage = 100.0 * totalDiff / (kernel + user);
  199. it.PercentProcessorTime = cpuUsage / 100.0;
  200. CloseHandle(hProcess);
  201. }
  202. /*
  203. //get total system information
  204. DWORD NewProcessCount = curStatus.processList.size();
  205. process_times* ProcessTimes = (process_times*)malloc(NewProcessCount * sizeof(*ProcessTimes));
  206. for (DWORD ProcIndex = 0; ProcIndex < NewProcessCount; ProcIndex++) {
  207. processStatus* Process = &curStatus.processList[ProcIndex];
  208. process_times* ProcessTime = &ProcessTimes[ProcIndex];
  209. if (curHandle) {
  210. GetProcessTimes(curHandle, &ProcessTime->CreationTime, &ProcessTime->ExitTime, &ProcessTime->KernelTime, &ProcessTime->UserTime);
  211. IO_COUNTERS IoCounters;
  212. if (GetProcessIoCounters(curHandle, &IoCounters)) {
  213. Process->DiskOperationsPrev = IoCounters.ReadTransferCount + IoCounters.WriteTransferCount;
  214. }
  215. }
  216. }
  217. Sleep(UpdateTime);
  218. system_times SysTimes;
  219. GetSystemTimes(&SysTimes.IdleTime, &SysTimes.KernelTime, &SysTimes.UserTime);
  220. ULONGLONG SysKernelDiff = SubtractTimes(&SysTimes.KernelTime, &PrevSysTimes.KernelTime);
  221. ULONGLONG SysUserDiff = SubtractTimes(&SysTimes.UserTime, &PrevSysTimes.UserTime);
  222. ULONGLONG SysIdleDiff = SubtractTimes(&SysTimes.IdleTime, &PrevSysTimes.IdleTime);
  223. int RunningProcessCount = 0;
  224. for (DWORD ProcIndex = 0; ProcIndex < NewProcessCount; ProcIndex++) {
  225. process_times ProcessTime = { 0 };
  226. process_times* PrevProcessTime = &ProcessTimes[ProcIndex];
  227. processStatus* Process = &curStatus.processList[ProcIndex];
  228. if (curHandle) {
  229. GetProcessTimes(curHandle, &ProcessTime.CreationTime, &ProcessTime.ExitTime, &ProcessTime.KernelTime, &ProcessTime.UserTime);
  230. ULONGLONG ProcKernelDiff = SubtractTimes(&ProcessTime.KernelTime, &PrevProcessTime->KernelTime);
  231. ULONGLONG ProcUserDiff = SubtractTimes(&ProcessTime.UserTime, &PrevProcessTime->UserTime);
  232. ULONGLONG TotalSys = SysKernelDiff + SysUserDiff;
  233. ULONGLONG TotalProc = ProcKernelDiff + ProcUserDiff;
  234. if (TotalSys > 0) {
  235. Process->PercentProcessorTime = (double)((100.0 * (double)TotalProc) / (double)TotalSys);
  236. if (Process->PercentProcessorTime >= 0.01) {
  237. RunningProcessCount++;
  238. }
  239. }
  240. FILETIME SysTime;
  241. GetSystemTimeAsFileTime(&SysTime);
  242. //Process->UpTime = SubtractTimes(&SysTime, &ProcessTime.CreationTime) / 10000;
  243. /* get disk information
  244. IO_COUNTERS IoCounters;
  245. if (GetProcessIoCounters(curHandle, &IoCounters)) {
  246. Process->DiskOperations = IoCounters.ReadTransferCount + IoCounters.WriteTransferCount;
  247. Process->DiskUsage = (DWORD)((Process->DiskOperations - Process->DiskOperationsPrev) * (1000 / UpdateTime));
  248. }
  249. CloseHandle(curHandle);
  250. curHandle = NULL;
  251. }
  252. }
  253. free(ProcessTimes);
  254. // Since we have the values already we can compute CPU usage too
  255. ULONGLONG SysTime = SysKernelDiff + SysUserDiff;
  256. if (SysTime > 0) {
  257. double Percentage = (double)(SysTime - SysIdleDiff) / (double)SysTime;
  258. curStatus.total_cpu = min(Percentage, 1.0);
  259. }
  260. curStatus.TotalMemory = info.TotalMemory;
  261. curStatus.UsedMemory = info.UsedMemory;
  262. curStatus.UsedMemoryPerc = info.UsedMemoryPerc;
  263. curStatus.TotalPageMemory = info.TotalPageMemory;
  264. curStatus.UsedPageMemory = info.UsedPageMemory;
  265. curStatus.UsedPageMemoryPerc = info.UsedPageMemoryPerc;
  266. curStatus.total_uptime = info.UpTime;
  267. */
  268. return std::make_pair(0, "");
  269. }
  270. #else
  271. #include "linux_system_monitor/system.h"
  272. std::pair<long, std::string> PollProcessList(long UpdateTime, system_monitor_status& curStatus)
  273. {
  274. System system;
  275. auto processArr = system.Processes();
  276. curStatus.processList.clear();
  277. for (auto it : processArr)
  278. {
  279. processStatus cur;
  280. cur.ID = it.Pid();
  281. cur.processName = it.name();
  282. char buffer[20];
  283. std::sprintf(buffer, "%.2f", it.CpuUtilization());
  284. cur.PercentProcessorTime = std::atof(buffer);
  285. cur.UsedMemory = std::stoi(it.Ram());
  286. cur.HandleCount = it.fdHandles();
  287. curStatus.processList.push_back(cur);
  288. }
  289. return std::make_pair(0, "");
  290. }
  291. #endif
  292. static const std::unordered_map<LogTypeEnum, std::string> logTypeEnumToString = {
  293. {LogTypeEnum::Log_Ignore, "Ignore"},
  294. {LogTypeEnum::Log_Event, "Event"},
  295. {LogTypeEnum::Log_Warning, "Warning"},
  296. {LogTypeEnum::Log_Error, "Error"},
  297. {LogTypeEnum::Log_Debug, "Debug"},
  298. {LogTypeEnum::Log_Fatal, "Fatal"}
  299. };
  300. static const std::unordered_map<std::string, LogTypeEnum> stringToLogTypeEnum = {
  301. {"Ignore", LogTypeEnum::Log_Ignore},
  302. {"Event", LogTypeEnum::Log_Event},
  303. {"Warning", LogTypeEnum::Log_Warning},
  304. {"Error", LogTypeEnum::Log_Error},
  305. {"Debug", LogTypeEnum::Log_Debug},
  306. {"Fatal", LogTypeEnum::Log_Fatal}
  307. };
  308. std::string LogTypeEnumToString(LogTypeEnum logType) {
  309. auto it = logTypeEnumToString.find(logType);
  310. if (it != logTypeEnumToString.end()) {
  311. return it->second;
  312. }
  313. else {
  314. return "Unknown";
  315. }
  316. }
  317. LogTypeEnum StringToLogTypeEnum(const std::string& logTypeStr) {
  318. auto it = stringToLogTypeEnum.find(logTypeStr);
  319. if (it != stringToLogTypeEnum.end()) {
  320. return it->second;
  321. }
  322. else
  323. return LogTypeEnum::Log_Warning;
  324. }
  325. void startProcess(std::string cmdline, bool isWait)
  326. {
  327. }