Avatar billede skwat Praktikant
24. november 2005 - 00:09 Der er 11 kommentarer og
1 løsning

Hardware ID

Hejsa,

Jeg har fået en rigtig lækker opgave som jeg ikke rigtigt kan få google til at hjælpe mig med.

Jeg skal på en og eller anden måde kunne identificere det hardware en applikation køre på, helst via. serie nummer på enten bundkort eller CPU.

Det virkelig fede er at metoden/fremgangsmåden skal kunne bruges på både windows og linux,

Er der ikke et klogt hoved her inde der kan komme med lidt input, ideer eller eksempler? Udviklingsmiljøet er kylix/borland c++ 6
Avatar billede bertelbrander Novice
24. november 2005 - 00:13 #1
Den klassiske måde at løse problemet er at bruge MAC addressen på netkortet, der er ret let, kan laves ens på både Windows og Linux, men er ikke ret sikkert.
Avatar billede bertelbrander Novice
24. november 2005 - 00:24 #2
Jeg stjal lidt kode herfra:
http://www.codeproject.com/system/PIIISN.asp

Og skrev det lidt om så det kan kompileres med Borland (kræver at du sætter kompileren til at kompilere til Pentium):

#include <string>
#include <iostream>
#include <windows>

void GetProcessorSeialNumbet(bool withSeparator)
{
  DWORD  t,m,b; //top,middle,botttom
  DWORD serial[3];
  _asm {
  mov  eax,1
  cpuid
  mov  t,eax
  mov  eax,3
  cpuid
  mov  m,edx
  mov  b,ecx
    }

  // copy the locals into the pointer variables passed in
  serial[0] = b;
  serial[1] = m;
  serial[2] = t;


  std::string temp;
  std::string Serial;

  static char hex_chars[16] = {'0','1','2','3','4','5','6','7', '8','9','A','B','C','D','E','F'};
  for (int dw_count = 2; dw_count>=0; dw_count--)
  {
      for (int bp = 28; bp >= 0; bp-=4)
      {
        DWORD nibble = (serial[dw_count] >> bp) & 0x0f;
        Serial += hex_chars[nibble];
        if ((bp == 16) || ((bp == 0) && (dw_count!=0)))
            if(withSeparator)
              Serial += "-";
      }
  }
  std::cout << "Serial: " << Serial << std::endl;
}

int main()
{
  GetProcessorSeialNumbet(true);
}
Avatar billede skwat Praktikant
24. november 2005 - 00:43 #3
Nu siger codeproject at de har for travlt til at jeg må læse hvad der står, men det ser meget rigtigt ud.

Jeg skal blot lige have det testet af (på min laptop har jeg kun en tysk udgave af borland c++ == NoGo)

Der er noget asm kode her, nu er det ikke sådan at det betyder at den ikke kan køre på AMD cpu'er osv?
Avatar billede bertelbrander Novice
24. november 2005 - 00:47 #4
Jeg ved ikke om det kan køre på AMD, jeg har Intel. Men jeg vil tro at det virker på alle processorer, men du bør naturligvis teste.
Avatar billede skwat Praktikant
25. november 2005 - 13:13 #5
Tak for hjælpen indtil nu, men (mandatory) denne kode virker ikke overbevisende, ved et tilfælde har jeg opdaget at to forskellige cpu'er returnere det samme id, umiddelbart ser det ud til at assembly koden læser et forkert sted. (artiklen på codeproject siger også det primært er P3'er)
Avatar billede bertelbrander Novice
25. november 2005 - 20:47 #6
En anden version stjålet herfra:
http://www3.ccw.com.cn/club/essence/200305/13942.htm

#include <stdio.h>

struct cpuid_t
{
    unsigned long id0;
    unsigned long id1;
    unsigned long id2;
    unsigned long id3;
};

cpuid_t getCPUID(unsigned long func_idx)
{
    cpuid_t id;
    unsigned long id0, id1, id2, id3;
    __asm{
        mov eax, func_idx
        cpuid
        mov id0, eax
        mov id1, ebx
        mov id2, ecx
        mov id3, edx
    }
    id.id0 = id0;
    id.id1 = id1;
    id.id2 = id2;
    id.id3 = id3;
    return id;
}

void main()
{
    for(int j=0; j<2; j++)
    {
        for(int i=0; i<4; i++)
        {
            unsigned long k=i+(j?0x80000000:0);
            cpuid_t id=getCPUID(k);
            printf("your CPU id is: [0x%xH]%x-%x-%x-%x\n", k, id.id0, id.id1, id.id2, id.id3);
        }
    }
}
Avatar billede skwat Praktikant
28. november 2005 - 15:49 #7
Hejsa Bertel, jeg har testet på 7 forskellige maskiner, og desvære kun fået to forskellige outputs ;(
Avatar billede bertelbrander Novice
28. november 2005 - 20:19 #8
Så har jeg ikke flere ideer :-(
Avatar billede skwat Praktikant
28. november 2005 - 21:05 #9
Hmmm og du samler ikke på point ;)
Og du har ikke et hint til aflæsning af tilgængelige mac adresser?
Avatar billede bertelbrander Novice
28. november 2005 - 21:11 #10
MAC address:
http://bdn.borland.com/article/0,1410,26040,00.html

Nej, jeg samler ikke på point.
Avatar billede skwat Praktikant
30. november 2005 - 08:54 #11
Så må jeg selv tage dem, selv om jeg ikke har noget at bruge dem til ;-)

Et tillægs spørgsmål, hvor søger du den information du har givet mig? Jeg syntes google.com er meget meget voldsom ligeså snart c++ indgår i mit kriterium?
Avatar billede bertelbrander Novice
30. november 2005 - 21:48 #12
C++ er et dårligt kritierie, det giver normalt ikke noget godt.
Ofte inkluderer jeg msdn i søgningen hvis det har noget med windows at gøre.

Hvis du søger på "get mac address borland" (uden "") på google er linket fra før det første der dukker op.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester