DMI 獲取硬件信息 CPU RAM 等

參考了中外某些文章,自己也查資料做了部分補充。學習筆記,希望沒污了看客慧眼。



























 

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include "windows.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
String sockets[]=
{
"",
"Other",
"Unknown",
"Daughter Board",
"ZIF Socket",
"replaceable Piggy Back",
"None",
"LIF Socket",
"Slot 1",
"Slot 2",
"370-pin socket",
"Slot A",
"Slot M",
"Socket 423",
"Socket A(Socket 462)",
"Socket 478",
"Socket 754",
"Socket 940",
"Socket 939",
"Socket mPGA604",
"Socket LGA771",
"Socket LGA775",
"Socket S1",
"Socket AM2",
"Socket F (1207)",
"Socket LGA1366",
"Socket G34",
"Socket AM3",
"Socket C32",
"Socket LGA1156",
"Socket LGA1567",
"Socket PGA988A",
"Socket BGA1288",
"Socket rPGA988B",
"Socket BGA1023",
"Socket BGA1224",
"Socket LGA1155",
"Socket LGA1356",
"Socket LGA2011",
"Socket FS1",
"Socket FS2",
"Socket FM1",
"Socket FM2",
"Socket LGA2011-3",
"Socket LGA1356-3",
"Socket LGA1150",
"Socket BGA1168",
"Socket BGA1234",
"Socket BGA1364",
"Socket AM4",
"Socket LGA1151",
"Socket BGA1356",
"Socket BGA1440",
"Socket BGA1515",
"Socket LGA3647-1",
"Socket SP3",
"Socket SP3r2",
"Socket LGA2066",
"Socket BGA1392",
"Socket BGA1510",
"Socket BGA1528"
};

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_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;
}
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
Memo1->Text=info();
}
//---------------------------------------------------------------------------
String TForm1::info(void )
{   String rt,cpus,rams;
	unsigned int tram=0;
	DWORD bufsize = 0;
	BYTE buf[65536] = { 0 };
	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;
	}

 //	rt=rt+Format("get buffer size is %d\r\n", ARRAYOFCONST((ret)));
	bufsize = ret;

	ret = GetSystemFirmwareTable('RSMB', 0, buf, bufsize);
	if (!ret)
	{
		printf("Function failed!\n");
		return 1;
	}

	Smbios = (RawSMBIOSData *)buf;

  BYTE *p = Smbios->SMBIOSTableData;

	if (Smbios->Length != bufsize - 8)
	{
		printf("Smbios length error\n");
		return 1;
	}

	for (int i = 0; i<Smbios->Length; i++) {
		h = (dmi_header *)p;
	   /*
		if (h->type == 0 && flag) {
			rt=rt+Format("\r\nType %02d - [BIOS]\r\n", ARRAYOFCONST((h->type)));
			rt=rt+Format("\tBIOS Vendor : %s\r\n", ARRAYOFCONST((dmi_string(h, p[0x4]))));
			rt=rt+Format("\tBIOS Version: %s\r\n", ARRAYOFCONST((dmi_string(h, p[0x5]))));
			rt=rt+Format("\tRelease Date: %s\r\n", ARRAYOFCONST((dmi_string(h, p[0x8]))));
			if (p[0x16] != 0xff && p[0x17] != 0xff)
				printf("\tEC version: %d.%d\r\n", p[0x16], p[0x17]);

			flag = 0;
		}

		else */if (h->type == 1) {
		 //	rt=rt+Format("\r\nType %02d - [System Information]\r\n",ARRAYOFCONST(( h->type)));
			rt=rt+Format("\tManufacturer: %s\r\n", ARRAYOFCONST((dmi_string(h, p[0x4]))));
		 	rt=rt+Format("\tProduct Name: %s\r\n", ARRAYOFCONST((dmi_string(h, p[0x5]))));
		 //	rt=rt+Format("\tVersion: %s\r\n", ARRAYOFCONST((dmi_string(h, p[0x6]))));
		 //	rt=rt+Format("\tSerial Number: %s\r\n", ARRAYOFCONST((dmi_string(h, p[0x7]))));
		 //	printf("\tUUID: "); dmi_system_uuid(p + 0x8, Smbios->SMBIOSMajorVersion * 0x100 + Smbios->SMBIOSMinorVersion);
		 //	rt=rt+Format("\tSKU Number: %s\r\n", ARRAYOFCONST((dmi_string(h, p[0x19]))));
		 //	rt=rt+Format("\tFamily: %s\r\n", ARRAYOFCONST((dmi_string(h, p[0x1a]))));
		 rt=rt+"\r\n";
		}

		else if (h->type == 2) {
		 //	rt=rt+Format("\r\nType %02d - [System Information]\r\n", ARRAYOFCONST((h->type)));
			rt=rt+Format("\tManufacturer: %s\r\n", ARRAYOFCONST((dmi_string(h, p[0x4]))));
			rt=rt+Format("\tProduct: %s\r\n", ARRAYOFCONST((dmi_string(h, p[0x5]))));
		 //	rt=rt+Format("\tVersion: %s\r\n", ARRAYOFCONST((dmi_string(h, p[0x6]))));
		  //	rt=rt+Format("\tSerial Number: %s\r\n", ARRAYOFCONST((dmi_string(h, p[0x7]))));
		  //	rt=rt+Format("\tAsset Tag: %s\r\n", ARRAYOFCONST((dmi_string(h, p[0x8]))));
		  //	rt=rt+Format("\tLocation in Chassis: %s\r\n", ARRAYOFCONST((dmi_string(h, p[0x0a]))));
           rt=rt+"\r\n";
		} /*

		else if (h->type == 3) {
			rt=rt+Format("\r\nType %02d - [System Enclosure or Chassis]\r\n",ARRAYOFCONST(( h->type)));
			rt=rt+Format("\tManufacturer: %s\r\n", ARRAYOFCONST((dmi_string(h, p[0x04]))));
		 //	rt=rt+Format("\tType: %s\r\n", dmi_chassis_type(p[0x05]));
			rt=rt+Format("\tVersion: %s\r\n", ARRAYOFCONST((dmi_string(h, p[0x06]))));
			rt=rt+Format("\tSerial Number: %s\r\n", ARRAYOFCONST((dmi_string(h, p[0x07]))));
			rt=rt+Format("\tAsset Tag Number: %s\r\n", ARRAYOFCONST((dmi_string(h, p[0x08]))));
			rt=rt+Format("\tVersion: %s\r\n", ARRAYOFCONST((dmi_string(h, p[0x10]))));
		}   */

		else if (h->type == 4) {
		 //	rt=rt+Format("\r\nType %02d - [Processor Information]\r\n", ARRAYOFCONST((h->type)));
		 	cpus=cpus+Format("\tSocket Designation: %s\r\n", ARRAYOFCONST((dmi_string(h, p[0x04]))));
		 //	rt=rt+Format("\tProcessor Manufacturer: %s\r\n", ARRAYOFCONST((dmi_string(h, p[0x07]))));
			cpus=cpus+Format("\tProcessor Version: %s\r\n", ARRAYOFCONST((dmi_string(h, p[0x10]))));
		 //	rt=rt+Format("\tVoltage: %d (Bit0 - 5v, Bit1 - 3.3v, Bit2 - 2.9v)\r\n",ARRAYOFCONST(( p[0x11] & 0x7)));

		 //	rt=rt+Format("\tExternal Clock: %d MHz\r\n",ARRAYOFCONST(( p[0x12] + p[0x13] * 0x100)));
		 //	rt=rt+Format("\tMax Speed: %d MHz\r\n",ARRAYOFCONST(( p[0x14] + p[0x15] * 0x100)));
			cpus=cpus+Format("\tCurrent Speed: %d MHz\r\n", ARRAYOFCONST((p[0x16] + p[0x17] * 0x100)));
		 	cpus=cpus+Format("\tSerial Number: %s\r\n", ARRAYOFCONST((dmi_string(h, p[0x20]))));
		 //	rt=rt+Format("\tAsset Tag: %s\r\n", ARRAYOFCONST((dmi_string(h, p[0x21]))));
		 //	rt=rt+Format("\tPart Number: %s\r\n", ARRAYOFCONST((dmi_string(h, p[0x22]))));
		 cpus=cpus+Format("\tCore Num: %d \r\n", ARRAYOFCONST((p[0x23] )));
		 cpus=cpus+Format("\tThread Count: %d \r\n", ARRAYOFCONST((p[0x25] )));
		 cpus=cpus+"\tPackage:"+sockets[p[0x19]]+"\r\n";
		 cpus=cpus+"\r\n";
		}

		else if (h->type == 17) {
			if (p[0xc] + p[0xd] * 0x100 != 0)
			{
		  //		continue;
		 //	rt=rt+Format("\r\nType %02d - [Memory]\r\n",ARRAYOFCONST(( h->type)));
		//	rt=rt+Format("\tTotal Width: %d\r\n",ARRAYOFCONST(( p[0x8])));
		 //	rt=rt+Format("\tData Width:%d\r\n",ARRAYOFCONST(( p[0xa])));
			if(p[0xc]+p[0xd]*0x100==0x7fff)
			{
			rams=rams+Format("\tSize: %u MB\r\n",ARRAYOFCONST(( p[0x1c]+p[0x1d]*0x100+p[0x1e]*0x10000+p[0x1f]*0x1000000)));
			tram+=p[0x1c]+p[0x1d]*0x100+p[0x1e]*0x10000+p[0x1f]*0x1000000;
			}
			else
			{
			rams=rams+Format("\tSize: %d MB\r\n",ARRAYOFCONST(( p[0xc] + p[0xd] * 0x100)));
			tram+=p[0xc] + p[0xd] * 0x100;
			}
			rams=rams+Format("\tSpeed: %dMHz\r\n", ARRAYOFCONST((p[0x15] + p[0x16] * 0x100)));
			rams=rams+Format("\tDevice Locator: %s\r\n", ARRAYOFCONST((dmi_string(h, p[0x10]))));
		 //	rams=rams+Format("\tBank Locator: %s\r\n", ARRAYOFCONST((dmi_string(h, p[0x11]))));
			rams=rams+Format("\tManufacturer: %s\r\n", ARRAYOFCONST((dmi_string(h, p[0x17]))));
		 //	rt=rt+Format("\tSerial Number: %s\r\n", ARRAYOFCONST((dmi_string(h, p[0x18]))));
		 //	rt=rt+Format("\tAsset Tag: %s\r\n", ARRAYOFCONST((dmi_string(h, p[0x19]))));
		 //	rt=rt+Format("\tPart Number: %s\r\n", ARRAYOFCONST((dmi_string(h, p[0x1A]))));
		 rams=rams+"\r\n";
		 }
		 else if (h->type == 28) {
			  rams=rams+Format("\tManufacturer: %s\r\n", ARRAYOFCONST((dmi_string(h, p[0x4]))));
			  }

		}

		p += h->length;
		while ((*(WORD *)p) != 0) p++;
		p += 2;
	}
	tram=tram/1024;
  rams=rams+"\tTotal ram:"+IntToStr((__int64)tram)+"GB\r\n";
  return rt+cpus+rams;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章