windows

命令行获取CPU ID,可以用ShellExecute

wmic cpu get processorid
ProcessorId
BFEBFBFF000506E3

开源库: 查询CPU信息 . 包括ARM Mac windows

qemu

https://www.qemu.org/

读取硬盘序列号

获取CPU的ID

#include <intrin.h>    // 所有Intrinsics函数

//64位程序,微软不支持内嵌汇编指令
//https://blog.csdn.net/chlk118/article/details/51218964
//微软推出了__cpuid和__cpuidex函数替代了汇编指令,获取 __cpuid厂商,family,CPU名称的代码 同一个批次的CPU DeviceID 都是 BFEBFBFF000506E3
所以获取意义不大!!!!!!!! void GetCPUID()
{
char pvendor[16];
INT32 dwBuf[4]; __cpuid(dwBuf, 0);
*(INT32*)&pvendor[0] = dwBuf[1]; // ebx: 前四个字符
*(INT32*)&pvendor[4] = dwBuf[3]; // edx: 中间四个字符
*(INT32*)&pvendor[8] = dwBuf[2]; // ecx: 最后四个字符
pvendor[12] = '\0'; __cpuid(dwBuf, 0x1);
int family = (dwBuf[0] >> 8) & 0xf; char pbrand[64];
__cpuid(dwBuf, 0x80000000);
if (dwBuf[0] < 0x80000004)
{
return;
} __cpuid((INT32*)&pbrand[0], 0x80000002); // 前16个字符
__cpuid((INT32*)&pbrand[16], 0x80000003); // 中间16个字符
__cpuid((INT32*)&pbrand[32], 0x80000004); // 最后16个字符
pbrand[48] = '\0'; printf("get cpuid=");
printf(pvendor);
printf("\n");
printf(pbrand);
printf("\n"); __cpuidex(dwBuf, 1, 1);
char szTmp[33] = { NULL };
sprintf_s(szTmp, "%08X%08X", dwBuf[3], dwBuf[0]);
printf(szTmp);
printf("\n"); sprintf_s(szTmp, "%08X", family );
printf(szTmp);
} 输出
get cpuid=GenuineIntel
Intel(R) Core(TM) i5-6500 CPU @ 3.20GHz
BFEBFBFF000506E3
00000006
-----------------
//32位 //首先说明,CPU序列号并不是全球唯一的,以Intel为例,其不同型号的CPU序列号肯定不同,但不保证同型号的CPU序列号也各不相同,但据说P3后都是全球唯一的,没有详细考证。
//CPU序列号有一个好处就是非常难以修改,至少目前还没听说。将CPU ID 和MAC id 、硬盘id组合起来生成软件序列号,可以大大增加序列号的安全性。(后两者都可以通过软件方法修改)。
string GetCPUID()
{
char cTemp[128]; string CPUID;
unsigned long s1, s2;
unsigned char vendor_id[] = "------------";
char sel;
sel = '1';
string VernderID;
string MyCpuID, CPUID1, CPUID2;
switch (sel)
{
case '1':
__asm {
xor eax, eax //eax=0:取Vendor信息
cpuid //取cpu id指令,可在Ring3级使用
mov dword ptr vendor_id, ebx
mov dword ptr vendor_id[+4], edx
mov dword ptr vendor_id[+8], ecx
} VernderID = (char)vendor_id;
VernderID += "-";
__asm {
mov eax, 01h //eax=1:取CPU序列号
xor edx, edx
cpuid
mov s1, edx
mov s2, eax
}
sprintf_s(cTemp, "%08X%08X", s1, s2);
CPUID1 = cTemp; __asm {
mov eax, 03h
xor ecx, ecx
xor edx, edx
cpuid
mov s1, edx
mov s2, ecx
} sprintf_s(cTemp, "%08X%08X", s1, s2);
CPUID2 = cTemp;
break; case '2':
{
__asm {
mov ecx, 119h
rdmsr
or eax, 00200000h
wrmsr
}
}
printf("CPU id is disabled.");
break;
}
MyCpuID = CPUID1 + CPUID2;
CPUID = MyCpuID; printf(CPUID.c_str());
return CPUID;
}
输出:
BFEBFBFF000506E3 string disk_id()
{
string id;
char Name[MAX_PATH];
DWORD serno;
DWORD length;
DWORD FileFlag;
char FileName[MAX_PATH];
BOOL Ret;
Ret = GetVolumeInformationA("c:\\", Name, MAX_PATH, &serno, &length, &FileFlag, FileName, MAX_PATH);
if (Ret)
{
id = std::to_string(serno);
}
printf("hard Disk id = ");
printf(id.c_str()); printf(" \n ");
return id;
} 输出:
hard Disk id = 681865520

生成可在 x86 和 cpuid 上使用的 x64 指令。 本指令可查询处理器,以获取有关支持的功能和 CPU 类型的信息。

https://docs.microsoft.com/zh-cn/cpp/intrinsics/cpuid-cpuidex



// InstructionSet.cpp
// Compile by using: cl /EHsc /W4 InstructionSet.cpp
// processor: x86, x64
// Uses the __cpuid intrinsic to get information about
// CPU extended instruction set support. #include <iostream>
#include <vector>
#include <bitset>
#include <array>
#include <string>
#include <intrin.h> class InstructionSet
{
// forward declarations
class InstructionSet_Internal; public:
// getters
static std::string Vendor(void) { return CPU_Rep.vendor_; }
static std::string Brand(void) { return CPU_Rep.brand_; } static bool SSE3(void) { return CPU_Rep.f_1_ECX_[0]; }
static bool PCLMULQDQ(void) { return CPU_Rep.f_1_ECX_[1]; }
static bool MONITOR(void) { return CPU_Rep.f_1_ECX_[3]; }
static bool SSSE3(void) { return CPU_Rep.f_1_ECX_[9]; }
static bool FMA(void) { return CPU_Rep.f_1_ECX_[12]; }
static bool CMPXCHG16B(void) { return CPU_Rep.f_1_ECX_[13]; }
static bool SSE41(void) { return CPU_Rep.f_1_ECX_[19]; }
static bool SSE42(void) { return CPU_Rep.f_1_ECX_[20]; } static bool SSE(void) { return CPU_Rep.f_1_EDX_[25]; }
static bool SSE2(void) { return CPU_Rep.f_1_EDX_[26]; } static bool AVX2(void) { return CPU_Rep.f_7_EBX_[5]; } static bool AVX512F(void) { return CPU_Rep.f_7_EBX_[16]; } static bool AVX512PF(void) { return CPU_Rep.f_7_EBX_[26]; }
static bool AVX512ER(void) { return CPU_Rep.f_7_EBX_[27]; }
static bool AVX512CD(void) { return CPU_Rep.f_7_EBX_[28]; }
static bool SHA(void) { return CPU_Rep.f_7_EBX_[29]; } static bool PREFETCHWT1(void) { return CPU_Rep.f_7_ECX_[0]; }
......................... Output>>>>>>> GenuineIntel
Intel(R) Core(TM) i5-2500 CPU @ 3.30GHz AES supported
AVX supported
AVX2 not supported
AVX512CD not supported
AVX512ER not supported
AVX512F not supported
AVX512PF not supported
SHA not supported
SSE supported
SSE2 supported
SSE3 supported
SSE4.1 supported
SSE4.2 supported
SSE4a not supported
SSSE3 supported

dlib 也有封装的库,来测试指令集(各个平台的)


arm

STM32F4(读取芯片ID)

唯一设备标识符适合:
● 用作序列号(例如 USB 字符串序列号或其它终端应用程序)
● 在对内部 Flash 进行编程前将唯一 ID 与软件加密原语和协议结合使用时用作安全密钥以提高 Flash 中代码的安全性
● 激活安全自举过程等
96 位的唯一设备标识符提供了一个对于任何设备和任何上下文都唯一的参考号码。用户永远不能改变这些位。
96 位的唯一设备标识符也可以以单字节/半字/字等不同方式读取,然后使用自定义算法连接起来。
基址:0x1FFF7A10 typedef struct
{ uint32_t id[3];
}ChipID; ChipID Get_ChipID(void)
{
ChipID chipid = {0};
chipid.id[0] = *(__I uint32_t *)(0x1FFF7A10 + 0x00);
chipid.id[1] = *(__I uint32_t *)(0x1FFF7A10 + 0x04);
chipid.id[2] = *(__I uint32_t *)(0x1FFF7A10 + 0x08);
return chipid;
}

读取STM32F207/40x的CPU唯一ID(Unique Device ID)号方法

STM32学习之:读取芯片的唯一标识ID

 产品唯一的身份标识的作用:
● 用来作为序列号(例如USB字符序列号或者其他的终端应用);
● 用来作为密码,在编写闪存时,将此唯一标识与软件加解密算法结合使用,提高代码在闪存存储器内的安全性;
● 用来激活带安全机制的自举过程;
96位的产品唯一身份标识所提供的参考号码对任意一个STM32微控制器,在任何情况下都是唯一的。用户在何种情况下,都不能修改这个身份标识。按照用户不同的用法,可以以字节(8位)为单位读取,也可以以半字(16位)或者全字(32位)读取。嘿嘿,要注意大端小端模式 * 函数名:Get_ChipID
* 描述 :获取芯片ID
* 输入 :无
* 输出 :无
* 说明 :96位的ID是stm32唯一身份标识,可以以8bit、16bit、32bit读取
提供了大端和小端两种表示方法 void Get_ChipID(void)
{
#if 1
u32 ChipUniqueID[3];
地址从小到大,先放低字节,再放高字节:小端模式
地址从小到大,先放高字节,再放低字节:大端模式
ChipUniqueID[2] = *(__IO u32*)(0X1FFFF7E8); // 低字节
ChipUniqueID[1] = *(__IO u32 *)(0X1FFFF7EC); //
ChipUniqueID[0] = *(__IO u32 *)(0X1FFFF7F0); // 高字节
printf("######## 芯片的唯一ID为: X-X-X rn",ChipUniqueID[0],ChipUniqueID[1],ChipUniqueID[2]);
//此条语句输出32位
#else //调整了大小端模式,与ISP下载软件的一致
u8 temp[12];
u32 temp0,temp1,temp2;
temp0=*(__IO u32*)(0x1FFFF7E8); //产品唯一身份标识寄存器(96位)
temp1=*(__IO u32*)(0x1FFFF7EC);
temp2=*(__IO u32*)(0x1FFFF7F0);
temp[0] = (u8)(temp0 & 0x000000FF);
temp[1] = (u8)((temp0 & 0x0000FF00)>>8);
temp[2] = (u8)((temp0 & 0x00FF0000)>>16);
temp[3] = (u8)((temp0 & 0xFF000000)>>24);
temp[4] = (u8)(temp1 & 0x000000FF);
temp[5] = (u8)((temp1 & 0x0000FF00)>>8);
temp[6] = (u8)((temp1 & 0x00FF0000)>>16);
temp[7] = (u8)((temp1 & 0xFF000000)>>24);
temp[8] = (u8)(temp2 & 0x000000FF);
temp[9] = (u8)((temp2 & 0x0000FF00)>>8);
temp[10] = (u8)((temp2 & 0x00FF0000)>>16);
temp[11] = (u8)((temp2 & 0xFF000000)>>24);
printf("######## STM32芯片ID为: %.2X%.2X%.2X%.2X-%.2X%.2X%.2X%.2X-%.2X%.2X%.2X%.2X rn",
temp[0],temp[1],temp[2],temp[3],temp[4],temp[5],temp[6],temp[7],temp[8],temp[9],temp[10],temp [11]); //串口打印出芯片ID
#endif
} * 函数名:Get_ChipInfo(void)
* 描述 :获取芯片Flash 大小
* 输入 :无
* 输出 :无
* 说明 :
void Get_ChipInfo(void)
{
uint32_t ChipUniqueID[3];
u16 STM32_FLASH_SIZE;
ChipUniqueID[0] = *(__IO u32 *)(0X1FFFF7F0); // 高字节
ChipUniqueID[1] = *(__IO u32 *)(0X1FFFF7EC); //
ChipUniqueID[2] = *(__IO u32 *)(0X1FFFF7E8); // 低字节
STM32_FLASH_SIZE= *(u16*)(0x1FFFF7E0); //闪存容量寄存器
printf("rn########### 芯片的唯一ID为: %X-%X-%X n",
ChipUniqueID[0],ChipUniqueID[1],ChipUniqueID[2]);
printf("rn########### 芯片flash的容量为: %dK n", STM32_FLASH_SIZE);
printf("rn########### 烧录日期: "__DATE__" - "__TIME__"n");
//输出使用固件库版本号
printf("rn########### 代码固件库版本: V %d.%d.%d n",__STM32F10X_STDPERIPH_VERSION_MAIN,__STM32F10X_STDPERIPH_VERSION_SUB1,__STM32F10X_STDPERIPH_VERSION_SUB2);
}

获取CPU ID ,disk ID, MAC ID (windows ARM linux Mac)的更多相关文章

  1. Windows与Linux/Mac系统时间不一致的解决方法

    Windows与Linux/Mac系统时间不一致的解决方法 分类: linux2012-02-12 14:25 1691人阅读 评论(1) 收藏 举报 windowsubuntusystemlinux ...

  2. Mac和Windows以及Linux上WingIDE Pro激活

    写这篇文章的原因,主要是网上的很多激活方式都不适用最新版的软件.要么要你付费下载别人破解好的内容,要么各种文章你抄我,我抄你,根本没有自己实践过. 本篇文章合适Mac.Windows.Linux平台, ...

  3. 使用python获取CPU和内存信息的思路与实现(linux系统)

    linux里一切皆为文件,在linux/unix的根文件夹下,有个/proc文件夹,这个/proc 是一种内核和内核模块用来向进程(process)发送信息的机制(所以叫做"/proc&qu ...

  4. Java CPU占用过高问题排查,windows和Linux

    LINUX系统: linux系统比较简单: 1.使用命令 ps -ef | grep 找出异常java进程的pid.  找出pid为 20189 2. top -H -p 20189,所有该进程的线程 ...

  5. springmvc 获取request 和 java路径分隔符 在windows 和linux 下自动判断的方法

    //获取requert HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestA ...

  6. 将windows当做linux/Mac来用 scoop强大的包管理工具

    在Linux中有apt-get.yum这些包安装管理 安装相当方便:如ubuntu安装一个mysql5.7,只需要一个简单的命令: apt-get 而在windows中需要在MySQL官网下载对应版本 ...

  7. python 获取本机的 IP 地址,windows,linux均可

    #encoding=utf-8 #参考csdn某篇文章 import socket def get_host_ip(): """ 查询本机ip地址 :return: ip ...

  8. mac、windows、linux版jdk1.8下载

    链接: https://pan.baidu.com/s/1Yjs6GIxURiocq30zZ7heYQ 提取码: g6i8

  9. mac上编译 arm linux gnueabi交叉编译工具链toolchain

    crosstool-ng 编译和安装 交叉编译工具下载: git clone git@github.com:secularbird/crosstool-ng.git   切换到mac编译分支 git ...

随机推荐

  1. ios --转载获ipa 的图片资源

      突然想起当初刚学习iOS的时候,就经常通过抓包和提取素材的方式来模仿App,今天就教大家如何一步步提取App的素材! 大家是否有过想要获取别人的素材的想法?看到某些App的资源很不错,很想导出来用 ...

  2. H2 database 操作操作内存表

    本例开发工具为 NetBeans,使用b2前提安装jdk. 第一步:在官网下载驱动包 :http://www.h2database.com ,本例版本为: h2-1.4.192.jar 第二步:安装开 ...

  3. 微信小程序TabBar的使用

    一.TabBar使用步骤 1.创建所需要的界面和所需要的图片: 2.配置文件: 我们找到项目根目录中的配置文件 app.json 加入如下配置信息 "tabBar": { &quo ...

  4. Double Check Locking 双检查锁机制

    方法保证了多线程并发下的线程安全性.这里在声明变量时使用了volatile关键字来保证其线程间的可见性:在同步代码块中使用二次检查,以保证其不被重复实例化.集合其二者,这种实现方式既保证了其高效性,也 ...

  5. protect,internal的区别

    protected: 爷爷有一张银行卡,爸爸可以用,儿子也可以用,隔壁老王不可以用(因为老王跟爷爷没有继承关系) internal: 王总有一张银行卡,秘书可以用,经理可以用,王总儿子不可以用(因为银 ...

  6. 性能测试--测试流程、APDEX、linux性能知识

    测试流程.APDEX.linux性能知识 一.性能测试流程: 整体流程:收集需求-->搭建测试环境-->设计性能测试场景-->开发测试脚本-->执行测试-->收集数据-- ...

  7. DSP/BIOS使用之初窥门径——滴答时钟及烧写Flash

    操作平台和环境 DSP型号:TMS320C6713 仿真器:XDS510PLUS Flash型号:AM29LV800BT或AM29LV800BT都试过(一般接口一样,区别不大) RAM型号:MT48L ...

  8. springboot 默认tomcat配置

    1. Spring Boot 能支持的最大并发量主要看其对Tomcat的设置,可以在配置文件中对其进行更改.当在配置文件中敲出max后提示值就是它的默认值. 我们可以看到默认设置中,Tomcat的最大 ...

  9. [LeetCode] 698. Partition to K Equal Sum Subsets

    Problem Given an array of integers nums and a positive integer k, find whether it's possible to divi ...

  10. Git查看并修改name和email

    显示name的方法: git config user.name git config --list 或者查看~/.gitconfig文件. 改名字: git config --global user. ...