publicstatic ProcessInfo[] GetProcessInfos(string machineName) { bool isRemoteMachine = IsRemoteMachine(machineName); if (IsNt) { // Do not use performance counter for local machine with Win2000 and above if( !isRemoteMachine && (Environment.OSVersion.Version.Major >= 5 )) { return NtProcessInfoHelper.GetProcessInfos(); } return NtProcessManager.GetProcessInfos(machineName, isRemoteMachine); }
else { if (isRemoteMachine) thrownew PlatformNotSupportedException(SR.GetString(SR.WinNTRequiredForRemote)); return WinProcessManager.GetProcessInfos(); } }
接着往下看就能看到C#是如何取进程ID的了。有下面几种实现:
Windows 2000以上的系统用NtProcessInfoHelper.GetProcessInfos()。实现就是使用NtQuerySystemInformation函数,根据参数SYSTEM_PROCESS_INFORMATION,可以获取包含所有进程信息的一个数组。
Windows NT以上Windows2000以下用NtProcessManager.GetProcessInfos。实现就是通过PerformanceCounterLib来获取进程数组。