Windows 下读取DMI信息的方法
2016-06-23 13:43
633 查看
使用Windows自带的函数完成:GetSystemFirmwareTable()
#include <Windows.h> #include <stdio.h> #include <string.h> #include <string> typedef struct _dmi_header { BYTE type; BYTE length; WORD handle; }dmi_header; typedef struct _RawSMBIOSData { BYTE Used20CallingMethod; BYTE SMBIOSMajorVersion; BYTE SMBIOSMinorVersion; BYTE DmiRevision; DWORD Length; BYTE SMBIOSTableData[]; }RawSMBIOSData; const char *dmi_chassis_type(BYTE code) { /* 7.4.1 */ static const char *type[] = { "Other", /* 0x01 */ "Unknown", "Desktop", "Low Profile Desktop", "Pizza Box", "Mini Tower", "Tower", "Portable", "Laptop", "Notebook", "Hand Held", "Docking Station", "All In One", "Sub Notebook", "Space-saving", "Lunch Box", "Main Server Chassis", /* CIM_Chassis.ChassisPackageType says "Main System Chassis" */ "Expansion Chassis", "Sub Chassis", "Bus Expansion Chassis", "Peripheral Chassis", "RAID Chassis", "Rack Mount Chassis", "Sealed-case PC", "Multi-system", "CompactPCI", "AdvancedTCA", "Blade", "Blade Enclosing" /* 0x1D */ }; code &= 0x7F; /* bits 6:0 are chassis type, 7th bit is the lock bit */ if (code >= 0x01 && code <= 0x1D) return type[code - 0x01]; return "unknown"; } void dmi_system_uuid(const BYTE *p, short ver,std::string &uuid) { int only0xFF = 1, only0x00 = 1; int i; for (i = 0; i < 16 && (only0x00 || only0xFF); i++) { if (p[i] != 0x00) only0x00 = 0; if (p[i] != 0xFF) only0xFF = 0; } if (only0xFF) { printf("Not Present"); return; } if (only0x00) { printf("Not Settable"); return; } /* * As of version 2.6 of the SMBIOS specification, the first 3 * fields of the UUID are supposed to be encoded on little-endian. * The specification says that this is the defacto standard, * however I've seen systems following RFC 4122 instead and use * network byte order, so I am reluctant to apply the byte-swapping * for older versions. */ char ch[256];memset(ch,0,sizeof(ch)); if (ver >= 0x0206) sprintf(ch,"%02X%02X%02X%02X-%02X%02X-%02X%02X-%02X%02X-%02X%02X%02X%02X%02X%02X", p[3], p[2], p[1], p[0], p[5], p[4], p[7], p[6], p[8], p[9], p[10], p[11], p[12], p[13], p[14], p[15]); else sprintf(ch,"%02X%02X%02X%02X-%02X%02X-%02X%02X-%02X%02X-%02X%02X%02X%02X%02X%02X", p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7], p[8], p[9], p[10], p[11], p[12], p[13], p[14], p[15]); printf("%s\n",ch); uuid = std::string(ch); } const char *dmi_string(const dmi_header *dm, BYTE s) { char *bp = (char *)dm; size_t i, len; if (s == 0) return "Not Specified"; bp += dm->length; while (s > 1 && *bp) { bp += strlen(bp); bp++; s--; } if (!*bp) return "BAD_INDEX"; /* ASCII filtering */ len = strlen(bp); for (i = 0; i < len; i++) if (bp[i] < 32 || bp[i] == 127) bp[i] = '.'; return bp; } int GetSystemUUID(std::string &uuid) { int ret = 0; RawSMBIOSData *Smbios; dmi_header *h = NULL; int flag = 1; ret = GetSystemFirmwareTable('RSMB', 0, 0, 0); if (!ret) { printf("Function failed!\n"); return 1; } //printf("get buffer size is %d\n", ret); DWORD bufsize = ret; char *buf = new char[bufsize]; memset(buf,0,bufsize); ret = GetSystemFirmwareTable('RSMB', 0, buf, bufsize); if (!ret) { printf("Function failed!\n"); delete []buf; return 1; } Smbios = (RawSMBIOSData *)buf; BYTE *p = Smbios->SMBIOSTableData; if (Smbios->Length != bufsize -8 ) { printf("Smbios length error\n"); delete []buf; return 1; } for(int i =0; i<Smbios->Length; i++){ h = (dmi_header *)p; if (h->type == 0 && flag) { printf("\nType %02d - [BIOS]\n", h->type); printf("\tBIOS Vendor : %s\n", dmi_string(h, p[0x4])); printf("\tBIOS Version: %s\n", dmi_string(h, p[0x5])); printf("\tRelease Date: %s\n", dmi_string(h, p[0x8])); if(p[0x16]!=0xff && p[0x17]!=0xff) printf("\tEC version: %d.%d\n", p[0x16], p[0x17]); flag = 0; } else if (h->type == 1) { printf("\nType %02d - [System Information]\n", h->type); printf("\tManufacturer: %s\n", dmi_string(h, p[0x4])); printf("\tProduct Name: %s\n", dmi_string(h, p[0x5])); printf("\tVersion: %s\n", dmi_string(h, p[0x6])); printf("\tSerial Number: %s\n", dmi_string(h, p[0x7])); printf("\tUUID: "); dmi_system_uuid(p+0x8, Smbios->SMBIOSMajorVersion*0x100+Smbios->SMBIOSMinorVersion,uuid); printf("\tSKU Number: %s\n", dmi_string(h, p[0x19])); printf("\tFamily: %s\n", dmi_string(h, p[0x1a])); } else if (h->type == 2) { printf("\nType %02d - [System Information]\n", h->type); printf("\tManufacturer: %s\n", dmi_string(h, p[0x4])); printf("\tProduct: %s\n", dmi_string(h, p[0x5])); printf("\tVersion: %s\n", dmi_string(h, p[0x6])); printf("\tSerial Number: %s\n", dmi_string(h, p[0x7])); printf("\tAsset Tag: %s\n", dmi_string(h, p[0x8])); printf("\tLocation in Chassis: %s\n", dmi_string(h, p[0x0a])); } else if (h->type == 3) { printf("\nType %02d - [System Enclosure or Chassis]\n", h->type); printf("\tManufacturer: %s\n", dmi_string(h, p[0x04])); printf("\tType: %s\n", dmi_chassis_type(p[0x05])); printf("\tVersion: %s\n", dmi_string(h, p[0x06])); printf("\tSerial Number: %s\n", dmi_string(h, p[0x07])); printf("\tAsset Tag Number: %s\n", dmi_string(h, p[0x08])); printf("\tVersion: %s\n", dmi_string(h, p[0x10])); } else if(h->type == 4){ printf("\nType %02d - [Processor Information]\n", h->type); printf("\tSocket Designation: %s\n", dmi_string(h, p[0x04])); printf("\tProcessor Manufacturer: %s\n", dmi_string(h, p[0x07])); printf("\tProcessor Version: %s\n", dmi_string(h, p[0x10])); printf("\tVoltage: %d (Bit0 - 5v, Bit1 - 3.3v, Bit2 - 2.9v)\n", p[0x11]&0x7); printf("\tExternal Clock: %d MHz\n", p[0x12]+p[0x13]*0x100); printf("\tMax Speed: %d MHz\n", p[0x14]+p[0x15]*0x100); printf("\tCurrent Speed: %d MHz\n", p[0x16]+p[0x17]*0x100); printf("\tSerial Number: %s\n", dmi_string(h, p[0x20])); printf("\tAsset Tag: %s\n", dmi_string(h, p[0x21])); printf("\tPart Number: %s\n", dmi_string(h, p[0x22])); } else if (h->type == 17) { if (p[0xc]+p[0xd]*0x100 == 0) continue; printf("\nType %02d - [Memory]\n", h->type); printf("\tTotal Width: %d\n", p[0x8]); printf("\tData Width:%d\n", p[0xa]); printf("\tSize: %d MB\n", p[0xc]+p[0xd]*0x100); printf("\tSpeed: %dMHz\n", p[0x15]+p[0x16]*0x100); printf("\tBank Locator: %s\n", dmi_string(h, p[0x11])); printf("\tManufacturer: %s\n", dmi_string(h, p[0x17])); printf("\tSerial Number: %s\n", dmi_string(h, p[0x18])); printf("\tAsset Tag: %s\n", dmi_string(h, p[0x19])); printf("\tPart Number: %s\n", dmi_string(h, p[0x1A])); } p += h->length; while((*(WORD *)p)!=0) p++; p += 2; } //getchar(); delete []buf; return 0; } std::string GetUUIDString() { std::string uuid; uuid = "123-abc-plm-!@#"; GetSystemUUID(uuid); return uuid; } int main(int argc, char* argv[]) { GetUUIDString(); getchar(); return 0; }
相关文章推荐
- hitTest:withEvent:方法流程
- Eclipse加入SVN 、maven 通过Marketplace
- ASP4.5应用部署到IIS7.5上,浏览后报HTTP 404错误
- c++自定义类型
- java程序在windows系统作为服务程序运行
- 分析:文化娱乐产业应鼓励自主创新,促进行业健康长远发展
- I.MX6Q(TQIMX6Q/TQE9)学习笔记——新版BSP之USB HOST移植
- MySQL远程导入/同步数据
- 归并排序详解
- servlet10-计数器
- Intellij idea 更改 Ctrl+space 快捷键为Alt+/
- 面对对象中错误信息进行配置
- 基于CentOS 6.8的OpenStack手动安装-环境配置
- JVM必备指南
- I/O、Applet以及其他主题
- ZBrush怎样快速雕刻出头发(二)
- SAX解析XML文档
- jquery mobile开发手机webapp页面
- ismod 加载过程
- SQL Server删除distribution数据库二