如何获取多核、多cpu系统中指定cpu的序列号
作者:SkyJacker
(转贴请保持完整并注明作者和出处)
http://www.cnpack.org
CnPack IV  QQ Group: 130970
2007-01-23

感谢:Passion,Bahamut,早安,空气,SkyJacker...
没有Bahamut的奇思妙点,就没有这片文章。

在多cpu、多核中,会随机的获得不同的序列号.这就为我们根据cpu序列号来制作注册机带来了很大的麻烦。
Windows 2000/xp允许设置进程和线程的亲缘性。换句话说,可以控制哪个 CPU 能够运行某些线程。这称为硬亲缘性。Windows提供了设置亲缘性的函数SetProcessAffinityMask 。使用它可控制获取指定cpu的序列号。

本文分为2部分:

1、如何获得cpu的序列号。
2、如何获取指定cpu或指定cpu核的序列号。

1、如何获得cpu的序列号。

使用cpuid指令来获取。
在调用CPUID之前,EAX中存放的是功能代码。在调用CPUID之后,EAX,EBX,ECX,EDX存放的是CPU的各种特征信息。这些信息也就是我们通常所说的CPU序列号。

mov  eax, 0  //获取制造商信息
  cpuid
    
  mov  eax,  1 //获得CPU的序列号
  cpuid    
    
以下三个函数,可供参考:

  1. function NewCPUID: string;
  2. const
  3. CPUINFO = 'CPU制造商: %S  序列号: %x';
  4. var
  5. s: array[0..19] of Char;
  6. MyCpuID: Integer;
  7. begin
  8. FillChar(s, 20, 0);
  9. asm
  10. push ebx
  11. push ecx
  12. push edx
  13. mov  eax, 0
  14. cpuid
  15. mov  dword  ptr  s[0],    ebx
  16. mov  dword  ptr  s[4],    edx
  17. mov  dword  ptr  s[8],    ecx
  18. mov  eax,  1
  19. cpuid
  20. mov  MyCpuID,  edx
  21. pop edx
  22. pop ecx
  23. pop ebx
  24. end;
  25. Result := Format(CPUINFO, [s, MyCpuID]);
  26. end;
  27. function GetCPUID: TCPUID; assembler; register;
  28. asm
  29. PUSH    EBX         {Save affected register}
  30. PUSH    EDI
  31. MOV     EDI, EAX    [email={@Resukt]{@Resukt[/email]}
  32. MOV     EAX, 1
  33. DW      $A20F       {CPUID Command}
  34. STOSD               {CPUID[1]}
  35. MOV     EAX, EBX
  36. STOSD               {CPUID[2]}
  37. MOV     EAX, ECX
  38. STOSD               {CPUID[3]}
  39. MOV     EAX, EDX
  40. STOSD               {CPUID[4]}
  41. POP     EDI         {Restore registers}
  42. POP     EBX
  43. end;
  44. //获取cpu的序列号:
  45. function GetCnCPUID(): string;
  46. const
  47. CPUINFO = '%.8x-%.8x-%.8x-%.8x';
  48. var
  49. iEax: Integer;
  50. iEbx: Integer;
  51. iEcx: Integer;
  52. iEdx: Integer;
  53. begin
  54. asm
  55. push ebx
  56. push ecx
  57. push edx
  58. mov  eax, 1
  59. DW $A20F//cpuid
  60. mov  iEax, eax
  61. mov  iEbx, ebx
  62. mov  iEcx, ecx
  63. mov  iEdx, edx
  64. pop edx
  65. pop ecx
  66. pop ebx
  67. end;
  68. Result := Format(CPUINFO, [iEax, iEbx, iEcx, iEdx]);
  69. end;

2、如何获取指定cpu或指定cpu核的序列号。

根据Windows可以设置进程和线程的亲缘性的特点,使用SetProcessAffinityMask函数,来控制哪个cpu来运行获取序列号的进程,因此也就获取了指定的cpu的序列号。为了和单cpu兼容,建议总是获取第一个cpu的序列号。

  1. procedure SetCPU(h: THandle;CpuNo: Integer);
  2. //CpuNo:决定了获得第几个cpu内核的第几个序列号。
  3. var
  4. ProcessAffinity: Cardinal;
  5. _SystemAffinity: Cardinal;
  6. begin
  7. GetProcessAffinityMask(h, ProcessAffinity, _SystemAffinity) ;
  8. ProcessAffinity := CpuNo; //this sets the process to only run on CPU 0
  9. //for CPU 1 only use 2 and for CPUs 1 & 2 use 3
  10. SetProcessAffinityMask(h, ProcessAffinity)
  11. end;

使用方法:

SetCPU(GetCurrentProcess,1); //第一个cpu的第一个cpu内核
ShowMessage(GetCnCPUID);

后记:这片文章源于CnPack 群里关于获取多核CPU的ID的问题讨论。
感谢CnPack 群里的所有成员。

BS下'早安空气',竟然说“你在你短暂的生命里花大量的时间去做这个没有价值的事情”-_-!!超级BS、BS、BS……^_^
for I:=0 to 10000000000000000000000000000 do
   BS;

附录“早安空气”语录:
'放弃吧,API不适合你'
'你在你短暂的生命里花大量的时间去做这个没有价值的事情'

参考:http://blog.csdn.net/iseekcode/article/details/5284803

如何获取多核、多cpu系统中指定cpu的序列号的更多相关文章

  1. C++获取Windows7 32位系统中所有进程名(类似于任务管理器中的进程)

    代码是网上查找资料,然后自己调试,修改之后可以运行. 系统:win7 32位,VS2008 ------------------------------------------------------ ...

  2. Linux系统下的CPU、内存、IO、网络的压力测试

    本文转载自:小豆芽博客 一.对CPU进行简单测试: 1.通过bc命令计算特别函数 例:计算圆周率 echo "scale=5000; 4*a(1)" | bc -l -q MATH ...

  3. h.264并行解码算法2D-Wave实现(基于多核共享内存系统)

    cache-coherent shared-memory system 我们最平常使用的很多x86.arm芯片都属于多核共享内存系统,这种系统表现为多个核心能直接对同一内存进行读写访问.尽管内存的存取 ...

  4. 梦回----32位CPU和64位CPU的通用寄存器

    1 32位Intel的CPU通用寄存器 32位CPU所含有的寄存器有:4个数据寄存器(EAX.EBX.ECX和EDX):2个变址和指针寄存器(ESI和EDI):2个指针寄存器(ESP和EBP):6个段 ...

  5. Linux系统中CPU使用率查询常用的5个命令

    在程序开发中,我们一般都是在Linux系统上进行开发,因此对Linux系统的维护工作很重要.在Linux系统维护中,我们需要经常查看的就是cpu的使用率,分析系统的整体运行情况.那CPU使用率怎么查询 ...

  6. linux系统中的基础监控(硬盘,内存,系统负载,CPU,网络等)

      Linux系统常见日常监控 系统信息 查看 CentOS 版本号:cat /etc/redhat-release 综合监控 nmon 系统负载 命令:w(判断整体瓶颈) 12:04:52 up 1 ...

  7. 获取系统中所有进程&线程信息

    读书笔记--[计算机病毒解密与对抗] 目录: 遍历进程&线程程序 终止进程 获取进程信息 获取进程内模块信息 获取进程命令行参数 代码运行环境:Win7 x64 VS2012 Update3 ...

  8. 如何获取Android系统中申请对象的信息

    最近一直在做有关内存方面的优化工作,在做优化的过程,除了关注内存的申请量以及GC的情况之外,我们经常需要想方法找出是那些对象占用了大量内存,以及他们是如何导致GC的,这意味着我们需要获取对象申请的信息 ...

  9. Java获取Linux和Window系统CPU、内存和磁盘总使用率的情况

    这是一个工具类,获取的内容: CPU使用率:得到的是当前CPU的使用情况,这是算出的是两次500毫秒时间差的CPU使用率 内存使用率:[1 -  剩余的物理内存/(总的物理内存+虚拟内存) ] * 1 ...

随机推荐

  1. js文本框验证

    1.文本框只能输入数字代码(小数点也不能输入) <input onkeyup="this.value=this.value.replace(/\D/g,'')" onafte ...

  2. table的边框线的设置

    http://hi.baidu.com/weisuotang/item/a1d98ec298c0aa49a8ba9447 http://www.cnblogs.com/xinlei/archive/2 ...

  3. Windows Server 2008 R2 64bit兼容Chrome浏览器

    近日更换系统Windows Server 2008 R2 64bit系统,发现谷歌浏览器插件无法正常运行,终于找到如下解决方案: 打开桌面谷歌浏览器属性,将target目标 C:\Users\Admi ...

  4. Allegro中板子边框不封闭导致的z-copy无法用的问题

    画一个不规则的边框,有半圆形状,导致边框不封闭,无法使用Z-COPY命令,下边是解决办法: 1 画好Outline后,选择 shape -> Compose Shape , options选项卡 ...

  5. Oracle 中的replace函数的应用

    replace 函数用法如下: replace('将要更改的字符串','被替换掉的字符串','替换字符串') oracle 中chr()函数 CHR() --将ASCII码转换为字符 语法CHR(nu ...

  6. edge.js架起node.js和.net互操作桥梁

    今天要介绍的是edge.js这个github上刚兴起的开源项目,它可以让node.js和.net之间在in-process下互操作..net版本在4.5及以上,因为.net4.5带来的Task,asy ...

  7. 从零开始学ios开发(八):Autorotation and Autosizing

    不好意思,这一篇间隔的时间有点长,最近实在是事情太多,耽搁了,好了,长话短说,下面继续学习ios. 这次学习的内容是Autorotation和Autosizing,Autorotation就是屏幕内容 ...

  8. UML 小结(6)- UML九种图的比较与学习

    UML中的九种图: 用例图.类图.对象图.状态图.时序图.协作图.活动图.部署图.构件图. 1)用例图(Use Case Diagram) 它是UML中最简单也是最复杂的一种图.说它简单是因为它采用了 ...

  9. WebAPi(selfhost)

    ASP.NET WebAPi(selfhost)之文件同步或异步上传   前言 前面我们讲过利用AngularJs上传到WebAPi中进行处理,同时我们在MVC系列中讲过文件上传,本文结合MVC+We ...

  10. Careercup - Facebook面试题 - 6204973461274624

    2014-05-02 02:28 题目链接 原题: I/P: N, k O/P: all subset of N with exactly K elements. eg: I/p: N = , K = ...