Source code of Windows XP (NT5)
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.
|
|
/*++
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; }
|