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?rev=55485&r1=55484&r2=55485&view=diff
==============================================================================
--- 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))


Reply via email to