Получение информации из SMBIOS

 

Написал код для чтения информации о железе (материнская плата и платформа) из SMBIOS. Используется, естественно, WinAPI. Может быть использован для привязки продуктов к железу. На мой взгляд, привязывать к чему-либо другому, кроме материнской платы, смысла нет. Диски, видеокарты - переменная величина.

SMBIOS.mqh класть в Include.

Test SMBIOS.mq5 - в Scripts.

Для реального использования, когда не нужна лишняя инфа, закомментировать/не определять #define SMBIOS_DEBUG

Я испытал только на одном ноутбуке и VPS и требуется проверка сообществом и отчёты, если работает неправильно. Данные сверяйте с программой hwinfo.

1. В коде делается допущение, что данные из SMBIOS выдаются в фиксированном порядке. Поэтому, если есть несоответствия, желательно дать полный выхлоп теста и скриншоты из hwinfo с вкладок BIOS, System, Mainboard и System enclosure с дерева Motherboard/SMBIOS DMI. Иначе мне не отладить.

2. Нужен совет программистов-красавчиков, как сделать красиво здесь:

//const uint    SMBIOS_signature = 'RSMB';
const uint      SMBIOS_signature = ('R' << 24) + ('S' << 16) + ('M' << 8) + 'B';
HWiNFO - Free System Information, Monitoring and Diagnostics
  • www.hwinfo.com
Free Hardware Analysis, Monitoring and Reporting. In-depth Hardware Information, Real-Time System Monitoring, Reporting & more
Файлы:
SMBIOS.mqh  6 kb
 
2021.03.23 14:33:50.492 array out of range in 'SMBIOS.mqh' (170,8)
 
fxsaber:

Похоже, выдаётся другое кол-во полей. Попробовал сделать массив с запасом, посмотрим, будут ли съезжать. Перевыложил SMBIOS.mqh.

PS: как я сказал, проверял только на одном компе. Доступа к другим нет. Так что не обессудьте.
Файлы:
SMBIOS.mqh  5 kb
 
Edgar Akhmadeev:

как сделать красиво здесь:

template <typename T>
T StringToInteger2( const string Str )
{
  T Res = 0;
  
//  const int Size = MathMin(StringLen(Str), sizeof(T));
  const int Size = StringLen(Str);
  
  for (int i = 0; i < Size; i++)
    Res = (Res << 8) + Str[i];
    
  return(Res);
}

//const uint    SMBIOS_signature = 'RSMB';
const uint      SMBIOS_signature = StringToInteger2<uint>("RSMB");
 
Edgar Akhmadeev:

Похоже, выдаётся другое кол-во полей. Попробовал сделать массив с запасом, посмотрим, будут ли съезжать. Перевыложил SMBIOS.mqh.

2021.03.23 14:49:24.516 Location in chassis:  
2021.03.23 14:49:24.516 array out of range in 'SMBIOS.mqh' (192,24)
 
fxsaber:

Спасибо. Красивее, но как-то избыточно. Хочется без исполняемого кода. 

 

Win7 х64


 

Заработал, надо к 4ке прикрутить, 

При не залогиненном счете отработал.

2021.03.23 15:40:24.109 Terminal Windows 7 Service Pack 1 build 7601, Intel Core i3-3220  @ 3.30GHz, 0 / 7 Gb memory, 11 / 298 Gb disk, IE 11, UAC, GMT+3


FM      0       15:51:26.042    Test_SMBIOS (USDSEK,M1) System Management BIOS Version: 2.7
GF      0       15:51:26.043    Test_SMBIOS (USDSEK,M1) System BIOS Version: 4.6
RM      0       15:51:26.043    Test_SMBIOS (USDSEK,M1) Embedded Controller Firmware Version: 255.255
LJ      0       15:51:26.043    Test_SMBIOS (USDSEK,M1) BIOS Vendor: American Megatrends Inc.
QN      0       15:51:26.043    Test_SMBIOS (USDSEK,M1) BIOS Version: V1.6
DI      0       15:51:26.043    Test_SMBIOS (USDSEK,M1) BIOS Release Date: 04/17/2012
RE      0       15:51:26.043    Test_SMBIOS (USDSEK,M1) UUID: {0000-00-00-00-8c89a5ffbfb6}
FL      0       15:51:26.043    Test_SMBIOS (USDSEK,M1) System Manufacturer: MSI
DE      0       15:51:26.043    Test_SMBIOS (USDSEK,M1) Product Name: MS-7788
QR      0       15:51:26.043    Test_SMBIOS (USDSEK,M1) Product Version: 1.0
KK      0       15:51:26.043    Test_SMBIOS (USDSEK,M1) Product Serial Number: To be filled by O.E.M.
ON      0       15:51:26.043    Test_SMBIOS (USDSEK,M1) SKU Number: To be filled by O.E.M.
KH      0       15:51:26.043    Test_SMBIOS (USDSEK,M1) Family: To be filled by O.E.M.
FH      0       15:51:26.043    Test_SMBIOS (USDSEK,M1) Mainboard Manufacturer: MSI
OL      0       15:51:26.043    Test_SMBIOS (USDSEK,M1) Mainboard Name: H61M-P20 (G3) (MS-7788)
ED      0       15:51:26.043    Test_SMBIOS (USDSEK,M1) Mainboard Version: 1.0
KM      0       15:51:26.043    Test_SMBIOS (USDSEK,M1) Mainboard Serial Number: To be filled by O.E.M.
EN      0       15:51:26.043    Test_SMBIOS (USDSEK,M1) Asset Tag: To be filled by O.E.M.
CI      0       15:51:26.043    Test_SMBIOS (USDSEK,M1) Location in chassis: To be filled by O.E.M.
MP      0       15:51:26.043    Test_SMBIOS (USDSEK,M1) {0000-00-00-00-8c89a5ffbfb6}
EH      0       15:51:26.043    Test_SMBIOS (USDSEK,M1) To be filled by O.E.M.
IP      0       15:51:26.043    Test_SMBIOS (USDSEK,M1) To be filled by O.E.M.
 
fxsaber:

Ищё исправление.

Файлы:
SMBIOS.mqh  5 kb
 
Edgar Akhmadeev:

Ищё исправление.

 
 
Vitaly Muzichenko:

Win7 х64

Это ВЕСЬ выхлоп?