您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: