WinRing0 是一个强大的驱动程序,可以直接通过这个驱动读取CPUID,CPU MSR,TSC,IO port,PCI config等硬件信息。在WinRing0_1_3_1b版本之前是一个开源项目,之后就关闭了。而且目前的最新版本WinRing0 2.0.0.20已经阉割掉了全部的写寄存器的功能,之留下了读取CPUID,CPU MSR,TSC的功能。不能不说是一大遗憾。
2.0.0.20版本已经出来八年多了,比较明显的变化就是移除了WinRing0x64.dll,只能编译32位的程序,不然load dll会Fail。WinRing0使用还是比较简单的,只需要在自己的程序里面include OlsDef.h和OlsApiInit.h,然后Call WinRing0.dll里面的函数就好了。但是没有见有人用过这个版本,这里写一个简单的读取Intel CPU 温度的程序做个例子。例程如下:
HMODULE m_hOpenLibSys;
DWORD eax, edx;
DWORD TjMax;
DWORD IAcore;
DWORD PKGsts;
int Cputemp;
m_hOpenLibSys = NULL;
if (InitOpenLibSys(&m_hOpenLibSys) != TRUE)
{
std::cout << "DLL Load Error!\n";
return FALSE;
}
Rdmsr(0x1A2, &eax, &edx);
TjMax = eax;
TjMax &= 0xFF0000;
TjMax = TjMax >> 16;
Rdmsr(0x19C, &eax, &edx);
IAcore = eax;
IAcore &= 0xFF0000;
IAcore = IAcore >> 16;
Cputemp = (int)(TjMax - IAcore);
std::cout << "Cputemp :" << std::hex << Cputemp << "\n";