ShellPkg: Allow opening of root drive nodes

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Jaben Carsey <Jaben.carsey@intel.com>
Reviewed-by: Erik Bjorge <erik.c.bjorge@intel.com>



git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@15424 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
Jaben Carsey
2014-03-31 21:06:13 +00:00
committed by jcarsey
parent 4b5168d852
commit d0a5723f50

View File

@ -1898,7 +1898,7 @@ CreateAndPopulateShellFileInfo(
TempString = StrnCatGrow(&TempString, &Size, BasePath, 0); TempString = StrnCatGrow(&TempString, &Size, BasePath, 0);
if (TempString == NULL) { if (TempString == NULL) {
FreePool((VOID*)ShellFileListItem->FileName); FreePool((VOID*)ShellFileListItem->FileName);
FreePool(ShellFileListItem->Info); SHELL_FREE_NON_NULL(ShellFileListItem->Info);
FreePool(ShellFileListItem); FreePool(ShellFileListItem);
return (NULL); return (NULL);
} }
@ -2105,6 +2105,7 @@ ShellSearchHandle(
EFI_SHELL_FILE_INFO *ShellInfo; EFI_SHELL_FILE_INFO *ShellInfo;
EFI_SHELL_FILE_INFO *ShellInfoNode; EFI_SHELL_FILE_INFO *ShellInfoNode;
EFI_SHELL_FILE_INFO *NewShellNode; EFI_SHELL_FILE_INFO *NewShellNode;
EFI_FILE_INFO *FileInfo;
BOOLEAN Directory; BOOLEAN Directory;
CHAR16 *NewFullName; CHAR16 *NewFullName;
UINTN Size; UINTN Size;
@ -2132,30 +2133,44 @@ ShellSearchHandle(
if (CurrentFilePattern[0] == CHAR_NULL if (CurrentFilePattern[0] == CHAR_NULL
&&NextFilePatternStart[0] == CHAR_NULL &&NextFilePatternStart[0] == CHAR_NULL
){ ){
// //
// Add the current parameter FileHandle to the list, then end... // we want the parent or root node (if no parent)
// //
if (ParentNode == NULL) { if (ParentNode == NULL) {
Status = EFI_INVALID_PARAMETER; //
// We want the root node. create the node.
//
FileInfo = FileHandleGetInfo(FileHandle);
NewShellNode = CreateAndPopulateShellFileInfo(
L":",
EFI_SUCCESS,
L"\\",
FileHandle,
FileInfo
);
SHELL_FREE_NON_NULL(FileInfo);
} else { } else {
//
// Add the current parameter FileHandle to the list, then end...
//
NewShellNode = InternalDuplicateShellFileInfo((EFI_SHELL_FILE_INFO*)ParentNode, TRUE); NewShellNode = InternalDuplicateShellFileInfo((EFI_SHELL_FILE_INFO*)ParentNode, TRUE);
if (NewShellNode == NULL) { }
Status = EFI_OUT_OF_RESOURCES; if (NewShellNode == NULL) {
} else { Status = EFI_OUT_OF_RESOURCES;
NewShellNode->Handle = NULL; } else {
if (*FileList == NULL) { NewShellNode->Handle = NULL;
*FileList = AllocateZeroPool(sizeof(EFI_SHELL_FILE_INFO)); if (*FileList == NULL) {
InitializeListHead(&((*FileList)->Link)); *FileList = AllocateZeroPool(sizeof(EFI_SHELL_FILE_INFO));
} InitializeListHead(&((*FileList)->Link));
//
// Add to the returning to use list
//
InsertTailList(&(*FileList)->Link, &NewShellNode->Link);
Status = EFI_SUCCESS;
} }
//
// Add to the returning to use list
//
InsertTailList(&(*FileList)->Link, &NewShellNode->Link);
Status = EFI_SUCCESS;
} }
} else { } else {
Status = EfiShellFindFilesInDir(FileHandle, &ShellInfo); Status = EfiShellFindFilesInDir(FileHandle, &ShellInfo);