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. 【转】Android7.0版本以上的手机Eclipse无法打出LogCat

    本来想用Eclipse连下手机看下log的,结果LogCat没打出来任何信息,起初怀疑是我的DDMS有问题,结果连了下我老大的手机,完美打出log,看了下Android系统,老大的是6.0的,我的7. ...

  2. 如何在linux下解压缩rar格式的文件压缩包

    ##########################################################如何在linux下解压缩rar格式的文件压缩包#date:2014年2月15日22: ...

  3. Android 异常解决方法【汇总】

    (1)异常:Android中引入第三方Jar包的方法(Java.lang.NoClassDefFoundError解决办法) 1.在工程下新建lib文件夹,将需要的第三方包拷贝进来.2.将引用的第三方 ...

  4. 【BZOJ4408】[Fjoi 2016]神秘数 主席树神题

    [BZOJ4408][Fjoi 2016]神秘数 Description 一个可重复数字集合S的神秘数定义为最小的不能被S的子集的和表示的正整数.例如S={1,1,1,4,13},1 = 12 = 1 ...

  5. Python解释器是单线程应用 IO 密集型 计算密集型 GIL global interpreter lock

    [Python解释器是单线程应用] [任意时刻,仅执行一个线程] 尽管Python解释器中可以运行多个线程,但是在任意给定的时刻只有一个线程会被解释器执行. [GIL锁 保证同时只有一个线程运行] 对 ...

  6. serve-index用法、实现原理(源码解读)

    本文主要讲解serve-index的用法和实现原理(源代码分析). 一 说明 serve-index的功能是将文件夹中文件列表显示到浏览器中. serve-index是一个NodeJS模块,可以通过N ...

  7. CentOS7的/tmp目录自动清理规则(转)

    CentOS7的/tmp目录自动清理规则 CentOS6以下系统(含)使用watchtmp + cron来实现定时清理临时文件的效果,这点在CentOS7发生了变化,在CentOS7下,系统使用sys ...

  8. ABAP 设置单元格颜色

    http://blog.163.com/ronanchen@126/blog/static/172254750201161811040488/ http://blog.csdn.net/lhx20/a ...

  9. 【windows】更改最大动态端口数

    最近业务遇到一个奇怪的问题,一台iis服务器,居然报端口不足的错误,分析应该是服务器可用的动态端口数不够了,windows默认的动态端口范围为:1024-5000,也就是最多3977个动态端口可用,如 ...

  10. java多线程---基础

    一, java多线程----线程与进程 进程: 程序(任务)的执行过程,拥有资源(共享内存,共享资源)和线程(一个或者多个,至少一个).  例如:打开任务管理器,qq,chrome,都属于进程. 线程 ...