Seite 1 von 1

(gelöst)[x86] CPU Brand String ASCII oder ANSI?

Verfasst: 09.03.2011, 03:40
von Krishty
Hi,

Ist der CPU Brand String – also das, was CPUID für 0x80000002 bis 0x80000004 zurückgibt – ASCII oder ANSI? Ich finde überall widersprüchliche Angaben :/

Gruß, Ky

Nachtrag: Ich halte mich einfach mal an Intels Spezifikation, und die sagt: ASCII. Wer mal den CPU-Namen herausfinden muss (Achtung, Visual C++-exklusiv):

Code: Alles auswählen

#include <intrin.h> // '__cpuid' intrinsic

typedef int CSignedInteger4Bytes;
typedef unsigned int CUnsignedInteger4Bytes;
typedef char CASCIICharacter;
#include <string>
typedef ::std::string CASCIIString;

//--------------------------------------------------------------------------------------------------------------------------
// Returns the current CPU's brand string (e.g. "Intel(R) Core(TM) i7 CPU         860  @ 2.80GHz").
// If the CPU doesn't support this feature (< Pentium IV), "unknown" is returned.
//--------------------------------------------------------------------------------------------------------------------------
CASCIIString CPUBrand() {
	// This function uses the 'CPUID' instruction via intrinsic to retrieve the CPU's built-in brand string.
	// For the '__cpuid' intrinsic and an explanation of its parameters, see http://msdn.microsoft.com/library/hskdteyh.

	// First, it is determined whether the CPU supports extended CPUID functions by checking if 0x80000000 returns a higher
	//	value in EAX. If it does, the values 0x80000002 through 0x80000004 can be used to retrieve the brand string[1].
	CSignedInteger4Bytes eaxEbxEcxEdx[4];
	__cpuid(eaxEbxEcxEdx, 0x80000000);
	// consider: '__cpuid' expects signed 4-byte values, but 0x80000000 is unsigned
	if(0x80000000u < CUnsignedInteger4Bytes(eaxEbxEcxEdx[0])) {

		// The brand string itself is an ASCII string with a maximum length of 47 characters; with 4 characters stored in
		//	EAX, EBX, ECX and EDX each, for three CPUID calls[2].
		union {
			CASCIICharacter			characters[48];
			CSignedInteger4Bytes	registers[4 * 3];
		} processorBrandString;

		__cpuid(processorBrandString.registers    , 0x80000002);
		__cpuid(processorBrandString.registers + 4, 0x80000003);
		__cpuid(processorBrandString.registers + 8, 0x80000004);

		return CASCIIString(processorBrandString.characters);
	} else
		return CASCIIString("unknown");

	// [1] "Intel® Processor Identification and the CPUID Instruction", May 2002, Order Number: 241618-021, pg. 21:
	//		"To determine if the brand string is supported on a processor, software must follow the step below:
	//			1. Execute the CPUID instruction with EAX=80000000h
	//			2. If ((returned value in EAX) > 80000000h) then the processor supports the extended CPUID functions and EAX
	//				contains the largest extended function supported.
	//			3. The processor brand string feature is supported if EAX > 80000000"
	// [2] "Intel® Processor Identification and the CPUID Instruction", May 2002, Order Number: 241618-021, pg. 21:
	//		"The brand/frequency string is defined to be 48 characters long, 47 bytes will contain characters and the 48th
	//		byte is defined to be NULL (0). A processor may return less than the 47 ASCII characters as long as the string
	//		is null terminated and the processor returns valid data when CPUID is executed with EAX = 80000002h, 80000003h
	//		and 80000004h."
}

Re: (gelöst)[x86] CPU Brand String ASCII oder ANSI?

Verfasst: 09.03.2011, 11:42
von joggel
Hach Ky,

schön das Du dir selber helfen kannst...
Warum bewegst Du dich auch immer in Spheren, die kaum ein Mensch zuvor betreten hat??!!
Und vorallem in was für Zeiten... 3:40 !!
Vlt. sollte sich ZFX über mehrere Zeitzonen etablieren, damit die Channce höher ist um solche Zeiten Antworten zu bekommen.

Re: (gelöst)[x86] CPU Brand String ASCII oder ANSI?

Verfasst: 09.03.2011, 11:54
von Krishty
joggel hat geschrieben:Warum bewegst Du dich auch immer in Spheren, die kaum ein Mensch zuvor betreten hat??!!
Ach komm, selbst Wikipedia hat Beispielquelltext dafür – wenn auch in Assembler. Ich nehme es wohl nur ein bisschen genauer als die Deppen, die sowas dokumentieren und dabei ASCII mit ANSI durcheinanderschmeißen und es damit allen schwermachen, die keine ANSI-Strings in ihrem Framework haben.
joggel hat geschrieben:Und vorallem in was für Zeiten... 3:40 !!
Naja … vllt saß ich da ja in Lakefront, Chicago; hatte 20:40 CST und konnte dank ekligstem Nieselregen nichts anderes machen als zu trinken und zu programmieren? ;)

Re: (gelöst)[x86] CPU Brand String ASCII oder ANSI?

Verfasst: 09.03.2011, 12:45
von joggel
Nur eine Frage...
Wozu brauchst du das?
Und auf der verlinkten Wikipedia-Seite steht doch, dass der String als ASCII zurückgegeben wird...

Gruß

Re: (gelöst)[x86] CPU Brand String ASCII oder ANSI?

Verfasst: 09.03.2011, 13:02
von kimmi
Und was machst du in Chicago?

Gruß Kimmi

Re: (gelöst)[x86] CPU Brand String ASCII oder ANSI?

Verfasst: 09.03.2011, 13:08
von Krishty
joggel hat geschrieben:Wozu brauchst du das?
CPU des Zielsystems einigermaßen identifizieren
joggel hat geschrieben:Und auf der verlinkten Wikipedia-Seite steht doch, dass der String als ASCII zurückgegeben wird...
Ja, aber
  1. ist Wikipedia nicht meine erste Anlaufstelle, wenn ich Mnemonics nachschlage
  2. nennt die MSDN das String-Format nicht (und der Beispieltext nutzt auch die falsche Länge von 64 Zeichen)
  3. bin ich auf der Suche danach erst woanders gelandet, wo von ANSI die Rede war
  4. gibt der Wikipedia-Artikel keine Quelle für seine ASCII-Behauptung an (was ihn genau so unzuverlässig macht wie alle anderen Suchergebnisse auch; das werde ich aber nun korrigieren)
Kurz: Da draußen kann man niemandem trauen, außer eben den Wegweisern der Hersteller :)
Chromanoid hat geschrieben:Der Herr hat gescherzt ^^
:)

Re: (gelöst)[x86] CPU Brand String ASCII oder ANSI?

Verfasst: 09.03.2011, 13:14
von Chromanoid
Krishty hat geschrieben:
Chromanoid hat geschrieben:Der Herr hat gescherzt ^^
:)
hehehe da hatte ich meinen post auch schon wieder gelöscht... wollte dir nicht die gelegenheit nehmen eine interessante geschichte aufzutischen ^^

Re: (gelöst)[x86] CPU Brand String ASCII oder ANSI?

Verfasst: 09.03.2011, 13:20
von joggel
Krishty hat geschrieben: CPU des Zielsystems einigermaßen identifizieren
Ich frage jetzt mal nicht weiter, was Du genau vorhast..
gibt der Wikipedia-Artikel keine Quelle für seine ASCII-Behauptung an (was ihn genau so unzuverlässig macht wie alle anderen Suchergebnisse auch; das werde ich aber nun korrigieren)
Jo, finde ich toll, das Du das korrigieren willst.
Aber, wieso wettern so viele gegen Wikipedia.
Ich verstehe das nicht. Wikipedia hat mir schon oft aus der Patsche geholfen!
Klar, um jetzt tiefer in eine bestimmte Materie nachzuforschen, ist Wikipedia nicht geeignet, aber vermittelt einen schon einen groben Überblick!

Re: (gelöst)[x86] CPU Brand String ASCII oder ANSI?

Verfasst: 09.03.2011, 13:26
von Krishty
Ich wettere ja garnicht dagegen – ich traue ihr einfach weder mehr noch weniger als anderen Seiten. Und da es auf allen anderen nach purer Willkür aussah, ob der Befehl ASCII oder ANSI liefert, und Wikipedia keine Quelle dafür angegeben hat, habe ich ihr in diesem Fall eben nicht getraut.

Ich merke btw auch gerade, dass ich echt beschissen in sowas bin … hatte direkt einen falschen Link reingehauen und weiß nicht, wie man an Diskussionen teilnimmt. Na, dann müssen die eben ohne mich auskommen.

Re: (gelöst)[x86] CPU Brand String ASCII oder ANSI?

Verfasst: 09.03.2011, 13:31
von joggel
Nee, ich meine ja nicht dich damit...
Meinte ich nur mal so allgemein!

Re: (gelöst)[x86] CPU Brand String ASCII oder ANSI?

Verfasst: 09.03.2011, 14:11
von Aramis
CPU des Zielsystems einigermaßen identifizieren
Womit die Frage nach der Zeichenkodierung ad absurdum gefuehrt wurd. Identifikation des Zielsystems setzt ja Kenntnis des entsprechenden Brand-Strings eines Herstellers voraus, ergo auch Kenntnis des verwendeten Zeichensatzes beziehungsweise des kleinsten Zeichensatzes, der in der Lage ist, den Brand-String abzubilden. Bei GenuineIntel und AuthenticAmd zudem ein ziemlich eindeutiges ASCII ;-)

Wolltest du also deinem Ideal getreu bleiben, waere das vielleicht der richtige Punkt um einen UnspecifiedByteString-Datentyp einzufuehren. Wenn du die damit zu vergleichenden Brand-Strings in demselben Typ vorhaelst, hast du Perfektion erreicht. So ist es nur unnuetzer Schrott. Auf, ab ans Reissbrett.

Re: (gelöst)[x86] CPU Brand String ASCII oder ANSI?

Verfasst: 09.03.2011, 14:22
von Krishty
Aramis hat geschrieben:
CPU des Zielsystems einigermaßen identifizieren
Womit die Frage nach der Zeichenkodierung ad absurdum gefuehrt wurd. Identifikation des Zielsystems setzt ja Kenntnis des entsprechenden Brand-Strings eines Herstellers voraus, ergo auch Kenntnis des verwendeten Zeichensatzes beziehungsweise des kleinsten Zeichensatzes, der in der Lage ist, den Brand-String abzubilden. Bei GenuineIntel und AuthenticAmd zudem ein ziemlich eindeutiges ASCII ;-)
Entschuldige; „identifizieren“ ist zu verschwommen – „Namen der CPU in die Log-Datei schreiben“ kommt da schon eher dran. Das Programm selber vergleicht keine bekannten Strings und kennt sie auch nicht; allerdings müsste ich alles, was nicht ASCII und UTF-8 ist, vorbehandeln, weil es es sonst nicht in die Log-Datei schaffen würde. (Man darf Features und alles weitere, wofür man eine CPU identifizieren wollen sollte, ja garnicht über den Namen bestimmen, sondern nur über entsprechende Flags.)
Aramis hat geschrieben:Wolltest du also deinem Ideal getreu bleiben, waere das vielleicht der richtige Punkt um einen UnspecifiedByteString-Datentyp einzufuehren. Wenn du die damit zu vergleichenden Brand-Strings in demselben Typ vorhaelst, hast du Perfektion erreicht. So ist es nur unnuetzer Schrott. Auf, ab ans Reissbrett.
Cric::IMemory, landläufig auch Binary Large Object genannt :)

Re: (gelöst)[x86] CPU Brand String ASCII oder ANSI?

Verfasst: 09.03.2011, 14:27
von Aramis
Moment, es gibt einen semantischen Unterschied zwischen einem Text-String mit unspezifiziertem Encoding und einem Blob :-) Ist ja wie als ob du eine 100 Tonnen schwere sowjetische Rakete unbekannter Bauart pauschal unter 'Schrott' einstufen wuerdest.

Re: (gelöst)[x86] CPU Brand String ASCII oder ANSI?

Verfasst: 09.03.2011, 14:32
von Krishty
Aramis hat geschrieben:Moment, es gibt einen semantischen Unterschied zwischen einem Text-String mit unspezifiziertem Encoding und einem Blob :-)
Da fiele mir nichts außer dem Nullmarker ein, aber Pascal-artige Strings rocken eh viel mehr!

Re: (gelöst)[x86] CPU Brand String ASCII oder ANSI?

Verfasst: 09.03.2011, 16:34
von eXile
Mal was anderes aus dem ersten Post:

Code: Alles auswählen

<!-- m --><a class="postlink" href="http://msdn.microsoft.com/library/hskdteyh">http://msdn.microsoft.com/library/hskdteyh</a><!-- m -->.
Liegt das an der Forensoftware, oder weil Krishty das so aus Visual Studio (eventuell mit weiteren Add-Ins) kopiert hat?

Re: (gelöst)[x86] CPU Brand String ASCII oder ANSI?

Verfasst: 09.03.2011, 16:35
von Krishty
Forensoftware

Genau wie das irreversible Aufblähen von Tabs auf acht Leerzeichen