Уникальные номера для определенного "компа"

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by _nic, 1 Mar 2009.

  1. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Как можно попроще получить любое произвольное число?Но что бы оно было уникальным для каждого компьютера на котором будет выполнятся такой код.
     
  2. 0x0c0de

    0x0c0de Elder - Старейшина

    Joined:
    25 May 2007
    Messages:
    441
    Likes Received:
    396
    Reputations:
    297
    1) получить бренд-индекс процессора (cpuid функции с 0x80000002 по 0x80000004)

    2) получить серийный номер винта (http://forum.codenet.ru/archive/index.php/t-9911.html)

    сложить 2 строки, взять от них хеш и получите уникальное число
     
  3. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Я просил попроще а не на как минимум 150 строчек кода :( Мне не принципиально что число может менятся.Мне главное что бы возможность его повторения максимально стремилась к нулю.
    Вот нашол код получения мака сетевой
    Code:
    //----------------------
    typedef DWORD (CALLBACK* GetadAptInfo)(PIP_ADAPTER_INFO, PULONG);
     HINSTANCE iphlpapi;
     iphlpapi=LoadLibrary("iphlpapi.dll");
     if (!iphlpapi)
        {
         ShowMessage( "Error of upload iphlpapi.dll!");
         Abort();
        }
     GetadAptInfo GetAdaptersInfo;
     GetAdaptersInfo = ( GetadAptInfo)
     GetProcAddress( iphlpapi, "GetAdaptersInfo");
     ULONG adapter_info_size = 0;
     PIP_ADAPTER_INFO pip_a_i = NULL;
     GetAdaptersInfo( pip_a_i, &adapter_info_size );
     pip_a_i = (PIP_ADAPTER_INFO)
                          malloc( sizeof(char) * adapter_info_size);
        if ( GetAdaptersInfo( pip_a_i, &adapter_info_size ))
           {
            ShowMessage("Error in GetAdaptersInfo!");
            free(pip_a_i);
            Abort();
           }
        while (pip_a_i)
              {
               Memo1->Lines->Add("Adapter's CLSID: " + (String)pip_a_i->AdapterName);
               Memo1->Lines->Add ("Name; " + (String)pip_a_i->Desc_ription);
               Memo1->Lines->Text =  Memo1->Lines->Text + "MAC address: ";
               for (int i = 0; i < pip_a_i->AddressLength; i++)
                   {
                     Memo1->Lines->Text =  Memo1->Lines->Text + ((unsigned char)pip_a_i->Address[i]) + ".";
                   }
               Memo1->Lines->Add("");
               pip_a_i = pip_a_i->Next;
              }
        free(pip_a_i);
        FreeLibrary(iphlpapi); 
    
    Но есть одна проблемка :( У меня он почему то выводит информацию только по виртуальным сетевухам vmware :confused: А реальной физической почему то невидет
     
  4. ToniKapuchon

    ToniKapuchon Elder - Старейшина

    Joined:
    26 Feb 2006
    Messages:
    153
    Likes Received:
    45
    Reputations:
    -1
    там не 150 строчек получиться, а максимум 10)) да и ваще если ты умеешь кодить, то как то глупо задавать такие вопросы!
     
  5. cremator (c)

    cremator (c) Elder - Старейшина

    Joined:
    20 Jun 2008
    Messages:
    258
    Likes Received:
    72
    Reputations:
    0
    а (cpuid функции с 0x80000002 по 0x80000004) что значат? и как их заюзать? лучше на дельфи
     
  6. stasoft

    stasoft Banned

    Joined:
    3 Feb 2009
    Messages:
    9
    Likes Received:
    5
    Reputations:
    2
    Ищите в варезниках вот такую штуку и будет вам щастье.
     
  7. 0x0c0de

    0x0c0de Elder - Старейшина

    Joined:
    25 May 2007
    Messages:
    441
    Likes Received:
    396
    Reputations:
    297

    Чтобы получить строку бренд-индекс, надо последовательно вызывать команду cpuid со значениями в eax = 0x80000002 , 0x80000003,0x80000004 . В результате в регистрах eax, ebx, ecx, edx именно в таком порядке вы будете получать по 16 байт [4x4] строки. И того, для хранения самого индекса вам потребуется строка длиной 48 ascii символов и завершающий 0 и того 49 символов (как видно это как раз максимально возможное значение).

    В сорцах моего amd-cpu-info эта функция есть

    Code:
    VOID WINAPI GetBrandStr(PCHAR szBrand)
    {
     for(DWORD arg = 0x80000002,i=0;arg<=0x80000004;arg++,i+=15)
     {
                    _asm
                    {
                            mov edi,szBrand
                    
                            mov eax,arg
                            
                            cpuid
                            
                            mov esi,i
                            
                            mov dword ptr [edi+esi],eax
                            
                            mov dword ptr [edi+3+esi],ebx
                        
                            mov dword ptr [edi+7+esi],ecx
                            
                            mov dword ptr [edi+11+esi],edx
                    }
    
    
                    
     }
    }
    
    Пример вызова


    Code:
    
    CHAR cBrandInd[49];
    
    RtlZeroMemory(&cBrandInd,49);
    
    GetBrandStr(cBrandInd);
    
    MessageBoxA(0,cBrandInd,"Processor",0);
    
    
    Как пример

    "AMDAthlon(tm) 64 X Dual Core Processr 5200+"

    2ТС как мне кажется, это довольно простой способ - все, что связано с cpuid. У этой команды еще имеется большое количество различных функций с помощью которых можно узнать возможности конкретного процессора. Правда, если не использовать с другими параметрами оборорудования, то не особо случайно получиться, да вы и сами понимаете

    желаю удачи
     
    #7 0x0c0de, 2 Mar 2009
    Last edited: 2 Mar 2009
  8. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    по мне проще сгенерить ID через rdtsc и сохранить в реестре.
    Хотя способ с номером тома системного диска - тож очень хорош.
     
  9. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Я читал что такое способ не работает на старых процессорах типа пентиум 3 или атлон ХР
     
  10. 0x0c0de

    0x0c0de Elder - Старейшина

    Joined:
    25 May 2007
    Messages:
    441
    Likes Received:
    396
    Reputations:
    297
    >>Я читал что такое способ не работает на старых процессорах типа пентиум 3 или атлон ХР

    Нет проблемы добавить небольшую проверку. Если функция cpuid 80000000h вернет в eax значение <80000004h, то вывод строки бренд-индекса не поддерживается. И тогда можно сделать по старинке - вывод идентификатора с помощью функции 0.
     
    1 person likes this.
  11. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Я выбрал серийник тома раздела с виндой.
     
  12. Hellsp@wn

    Hellsp@wn Elder - Старейшина

    Joined:
    29 Apr 2007
    Messages:
    401
    Likes Received:
    153
    Reputations:
    48
    если юзать cpuid, то правилом хорошего тона предпологается или обернуть вызов в сех иди проверить поддержку рпоцессором такой инструкции:
    Code:
    function IsCPUID(): Boolean; register;
    asm
      PUSHFD                 {save EFLAGS to stack}
      POP     EAX            {store EFLAGS in EAX}
      MOV     EDX, EAX       {save in EDX for later testing}
      XOR     EAX, $200000;  {flip ID bit in EFLAGS}
      PUSH    EAX            {save new EFLAGS value on stack}
      POPFD                  {replace current EFLAGS value}
      PUSHFD                 {get new EFLAGS}
      POP     EAX            {store new EFLAGS in EAX}
      XOR     EAX, EDX       {check if ID bit changed}
      JZ      @exit          {no, CPUID not available}
      MOV     AL, TRUE       {yes, CPUID is available}
    @exit:
    end;
    как вариант, получать имя компа/юзера :)
     
    #12 Hellsp@wn, 2 Mar 2009
    Last edited: 2 Mar 2009
  13. 0x0c0de

    0x0c0de Elder - Старейшина

    Joined:
    25 May 2007
    Messages:
    441
    Likes Received:
    396
    Reputations:
    297
    я вот сейчас у интелов глянула в мане, там до 486 cpuid не поддерживается, как и у амд (там у них кажись тоже с 486 появилось). И у себя не проверяла в кодесе, температуру-то с amd64 можно мерить через Thermtrip Status Register... В общем случае, конечно же, проверка не помешает.

    ЗЫ Хотя что тут говорить, тс уже выбрал удобный для себя способ
     
    #13 0x0c0de, 2 Mar 2009
    Last edited: 2 Mar 2009
  14. Jes

    Jes Elder - Старейшина

    Joined:
    16 Apr 2007
    Messages:
    370
    Likes Received:
    391
    Reputations:
    34
  15. GanWorld

    GanWorld New Member

    Joined:
    16 Mar 2007
    Messages:
    26
    Likes Received:
    1
    Reputations:
    0
    А узнать серийник или индификатор Материнской платы?
     
  16. St0nX

    St0nX Elder - Старейшина

    Joined:
    19 May 2007
    Messages:
    257
    Likes Received:
    46
    Reputations:
    0
    Вопрос зачем? Они не уникальны. А вообще получить можно из BIOS _ttp://www.codeproject.com/KB/system/SMBIOS_Peek.aspx
     
  17. Buffalon

    Buffalon Elder - Старейшина

    Joined:
    22 Mar 2008
    Messages:
    241
    Likes Received:
    34
    Reputations:
    8
    КАПЕЦ %) РАНДОМ + РАНДОМ + РАНДОМ