Author: pschweitzer Date: Tue Feb 7 17:40:15 2012 New Revision: 55485
URL: http://svn.reactos.org/svn/reactos?rev=55485&view=rev Log: [NTOSKRNL] Fix a FIXME in IopCreateArcNames. This allows ntoskrnl to find where it boots from and where it is when performing remote boot. Now ReactOS should boot a bit farther using PXE :-).
Modified: trunk/reactos/ntoskrnl/io/iomgr/arcname.c
Modified: trunk/reactos/ntoskrnl/io/iomgr/arcname.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/io/iomgr/arcname.c... ============================================================================== --- trunk/reactos/ntoskrnl/io/iomgr/arcname.c [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/io/iomgr/arcname.c [iso-8859-1] Tue Feb 7 17:40:15 2012 @@ -18,6 +18,7 @@
UNICODE_STRING IoArcHalDeviceName, IoArcBootDeviceName; PCHAR IoLoaderArcBootDeviceName; +extern BOOLEAN IoRemoteBootClient;
/* FUNCTIONS *****************************************************************/
@@ -40,13 +41,14 @@ NTAPI IopCreateArcNames(IN PLOADER_PARAMETER_BLOCK LoaderBlock) { - PARC_DISK_INFORMATION ArcDiskInfo = LoaderBlock->ArcDiskInformation; - CHAR Buffer[128]; - ANSI_STRING ArcSystemString, ArcString; - BOOLEAN SingleDisk; SIZE_T Length; NTSTATUS Status; + CHAR Buffer[128]; + BOOLEAN SingleDisk; BOOLEAN FoundBoot = FALSE; + UNICODE_STRING SystemDevice, LoaderPathNameW, BootDeviceName; + PARC_DISK_INFORMATION ArcDiskInfo = LoaderBlock->ArcDiskInformation; + ANSI_STRING ArcSystemString, ArcString, LanmanRedirector, LoaderPathNameA;
/* Check if we only have one disk on the machine */ SingleDisk = ArcDiskInfo->DiskSignatureListHead.Flink->Flink == @@ -85,7 +87,53 @@ /* Build the boot strings */ RtlInitAnsiString(&ArcSystemString, LoaderBlock->ArcHalDeviceName);
- /* FIXME: Handle IoRemoteBootClient here and create appropriate symbolic link */ + /* If we are doing remote booting */ + if (IoRemoteBootClient) + { + /* Yes, we have found boot device */ + FoundBoot = TRUE; + + /* Get NT device name */ + RtlInitAnsiString(&LanmanRedirector, "\Device\LanmanRedirector"); + Status = RtlAnsiStringToUnicodeString(&SystemDevice, &LanmanRedirector, TRUE); + if (!NT_SUCCESS(Status)) + { + return Status; + } + + /* Get ARC booting device name (in net(0) something) */ + sprintf(Buffer, "\ArcName\%s", LoaderBlock->ArcBootDeviceName); + RtlInitAnsiString(&ArcString, Buffer); + Status = RtlAnsiStringToUnicodeString(&BootDeviceName, &ArcString, TRUE); + if (NT_SUCCESS(Status)) + { + /* Map ARC to NT name */ + IoCreateSymbolicLink(&BootDeviceName, &SystemDevice); + RtlFreeUnicodeString(&BootDeviceName); + + /* Now, get loader path name */ + RtlInitAnsiString(&LoaderPathNameA, LoaderBlock->NtHalPathName); + Status = RtlAnsiStringToUnicodeString(&LoaderPathNameW, &LoaderPathNameA, TRUE); + if (!NT_SUCCESS(Status)) + { + RtlFreeUnicodeString(&SystemDevice); + return Status; + } + + /* And set it has system partition */ + IopStoreSystemPartitionInformation(&SystemDevice, &LoaderPathNameW); + } + + RtlFreeUnicodeString(&SystemDevice); + + /* Don't quit here, even if everything went fine! + * We need IopCreateArcNamesDisk to properly map + * devices with symlinks. + * It will return success if the mapping process went fine + * even if it didn't find boot device. + * It won't reset boot device finding status as well. + */ + }
/* Loop every disk and try to find boot disk */ Status = IopCreateArcNamesDisk(LoaderBlock, SingleDisk, &FoundBoot); @@ -391,7 +439,7 @@ ANSI_STRING ArcBootString, ArcSystemString, DeviceStringA, ArcNameStringA, HalPathStringA;
/* Initialise device number */ - DeviceNumber.DeviceNumber = 0xFFFFFFFF; + DeviceNumber.DeviceNumber = UINT_MAX; /* Get all the disks present in the system */ DiskCount = IoGetConfigurationInformation()->DiskCount;
@@ -487,7 +535,7 @@ if (NotEnabledPresent && *lSymbolicLinkList == UNICODE_NULL) { /* No enabled disk worked, reset field */ - if (DeviceNumber.DeviceNumber == 0xFFFFFFFF) + if (DeviceNumber.DeviceNumber == UINT_MAX) { DeviceNumber.DeviceNumber = 0; } @@ -521,7 +569,7 @@
RtlFreeUnicodeString(&DeviceStringW); /* This is a security measure, to ensure DiskNumber will be used */ - DeviceNumber.DeviceNumber = 0xFFFFFFFF; + DeviceNumber.DeviceNumber = UINT_MAX; }
/* Something failed somewhere earlier, just skip the disk */ @@ -657,7 +705,7 @@ (DriveLayout->PartitionStyle == PARTITION_STYLE_MBR)) { /* Create device name */ - sprintf(Buffer, "\Device\Harddisk%lu\Partition0", (DeviceNumber.DeviceNumber != 0xFFFFFFFF) ? DeviceNumber.DeviceNumber : DiskNumber); + sprintf(Buffer, "\Device\Harddisk%lu\Partition0", (DeviceNumber.DeviceNumber != UINT_MAX) ? DeviceNumber.DeviceNumber : DiskNumber); RtlInitAnsiString(&DeviceStringA, Buffer); Status = RtlAnsiStringToUnicodeString(&DeviceStringW, &DeviceStringA, TRUE); if (!NT_SUCCESS(Status)) @@ -686,7 +734,7 @@ for (i = 1; i <= DriveLayout->PartitionCount; i++) { /* Create device name */ - sprintf(Buffer, "\Device\Harddisk%lu\Partition%lu", (DeviceNumber.DeviceNumber != 0xFFFFFFFF) ? DeviceNumber.DeviceNumber : DiskNumber, i); + sprintf(Buffer, "\Device\Harddisk%lu\Partition%lu", (DeviceNumber.DeviceNumber != UINT_MAX) ? DeviceNumber.DeviceNumber : DiskNumber, i); RtlInitAnsiString(&DeviceStringA, Buffer); Status = RtlAnsiStringToUnicodeString(&DeviceStringW, &DeviceStringA, TRUE); if (!NT_SUCCESS(Status))