话说现在用C/C++的人貌似越来越少了,想查点资料,发现以前大部分有关C/C++的资料都找不到了,几乎是JAVA和C#占据了整个版面。看来老一代的程序员在逐步的退出了,言归正传吧,不想多说了,上代码。
UINT GetSystemFirmwareTable(
DWORD FirmwareTableProviderSignature,
DWORD FirmwareTableID,
PVOID pFirmwareTableBuffer,
DWORD BufferSize
);
函数具体用法参考MSDN: https://docs.microsoft.com/en-us/windows/win32/api/sysinfoapi/nf-sysinfoapi-getsystemfirmwaretable
// 获取 BIOS DMI信息
// 申请一个内存区域,大概9M左右就行了,BIOS固件不会有多大的,不放心就多申请点内存
int BiosBufMaxLen=1024*1024*9;
char* BiosBuf=new char[MemoryBufMaxLen];
memset(BiosBuf,0,MemoryBufMaxLen);
// RSMB
DWORD iSignature='R';
iSignature=iSignature << 8 | 'S';
iSignature=iSignature << 8 | 'M';
iSignature=iSignature << 8 | 'B';
UINT BiosBufLen=GetSystemFirmwareTable(iSignature,0,BiosBuf,BiosBufMaxLen);
if (BiosBufLen > 8){
// 函数执行成功后,返回的数据结构是:RawSMBIOSData
RawSMBIOSData* lpRawSMBIOSData=(RawSMBIOSData*)BiosBuf;
if (lpRawSMBIOSData->Length==BiosBufLen-8){
// lpRawSMBIOSData->SMBIOSTableData 就是数据内容
// lpRawSMBIOSData->Length 是数据内容大小
}
}
delete[] BiosBuf;
BiosBuf=0;
// 有关 RawSMBIOSData 的数据结构
struct RawSMBIOSData
{
BYTE Used20CallingMethod;
BYTE SMBIOSMajorVersion;
BYTE SMBIOSMinorVersion;
BYTE DmiRevision;
DWORD Length;
BYTE SMBIOSTableData[];
}
本机获得的数据:
// 得到的数据需要自己解释啊,这是有关BIOS数据解释的PDF文档:
dsp0134_3.2.0.pdf