diff --git a/reactos/boot/freeldr/freeldr/arch/i386/hardware.c b/reactos/boot/freeldr/freeldr/arch/i386/hardware.c index a609304c3c2..2124ecc99a5 100644 --- a/reactos/boot/freeldr/freeldr/arch/i386/hardware.c +++ b/reactos/boot/freeldr/freeldr/arch/i386/hardware.c @@ -120,6 +120,9 @@ typedef struct _CM_PNP_BIOS_INSTALLATION_CHECK static WCHAR Hex[] = L"0123456789ABCDEF"; static unsigned int delay_count = 1; +extern ULONG reactos_disk_count; +extern ARC_DISK_SIGNATURE reactos_arc_disk_info[]; +extern char reactos_arc_strings[32][256]; /* FUNCTIONS ****************************************************************/ @@ -512,6 +515,7 @@ SetHarddiskIdentifier(FRLDRHKEY DiskKey, ULONG Checksum; ULONG Signature; WCHAR Identifier[20]; + CHAR ArcName[256]; LONG Error; /* Read the MBR */ @@ -536,6 +540,15 @@ SetHarddiskIdentifier(FRLDRHKEY DiskKey, Checksum = ~Checksum + 1; DbgPrint((DPRINT_HWDETECT, "Checksum: %x\n", Checksum)); + /* Fill out the ARC disk block */ + reactos_arc_disk_info[reactos_disk_count].Signature = Signature; + reactos_arc_disk_info[reactos_disk_count].CheckSum = Checksum; + sprintf(ArcName, "multi(0)disk(0)rdisk(%lu)", reactos_disk_count); + strcpy(reactos_arc_strings[reactos_disk_count], ArcName); + reactos_arc_disk_info[reactos_disk_count].ArcName = + reactos_arc_strings[reactos_disk_count]; + reactos_disk_count++; + /* Convert checksum and signature to identifier string */ Identifier[0] = Hex[(Checksum >> 28) & 0x0F]; Identifier[1] = Hex[(Checksum >> 24) & 0x0F]; diff --git a/reactos/boot/freeldr/freeldr/reactos/reactos.c b/reactos/boot/freeldr/freeldr/reactos/reactos.c index 15f0e90ffa4..2832a5b9db5 100644 --- a/reactos/boot/freeldr/freeldr/reactos/reactos.c +++ b/reactos/boot/freeldr/freeldr/reactos/reactos.c @@ -30,6 +30,9 @@ LOADER_MODULE reactos_modules[64]; // Array to hold boot module info loaded f char reactos_module_strings[64][256]; // Array to hold module names unsigned long reactos_memory_map_descriptor_size; memory_map_t reactos_memory_map[32]; // Memory map +ARC_DISK_SIGNATURE reactos_arc_disk_info[32]; // ARC Disk Information +char reactos_arc_strings[32][256]; +unsigned long reactos_disk_count = 0; static CHAR szLoadingMsg[] = "Loading ReactOS..."; @@ -605,6 +608,7 @@ LoadAndBootReactOS(PCSTR OperatingSystemName) LoaderBlock.CommandLine = (unsigned long)reactos_kernel_cmdline; LoaderBlock.ModsCount = 0; LoaderBlock.ModsAddr = (unsigned long)reactos_modules; + LoaderBlock.DrivesAddr = (unsigned long)reactos_arc_disk_info; LoaderBlock.MmapLength = (unsigned long)MachGetMemoryMap((PBIOS_MEMORY_MAP)(PVOID)&reactos_memory_map, 32) * sizeof(memory_map_t); if (LoaderBlock.MmapLength) { @@ -692,6 +696,7 @@ LoadAndBootReactOS(PCSTR OperatingSystemName) UiDrawProgressBarCenter(5, 100, szLoadingMsg); if (AcpiPresent) LoaderBlock.Flags |= MB_FLAGS_ACPI_TABLE; + LoaderBlock.DrivesCount = reactos_disk_count; UiDrawStatusText("Loading..."); diff --git a/reactos/ntoskrnl/ke/freeldr.c b/reactos/ntoskrnl/ke/freeldr.c index ccc1b36a36d..7d4d76637b9 100644 --- a/reactos/ntoskrnl/ke/freeldr.c +++ b/reactos/ntoskrnl/ke/freeldr.c @@ -18,6 +18,7 @@ LOADER_MODULE KeLoaderModules[64]; ULONG KeLoaderModuleCount; static CHAR KeLoaderModuleStrings[64][256]; +static ARC_DISK_SIGNATURE KeArcDiskInfo[32]; /* FreeLDR Memory Data */ ADDRESS_RANGE KeMemoryMap[64]; @@ -48,6 +49,9 @@ MEMORY_ALLOCATION_DESCRIPTOR BldrMemoryDescriptors[64]; WCHAR BldrModuleStrings[64][260]; NLS_DATA_BLOCK BldrNlsDataBlock; SETUP_LOADER_BLOCK BldrSetupBlock; +ARC_DISK_INFORMATION BldrArcDiskInfo; +CHAR BldrArcNames[32][256]; +ARC_DISK_SIGNATURE BldrDiskInfo[32]; /* FUNCTIONS *****************************************************************/ @@ -65,6 +69,7 @@ KiRosFrldrLpbToNtLpb(IN PROS_LOADER_PARAMETER_BLOCK RosLoaderBlock, PCHAR DriverName; PCHAR BootPath, HalPath; CHAR CommandLine[256]; + PARC_DISK_SIGNATURE RosDiskInfo, ArcDiskInfo; /* First get some kernel-loader globals */ AcpiTableDetected = (RosLoaderBlock->Flags & MB_FLAGS_ACPI_TABLE) ? TRUE : FALSE; @@ -79,6 +84,9 @@ KiRosFrldrLpbToNtLpb(IN PROS_LOADER_PARAMETER_BLOCK RosLoaderBlock, /* Set the NLS Data block */ LoaderBlock->NlsData = &BldrNlsDataBlock; + /* Set the ARC Data block */ + LoaderBlock->ArcDiskInformation = &BldrArcDiskInfo; + /* Assume this is from FreeLDR's SetupLdr */ LoaderBlock->SetupLdrBlock = &BldrSetupBlock; @@ -86,6 +94,7 @@ KiRosFrldrLpbToNtLpb(IN PROS_LOADER_PARAMETER_BLOCK RosLoaderBlock, InitializeListHead(&LoaderBlock->LoadOrderListHead); InitializeListHead(&LoaderBlock->MemoryDescriptorListHead); InitializeListHead(&LoaderBlock->BootDriverListHead); + InitializeListHead(&LoaderBlock->ArcDiskInformation->DiskSignatureListHead); /* Loop boot driver list */ for (i = 0; i < KeLoaderModuleCount; i++) @@ -285,6 +294,28 @@ KiRosFrldrLpbToNtLpb(IN PROS_LOADER_PARAMETER_BLOCK RosLoaderBlock, /* Parse it and change every slash to a space */ BootPath = LoaderBlock->LoadOptions; do {if (*BootPath == '/') *BootPath = ' ';} while (*BootPath++); + + /* Now let's loop ARC disk information */ + for (i = 0; i < RosLoaderBlock->DrivesCount; i++) + { + /* Get the ROS loader entry */ + RosDiskInfo = &KeArcDiskInfo[i]; + + /* Get the ARC structure */ + ArcDiskInfo = &BldrDiskInfo[i]; + + /* Copy the data over */ + ArcDiskInfo->Signature = RosDiskInfo->Signature; + ArcDiskInfo->CheckSum = RosDiskInfo->CheckSum; + + /* Copy the ARC Name */ + strcpy(BldrArcNames[i], RosDiskInfo->ArcName); + ArcDiskInfo->ArcName = BldrArcNames[i]; + + /* Insert into the list */ + InsertTailList(&LoaderBlock->ArcDiskInformation->DiskSignatureListHead, + &ArcDiskInfo->ListEntry); + } } VOID @@ -322,6 +353,10 @@ KiRosPrepareForSystemStartup(IN ULONG Dummy, (PVOID)KeRosLoaderBlock.ModsAddr, sizeof(LOADER_MODULE) * KeRosLoaderBlock.ModsCount); KeRosLoaderBlock.ModsAddr = (ULONG)&KeLoaderModules; + memcpy(&KeArcDiskInfo[0], + (PVOID)KeRosLoaderBlock.DrivesAddr, + sizeof(ARC_DISK_SIGNATURE) * KeRosLoaderBlock.DrivesCount); + KeRosLoaderBlock.DrivesAddr = (ULONG)&KeArcDiskInfo; /* Check for BIOS memory map */ KeMemoryMapRangeCount = 0;