问一些关于系统信息的函数

askppp 2003-10-17 07:33:19
那些函数可以得到关于CPU型号、频率,内存大小等的函数?

还有我用GetSystemInfo(),SYSTEM_INFO里的wProcessorArchitecture参数
我查了MSDN,只有很少的CPU型号值,只有intel\intel64\amd64,但没有amd或cyrix的,我该如何判断?
...全文
33 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
linfeng1216 2003-10-18
  • 打赏
  • 举报
回复
获取内存信息: GlobalMemoryInfo()
askppp 2003-10-17
  • 打赏
  • 举报
回复
先谢谢了,有些复杂啊,有没什么简单点的函数能得到cpu频率、内存大小等

我用
PROCESSOR_POWER_INFORMATION proinfo;
CallNtPowerInformation(ProcessorInformation,NULL,NULL,&proinfo,NULL);

可是链接是出错
SystemDlg.obj : error LNK2019: 无法解析的外部符号 "long __stdcall CallNtPowerInformation(enum POWER_INFORMATION_LEVEL,void *,unsigned long,void *,unsigned long)" (?CallNtPowerInformation@@YGJW4POWER_INFORMATION_LEVEL@@PAXK1K@Z) ,该符号在函数 "public: __thiscall CSystemDlg::CSystemDlg(class CWnd *)" (??0CSystemDlg@@QAE@PAVCWnd@@@Z) 中被引用
Debug/FindFile.exe : fatal error LNK1120: 1 个无法解析的外部命令
wuxfBrave 2003-10-17
  • 打赏
  • 举报
回复
试试上面的程序
wuxfBrave 2003-10-17
  • 打赏
  • 举报
回复
#include <stdio.h>
#include "cpuid.h"

void expand(int avail, int mask)
{
if (mask & _CPU_FEATURE_MMX) {
printf("\t%s\t_CPU_FEATURE_MMX\n",
avail & _CPU_FEATURE_MMX ? "yes" : "no");
}
if (mask & _CPU_FEATURE_SSE) {
printf("\t%s\t_CPU_FEATURE_SSE\n",
avail & _CPU_FEATURE_SSE ? "yes" : "no");
}
if (mask & _CPU_FEATURE_SSE2) {
printf("\t%s\t_CPU_FEATURE_SSE2\n",
avail & _CPU_FEATURE_SSE2 ? "yes" : "no");
}
if (mask & _CPU_FEATURE_3DNOW) {
printf("\t%s\t_CPU_FEATURE_3DNOW\n",
avail & _CPU_FEATURE_3DNOW ? "yes" : "no");
}
}

void main(void)
{
_p_info info;

_cpuid(&info);

printf("v_name:\t\t%s\n", info.v_name);
printf("model:\t\t%s\n", info.model_name);
printf("family:\t\t%d\n", info.family);
printf("model:\t\t%d\n", info.model);
printf("stepping:\t%d\n", info.stepping);
printf("feature:\t%08x\n", info.feature);
expand(info.feature, info.checks);
printf("os_support:\t%08x\n", info.os_support);
expand(info.os_support, info.checks);
printf("checks:\t\t%08x\n", info.checks);
}
wuxfBrave 2003-10-17
  • 打赏
  • 举报
回复
#include <windows.h>
#include "cpuid.h"


// These are the bit flags that get set on calling cpuid
// with register eax set to 1
#define _MMX_FEATURE_BIT 0x00800000
#define _SSE_FEATURE_BIT 0x02000000
#define _SSE2_FEATURE_BIT 0x04000000

// This bit is set when cpuid is called with
// register set to 80000001h (only applicable to AMD)
#define _3DNOW_FEATURE_BIT 0x80000000

int IsCPUID()
{
__try {
_asm {
xor eax, eax
cpuid
}
}
__except (EXCEPTION_EXECUTE_HANDLER) {
return 0;
}
return 1;
}



/***
* int _os_support(int feature)
* - Checks if OS Supports the capablity or not
*
* Entry:
* feature: the feature we want to check if OS supports it.
*
* Exit:
* Returns 1 if OS support exist and 0 when OS doesn't support it.
*
****************************************************************/


int _os_support(int feature)
{
__try {
switch (feature) {
case _CPU_FEATURE_SSE:
__asm {
xorps xmm0, xmm0 // executing SSE instruction
}
break;
case _CPU_FEATURE_SSE2:
__asm {
xorpd xmm0, xmm0 // executing SSE2 instruction
}
break;
case _CPU_FEATURE_3DNOW:
__asm {
pfrcp mm0, mm0 // executing 3DNow! instruction
emms
}
break;
case _CPU_FEATURE_MMX:
__asm {
pxor mm0, mm0 // executing MMX instruction
emms
}
break;
}
}
__except (EXCEPTION_EXECUTE_HANDLER) {
if (_exception_code() == STATUS_ILLEGAL_INSTRUCTION) {
return 0;
}
return 0;
}
return 1;
}



/***
*
* void map_mname(int, int, const char *, char *)
* - Maps family and model to processor name
*
****************************************************/



void map_mname(int family, int model, const char *v_name, char *m_name)
{
// Default to name not known
m_name[0] = '\0';

if (!strncmp("AuthenticAMD", v_name, 12)) {
switch (family) { // extract family code
case 4: // Am486/AM5x86
strcpy (m_name, "AMD Am486");
break;

case 5: // K6
switch (model) { // extract model code
case 0:
case 1:
case 2:
case 3:
strcpy (m_name, "AMD K5");
break;
case 6:
case 7:
strcpy (m_name, "AMD K6");
break;
case 8:
strcpy (m_name, "AMD K6-2");
break;
case 9:
case 10:
case 11:
case 12:
case 13:
case 14:
case 15:
strcpy (m_name, "AMD K6-3");
break;
}
break;

case 6: // Athlon
// No model numbers are currently defined
strcpy (m_name, "AMD ATHLON");
break;
}
}
else if (!strncmp("GenuineIntel", v_name, 12)) {
switch (family) { // extract family code
case 4:
switch (model) { // extract model code
case 0:
case 1:
strcpy (m_name, "INTEL 486DX");
break;
case 2:
strcpy (m_name, "INTEL 486SX");
break;
case 3:
strcpy (m_name, "INTEL 486DX2");
break;
case 4:
strcpy (m_name, "INTEL 486SL");
break;
case 5:
strcpy (m_name, "INTEL 486SX2");
break;
case 7:
strcpy (m_name, "INTEL 486DX2E");
break;
case 8:
strcpy (m_name, "INTEL 486DX4");
break;
}
break;

case 5:
switch (model) { // extract model code
case 1:
case 2:
case 3:
strcpy (m_name, "INTEL Pentium");
break;
case 4:
strcpy (m_name, "INTEL Pentium-MMX");
break;
}
break;

case 6:
switch (model) { // extract model code
case 1:
strcpy (m_name, "INTEL Pentium-Pro");
break;
case 3:
case 5:
strcpy (m_name, "INTEL Pentium-II");
break; // actual differentiation depends on cache settings
case 6:
strcpy (m_name, "INTEL Celeron");
break;
case 7:
case 8:
case 10:
strcpy (m_name, "INTEL Pentium-III");
break; // actual differentiation depends on cache settings
}
break;

case 15 | (0x00 << 4): // family 15, extended family 0x00
switch (model) {
case 0:
strcpy (m_name, "INTEL Pentium-4");
break;
}
break;
}
}
else if (!strncmp("CyrixInstead", v_name, 12)) {
strcpy (m_name, "Cyrix");
}
else if (!strncmp("CentaurHauls", v_name, 12)) {
strcpy (m_name, "Centaur");
}

if (!m_name[0]) {
strcpy (m_name, "Unknown");
}
}



/***
*
* int _cpuid (_p_info *pinfo)
*
* Entry:
*
* pinfo: pointer to _p_info.
*
* Exit:
*
* Returns int with capablity bit set even if pinfo = NULL
*
****************************************************/



int _cpuid (_p_info *pinfo)
{
DWORD dwStandard = 0;
DWORD dwFeature = 0;
DWORD dwMax = 0;
DWORD dwExt = 0;
int feature = 0;
int os_support = 0;
union {
char cBuf[12+1];
struct {
DWORD dw0;
DWORD dw1;
DWORD dw2;
} s;
} Ident;

if (!IsCPUID()) {
return 0;
}

_asm {
push ebx
push ecx
push edx

// get the vendor string
xor eax, eax
cpuid
mov dwMax, eax
mov Ident.s.dw0, ebx
mov Ident.s.dw1, edx
mov Ident.s.dw2, ecx

// get the Standard bits
mov eax, 1
cpuid
mov dwStandard, eax
mov dwFeature, edx

// get AMD-specials
mov eax, 80000000h
cpuid
cmp eax, 80000000h
jc notamd
mov eax, 80000001h
cpuid
mov dwExt, edx

notamd:
pop ecx
pop ebx
pop edx
}

if (dwFeature & _MMX_FEATURE_BIT) {
feature |= _CPU_FEATURE_MMX;
if (_os_support(_CPU_FEATURE_MMX))
os_support |= _CPU_FEATURE_MMX;
}
if (dwExt & _3DNOW_FEATURE_BIT) {
feature |= _CPU_FEATURE_3DNOW;
if (_os_support(_CPU_FEATURE_3DNOW))
os_support |= _CPU_FEATURE_3DNOW;
}
if (dwFeature & _SSE_FEATURE_BIT) {
feature |= _CPU_FEATURE_SSE;
if (_os_support(_CPU_FEATURE_SSE))
os_support |= _CPU_FEATURE_SSE;
}
if (dwFeature & _SSE2_FEATURE_BIT) {
feature |= _CPU_FEATURE_SSE2;
if (_os_support(_CPU_FEATURE_SSE2))
os_support |= _CPU_FEATURE_SSE2;
}

if (pinfo) {
memset(pinfo, 0, sizeof(_p_info));

pinfo->os_support = os_support;
pinfo->feature = feature;
pinfo->family = (dwStandard >> 8) & 0xF; // retrieve family
if (pinfo->family == 15) { // retrieve extended family
pinfo->family |= (dwStandard >> 16) & 0xFF0;
}
pinfo->model = (dwStandard >> 4) & 0xF; // retrieve model
if (pinfo->model == 15) { // retrieve extended model
pinfo->model |= (dwStandard >> 12) & 0xF;
}
pinfo->stepping = (dwStandard) & 0xF; // retrieve stepping

Ident.cBuf[12] = 0;
strcpy(pinfo->v_name, Ident.cBuf);

map_mname(pinfo->family,
pinfo->model,
pinfo->v_name,
pinfo->model_name);

pinfo->checks = _CPU_FEATURE_MMX |
_CPU_FEATURE_SSE |
_CPU_FEATURE_SSE2 |
_CPU_FEATURE_3DNOW;
}

return feature;
}
wuxfBrave 2003-10-17
  • 打赏
  • 举报
回复
#ifndef _INC_CPUID
#define _INC_CPUID

#define _CPU_FEATURE_MMX 0x0001
#define _CPU_FEATURE_SSE 0x0002
#define _CPU_FEATURE_SSE2 0x0004
#define _CPU_FEATURE_3DNOW 0x0008

#define _MAX_VNAME_LEN 13
#define _MAX_MNAME_LEN 30

typedef struct _processor_info {
char v_name[_MAX_VNAME_LEN]; // vendor name
char model_name[_MAX_MNAME_LEN]; // name of model
// e.g. Intel Pentium-Pro
int family; // family of the processor
// e.g. 6 = Pentium-Pro architecture
int model; // model of processor
// e.g. 1 = Pentium-Pro for family = 6
int stepping; // processor revision number
int feature; // processor feature
// (same as return value from _cpuid)
int os_support; // does OS Support the feature?
int checks; // mask of checked bits in feature
// and os_support fields
} _p_info;

#ifdef __cplusplus
extern "C"
#endif
int _cpuid (_p_info *);

#endif
askppp 2003-10-17
  • 打赏
  • 举报
回复
up

16,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧