Author: ion
Date: Thu May 10 23:06:52 2007
New Revision: 26681
URL:
http://svn.reactos.org/svn/reactos?rev=26681&view=rev
Log:
- CmpInitializeMachineDependentConfiguration: Add Processor Name and Vendor ID as well
(the former doesnt' work on QEMU because QEMU desn't support CPUID-EX, but on
VMWare, I get: Dual Core AMD Opteron(tm) Processor 185.
Modified:
trunk/reactos/ntoskrnl/config/i386/cmhardwr.c
Modified: trunk/reactos/ntoskrnl/config/i386/cmhardwr.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/config/i386/cmhar…
==============================================================================
--- trunk/reactos/ntoskrnl/config/i386/cmhardwr.c (original)
+++ trunk/reactos/ntoskrnl/config/i386/cmhardwr.c Thu May 10 23:06:52 2007
@@ -24,7 +24,7 @@
NTAPI
CmpInitializeMachineDependentConfiguration(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
{
- UNICODE_STRING KeyName, ValueName;
+ UNICODE_STRING KeyName, ValueName, Data;
OBJECT_ATTRIBUTES ObjectAttributes;
ULONG HavePae;
NTSTATUS Status;
@@ -32,9 +32,12 @@
ULONG Disposition;
CONFIGURATION_COMPONENT_DATA ConfigData;
CHAR Buffer[128];
- ULONG i;
+ ULONG i, ExtendedId, Dummy;
PKPRCB Prcb;
USHORT IndexTable[MaximumType + 1] = {0};
+ ANSI_STRING TempString;
+ PCHAR PartialString = NULL;
+ CHAR CpuString[48];
/* Open the SMSS Memory Management key */
RtlInitUnicodeString(&KeyName,
@@ -198,6 +201,81 @@
/* Close this new handle */
NtClose(FpuHandle);
+ /* Stay on this CPU only */
+ KeSetSystemAffinityThread(Prcb->SetMember);
+ if (!Prcb->CpuID)
+ {
+ /* Uh oh, no CPUID! */
+ }
+ else
+ {
+ /* Check if we have extended CPUID that supports name ID */
+ Ki386Cpuid(0x80000000, &ExtendedId, &Dummy, &Dummy,
&Dummy);
+ if (ExtendedId >= 0x80000004)
+ {
+ /* Do all the CPUIDs requred to get the full name */
+ PartialString = CpuString;
+ for (ExtendedId = 2; ExtendedId <= 4; ExtendedId++)
+ {
+ /* Do the CPUID and save the name string */
+ Ki386Cpuid(0x80000000 | ExtendedId,
+ (PULONG)PartialString,
+ (PULONG)PartialString + 1,
+ (PULONG)PartialString + 2,
+ (PULONG)PartialString + 3);
+
+ /* Go to the next name string */
+ PartialString += 16;
+ }
+
+ /* Null-terminate it */
+ CpuString[48] = ANSI_NULL;
+ }
+ }
+
+ /* Go back to user affinity */
+ KeRevertToUserAffinityThread();
+
+ /* Check if we have a CPU Name */
+ if (PartialString)
+ {
+ /* Convert it to Unicode */
+ RtlInitAnsiString(&TempString, CpuString);
+ RtlAnsiStringToUnicodeString(&Data, &TempString, TRUE);
+
+ /* Add it to the registry */
+ RtlInitUnicodeString(&ValueName,
L"ProcessorNameString");
+ Status = NtSetValueKey(KeyHandle,
+ &ValueName,
+ 0,
+ REG_SZ,
+ Data.Buffer,
+ Data.Length + sizeof(UNICODE_NULL));
+
+ /* Free the temporary buffer */
+ RtlFreeUnicodeString(&Data);
+ }
+
+ /* Check if we had a Vendor ID */
+ if (Prcb->VendorString)
+ {
+ /* Convert it to Unicode */
+ RtlInitAnsiString(&TempString, Prcb->VendorString);
+ RtlAnsiStringToUnicodeString(&Data, &TempString, TRUE);
+
+ /* Add it to the registry */
+ RtlInitUnicodeString(&ValueName, L"VendorIdentifier");
+ Status = NtSetValueKey(KeyHandle,
+ &ValueName,
+ 0,
+ REG_SZ,
+ Data.Buffer,
+ Data.Length + sizeof(UNICODE_NULL));
+
+ /* Free the temporary buffer */
+ RtlFreeUnicodeString(&Data);
+ }
+
/* Check if we have features bits */
if (Prcb->FeatureBits)
{