windows-nt/Source/XPSP1/NT/base/efiutil/sdk/shell/lib/io.c
2020-09-26 16:20:57 +08:00

154 lines
2.9 KiB
C

/*++
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;
}