Autor Beitrag
Taktaky
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25



BeitragVerfasst: Fr 24.08.07 20:10 
Hallo

Die Frage: Warum zeigt der Code die CPU-ID so geteilt?
Ich habe einen anderes Programm zeigt die CPU ID wie folgt :
68C387F9FF

der Code Oben zeigt aber die ID geteilt so :

CPUID[1] = 0000068A
CPUID[2] = 00000002
CPUID[3] = 00000000
CPUID[4] = 0387F9FF
PValue = 0
FValue = 6
MValue = 8
SValue = 10
Vendor: GenuineIntel

wie und wo muss ich den Code ändern, damit das Ergebnis bekomme: 68C387F9FF
Ich meine wie addiere ich sie?

Der Code :
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:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
const
ID_BIT = $200000// EFLAGS ID bit
type
TCPUID = array[1..4of Longint;
TVendor = array [0..11of char;

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;

function GetCPUVendor : TVendor; assemblerregister;
asm
PUSH EBX {Save affected register}
PUSH EDI
MOV EDI,EAX {@Result (TVendor)}
MOV EAX,0
DW $A20F {CPUID Command}
MOV EAX,EBX
XCHG EBX,ECX {save ECX result}
MOV ECX,4
@1:
STOSB
SHR EAX,8
LOOP @1
MOV EAX,EDX
MOV ECX,4
@2:
STOSB
SHR EAX,8
LOOP @2
MOV EAX,EBX
MOV ECX,4
@3:
STOSB
SHR EAX,8
LOOP @3
POP EDI {Restore registers}
POP EBX
end;


procedure TForm1.Button1Click(Sender: TObject);
var
CPUID : TCPUID;
I : Integer;
S : TVendor;
begin
for I := Low(CPUID) to High(CPUID) do CPUID[I] := -1;
if IsCPUID_Available then begin
CPUID := GetCPUID;
Memo1.Lines.Add('CPUID[1] = ' + IntToHex(CPUID[1],8));
Memo1.Lines.Add('CPUID[2] = ' + IntToHex(CPUID[2],8));
Memo1.Lines.Add('CPUID[3] = ' + IntToHex(CPUID[3],8));
Memo1.Lines.Add( 'CPUID[4] = ' + IntToHex(CPUID[4],8));
Memo1.Lines.Add('PValue = '+ IntToStr(CPUID[1shr 12 and 3));
Memo1.Lines.Add( 'FValue = '+IntToStr(CPUID[1shr 8 and $f));
Memo1.Lines.Add( 'MValue = '+IntToStr(CPUID[1shr 4 and $f));
Memo1.Lines.Add( 'SValue = '+IntToStr(CPUID[1and $f));
S := GetCPUVendor;
Memo1.Lines.Add( 'Vendor: ' + S); end
else begin
Memo1.Lines.Add( 'CPUID not available');
end;
end;


Zuletzt bearbeitet von Taktaky am Sa 25.08.07 00:16, insgesamt 1-mal bearbeitet
Taktaky Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25



BeitragVerfasst: Fr 24.08.07 21:24 
Hi

Es funktioniert

Ich bekomme die erste Nummer "0" dies hat keine Bedeutung für mich und möchte gerne weglassen!

ausblenden Delphi-Quelltext
1:
Edit1.Text:=(IntToHex((CPUID[1] + CPUID[2]),8) +IntToHex((CPUID[3]) + (CPUID[4]),8));					


das Ergebnis ist leider nicht 100% wie ich wollte !
ich bekomme 0000068C0387F9FF statt 68C387F9FF !!!

Wo liegt das Problem ?
ich bekomme 5 die "0" vorne und "0" nach C ?

Gruß
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Sa 25.08.07 00:26 
Ich vermute, du willst die Nullen am Anfang der CPUID[x] weghaben, und zwar so, dass links von der ersten nicht-null keine nullen mehr stehen, richtig? dann versuch's mal so:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
    For i := 1 To 4 Do
    Begin
        While x[i][1] = '0' Do
            Delete(x[i], 11);
        Memo1.Lines.Add(x[i]);
    End;

Hierbei ist x ein Array[1..4] of String, i ein integer.

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
Taktaky Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25



BeitragVerfasst: Sa 25.08.07 00:50 
Hi

ich habe den Teil wahrscheinlich in den falschen Bereich hinzugefügt, da ich Error bekomme

Bitte wo soll der Teil sein In Code?

Oben habe ich den Code 1 zu 1 hingeschrieben

Danke!

Gruß
Kroko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1284

W98 W2k WXP
Turbo D
BeitragVerfasst: Sa 25.08.07 16:05 
Ich meine mal, dass dein anderes Programm die CPU-ID falsch anzeigt, denn die Nullen gehören dort schon hin!

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



BeitragVerfasst: Sa 25.08.07 16:56 
user profile iconKroko hat folgendes geschrieben:
Ich meine mal, dass dein anderes Programm die CPU-ID falsch anzeigt, denn die Nullen gehören dort schon hin!


Ich verstehe leider Deine Antwort nicht !

Gruß
Kroko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1284

W98 W2k WXP
Turbo D
BeitragVerfasst: Sa 25.08.07 19:32 
Du liest doch 4 LongInt-Werte aus(eigentlich sollten es Cardinal sein), dass sind 32-Bit und da kann man ja nicht einfach ein paar weglassen, nur weil sie Null sind,

sonst schau mal hier !

Allerdings solltest Du auch vorher testen, ob die ID enabled ist, sonst steht dort nur ...(teste ich im Link leider auch nicht ab), einfachmal hier suchen, dazu gab es schon ein paar Threads.

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

Win7, Win81, Win10
Tokyo, VS2017
BeitragVerfasst: Mo 27.08.07 11:26 
Für mich sieht das aus, als wäre diese (IMHO völlig wertlose) CPUID wie folgt zustandegekommen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
var
  x,y: Cardinal;
  s: string;
begin
  X := CPUID[1] + CPUID[2];
  Y := CPUID[3] + CPUID[4];
  s := IntToHex(X,8) + IntToHex(Y,8);
  s := StringReplace(s,'0','',[rfReplaceAll]);
end;


Habs nicht konkret ausprobiert...

_________________
Lies, was da steht. Denk dann drüber nach. Dann erst fragen.