typedef struct _THREAD_INFO { LARGE_INTEGER CreateTime; DWORD dwUnknown1; DWORD dwStartAddress; DWORD StartEIP; DWORD dwOwnERPID; DWORD dwThreadId; DWORD dwCurrentPriority; DWORD dwBasePriority; DWORD dwContextSwitches; DWORD Unknown; DWORD WaitReason; } THREADINFO, *PTHREADINFO; typedef struct _UNICODE_STRING { USHORT Length; USHORT MaxLength; PWSTR Buffer; } UNICODE_STRING; typedef struct _PROCESS_INFO { DWORD dwOffset; DWORD dwThreadsCount; DWORD dwUnused1[6]; LARGE_INTEGER CreateTime; LARGE_INTEGER UserTime; LARGE_INTEGER KernelTime; UNICODE_STRING ProcessName; DWORD dwBasePriority; DWORD dwProcessID; DWORD dwParentProcessId; DWORD dwHandleCount; DWORD dwUnused3[2]; DWORD dwVirtualBytesPeak; DWORD dwVirtualBytes; ULONG dwPageFaults; DWORD dwWorkingSetPeak; DWORD dwWorkingSet; DWORD dwQuotaPeakPagedPoolUsage; DWORD dwQuotaPagedPoolUsage; DWORD dwQuotaPeakNonPagedPoolUsage; DWORD dwQuotaNonPagedPoolUsage; DWORD dwPageFileUsage; DWORD dwPageFileUsagePeak; DWORD dCommitCharge; THREADINFO ThreadSysInfo[1]; } PROCESSINFO, *PPROCESSINFO; typedef long (__stdcall *NtQuerySystemInformation)(DWORD, PVOID, DWORD, DWORD); int GetProcessCPU(DWORD dwProcessID) { int nCpuUsage = 0; PVOID pProcInfo = NULL; DWORD dwInfoSize = 0x20000; PPROCESSINFO pProcessInfo = NULL; DWORD dwWorkingSet = 0; static __int64 s_nLastTotalProcessCPUUsage = 0; static __int64 s_nLastCurrentProcessCPUUsage = 0; int nCurrentDelta = 0; int nTotalDelta = 0; __int64 nTotalProcessCPUUsage = 0; __int64 nCurrentProcessCPUUsage = 0; pProcInfo = (PVOID)(new BYTE[dwInfoSize]); HMODULE hDll = GetModuleHandle(_T("ntdll.dll")); if (NULL != hDll) { NtQuerySystemInformation pfn = (NtQuerySystemInformation)GetProcAddress(hDll, "NtQuerySystemInformation"); if (NULL != pfn) { pfn(5, pProcInfo, dwInfoSize, 0); pProcessInfo = (PPROCESSINFO)pProcInfo; do { nTotalProcessCPUUsage += (__int64)pProcessInfo->KernelTime.QuadPart + (__int64)pProcessInfo->UserTime.QuadPart; if (pProcessInfo->dwProcessID == dwProcessID) { dwWorkingSet = pProcessInfo->dwWorkingSet; nCurrentProcessCPUUsage = (__int64)pProcessInfo->KernelTime.QuadPart + (__int64)pProcessInfo->UserTime.QuadPart; } if (pProcessInfo->dwOffset == 0) { break; } pProcessInfo = (PPROCESSINFO)((BYTE*)pProcessInfo + pProcessInfo->dwOffset); } while(true); nTotalDelta = (int)(nTotalProcessCPUUsage - s_nLastTotalProcessCPUUsage); nCurrentDelta = (int)(nCurrentProcessCPUUsage - s_nLastCurrentProcessCPUUsage); if (nTotalDelta != 0) { nCpuUsage = 100 * nCurrentDelta / nTotalDelta; } s_nLastTotalProcessCPUUsage = nTotalProcessCPUUsage; s_nLastCurrentProcessCPUUsage = nCurrentProcessCPUUsage; } } delete[] pProcInfo; return nCpuUsage; }