能力值:
( LV2,RANK:10 )
7 楼
获取CPU ID ,奔腾4以上的CPUID,intel不提供了
#include <windows.h>
#include <stdio.h>
// Processor Type 处理器类型,表示的是 CPU 是由消费者自己安装还是专业人员安装
// Family Code 处理器系列,表示的是第几代产品
// Model Number 处理器的型号,表示的是 CPU 的制造技术和属于第几代的设计
// Stepping ID 步进ID,表示的是 Intel 内部设计和制造的标准
typedef struct
{
DWORD SteppingID:4; // 00000000 00000000 00000000 00001111
DWORD ModelNumber:4; // 00000000 00000000 00000000 11110000
DWORD FamilyCode:4; // 00000000 00000000 00001111 00000000
DWORD ProcessorType:2; // 00000000 00000000 00110000 00000000
DWORD Reserved1:2; // 00000000 00000000 xx000000 00000000
DWORD ExtendedModel:4; // 00000000 00001111 00000000 00000000
DWORD ExtendedFamily:8; // 00001111 11110000 00000000 00000000
DWORD Reserved2:4; // xxxx0000 00000000 00000000 00000000
} PROCESSOR_SIGNATURE;
// Brand ID
// 在 Pentium III 处理器之后,为了区分"型号=8"的不同处理器
// 引入了这个附加的商标ID,如果这个值为0,表示 CPU 不支持商标ID
typedef struct
{
DWORD BrandID:8;
DWORD Chunks:8;
DWORD Count:8;
DWORD APIC_ID:8;
} MISC_INFO;
typedef struct
{
DWORD FPU:1; // 位0, 是否内置浮点协处理器
DWORD VME:1; // 位1, 是否支持扩展的虚拟8086模式
DWORD DE:1; // 位2, 是否支持调试扩展,I/O 类型断点
DWORD PSE:1; // 位3, 是否支持 4M 分页
DWORD TSC:1; // 位4, 是否支持 TSC(时间标签记数器)
DWORD MSR:1; // 位5, 是否支持 MSR(模式特别积存器)
DWORD PAE:1; // 位6, 是否支持物理地址扩展,物理地址可以大于 4G
DWORD MCE:1; // 位7, 是否支持异常检测
DWORD CX8:1; // 位8, 是否支持 CMPXCHG 指令(比较并交换 8 字节)
DWORD APIC:1; // 位9, 是否包含片内级可编程中断控制器(APIC)
DWORD Rvsd1:1; // 位10, 保留位
DWORD SEP:1; // 位11, 是否支持快速系统调用 SYSENTER 和 SYSEXIT 指令
DWORD MTRR:1; // 位12, 是否支持指定内存类型范围积存器
DWORD PGE:1; // 位13, 是否支持页全局标志位
DWORD MCA:1; // 位14, 是否支持全局检查架构
DWORD CMOV:1; // 位15, 是否支持 CMOV 指令
DWORD PAT:1; // 位16, 是否支持页属性表
DWORD PSE36:1; // 位17, 是否支持 36 位物理地址总线
DWORD PSN:1; // 位18, 是否支持序列号,并且此功能是开放状态
DWORD CLFSH:1; // 位19, 是否支持 CLFLUSH 指令
DWORD Rvsd2:1; // 位20, 保留位
DWORD DS:1; // 位21, 是否支持调试存储
DWORD ACPI:1; // 位22, 是否支持温度监控和软件调整时钟频率
DWORD MMX:1; // 位23, 是否支持 MMX 指令
DWORD FXSR:1; // 位24, 是否支持快速浮点存取扩展指令
DWORD SSE:1; // 位25, 是否支持 SIMD 扩展指令
DWORD SSE2:1; // 位26, 是否支持 SIMD2 扩展指令
DWORD SS:1; // 位27, 是否支持自我侦听
DWORD HTT:1; // 位28, 是否支持超线程技术
DWORD TM:1; // 位29, 包含了温度监控和温度控制电路
DWORD Rvsd3:1; // 位30, 保留位
DWORD SBF:1; // 位31, Signal Break on FERR
} FEATURE_FLAGS;
// 处理器类型(Processor Type)
char List_ProcessorType[4][80] =
{
"Original OEM Processor", // 00
"Intel OverDrive Processor", // 01
"Dual processor", // 10
"Intel reserved" // 11
};
void VendorInfo()
{
char vendor_id[13];
memset(vendor_id, 0, 13);
_asm
{
xor eax, eax
cpuid
mov dword ptr vendor_id,ebx
mov dword ptr vendor_id[+4],edx
mov dword ptr vendor_id[+8],ecx
}
printf("%s\n",vendor_id);
}
void Signature_Feature()
{
PROCESSOR_SIGNATURE ps;
FEATURE_FLAGS ff;
MISC_INFO mi;
_asm
{
mov eax, 1
cpuid
mov ps, eax
mov mi, ebx
mov ff, edx
}
printf("Processor Type: %d\n", ps.ProcessorType);
printf("Model Number: %d\n", ps.ModelNumber);
printf("Family Code: %d\n", ps.FamilyCode);
printf("Extended Model: %d\n", ps.ExtendedModel);
printf("Extended Family: %d\n", ps.ExtendedFamily);
printf("Stepping ID: %d\n", ps.SteppingID);
printf("Brand ID: %d\n", mi.BrandID);
if (ff.MMX) printf("Support MMX\n");
if (ff.SSE) printf("Support SSE\n");
if (ff.SSE2) printf("Support SSE2\n");
if (ff.PSN) printf("Support processor serial number\n");
}
void main()
{
VendorInfo();
Signature_Feature();
/*
unsigned long s1,s2;
_asm mov eax,01h
_asm xor edx,edx
_asm cpuid
_asm mov s1,edx
_asm mov s2,eax
printf("%08X\n%08X-",s1,s2);
_asm mov eax,03h
_asm xor ecx,ecx
_asm xor edx,edx
_asm cpuid
_asm mov s1,edx
_asm mov s2,ecx
printf("%08X-%08X\n",s1,s2); */
}
能力值:
( LV2,RANK:10 )
8 楼
最初由 jianlizhao 发布 获取CPU ID ,奔腾4以上的CPUID,intel不提供了 ........
应该只是那个唯一的序列号不提供吧。
CPUID这条指令是不太可能取消的。只是这个指令可以返回很多级别的信息。
eax=0时,就是返回CPU厂家信息
eax=1时就是返回CPU的家族和型号。
...
能力值:
( LV9,RANK:290 )
12 楼
CPUID返回的值好像不能那么容易就被修改吧,
修改硬件就行的,
在不更改CPU的情况下修改返回值是没有什么可能的