⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cpuinfodlg.cpp

📁 该小程序能枚举包括cup信息, bios信息, 内存
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// cpuinfoDlg.cpp : implementation file
//

#include "stdafx.h"
#include "cpuinfo.h"
#include "cpuinfoDlg.h"
#include ".\cpuinfodlg.h"



#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
typedef struct _OBJECT_ATTRIBUTES 
{
    ULONG        Length;
    HANDLE        RootDirectory;
    PUNICODE_STRING ObjectName;
    ULONG        Attributes;
    PVOID        SecurityDescriptor;
    PVOID        SecurityQualityOfService;
} OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES; 

typedef DWORD (__stdcall *ZWOS)(PHANDLE,ACCESS_MASK,POBJECT_ATTRIBUTES); 
typedef DWORD (__stdcall *ZWMV)(HANDLE,HANDLE,PVOID,ULONG,ULONG,PLARGE_INTEGER,PSIZE_T,DWORD,ULONG,ULONG); 
typedef DWORD (__stdcall *ZWUMV)(HANDLE,PVOID);


class CAboutDlg : public CDialog
{
public:
	CAboutDlg();
	
	// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA
	
	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL
	
	// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

int CCpuinfoDlg::GiveText(char* pMsg)
{
	strList = pMsg;
	m_list.AddString(strList);
	return 0;
}


CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CCpuinfoDlg dialog

CCpuinfoDlg::CCpuinfoDlg(CWnd* pParent /*=NULL*/)
: CDialog(CCpuinfoDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CCpuinfoDlg)
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CCpuinfoDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CCpuinfoDlg)
	DDX_Control(pDX, IDC_LIST1, m_list);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CCpuinfoDlg, CDialog)
//{{AFX_MSG_MAP(CCpuinfoDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
ON_BN_CLICKED(IDC_BUTTON2, OnButton2)
ON_WM_DESTROY()
ON_BN_CLICKED(IDC_BUTTON3, OnButton3)
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDC_BUTTON5, OnBnClickedButton5)
ON_BN_CLICKED(IDC_BUTTON6, OnBnClickedButton6)
ON_BN_CLICKED(IDC_BUTTON7, OnBnClickedButton7)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CCpuinfoDlg message handlers

BOOL CCpuinfoDlg::OnInitDialog()
{
	CDialog::OnInitDialog();
	
	// Add "About..." menu item to system menu.
	
	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);
	
	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}
	
	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// TODO: Add extra initialization here
	//CoInitializeEx(0, COINIT_MULTITHREADED);//多cpu
	//初始化 COM 接口:	
	CoInitialize(NULL);
	
	if(CoInitializeSecurity( NULL,
		-1,
		NULL,
		NULL,
		RPC_C_AUTHN_LEVEL_DEFAULT,
		RPC_C_IMP_LEVEL_IMPERSONATE,
		NULL,
		EOAC_NONE,
		NULL) != S_OK)
	{
		GiveText("初始化安全性失败。");
	}

	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CCpuinfoDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CCpuinfoDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting
		
		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
		
		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;
		
		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CCpuinfoDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void CCpuinfoDlg::OnButton1() 
{
	GiveText( "------------------------- 汇编调用信息 -----------------------");

	strList.Format("%s", "低级信息");
	m_list.AddString(strList);
	
	char cpuname[128],temp[128];
    CCPUInfo *MyCpu=new CCPUInfo();
    MyCpu->GetName(cpuname);
	
	strList.Format("Grade of CPU: %s", cpuname);
	m_list.AddString(strList);	
    
    DWORD lText = MyCpu->GetSpeed();
	strList.Format("Speed of CPU: %d", lText);
	m_list.AddString(strList);
	
	MyCpu->GetTypeName(temp);
	strList.Format("Type of CPU: %s", temp);
	m_list.AddString(strList);
	
    bool bFPU = MyCpu->hasFPU();
	if(bFPU)
	{
		strList.Format("%s", "Have FPU");
	}
	else
	{
		strList.Format("%s", "No FPU");
	}
	m_list.AddString(strList);
	
    bool bMMX = MyCpu->withMMX();
	if(bMMX)
	{
		strList.Format("%s", "Have MMX");
	}
	else
	{
		strList.Format("%s", "No MMX");
	}
	m_list.AddString(strList);
	
	CpuIDGet();
	
	MacAdpGet();
	
	BIOSInfoGet();
	
	delete MyCpu;
	
}

//////////////////////////////////////////////////////////////////////////

void CCpuinfoDlg::BIOSInfoGet()
{
	SIZE_T ssize; 
	char szSystemInfo[65535] = {0};
	UINT uSystemInfoLen = 0; 
	UINT uBiosSerialLen = 0;
	
	LARGE_INTEGER so; 
	so.LowPart = 0x000f0000;
	so.HighPart = 0x00000000; 
	ssize=0xffff; 
	wchar_t strPH[30]=L"\\device\\physicalmemory"; 
	
	DWORD ba=0;
	
	UNICODE_STRING struniph; 
	struniph.Buffer=strPH; 
	struniph.Length=0x2c; 
	struniph.MaximumLength =0x2e; 
	
	OBJECT_ATTRIBUTES obj_ar; 
	obj_ar.Attributes =64;
	obj_ar.Length =24;
	obj_ar.ObjectName=&struniph;
	obj_ar.RootDirectory=0; 
	obj_ar.SecurityDescriptor=0; 
	obj_ar.SecurityQualityOfService =0; 
	
	HMODULE hinstLib = LoadLibrary("ntdll.dll"); 
	ZWOS ZWopenS=(ZWOS)GetProcAddress(hinstLib,"ZwOpenSection"); 
	ZWMV ZWmapV=(ZWMV)GetProcAddress(hinstLib,"ZwMapViewOfSection"); 
	ZWUMV ZWunmapV=(ZWUMV)GetProcAddress(hinstLib,"ZwUnmapViewOfSection"); 
	
	//调用函数,对物理内存进行映射 
	HANDLE hSection; 
	if( 0 == ZWopenS(&hSection, 4, &obj_ar) && 
		0 == ZWmapV( 
		( HANDLE )hSection,   //打开Section时得到的句柄 
		( HANDLE )0xFFFFFFFF , //将要映射进程的句柄, 
		&ba,                  //映射的基址 
		0,
		0xFFFF,               //分配的大小 
		&so,                  //物理内存的地址 
		&ssize,               //指向读取内存块大小的指针 
		1,                    //子进程的可继承性设定 
		0,                    //分配类型 
		2                     //保护类型 
		) )
        //执行后会在当前进程的空间开辟一段64k的空间,
		//并把f000:0000到f000:ffff处的内容映射到这里 
        //映射的基址由ba返回,如果映射不再有用,
		//应该用ZwUnmapViewOfSection断开映射 
	{
		sizePage = ssize;
		BYTE* pBiosSerial = ( BYTE* )ba;
		uBiosSerialLen = FindAwardBios( &pBiosSerial );
		if( uBiosSerialLen == 0U )
		{
			uBiosSerialLen = FindAmiBios( &pBiosSerial );
			if( uBiosSerialLen == 0U )
			{
				uBiosSerialLen = FindPhoenixBios( &pBiosSerial );
			}
		}
		if( uBiosSerialLen != 0U )
		{
			CopyMemory( szSystemInfo + uSystemInfoLen, pBiosSerial, uBiosSerialLen );
			uSystemInfoLen += uBiosSerialLen;
		}
		
		ZWunmapV( ( HANDLE )0xFFFFFFFF, ( void* )ba );
	}
	if(uBiosSerialLen == 7)
	{
		strList.Format("Phoenix BIOS: %X", szSystemInfo);
		m_list.AddString(strList);	
		return;
	}
	if(uBiosSerialLen == 5)
	{
		strList.Format("Award BIOS: %X", szSystemInfo);
		m_list.AddString(strList);	
		return;
	}
	if(uBiosSerialLen == 3)
	{
		strList.Format("AMI BIOS: %X", szSystemInfo);
		m_list.AddString(strList);	
		return;
	}
	//上面只是根据特征码来搜索内存,判断bios
	strList.Format("BIOS: %X", szSystemInfo);
	m_list.AddString(strList);	
	
}

UINT CCpuinfoDlg::FindAwardBios( BYTE** ppBiosAddr )
{
	BYTE szBiosAward[8] = "Award";//Award
	BYTE szBiosAward2[8] = "AWARD";//Award
	BYTE szBiosAward3[8] = "award";//Award
	BYTE* pBiosAddr = * ppBiosAddr;
	for(DWORD i = 0; i < sizePage/128; i++)
	{
		for(int j = 0; j < 128; j++)
		{
			if(pBiosAddr[0] == szBiosAward[0]
				&& pBiosAddr[1] == szBiosAward[1]
				&& pBiosAddr[2] == szBiosAward[2]
				&& pBiosAddr[3] == szBiosAward[3]
				&& pBiosAddr[4] == szBiosAward[4])
			{
				return 5;
			}
			if(pBiosAddr[0] == szBiosAward2[0]
				&& pBiosAddr[1] == szBiosAward2[1]
				&& pBiosAddr[2] == szBiosAward2[2]
				&& pBiosAddr[3] == szBiosAward2[3]
				&& pBiosAddr[4] == szBiosAward2[4])
			{
				return 5;
			}
			if(pBiosAddr[0] == szBiosAward3[0]
				&& pBiosAddr[1] == szBiosAward3[1]
				&& pBiosAddr[2] == szBiosAward3[2]
				&& pBiosAddr[3] == szBiosAward3[3]
				&& pBiosAddr[4] == szBiosAward3[4])
			{
				return 5;
			}
			pBiosAddr ++;
		}
	}
	
	/*	BYTE* pBiosAddr = * ppBiosAddr + 0xEC71;
	
	  BYTE szBiosData[128];
	  CopyMemory( szBiosData, pBiosAddr, 127 );
	  szBiosData[127] = 0;
	  
		int iLen = lstrlen( ( char* )szBiosData );
		if( iLen > 0 && iLen < 128 )
		{
        //AWard:         07/08/2002-i845G-ITE8712-JF69VD0CC-00 
        //Phoenix-Award: 03/12/2002-sis645-p4s333
        if( szBiosData[2] == '/' && szBiosData[5] == '/' )
        {
		BYTE* p = szBiosData;
		while( * p )
		{
		if( * p < ' ' || * p >= 127 )
		{
		break;
		}
		++ p;
		}
		if( * p == 0 )
		{
		* ppBiosAddr = pBiosAddr;
		return ( UINT )iLen;
		}
        }
		}
	*/
    return 0;
}

UINT CCpuinfoDlg::FindAmiBios( BYTE** ppBiosAddr )
{
	BYTE szBiosAMI[8] = "AMI";//AMI
	BYTE szBiosAMI2[8] = "ami";//AMI
	BYTE szBiosAMI3[8] = "Ami";//AMI
	BYTE* pBiosAddr = * ppBiosAddr;
	for(DWORD i = 0; i < sizePage/128; i++)
	{
		for(int j = 0; j < 128; j++)
		{
			if(pBiosAddr[0] == szBiosAMI[0]
				&& pBiosAddr[1] == szBiosAMI[1]
				&& pBiosAddr[2] == szBiosAMI[2])
			{
				return 3;
			}
			if(pBiosAddr[0] == szBiosAMI2[0]
				&& pBiosAddr[1] == szBiosAMI2[1]
				&& pBiosAddr[2] == szBiosAMI2[2])
			{
				return 3;
			}
			if(pBiosAddr[0] == szBiosAMI3[0]
				&& pBiosAddr[1] == szBiosAMI3[1]
				&& pBiosAddr[2] == szBiosAMI3[2])
			{
				return 3;
			}
			pBiosAddr ++;
		}
	}
	
	/*	BYTE* pBiosAddr = * ppBiosAddr + 0xF478;
    
	  BYTE szBiosData[128];
	  CopyMemory( szBiosData, pBiosAddr, 127 );
	  szBiosData[127] = 0;
	  
		int iLen = lstrlen( ( char* )szBiosData );
		if( iLen > 0 && iLen < 128 )
		{
        // Example: "AMI: 51-2300-000000-00101111-030199-"
        if( szBiosData[2] == '-' && szBiosData[7] == '-' )
        {
		BYTE* p = szBiosData;
		while( * p )
		{
		if( * p < ' ' || * p >= 127 )
		{
		break;
		}
		++ p;
		}
		if( * p == 0 )
		{
		* ppBiosAddr = pBiosAddr;
		return ( UINT )iLen;
		}
        }
		}
	*/
    return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -