From 9f40202dfc2abb32cf1e1b7e3978cecca574c00e Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Sun, 1 Oct 2006 18:27:59 +0000 Subject: [PATCH] - Add setupblk.h from TinyKRNL with all the definitions for NT's SETUPLDR structures (SETUP_LOADER_BLOCK and hardware configuration stuff). Update KiRosFrldrLpbToNtLpb to setup the Flags field of this block to "Text-Mode Setup Active" when we know that we're in ROS text mode. - Update ExpInitializeExecutive to check for a valid setup block and detect text-mode and network installation modes. Use ExpInTextModeSetup instead of SetupMode variable, to make detection compatible with NTLDR. svn path=/trunk/; revision=24347 --- reactos/include/reactos/arc/arc.h | 14 --- reactos/include/reactos/arc/setupblk.h | 152 +++++++++++++++++++++++++ reactos/ntoskrnl/ex/init.c | 32 +++++- reactos/ntoskrnl/include/ntoskrnl.h | 3 + reactos/ntoskrnl/io/iomgr/driver.c | 4 +- reactos/ntoskrnl/io/iomgr/drvrlist.c | 1 - reactos/ntoskrnl/ke/freeldr.c | 12 +- 7 files changed, 195 insertions(+), 23 deletions(-) create mode 100644 reactos/include/reactos/arc/setupblk.h diff --git a/reactos/include/reactos/arc/arc.h b/reactos/include/reactos/arc/arc.h index d373a64ac25..2393e3ee149 100644 --- a/reactos/include/reactos/arc/arc.h +++ b/reactos/include/reactos/arc/arc.h @@ -24,20 +24,6 @@ typedef enum _CONFIGURATION_CLASS MaximumClass } CONFIGURATION_CLASS; -typedef enum -{ - HwFileDriver, - HwFilePort, - HwFileClass, - HwFileInf, - HwFileDll, - HwFileDetect, - HwFileHal, - HwFileCatalog, - HwFileMax, - HwFileDynUpdt = 31, -} HwFileType; - typedef enum _TYPE_OF_MEMORY { LoaderExceptionBlock, diff --git a/reactos/include/reactos/arc/setupblk.h b/reactos/include/reactos/arc/setupblk.h new file mode 100644 index 00000000000..8bd8acaabbd --- /dev/null +++ b/reactos/include/reactos/arc/setupblk.h @@ -0,0 +1,152 @@ +#ifndef _SETUPBLK_ +#define _SETUPBLK_ + +// +// Type of file described in DETECTED_DEVICE_FILE +// +typedef enum +{ + HwFileDriver, + HwFilePort, + HwFileClass, + HwFileInf, + HwFileDll, + HwFileDetect, + HwFileHal, + HwFileCatalog, + HwFileMax, + HwFileDynUpdt = 31, +} HwFileType; + +// +// Hardware ID for the detected device +// +typedef struct _PNP_HARDWARE_ID +{ + struct _PNP_HARDWARE_ID *Next; + PCHAR Id; + PCHAR DriverName; + PCHAR ClassGuid; +} PNP_HARDWARE_ID, *PPNP_HARDWARE_ID; + +// +// Structures for detected device data (file/registry) +// +typedef struct _DETECTED_DEVICE_REGISTRY +{ + struct _DETECTED_DEVICE_REGISTRY *Next; + PCHAR KeyName; + PCHAR ValueName; + ULONG ValueType; + PVOID Buffer; + ULONG BufferSize; +} DETECTED_DEVICE_REGISTRY, *PDETECTED_DEVICE_REGISTRY; + +typedef struct _DETECTED_DEVICE_FILE +{ + struct _DETECTED_DEVICE_FILE *Next; + PCHAR FileName; + HwFileType FileType; + PCHAR ConfigName; + PDETECTED_DEVICE_REGISTRY RegistryValueList; + PCHAR DiskDescription; + PCHAR DiskTagfile; + PCHAR Directory; + PCHAR ArcDeviceName; +} DETECTED_DEVICE_FILE, *PDETECTED_DEVICE_FILE; + +// +// Structure for any detected device +// +typedef struct _DETECTED_DEVICE +{ + struct _DETECTED_DEVICE *Next; + PCHAR IdString; + ULONG Ordinal; + PCHAR Description; + BOOLEAN ThirdPartyOptionSelected; + ULONG FileTypeBits; + PDETECTED_DEVICE_FILE Files; + PCHAR BasedllName; + BOOLEAN MigratedDriver; + PPNP_HARDWARE_ID HardwareIds; +} DETECTED_DEVICE, *PDETECTED_DEVICE; + +typedef struct _DETECTED_OEM_SOURCE_DEVICE +{ + struct _DETECTED_OEM_SOURCE_DEVICE *Next; + PCHAR ArcDeviceName; + ULONG ImageBase; + ULONGLONG ImageSize; +} DETECTED_OEM_SOURCE_DEVICE, *PDETECTED_OEM_SOURCE_DEVICE; + +// +// Setup Loader Parameter Block +// +typedef struct _SETUP_LOADER_BLOCK_SCALARS +{ + ULONG SetupOperation; + union + { + struct + { + UCHAR SetupFromCdRom:1; + UCHAR LoadedScsi:1; + UCHAR LoadedFloppyDrivers:1; + UCHAR LoadedDiskDrivers:1; + UCHAR LoadedCdRomDrivers:1; + UCHAR LoadedFileSystems:1; + }; + ULONG AsULong; + }; +} SETUP_LOADER_BLOCK_SCALARS, *PSETUP_LOADER_BLOCK_SCALARS; + +typedef struct _SETUP_LOADER_BLOCK +{ + PCHAR ArcSetupDeviceName; + DETECTED_DEVICE VideoDevice; + PDETECTED_DEVICE KeyboardDevices; + DETECTED_DEVICE ComputerDevice; + PDETECTED_DEVICE ScsiDevices; + PDETECTED_OEM_SOURCE_DEVICE OemSourceDevices; + SETUP_LOADER_BLOCK_SCALARS ScalarValues; + PCHAR IniFile; + ULONG IniFileLength; + PCHAR WinntSifFile; + ULONG WinntSifFileLength; + PCHAR MigrateInfFile; + ULONG MigrateInfFileLength; + PCHAR UnsupDriversInfFile; + ULONG UnsupDriversInfFileLength; + PVOID BootFontFile; + ULONG BootFontFileLength; + MONITOR_CONFIGURATION_DATA Monitor; + PCHAR MonitorId; + PDETECTED_DEVICE BootBusExtenders; + PDETECTED_DEVICE BusExtenders; + PDETECTED_DEVICE InputDevicesSupport; + PPNP_HARDWARE_ID HardwareIdDatabase; + WCHAR ComputerName[64]; + ULONG IpAddress; + ULONG SubnetMask; + ULONG ServerIpAddress; + ULONG DefaultRouter; + ULONG DnsNameServer; + WCHAR NetbootCardHardwareId[64]; + WCHAR NetbootCardDriverName[24]; + WCHAR NetbootCardServiceName[24]; + PCHAR NetbootCardRegistry; + ULONG NetbootCardRegistryLength; + PCHAR NetbootCardInfo; + ULONG NetbootCardInfoLength; + ULONG Flags; + PCHAR MachineDirectoryPath; + PCHAR NetBootSifPath; + PVOID NetBootSecret; + CHAR NetBootIMirrorFilePath[26]; + PCHAR ASRPnPSifFile; + ULONG ASRPnPSifFileLength; + CHAR NetBootAdministratorPassword[64]; +} SETUP_LOADER_BLOCK, *PSETUP_LOADER_BLOCK; + +#endif diff --git a/reactos/ntoskrnl/ex/init.c b/reactos/ntoskrnl/ex/init.c index 04db2017e36..fb20ef51818 100644 --- a/reactos/ntoskrnl/ex/init.c +++ b/reactos/ntoskrnl/ex/init.c @@ -41,7 +41,6 @@ extern PRTL_MESSAGE_RESOURCE_DATA KiBugCodeMessages; BOOLEAN NoGuiBoot = FALSE; static BOOLEAN BootLog = FALSE; static ULONG MaxMem = 0; -BOOLEAN SetupMode = TRUE; static BOOLEAN ForceAcpiDisable = FALSE; BOOLEAN @@ -51,6 +50,8 @@ PspInitPhase0( ); ULONG ExpInitializationPhase; +BOOLEAN ExpInTextModeSetup; +BOOLEAN IoRemoteBootClient; /* FUNCTIONS ****************************************************************/ @@ -279,7 +280,6 @@ ParseAndCacheLoadedModules(VOID) } else if (!_stricmp(Name, "system") || !_stricmp(Name, "system.hiv")) { CachedModules[SystemRegistry] = &KeLoaderModules[i]; - SetupMode = FALSE; } else if (!_stricmp(Name, "hardware") || !_stricmp(Name, "hardware.hiv")) { @@ -361,7 +361,7 @@ ExpDisplayNotice(VOID) { CHAR str[50]; - if (SetupMode) + if (ExpInTextModeSetup) { HalDisplayString( "\n\n\n ReactOS " KERNEL_VERSION_STR " Setup \n"); @@ -534,6 +534,30 @@ ExpInitializeExecutive(IN ULONG Cpu, return; } + /* Assume no text-mode or remote boot */ + ExpInTextModeSetup = FALSE; + IoRemoteBootClient = FALSE; + + /* Check if we have a setup loader block */ + if (LoaderBlock->SetupLdrBlock) + { + /* Check if this is text-mode setup */ + if (LoaderBlock->SetupLdrBlock->Flags & 1) ExpInTextModeSetup = TRUE; + + /* Check if this is network boot */ + if (LoaderBlock->SetupLdrBlock->Flags & 2) + { + /* Set variable */ + IoRemoteBootClient = TRUE; + + /* Make sure we're actually booting off the network */ + ASSERT(!_memicmp(LoaderBlock->ArcBootDeviceName, "net(0)", 6)); + } + } + + /* Set phase to 0 */ + ExpInitializationPhase = 0; + /* Initialize HAL */ HalInitSystem (0, KeLoaderBlock); @@ -658,7 +682,7 @@ ExPhase2Init(PVOID Context) RtlpInitNls(); /* Import and Load Registry Hives */ - CmInitHives(SetupMode); + CmInitHives(ExpInTextModeSetup); /* Initialize VDM support */ KeI386VdmInitialize(); diff --git a/reactos/ntoskrnl/include/ntoskrnl.h b/reactos/ntoskrnl/include/ntoskrnl.h index 86b14e3e1eb..db7a7316cf6 100644 --- a/reactos/ntoskrnl/include/ntoskrnl.h +++ b/reactos/ntoskrnl/include/ntoskrnl.h @@ -44,6 +44,9 @@ #define ExRaiseStatus RtlRaiseStatus #include +/* SetupLDR Support */ +#include + /* PNP GUIDs */ #include diff --git a/reactos/ntoskrnl/io/iomgr/driver.c b/reactos/ntoskrnl/io/iomgr/driver.c index f09917fd37e..f5ca9fa23c1 100644 --- a/reactos/ntoskrnl/io/iomgr/driver.c +++ b/reactos/ntoskrnl/io/iomgr/driver.c @@ -29,7 +29,7 @@ UNICODE_STRING IopHardwareDatabaseKey = POBJECT_TYPE IoDriverObjectType = NULL; -extern BOOLEAN SetupMode; +extern BOOLEAN ExpInTextModeSetup; extern BOOLEAN NoGuiBoot; /* DECLARATIONS ***************************************************************/ @@ -311,7 +311,7 @@ IopDisplayLoadingMessage(PVOID ServiceName, BOOLEAN Unicode) { CHAR TextBuffer[256]; - if (SetupMode || !NoGuiBoot) return; + if (ExpInTextModeSetup || !NoGuiBoot) return; if (Unicode) { sprintf(TextBuffer, "Loading %S...\n", (PWCHAR)ServiceName); diff --git a/reactos/ntoskrnl/io/iomgr/drvrlist.c b/reactos/ntoskrnl/io/iomgr/drvrlist.c index 74c046ba648..d495ceae583 100644 --- a/reactos/ntoskrnl/io/iomgr/drvrlist.c +++ b/reactos/ntoskrnl/io/iomgr/drvrlist.c @@ -41,7 +41,6 @@ typedef struct _SERVICE LIST_ENTRY GroupListHead = {NULL, NULL}; LIST_ENTRY ServiceListHead = {NULL, NULL}; -extern BOOLEAN SetupMode; extern BOOLEAN NoGuiBoot; VOID diff --git a/reactos/ntoskrnl/ke/freeldr.c b/reactos/ntoskrnl/ke/freeldr.c index 8f44100da9f..ce8a0a41295 100644 --- a/reactos/ntoskrnl/ke/freeldr.c +++ b/reactos/ntoskrnl/ke/freeldr.c @@ -47,6 +47,7 @@ LDR_DATA_TABLE_ENTRY BldrModules[64]; MEMORY_ALLOCATION_DESCRIPTOR BldrMemoryDescriptors[64]; WCHAR BldrModuleStrings[64][260]; NLS_DATA_BLOCK BldrNlsDataBlock; +SETUP_LOADER_BLOCK BldrSetupBlock; /* FUNCTIONS *****************************************************************/ @@ -78,8 +79,8 @@ KiRosFrldrLpbToNtLpb(IN PROS_LOADER_PARAMETER_BLOCK RosLoaderBlock, /* Set the NLS Data block */ LoaderBlock->NlsData = &BldrNlsDataBlock; - /* Set an invalid pointer, but used as a flag (SetupBoot) */ - LoaderBlock->SetupLdrBlock = (PVOID)1; + /* Assume this is from FreeLDR's SetupLdr */ + LoaderBlock->SetupLdrBlock = &BldrSetupBlock; /* Setup the list heads */ InitializeListHead(&LoaderBlock->LoadOrderListHead); @@ -248,6 +249,13 @@ KiRosFrldrLpbToNtLpb(IN PROS_LOADER_PARAMETER_BLOCK RosLoaderBlock, LoaderBlock->Extension->Size = sizeof(LOADER_PARAMETER_EXTENSION); LoaderBlock->Extension->MajorVersion = 5; LoaderBlock->Extension->MinorVersion = 2; + + /* Now setup the setup block if we have one */ + if (LoaderBlock->SetupLdrBlock) + { + /* All we'll setup right now is the flag for text-mode setup */ + LoaderBlock->SetupLdrBlock->Flags = 1; + } } VOID