Autor Beitrag
NetSpider
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 123

Windows XP Pro
Delphi 7 Enterprise
BeitragVerfasst: Mo 04.06.07 19:56 
Ich hab hier ein kleines Progrem.
Dieses kleine Programm soll die ID der installierten Prozessoren auslesen - das Problem ist aber, dass ich das Program bereits auf zwei Computern laufen hab lassen und die ID Nummern sind absolut identisch! Allerdings sind beide Computer mit einem Intel E6600 und einem Mainboard von Gigabyte (auch selbes Modell) ausgestattet. Normalerweise duerfte doch das nicht passieren, oder?

Hier mal der Code der die ID ausliest - ich gebs zu, der Code ist irgendwo ausm Internet und ich hab keine Ahnung von asm.

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
const
  ID_BIT = $200000// EFLAGS ID bit

type
  TCPUID = array[1..4of Longint;


// ID des Prozessors
function GetCPUID: string;
//IntToPos ist notwendig, da in extrem seltenen Fällen negative CPU-ID's vorkommen
function IntToPos(Value: Integer): integer; overload;
  begin
    if Value < 0 then
      Result := -Value
    else
      Result := Value;
  end;

function IntToPos(Value: Int64): int64; overload;
  begin
    if Value < 0 then
      Result := -Value
    else
      Result := Value;
  end;

function IsCPUID_Available: Boolean; register;
asm
PUSHFD             {direct access to flags no possible, only via stack}
POP     EAX        {flags to EAX}
MOV     EDX,EAX    {save current flags}
XOR     EAX,ID_BIT {not ID bit}
PUSH    EAX        {onto stack}
POPFD              {from stack to flags, with not ID bit}
PUSHFD             {back to stack}
POP     EAX        {get back to EAX}
XOR     EAX,EDX    {check if ID bit affected}
JZ      @exit      {no, CPUID not availavle}
MOV     AL,True    {Result=True}
@exit:
end;

function GetCPUID: TCPUID; assemblerregister;
asm
PUSH    EBX       {Save affected register}
PUSH    EDI
MOV     EDI,EAX   {@Resukt} 
MOV     EAX,1
DW      $A20F     {CPUID Command}
STOSD             {CPUID[1]}
MOV     EAX,EBX
STOSD             {CPUID[2]}
MOV     EAX,ECX
STOSD             {CPUID[3]}
MOV     EAX,EDX
STOSD             {CPUID[4]}
POP     EDI       {Restore registers}
POP     EBX
end;

begin
  if IsCPUID_Available then
    result := IntToStr(IntToPos(GetCPUID[1])) + IntToStr(IntToPos(GetCPUID[2]))
      + IntToStr(IntToPos(GetCPUID[3])) + IntToStr(IntToPos(GetCPUID[4]))
  else

    result := '00000'//Dummywert
end;


Ich hoffe, dass ich nichts vergessen hab. Die Funktion hab ich ineinandergeschachtelt, damit fuer diesen Test alles schoen beieinander ist.

Also, wie gesagt, ich hab auf zwei verschiedenen Rechnern (beide selbes Board und CPU) die gleichen IDs bekommen - das sollte eigentlich nicht sein, oder ist die Funktion die falsche?

Hier noch mein kleines Program. Es zahlt die vorhandenen Prozessoren und fuehrt so lange eine repeat-Schleife aus, bis sie durch alle Prozessorkerne mal durchgerauscht ist. Also nicht mit der Affinity rumspielen bevor man auf Start clickt.

Meine beiden IDs:
1782133120583011075053569
178216910336583011075053569

Vielleicht koennt ihr auch eure IDs posten.

lg NetSpider

Hier noch das Progg:
Einloggen, um Attachments anzusehen!
_________________
Wer in die Fußstapfen anderer tritt hinterlässt keine eigenen Spuren!
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 05.06.07 08:32 
AMD Athlon 64 3200+ Clawhammer
ID: 391220480126614527

BTW:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
Procedure GetProcessorSerialNumber(var Z1,Z2,Z3:Integer); stdcall;
const  CPUID = $A20F;
asm
   MOV EAX,1
DW CPUID
   MOV [Z1],EAX
   MOV EAX,3
DW CPUID
   MOV [Z2],EDX
   MOV [Z3],ECX
end;


Zuletzt bearbeitet von hathor am Di 05.06.07 09:20, insgesamt 1-mal bearbeitet
passiv
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 270

WIN XP Professional
Delphi 7 Enterprise, Java (Eclipse), Python 2.5, Django 1.1
BeitragVerfasst: Di 05.06.07 09:01 
nachdem ich nicht genau weiß was für CPU-Version ich hab:
Intel Pentium M processor 1.60GHz
175220703841343620097

_________________
Die Probleme, die es in der Welt gibt, sind nicht mit der gleichen Denkweise zu lösen, die sie erzeugt hat.
Albert Einstein
Silas
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 478

Windows XP Home
Delphi 2005, RAD Studio 2007, MASM32, FASM, SharpDevelop 3.0
BeitragVerfasst: Di 05.06.07 09:19 
Prozessor: Intel Celeron M 1.40 GHz
ID: 1752206601343620097 ( :shock: )

_________________
Religionskriege sind nur Streitigkeiten darüber, wer den cooleren imaginären Freund hat ;-)
Silas
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 478

Windows XP Home
Delphi 2005, RAD Studio 2007, MASM32, FASM, SharpDevelop 3.0
BeitragVerfasst: Di 05.06.07 11:40 
Ich weiß nicht, ob dir das was hilft, aber ich hab mal schnell ein Prog geschrieben, das den eingebrannten Prozessorstring in Hex ausliest und ausgibt.
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  Windows,
  Unit1 in 'Unit1.pas';

var estr1, estr2, estr3, estr4:  DWord;
    estring: String;

begin
  try
    asm
        // Testen, ob cpuid verfügbar
        pushfd
        pop eax
        mov ebx,eax
        xor eax, 00200000h
        push eax
        popfd
        pushfd
        pop eax
        xor eax, ebx
        jnz @cpuidok
        // Wenn nicht, beenden
        push 0
        call ExitProcess
      @cpuidok:
        mov eax, 80000002h
        cpuid
        mov estr1, eax
        mov estr2, ebx
        mov estr3, ecx
        mov estr3, edx
    end;
      estring := inttohex(estr1, 8) + inttohex(estr2, 8) + 
        inttohex(estr3, 8) + inttohex(estr4, 8);
    asm
        mov eax, 80000003h
        cpuid
        mov estr1, eax
        mov estr2, ebx
        mov estr3, ecx
        mov estr3, edx
    end;
      estring := estring + inttohex(estr1, 8) + 
        inttohex(estr2, 8) + inttohex(estr3, 8) + 
        inttohex(estr4, 8);
    asm
         mov eax, 80000004h
        cpuid
        mov estr1, eax
        mov estr2, ebx
        mov estr3, ecx
        mov estr4, edx
    end;
      estring := estring + inttohex(estr1, 8) + 
        inttohex(estr2, 8) + inttohex(estr3, 8) + 
        inttohex(estr4, 8);
    writeln('CPUID verfuegbar, eingebrannter String (Hex): ' + 
      estring);
    readln;
  except
    on E:Exception do
      Writeln(E.Classname, ': ', E.Message);
  end;
end.

_________________
Religionskriege sind nur Streitigkeiten darüber, wer den cooleren imaginären Freund hat ;-)
NetSpider Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 123

Windows XP Pro
Delphi 7 Enterprise
BeitragVerfasst: Di 05.06.07 13:42 
Also, bis jetzt scheint ja jeder eine andere ID zu haben... Jetzt wuerd mich mal interessieren, was die ID eines Intel Core2 Duo E6600 - also, sollte einer von euch den selben Prozessor haben wie ich - bitte macht den ID-Test. Ich hab auf verschiedenen System komplett identische ID erhalten.

@Silas:
Hab dein Program getestet - das gibt einen ziemlich langen Hex-Wert aus. Wie bereits gesagt - in Assembler kenn ich micht aus. Der Code liest den Prozessor-String aus? Ist das sowas wie die Prozessor-ID? Mein Program liest ja irgendwie irgendeine Nummer aus dem Kern aus - d.h. viele Kerne viele Nummern...
Jedenfalls ist bei deinem Program die Nummer immer gleich - d.h. egal wie ich die Affinity setze - das Resultat bleibt gleich. Diese Nummer sollte dann auch immer ein Unikat sein, oder?

lg, NetSpider

_________________
Wer in die Fußstapfen anderer tritt hinterlässt keine eigenen Spuren!
mister_x
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 85

Win 98, WIN 2000, WIN XP PRO
Delphi 2006
BeitragVerfasst: Di 05.06.07 14:31 
user profile iconNetSpider hat folgendes geschrieben:
Also, bis jetzt scheint ja jeder eine andere ID zu haben... Jetzt wuerd mich mal interessieren, was die ID eines Intel Core2 Duo E6600 - also, sollte einer von euch den selben Prozessor haben wie ich - bitte macht den ID-Test. Ich hab auf verschiedenen System komplett identische ID erhalten.

@Silas:
Hab dein Program getestet - das gibt einen ziemlich langen Hex-Wert aus. Wie bereits gesagt - in Assembler kenn ich micht aus. Der Code liest den Prozessor-String aus? Ist das sowas wie die Prozessor-ID? Mein Program liest ja irgendwie irgendeine Nummer aus dem Kern aus - d.h. viele Kerne viele Nummern...
Jedenfalls ist bei deinem Program die Nummer immer gleich - d.h. egal wie ich die Affinity setze - das Resultat bleibt gleich. Diese Nummer sollte dann auch immer ein Unikat sein, oder?

lg, NetSpider


Ich hab den test gemacht bei meinen E6600
beide ham die selbe ID

178216910336583011075053569
1782133120583011075053569

also des gleiche wie bei dir....
ich hab auch en gigabyte mainboard (GA-965P-DS3)

_________________
Der Computer ist das genialste Produkt der menschlichen Faulheit
Kroko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1284

W98 W2k WXP
Turbo D
BeitragVerfasst: Di 05.06.07 14:51 
@NetSpider, was kommt denn bei Dir hier raus?

Bei Interesse suche ich mal die Quellen :?

_________________
Die F1-Taste steht nicht unter Naturschutz und darf somit regelmäßig und oft benutzt werden! oder Wer lesen kann, ist klar im Vorteil!
NetSpider Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 123

Windows XP Pro
Delphi 7 Enterprise
BeitragVerfasst: Di 05.06.07 15:04 
@mister_x:
*g*g*g* - das gleiche Board hab ich auch... Man oh man! Also irgendwie taugt diese Funktion gar net... Vielleicht is das so ne Nummer aus der man rausfinden kann welche Hardware installiert ist :-)

@Kroko:
Dein Progg lauft unter Vista nicht - werds aber sofort unter XP testen...

OK, hab jetzt den Test gemacht:
Einloggen, um Attachments anzusehen!
_________________
Wer in die Fußstapfen anderer tritt hinterlässt keine eigenen Spuren!
MrSaint
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1033
Erhaltene Danke: 1

WinXP Pro SP2
Delphi 6 Prof.
BeitragVerfasst: Di 05.06.07 15:11 
www.sandpile.org/ia32/cpuid.htm

Dein Rückgabewert der Funktion beschreibt den Prozessor-Typ also eindeutig, nicht den Prozessor. Vonn du EAX = 1 reinschiebst kommen nur Typ-Daten des prozessors zurück (z.B. was für Features er unterstützt etc.), welche natürlich gleich sind bei zwei Prozessoren gleicher Bauart. Vllt wäre es besser, wenn du einfach mal eine 3 in EAX reinschiebst statt der 1, laut Sandpile bekommst du dann die Seriennummer des Prozessors. Also etwa so:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
asm
PUSH    EBX       {Save affected register}
PUSH    EDI
MOV     EDI,EAX   {@Resukt} 
MOV     EAX,3
DW      CPUID     {CPUID Command}
STOSD             {CPUID[1]}
MOV     EAX,EBX
STOSD             {CPUID[2]}
MOV     EAX,ECX
STOSD             {CPUID[3]}
MOV     EAX,EDX
STOSD             {CPUID[4]}
POP     EDI       {Restore registers}
POP     EBX
end;


Damit kommt bei mir, Intel Centrino mit 1,5 GHz folgende ID raus: 453304332400738472061



MrSaint

EDIT: seh gerade, dass die Methode von hathor oben auch mit EAX = 3 arbeitet, die sollte also auch besser sein als die ursprüngliche....

EDIT2: Oh, laut sandpile soll man die CPU-Seriennummer mit CPU type/family etc. verknüpfen, evtl. noch mit dem Vendor-ID String. Ersteres macht hathors Code, der ist also besser als meiner... Wenn jetzt jemand den Vendor_ID String auch noch mit rein haben will, kann man die "Rückgabestruktur" ja noch etwas erweitern, und noch EAX = 0 mit CPUID auswerten....

_________________
"people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems


Zuletzt bearbeitet von MrSaint am Di 05.06.07 15:30, insgesamt 1-mal bearbeitet
Silas
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 478

Windows XP Home
Delphi 2005, RAD Studio 2007, MASM32, FASM, SharpDevelop 3.0
BeitragVerfasst: Di 05.06.07 15:14 
Joachim Rhode/Marcus Roming: Assembler hat folgendes geschrieben:
Funktion 8000_0002h:
EAX - Eingebrannter String
EBX - Eingebrannter String (Fortsetzung)
ECX - Eingebrannter String (Fortsetzung)
EDX - Eingebrannter String (Fortsetzung)
Funktion 8000_0003h:
EAX - Eingebrannter String
EBX - Eingebrannter String (Fortsetzung)
ECX - Eingebrannter String (Fortsetzung)
EDX - Eingebrannter String (Fortsetzung)
8000_0004h
EAX- -Eingebrannter String
EBX - Eingebrannter String (Fortsetzung)
ECX - Eingebrannter String (Fortsetzung)
EDX - Eingebrannter String (Fortsetzung)

Ehrlich gesagt - mehr weiß ich nicht. Mein Programm gibt den String allerdings der einfachheit halber nicht als Solchen aus, sondern als Hex-Zahl, deswegen. Ich nehme aber mal an, dass er sowas wie eine Seriennummer darstellt.

_________________
Religionskriege sind nur Streitigkeiten darüber, wer den cooleren imaginären Freund hat ;-)
MrSaint
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1033
Erhaltene Danke: 1

WinXP Pro SP2
Delphi 6 Prof.
BeitragVerfasst: Di 05.06.07 15:17 
user profile iconSilas hat folgendes geschrieben:

Ehrlich gesagt - mehr weiß ich nicht. Mein Programm gibt den String allerdings der einfachheit halber nicht als Solchen aus, sondern als Hex-Zahl, deswegen. Ich nehme aber mal an, dass er sowas wie eine Seriennummer darstellt.


Nein. Das ist ein Beschreibungsstring des Prozessors, keine Seriennummer. Bei mir zum Beispiel irgendwas á la "Intel Pentium M 1,5 GHz" oder so... Der ist also _noch_ allgemeiner als die ursprüngliche Lösung....

_________________
"people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems
Kroko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1284

W98 W2k WXP
Turbo D
BeitragVerfasst: Di 05.06.07 15:20 
Sagt mir, wenn ich falsch liege, aber laut Deiner Anzeige, steht dort, dass die Seriennummer disabled ist, da wird sie ja dann auch nicht ausgelesen, oder?

_________________
Die F1-Taste steht nicht unter Naturschutz und darf somit regelmäßig und oft benutzt werden! oder Wer lesen kann, ist klar im Vorteil!
MrSaint
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1033
Erhaltene Danke: 1

WinXP Pro SP2
Delphi 6 Prof.
BeitragVerfasst: Di 05.06.07 15:22 
user profile iconKroko hat folgendes geschrieben:
Sagt mir, wenn ich falsch liege, aber laut Deiner Anzeige, steht dort, dass die Seriennummer disabled ist, da wird sie ja dann auch nicht ausgelesen, oder?


Meinst du mich? Wo steht das?

_________________
"people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems
Kroko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1284

W98 W2k WXP
Turbo D
BeitragVerfasst: Di 05.06.07 15:26 
user profile iconMrSaint hat folgendes geschrieben:
user profile iconKroko hat folgendes geschrieben:
Sagt mir, wenn ich falsch liege, aber laut Deiner Anzeige, steht dort, dass die Seriennummer disabled ist, da wird sie ja dann auch nicht ausgelesen, oder?


Meinst du mich? Wo steht das?

Nein, ich meine NetSpider in Bezug auf Result.jpg

_________________
Die F1-Taste steht nicht unter Naturschutz und darf somit regelmäßig und oft benutzt werden! oder Wer lesen kann, ist klar im Vorteil!
NetSpider Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 123

Windows XP Pro
Delphi 7 Enterprise
BeitragVerfasst: Di 05.06.07 15:32 
@MrSaint:
also, wenn ich 1 auf 3 aendere, dann kommt bei mir als Ergebnis 0000. Mach ich da irgendwas falsch?

@Kroko:
Ich hab mich auch gewundert, warum da 'disabled' steht - aber, ich kann dir da keine Antwort drauf geben. Was ist mit der Nummer drunter? Da steht doch was dort. Was ist das denn fuer eine Nummer? Erkennt dein Programm einen DualCore? Das wuerde das disabled vielleicht erklaeren - vielleicht. Und es ist ja eigentlich nur ein Prozessor - trotz 2 physikalischen Einheiten.

Also, wenns irgendwie moeglich ist, dann sollte das Programm am Ende die (richtige)Serien-Nummer des Prozessors ausgeben. Jetzt - wie oben schon gesagt - ist es ja eigentlich nur ein Prozessor - aber meine CPUCount-Funktion zeigt 2 an. Ist ja soweit in Ordnung, aber hat jetzt so ein DualCore eigentlich 2 Seriennummern wegen 2 Kernen oder nur eine, weil ich nur ein Bauteil in meinen PC reinstecke?

Und noch was - Assembler is echt lustig - im Moment verteh ich echt nur Bahnhof was diese Zeilen da machen... Trotzdem muss das Problem geloest werden!

Danke schonmal an alle!

_________________
Wer in die Fußstapfen anderer tritt hinterlässt keine eigenen Spuren!
Kroko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1284

W98 W2k WXP
Turbo D
BeitragVerfasst: Di 05.06.07 15:42 
user profile iconNetSpider hat folgendes geschrieben:
...
@Kroko:
Ich hab mich auch gewundert, warum da 'disabled' steht - aber, ich kann dir da keine Antwort drauf geben. Was ist mit der Nummer drunter? Da steht doch was dort. Was ist das denn fuer eine Nummer? Erkennt dein Programm einen DualCore? Das wuerde das disabled vielleicht erklaeren - vielleicht. Und es ist ja eigentlich nur ein Prozessor - trotz 2 physikalischen Einheiten.

Alle Antworten ohne Garantie:
(1)Um diese ID gab es mal ein riesen Hickhack, die Datenschützer leifen Sturm, weil damit bestimmt Dinge möglich sein sollten, die es nicht geben sollte/dürfte. Daher wurde die ID schnellsten enabled/disabled per BIOS (?) gemacht. MS hätte damit ein zBsp eine todsicheren HardwareKey gehabt und ...
(2) mein Prog. erkennt keinen Dualcore, und bei ID disabled wird halt Blödsinn gelesen!
user profile iconNetSpider hat folgendes geschrieben:
Also, wenns irgendwie moeglich ist, dann sollte das Programm am Ende die (richtige)Serien-Nummer des Prozessors ausgeben. Jetzt - wie oben schon gesagt - ist es ja eigentlich nur ein Prozessor - aber meine CPUCount-Funktion zeigt 2 an. Ist ja soweit in Ordnung, aber hat jetzt so ein DualCore eigentlich 2 Seriennummern wegen 2 Kernen oder nur eine, weil ich nur ein Bauteil in meinen PC reinstecke?

(3) keine Ahnung, aber ich schätze mal ein Prozessor(mit zwei Kernen) eine ID
(4) Disabled heißt Disabled und sollte meiner Meinung nur per Bios änderbar sein.

user profile iconNetSpider hat folgendes geschrieben:
Und noch was - Assembler is echt lustig - im Moment verteh ich echt nur Bahnhof was diese Zeilen da machen... Trotzdem muss das Problem geloest werden!

Danke schonmal an alle!


(5) Viel Spaß!

_________________
Die F1-Taste steht nicht unter Naturschutz und darf somit regelmäßig und oft benutzt werden! oder Wer lesen kann, ist klar im Vorteil!
NetSpider Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 123

Windows XP Pro
Delphi 7 Enterprise
BeitragVerfasst: Di 05.06.07 15:59 
Nun gut - ich moechte ja jetzt nicht das versuchen, was Microsoft nicht geschafft hat (:-)). Ich meine diesen eindeutigen Hardware-Key.

Also - wenn ich das jetzt noch mal alles ein bisschen zusammenfasse:
Mein Programm liest Informationen ueber den Prozessor-Typ aus. D.h. Gleiche Prozessoren -> gleiche ID-Nummern.
Mein Programm zaehlt die installierten CPUs (SingleCPU = 1, DualCore = 2, QuadCore = 4, usw.) und liest die Seriennummern fuer jeden Kern aus...

Silas Version soll nicht so eindeutig sein, weil das Programm nur den Prozessor-String ausliest? Aber der aendert sich doch auch von Model zu Model, oder nicht? Also, im Endeffekt muesste es doch eigentlich das selbe sein - was die Unterschiedlichkeit der Nummern angeht.

Also - kann man jetzt eindeutige Hardware-IDs auslesen oder ist das gaenzlich nicht machbar? CPU braucht jeder (moderne) PC - wie schauts aus mit Mainboard, Southbridge, Northbridge oder dem RAM? Ist das da auch nicht moeglich?

NetSpider

_________________
Wer in die Fußstapfen anderer tritt hinterlässt keine eigenen Spuren!
MrSaint
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1033
Erhaltene Danke: 1

WinXP Pro SP2
Delphi 6 Prof.
BeitragVerfasst: Di 05.06.07 16:10 
So, hab jetzt nochmal was wegen der Seriennummer. Habe festgestellt, dass die bei meiner CPU auch disabled ist :shock: naja, auf jeden Fall sollte der Code tun:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
type
  TPSN = record
    h,
    m,
    l     : Cardinal;
  end;

function PSNAvailable: boolean;
var
  edx_out   : Cardinal;
begin
  asm
    mov   eax, 1
    cpuid
    mov   edx_out, edx
  end;
  // Test auf Bit #18 -> PSN Bit
  Result := (edx_out and $40000) <> 0;
end;

function GetPSN: TPSN; register;
begin
  Result.h := 0;
  Result.m := 0;
  Result.l := 0;
  asm
    PUSH    EBX       {Save affected register}
    PUSH    EDI
    MOV     EDI,EAX   {@Resukt}
    MOV     EAX,1
    DW      $A20F     {CPUID Command}
    STOSD             {CPUID[1]}
    MOV     EAX, 3
    DW      $A20F
    MOV     EAX, EDX
    STOSD
    MOV     EAX,ECX
    STOSD
    POP     EDI       {Restore registers}
    POP     EBX
  end;
end;

function PSNToString(p: TPSN): string;
begin
  Result := IntToStr(p.h) + '-' + IntTostr(p.m) + '-' + IntToStr(p.l);
end;


Habe unter www.codeproject.com/system/PIIISN.asp gefunden, dass die "CPU-Seriennummer" sich wohl aus "Processor-signature-Bits" (EAX = 1) und "Seriennummer" (EAX = 3) berechnet.... Hab das nun mal gemahct. Inklusive Funktion, die überprüft, ob die CPU überhaupt eine Seriennummer hat oder ob nur Schrott raus kommt.... Ich weiß jetzt nicht wie's mit Multicores ist, hab sowas nicht und kann deshalb nix probieren...


Zu Silas' Version: Es ist halt so, dass es möglich wäre (keine Ahnung ob das gemacht wird, wäre aber durhcaus möglich) zwei CPUs zu fertigen, die die gleiche Taktfrequenz haben, aber eine andere "brand ID" haben (das mit dem µm). Dann wäre der String von Silas bei beiden CPUs identisch, die erste Version hätte aber unterschiedliche Werte..


Eine eindeutige Hardware-ID ist sowieso immer etwas problematisch, da der User ja auch einfach genau dieses Hardware-Teil ausbauen kann und ein neues einsetzen kann. Besser ist da ein Wert über viele Hardware-Teile zu machen, bei dem man dann rausrechnen kann, wieviele Teile sich geändert haben. Wenn sich dann > 3 Teile geändet haben nimmt man z.B. an, dass es nicht der gleiche Rechner ist. So macht das ja Windows mit seiner Aktivierung etc. Keine Ahnung wie die das aber genau berechnen, ist mit Sicherheit nicht ganz trivial.



MrSaint

_________________
"people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems
Kroko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1284

W98 W2k WXP
Turbo D
BeitragVerfasst: Di 05.06.07 16:13 
user profile iconMrSaint hat folgendes geschrieben:
...
Eine eindeutige Hardware-ID ist sowieso immer etwas problematisch, da der User ja auch einfach genau dieses Hardware-Teil ausbauen kann und ein neues einsetzen kann. Besser ist da ein Wert über viele Hardware-Teile zu machen, bei dem man dann rausrechnen kann, wieviele Teile sich geändert haben. Wenn sich dann > 3 Teile geändet haben nimmt man z.B. an, dass es nicht der gleiche Rechner ist. So macht das ja Windows mit seiner Aktivierung etc. Keine Ahnung wie die das aber genau berechnen, ist mit Sicherheit nicht ganz trivial.



MrSaint

erzähle das mal MS: ich habe nur den Speicher aufgestockt und schon mußte ich mein WinDoofs neu identifizieren lassen :cry:

_________________
Die F1-Taste steht nicht unter Naturschutz und darf somit regelmäßig und oft benutzt werden! oder Wer lesen kann, ist klar im Vorteil!