#include <windows.h>
#include "sysinfo.h"
BOOL WINAPI DllMain(HANDLE hHandle, DWORD dwReason, LPVOID lpReserved)
{
return TRUE;
}
JNIEXPORT jint JNICALL Java_sysInfo_getCPUSpeed(JNIEnv *, jclass)
{
LARGE_INTEGER ulFreq, ulTicks, ulValue, ulStartCounter, ulEAX_EDX, ulResult;
// it is number of ticks per seconds
QueryPerformanceFrequency(&ulFreq);
// current valueofthe performance counter
QueryPerformanceCounter(&ulTicks);
// calculate one second interval
ulValue.QuadPart = ulTicks.QuadPart + ulFreq.QuadPart;
// read time stamp counter
// this asm instruction load the highorder 32 bit of the register into EDX
// and the lower order 32 bits into EAX
_asm
{
rdtsc
mov ulEAX_EDX.LowPart, EAX
mov ulEAX_EDX.HighPart, EDX
}
// start no of ticks
ulStartCounter.QuadPart = ulEAX_EDX.QuadPart;
// loop for 1 second
do
{
QueryPerformanceCounter(&ulTicks);
} while (ulTicks.QuadPart <= ulValue.QuadPart);
// get the actual no of ticks
_asm
{
rdtsc
mov ulEAX_EDX.LowPart, EAX
mov ulEAX_EDX.HighPart, EDX
}
// calculate result
ulResult.QuadPart = ulEAX_EDX.QuadPart - ulStartCounter.QuadPart;
return (int)ulResult.QuadPart / 1000000;
}
JNIEXPORT jstring JNICALL Java_sysInfo_getCPUType(JNIEnv * env, jclass)
{
static char pszCPUType[13];
memset(pszCPUType, 0, 13);
_asm
{
mov eax, 0
cpuid
// getting information from EBX
mov pszCPUType[0], bl
mov pszCPUType[1], bh
ror ebx, 16
mov pszCPUType[2], bl
mov pszCPUType[3], bh
// getting information from EDX
mov pszCPUType[4], dl
mov pszCPUType[5], dh
ror edx, 16
mov pszCPUType[6], dl
mov pszCPUType[7], dh
// getting information from ECX
mov pszCPUType[8], cl
mov pszCPUType[9], ch
ror ecx, 16
mov pszCPUType[10], cl
mov pszCPUType[11], ch
}
pszCPUType[12] = '\0';
return env->NewStringUTF(pszCPUType);
}
JNIEXPORT jint JNICALL Java_sysInfo_getCPUFamily(JNIEnv *, jclass)
{
int retVal;
_asm
{
mov eax, 1
cpuid
mov retVal, eax
}
return (retVal >> 8);
}
JNIEXPORT jint JNICALL Java_sysInfo_getCPUModal(JNIEnv *, jclass)
{
int retVal;
_asm
{
mov eax, 1
cpuid
mov retVal, eax
}
return ((retVal >> 4 ) & 0x0000000f);
}
JNIEXPORT jint JNICALL Java_sysInfo_getCPUStepping(JNIEnv *, jclass)
{
int retVal;
_asm
{
mov eax, 1
cpuid
mov retVal, eax
}
return (retVal & 0x0000000f);
}