mirror of https://github.com/acidanthera/audk.git
ShellPkg: Fix shell not able to run startup.nsh
Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Chen A Chen <chen.a.chen@intel.com> Reviewed-by: Ruiyu Ni <ruiyu.ni@intel.com> Reviewed-by: Jaben Carsey <jaben.carsey@intel.com>
This commit is contained in:
parent
89648826ee
commit
aaf51f08ee
|
@ -1131,6 +1131,58 @@ ProcessCommandLine(
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Function try to find location of the Startup.nsh file.
|
||||||
|
|
||||||
|
The buffer is callee allocated and should be freed by the caller.
|
||||||
|
|
||||||
|
@param ImagePath The path to the image for shell. first place to look for the startup script
|
||||||
|
@param FilePath The path to the file for shell. second place to look for the startup script.
|
||||||
|
|
||||||
|
@retval NULL No Startup.nsh file was found.
|
||||||
|
@return !=NULL Pointer to NULL-terminated path.
|
||||||
|
**/
|
||||||
|
CHAR16 *
|
||||||
|
LocateStartupScript (
|
||||||
|
IN EFI_DEVICE_PATH_PROTOCOL *ImageDevicePath,
|
||||||
|
IN EFI_DEVICE_PATH_PROTOCOL *FileDevicePath
|
||||||
|
)
|
||||||
|
{
|
||||||
|
CHAR16 *StartupScriptPath;
|
||||||
|
CHAR16 *TempSpot;
|
||||||
|
CONST CHAR16 *MapName;
|
||||||
|
UINTN Size;
|
||||||
|
|
||||||
|
StartupScriptPath = NULL;
|
||||||
|
Size = 0;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Try to find 'Startup.nsh' in the directory where the shell itself was launched.
|
||||||
|
//
|
||||||
|
MapName = ShellInfoObject.NewEfiShellProtocol->GetMapFromDevicePath (&ImageDevicePath);
|
||||||
|
if (MapName != NULL) {
|
||||||
|
StartupScriptPath = StrnCatGrow (&StartupScriptPath, &Size, MapName, 0);
|
||||||
|
TempSpot = StrStr (StartupScriptPath, L";");
|
||||||
|
if (TempSpot != NULL) {
|
||||||
|
*TempSpot = CHAR_NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
StartupScriptPath = StrnCatGrow (&StartupScriptPath, &Size, ((FILEPATH_DEVICE_PATH *)FileDevicePath)->PathName, 0);
|
||||||
|
PathRemoveLastItem (StartupScriptPath);
|
||||||
|
StartupScriptPath = StrnCatGrow (&StartupScriptPath, &Size, mStartupScript, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Try to find 'Startup.nsh' in the execution path defined by the envrionment variable PATH.
|
||||||
|
//
|
||||||
|
if ((StartupScriptPath == NULL) || EFI_ERROR (ShellIsFile (StartupScriptPath))) {
|
||||||
|
SHELL_FREE_NON_NULL (StartupScriptPath);
|
||||||
|
StartupScriptPath = ShellFindFilePath (mStartupScript);
|
||||||
|
}
|
||||||
|
|
||||||
|
return StartupScriptPath;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Handles all interaction with the default startup script.
|
Handles all interaction with the default startup script.
|
||||||
|
|
||||||
|
@ -1151,17 +1203,11 @@ DoStartupScript(
|
||||||
EFI_STATUS CalleeStatus;
|
EFI_STATUS CalleeStatus;
|
||||||
UINTN Delay;
|
UINTN Delay;
|
||||||
EFI_INPUT_KEY Key;
|
EFI_INPUT_KEY Key;
|
||||||
SHELL_FILE_HANDLE FileHandle;
|
|
||||||
EFI_DEVICE_PATH_PROTOCOL *NewPath;
|
|
||||||
EFI_DEVICE_PATH_PROTOCOL *NamePath;
|
|
||||||
CHAR16 *FileStringPath;
|
CHAR16 *FileStringPath;
|
||||||
CHAR16 *TempSpot;
|
|
||||||
UINTN NewSize;
|
UINTN NewSize;
|
||||||
CONST CHAR16 *MapName;
|
|
||||||
|
|
||||||
Key.UnicodeChar = CHAR_NULL;
|
Key.UnicodeChar = CHAR_NULL;
|
||||||
Key.ScanCode = 0;
|
Key.ScanCode = 0;
|
||||||
FileHandle = NULL;
|
|
||||||
|
|
||||||
if (!ShellInfoObject.ShellInitSettings.BitUnion.Bits.Startup && ShellInfoObject.ShellInitSettings.FileName != NULL) {
|
if (!ShellInfoObject.ShellInitSettings.BitUnion.Bits.Startup && ShellInfoObject.ShellInitSettings.FileName != NULL) {
|
||||||
//
|
//
|
||||||
|
@ -1223,59 +1269,11 @@ DoStartupScript(
|
||||||
return (EFI_SUCCESS);
|
return (EFI_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
FileStringPath = LocateStartupScript (ImagePath, FilePath);
|
||||||
// Try the first location (must be file system)
|
if (FileStringPath != NULL) {
|
||||||
//
|
Status = RunScriptFile (FileStringPath, NULL, L"", ShellInfoObject.NewShellParametersProtocol);
|
||||||
MapName = ShellInfoObject.NewEfiShellProtocol->GetMapFromDevicePath(&ImagePath);
|
FreePool (FileStringPath);
|
||||||
if (MapName != NULL) {
|
|
||||||
FileStringPath = NULL;
|
|
||||||
NewSize = 0;
|
|
||||||
FileStringPath = StrnCatGrow(&FileStringPath, &NewSize, MapName, 0);
|
|
||||||
if (FileStringPath == NULL) {
|
|
||||||
Status = EFI_OUT_OF_RESOURCES;
|
|
||||||
} else {
|
|
||||||
TempSpot = StrStr(FileStringPath, L";");
|
|
||||||
if (TempSpot != NULL) {
|
|
||||||
*TempSpot = CHAR_NULL;
|
|
||||||
}
|
}
|
||||||
FileStringPath = StrnCatGrow(&FileStringPath, &NewSize, ((FILEPATH_DEVICE_PATH*)FilePath)->PathName, 0);
|
|
||||||
PathRemoveLastItem(FileStringPath);
|
|
||||||
FileStringPath = StrnCatGrow(&FileStringPath, &NewSize, mStartupScript, 0);
|
|
||||||
Status = ShellInfoObject.NewEfiShellProtocol->OpenFileByName(FileStringPath, &FileHandle, EFI_FILE_MODE_READ);
|
|
||||||
FreePool(FileStringPath);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (EFI_ERROR(Status)) {
|
|
||||||
NamePath = FileDevicePath (NULL, mStartupScript);
|
|
||||||
NewPath = AppendDevicePathNode (ImagePath, NamePath);
|
|
||||||
FreePool(NamePath);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Try the location
|
|
||||||
//
|
|
||||||
Status = InternalOpenFileDevicePath(NewPath, &FileHandle, EFI_FILE_MODE_READ, 0);
|
|
||||||
FreePool(NewPath);
|
|
||||||
}
|
|
||||||
//
|
|
||||||
// If we got a file, run it
|
|
||||||
//
|
|
||||||
if (!EFI_ERROR(Status) && FileHandle != NULL) {
|
|
||||||
Status = RunScriptFile (mStartupScript, FileHandle, L"", ShellInfoObject.NewShellParametersProtocol);
|
|
||||||
ShellInfoObject.NewEfiShellProtocol->CloseFile(FileHandle);
|
|
||||||
} else {
|
|
||||||
FileStringPath = ShellFindFilePath(mStartupScript);
|
|
||||||
if (FileStringPath == NULL) {
|
|
||||||
//
|
|
||||||
// we return success since we don't need to have a startup script
|
|
||||||
//
|
|
||||||
Status = EFI_SUCCESS;
|
|
||||||
ASSERT(FileHandle == NULL);
|
|
||||||
} else {
|
|
||||||
Status = RunScriptFile(FileStringPath, NULL, L"", ShellInfoObject.NewShellParametersProtocol);
|
|
||||||
FreePool(FileStringPath);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
return (Status);
|
return (Status);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue