using System.Collections.Generic; using System.Text; using System.Security.Principal; using System; using System.Diagnostics; using System.IO; using System.Management; using System.Threading.Tasks; using System.Windows.Forms; using Flowframes.IO; using DiskDetector; using DiskDetector.Models; using Microsoft.VisualBasic.Devices; using Flowframes.Extensions; using Flowframes.MiscUtils; using System.Threading; using System.Linq; namespace Flowframes.OS { class OSUtils { public static bool IsUserAdministrator() { //bool value to hold our return value bool isAdmin; WindowsIdentity user = null; try { //get the currently logged in user user = WindowsIdentity.GetCurrent(); WindowsPrincipal principal = new WindowsPrincipal(user); isAdmin = principal.IsInRole(WindowsBuiltInRole.Administrator); } catch (Exception e) { Logger.Log("IsUserAdministrator() Error: " + e.Message); isAdmin = false; } finally { if (user != null) user.Dispose(); } return isAdmin; } public static Process SetStartInfo(Process proc, bool hidden, string filename = "cmd.exe") { proc.StartInfo.UseShellExecute = !hidden; proc.StartInfo.RedirectStandardOutput = hidden; proc.StartInfo.RedirectStandardError = hidden; proc.StartInfo.CreateNoWindow = hidden; proc.StartInfo.FileName = filename; return proc; } public static Process NewProcess(bool hidden, string filename = "cmd.exe") { Process proc = new Process(); return SetStartInfo(proc, hidden, filename); } public static void KillProcessTree(int pid) { ManagementObjectSearcher processSearcher = new ManagementObjectSearcher ("Select * From Win32_Process Where ParentProcessID=" + pid); ManagementObjectCollection processCollection = processSearcher.Get(); try { Process proc = Process.GetProcessById(pid); if (!proc.HasExited) proc.Kill(); } catch (ArgumentException) { // Process already exited. } if (processCollection != null) { foreach (ManagementObject mo in processCollection) { KillProcessTree(Convert.ToInt32(mo["ProcessID"])); //kill child processes(also kills childrens of childrens etc.) } } } public static string GetCmdArg() { bool stayOpen = Config.GetInt("cmdDebugMode") == 2; if (stayOpen) return "/K"; else return "/C"; } public static bool ShowHiddenCmd() { return Config.GetInt("cmdDebugMode") > 0; } public static bool DriveIsSSD(string path) { try { var detectedDrives = Detector.DetectFixedDrives(QueryType.SeekPenalty); if (detectedDrives.Count != 0) { char pathDriveLetter = (path[0].ToString().ToUpper())[0]; foreach (var detectedDrive in detectedDrives) { if (detectedDrive.DriveLetter == pathDriveLetter && detectedDrive.HardwareType.ToString().ToLower().Trim() == "ssd") return true; } } } catch (Exception e) { Logger.Log("Failed to detect drive type: " + e.Message); return true; // Default to SSD on fail } return false; } public static bool HasNonAsciiChars(string str) { return (Encoding.UTF8.GetByteCount(str) != str.Length); } public static int GetFreeRamMb() { try { return (int)(new ComputerInfo().AvailablePhysicalMemory / 1048576); } catch { return 1000; } } public static string TryGetOs() { string info = ""; try { using (ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_OperatingSystem")) { ManagementObjectCollection information = searcher.Get(); if (information != null) { foreach (ManagementObject obj in information) info = $"{obj["Caption"]} | {obj["OSArchitecture"]}"; } info = info.Replace("NT 5.1.2600", "XP").Replace("NT 5.2.3790", "Server 2003"); } } catch (Exception e) { Logger.Log("TryGetOs Error: " + e.Message, true); } return info; } public static IEnumerable GetChildProcesses(Process process) { List children = new List(); ManagementObjectSearcher mos = new ManagementObjectSearcher(String.Format("Select * From Win32_Process Where ParentProcessID={0}", process.Id)); foreach (ManagementObject mo in mos.Get()) { children.Add(Process.GetProcessById(Convert.ToInt32(mo["ProcessID"]))); } return children; } public static async Task GetOutputAsync(Process process, bool onlyLastLine = false) { Logger.Log($"Getting output for {process.StartInfo.FileName} {process.StartInfo.Arguments}", true); NmkdStopwatch sw = new NmkdStopwatch(); Stopwatch timeSinceLastOutput = new Stopwatch(); timeSinceLastOutput.Restart(); string output = ""; process.OutputDataReceived += (object sender, DataReceivedEventArgs e) => output += $"{e.Data}\n"; process.ErrorDataReceived += (object sender, DataReceivedEventArgs e) => output += $"{e.Data}\n"; process.Start(); process.BeginOutputReadLine(); process.BeginErrorReadLine(); while (!process.HasExited) await Task.Delay(50); while (timeSinceLastOutput.ElapsedMilliseconds < 100) await Task.Delay(50); output = output.Trim('\r', '\n'); Logger.Log($"Output (after {sw.GetElapsedStr()}): " + output.Replace("\r", " / ").Replace("\n", " / "), true); if (onlyLastLine) output = output.SplitIntoLines().LastOrDefault(); return output; } } }