SMBIOS'tan bilgi alma - sayfa 5

 

Sorun MT4'te, MT5'te mükemmel çalışıyor


 
Vitaly Muzichenko :

Sorun MT4'te, MT5'te mükemmel çalışıyor

Anladım.

fonksiyon parametresi belirtir

 uint     GetSystemFirmwareTable( uint firmware_table_provider_signature, uint firmware_table_id, PVOID firmware_table_buffer, uint buffer_size);

PVOID'in ne olduğuna baktım

Bazı nedenlerden dolayı, bu tip uzun olarak adlandırıldı.

uchar olarak değiştirildi ve işe yaradı

 

Son kod şu şekilde

 //+------------------------------------------------------------------+
//|                                                      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 , çok teşekkür ederim!

 
Vitaly Muzichenko :

Son kod şu şekilde

---

@Edgar Akhmadeev , çok teşekkür ederim!

Zevk almak.
Birkaç saat içinde c ++ ve MS belgelerinde birkaç örnek yazdım, laboratuvar forumu kullanıcıları üzerinde test ettim.
Flash mob böyle. Kendim kullanmayı düşünmüyorum.
 
Edgar Akhmadeev :

SMBIOS'tan donanım bilgilerini (anakart ve platform) okumak için kod yazdı. Doğal olarak WinAPI kullanılır. Ürünleri ütüye bağlamak için kullanılabilir. Bence anakarttan başka bir şeye bağlamanın bir anlamı yok. Diskler, video kartları - değişken.

Selamlar!

Bazı yetersiz istatistikler ~50 araba topladı.

UUID'nin birkaç makine için aynı olabileceği ortaya çıktı, bu çok üzücü. Nedenmiş?

Aynı zamanda, çoğu zaman, yani 6 makinede ve 7. makinemde, "03000200-0400-0500-0006-000700080009" sayısı eşleşiyor

Yardımcı programlar tarafından kolayca değiştirilebilmesine rağmen, C sürücüsünün bölüm numarası hakkında istatistik toplamaya çalışacağım, bu nedenle özellikle ciltleme olarak uygun değil.

 
Çinliler şaka yapıyor.
 

Bu durumda güvenilir bir çıkış yolu göremiyorum. Sadece 50'den 7'sinin denk gelmesine sevinmek için kalır.

Anakartın UUID'sine ek olarak, başka güvenilir bağlama yoktur. Geri kalanlar ya isteğe bağlıdır (örn. seri numarası) ya da kolayca değiştirilir ya da Windows'u biçimlendirirken, yeniden yüklerken veya hafif bir yükseltme sırasında değiştirilir.

Bir donanım anahtarına bağlı olmadığı sürece, ancak bu çok fazla. Sadece binlerce dolarlık yazılım için iyidir.

 
Edgar Akhmadeev :

Bu durumda güvenilir bir çıkış yolu göremiyorum. Sadece 50'den 7'sinin denk gelmesine sevinmek için kalır.

Anakartın UUID'sine ek olarak, başka güvenilir bağlama yoktur. Geri kalanlar ya isteğe bağlıdır (örn. seri numarası) ya da kolayca değiştirilir ya da Windows'u biçimlendirirken, yeniden yüklerken veya hafif bir yükseltme sırasında değiştirilir.

Bir donanım anahtarına bağlı olmadığı sürece, ancak bu çok fazla. Sadece binlerce dolarlık yazılım için iyidir.

Benim mantığım şu: programın bir örneğini aldıysanız, donanımı hatırlar ve daha fazlasını alamazsınız. Şimdi, Kolya bir soruşturma aldıysa, geri kalanının uçuşta olduğu ortaya çıktı. Böylece sevinç orada sona erdi.

Şimdi bir çıkış yolu görüyorum, C sürücüsüne bağlanın

 
Vitaly Muzichenko :

Benim mantığım şu: programın bir örneğini aldıysanız, donanımı hatırlar ve daha fazlasını alamazsınız. Şimdi, Kolya bir soruşturma aldıysa, geri kalanının uçuşta olduğu ortaya çıktı. Böylece neşe orada sona erdi.

Şimdi bir çıkış yolu görüyorum, C sürücüsüne bağlanın

Diğerlerini anlamadım.

 
Vitaly Muzichenko :

Benim mantığım şu: programın bir örneğini aldıysanız, donanımı hatırlar ve daha fazlasını alamazsınız. Şimdi, Kolya bir soruşturma aldıysa, geri kalanının uçuşta olduğu ortaya çıktı. Böylece neşe orada sona erdi.

Şimdi bir çıkış yolu görüyorum, C sürücüsüne bağlanın

Bu, örneğin bir C sürücüsü varsa ve örneğin / dev / sda değilse