NTSTATUS INIT_FUNCTION NTAPI IopCreateArcNames(IN PLOADER_PARAMETER_BLOCK LoaderBlock) { PARC_DISK_INFORMATION ArcDiskInfo = LoaderBlock->ArcDiskInformation; CHAR Buffer[128]; ANSI_STRING ArcSystemString, ArcString; BOOLEAN SingleDisk; ULONG Length; NTSTATUS Status; BOOLEAN FoundBoot = FALSE; /* Check if we only have one disk on the machine */ SingleDisk = ArcDiskInfo->DiskSignatureListHead.Flink->Flink == (&ArcDiskInfo->DiskSignatureListHead); /* Create the global HAL partition name */ sprintf(Buffer, "\\ArcName\\%s", LoaderBlock->ArcHalDeviceName); RtlInitAnsiString(&ArcString, Buffer); RtlAnsiStringToUnicodeString(&IoArcHalDeviceName, &ArcString, TRUE); /* Create the global system partition name */ sprintf(Buffer, "\\ArcName\\%s", LoaderBlock->ArcBootDeviceName); RtlInitAnsiString(&ArcString, Buffer); RtlAnsiStringToUnicodeString(&IoArcBootDeviceName, &ArcString, TRUE); /* Allocate memory for the string */ Length = strlen(LoaderBlock->ArcBootDeviceName) + sizeof(ANSI_NULL); IoLoaderArcBootDeviceName = ExAllocatePoolWithTag(PagedPool, Length, TAG_IO); if (IoLoaderArcBootDeviceName) { /* Copy the name */ RtlCopyMemory(IoLoaderArcBootDeviceName, LoaderBlock->ArcBootDeviceName, Length); } /* Check if we only found a disk, but we're booting from CD-ROM */ if ((SingleDisk) && strstr(LoaderBlock->ArcBootDeviceName, "cdrom")) { /* Then disable single-disk mode, since there's a CD drive out there */ SingleDisk = FALSE; } /* Build the boot strings */ RtlInitAnsiString(&ArcSystemString, LoaderBlock->ArcHalDeviceName); /* FIXME: Handle IoRemoteBootClient here and create appropriate symbolic link */ /* Loop every disk and try to find boot disk */ Status = IopCreateArcNamesDisk(LoaderBlock, SingleDisk, &FoundBoot); /* If it succeed but we didn't find boot device, try to browse Cds */ if (NT_SUCCESS(Status) && !FoundBoot) { Status = IopCreateArcNamesCd(LoaderBlock); } /* Return success */ return Status; }
NTSTATUS INIT_FUNCTION NTAPI IopCreateArcNames(IN PLOADER_PARAMETER_BLOCK LoaderBlock) { 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 == (&ArcDiskInfo->DiskSignatureListHead); /* Create the global HAL partition name */ sprintf(Buffer, "\\ArcName\\%s", LoaderBlock->ArcHalDeviceName); RtlInitAnsiString(&ArcString, Buffer); RtlAnsiStringToUnicodeString(&IoArcHalDeviceName, &ArcString, TRUE); /* Create the global system partition name */ sprintf(Buffer, "\\ArcName\\%s", LoaderBlock->ArcBootDeviceName); RtlInitAnsiString(&ArcString, Buffer); RtlAnsiStringToUnicodeString(&IoArcBootDeviceName, &ArcString, TRUE); /* Allocate memory for the string */ Length = strlen(LoaderBlock->ArcBootDeviceName) + sizeof(ANSI_NULL); IoLoaderArcBootDeviceName = ExAllocatePoolWithTag(PagedPool, Length, TAG_IO); if (IoLoaderArcBootDeviceName) { /* Copy the name */ RtlCopyMemory(IoLoaderArcBootDeviceName, LoaderBlock->ArcBootDeviceName, Length); } /* Check if we only found a disk, but we're booting from CD-ROM */ if ((SingleDisk) && strstr(LoaderBlock->ArcBootDeviceName, "cdrom")) { /* Then disable single-disk mode, since there's a CD drive out there */ SingleDisk = FALSE; } /* Build the boot strings */ RtlInitAnsiString(&ArcSystemString, LoaderBlock->ArcHalDeviceName); /* 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 */ IoAssignArcName(&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); /* If it succeed but we didn't find boot device, try to browse Cds */ if (NT_SUCCESS(Status) && !FoundBoot) { Status = IopCreateArcNamesCd(LoaderBlock); } /* Return success */ return Status; }