- Finalize ARC Boot changes:

* Rename IoCreateArcNames to IopCreateArcNames and set it to NTAPI, as well as pass the loader block as a parameter.
  * Reduce buffers to 128 bytes, since ARC Paths don't get longer then that.
  * Optimize stack usage by using a single ANSI_STRING instead of 3 or 4.
  * Optimize stack usage by using a single ansi buffer, not 2 or more.

svn path=/trunk/; revision=24458
This commit is contained in:
Alex Ionescu 2006-10-08 21:38:45 +00:00
parent b5f79593de
commit d4b5fef3d6
3 changed files with 53 additions and 32 deletions

View file

@ -563,8 +563,9 @@ IopInitializePnpServices(
// Initialization Routines // Initialization Routines
// //
NTSTATUS NTSTATUS
IoCreateArcNames( NTAPI
VOID IopCreateArcNames(
IN PLOADER_PARAMETER_BLOCK LoaderBlock
); );
NTSTATUS NTSTATUS

View file

@ -30,7 +30,7 @@ IopApplyRosCdromArcHack(IN ULONG i)
OBJECT_ATTRIBUTES ObjectAttributes; OBJECT_ATTRIBUTES ObjectAttributes;
ANSI_STRING InstallName; ANSI_STRING InstallName;
UNICODE_STRING DeviceName; UNICODE_STRING DeviceName;
CHAR Buffer[MAX_PATH]; CHAR Buffer[128];
FILE_BASIC_INFORMATION FileInfo; FILE_BASIC_INFORMATION FileInfo;
NTSTATUS Status; NTSTATUS Status;
PCHAR p, q; PCHAR p, q;
@ -117,7 +117,7 @@ IopGetDiskInformation(IN ULONG i,
{ {
ULONG j, Checksum; ULONG j, Checksum;
ANSI_STRING TempString; ANSI_STRING TempString;
CHAR Buffer[256]; CHAR Buffer[128];
UNICODE_STRING DeviceName; UNICODE_STRING DeviceName;
NTSTATUS Status; NTSTATUS Status;
PDEVICE_OBJECT DeviceObject; PDEVICE_OBJECT DeviceObject;
@ -257,8 +257,8 @@ NTAPI
IopAssignArcNamesToCdrom(IN PULONG Buffer, IopAssignArcNamesToCdrom(IN PULONG Buffer,
IN ULONG DiskNumber) IN ULONG DiskNumber)
{ {
CHAR ArcBuffer[256]; CHAR ArcBuffer[128];
ANSI_STRING TempString, ArcNameString; ANSI_STRING TempString;
UNICODE_STRING DeviceName, ArcName; UNICODE_STRING DeviceName, ArcName;
NTSTATUS Status; NTSTATUS Status;
LARGE_INTEGER PartitionOffset; LARGE_INTEGER PartitionOffset;
@ -345,8 +345,8 @@ IopAssignArcNamesToCdrom(IN PULONG Buffer,
sprintf(ArcBuffer, "\\ArcName\\%s", KeLoaderBlock->ArcBootDeviceName); sprintf(ArcBuffer, "\\ArcName\\%s", KeLoaderBlock->ArcBootDeviceName);
/* Convert it to Unicode */ /* Convert it to Unicode */
RtlInitAnsiString(&ArcNameString, ArcBuffer); RtlInitAnsiString(&TempString, ArcBuffer);
Status = RtlAnsiStringToUnicodeString(&ArcName, &ArcNameString, TRUE); Status = RtlAnsiStringToUnicodeString(&ArcName, &TempString, TRUE);
if (!NT_SUCCESS(Status)) return FALSE; if (!NT_SUCCESS(Status)) return FALSE;
/* Create the symbolic link and free the strings */ /* Create the symbolic link and free the strings */
@ -364,13 +364,13 @@ IopAssignArcNamesToCdrom(IN PULONG Buffer,
NTSTATUS NTSTATUS
INIT_FUNCTION INIT_FUNCTION
IoCreateArcNames(VOID) NTAPI
IopCreateArcNames(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
{ {
PLOADER_PARAMETER_BLOCK LoaderBlock = KeLoaderBlock;
PCONFIGURATION_INFORMATION ConfigInfo = IoGetConfigurationInformation(); PCONFIGURATION_INFORMATION ConfigInfo = IoGetConfigurationInformation();
PARC_DISK_INFORMATION ArcDiskInfo = LoaderBlock->ArcDiskInformation; PARC_DISK_INFORMATION ArcDiskInfo = LoaderBlock->ArcDiskInformation;
CHAR ArcBuffer[256], Buffer[256]; CHAR Buffer[128];
ANSI_STRING ArcBootString, ArcSystemString, ArcString, TempString, BootString; ANSI_STRING ArcBootString, ArcSystemString, ArcString;
UNICODE_STRING ArcName, BootPath, DeviceName; UNICODE_STRING ArcName, BootPath, DeviceName;
BOOLEAN SingleDisk; BOOLEAN SingleDisk;
ULONG i, j, Length; ULONG i, j, Length;
@ -387,13 +387,13 @@ IoCreateArcNames(VOID)
(&ArcDiskInfo->DiskSignatureListHead); (&ArcDiskInfo->DiskSignatureListHead);
/* Create the global HAL partition name */ /* Create the global HAL partition name */
sprintf(ArcBuffer, "\\ArcName\\%s", LoaderBlock->ArcHalDeviceName); sprintf(Buffer, "\\ArcName\\%s", LoaderBlock->ArcHalDeviceName);
RtlInitAnsiString(&ArcString, ArcBuffer); RtlInitAnsiString(&ArcString, Buffer);
RtlAnsiStringToUnicodeString(&IoArcHalDeviceName, &ArcString, TRUE); RtlAnsiStringToUnicodeString(&IoArcHalDeviceName, &ArcString, TRUE);
/* Create the global system partition name */ /* Create the global system partition name */
sprintf(ArcBuffer, "\\ArcName\\%s", LoaderBlock->ArcBootDeviceName); sprintf(Buffer, "\\ArcName\\%s", LoaderBlock->ArcBootDeviceName);
RtlInitAnsiString(&ArcString, ArcBuffer); RtlInitAnsiString(&ArcString, Buffer);
RtlAnsiStringToUnicodeString(&IoArcBootDeviceName, &ArcString, TRUE); RtlAnsiStringToUnicodeString(&IoArcBootDeviceName, &ArcString, TRUE);
/* Allocate memory for the string */ /* Allocate memory for the string */
@ -457,16 +457,20 @@ IoCreateArcNames(VOID)
sprintf(Buffer, "\\Device\\Harddisk%lu\\Partition0", i); sprintf(Buffer, "\\Device\\Harddisk%lu\\Partition0", i);
/* Convert it to Unicode */ /* Convert it to Unicode */
RtlInitAnsiString(&TempString, Buffer); RtlInitAnsiString(&ArcString, Buffer);
Status = RtlAnsiStringToUnicodeString(&DeviceName, &TempString, TRUE); Status = RtlAnsiStringToUnicodeString(&DeviceName,
&ArcString,
TRUE);
if (!NT_SUCCESS(Status)) continue; if (!NT_SUCCESS(Status)) continue;
/* Build the ARC Device Name */ /* Build the ARC Device Name */
sprintf(ArcBuffer, "\\ArcName\\%s", ArcDiskEntry->ArcName); sprintf(Buffer, "\\ArcName\\%s", ArcDiskEntry->ArcName);
/* Convert it to Unicode */ /* Convert it to Unicode */
RtlInitAnsiString(&ArcString, ArcBuffer); RtlInitAnsiString(&ArcString, Buffer);
Status = RtlAnsiStringToUnicodeString(&ArcName, &ArcString, TRUE); Status = RtlAnsiStringToUnicodeString(&ArcName,
&ArcString,
TRUE);
if (!NT_SUCCESS(Status)) continue; if (!NT_SUCCESS(Status)) continue;
/* Create the symbolic link and free the strings */ /* Create the symbolic link and free the strings */
@ -478,16 +482,24 @@ IoCreateArcNames(VOID)
for (j = 0; j < PartitionCount; j++) for (j = 0; j < PartitionCount; j++)
{ {
/* Build the partition device name */ /* Build the partition device name */
sprintf(Buffer, "\\Device\\Harddisk%lu\\Partition%lu", i, j + 1); sprintf(Buffer,
"\\Device\\Harddisk%lu\\Partition%lu",
i,
j + 1);
/* Convert it to Unicode */ /* Convert it to Unicode */
RtlInitAnsiString(&TempString, Buffer); RtlInitAnsiString(&ArcString, Buffer);
Status = RtlAnsiStringToUnicodeString(&DeviceName, &TempString, TRUE); Status = RtlAnsiStringToUnicodeString(&DeviceName,
&ArcString,
TRUE);
if (!NT_SUCCESS(Status)) continue; if (!NT_SUCCESS(Status)) continue;
/* Build the partial ARC name for this partition */ /* Build the partial ARC name for this partition */
sprintf(ArcBuffer, "%spartition(%lu)", ArcDiskEntry->ArcName, j + 1); sprintf(Buffer,
RtlInitAnsiString(&ArcString, ArcBuffer); "%spartition(%lu)",
ArcDiskEntry->ArcName,
j + 1);
RtlInitAnsiString(&ArcString, Buffer);
/* Check if this is the boot device */ /* Check if this is the boot device */
if (RtlEqualString(&ArcString, &ArcBootString, TRUE)) if (RtlEqualString(&ArcString, &ArcBootString, TRUE))
@ -500,8 +512,11 @@ IoCreateArcNames(VOID)
if (RtlEqualString(&ArcString, &ArcSystemString, TRUE)) if (RtlEqualString(&ArcString, &ArcSystemString, TRUE))
{ {
/* It is, create a Unicode string for it */ /* It is, create a Unicode string for it */
RtlInitAnsiString(&BootString, LoaderBlock->NtHalPathName); RtlInitAnsiString(&ArcString,
Status = RtlAnsiStringToUnicodeString(&BootPath, &BootString, TRUE); LoaderBlock->NtHalPathName);
Status = RtlAnsiStringToUnicodeString(&BootPath,
&ArcString,
TRUE);
if (NT_SUCCESS(Status)) if (NT_SUCCESS(Status))
{ {
/* FIXME: Save in registry */ /* FIXME: Save in registry */
@ -512,11 +527,16 @@ IoCreateArcNames(VOID)
} }
/* Build the full ARC name */ /* Build the full ARC name */
sprintf(Buffer, "\\ArcName\\%spartition(%lu)", ArcDiskEntry->ArcName, j + 1); sprintf(Buffer,
"\\ArcName\\%spartition(%lu)",
ArcDiskEntry->ArcName,
j + 1);
/* Convert it to Unicode */ /* Convert it to Unicode */
RtlInitAnsiString(&ArcString, Buffer); RtlInitAnsiString(&ArcString, Buffer);
Status = RtlAnsiStringToUnicodeString(&ArcName, &ArcString, TRUE); Status = RtlAnsiStringToUnicodeString(&ArcName,
&ArcString,
TRUE);
if (!NT_SUCCESS(Status)) continue; if (!NT_SUCCESS(Status)) continue;
/* Create the symbolic link and free the strings */ /* Create the symbolic link and free the strings */

View file

@ -472,14 +472,14 @@ IoInit2(BOOLEAN BootLog)
} }
VOID VOID
STDCALL NTAPI
INIT_FUNCTION INIT_FUNCTION
IoInit3(VOID) IoInit3(VOID)
{ {
ANSI_STRING NtBootPath; ANSI_STRING NtBootPath;
/* Create ARC names for boot devices */ /* Create ARC names for boot devices */
IoCreateArcNames(); IopCreateArcNames(KeLoaderBlock);
/* Read KDB Data */ /* Read KDB Data */
KdbInit(); KdbInit();