看流星社区

 找回密码
 注册账号
查看: 2229|回复: 0

硬件信息获取系列--通过cpuid指令获取cpu的基本信息与扩展信息

[复制链接]

该用户从未签到

发表于 2018-3-3 11:42:18 | 显示全部楼层 |阅读模式
  1. .h
  2. typedef struct _EQUIPMENT_CPU {
  3. char Constructor[100];//制造商
  4. char Trademarks[100];//商标
  5. char SerialNumber[100];//CPU序列号
  6. }EQUIPMENT_CPU, *PEQUIPMENT_CPU;

  7. union CpuFeaturesEcx {
  8. ULONG32 all;
  9. struct {
  10. ULONG32 sse3 : 1; //! <[0]simd流技术扩展3(SSE3)
  11. ULONG32 pclmulqdq : 1; //! <[1]PCLMULQDQ
  12. ULONG32 dtes64 : 1; //! <[2]64位DS区域
  13. ULONG32 monitor : 1; //! <[3]显示器/等
  14. ULONG32 ds_cpl : 1; //! <[4]CPL合格的调试存储
  15. ULONG32 vmx : 1; //! <[5]虚拟机技术
  16. ULONG32 smx : 1; //! <[6]安全模式扩展
  17. ULONG32 est : 1; //! <[7]增强型英特尔Speedstep技术
  18. ULONG32 tm2 : 1; //! <[8]散热监控2
  19. ULONG32 ssse3 : 1; //! <[9]附加simd流技术扩展3
  20. ULONG32 cid : 1; //! <[10]L1上下文ID
  21. ULONG32 sdbg : 1; //! <[11]IA32_DEBUG_INTERFACE MSR
  22. ULONG32 fma : 1; //! <[12]使用YMM状态FMA扩展
  23. ULONG32 cx16 : 1; //! <[13]CMPXCHG16B
  24. ULONG32 xtpr : 1; //! <[14]xTPR更新控制
  25. ULONG32 pdcm : 1; //! <[15]性能/调试能力MSR
  26. ULONG32 reserved : 1; //! <[16]保留
  27. ULONG32 pcid : 1; //! <[17]程序的上下文标识符
  28. ULONG32 dca : 1; //! <[18]回迁从内存映射设备
  29. ULONG32 sse4_1 : 1; //! <[19]SSE4.1
  30. ULONG32 sse4_2 : 1; //! <[20]SSE4.2
  31. ULONG32 x2_apic : 1; //! <[21]x2APIC功能
  32. ULONG32 movbe : 1; //! <[22]MOVBE指令
  33. ULONG32 popcnt : 1; //! <[23]POPCNT指令
  34. ULONG32 reserved3 : 1; //! <[24]使用TSC期限一次性操作
  35. ULONG32 aes : 1; //! <[25]AESNI指令
  36. ULONG32 xsave : 1; //! <[26]XSAVE/XRSTOR功能
  37. ULONG32 osxsave : 1; //! <[27]使XSETBV/XGETBV说明
  38. ULONG32 avx : 1; //! <[28]AVX指令扩展
  39. ULONG32 f16c : 1; //! <[29]16位浮点转换
  40. ULONG32 rdrand : 1; //! <[30]RDRAND指令
  41. ULONG32 not_used : 1; //! <[31]0(a.k.一。 HypervisorPresent)
  42. } fields;
  43. };

  44. union CpuFeaturesEdx {
  45. ULONG32 all;
  46. struct {
  47. ULONG32 fpu : 1; //! <[0]浮点单元的片上
  48. ULONG32 vme : 1; //! <[1]虚拟8086模式增强
  49. ULONG32 de : 1; //! <[2]调试扩展程序
  50. ULONG32 pse : 1; //! <[3]页大小扩展
  51. ULONG32 tsc : 1; //! <[4]时间戳计数器
  52. ULONG32 msr : 1; //! <[5]RDMSR和WRMSR说明
  53. ULONG32 mce : 1; //! <[7]机器检查异常
  54. ULONG32 cx8 : 1; //! <[8]散热监控2
  55. ULONG32 apic : 1; //! <[9]APIC片上
  56. ULONG32 reserved1 : 1; //! <[10]保留
  57. ULONG32 sep : 1; //! <[11]SYSENTER和SYSEXIT说明
  58. ULONG32 mtrr : 1; //! <[12]内存范围寄存器
  59. ULONG32 pge : 1; //! <[13]页全球位
  60. ULONG32 mca : 1; //! <[14]机器检查架构
  61. ULONG32 cmov : 1; //! <[15]有条件的移动指令
  62. ULONG32 pat : 1; //! <[16]页属性表
  63. ULONG32 pse36 : 1; //! <[17]36位页面大小扩展
  64. ULONG32 psn : 1; //! <[18]处理器序列号
  65. ULONG32 clfsh : 1; //! <[19]CLFLUSH指令
  66. ULONG32 reserved2 : 1; //! <[20]保留
  67. ULONG32 ds : 1; //! <[21]的调试存储
  68. ULONG32 acpi : 1; //! <[22]TM和软件控制时钟
  69. ULONG32 mmx : 1; //! <[23]英特尔MMX技术
  70. ULONG32 fxsr : 1; //! <[24]FXSAVE和FXRSTOR说明
  71. ULONG32 sse : 1; //! <[25]SSE
  72. ULONG32 sse2 : 1; //! <[26]SSE2
  73. ULONG32 ss : 1; //! <[27]自探听
  74. ULONG32 htt : 1; //! <[28]保留的最大APIC id字段有效
  75. ULONG32 tm : 1; //! <[29]散热监控
  76. ULONG32 reserved3 : 1; //! <[30]保留
  77. ULONG32 pbe : 1; //! <[31]挂起的分行符启用
  78. } fields;
  79. };
复制代码
  1. .cpp
  2. bool dlgSystemInfo::GetCpuInfo()
  3. {
  4. PEQUIPMENT_CPU cpu = new EQUIPMENT_CPU;

  5. {//制造商
  6. char str[13] = { 0 };
  7. unsigned int cpu_info[4] = {};
  8. __cpuidex(reinterpret_cast<int *>(cpu_info), 0, 0);
  9. memcpy_s(str, sizeof(str), &cpu_info[1], 4 * 3);
  10. strcpy(cpu->Constructor, str);
  11. }
  12. {//商标
  13. char str[49] = { 0 };
  14. unsigned int cpu_info[4] = {};
  15. for (DWORD i = 0; i < 3; i++) {
  16. __cpuidex(reinterpret_cast<int *>(cpu_info), 0x80000002 + i, 0);
  17. memcpy(str + i * 16, cpu_info, sizeof(cpu_info));
  18. }
  19. strcpy(cpu->Trademarks, str);
  20. }
  21. {//CPU序列号
  22. char str[200] = { 0 };
  23. unsigned int cpu_info[4] = {};
  24. __cpuidex(reinterpret_cast<int *>(cpu_info), 1, 0);
  25. sprintf_s(str, "%08X%08X", cpu_info[3], cpu_info[0]);
  26. __cpuidex(reinterpret_cast<int *>(cpu_info), 3, 0);
  27. sprintf_s(str, "%s%08X%08X", str, cpu_info[3], cpu_info[0]);
  28. strcpy(cpu->SerialNumber, str);
  29. }

  30. unsigned int cpu_info[4] = {};
  31. __cpuidex(reinterpret_cast<int *>(cpu_info), 1, 0);
  32. CpuFeaturesEcx ecx = { static_cast<ULONG_PTR>(cpu_info[2]) };
  33. CpuFeaturesEdx edx = { static_cast<ULONG_PTR>(cpu_info[3]) };

  34. return true;
  35. }
复制代码

点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-3-29 20:31

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表