qq_20835381 2016-05-18 05:51 采纳率: 25%
浏览 3602
已采纳

这是一个C++写的Windows下读取CPU温度的程序但是读不出来温度啊?

我是VC6写的代码如下 顺便问下大家谁有读windows的CPU占用率和内存占用的程序 小弟很急啊 在线等希望各位大神能够出手帮助啊
#include "stdafx.h"
#include "CPUTemperature.h"
#include "CPUTemperatureDlg.h"
#include
#include
#include
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
#define MYWINRIN0 _T("MyWinRing0")
#define OLS_DRIVER_ID _T("WinRing0_1_2_0")
#define OLS_TYPE 40000
#define IOCTL_OLS_READ_MSR \
CTL_CODE(OLS_TYPE, 0x821, METHOD_BUFFERED, FILE_ANY_ACCESS)
BOOL gIsMsr = TRUE;
TCHAR gDriverPath[MAX_PATH];
HANDLE gHandle = INVALID_HANDLE_VALUE;

void LoadDriver();
BOOL StopDriver(SC_HANDLE hSCManager,LPCTSTR DriverId);
BOOL RemoveDriver(SC_HANDLE hSCManager, LPCTSTR DriverId);
BOOL IsFileExist(LPCTSTR fileName);
BOOL Initialize();
void LoadDriver();
BOOL OpenDriver();
void Remove();
BOOL WINAPI Rdmsr(DWORD index, PDWORD eax, PDWORD edx);
CCPUTemperatureDlg::CCPUTemperatureDlg(CWnd* pParent /*=NULL*/)
: CDialog(CCPUTemperatureDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CCPUTemperatureDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CCPUTemperatureDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_WM_TIMER()
END_MESSAGE_MAP()
BOOL CCPUTemperatureDlg::OnInitDialog()
{
CDialog::OnInitDialog();

SetTimer(123,1000,NULL);
Remove();
Initialize();
return TRUE; 

}
void Remove()
{
SC_HANDLE hSCManager = NULL;
hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
StopDriver(hSCManager,MYWINRIN0);
RemoveDriver(hSCManager,MYWINRIN0);
CloseServiceHandle(hSCManager);
}
//打开驱动
BOOL OpenDriver()
{
char message[256]="0";
char *str=_T("\\.\") OLS_DRIVER_ID ;
gHandle = CreateFile(
_T("\\.\") OLS_DRIVER_ID,
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL
);
int code=GetLastError();
if(gHandle == INVALID_HANDLE_VALUE)
{
return FALSE;
}
return TRUE;
}

BOOL Initialize()
{
TCHAR dir[MAX_PATH];
TCHAR *ptr;

GetModuleFileName(NULL, dir, MAX_PATH);
if((ptr = _tcsrchr(dir, '\\')) != NULL)
{
    *ptr = '\0';
}
wsprintf(gDriverPath, _T("%s\\%s"), dir, _T("WinRing0.sys"));
if(IsFileExist(gDriverPath) == FALSE)
{
    return FALSE;
}
if(OpenDriver())
{
    return TRUE;
}
else
{
    LoadDriver();
    OpenDriver();
}

}
BOOL IsFileExist(LPCTSTR fileName)
{
WIN32_FIND_DATA findData;

HANDLE hFile = FindFirstFile(fileName, &findData);
if(hFile != INVALID_HANDLE_VALUE)
{
    FindClose( hFile );
    return TRUE;
}
else
{
    return FALSE;
}

}
//加载驱动
void LoadDriver()
{
SC_HANDLE hSCManager = NULL;
SC_HANDLE hService = NULL;
SC_HANDLE hService1 = NULL;
hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
hService = CreateService(hSCManager,
MYWINRIN0,
MYWINRIN0,
SERVICE_ALL_ACCESS,
SERVICE_KERNEL_DRIVER,
SERVICE_DEMAND_START,
SERVICE_ERROR_NORMAL,
gDriverPath,
NULL,
NULL,
NULL,
NULL,
NULL
);
CloseServiceHandle(hService);
hService1 = OpenService(hSCManager, MYWINRIN0, SERVICE_ALL_ACCESS);
int result=StartService(hService1, 0, NULL);
CloseServiceHandle(hSCManager);
CloseServiceHandle(hService1);
}
BOOL StopDriver(SC_HANDLE hSCManager,LPCTSTR DriverId)
{
SC_HANDLE hService = NULL;
BOOL rCode = FALSE;
SERVICE_STATUS serviceStatus;
DWORD error = NO_ERROR;

hService = OpenService(hSCManager, DriverId, SERVICE_ALL_ACCESS);

if(hService != NULL)
{
    rCode = ControlService(hService, SERVICE_CONTROL_STOP, &serviceStatus);
    error = GetLastError();
    CloseServiceHandle(hService);
}

return rCode;

}
BOOL RemoveDriver(SC_HANDLE hSCManager, LPCTSTR DriverId)
{
SC_HANDLE hService = NULL;
BOOL rCode = FALSE;

hService = OpenService(hSCManager, DriverId, SERVICE_ALL_ACCESS);
if(hService == NULL)
{
    rCode = TRUE;
}
else
{
    rCode = DeleteService(hService);
    CloseServiceHandle(hService);
}

return rCode;

}

DWORD GetCpuInfo( DWORD veax)
{
DWORD deax, debx, decx, dedx;
__asm
{
push eax;
push ebx;
push ecx;
push edx;

    mov eax, veax;
    cpuid;
    mov deax, eax;
    mov debx, ebx;
    mov decx, ecx;
    mov dedx, edx;

    pop edx;
    pop ecx;
    pop ebx;
    pop eax;
}
return deax;

}

//读取msr寄存器
BOOL WINAPI Rdmsr(DWORD index, PDWORD eax, PDWORD edx)
{
if(gHandle == INVALID_HANDLE_VALUE)
{
return FALSE;
}
if(eax == NULL || edx == NULL || gIsMsr == FALSE)
{
return FALSE;
}
DWORD returnedLength = 0;
BOOL result = FALSE;
BYTE outBuf[8] = {0};
result = DeviceIoControl(
gHandle,
IOCTL_OLS_READ_MSR,
&index,
sizeof(index),
&outBuf,
sizeof(outBuf),
&returnedLength,
NULL
);
if(result)
{
memcpy(eax, outBuf, 4);
memcpy(edx, outBuf + 4, 4);
}
if(result)
{
return TRUE;
}
else
{
return FALSE;
}
}
void CCPUTemperatureDlg::OnCancel()
{
//卸载驱动
Remove();
CDialog::OnCancel();
}

void CCPUTemperatureDlg::OnTimer(UINT_PTR nIDEvent)
{

DWORD eax_in;
DWORD eax_out;
eax_in= 1;
eax_out= GetCpuInfo(eax_in);
eax_in= 0;
eax_out= GetCpuInfo(eax_in);
eax_in= 6;
eax_out= GetCpuInfo(eax_in);

CEdit *edit=(CEdit*)GetDlgItem(IDC_EDIT1);
CEdit *edit1=(CEdit*)GetDlgItem(IDC_EDIT2);
DWORD eax=0,edx=0;
ULONG result;
char s[20];

Rdmsr(0xee,&eax,&edx);
Rdmsr(0x1a2,&eax,&edx);

result=SetThreadAffinityMask(GetCurrentThread(),1);

Rdmsr(0x19c,&eax,&edx);//read Temperature

//SetThreadAffinityMask(GetCurrentThread(),result);

sprintf(s,"%d",100-((eax&0x007f0000)>>16));
SetThreadAffinityMask(GetCurrentThread(),result);
edit->SetWindowText(s);

result=SetThreadAffinityMask(GetCurrentThread(),2);
Rdmsr(0x19c,&eax,&edx);//read Temperature
SetThreadAffinityMask(GetCurrentThread(),result);
sprintf(s,"%d",100-((eax&0x007f0000)>>16));
edit1->SetWindowText(s);
CDialog::OnTimer(nIDEvent);

}

  • 写回答

3条回答 默认 最新

  • 小灸舞 2016-05-18 07:24
    关注

    你这个太长了。。
    单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 Windows server update services
  • ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏
  • ¥15 模糊pid与pid仿真结果几乎一样
  • ¥15 java的GUI的运用
  • ¥15 Web.config连不上数据库
  • ¥15 我想付费需要AKM公司DSP开发资料及相关开发。
  • ¥15 怎么配置广告联盟瀑布流
  • ¥15 Rstudio 保存代码闪退
  • ¥20 win系统的PYQT程序生成的数据如何放入云服务器阿里云window版?
  • ¥50 invest生境质量模块