mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
153 lines
2.9 KiB
153 lines
2.9 KiB
|
|
/*++
|
|
|
|
Copyright (c) 1998 Intel Corporation
|
|
|
|
Module Name:
|
|
|
|
io.c
|
|
|
|
Abstract:
|
|
|
|
Intialize the shell library
|
|
|
|
|
|
|
|
Revision History
|
|
|
|
--*/
|
|
|
|
#include "shelllib.h"
|
|
|
|
CHAR16 *
|
|
ShellGetEnv (
|
|
IN CHAR16 *Name
|
|
)
|
|
{
|
|
return SE->GetEnv (Name);
|
|
}
|
|
|
|
CHAR16 *
|
|
ShellGetMap (
|
|
IN CHAR16 *Name
|
|
)
|
|
{
|
|
return SE->GetMap (Name);
|
|
}
|
|
|
|
CHAR16 *
|
|
ShellCurDir (
|
|
IN CHAR16 *DeviceName OPTIONAL
|
|
)
|
|
/* N.B. Results are allocated from pool. The caller must free the pool */
|
|
{
|
|
return SE->CurDir (DeviceName);
|
|
}
|
|
|
|
|
|
EFI_STATUS
|
|
ShellFileMetaArg (
|
|
IN CHAR16 *Arg,
|
|
IN OUT LIST_ENTRY *ListHead
|
|
)
|
|
{
|
|
return SE->FileMetaArg(Arg, ListHead);
|
|
}
|
|
|
|
|
|
EFI_STATUS
|
|
ShellFreeFileList (
|
|
IN OUT LIST_ENTRY *ListHead
|
|
)
|
|
{
|
|
return SE->FreeFileList(ListHead);
|
|
}
|
|
|
|
|
|
EFI_FILE_HANDLE
|
|
ShellOpenFilePath (
|
|
IN EFI_DEVICE_PATH *FilePath,
|
|
IN UINT64 FileMode
|
|
)
|
|
{
|
|
EFI_HANDLE DeviceHandle;
|
|
EFI_STATUS Status;
|
|
EFI_FILE_HANDLE FileHandle, LastHandle;
|
|
FILEPATH_DEVICE_PATH *FilePathNode;
|
|
|
|
/*
|
|
* File the file system for this file path
|
|
*/
|
|
|
|
Status = BS->LocateDevicePath (&FileSystemProtocol, &FilePath, &DeviceHandle);
|
|
if (EFI_ERROR(Status)) {
|
|
return NULL;
|
|
}
|
|
|
|
/*
|
|
* Attempt to access the file via a file system interface
|
|
*/
|
|
|
|
FileHandle = LibOpenRoot (DeviceHandle);
|
|
Status = FileHandle ? EFI_SUCCESS : EFI_UNSUPPORTED;
|
|
|
|
/*
|
|
* To access as a filesystem, the filepath should only
|
|
* contain filepath components. Follow the filepath nodes
|
|
* and find the target file
|
|
*/
|
|
|
|
FilePathNode = (FILEPATH_DEVICE_PATH *) FilePath;
|
|
while (!IsDevicePathEnd(&FilePathNode->Header)) {
|
|
|
|
/*
|
|
* For filesystem access each node should be a filepath component
|
|
*/
|
|
|
|
if (DevicePathType(&FilePathNode->Header) != MEDIA_DEVICE_PATH ||
|
|
DevicePathSubType(&FilePathNode->Header) != MEDIA_FILEPATH_DP) {
|
|
Status = EFI_UNSUPPORTED;
|
|
}
|
|
|
|
/*
|
|
* If there's been an error, stop
|
|
*/
|
|
|
|
if (EFI_ERROR(Status)) {
|
|
break;
|
|
}
|
|
|
|
/*
|
|
* Open this file path node
|
|
*/
|
|
|
|
LastHandle = FileHandle;
|
|
FileHandle = NULL;
|
|
|
|
Status = LastHandle->Open (
|
|
LastHandle,
|
|
&FileHandle,
|
|
FilePathNode->PathName,
|
|
FileMode,
|
|
0
|
|
);
|
|
|
|
/*
|
|
* Close the last node
|
|
*/
|
|
|
|
LastHandle->Close (LastHandle);
|
|
|
|
/*
|
|
* Get the next node
|
|
*/
|
|
|
|
FilePathNode = (FILEPATH_DEVICE_PATH *) NextDevicePathNode(&FilePathNode->Header);
|
|
}
|
|
|
|
if (EFI_ERROR(Status)) {
|
|
FileHandle = NULL;
|
|
}
|
|
|
|
return FileHandle;
|
|
}
|