Automagically select computer type (UP/MP) during first stage setup Modified: trunk/reactos/bootdata/txtsetup.sif Modified: trunk/reactos/subsys/system/usetup/settings.c _____
Modified: trunk/reactos/bootdata/txtsetup.sif --- trunk/reactos/bootdata/txtsetup.sif 2005-09-19 07:35:31 UTC (rev 17928) +++ trunk/reactos/bootdata/txtsetup.sif 2005-09-19 08:11:43 UTC (rev 17929) @@ -52,6 +52,11 @@
pci_up = "Standard-PC" pci_mp = "Standard-PC Multiprocessor"
+[Map.Computer] +;<id> = <pnp id string> +pci_up = "PC UP" +pci_mp = "PC MP" + [Files.pci_up] ; <filename> = <directory_id>,<new name> hal.dll = 2 _____
Modified: trunk/reactos/subsys/system/usetup/settings.c --- trunk/reactos/subsys/system/usetup/settings.c 2005-09-19 07:35:31 UTC (rev 17928) +++ trunk/reactos/subsys/system/usetup/settings.c 2005-09-19 08:11:43 UTC (rev 17929) @@ -16,8 +16,7 @@
* along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id$ - * COPYRIGHT: See COPYING in the top level directory +/* COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS text-mode setup * FILE: subsys/system/usetup/settings.c * PURPOSE: Device settings support functions @@ -33,6 +32,90 @@
/* FUNCTIONS ****************************************************************/
+static BOOLEAN +GetComputerIdentifier(PWSTR Identifier, + ULONG IdentifierLength) +{ + OBJECT_ATTRIBUTES ObjectAttributes; + UNICODE_STRING KeyName; + LPCWSTR ComputerIdentifier; + HANDLE ProcessorsKey; + PKEY_FULL_INFORMATION pFullInfo; + ULONG Size, SizeNeeded; + NTSTATUS Status; + + DPRINT("GetComputerIdentifier() called\n"); + + Size = sizeof(KEY_FULL_INFORMATION); + pFullInfo = (PKEY_FULL_INFORMATION)RtlAllocateHeap(RtlGetProcessHeap(), 0, Size); + if (!pFullInfo) + { + DPRINT("RtlAllocateHeap() failed\n"); + return FALSE; + } + + /* Open the processors key */ + RtlInitUnicodeString(&KeyName, + L"\Registry\Machine\HARDWARE\DESCRIPTION\System\CentralProcessor") ; + InitializeObjectAttributes(&ObjectAttributes, + &KeyName, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + Status = NtOpenKey(&ProcessorsKey, + KEY_QUERY_VALUE , + &ObjectAttributes); + if (!NT_SUCCESS(Status)) + { + DPRINT("NtOpenKey() failed (Status 0x%lx)\n", Status); + RtlFreeHeap(RtlGetProcessHeap(), 0, pFullInfo); + return FALSE; + } + + /* Get number of subkeys */ + Status = NtQueryKey( + ProcessorsKey, + KeyFullInformation, + pFullInfo, + Size, + &Size); + NtClose(ProcessorsKey); + if (!NT_SUCCESS(Status) && Status != STATUS_BUFFER_OVERFLOW) + { + DPRINT("NtQueryKey() failed (Status 0x%lx)\n", Status); + RtlFreeHeap(RtlGetProcessHeap(), 0, pFullInfo); + return FALSE; + } + + /* Find computer identifier */ + if (pFullInfo->SubKeys == 0) + { + /* Something strange happened. No processor detected */ + RtlFreeHeap(RtlGetProcessHeap(), 0, pFullInfo); + return FALSE; + } + + if (pFullInfo->SubKeys == 1) + { + /* Computer is mono-CPU */ + ComputerIdentifier = L"PC UP"; + } + else + { + /* Computer is multi-CPUs */ + ComputerIdentifier = L"PC MP"; + } + RtlFreeHeap(RtlGetProcessHeap(), 0, pFullInfo); + + /* Copy computer identifier to return buffer */ + SizeNeeded = (wcslen(ComputerIdentifier) + 1) * sizeof(WCHAR); + if (SizeNeeded > IdentifierLength) + return FALSE; + RtlCopyMemory(Identifier, ComputerIdentifier, SizeNeeded); + return TRUE; +} + + PGENERIC_LIST CreateComputerTypeList(HINF InfFile) { @@ -42,7 +125,49 @@ PWCHAR KeyName; PWCHAR KeyValue; PWCHAR UserData; + WCHAR ComputerIdentifier[128]; + WCHAR ComputerKey[32];
+ /* Get the computer identification */ + if (!GetComputerIdentifier(ComputerIdentifier, 128)) + { + ComputerIdentifier[0] = 0; + } + + DPRINT("Computer identifier: '%S'\n", ComputerIdentifier); + + /* Search for matching device identifier */ + if (!InfFindFirstLine(InfFile, L"Map.Computer", NULL, &Context)) + { + /* FIXME: error message */ + return NULL; + } + + do + { + if (!InfGetDataField(&Context, 1, &KeyValue)) + { + /* FIXME: Handle error! */ + DPRINT("InfGetDataField() failed\n"); + return NULL; + } + + DPRINT("KeyValue: %S\n", KeyValue); + if (wcsstr(ComputerIdentifier, KeyValue)) + { + if (!InfGetDataField(&Context, 0, &KeyName)) + { + /* FIXME: Handle error! */ + DPRINT("InfGetDataField() failed\n"); + return NULL; + } + + DPRINT("Computer key: %S\n", KeyName); + wcscpy(ComputerKey, KeyName); + } + } + while (InfFindNextLine(&Context, &Context)); + List = CreateGenericList(); if (List == NULL) return NULL; @@ -73,7 +198,8 @@ wcscpy(UserData, KeyName);
sprintf(Buffer, "%S", KeyValue); - AppendGenericListEntry(List, Buffer, UserData, FALSE); + AppendGenericListEntry(List, Buffer, UserData, + _wcsicmp(KeyName, ComputerKey) ? FALSE : TRUE); } while (InfFindNextLine(&Context, &Context));