网上有很多代码,几乎就是一样的。
定义一个_THREAD_INFO结构;
定义一个_UNICODE_STRING结构;
定义一个_PROCESS_INFO结构;
利用ntdll.dll中的NtQuerySystemInformation函数来查询进程信息;
NtQuerySystemInformation(5,pProcInfo,dwInfoSize,0);
pProcessInfo = (PPROCESSINFO)pProcInfo;
接下来就是一个do - while循环:
do
{
TotalProcessCPUUsage += (__int64)pProcessInfo->KernelTime.QuadPart + (__int64)pProcessInfo->UserTime.QuadPart;
if(pProcessInfo->dwProcessID == id)
{
dwWorkingSet = pProcessInfo->dwWorkingSet; 
CurrentProcessCPUUsage += (__int64)pProcessInfo->KernelTime.QuadPart + (__int64)pProcessInfo->UserTime.QuadPart;
}
/////////
if(pProcessInfo->dwOffset == 0)
{
break;
}
pProcessInfo = (PPROCESSINFO)((BYTE*)pProcessInfo + pProcessInfo->dwOffset);
}
很多地方都有转载这段代码,但没有人能说清楚这段代码是什么意思!小弟有如下几个问题想请教:
1、这段代码在WINDOWS2008下运行会异常,调试了一下从pProcessInfo = (PPROCESSINFO)pProcInfo开始就不会了。pProcessInfo中的数值都太大,而且进程ID也没有传进来。这是为什么?
我尝试把NtQuerySystemInformation换成ZwQuerySystemInformation,把5号方法换成3号方法,但结果是一样的。
2、do-while循环中的代码到底是什么原理?
有没有哪位大侠能指点指点啊!不胜感谢啊!

解决方案 »

  1.   

    NtQuerySystemInformation 只适用于2000和XP的。win2008属于WIN7范畴,会无效的。
      

  2.   

    MSDN:[NtQuerySystemInformation is available for use in Windows 2000 and Windows XP. It may be altered or unavailable in subsequent versions. Applications should use the alternate functions listed in this topic.]
      

  3.   


    谢谢楼上的。我也查到了。好像还有个NtQuerySystemInformationEx的函数,这个函数可以在WINDOWS2008下用吗?有人知道这个函数的参数吗?另外,如果这条路走不通。那怎么办呢?还有没有其它办法可以同时在WINDOWS2003/XP和WINDOWS2008/WIN7系统下查询进程的CPU占用率的?多谢多谢啊!!!
      

  4.   

    我自己用GetProcessTimes搞定了。也可以计算CPU占用率。
      

  5.   


    用GetProcessTimes如何搞定,指点一二啊!能否说下实现原理?