转自:http://social.microsoft.com/Forums/zh-CN/visualcpluszhchs/thread/bc4ad328-39e6-418b-9deb-a1b0fa7351cf
首先,谢谢版主,代码是C#的不太熟悉。(使用的是
GetProcessTimes函数)
问题自己已经解决了,把要点说一下,希望对其他朋友有用。
我使用的是函数NtQuerySystemInformation(ZwQuerySystemInformation),用这个函数可以查很多系统信
息。可以查一下MSDN不过介绍的不过,网上说是微软未公布的Native API。看一下函数原型:
typedef NTSTATUS (__stdcall *NTQUERYSYSTEMINFORMATION)
(IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
IN OUT PVOID SystemInformation,
IN ULONG SystemInformationLength,
OUT PULONG ReturnLength OPTIONAL);
NTQUERYSYSTEMINFORMATION
NtQuerySystemInformation;
NtQuerySystemInformation这个函数有四个参数:
第一个参数是dwRecordType,这个参数指定了我们所查询的系统信息类型,为了查询系统PROCESS信息,我们定义一个常量#define
NT_PROCESS_INOF 5(谁有更详细的资料可以共享出来)。
第二个参数是一个指针,这个指针用来返回系统句柄列表,在调用NtQuerySystemInformation函数之前,必须为这个指针分配足够的内存
空间,否则函数调用会出错。
第三个参数是指定你为HandleList所分配的内存空间大小,单位是byte。
第四个参数是NtQuerySystemInformation返回的HandleList的大小;如果
NtQuerySystemInformation函数调用成功,返回值将是0,否则可以使用GetLastError()获得详细的错误代码。
从中可以看到,SystemInformationClass是一个类型信息,它大概提供了50余种信
息,也就是我们可以通过这个函数对大约50多种
的系统信息进行探测或设置。SystemInformation是一个LPVOID型的指针,它为我们提供需要获得的信息,或是我们需要设置的系统信息。
SystemInformationLength是SystemInformation的长度,它根据探测的信息类型来决定。至于
ReturnLength则是系统返回的需要的长度,通常可以设置为空指针(NULL)。
使用这个函数的时候要动态加载“NTDLL.dll”
计算进程CPU的使用率就是计算进程占用CPU的时间:
CPUsage = 100 * CurrentProcessCPUsage /
TotalProcessCPUsage;
CurrentProcessCPUsage = CurrentProcess.KernelTime +
CurrentProcess.UserTime
TotalProcessCPUsage = TotalProcess.KernelTime +
TotalProcess.UserTime
有什么不正确或不全的,请大家指出来,一起学习进步!