Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Получение информации из SMBIOS
Vitaly Muzichenko, 2021.03.23 20:33
Итоговый код получился вот таким
//+------------------------------------------------------------------+ //| ProjectName | //| Copyright 2020, CompanyName | //| http://www.companyname.net | //+------------------------------------------------------------------+ #property version "1.0" #property strict #property copyright "(c)2021 Edgar Akhmadeev" #property link "https://www.mql5.com/en/users/dali" // 2021.03.23 #import "kernel32.dll" uint GetSystemFirmwareTable(uint firmware_table_provider_signature,uint firmware_table_id,uchar firmware_table_buffer,uint buffer_size); uint GetSystemFirmwareTable(uint firmware_table_provider_signature,uint firmware_table_id,uchar &firmware_table_buffer[],uint buffer_size); #import //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ union UUID16 { uchar b[16]; }; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ class SMBIOS { private: static UUID16 uuid; public: static string Read(); }; static UUID16 SMBIOS::uuid; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ static string SMBIOS::Read() { const uint SMBIOS_signature = ('R' << 24) + ('S' << 16) + ('M' << 8) + 'B'; // Query size of SMBIOS info. uint size = GetSystemFirmwareTable(SMBIOS_signature, 0, NULL, 0); // Allocate memory for SMBIOS info uchar data[]; if (ArrayResize(data, size) <= 0) return NULL; // Retrieve the SMBIOS table uint written = GetSystemFirmwareTable(SMBIOS_signature, 0, data, size); if (written != size) return NULL; uint idx = 0; idx += 8; // Process the SMBIOS info string sUUID; while (idx < size) { uchar type = data[idx]; uchar len = data[idx + 1]; if (len < 4) break; if (type == 1 && len >= 25) { idx += 8; // offset to UUID // check if there is a valid UUID (not all 0x00 or all 0xff) bool all_zero = true, all_one = true; for (int i = 0; i < 16 && (all_zero || all_one); i++) { if (data[idx + i] != 0x00) all_zero = false; if (data[idx + i] != 0xFF) all_one = false; } if (!all_zero && !all_one) { uint idx2 = 0; // As off version 2.6 of the SMBIOS specification, the first 3 fields of the UUID are supposed to be encoded on little-endian. (para 7.2.1) sUUID = StringFormat("%02x", uuid.b[idx2++] = data[idx + 3]); sUUID += StringFormat("%02x", uuid.b[idx2++] = data[idx + 2]); sUUID += StringFormat("%02x", uuid.b[idx2++] = data[idx + 1]); sUUID += StringFormat("%02x", uuid.b[idx2++] = data[idx + 0]); sUUID += "-"; sUUID += StringFormat("%02x", uuid.b[idx2++] = data[idx + 5]); sUUID += StringFormat("%02x", uuid.b[idx2++] = data[idx + 4]); sUUID += "-"; sUUID += StringFormat("%02x", uuid.b[idx2++] = data[idx + 7]); sUUID += StringFormat("%02x", uuid.b[idx2++] = data[idx + 6]); sUUID += "-"; for (int i = 8; i < 10; i++) sUUID += StringFormat("%02x", uuid.b[idx2++] = data[idx + i]); sUUID += "-"; for (int i = 10; i < 16; i++) sUUID += StringFormat("%02x", uuid.b[idx2++] = data[idx + i]); } return sUUID; } else idx += len; // Skip formatted area do { int i = 0; while (idx + i < size && data[idx + i] != 0) ++i; idx += i + 1; } while (data[idx] != 0); ++idx; } return sUUID; } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OnStart() { string uuid = SMBIOS::Read(); if (uuid == NULL) { Print("Error reading SMBIOS data!"); return; } Print("UUID: ", uuid); } //+------------------------------------------------------------------+
---
@Edgar Akhmadeev, огромное спасибо!
Посмотрите эту ветку.
Доброго времени. Есть индикатор, хотелось бы сделать привязку к железу через dll. Есть бесплатные варианты - высылайте. Если кто может сделать за деньги - пишите стоимость этой услуги.
Здесь найдутся желающие.
- 2021.08.04
- www.mql5.com
Разместите в Маркете. Получите бесплатную привязку к железу.
И не только, еще и к оси)
Посмотрите эту ветку.
Валерий, проблема в ветке решена не до конца .
Конечно, на левом железе она вряд ли может быть решена. Возможно нужно брать id нескольких устройств. К тому же предусмотреть конфигурацию железа на все 100 тоже нельзя. Какие то часть могут быть виртуальными)
Валерий, проблема в ветке решена не до конца .
Вообще-то существую коммерческие решения, даже с физическими крипто-носителями.
Осильте уже поиск в яндексе
Вообще-то существую коммерческие решения, даже с физическими крипто-носителями.
Осильте уже поиск в яндексе
Уже не только Яндекс перелопатил, но и Гугл.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования