步骤一:在“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任务管理器的对比如下:

 

java 任务模式 java任务管理器_performance

 

经过修改和测试,其最终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;
}

*/