步骤一:在“C:/c/com/swjtu/hardinfo”里建立文件SystemLoad.java,文件代码如下:
package com.swjtu.hardinfo;
public class SystemLoad {
public static native void PerfDataRefresh();
static
{
System.loadLibrary("SystemLoad");
}
public static native boolean PerfDataInitialize();
static
{
System.loadLibrary("SystemLoad");
}
public static native long PerfDataGetProcessorUsage();
static
{
System.loadLibrary("SystemLoad");
}
public static native long PerfDataGetCommitChargeTotalK();
static
{
System.loadLibrary("SystemLoad");
}
public static native long PerfDataGetCommitChargeLimitK();
static
{
System.loadLibrary("SystemLoad");
}
public static native long PerfDataGetCommitChargePeakK();
static
{
System.loadLibrary("SystemLoad");
}
public static native long PerfDataGetKernelMemoryTotalK();
static
{
System.loadLibrary("SystemLoad");
}
public static native long PerfDataGetKernelMemoryPagedK();
static
{
System.loadLibrary("SystemLoad");
}
public static native long PerfDataGetKernelMemoryNonPagedK();
static
{
System.loadLibrary("SystemLoad");
}
public static native long PerfDataGetPhysicalMemoryTotalK();
static
{
System.loadLibrary("SystemLoad");
}
public static native long PerfDataGetPhysicalMemoryAvailableK();
static
{
System.loadLibrary("SystemLoad");
}
public static native long PerfDataGetPhysicalMemorySystemCacheK();
static
{
System.loadLibrary("SystemLoad");
}
public static native long PerfDataGetSystemHandleCount();
static
{
System.loadLibrary("SystemLoad");
}
public static native long PerfDataGetTotalThreadCount();
static
{
System.loadLibrary("SystemLoad");
}
public static native long PerfDataGetProcessCount();
static
{
System.loadLibrary("SystemLoad");
}
}
步骤二:点击“开始”——>“运行”——>cmd 敲命令 Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.
C:/Documents and Settings/Administrator>cd c:/c
C:/c>cd com/swjtu/hardinfo
C:/c/com/swjtu/hardinfo>javac SystemLoad.java
C:/c/com/swjtu/hardinfo>cd c:/c
C:/c>javah com.swjtu.hardinfo.SystemLoad
C:/c>
注:javah命令在c:/c文件夹下生成了com_swjtu_hardinfo_SystemLoad.h头文件,文件代码如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include
/* Header for class com_swjtu_hardinfo_SystemLoad */
#ifndef _Included_com_swjtu_hardinfo_SystemLoad
#define _Included_com_swjtu_hardinfo_SystemLoad
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_swjtu_hardinfo_SystemLoad
* Method: PerfDataRefresh
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_swjtu_hardinfo_SystemLoad_PerfDataRefresh
(JNIEnv *, jclass);
/*
* Class: com_swjtu_hardinfo_SystemLoad
* Method: PerfDataInitialize
* Signature: ()Z
*/
JNIEXPORT jboolean JNICALL Java_com_swjtu_hardinfo_SystemLoad_PerfDataInitialize
(JNIEnv *, jclass);
/*
* Class: com_swjtu_hardinfo_SystemLoad
* Method: PerfDataGetProcessorUsage
* Signature: ()J
*/
JNIEXPORT jlong JNICALL Java_com_swjtu_hardinfo_SystemLoad_PerfDataGetProcessorUsage
(JNIEnv *, jclass);
/*
* Class: com_swjtu_hardinfo_SystemLoad
* Method: PerfDataGetCommitChargeTotalK
* Signature: ()J
*/
JNIEXPORT jlong JNICALL Java_com_swjtu_hardinfo_SystemLoad_PerfDataGetCommitChargeTotalK
(JNIEnv *, jclass);
/*
* Class: com_swjtu_hardinfo_SystemLoad
* Method: PerfDataGetCommitChargeLimitK
* Signature: ()J
*/
JNIEXPORT jlong JNICALL Java_com_swjtu_hardinfo_SystemLoad_PerfDataGetCommitChargeLimitK
(JNIEnv *, jclass);
/*
* Class: com_swjtu_hardinfo_SystemLoad
* Method: PerfDataGetCommitChargePeakK
* Signature: ()J
*/
JNIEXPORT jlong JNICALL Java_com_swjtu_hardinfo_SystemLoad_PerfDataGetCommitChargePeakK
(JNIEnv *, jclass);
/*
* Class: com_swjtu_hardinfo_SystemLoad
* Method: PerfDataGetKernelMemoryTotalK
* Signature: ()J
*/
JNIEXPORT jlong JNICALL Java_com_swjtu_hardinfo_SystemLoad_PerfDataGetKernelMemoryTotalK
(JNIEnv *, jclass);
/*
* Class: com_swjtu_hardinfo_SystemLoad
* Method: PerfDataGetKernelMemoryPagedK
* Signature: ()J
*/
JNIEXPORT jlong JNICALL Java_com_swjtu_hardinfo_SystemLoad_PerfDataGetKernelMemoryPagedK
(JNIEnv *, jclass);
/*
* Class: com_swjtu_hardinfo_SystemLoad
* Method: PerfDataGetKernelMemoryNonPagedK
* Signature: ()J
*/
JNIEXPORT jlong JNICALL Java_com_swjtu_hardinfo_SystemLoad_PerfDataGetKernelMemoryNonPagedK
(JNIEnv *, jclass);
/*
* Class: com_swjtu_hardinfo_SystemLoad
* Method: PerfDataGetPhysicalMemoryTotalK
* Signature: ()J
*/
JNIEXPORT jlong JNICALL Java_com_swjtu_hardinfo_SystemLoad_PerfDataGetPhysicalMemoryTotalK
(JNIEnv *, jclass);
/*
* Class: com_swjtu_hardinfo_SystemLoad
* Method: PerfDataGetPhysicalMemoryAvailableK
* Signature: ()J
*/
JNIEXPORT jlong JNICALL Java_com_swjtu_hardinfo_SystemLoad_PerfDataGetPhysicalMemoryAvailableK
(JNIEnv *, jclass);
/*
* Class: com_swjtu_hardinfo_SystemLoad
* Method: PerfDataGetPhysicalMemorySystemCacheK
* Signature: ()J
*/
JNIEXPORT jlong JNICALL Java_com_swjtu_hardinfo_SystemLoad_PerfDataGetPhysicalMemorySystemCacheK
(JNIEnv *, jclass);
/*
* Class: com_swjtu_hardinfo_SystemLoad
* Method: PerfDataGetSystemHandleCount
* Signature: ()J
*/
JNIEXPORT jlong JNICALL Java_com_swjtu_hardinfo_SystemLoad_PerfDataGetSystemHandleCount
(JNIEnv *, jclass);
/*
* Class: com_swjtu_hardinfo_SystemLoad
* Method: PerfDataGetTotalThreadCount
* Signature: ()J
*/
JNIEXPORT jlong JNICALL Java_com_swjtu_hardinfo_SystemLoad_PerfDataGetTotalThreadCount
(JNIEnv *, jclass);
/*
* Class: com_swjtu_hardinfo_SystemLoad
* Method: PerfDataGetProcessCount
* Signature: ()J
*/
JNIEXPORT jlong JNICALL Java_com_swjtu_hardinfo_SystemLoad_PerfDataGetProcessCount
(JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
#endif
步骤三:在文件夹“C:/c”建立com_swjtu_hardinfo_SystemLoad.cpp文件,文件内容如下:
#include "com_swjtu_hardinfo_SystemLoad.h"
#include "stdafx.h"
#include "taskmgr.h"
#include "TCHAR.H"
#include
using namespace std;
CRITICAL_SECTION PerfDataCriticalSection;
PPERFDATA pPerfDataOld = NULL; /* Older perf data (saved to establish delta values) */
PPERFDATA pPerfData = NULL; /* Most recent copy of perf data */
ULONG ProcessCountOld = 0;
ULONG ProcessCount = 0;
double dbIdleTime;
double dbKernelTime;
double dbSystemTime;
LARGE_INTEGER liOldIdleTime = {{0,0}};
double OldKernelTime = 0;
LARGE_INTEGER liOldSystemTime = {{0,0}};
SYSTEM_PERFORMANCE_INFORMATION SystemPerfInfo;
SYSTEM_BASIC_INFORMATION SystemBasicInfo;
SYSTEM_CACHE_INFORMATION SystemCacheInfo;
SYSTEM_HANDLE_INFORMATION SystemHandleInfo;
PSYSTEM_PROCESSOR_PERFORMANCE_INFORMATION SystemProcessorTimeInfo = NULL;
PSID SystemUserSid = NULL;
typedef LONG (WINAPI *PROCNTQSI)(DWORD,PVOID,ULONG,PULONG);//指向Native API NtQuerySystemInformation
PROCNTQSI NtQuerySystemInformation = NULL; //取系统性能函数
JNIEXPORT jboolean JNICALL Java_com_swjtu_hardinfo_SystemLoad_PerfDataInitialize(JNIEnv *, jclass)
//BOOL PerfDataInitialize(void)
{
SID_IDENTIFIER_AUTHORITY NtSidAuthority = {SECURITY_NT_AUTHORITY};
NTSTATUS status;
InitializeCriticalSection(&PerfDataCriticalSection);
NtQuerySystemInformation = (long(__stdcall*)(DWORD,PVOID,DWORD,DWORD*))
GetProcAddress(
GetModuleHandle( "ntdll.dll" ),
"NtQuerySystemInformation"
);
/*
* Get number of processors in the system
*/
status = NtQuerySystemInformation(SystemBasicInformation, &SystemBasicInfo, sizeof(SystemBasicInfo), NULL);
if (status != NO_ERROR)
return FALSE;
/*
* Create the SYSTEM Sid
*/
AllocateAndInitializeSid(&NtSidAuthority, 1, SECURITY_LOCAL_SYSTEM_RID, 0, 0, 0, 0, 0, 0, 0, &SystemUserSid);
return TRUE;
}
void PerfDataUninitialize(void)
{
DeleteCriticalSection(&PerfDataCriticalSection);
if (SystemUserSid != NULL)
{
FreeSid(SystemUserSid);
SystemUserSid = NULL;
}
}
static void SidToUserName(PSID Sid, LPTSTR szBuffer, DWORD BufferSize)
{
static TCHAR szDomainNameUnused[255];
DWORD DomainNameLen = sizeof(szDomainNameUnused) / sizeof(szDomainNameUnused[0]);
SID_NAME_USE Use;
if (Sid != NULL)
LookupAccountSid(NULL, Sid, szBuffer, &BufferSize, szDomainNameUnused, &DomainNameLen, &Use);
}
JNIEXPORT void JNICALL Java_com_swjtu_hardinfo_SystemLoad_PerfDataRefresh
(JNIEnv *, jclass)
//void PerfDataRefresh(void)
{
ULONG ulSize;
NTSTATUS status;
LPBYTE pBuffer;
ULONG BufferSize;
PSYSTEM_PROCESS_INFORMATION pSPI;
PPERFDATA pPDOld;
ULONG Idx, Idx2;
HANDLE hProcess;
HANDLE hProcessToken;
SYSTEM_PERFORMANCE_INFORMATION SysPerfInfo;
SYSTEM_TIMEOFDAY_INFORMATION SysTimeInfo;
//SYSTEM_CACHE_INFORMATION SysCacheInfo;
LPBYTE SysHandleInfoData;
PSYSTEM_PROCESSOR_PERFORMANCE_INFORMATION SysProcessorTimeInfo;
double CurrentKernelTime;
PSECURITY_DESCRIPTOR ProcessSD;
PSID ProcessUser;
ULONG Buffer[64]; /* must be 4 bytes aligned! */
/* Get new system time */
status = NtQuerySystemInformation(SystemTimeOfDayInformation, &SysTimeInfo, sizeof(SysTimeInfo), 0);
if (status != NO_ERROR)
return;
/* Get new CPU's idle time */
status = NtQuerySystemInformation(SystemPerformanceInformation, &SysPerfInfo, sizeof(SysPerfInfo), NULL);
if (status != NO_ERROR)
return;
/* Get system cache information */
/* status = NtQuerySystemInformation(SystemFileCacheInformation, &SysCacheInfo, sizeof(SysCacheInfo), NULL);
if (status != NO_ERROR)
return;
*/
/* Get processor time information */
SysProcessorTimeInfo = (PSYSTEM_PROCESSOR_PERFORMANCE_INFORMATION)HeapAlloc(GetProcessHeap(), 0, sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION) * SystemBasicInfo.NumberOfProcessors);
status = NtQuerySystemInformation(SystemProcessorPerformanceInformation, SysProcessorTimeInfo, sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION) * SystemBasicInfo.NumberOfProcessors, &ulSize);
if (status != NO_ERROR)
return;
/* Get handle information
* We don't know how much data there is so just keep
* increasing the buffer size until the call succeeds
*/
BufferSize = 0;
do
{
BufferSize += 0x10000;
SysHandleInfoData = (LPBYTE)HeapAlloc(GetProcessHeap(), 0, BufferSize);
status = NtQuerySystemInformation(SystemHandleInformation, SysHandleInfoData, BufferSize, &ulSize);
if (status == STATUS_INFO_LENGTH_MISMATCH) {
HeapFree(GetProcessHeap(), 0, SysHandleInfoData);
}
} while (status == STATUS_INFO_LENGTH_MISMATCH);
/* Get process information
* We don't know how much data there is so just keep
* increasing the buffer size until the call succeeds
*/
BufferSize = 0;
do
{
BufferSize += 0x10000;
pBuffer = (LPBYTE)HeapAlloc(GetProcessHeap(), 0, BufferSize);
status = NtQuerySystemInformation(SystemProcessInformation, pBuffer, BufferSize, &ulSize);
if (status == STATUS_INFO_LENGTH_MISMATCH) {
HeapFree(GetProcessHeap(), 0, pBuffer);
}
} while (status == STATUS_INFO_LENGTH_MISMATCH);
EnterCriticalSection(&PerfDataCriticalSection);
/*
* Save system performance info
*/
memcpy(&SystemPerfInfo, &SysPerfInfo, sizeof(SYSTEM_PERFORMANCE_INFORMATION));
/*
* Save system cache info
*/
// memcpy(&SystemCacheInfo, &SysCacheInfo, sizeof(SYSTEM_CACHE_INFORMATION));
/*
* Save system processor time info
*/
if (SystemProcessorTimeInfo) {
HeapFree(GetProcessHeap(), 0, SystemProcessorTimeInfo);
}
SystemProcessorTimeInfo = SysProcessorTimeInfo;
/*
* Save system handle info
*/
memcpy(&SystemHandleInfo, SysHandleInfoData, sizeof(SYSTEM_HANDLE_INFORMATION));
HeapFree(GetProcessHeap(), 0, SysHandleInfoData);
for (CurrentKernelTime=0, Idx=0; Idx<(ULONG)SystemBasicInfo.NumberOfProcessors; Idx++) {
CurrentKernelTime += Li2Double(SystemProcessorTimeInfo[Idx].KernelTime);
CurrentKernelTime += Li2Double(SystemProcessorTimeInfo[Idx].DpcTime);
CurrentKernelTime += Li2Double(SystemProcessorTimeInfo[Idx].InterruptTime);
}
/* If it's a first call - skip idle time calcs */
if (liOldIdleTime.QuadPart != 0) {
/* CurrentValue = NewValue - OldValue */
dbIdleTime = Li2Double(SysPerfInfo.IdleProcessTime) - Li2Double(liOldIdleTime);
dbKernelTime = CurrentKernelTime - OldKernelTime;
dbSystemTime = Li2Double(SysTimeInfo.CurrentTime) - Li2Double(liOldSystemTime);
/* CurrentCpuIdle = IdleTime / SystemTime */
dbIdleTime = dbIdleTime / dbSystemTime;
dbKernelTime = dbKernelTime / dbSystemTime;
/* CurrentCpuUsage% = 100 - (CurrentCpuIdle * 100) / NumberOfProcessors */
dbIdleTime = 100.0 - dbIdleTime * 100.0 / (double)SystemBasicInfo.NumberOfProcessors; /* + 0.5; */
dbKernelTime = 100.0 - dbKernelTime * 100.0 / (double)SystemBasicInfo.NumberOfProcessors; /* + 0.5; */
}
/* Store new CPU's idle and system time */
liOldIdleTime = SysPerfInfo.IdleProcessTime;
liOldSystemTime = SysTimeInfo.CurrentTime;
OldKernelTime = CurrentKernelTime;
/* Determine the process count
* We loop through the data we got from NtQuerySystemInformation
* and count how many structures there are (until RelativeOffset is 0)
*/
ProcessCountOld = ProcessCount;
ProcessCount = 0;
pSPI = (PSYSTEM_PROCESS_INFORMATION)pBuffer;
while (pSPI) {
ProcessCount++;
if (pSPI->NextEntryOffset == 0)
break;
pSPI = (PSYSTEM_PROCESS_INFORMATION)((LPBYTE)pSPI + pSPI->NextEntryOffset);
}
/* Now alloc a new PERFDATA array and fill in the data */
if (pPerfDataOld) {
HeapFree(GetProcessHeap(), 0, pPerfDataOld);
}
pPerfDataOld = pPerfData;
pPerfData = (PPERFDATA)HeapAlloc(GetProcessHeap(), 0, sizeof(PERFDATA) * ProcessCount);
pSPI = (PSYSTEM_PROCESS_INFORMATION)pBuffer;
for (Idx=0; Idx
UniqueProcessId) {
pPDOld = &pPerfDataOld[Idx2];
break;
}
}
/* Clear out process perf data structure */
memset(&pPerfData[Idx], 0, sizeof(PERFDATA));
if (pSPI->ImageName.Buffer)
wcscpy(pPerfData[Idx].ImageName, pSPI->ImageName.Buffer);
else
{
// LoadStringW(hInst, IDS_IDLE_PROCESS, pPerfData[Idx].ImageName,
// sizeof(pPerfData[Idx].ImageName) / sizeof(pPerfData[Idx].ImageName[0]));
}
pPerfData[Idx].ProcessId = pSPI->UniqueProcessId;
if (pPDOld) {
double CurTime = Li2Double(pSPI->KernelTime) + Li2Double(pSPI->UserTime);
double OldTime = Li2Double(pPDOld->KernelTime) + Li2Double(pPDOld->UserTime);
double CpuTime = (CurTime - OldTime) / dbSystemTime;
CpuTime = CpuTime * 100.0 / (double)SystemBasicInfo.NumberOfProcessors; /* + 0.5; */
pPerfData[Idx].CPUUsage = (ULONG)CpuTime;
}
pPerfData[Idx].CPUTime.QuadPart = pSPI->UserTime.QuadPart + pSPI->KernelTime.QuadPart;
pPerfData[Idx].WorkingSetSizeBytes = pSPI->WorkingSetSize;
pPerfData[Idx].PeakWorkingSetSizeBytes = pSPI->PeakWorkingSetSize;
if (pPDOld)
pPerfData[Idx].WorkingSetSizeDelta = labs((LONG)pSPI->WorkingSetSize - (LONG)pPDOld->WorkingSetSizeBytes);
else
pPerfData[Idx].WorkingSetSizeDelta = 0;
pPerfData[Idx].PageFaultCount = pSPI->PageFaultCount;
if (pPDOld)
pPerfData[Idx].PageFaultCountDelta = labs((LONG)pSPI->PageFaultCount - (LONG)pPDOld->PageFaultCount);
else
pPerfData[Idx].PageFaultCountDelta = 0;
pPerfData[Idx].VirtualMemorySizeBytes = pSPI->VirtualSize;
pPerfData[Idx].PagedPoolUsagePages = pSPI->QuotaPeakPagedPoolUsage;
pPerfData[Idx].NonPagedPoolUsagePages = pSPI->QuotaPeakNonPagedPoolUsage;
pPerfData[Idx].BasePriority = pSPI->BasePriority;
pPerfData[Idx].HandleCount = pSPI->HandleCount;
pPerfData[Idx].ThreadCount = pSPI->NumberOfThreads;
pPerfData[Idx].SessionId = pSPI->SessionId;
pPerfData[Idx].UserName[0] = _T('/0');
pPerfData[Idx].USERObjectCount = 0;
pPerfData[Idx].GDIObjectCount = 0;
ProcessUser = SystemUserSid;
ProcessSD = NULL;
if (pSPI->UniqueProcessId != NULL) {
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | READ_CONTROL, FALSE, PtrToUlong(pSPI->UniqueProcessId));
if (hProcess) {
/* don't query the information of the system process. It's possible but
returns Administrators as the owner of the process instead of SYSTEM */
if (pSPI->UniqueProcessId != 0x4)
{
if (OpenProcessToken(hProcess, TOKEN_QUERY, &hProcessToken))
{
DWORD RetLen = 0;
BOOL Ret;
Ret = GetTokenInformation(hProcessToken, TokenUser, (LPVOID)Buffer, sizeof(Buffer), &RetLen);
CloseHandle(hProcessToken);
if (Ret)
ProcessUser = ((PTOKEN_USER)Buffer)->User.Sid;
else
goto ReadProcOwner;
}
else
{
ReadProcOwner:
;
// GetSecurityInfo(hProcess, SE_KERNEL_OBJECT, OWNER_SECURITY_INFORMATION, &ProcessUser, NULL, NULL, NULL, &ProcessSD);
}
pPerfData[Idx].USERObjectCount = GetGuiResources(hProcess, GR_USEROBJECTS);
pPerfData[Idx].GDIObjectCount = GetGuiResources(hProcess, GR_GDIOBJECTS);
}
GetProcessIoCounters(hProcess, &pPerfData[Idx].IOCounters);
CloseHandle(hProcess);
} else {
goto ClearInfo;
}
} else {
ClearInfo:
/* clear information we were unable to fetch */
ZeroMemory(&pPerfData[Idx].IOCounters, sizeof(IO_COUNTERS));
}
//SidToUserName(ProcessUser, pPerfData[Idx].UserName, sizeof(pPerfData[0].UserName) / sizeof(pPerfData[0].UserName[0]));
if (ProcessSD != NULL)
{
LocalFree((HLOCAL)ProcessSD);
}
pPerfData[Idx].UserTime.QuadPart = pSPI->UserTime.QuadPart;
pPerfData[Idx].KernelTime.QuadPart = pSPI->KernelTime.QuadPart;
pSPI = (PSYSTEM_PROCESS_INFORMATION)((LPBYTE)pSPI + pSPI->NextEntryOffset);
}
HeapFree(GetProcessHeap(), 0, pBuffer);
LeaveCriticalSection(&PerfDataCriticalSection);
}
ULONG PerfDataGetProcessCount(void)//获得进程数目
{
return ProcessCount;
}
JNIEXPORT jlong JNICALL Java_com_swjtu_hardinfo_SystemLoad_PerfDataGetProcessorUsage
(JNIEnv *, jclass)
//ULONG PerfDataGetProcessorUsage(void)//获得CPU使用率
{
return (ULONG)dbIdleTime;
}
ULONG PerfDataGetProcessorSystemUsage(void)
{
return (ULONG)dbKernelTime;
}
BOOL PerfDataGetImageName(ULONG Index, LPTSTR lpImageName, int nMaxCount)
{
BOOL bSuccessful;
EnterCriticalSection(&PerfDataCriticalSection);
if (Index < ProcessCount) {
#ifdef _UNICODE
wcsncpy(lpImageName, pPerfData[Index].ImageName, nMaxCount);
#else
WideCharToMultiByte(CP_ACP, 0, pPerfData[Index].ImageName, -1, lpImageName, nMaxCount, NULL, NULL);
#endif
bSuccessful = TRUE;
} else {
bSuccessful = FALSE;
}
LeaveCriticalSection(&PerfDataCriticalSection);
return bSuccessful;
}
int PerfGetIndexByProcessId(DWORD dwProcessId)
{
int Index, FoundIndex = -1;
EnterCriticalSection(&PerfDataCriticalSection);
for (Index = 0; Index < (int)ProcessCount; Index++)
{
if ((DWORD)pPerfData[Index].ProcessId == dwProcessId)
{
FoundIndex = Index;
break;
}
}
LeaveCriticalSection(&PerfDataCriticalSection);
return FoundIndex;
}
ULONG PerfDataGetProcessId(ULONG Index)
{
ULONG ProcessId;
EnterCriticalSection(&PerfDataCriticalSection);
if (Index < ProcessCount)
ProcessId = (ULONG)pPerfData[Index].ProcessId;
else
ProcessId = 0;
LeaveCriticalSection(&PerfDataCriticalSection);
return ProcessId;
}
BOOL PerfDataGetUserName(ULONG Index, LPTSTR lpUserName, int nMaxCount)
{
BOOL bSuccessful;
EnterCriticalSection(&PerfDataCriticalSection);
if (Index < ProcessCount) {
#ifdef _UNICODE
wcsncpy(lpUserName, pPerfData[Index].UserName, nMaxCount);
#else
WideCharToMultiByte(CP_ACP, 0, pPerfData[Index].UserName, -1, lpUserName, nMaxCount, NULL, NULL);
#endif
bSuccessful = TRUE;
} else {
bSuccessful = FALSE;
}
LeaveCriticalSection(&PerfDataCriticalSection);
return bSuccessful;
}
ULONG PerfDataGetSessionId(ULONG Index)
{
ULONG SessionId;
EnterCriticalSection(&PerfDataCriticalSection);
if (Index < ProcessCount)
SessionId = pPerfData[Index].SessionId;
else
SessionId = 0;
LeaveCriticalSection(&PerfDataCriticalSection);
return SessionId;
}
ULONG PerfDataGetCPUUsage(ULONG Index)
{
ULONG CpuUsage;
EnterCriticalSection(&PerfDataCriticalSection);
if (Index < ProcessCount)
CpuUsage = pPerfData[Index].CPUUsage;
else
CpuUsage = 0;
LeaveCriticalSection(&PerfDataCriticalSection);
return CpuUsage;
}
LARGE_INTEGER PerfDataGetCPUTime(ULONG Index)
{
LARGE_INTEGER CpuTime = {{0,0}};
EnterCriticalSection(&PerfDataCriticalSection);
if (Index < ProcessCount)
CpuTime = pPerfData[Index].CPUTime;
LeaveCriticalSection(&PerfDataCriticalSection);
return CpuTime;
}
ULONG PerfDataGetWorkingSetSizeBytes(ULONG Index)
{
ULONG WorkingSetSizeBytes;
EnterCriticalSection(&PerfDataCriticalSection);
if (Index < ProcessCount)
WorkingSetSizeBytes = pPerfData[Index].WorkingSetSizeBytes;
else
WorkingSetSizeBytes = 0;
LeaveCriticalSection(&PerfDataCriticalSection);
return WorkingSetSizeBytes;
}
ULONG PerfDataGetPeakWorkingSetSizeBytes(ULONG Index)
{
ULONG PeakWorkingSetSizeBytes;
EnterCriticalSection(&PerfDataCriticalSection);
if (Index < ProcessCount)
PeakWorkingSetSizeBytes = pPerfData[Index].PeakWorkingSetSizeBytes;
else
PeakWorkingSetSizeBytes = 0;
LeaveCriticalSection(&PerfDataCriticalSection);
return PeakWorkingSetSizeBytes;
}
ULONG PerfDataGetWorkingSetSizeDelta(ULONG Index)
{
ULONG WorkingSetSizeDelta;
EnterCriticalSection(&PerfDataCriticalSection);
if (Index < ProcessCount)
WorkingSetSizeDelta = pPerfData[Index].WorkingSetSizeDelta;
else
WorkingSetSizeDelta = 0;
LeaveCriticalSection(&PerfDataCriticalSection);
return WorkingSetSizeDelta;
}
ULONG PerfDataGetPageFaultCount(ULONG Index)
{
ULONG PageFaultCount;
EnterCriticalSection(&PerfDataCriticalSection);
if (Index < ProcessCount)
PageFaultCount = pPerfData[Index].PageFaultCount;
else
PageFaultCount = 0;
LeaveCriticalSection(&PerfDataCriticalSection);
return PageFaultCount;
}
ULONG PerfDataGetPageFaultCountDelta(ULONG Index)
{
ULONG PageFaultCountDelta;
EnterCriticalSection(&PerfDataCriticalSection);
if (Index < ProcessCount)
PageFaultCountDelta = pPerfData[Index].PageFaultCountDelta;
else
PageFaultCountDelta = 0;
LeaveCriticalSection(&PerfDataCriticalSection);
return PageFaultCountDelta;
}
ULONG PerfDataGetVirtualMemorySizeBytes(ULONG Index)
{
ULONG VirtualMemorySizeBytes;
EnterCriticalSection(&PerfDataCriticalSection);
if (Index < ProcessCount)
VirtualMemorySizeBytes = pPerfData[Index].VirtualMemorySizeBytes;
else
VirtualMemorySizeBytes = 0;
LeaveCriticalSection(&PerfDataCriticalSection);
return VirtualMemorySizeBytes;
}
ULONG PerfDataGetPagedPoolUsagePages(ULONG Index)
{
ULONG PagedPoolUsage;
EnterCriticalSection(&PerfDataCriticalSection);
if (Index < ProcessCount)
PagedPoolUsage = pPerfData[Index].PagedPoolUsagePages;
else
PagedPoolUsage = 0;
LeaveCriticalSection(&PerfDataCriticalSection);
return PagedPoolUsage;
}
ULONG PerfDataGetNonPagedPoolUsagePages(ULONG Index)
{
ULONG NonPagedPoolUsage;
EnterCriticalSection(&PerfDataCriticalSection);
if (Index < ProcessCount)
NonPagedPoolUsage = pPerfData[Index].NonPagedPoolUsagePages;
else
NonPagedPoolUsage = 0;
LeaveCriticalSection(&PerfDataCriticalSection);
return NonPagedPoolUsage;
}
ULONG PerfDataGetBasePriority(ULONG Index)
{
ULONG BasePriority;
EnterCriticalSection(&PerfDataCriticalSection);
if (Index < ProcessCount)
BasePriority = pPerfData[Index].BasePriority;
else
BasePriority = 0;
LeaveCriticalSection(&PerfDataCriticalSection);
return BasePriority;
}
//进程的句柄数
ULONG PerfDataGetHandleCount(ULONG Index)
{
ULONG HandleCount;
EnterCriticalSection(&PerfDataCriticalSection);
if (Index < ProcessCount)
HandleCount = pPerfData[Index].HandleCount;
else
HandleCount = 0;
LeaveCriticalSection(&PerfDataCriticalSection);
return HandleCount;
}
// 进程的线程数
ULONG PerfDataGetThreadCount(ULONG Index)
{
ULONG ThreadCount;
EnterCriticalSection(&PerfDataCriticalSection);
if (Index < ProcessCount)
ThreadCount = pPerfData[Index].ThreadCount;
else
ThreadCount = 0;
LeaveCriticalSection(&PerfDataCriticalSection);
return ThreadCount;
}
ULONG PerfDataGetUSERObjectCount(ULONG Index)
{
ULONG USERObjectCount;
EnterCriticalSection(&PerfDataCriticalSection);
if (Index < ProcessCount)
USERObjectCount = pPerfData[Index].USERObjectCount;
else
USERObjectCount = 0;
LeaveCriticalSection(&PerfDataCriticalSection);
return USERObjectCount;
}
ULONG PerfDataGetGDIObjectCount(ULONG Index)
{
ULONG GDIObjectCount;
EnterCriticalSection(&PerfDataCriticalSection);
if (Index < ProcessCount)
GDIObjectCount = pPerfData[Index].GDIObjectCount;
else
GDIObjectCount = 0;
LeaveCriticalSection(&PerfDataCriticalSection);
return GDIObjectCount;
}
BOOL PerfDataGetIOCounters(ULONG Index, PIO_COUNTERS pIoCounters)
{
BOOL bSuccessful;
EnterCriticalSection(&PerfDataCriticalSection);
if (Index < ProcessCount)
{
memcpy(pIoCounters, &pPerfData[Index].IOCounters, sizeof(IO_COUNTERS));
bSuccessful = TRUE;
}
else
bSuccessful = FALSE;
LeaveCriticalSection(&PerfDataCriticalSection);
return bSuccessful;
}
//提交总量
JNIEXPORT jlong JNICALL Java_com_swjtu_hardinfo_SystemLoad_PerfDataGetCommitChargeTotalK
(JNIEnv *, jclass)
//ULONG PerfDataGetCommitChargeTotalK(void)
{
ULONG Total;
ULONG PageSize;
EnterCriticalSection(&PerfDataCriticalSection);
Total = SystemPerfInfo.CommittedPages;
PageSize = SystemBasicInfo.PageSize;
LeaveCriticalSection(&PerfDataCriticalSection);
Total = Total * (PageSize / 1024);
return Total;
}
//提交限制
JNIEXPORT jlong JNICALL Java_com_swjtu_hardinfo_SystemLoad_PerfDataGetCommitChargeLimitK
(JNIEnv *, jclass)
//ULONG PerfDataGetCommitChargeLimitK(void)
{
ULONG Limit;
ULONG PageSize;
EnterCriticalSection(&PerfDataCriticalSection);
Limit = SystemPerfInfo.CommitLimit;
PageSize = SystemBasicInfo.PageSize;
LeaveCriticalSection(&PerfDataCriticalSection);
Limit = Limit * (PageSize / 1024);
return Limit;
}
//提交峰值
JNIEXPORT jlong JNICALL Java_com_swjtu_hardinfo_SystemLoad_PerfDataGetCommitChargePeakK
(JNIEnv *, jclass)
//ULONG PerfDataGetCommitChargePeakK(void)
{
ULONG Peak;
ULONG PageSize;
EnterCriticalSection(&PerfDataCriticalSection);
Peak = SystemPerfInfo.PeakCommitment;
PageSize = SystemBasicInfo.PageSize;
LeaveCriticalSection(&PerfDataCriticalSection);
Peak = Peak * (PageSize / 1024);
return Peak;
}
//核心内存总量
JNIEXPORT jlong JNICALL Java_com_swjtu_hardinfo_SystemLoad_PerfDataGetKernelMemoryTotalK
(JNIEnv *, jclass)
//ULONG PerfDataGetKernelMemoryTotalK(void)
{
ULONG Total;
ULONG Paged;
ULONG NonPaged;
ULONG PageSize;
EnterCriticalSection(&PerfDataCriticalSection);
Paged = SystemPerfInfo.PagedPoolPages;
NonPaged = SystemPerfInfo.NonPagedPoolPages;
PageSize = SystemBasicInfo.PageSize;
LeaveCriticalSection(&PerfDataCriticalSection);
Paged = Paged * (PageSize / 1024);
NonPaged = NonPaged * (PageSize / 1024);
Total = Paged + NonPaged;
return Total;
}
//内核分页内存
JNIEXPORT jlong JNICALL Java_com_swjtu_hardinfo_SystemLoad_PerfDataGetKernelMemoryPagedK
(JNIEnv *, jclass)
//ULONG PerfDataGetKernelMemoryPagedK(void)
{
ULONG Paged;
ULONG PageSize;
EnterCriticalSection(&PerfDataCriticalSection);
Paged = SystemPerfInfo.PagedPoolPages;
PageSize = SystemBasicInfo.PageSize;
LeaveCriticalSection(&PerfDataCriticalSection);
Paged = Paged * (PageSize / 1024);
return Paged;
}
//内核非分页内存
JNIEXPORT jlong JNICALL Java_com_swjtu_hardinfo_SystemLoad_PerfDataGetKernelMemoryNonPagedK
(JNIEnv *, jclass)
//ULONG PerfDataGetKernelMemoryNonPagedK(void)
{
ULONG NonPaged;
ULONG PageSize;
EnterCriticalSection(&PerfDataCriticalSection);
NonPaged = SystemPerfInfo.NonPagedPoolPages;
PageSize = SystemBasicInfo.PageSize;
LeaveCriticalSection(&PerfDataCriticalSection);
NonPaged = NonPaged * (PageSize / 1024);
return NonPaged;
}
//总物理内存
JNIEXPORT jlong JNICALL Java_com_swjtu_hardinfo_SystemLoad_PerfDataGetPhysicalMemoryTotalK
(JNIEnv *, jclass)
//ULONG PerfDataGetPhysicalMemoryTotalK(void)
{
ULONG Total;
ULONG PageSize;
EnterCriticalSection(&PerfDataCriticalSection);
Total = SystemBasicInfo.NumberOfPhysicalPages;
PageSize = SystemBasicInfo.PageSize;
LeaveCriticalSection(&PerfDataCriticalSection);
Total = Total * (PageSize / 1024);
return Total;
}
//可用物理内存
JNIEXPORT jlong JNICALL Java_com_swjtu_hardinfo_SystemLoad_PerfDataGetPhysicalMemoryAvailableK
(JNIEnv *, jclass)
//ULONG PerfDataGetPhysicalMemoryAvailableK(void)
{
ULONG Available;
ULONG PageSize;
EnterCriticalSection(&PerfDataCriticalSection);
Available = SystemPerfInfo.AvailablePages;
PageSize = SystemBasicInfo.PageSize;
LeaveCriticalSection(&PerfDataCriticalSection);
Available = Available * (PageSize / 1024);
return Available;
}
//物理内存系统缓存
JNIEXPORT jlong JNICALL Java_com_swjtu_hardinfo_SystemLoad_PerfDataGetPhysicalMemorySystemCacheK
(JNIEnv *, jclass)
//ULONG PerfDataGetPhysicalMemorySystemCacheK(void)
{
ULONG SystemCache;
ULONG PageSize;
EnterCriticalSection(&PerfDataCriticalSection);
PageSize = SystemBasicInfo.PageSize;
SystemCache = SystemCacheInfo.CurrentSize * PageSize;
LeaveCriticalSection(&PerfDataCriticalSection);
return SystemCache / 1024;
}
//句柄数
JNIEXPORT jlong JNICALL Java_com_swjtu_hardinfo_SystemLoad_PerfDataGetSystemHandleCount
(JNIEnv *, jclass)
//ULONG PerfDataGetSystemHandleCount(void)
{
ULONG HandleCount;
EnterCriticalSection(&PerfDataCriticalSection);
HandleCount = SystemHandleInfo.Count;
LeaveCriticalSection(&PerfDataCriticalSection);
return HandleCount;
}
//线程数
JNIEXPORT jlong JNICALL Java_com_swjtu_hardinfo_SystemLoad_PerfDataGetTotalThreadCount
(JNIEnv *, jclass)
//ULONG PerfDataGetTotalThreadCount(void)
{
ULONG ThreadCount = 0;
ULONG i;
EnterCriticalSection(&PerfDataCriticalSection);
for (i=0; i< ProcessCount; i++)
{
ThreadCount += pPerfData[i].ThreadCount;
}
LeaveCriticalSection(&PerfDataCriticalSection);
return ThreadCount;
}
/*
int main()
{
PerfDataInitialize();
while (1)
{
//...get data
//for eg.
PerfDataRefresh();
cout <<"CPU使用率: "<< PerfDataGetProcessorUsage()<< endl;
//cout <<"信息: "<< PerfDataGetProcessorSystemUsage()<< endl;
cout <<"认可用量(K),总数:"<< PerfDataGetCommitChargeTotalK()<< endl;
cout <<"认可用量(K),限制:"<< PerfDataGetCommitChargeLimitK()<< endl;
cout <<"认可用量(K),峰值:"<< PerfDataGetCommitChargePeakK()<< endl;
cout <<"核心内存(K),总数:"<< PerfDataGetKernelMemoryTotalK()<< endl;
cout <<"核心内存(K),分页数:"<< PerfDataGetKernelMemoryPagedK()<< endl;
cout <<"核心内存(K),未分页:"<< PerfDataGetKernelMemoryNonPagedK()<< endl;
cout <<"物理内存(K),总数:"<< PerfDataGetPhysicalMemoryTotalK()<< endl;
cout <<"物理内存(K),可用数:"<< PerfDataGetPhysicalMemoryAvailableK()<< endl;
cout <<"物理内存(K),系统缓存:"<< PerfDataGetPhysicalMemorySystemCacheK()<< endl;
cout <<"总数,句柄数:"<< PerfDataGetSystemHandleCount()<< endl;
cout <<"总数,线程数:"<< PerfDataGetTotalThreadCount()<< endl;
cout <<"总数,进程数目: "<< PerfDataGetProcessCount()<< endl;
cout <<"CPU: PID:0 ,Usage: "<< PerfDataGetCPUUsage(PerfGetIndexByProcessId(0))<< endl;
cout <<"CPU: PID:0 ,Usage: "<< PerfDataGetCPUUsage(PerfGetIndexByProcessId(4))<< endl;
Sleep(1000);
}
return 0;
}
*/
步骤四:生成DLL文件 使用命令:cl -IC:/include -LD com_swjtu_hardinfo_SystemLoad.cpp -FeSystemLoad.dll如果执行过程中出现找不到头文件错误,则将该头文件所在目录加入到命令中(如-IC:/include,目录名不要有空格),如果执行过程出现打不开lib文件错误,则将相应的文件拷贝到C:/c文件夹下。成功后生成SystemLoad.dll,将这个文件拷贝到com文件同目录。
步骤五:编写个JAVA文件调用这个方法。如下代码:
package com.swjtu.hardinfo;
class gethardinfo
{
public static void main(String[] args)
{
long total=0,free=0;
int percent=0;
percent=Memo.percent();
total=Memo.total();
free=Memo.free();
SystemLoad.PerfDataInitialize();
while(true){
SystemLoad.PerfDataRefresh();
System.out.println("CommitChargeLimit:"+SystemLoad.PerfDataGetCommitChargeLimitK());
System.out.println("CommitChargePeak:"+SystemLoad.PerfDataGetCommitChargePeakK());
System.out.println("CommitChargeTotal:"+SystemLoad.PerfDataGetCommitChargeTotalK());
System.out.println("KernelMemoryNonPaged:"+SystemLoad.PerfDataGetKernelMemoryNonPagedK());
System.out.println("KernelMemoryPaged:"+SystemLoad.PerfDataGetKernelMemoryPagedK());
System.out.println("KernelMemoryTotal:"+SystemLoad.PerfDataGetKernelMemoryTotalK());
System.out.println("PhysicalMemoryAvailable:"+SystemLoad.PerfDataGetPhysicalMemoryAvailableK());
System.out.println("PhysicalMemorySystemCache:"+SystemLoad.PerfDataGetPhysicalMemorySystemCacheK());
System.out.println("PhysicalMemoryTotal"+SystemLoad.PerfDataGetPhysicalMemoryTotalK());
System.out.println("ProcessCount:"+SystemLoad.PerfDataGetProcessCount());
System.out.println("ProcessorUsage:"+SystemLoad.PerfDataGetProcessorUsage());
System.out.println("SystemHandleCount:"+SystemLoad.PerfDataGetSystemHandleCount());
System.out.println("TotalThreadCount:"+SystemLoad.PerfDataGetTotalThreadCount());
System.out.println(percent);
System.out.println(total);
System.out.println(free);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
运行这个文件,报如下错误:
CommitChargeLimit:1917912
CommitChargePeak:1404836
CommitChargeTotal:1074556
KernelMemoryNonPaged:34812
KernelMemoryPaged:83968
KernelMemoryTotal:118780
PhysicalMemoryAvailable:285704
PhysicalMemorySystemCache:0
PhysicalMemoryTotal784492
Exception in thread "main" java.lang.UnsatisfiedLinkError: com.swjtu.hardinfo.SystemLoad.PerfDataGetProcessCount()J
at com.swjtu.hardinfo.SystemLoad.PerfDataGetProcessCount(Native Method)
at com.swjtu.hardinfo.gethardinfo.main(gethardinfo.java:28)
。。。。。。。晕了。。。回头查看com_swjtu_hardinfo_SystemLoad.cpp文件。。发现341行的代码。。。ULONG PerfDataGetProcessCount(void)//获得进程数目 没有改好。。。啊~啊~ 傻了。。。。。
将这一行用JNIEXPORT jlong JNICALL Java_com_swjtu_hardinfo_SystemLoad_PerfDataGetProcessCount
(JNIEnv *, jclass)替换,再用CL命令:
C:/c>cl -IC:/Progra~1/Java/jdk1.6.0_03/include -IC:/Progra~1/Java/jdk1.6.0_03/in
clude/win32 -IC:/include -IC:/include/Include -IC:/include/in2 -IC:/include/lib
-LD com_swjtu_hardinfo_SystemLoad.cpp -FeSystemLoad.dll
用于 80x86 的 Microsoft (R) 32 位 C/C++ 优化编译器 15.00.21022.08 版
版权所有(C) Microsoft Corporation。保留所有权利。
com_swjtu_hardinfo_SystemLoad.cpp
C:/include/in2/afxwin1.inl(105) : warning C4530: 使用了 C++ 异常处理程序,但未启
用展开语义。请指定 /EHsc
Microsoft (R) Incremental Linker Version 9.00.21022.08
Copyright (C) Microsoft Corporation. All rights reserved.
/dll
/implib:SystemLoad.lib
/out:SystemLoad.dll
com_swjtu_hardinfo_SystemLoad.obj
正在创建库 SystemLoad.lib 和对象 SystemLoad.exp
C:/c>
再次运行gethardinfo.java 得下面结果:
CommitChargeLimit:1917912
CommitChargePeak:1404836
CommitChargeTotal:1010604
KernelMemoryNonPaged:34648
KernelMemoryPaged:80340
KernelMemoryTotal:114988
PhysicalMemoryAvailable:277972
PhysicalMemorySystemCache:0
PhysicalMemoryTotal784492
ProcessCount:49
ProcessorUsage:0
SystemHandleCount:55823
TotalThreadCount:544
64
784492
278460
CommitChargeLimit:1917912
CommitChargePeak:1404836
CommitChargeTotal:1010736
KernelMemoryNonPaged:34648
KernelMemoryPaged:80340
KernelMemoryTotal:114988
PhysicalMemoryAvailable:278128
PhysicalMemorySystemCache:0
PhysicalMemoryTotal784492
ProcessCount:49
ProcessorUsage:8
SystemHandleCount:55824
TotalThreadCount:544
64
784492
278460
CommitChargeLimit:1917912
CommitChargePeak:1404836
CommitChargeTotal:1010788
KernelMemoryNonPaged:34648
KernelMemoryPaged:80340
KernelMemoryTotal:114988
PhysicalMemoryAvailable:278708
PhysicalMemorySystemCache:0
PhysicalMemoryTotal784492
ProcessCount:49
ProcessorUsage:8
SystemHandleCount:55824
TotalThreadCount:544
64
784492
278460
CommitChargeLimit:1917912
CommitChargePeak:1404836
CommitChargeTotal:1010792
KernelMemoryNonPaged:34648
KernelMemoryPaged:80340
KernelMemoryTotal:114988
PhysicalMemoryAvailable:278036
PhysicalMemorySystemCache:0
PhysicalMemoryTotal784492
ProcessCount:49
ProcessorUsage:10
SystemHandleCount:55827
TotalThreadCount:544
64
784492
278460
最后:至此 所有步骤都完成了。主要容易出问题的地方是编译生成DLL文件步骤,一般出现缺少头文件 或打不开LIB文件,解决方法就是把缺少的加进去—_—!! 最后还想说。。。我搞以上所有东西花了一天。。写这篇东西花了一下午。。。。。。~ 代码里出现< p 和 < e 的时候都出错。。必须在<和p/e间加空格。。。。困扰啊~~。。。。最后 写个文章太不容易了,要不是为了以后方便查阅。记录下来还是有用的,以后需要进行类似开发,就不用从零开始了。
==============================================================
以为搞完了吧,哈哈第二天一看,又出问题了。
CPU dominant frequency:1662
CommitChargeLimit:1917912
CommitChargePeak:951712
CommitChargeTotal:949424
KernelMemoryNonPaged:28200
KernelMemoryPaged:55212
KernelMemoryTotal:83412
PhysicalMemoryAvailable:136272
PhysicalMemorySystemCache:0
PhysicalMemoryTotal784492
ProcessCount:47
ProcessorUsage:6
SystemHandleCount:55310
TotalThreadCount:515
把代码中的关于计算系统缓存的注释去掉,编译 算出来的系统缓存还是不对。经过查阅资料,得出解决方案:
将其中的获取物理内存系统缓存的函数如下修改:
//物理内存系统缓存
ULONG PerfDataGetPhysicalMemorySystemCacheK(void)
{
ULONG SystemCache;
ULONG PageSize;
EnterCriticalSection(&PerfDataCriticalSection);
PageSize = SystemBasicInfo.PageSize;
SystemCache = SystemCacheInfo.unused[0] * PageSize;
LeaveCriticalSection(&PerfDataCriticalSection);
return SystemCache /1024;
}
问题解决。运行时的结果与windows任务管理器的对比如下:
经过修改和测试,其最终com_swjtu_hardinfo_SystemLoad.cpp文件代码 如下:
#include "com_swjtu_hardinfo_SystemLoad.h"
#include "stdafx.h"
#include "taskmgr.h"
#include "TCHAR.H"
#include < iostream>
using namespace std;
CRITICAL_SECTION PerfDataCriticalSection;
PPERFDATA pPerfDataOld = NULL; /* Older perf data (saved to establish delta values) */
PPERFDATA pPerfData = NULL; /* Most recent copy of perf data */
ULONG ProcessCountOld = 0;
ULONG ProcessCount = 0;
double dbIdleTime;
double dbKernelTime;
double dbSystemTime;
LARGE_INTEGER liOldIdleTime = {{0,0}};
double OldKernelTime = 0;
LARGE_INTEGER liOldSystemTime = {{0,0}};
SYSTEM_PERFORMANCE_INFORMATION SystemPerfInfo;
SYSTEM_BASIC_INFORMATION SystemBasicInfo;
SYSTEM_CACHE_INFORMATION SystemCacheInfo;
SYSTEM_HANDLE_INFORMATION SystemHandleInfo;
PSYSTEM_PROCESSOR_PERFORMANCE_INFORMATION SystemProcessorTimeInfo = NULL;
PSID SystemUserSid = NULL;
typedef LONG (WINAPI *PROCNTQSI)(DWORD,PVOID,ULONG,PULONG);//指向Native API NtQuerySystemInformation
PROCNTQSI NtQuerySystemInformation = NULL; //取系统性能函数
JNIEXPORT jboolean JNICALL Java_com_swjtu_hardinfo_SystemLoad_PerfDataInitialize(JNIEnv *, jclass)
//BOOL PerfDataInitialize(void)
{
SID_IDENTIFIER_AUTHORITY NtSidAuthority = {SECURITY_NT_AUTHORITY};
NTSTATUS status;
InitializeCriticalSection(&PerfDataCriticalSection);
NtQuerySystemInformation = (long(__stdcall*)(DWORD,PVOID,DWORD,DWORD*))
GetProcAddress(
GetModuleHandle( "ntdll.dll" ),
"NtQuerySystemInformation"
);
/*
* Get number of processors in the system
*/
status = NtQuerySystemInformation(SystemBasicInformation, &SystemBasicInfo, sizeof(SystemBasicInfo), NULL);
if (status != NO_ERROR)
return FALSE;
/*
* Create the SYSTEM Sid
*/
AllocateAndInitializeSid(&NtSidAuthority, 1, SECURITY_LOCAL_SYSTEM_RID, 0, 0, 0, 0, 0, 0, 0, &SystemUserSid);
return TRUE;
}
void PerfDataUninitialize(void)
{
DeleteCriticalSection(&PerfDataCriticalSection);
if (SystemUserSid != NULL)
{
FreeSid(SystemUserSid);
SystemUserSid = NULL;
}
}
static void SidToUserName(PSID Sid, LPTSTR szBuffer, DWORD BufferSize)
{
static TCHAR szDomainNameUnused[255];
DWORD DomainNameLen = sizeof(szDomainNameUnused) / sizeof(szDomainNameUnused[0]);
SID_NAME_USE Use;
if (Sid != NULL)
LookupAccountSid(NULL, Sid, szBuffer, &BufferSize, szDomainNameUnused, &DomainNameLen, &Use);
}
JNIEXPORT void JNICALL Java_com_swjtu_hardinfo_SystemLoad_PerfDataRefresh
(JNIEnv *, jclass)
//void PerfDataRefresh(void)
{
ULONG ulSize;
NTSTATUS status;
LPBYTE pBuffer;
ULONG BufferSize;
PSYSTEM_PROCESS_INFORMATION pSPI;
PPERFDATA pPDOld;
ULONG Idx, Idx2;
HANDLE hProcess;
HANDLE hProcessToken;
SYSTEM_PERFORMANCE_INFORMATION SysPerfInfo;
SYSTEM_TIMEOFDAY_INFORMATION SysTimeInfo;
SYSTEM_CACHE_INFORMATION SysCacheInfo;
LPBYTE SysHandleInfoData;
PSYSTEM_PROCESSOR_PERFORMANCE_INFORMATION SysProcessorTimeInfo;
double CurrentKernelTime;
PSECURITY_DESCRIPTOR ProcessSD;
PSID ProcessUser;
ULONG Buffer[64]; /* must be 4 bytes aligned! */
/* Get new system time */
status = NtQuerySystemInformation(SystemTimeOfDayInformation, &SysTimeInfo, sizeof(SysTimeInfo), 0);
if (status != NO_ERROR)
return;
/* Get new CPU's idle time */
status = NtQuerySystemInformation(SystemPerformanceInformation, &SysPerfInfo, sizeof(SysPerfInfo), NULL);
if (status != NO_ERROR)
return;
/* Get system cache information */
status = NtQuerySystemInformation(SystemCacheInformation, &SysCacheInfo, sizeof(SysCacheInfo), NULL);
if (status != NO_ERROR)
return;
/* Get processor time information */
SysProcessorTimeInfo = (PSYSTEM_PROCESSOR_PERFORMANCE_INFORMATION)HeapAlloc(GetProcessHeap(), 0, sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION) * SystemBasicInfo.NumberOfProcessors);
status = NtQuerySystemInformation(SystemProcessorPerformanceInformation, SysProcessorTimeInfo, sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION) * SystemBasicInfo.NumberOfProcessors, &ulSize);
if (status != NO_ERROR)
return;
/* Get handle information
* We don't know how much data there is so just keep
* increasing the buffer size until the call succeeds
*/
BufferSize = 0;
do
{
BufferSize += 0x10000;
SysHandleInfoData = (LPBYTE)HeapAlloc(GetProcessHeap(), 0, BufferSize);
status = NtQuerySystemInformation(SystemHandleInformation, SysHandleInfoData, BufferSize, &ulSize);
if (status == STATUS_INFO_LENGTH_MISMATCH) {
HeapFree(GetProcessHeap(), 0, SysHandleInfoData);
}
} while (status == STATUS_INFO_LENGTH_MISMATCH);
/* Get process information
* We don't know how much data there is so just keep
* increasing the buffer size until the call succeeds
*/
BufferSize = 0;
do
{
BufferSize += 0x10000;
pBuffer = (LPBYTE)HeapAlloc(GetProcessHeap(), 0, BufferSize);
status = NtQuerySystemInformation(SystemProcessInformation, pBuffer, BufferSize, &ulSize);
if (status == STATUS_INFO_LENGTH_MISMATCH) {
HeapFree(GetProcessHeap(), 0, pBuffer);
}
} while (status == STATUS_INFO_LENGTH_MISMATCH);
EnterCriticalSection(&PerfDataCriticalSection);
/*
* Save system performance info
*/
memcpy(&SystemPerfInfo, &SysPerfInfo, sizeof(SYSTEM_PERFORMANCE_INFORMATION));
/*
* Save system cache info
*/
memcpy(&SystemCacheInfo, &SysCacheInfo, sizeof(SYSTEM_CACHE_INFORMATION));
/*
* Save system processor time info
*/
if (SystemProcessorTimeInfo) {
HeapFree(GetProcessHeap(), 0, SystemProcessorTimeInfo);
}
SystemProcessorTimeInfo = SysProcessorTimeInfo;
/*
* Save system handle info
*/
memcpy(&SystemHandleInfo, SysHandleInfoData, sizeof(SYSTEM_HANDLE_INFORMATION));
HeapFree(GetProcessHeap(), 0, SysHandleInfoData);
for (CurrentKernelTime=0, Idx=0; Idx<(ULONG)SystemBasicInfo.NumberOfProcessors; Idx++) {
CurrentKernelTime += Li2Double(SystemProcessorTimeInfo[Idx].KernelTime);
CurrentKernelTime += Li2Double(SystemProcessorTimeInfo[Idx].DpcTime);
CurrentKernelTime += Li2Double(SystemProcessorTimeInfo[Idx].InterruptTime);
}
/* If it's a first call - skip idle time calcs */
if (liOldIdleTime.QuadPart != 0) {
/* CurrentValue = NewValue - OldValue */
dbIdleTime = Li2Double(SysPerfInfo.IdleProcessTime) - Li2Double(liOldIdleTime);
dbKernelTime = CurrentKernelTime - OldKernelTime;
dbSystemTime = Li2Double(SysTimeInfo.CurrentTime) - Li2Double(liOldSystemTime);
/* CurrentCpuIdle = IdleTime / SystemTime */
dbIdleTime = dbIdleTime / dbSystemTime;
dbKernelTime = dbKernelTime / dbSystemTime;
/* CurrentCpuUsage% = 100 - (CurrentCpuIdle * 100) / NumberOfProcessors */
dbIdleTime = 100.0 - dbIdleTime * 100.0 / (double)SystemBasicInfo.NumberOfProcessors; /* + 0.5; */
dbKernelTime = 100.0 - dbKernelTime * 100.0 / (double)SystemBasicInfo.NumberOfProcessors; /* + 0.5; */
}
/* Store new CPU's idle and system time */
liOldIdleTime = SysPerfInfo.IdleProcessTime;
liOldSystemTime = SysTimeInfo.CurrentTime;
OldKernelTime = CurrentKernelTime;
/* Determine the process count
* We loop through the data we got from NtQuerySystemInformation
* and count how many structures there are (until RelativeOffset is 0)
*/
ProcessCountOld = ProcessCount;
ProcessCount = 0;
pSPI = (PSYSTEM_PROCESS_INFORMATION)pBuffer;
while (pSPI) {
ProcessCount++;
if (pSPI->NextEntryOffset == 0)
break;
pSPI = (PSYSTEM_PROCESS_INFORMATION)((LPBYTE)pSPI + pSPI->NextEntryOffset);
}
/* Now alloc a new PERFDATA array and fill in the data */
if (pPerfDataOld) {
HeapFree(GetProcessHeap(), 0, pPerfDataOld);
}
pPerfDataOld = pPerfData;
pPerfData = (PPERFDATA)HeapAlloc(GetProcessHeap(), 0, sizeof(PERFDATA) * ProcessCount);
pSPI = (PSYSTEM_PROCESS_INFORMATION)pBuffer;
for (Idx=0; Idx< ProcessCount; Idx++) {
/* Get the old perf data for this process (if any) */
/* so that we can establish delta values */
pPDOld = NULL;
for (Idx2=0; Idx2< ProcessCountOld; Idx2++)
{
if (pPerfDataOld[Idx2].ProcessId == pSPI->UniqueProcessId) {
pPDOld = &pPerfDataOld[Idx2];
break;
}
}
/* Clear out process perf data structure */
memset(&pPerfData[Idx], 0, sizeof(PERFDATA));
if (pSPI->ImageName.Buffer)
wcscpy(pPerfData[Idx].ImageName, pSPI->ImageName.Buffer);
else
{
// LoadStringW(hInst, IDS_IDLE_PROCESS, pPerfData[Idx].ImageName,
// sizeof(pPerfData[Idx].ImageName) / sizeof(pPerfData[Idx].ImageName[0]));
}
pPerfData[Idx].ProcessId = pSPI->UniqueProcessId;
if (pPDOld) {
double CurTime = Li2Double(pSPI->KernelTime) + Li2Double(pSPI->UserTime);
double OldTime = Li2Double(pPDOld->KernelTime) + Li2Double(pPDOld->UserTime);
double CpuTime = (CurTime - OldTime) / dbSystemTime;
CpuTime = CpuTime * 100.0 / (double)SystemBasicInfo.NumberOfProcessors; /* + 0.5; */
pPerfData[Idx].CPUUsage = (ULONG)CpuTime;
}
pPerfData[Idx].CPUTime.QuadPart = pSPI->UserTime.QuadPart + pSPI->KernelTime.QuadPart;
pPerfData[Idx].WorkingSetSizeBytes = pSPI->WorkingSetSize;
pPerfData[Idx].PeakWorkingSetSizeBytes = pSPI->PeakWorkingSetSize;
if (pPDOld)
pPerfData[Idx].WorkingSetSizeDelta = labs((LONG)pSPI->WorkingSetSize - (LONG)pPDOld->WorkingSetSizeBytes);
else
pPerfData[Idx].WorkingSetSizeDelta = 0;
pPerfData[Idx].PageFaultCount = pSPI->PageFaultCount;
if (pPDOld)
pPerfData[Idx].PageFaultCountDelta = labs((LONG)pSPI->PageFaultCount - (LONG)pPDOld->PageFaultCount);
else
pPerfData[Idx].PageFaultCountDelta = 0;
pPerfData[Idx].VirtualMemorySizeBytes = pSPI->VirtualSize;
pPerfData[Idx].PagedPoolUsagePages = pSPI->QuotaPeakPagedPoolUsage;
pPerfData[Idx].NonPagedPoolUsagePages = pSPI->QuotaPeakNonPagedPoolUsage;
pPerfData[Idx].BasePriority = pSPI->BasePriority;
pPerfData[Idx].HandleCount = pSPI->HandleCount;
pPerfData[Idx].ThreadCount = pSPI->NumberOfThreads;
pPerfData[Idx].SessionId = pSPI->SessionId;
pPerfData[Idx].UserName[0] = _T('/0');
pPerfData[Idx].USERObjectCount = 0;
pPerfData[Idx].GDIObjectCount = 0;
ProcessUser = SystemUserSid;
ProcessSD = NULL;
if (pSPI->UniqueProcessId != NULL) {
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | READ_CONTROL, FALSE, PtrToUlong(pSPI->UniqueProcessId));
if (hProcess) {
/* don't query the information of the system process. It's possible but
returns Administrators as the owner of the process instead of SYSTEM */
if (pSPI->UniqueProcessId != 0x4)
{
if (OpenProcessToken(hProcess, TOKEN_QUERY, &hProcessToken))
{
DWORD RetLen = 0;
BOOL Ret;
Ret = GetTokenInformation(hProcessToken, TokenUser, (LPVOID)Buffer, sizeof(Buffer), &RetLen);
CloseHandle(hProcessToken);
if (Ret)
ProcessUser = ((PTOKEN_USER)Buffer)->User.Sid;
else
goto ReadProcOwner;
}
else
{
ReadProcOwner:
;
// GetSecurityInfo(hProcess, SE_KERNEL_OBJECT, OWNER_SECURITY_INFORMATION, &ProcessUser, NULL, NULL, NULL, &ProcessSD);
}
pPerfData[Idx].USERObjectCount = GetGuiResources(hProcess, GR_USEROBJECTS);
pPerfData[Idx].GDIObjectCount = GetGuiResources(hProcess, GR_GDIOBJECTS);
}
GetProcessIoCounters(hProcess, &pPerfData[Idx].IOCounters);
CloseHandle(hProcess);
} else {
goto ClearInfo;
}
} else {
ClearInfo:
/* clear information we were unable to fetch */
ZeroMemory(&pPerfData[Idx].IOCounters, sizeof(IO_COUNTERS));
}
//SidToUserName(ProcessUser, pPerfData[Idx].UserName, sizeof(pPerfData[0].UserName) / sizeof(pPerfData[0].UserName[0]));
if (ProcessSD != NULL)
{
LocalFree((HLOCAL)ProcessSD);
}
pPerfData[Idx].UserTime.QuadPart = pSPI->UserTime.QuadPart;
pPerfData[Idx].KernelTime.QuadPart = pSPI->KernelTime.QuadPart;
pSPI = (PSYSTEM_PROCESS_INFORMATION)((LPBYTE)pSPI + pSPI->NextEntryOffset);
}
HeapFree(GetProcessHeap(), 0, pBuffer);
LeaveCriticalSection(&PerfDataCriticalSection);
}
JNIEXPORT jlong JNICALL Java_com_swjtu_hardinfo_SystemLoad_PerfDataGetProcessCount
(JNIEnv *, jclass)
//ULONG PerfDataGetProcessCount(void)//获得进程数目
{
return ProcessCount;
}
JNIEXPORT jlong JNICALL Java_com_swjtu_hardinfo_SystemLoad_PerfDataGetProcessorUsage
(JNIEnv *, jclass)
//ULONG PerfDataGetProcessorUsage(void)//获得CPU使用率
{
return (ULONG)dbIdleTime;
}
ULONG PerfDataGetProcessorSystemUsage(void)
{
return (ULONG)dbKernelTime;
}
BOOL PerfDataGetImageName(ULONG Index, LPTSTR lpImageName, int nMaxCount)
{
BOOL bSuccessful;
EnterCriticalSection(&PerfDataCriticalSection);
if (Index < ProcessCount) {
#ifdef _UNICODE
wcsncpy(lpImageName, pPerfData[Index].ImageName, nMaxCount);
#else
WideCharToMultiByte(CP_ACP, 0, pPerfData[Index].ImageName, -1, lpImageName, nMaxCount, NULL, NULL);
#endif
bSuccessful = TRUE;
} else {
bSuccessful = FALSE;
}
LeaveCriticalSection(&PerfDataCriticalSection);
return bSuccessful;
}
int PerfGetIndexByProcessId(DWORD dwProcessId)
{
int Index, FoundIndex = -1;
EnterCriticalSection(&PerfDataCriticalSection);
for (Index = 0; Index < (int)ProcessCount; Index++)
{
if ((DWORD)pPerfData[Index].ProcessId == dwProcessId)
{
FoundIndex = Index;
break;
}
}
LeaveCriticalSection(&PerfDataCriticalSection);
return FoundIndex;
}
ULONG PerfDataGetProcessId(ULONG Index)
{
ULONG ProcessId;
EnterCriticalSection(&PerfDataCriticalSection);
if (Index < ProcessCount)
ProcessId = (ULONG)pPerfData[Index].ProcessId;
else
ProcessId = 0;
LeaveCriticalSection(&PerfDataCriticalSection);
return ProcessId;
}
BOOL PerfDataGetUserName(ULONG Index, LPTSTR lpUserName, int nMaxCount)
{
BOOL bSuccessful;
EnterCriticalSection(&PerfDataCriticalSection);
if (Index < ProcessCount) {
#ifdef _UNICODE
wcsncpy(lpUserName, pPerfData[Index].UserName, nMaxCount);
#else
WideCharToMultiByte(CP_ACP, 0, pPerfData[Index].UserName, -1, lpUserName, nMaxCount, NULL, NULL);
#endif
bSuccessful = TRUE;
} else {
bSuccessful = FALSE;
}
LeaveCriticalSection(&PerfDataCriticalSection);
return bSuccessful;
}
ULONG PerfDataGetSessionId(ULONG Index)
{
ULONG SessionId;
EnterCriticalSection(&PerfDataCriticalSection);
if (Index < ProcessCount)
SessionId = pPerfData[Index].SessionId;
else
SessionId = 0;
LeaveCriticalSection(&PerfDataCriticalSection);
return SessionId;
}
ULONG PerfDataGetCPUUsage(ULONG Index)
{
ULONG CpuUsage;
EnterCriticalSection(&PerfDataCriticalSection);
if (Index < ProcessCount)
CpuUsage = pPerfData[Index].CPUUsage;
else
CpuUsage = 0;
LeaveCriticalSection(&PerfDataCriticalSection);
return CpuUsage;
}
LARGE_INTEGER PerfDataGetCPUTime(ULONG Index)
{
LARGE_INTEGER CpuTime = {{0,0}};
EnterCriticalSection(&PerfDataCriticalSection);
if (Index < ProcessCount)
CpuTime = pPerfData[Index].CPUTime;
LeaveCriticalSection(&PerfDataCriticalSection);
return CpuTime;
}
ULONG PerfDataGetWorkingSetSizeBytes(ULONG Index)
{
ULONG WorkingSetSizeBytes;
EnterCriticalSection(&PerfDataCriticalSection);
if (Index < ProcessCount)
WorkingSetSizeBytes = pPerfData[Index].WorkingSetSizeBytes;
else
WorkingSetSizeBytes = 0;
LeaveCriticalSection(&PerfDataCriticalSection);
return WorkingSetSizeBytes;
}
ULONG PerfDataGetPeakWorkingSetSizeBytes(ULONG Index)
{
ULONG PeakWorkingSetSizeBytes;
EnterCriticalSection(&PerfDataCriticalSection);
if (Index < ProcessCount)
PeakWorkingSetSizeBytes = pPerfData[Index].PeakWorkingSetSizeBytes;
else
PeakWorkingSetSizeBytes = 0;
LeaveCriticalSection(&PerfDataCriticalSection);
return PeakWorkingSetSizeBytes;
}
ULONG PerfDataGetWorkingSetSizeDelta(ULONG Index)
{
ULONG WorkingSetSizeDelta;
EnterCriticalSection(&PerfDataCriticalSection);
if (Index < ProcessCount)
WorkingSetSizeDelta = pPerfData[Index].WorkingSetSizeDelta;
else
WorkingSetSizeDelta = 0;
LeaveCriticalSection(&PerfDataCriticalSection);
return WorkingSetSizeDelta;
}
ULONG PerfDataGetPageFaultCount(ULONG Index)
{
ULONG PageFaultCount;
EnterCriticalSection(&PerfDataCriticalSection);
if (Index < ProcessCount)
PageFaultCount = pPerfData[Index].PageFaultCount;
else
PageFaultCount = 0;
LeaveCriticalSection(&PerfDataCriticalSection);
return PageFaultCount;
}
ULONG PerfDataGetPageFaultCountDelta(ULONG Index)
{
ULONG PageFaultCountDelta;
EnterCriticalSection(&PerfDataCriticalSection);
if (Index < ProcessCount)
PageFaultCountDelta = pPerfData[Index].PageFaultCountDelta;
else
PageFaultCountDelta = 0;
LeaveCriticalSection(&PerfDataCriticalSection);
return PageFaultCountDelta;
}
ULONG PerfDataGetVirtualMemorySizeBytes(ULONG Index)
{
ULONG VirtualMemorySizeBytes;
EnterCriticalSection(&PerfDataCriticalSection);
if (Index < ProcessCount)
VirtualMemorySizeBytes = pPerfData[Index].VirtualMemorySizeBytes;
else
VirtualMemorySizeBytes = 0;
LeaveCriticalSection(&PerfDataCriticalSection);
return VirtualMemorySizeBytes;
}
ULONG PerfDataGetPagedPoolUsagePages(ULONG Index)
{
ULONG PagedPoolUsage;
EnterCriticalSection(&PerfDataCriticalSection);
if (Index < ProcessCount)
PagedPoolUsage = pPerfData[Index].PagedPoolUsagePages;
else
PagedPoolUsage = 0;
LeaveCriticalSection(&PerfDataCriticalSection);
return PagedPoolUsage;
}
ULONG PerfDataGetNonPagedPoolUsagePages(ULONG Index)
{
ULONG NonPagedPoolUsage;
EnterCriticalSection(&PerfDataCriticalSection);
if (Index < ProcessCount)
NonPagedPoolUsage = pPerfData[Index].NonPagedPoolUsagePages;
else
NonPagedPoolUsage = 0;
LeaveCriticalSection(&PerfDataCriticalSection);
return NonPagedPoolUsage;
}
ULONG PerfDataGetBasePriority(ULONG Index)
{
ULONG BasePriority;
EnterCriticalSection(&PerfDataCriticalSection);
if (Index < ProcessCount)
BasePriority = pPerfData[Index].BasePriority;
else
BasePriority = 0;
LeaveCriticalSection(&PerfDataCriticalSection);
return BasePriority;
}
//进程的句柄数
ULONG PerfDataGetHandleCount(ULONG Index)
{
ULONG HandleCount;
EnterCriticalSection(&PerfDataCriticalSection);
if (Index < ProcessCount)
HandleCount = pPerfData[Index].HandleCount;
else
HandleCount = 0;
LeaveCriticalSection(&PerfDataCriticalSection);
return HandleCount;
}
// 进程的线程数
ULONG PerfDataGetThreadCount(ULONG Index)
{
ULONG ThreadCount;
EnterCriticalSection(&PerfDataCriticalSection);
if (Index < ProcessCount)
ThreadCount = pPerfData[Index].ThreadCount;
else
ThreadCount = 0;
LeaveCriticalSection(&PerfDataCriticalSection);
return ThreadCount;
}
ULONG PerfDataGetUSERObjectCount(ULONG Index)
{
ULONG USERObjectCount;
EnterCriticalSection(&PerfDataCriticalSection);
if (Index < ProcessCount)
USERObjectCount = pPerfData[Index].USERObjectCount;
else
USERObjectCount = 0;
LeaveCriticalSection(&PerfDataCriticalSection);
return USERObjectCount;
}
ULONG PerfDataGetGDIObjectCount(ULONG Index)
{
ULONG GDIObjectCount;
EnterCriticalSection(&PerfDataCriticalSection);
if (Index < ProcessCount)
GDIObjectCount = pPerfData[Index].GDIObjectCount;
else
GDIObjectCount = 0;
LeaveCriticalSection(&PerfDataCriticalSection);
return GDIObjectCount;
}
BOOL PerfDataGetIOCounters(ULONG Index, PIO_COUNTERS pIoCounters)
{
BOOL bSuccessful;
EnterCriticalSection(&PerfDataCriticalSection);
if (Index < ProcessCount)
{
memcpy(pIoCounters, &pPerfData[Index].IOCounters, sizeof(IO_COUNTERS));
bSuccessful = TRUE;
}
else
bSuccessful = FALSE;
LeaveCriticalSection(&PerfDataCriticalSection);
return bSuccessful;
}
//提交总量
JNIEXPORT jlong JNICALL Java_com_swjtu_hardinfo_SystemLoad_PerfDataGetCommitChargeTotalK
(JNIEnv *, jclass)
//ULONG PerfDataGetCommitChargeTotalK(void)
{
ULONG Total;
ULONG PageSize;
EnterCriticalSection(&PerfDataCriticalSection);
Total = SystemPerfInfo.CommittedPages;
PageSize = SystemBasicInfo.PageSize;
LeaveCriticalSection(&PerfDataCriticalSection);
Total = Total * (PageSize / 1024);
return Total;
}
//提交限制
JNIEXPORT jlong JNICALL Java_com_swjtu_hardinfo_SystemLoad_PerfDataGetCommitChargeLimitK
(JNIEnv *, jclass)
//ULONG PerfDataGetCommitChargeLimitK(void)
{
ULONG Limit;
ULONG PageSize;
EnterCriticalSection(&PerfDataCriticalSection);
Limit = SystemPerfInfo.CommitLimit;
PageSize = SystemBasicInfo.PageSize;
LeaveCriticalSection(&PerfDataCriticalSection);
Limit = Limit * (PageSize / 1024);
return Limit;
}
//提交峰值
JNIEXPORT jlong JNICALL Java_com_swjtu_hardinfo_SystemLoad_PerfDataGetCommitChargePeakK
(JNIEnv *, jclass)
//ULONG PerfDataGetCommitChargePeakK(void)
{
ULONG Peak;
ULONG PageSize;
EnterCriticalSection(&PerfDataCriticalSection);
Peak = SystemPerfInfo.PeakCommitment;
PageSize = SystemBasicInfo.PageSize;
LeaveCriticalSection(&PerfDataCriticalSection);
Peak = Peak * (PageSize / 1024);
return Peak;
}
//核心内存总量
JNIEXPORT jlong JNICALL Java_com_swjtu_hardinfo_SystemLoad_PerfDataGetKernelMemoryTotalK
(JNIEnv *, jclass)
//ULONG PerfDataGetKernelMemoryTotalK(void)
{
ULONG Total;
ULONG Paged;
ULONG NonPaged;
ULONG PageSize;
EnterCriticalSection(&PerfDataCriticalSection);
Paged = SystemPerfInfo.PagedPoolPages;
NonPaged = SystemPerfInfo.NonPagedPoolPages;
PageSize = SystemBasicInfo.PageSize;
LeaveCriticalSection(&PerfDataCriticalSection);
Paged = Paged * (PageSize / 1024);
NonPaged = NonPaged * (PageSize / 1024);
Total = Paged + NonPaged;
return Total;
}
//内核分页内存
JNIEXPORT jlong JNICALL Java_com_swjtu_hardinfo_SystemLoad_PerfDataGetKernelMemoryPagedK
(JNIEnv *, jclass)
//ULONG PerfDataGetKernelMemoryPagedK(void)
{
ULONG Paged;
ULONG PageSize;
EnterCriticalSection(&PerfDataCriticalSection);
Paged = SystemPerfInfo.PagedPoolPages;
PageSize = SystemBasicInfo.PageSize;
LeaveCriticalSection(&PerfDataCriticalSection);
Paged = Paged * (PageSize / 1024);
return Paged;
}
//内核非分页内存
JNIEXPORT jlong JNICALL Java_com_swjtu_hardinfo_SystemLoad_PerfDataGetKernelMemoryNonPagedK
(JNIEnv *, jclass)
//ULONG PerfDataGetKernelMemoryNonPagedK(void)
{
ULONG NonPaged;
ULONG PageSize;
EnterCriticalSection(&PerfDataCriticalSection);
NonPaged = SystemPerfInfo.NonPagedPoolPages;
PageSize = SystemBasicInfo.PageSize;
LeaveCriticalSection(&PerfDataCriticalSection);
NonPaged = NonPaged * (PageSize / 1024);
return NonPaged;
}
//总物理内存
JNIEXPORT jlong JNICALL Java_com_swjtu_hardinfo_SystemLoad_PerfDataGetPhysicalMemoryTotalK
(JNIEnv *, jclass)
//ULONG PerfDataGetPhysicalMemoryTotalK(void)
{
ULONG Total;
ULONG PageSize;
EnterCriticalSection(&PerfDataCriticalSection);
Total = SystemBasicInfo.NumberOfPhysicalPages;
PageSize = SystemBasicInfo.PageSize;
LeaveCriticalSection(&PerfDataCriticalSection);
Total = Total * (PageSize / 1024);
return Total;
}
//可用物理内存
JNIEXPORT jlong JNICALL Java_com_swjtu_hardinfo_SystemLoad_PerfDataGetPhysicalMemoryAvailableK
(JNIEnv *, jclass)
//ULONG PerfDataGetPhysicalMemoryAvailableK(void)
{
ULONG Available;
ULONG PageSize;
EnterCriticalSection(&PerfDataCriticalSection);
Available = SystemPerfInfo.AvailablePages;
PageSize = SystemBasicInfo.PageSize;
LeaveCriticalSection(&PerfDataCriticalSection);
Available = Available * (PageSize / 1024);
return Available;
}
//物理内存系统缓存
JNIEXPORT jlong JNICALL Java_com_swjtu_hardinfo_SystemLoad_PerfDataGetPhysicalMemorySystemCacheK
(JNIEnv *, jclass)
//ULONG PerfDataGetPhysicalMemorySystemCacheK(void)
{
ULONG SystemCache;
ULONG PageSize;
EnterCriticalSection(&PerfDataCriticalSection);
PageSize = SystemBasicInfo.PageSize;
SystemCache = SystemCacheInfo.unused[0] * PageSize;
LeaveCriticalSection(&PerfDataCriticalSection);
return SystemCache /1024;
}
//句柄数
JNIEXPORT jlong JNICALL Java_com_swjtu_hardinfo_SystemLoad_PerfDataGetSystemHandleCount
(JNIEnv *, jclass)
//ULONG PerfDataGetSystemHandleCount(void)
{
ULONG HandleCount;
EnterCriticalSection(&PerfDataCriticalSection);
HandleCount = SystemHandleInfo.Count;
LeaveCriticalSection(&PerfDataCriticalSection);
return HandleCount;
}
//线程数
JNIEXPORT jlong JNICALL Java_com_swjtu_hardinfo_SystemLoad_PerfDataGetTotalThreadCount
(JNIEnv *, jclass)
//ULONG PerfDataGetTotalThreadCount(void)
{
ULONG ThreadCount = 0;
ULONG i;
EnterCriticalSection(&PerfDataCriticalSection);
for (i=0; i< ProcessCount; i++)
{
ThreadCount += pPerfData[i].ThreadCount;
}
LeaveCriticalSection(&PerfDataCriticalSection);
return ThreadCount;
}
/*
int main()
{
PerfDataInitialize();
while (1)
{
//...get data
//for eg.
PerfDataRefresh();
cout <<"CPU使用率: "<< PerfDataGetProcessorUsage()<< endl;
//cout <<"信息: "<< PerfDataGetProcessorSystemUsage()<< endl;
cout <<"认可用量(K),总数:"<< PerfDataGetCommitChargeTotalK()<< endl;
cout <<"认可用量(K),限制:"<< PerfDataGetCommitChargeLimitK()<< endl;
cout <<"认可用量(K),峰值:"<< PerfDataGetCommitChargePeakK()<< endl;
cout <<"核心内存(K),总数:"<< PerfDataGetKernelMemoryTotalK()<< endl;
cout <<"核心内存(K),分页数:"<< PerfDataGetKernelMemoryPagedK()<< endl;
cout <<"核心内存(K),未分页:"<< PerfDataGetKernelMemoryNonPagedK()<< endl;
cout <<"物理内存(K),总数:"<< PerfDataGetPhysicalMemoryTotalK()<< endl;
cout <<"物理内存(K),可用数:"<< PerfDataGetPhysicalMemoryAvailableK()<< endl;
cout <<"物理内存(K),系统缓存:"<< PerfDataGetPhysicalMemorySystemCacheK()<< endl;
cout <<"总数,句柄数:"<< PerfDataGetSystemHandleCount()<< endl;
cout <<"总数,线程数:"<< PerfDataGetTotalThreadCount()<< endl;
cout <<"总数,进程数目: "<< PerfDataGetProcessCount()<< endl;
cout <<"CPU: PID:0 ,Usage: "<< PerfDataGetCPUUsage(PerfGetIndexByProcessId(0))<< endl;
cout <<"CPU: PID:0 ,Usage: "<< PerfDataGetCPUUsage(PerfGetIndexByProcessId(4))<< endl;
Sleep(1000);
}
return 0;
}
*/