已知一个进程的pid,如何获得某时刻该进程占用的CPU、内存、虚拟内存、句柄数等信息!
已知一个进程的pid,如何获得某时刻该进程占用的CPU、内存、虚拟内存、句柄数等信息! 用c或Java 实现。或给出c代码
[解决办法]
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#ifndef STATUS_INFO_LENGTH_MISMATCH
#define STATUS_INFO_LENGTH_MISMATCH ((DWORD )0xC0000004L)
#endif
typedef struct
{
FILETIME ftCreationTime;
DWORD dwUnknown1;
DWORD dwStartAddress;
DWORD dwOwningPID;
DWORD dwThreadID;
DWORD dwCurrentPriority;
DWORD dwBasePriority;
DWORD dwContextSwitches;
DWORD dwThreadState;
DWORD dwWaitReason;
DWORD dwUnknown2[5];
} THREADINFO, *PTHREADINFO;
#pragma warning( disable:4200 ) // Zero sized array
typedef struct
{
DWORD dwRelativeOffset; //相对偏移量
DWORD dwThreadCount; //线程数目
DWORD dwUnknown1[6];
FILETIME pfCreateTime;
DWORD dwUnknown2[5];
WCHAR* pszProcessName; //不带路径的名称
DWORD dwBasePriority; //优先级
DWORD dwProcessID; //进程ID
DWORD dwParentProcessID; //父进程ID
DWORD dwHandleCount; //句柄数目
DWORD dwUnknown3;
DWORD dwUnknown4;
DWORD dwVirtualBytesPeak;
DWORD dwTotalVirtualBytes;
DWORD dwPageFaults;
DWORD dwWorkingSetPeak;
DWORD dwTotalWorkingSet; //占用物理内存大小
DWORD dwPeakPagedPoolUsagePages;
DWORD dwTotalPagedPoolUsagePages;
DWORD dwPeakNonPagedPoolUsagePages;
DWORD dwTotalNonPagedPoolUsagePages;
DWORD dwPageFileBytesPeak;
DWORD dwPrivateBytes;
DWORD dwPageFileBytes;
DWORD dwUnknown7[4];
THREADINFO ti[0];
} _PROCESSINFO, *PPROCESSINFO;
#pragma warning( default:4200 )
DWORD (__stdcall *NtQuerySystemInformation )(ULONG,PVOID,ULONG,ULONG);
void ShowPI(void)
{
PBYTE pbyInfo = NULL;
PPROCESSINFO pProcessInfo;
DWORD dwSize = 0x4000;
WCHAR *pname;
if (!NtQuerySystemInformation)
NtQuerySystemInformation=(DWORD (__stdcall*)(ULONG,PVOID,ULONG,ULONG))
GetProcAddress(GetModuleHandle( "ntdll.dll "), "NtQuerySystemInformation ");
pbyInfo=(PBYTE) malloc(dwSize);
if (pbyInfo)
{
for(;;)
{
memset(pbyInfo,0,dwSize);
if(NtQuerySystemInformation(5,pbyInfo,dwSize,0)!=STATUS_INFO_LENGTH_MISMATCH
)
break;
dwSize += 0x1000;
pbyInfo=(PBYTE) realloc(pbyInfo,dwSize);
}
pProcessInfo = ( PPROCESSINFO ) pbyInfo;
for(;;)
{
pname=pProcessInfo->pszProcessName;
if (!pname)
pname=(L "Idle ");
printf( "%-40ls %-12lu %12luK\n ",
pname,
pProcessInfo->dwProcessID,
pProcessInfo->dwTotalWorkingSet/1024ul
);
if ( pProcessInfo->dwRelativeOffset == 0 )
break;
pProcessInfo=(PPROCESSINFO)((PBYTE)pProcessInfo+pProcessInfo->dwRelativeOffset);
}
free( pbyInfo );
}
}
int main(void)
{
ShowPI();
getchar();
return 0;
}