- Have FreeLDR fill out ARC_DISK_SIGNATURE information for each detected disk, as it's filling the registry.

- Add code to KiRosFrldrLpbToLpb to convert this array to the official ARC_DISK_INFORMATION structure that contains LIST_ENTRYies for each ARC_DISK_SIGNATURE, and initialize the ArcDiskSignatureListHead.
- The end result will be that in the next patch we can remove a bunch of registry-reading code in IoCreateArcNames.

svn path=/trunk/; revision=24452
This commit is contained in:
Alex Ionescu
2006-10-08 19:34:16 +00:00
parent 7a1b73cf84
commit c537eb20f2
3 changed files with 53 additions and 0 deletions
@@ -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];
@@ -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...");
+35
View File
@@ -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;