udk2010.up2.shell initial release.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10874 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
@ -1,7 +1,7 @@
|
||||
/** @file
|
||||
Provides interface to EFI_FILE_HANDLE functionality.
|
||||
|
||||
Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
|
||||
Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved. <BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
@ -30,13 +30,13 @@
|
||||
#define FIND_XXXXX_FILE_BUFFER_SIZE (SIZE_OF_EFI_FILE_INFO + MAX_FILE_NAME_LEN)
|
||||
|
||||
/**
|
||||
This function will retrieve the information about the file for the handle
|
||||
This function will retrieve the information about the file for the handle
|
||||
specified and store it in allocated pool memory.
|
||||
|
||||
This function allocates a buffer to store the file's information. It is the
|
||||
This function allocates a buffer to store the file's information. It is the
|
||||
caller's responsibility to free the buffer
|
||||
|
||||
@param FileHandle The file handle of the file for which information is
|
||||
@param FileHandle The file handle of the file for which information is
|
||||
being requested.
|
||||
|
||||
@retval NULL information could not be retrieved.
|
||||
@ -49,7 +49,7 @@ FileHandleGetInfo (
|
||||
IN EFI_FILE_HANDLE FileHandle
|
||||
)
|
||||
{
|
||||
EFI_FILE_INFO *pFileInfo;
|
||||
EFI_FILE_INFO *FileInfo;
|
||||
UINTN FileInfoSize;
|
||||
EFI_STATUS Status;
|
||||
|
||||
@ -62,51 +62,52 @@ FileHandleGetInfo (
|
||||
// Get the required size to allocate
|
||||
//
|
||||
FileInfoSize = 0;
|
||||
pFileInfo = NULL;
|
||||
Status = FileHandle->GetInfo(FileHandle,
|
||||
&gEfiFileInfoGuid,
|
||||
&FileInfoSize,
|
||||
pFileInfo);
|
||||
FileInfo = NULL;
|
||||
Status = FileHandle->GetInfo(FileHandle,
|
||||
&gEfiFileInfoGuid,
|
||||
&FileInfoSize,
|
||||
FileInfo);
|
||||
//
|
||||
// error is expected. getting size to allocate
|
||||
//
|
||||
ASSERT (Status == EFI_BUFFER_TOO_SMALL);
|
||||
pFileInfo = AllocateZeroPool(FileInfoSize);
|
||||
ASSERT (pFileInfo != NULL);
|
||||
FileInfo = AllocateZeroPool(FileInfoSize);
|
||||
ASSERT (FileInfo != NULL);
|
||||
//
|
||||
// now get the information
|
||||
//
|
||||
Status = FileHandle->GetInfo(FileHandle,
|
||||
&gEfiFileInfoGuid,
|
||||
&FileInfoSize,
|
||||
pFileInfo);
|
||||
Status = FileHandle->GetInfo(FileHandle,
|
||||
&gEfiFileInfoGuid,
|
||||
&FileInfoSize,
|
||||
FileInfo);
|
||||
//
|
||||
// if we got an error free the memory and return NULL
|
||||
//
|
||||
if (EFI_ERROR(Status)) {
|
||||
FreePool(pFileInfo);
|
||||
FreePool(FileInfo);
|
||||
return NULL;
|
||||
}
|
||||
return (pFileInfo);
|
||||
return (FileInfo);
|
||||
}
|
||||
|
||||
/**
|
||||
This function will set the information about the file for the opened handle
|
||||
This function sets the information about the file for the opened handle
|
||||
specified.
|
||||
|
||||
@param FileHandle The file handle of the file for which information
|
||||
is being set
|
||||
@param[in] FileHandle The file handle of the file for which information
|
||||
is being set.
|
||||
|
||||
@param FileInfo The infotmation to set.
|
||||
@param[in] FileInfo The information to set.
|
||||
|
||||
@retval EFI_SUCCESS The information was set.
|
||||
@retval EFI_UNSUPPORTED The InformationType is not known.
|
||||
@retval EFI_NO_MEDIA The device has no medium.
|
||||
@retval EFI_DEVICE_ERROR The device reported an error.
|
||||
@retval EFI_SUCCESS The information was set.
|
||||
@retval EFI_INVALID_PARAMETER A parameter was out of range or invalid.
|
||||
@retval EFI_UNSUPPORTED The FileHandle does not support FileInfo.
|
||||
@retval EFI_NO_MEDIA The device has no medium.
|
||||
@retval EFI_DEVICE_ERROR The device reported an error.
|
||||
@retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
|
||||
@retval EFI_WRITE_PROTECTED The file or medium is write protected.
|
||||
@retval EFI_ACCESS_DENIED The file was opened read only.
|
||||
@retval EFI_VOLUME_FULL The volume is full.
|
||||
@retval EFI_WRITE_PROTECTED The file or medium is write protected.
|
||||
@retval EFI_ACCESS_DENIED The file was opened read only.
|
||||
@retval EFI_VOLUME_FULL The volume is full.
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
@ -115,7 +116,7 @@ FileHandleSetInfo (
|
||||
IN CONST EFI_FILE_INFO *FileInfo
|
||||
)
|
||||
{
|
||||
|
||||
|
||||
//
|
||||
// ASSERT if the FileHandle or FileInfo is NULL
|
||||
//
|
||||
@ -125,38 +126,38 @@ FileHandleSetInfo (
|
||||
//
|
||||
// Set the info
|
||||
//
|
||||
return (FileHandle->SetInfo(FileHandle,
|
||||
return (FileHandle->SetInfo(FileHandle,
|
||||
&gEfiFileInfoGuid,
|
||||
(UINTN)FileInfo->Size,
|
||||
(EFI_FILE_INFO*)FileInfo));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
This function reads information from an opened file.
|
||||
|
||||
If FileHandle is not a directory, the function reads the requested number of
|
||||
bytes from the file at the file's current position and returns them in Buffer.
|
||||
If FileHandle is not a directory, the function reads the requested number of
|
||||
bytes from the file at the file's current position and returns them in Buffer.
|
||||
If the read goes beyond the end of the file, the read length is truncated to the
|
||||
end of the file. The file's current position is increased by the number of bytes
|
||||
returned. If FileHandle is a directory, the function reads the directory entry
|
||||
at the file's current position and returns the entry in Buffer. If the Buffer
|
||||
is not large enough to hold the current directory entry, then
|
||||
EFI_BUFFER_TOO_SMALL is returned and the current file position is not updated.
|
||||
BufferSize is set to be the size of the buffer needed to read the entry. On
|
||||
success, the current position is updated to the next directory entry. If there
|
||||
are no more directory entries, the read returns a zero-length buffer.
|
||||
end of the file. The file's current position is increased by the number of bytes
|
||||
returned. If FileHandle is a directory, the function reads the directory entry
|
||||
at the file's current position and returns the entry in Buffer. If the Buffer
|
||||
is not large enough to hold the current directory entry, then
|
||||
EFI_BUFFER_TOO_SMALL is returned and the current file position is not updated.
|
||||
BufferSize is set to be the size of the buffer needed to read the entry. On
|
||||
success, the current position is updated to the next directory entry. If there
|
||||
are no more directory entries, the read returns a zero-length buffer.
|
||||
EFI_FILE_INFO is the structure returned as the directory entry.
|
||||
|
||||
@param FileHandle the opened file handle
|
||||
@param BufferSize on input the size of buffer in bytes. on return
|
||||
@param BufferSize on input the size of buffer in bytes. on return
|
||||
the number of bytes written.
|
||||
@param Buffer the buffer to put read data into.
|
||||
|
||||
@retval EFI_SUCCESS Data was read.
|
||||
@retval EFI_NO_MEDIA The device has no media.
|
||||
@retval EFI_DEVICE_ERROR The device reported an error.
|
||||
@retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
|
||||
@retval EFI_BUFFER_TO_SMALL Buffer is too small. ReadSize contains required
|
||||
@retval EFI_SUCCESS Data was read.
|
||||
@retval EFI_NO_MEDIA The device has no media.
|
||||
@retval EFI_DEVICE_ERROR The device reported an error.
|
||||
@retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
|
||||
@retval EFI_BUFFER_TO_SMALL Buffer is too small. ReadSize contains required
|
||||
size.
|
||||
|
||||
**/
|
||||
@ -183,11 +184,11 @@ FileHandleRead(
|
||||
/**
|
||||
Write data to a file.
|
||||
|
||||
This function writes the specified number of bytes to the file at the current
|
||||
file position. The current file position is advanced the actual number of bytes
|
||||
written, which is returned in BufferSize. Partial writes only occur when there
|
||||
has been a data error during the write attempt (such as "volume space full").
|
||||
The file is automatically grown to hold the data if required. Direct writes to
|
||||
This function writes the specified number of bytes to the file at the current
|
||||
file position. The current file position is advanced the actual number of bytes
|
||||
written, which is returned in BufferSize. Partial writes only occur when there
|
||||
has been a data error during the write attempt (such as "volume space full").
|
||||
The file is automatically grown to hold the data if required. Direct writes to
|
||||
opened directories are not supported.
|
||||
|
||||
@param FileHandle The opened file for writing
|
||||
@ -222,11 +223,11 @@ FileHandleWrite(
|
||||
return (FileHandle->Write(FileHandle, BufferSize, Buffer));
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
Close an open file handle.
|
||||
|
||||
This function closes a specified file handle. All "dirty" cached file data is
|
||||
flushed to the device, and the file is closed. In all cases the handle is
|
||||
This function closes a specified file handle. All "dirty" cached file data is
|
||||
flushed to the device, and the file is closed. In all cases the handle is
|
||||
closed.
|
||||
|
||||
@param FileHandle the file handle to close.
|
||||
@ -255,13 +256,13 @@ FileHandleClose (
|
||||
Delete a file and close the handle
|
||||
|
||||
This function closes and deletes a file. In all cases the file handle is closed.
|
||||
If the file cannot be deleted, the warning code EFI_WARN_DELETE_FAILURE is
|
||||
If the file cannot be deleted, the warning code EFI_WARN_DELETE_FAILURE is
|
||||
returned, but the handle is still closed.
|
||||
|
||||
@param FileHandle the file handle to delete
|
||||
|
||||
@retval EFI_SUCCESS the file was closed sucessfully
|
||||
@retval EFI_WARN_DELETE_FAILURE the handle was closed, but the file was not
|
||||
@retval EFI_WARN_DELETE_FAILURE the handle was closed, but the file was not
|
||||
deleted
|
||||
@retval INVALID_PARAMETER One of the parameters has an invalid value.
|
||||
**/
|
||||
@ -286,19 +287,19 @@ FileHandleDelete (
|
||||
/**
|
||||
Set the current position in a file.
|
||||
|
||||
This function sets the current file position for the handle to the position
|
||||
This function sets the current file position for the handle to the position
|
||||
supplied. With the exception of seeking to position 0xFFFFFFFFFFFFFFFF, only
|
||||
absolute positioning is supported, and seeking past the end of the file is
|
||||
allowed (a subsequent write would grow the file). Seeking to position
|
||||
absolute positioning is supported, and seeking past the end of the file is
|
||||
allowed (a subsequent write would grow the file). Seeking to position
|
||||
0xFFFFFFFFFFFFFFFF causes the current position to be set to the end of the file.
|
||||
If FileHandle is a directory, the only position that may be set is zero. This
|
||||
If FileHandle is a directory, the only position that may be set is zero. This
|
||||
has the effect of starting the read process of the directory entries over.
|
||||
|
||||
@param FileHandle The file handle on which the position is being set
|
||||
@param Position Byte position from begining of file
|
||||
|
||||
@retval EFI_SUCCESS Operation completed sucessfully.
|
||||
@retval EFI_UNSUPPORTED the seek request for non-zero is not valid on
|
||||
@retval EFI_UNSUPPORTED the seek request for non-zero is not valid on
|
||||
directories.
|
||||
@retval INVALID_PARAMETER One of the parameters has an invalid value.
|
||||
**/
|
||||
@ -319,11 +320,11 @@ FileHandleSetPosition (
|
||||
return (FileHandle->SetPosition(FileHandle, Position));
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
Gets a file's current position
|
||||
|
||||
This function retrieves the current file position for the file handle. For
|
||||
directories, the current file position has no meaning outside of the file
|
||||
This function retrieves the current file position for the file handle. For
|
||||
directories, the current file position has no meaning outside of the file
|
||||
system driver and as such the operation is not supported. An error is returned
|
||||
if FileHandle is a directory.
|
||||
|
||||
@ -341,6 +342,9 @@ FileHandleGetPosition (
|
||||
OUT UINT64 *Position
|
||||
)
|
||||
{
|
||||
if (Position == NULL) {
|
||||
return (EFI_INVALID_PARAMETER);
|
||||
}
|
||||
//
|
||||
// ASSERT if FileHandle is NULL
|
||||
//
|
||||
@ -352,7 +356,7 @@ FileHandleGetPosition (
|
||||
}
|
||||
/**
|
||||
Flushes data on a file
|
||||
|
||||
|
||||
This function flushes all modified data associated with a file to a device.
|
||||
|
||||
@param FileHandle The file handle on which to flush data
|
||||
@ -406,12 +410,12 @@ FileHandleIsDirectory (
|
||||
// ASSERT if DirHandle is NULL
|
||||
//
|
||||
ASSERT(DirHandle != NULL);
|
||||
|
||||
|
||||
//
|
||||
// get the file information for DirHandle
|
||||
//
|
||||
DirInfo = FileHandleGetInfo (DirHandle);
|
||||
|
||||
|
||||
//
|
||||
// Parse DirInfo
|
||||
//
|
||||
@ -420,7 +424,7 @@ FileHandleIsDirectory (
|
||||
// We got nothing...
|
||||
//
|
||||
return (EFI_INVALID_PARAMETER);
|
||||
}
|
||||
}
|
||||
if ((DirInfo->Attribute & EFI_FILE_DIRECTORY) == 0) {
|
||||
//
|
||||
// Attributes say this is not a directory
|
||||
@ -438,8 +442,8 @@ FileHandleIsDirectory (
|
||||
/**
|
||||
Retrieves the first file from a directory
|
||||
|
||||
This function opens a directory and gets the first file's info in the
|
||||
directory. Caller can use FileHandleFindNextFile() to get other files. When
|
||||
This function opens a directory and gets the first file's info in the
|
||||
directory. Caller can use FileHandleFindNextFile() to get other files. When
|
||||
complete the caller is responsible for calling FreePool() on Buffer.
|
||||
|
||||
@param DirHandle The file handle of the directory to search
|
||||
@ -475,15 +479,15 @@ FileHandleFindFirstFile (
|
||||
Status = FileHandleIsDirectory(DirHandle);
|
||||
if (EFI_ERROR(Status)) {
|
||||
return (Status);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// reset to the begining of the directory
|
||||
// reset to the begining of the directory
|
||||
//
|
||||
Status = FileHandleSetPosition(DirHandle, 0);
|
||||
if (EFI_ERROR(Status)) {
|
||||
return (Status);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Allocate a buffer sized to struct size + enough for the string at the end
|
||||
@ -507,12 +511,12 @@ FileHandleFindFirstFile (
|
||||
/**
|
||||
Retrieves the next file in a directory.
|
||||
|
||||
To use this function, caller must call the FileHandleFindFirstFile() to get the
|
||||
first file, and then use this function get other files. This function can be
|
||||
called for several times to get each file's information in the directory. If
|
||||
the call of FileHandleFindNextFile() got the last file in the directory, the next
|
||||
call of this function has no file to get. *NoFile will be set to TRUE and the
|
||||
Buffer memory will be automatically freed.
|
||||
To use this function, caller must call the FileHandleFindFirstFile() to get the
|
||||
first file, and then use this function get other files. This function can be
|
||||
called for several times to get each file's information in the directory. If
|
||||
the call of FileHandleFindNextFile() got the last file in the directory, the next
|
||||
call of this function has no file to get. *NoFile will be set to TRUE and the
|
||||
Buffer memory will be automatically freed.
|
||||
|
||||
@param DirHandle the file handle of the directory
|
||||
@param Buffer pointer to buffer for file's information
|
||||
@ -565,13 +569,14 @@ FileHandleFindNextFile(
|
||||
|
||||
return (EFI_SUCCESS);
|
||||
}
|
||||
|
||||
/**
|
||||
Retrieve the size of a file.
|
||||
|
||||
if FileHandle is NULL then ASSERT()
|
||||
if Size is NULL then ASSERT()
|
||||
|
||||
This function extracts the file size info from the FileHandle's EFI_FILE_INFO
|
||||
This function extracts the file size info from the FileHandle's EFI_FILE_INFO
|
||||
data.
|
||||
|
||||
@param FileHandle file handle from which size is retrieved
|
||||
@ -594,7 +599,7 @@ FileHandleGetSize (
|
||||
//
|
||||
ASSERT (FileHandle != NULL);
|
||||
ASSERT (Size != NULL);
|
||||
|
||||
|
||||
//
|
||||
// get the FileInfo structure
|
||||
//
|
||||
@ -607,7 +612,7 @@ FileHandleGetSize (
|
||||
// Assign the Size pointer to the correct value
|
||||
//
|
||||
*Size = FileInfo->FileSize;
|
||||
|
||||
|
||||
//
|
||||
// free the FileInfo memory
|
||||
//
|
||||
@ -616,47 +621,98 @@ FileHandleGetSize (
|
||||
return (EFI_SUCCESS);
|
||||
}
|
||||
|
||||
/**
|
||||
Set the size of a file.
|
||||
|
||||
If FileHandle is NULL then ASSERT().
|
||||
|
||||
This function changes the file size info from the FileHandle's EFI_FILE_INFO
|
||||
data.
|
||||
|
||||
@param FileHandle File handle whose size is to be changed.
|
||||
@param Size New size.
|
||||
|
||||
@retval EFI_SUCCESS operation was completed sucessfully.
|
||||
@retval EFI_DEVICE_ERROR cannot access the file.
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
FileHandleSetSize (
|
||||
IN EFI_FILE_HANDLE FileHandle,
|
||||
IN UINT64 Size
|
||||
)
|
||||
{
|
||||
EFI_FILE_INFO *FileInfo;
|
||||
EFI_STATUS Status;
|
||||
|
||||
//
|
||||
// ASSERT for FileHandle or Size being NULL
|
||||
//
|
||||
ASSERT (FileHandle != NULL);
|
||||
|
||||
//
|
||||
// get the FileInfo structure
|
||||
//
|
||||
FileInfo = FileHandleGetInfo(FileHandle);
|
||||
if (FileInfo == NULL) {
|
||||
return (EFI_DEVICE_ERROR);
|
||||
}
|
||||
|
||||
//
|
||||
// Assign the FileSize pointer to the new value
|
||||
//
|
||||
FileInfo->FileSize = Size;
|
||||
|
||||
Status = FileHandleSetInfo(FileHandle, FileInfo);
|
||||
//
|
||||
// free the FileInfo memory
|
||||
//
|
||||
FreePool(FileInfo);
|
||||
|
||||
return (Status);
|
||||
}
|
||||
|
||||
/**
|
||||
Safely append (on the left) with automatic string resizing given length of Destination and
|
||||
Safely append (on the left) with automatic string resizing given length of Destination and
|
||||
desired length of copy from Source.
|
||||
|
||||
append the first D characters of Source to the end of Destination, where D is
|
||||
the lesser of Count and the StrLen() of Source. If appending those D characters
|
||||
will fit within Destination (whose Size is given as CurrentSize) and
|
||||
still leave room for a NULL terminator, then those characters are appended,
|
||||
starting at the original terminating NULL of Destination, and a new terminating
|
||||
append the first D characters of Source to the end of Destination, where D is
|
||||
the lesser of Count and the StrLen() of Source. If appending those D characters
|
||||
will fit within Destination (whose Size is given as CurrentSize) and
|
||||
still leave room for a NULL terminator, then those characters are appended,
|
||||
starting at the original terminating NULL of Destination, and a new terminating
|
||||
NULL is appended.
|
||||
|
||||
If appending D characters onto Destination will result in a overflow of the size
|
||||
given in CurrentSize the string will be grown such that the copy can be performed
|
||||
and CurrentSize will be updated to the new size.
|
||||
|
||||
If Source is NULL, there is nothing to append, just return the current buffer in
|
||||
If Source is NULL, there is nothing to append, just return the current buffer in
|
||||
Destination.
|
||||
|
||||
if Destination is NULL, then ASSERT()
|
||||
if Destination's current length (including NULL terminator) is already more then
|
||||
if Destination's current length (including NULL terminator) is already more then
|
||||
CurrentSize, then ASSERT()
|
||||
|
||||
@param[in,out] Destination The String to append onto
|
||||
@param[in,out] CurrentSize on call the number of bytes in Destination. On
|
||||
@param[in,out] CurrentSize on call the number of bytes in Destination. On
|
||||
return possibly the new size (still in bytes). if NULL
|
||||
then allocate whatever is needed.
|
||||
@param[in] Source The String to append from
|
||||
@param[in] Count Maximum number of characters to append. if 0 then
|
||||
@param[in] Count Maximum number of characters to append. if 0 then
|
||||
all are appended.
|
||||
|
||||
@return Destination return the resultant string.
|
||||
**/
|
||||
CHAR16*
|
||||
CHAR16*
|
||||
EFIAPI
|
||||
StrnCatGrowLeft (
|
||||
IN OUT CHAR16 **Destination,
|
||||
IN OUT UINTN *CurrentSize,
|
||||
IN CONST CHAR16 *Source,
|
||||
IN UINTN Count
|
||||
){
|
||||
)
|
||||
{
|
||||
UINTN DestinationStartSize;
|
||||
UINTN NewSize;
|
||||
UINTN CopySize;
|
||||
@ -713,13 +769,13 @@ StrnCatGrowLeft (
|
||||
}
|
||||
|
||||
/**
|
||||
Function to get a full filename given a EFI_FILE_HANDLE somewhere lower on the
|
||||
Function to get a full filename given a EFI_FILE_HANDLE somewhere lower on the
|
||||
directory 'stack'.
|
||||
|
||||
if Handle is NULL, return EFI_INVALID_PARAMETER
|
||||
|
||||
@param[in] Handle Handle to the Directory or File to create path to.
|
||||
@param[out] FullFileName pointer to pointer to generated full file name. It
|
||||
@param[out] FullFileName pointer to pointer to generated full file name. It
|
||||
is the responsibility of the caller to free this memory
|
||||
with a call to FreePool().
|
||||
@retval EFI_SUCCESS the operation was sucessful and the FullFileName is valid.
|
||||
@ -732,7 +788,8 @@ EFIAPI
|
||||
FileHandleGetFileName (
|
||||
IN CONST EFI_FILE_HANDLE Handle,
|
||||
OUT CHAR16 **FullFileName
|
||||
){
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINTN Size;
|
||||
EFI_FILE_HANDLE CurrentHandle;
|
||||
@ -749,6 +806,7 @@ FileHandleGetFileName (
|
||||
}
|
||||
|
||||
*FullFileName = NULL;
|
||||
CurrentHandle = NULL;
|
||||
|
||||
Status = Handle->Open(Handle, &CurrentHandle, L".", EFI_FILE_MODE_READ, 0);
|
||||
if (!EFI_ERROR(Status)) {
|
||||
@ -766,14 +824,17 @@ FileHandleGetFileName (
|
||||
//
|
||||
if (StrLen (FileInfo->FileName) == 0) {
|
||||
if (*FullFileName == NULL) {
|
||||
ASSERT((*FullFileName == NULL && Size == 0) || (*FullFileName != NULL));
|
||||
*FullFileName = StrnCatGrowLeft(FullFileName, &Size, L"\\", 0);
|
||||
}
|
||||
FreePool(FileInfo);
|
||||
break;
|
||||
} else {
|
||||
if (*FullFileName == NULL) {
|
||||
ASSERT((*FullFileName == NULL && Size == 0) || (*FullFileName != NULL));
|
||||
*FullFileName = StrnCatGrowLeft(FullFileName, &Size, L"\\", 0);
|
||||
}
|
||||
ASSERT((*FullFileName == NULL && Size == 0) || (*FullFileName != NULL));
|
||||
*FullFileName = StrnCatGrowLeft(FullFileName, &Size, FileInfo->FileName, 0);
|
||||
*FullFileName = StrnCatGrowLeft(FullFileName, &Size, L"\\", 0);
|
||||
FreePool(FileInfo);
|
||||
@ -790,6 +851,10 @@ FileHandleGetFileName (
|
||||
FileHandleClose(CurrentHandle);
|
||||
CurrentHandle = NextHigherHandle;
|
||||
}
|
||||
} else if (Status == EFI_NOT_FOUND) {
|
||||
Status = EFI_SUCCESS;
|
||||
ASSERT((*FullFileName == NULL && Size == 0) || (*FullFileName != NULL));
|
||||
*FullFileName = StrnCatGrowLeft(FullFileName, &Size, L"\\", 0);
|
||||
}
|
||||
|
||||
if (CurrentHandle != NULL) {
|
||||
@ -804,10 +869,10 @@ FileHandleGetFileName (
|
||||
}
|
||||
|
||||
/**
|
||||
Function to read a single line from a file. The \n is not included in the returned
|
||||
Function to read a single line from a file. The \n is not included in the returned
|
||||
buffer. The returned buffer must be callee freed.
|
||||
|
||||
If the position upon start is 0, then the Ascii Boolean will be set. This should be
|
||||
If the position upon start is 0, then the Ascii Boolean will be set. This should be
|
||||
maintained and not changed for all operations with the same file.
|
||||
|
||||
@param[in] Handle FileHandle to read from.
|
||||
@ -845,24 +910,24 @@ FileHandleReturnLine(
|
||||
}
|
||||
|
||||
/**
|
||||
Function to read a single line (up to but not including the \n) from a file.
|
||||
Function to read a single line (up to but not including the \n) from a EFI_FILE_HANDLE.
|
||||
|
||||
If the position upon start is 0, then the Ascii Boolean will be set. This should be
|
||||
If the position upon start is 0, then the Ascii Boolean will be set. This should be
|
||||
maintained and not changed for all operations with the same file.
|
||||
|
||||
@param[in] Handle FileHandle to read from
|
||||
@param[in,out] Buffer pointer to buffer to read into
|
||||
@param[in,out] Size pointer to number of bytes in buffer
|
||||
@param[in] Truncate if TRUE then allows for truncation of the line to fit.
|
||||
if FALSE will reset the position to the begining of the
|
||||
if FALSE will reset the position to the begining of the
|
||||
line if the buffer is not large enough.
|
||||
@param[in,out] Ascii Boolean value for indicating whether the file is Ascii (TRUE) or UCS2 (FALSE);
|
||||
|
||||
@retval EFI_SUCCESS the operation was sucessful. the line is stored in
|
||||
@retval EFI_SUCCESS the operation was sucessful. the line is stored in
|
||||
Buffer.
|
||||
@retval EFI_INVALID_PARAMETER Handle was NULL.
|
||||
@retval EFI_INVALID_PARAMETER Size was NULL.
|
||||
@retval EFI_BUFFER_TOO_SMALL Size was not enough space to store the line.
|
||||
@retval EFI_BUFFER_TOO_SMALL Size was not enough space to store the line.
|
||||
Size was updated to minimum space required.
|
||||
@sa FileHandleRead
|
||||
**/
|
||||
@ -874,7 +939,8 @@ FileHandleReadLine(
|
||||
IN OUT UINTN *Size,
|
||||
IN BOOLEAN Truncate,
|
||||
IN OUT BOOLEAN *Ascii
|
||||
){
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
CHAR16 CharBuffer;
|
||||
UINTN CharSize;
|
||||
@ -884,8 +950,13 @@ FileHandleReadLine(
|
||||
|
||||
if (Handle == NULL
|
||||
||Size == NULL
|
||||
){
|
||||
return (EFI_INVALID_PARAMETER);
|
||||
){
|
||||
return (EFI_INVALID_PARAMETER);
|
||||
}
|
||||
if (Buffer == NULL) {
|
||||
ASSERT(*Size == 0);
|
||||
} else {
|
||||
*Buffer = CHAR_NULL;
|
||||
}
|
||||
FileHandleGetPosition(Handle, &OriginalFilePosition);
|
||||
if (OriginalFilePosition == 0) {
|
||||
@ -908,17 +979,11 @@ FileHandleReadLine(
|
||||
CharSize = sizeof(CHAR16);
|
||||
}
|
||||
Status = FileHandleRead(Handle, &CharSize, &CharBuffer);
|
||||
if (OriginalFilePosition == 0 && *Ascii == FALSE && CountSoFar == 0) {
|
||||
//
|
||||
// we need to skip the unicode tag
|
||||
//
|
||||
continue;
|
||||
}
|
||||
if ( EFI_ERROR(Status)
|
||||
|| CharSize == 0
|
||||
|| (CharBuffer == L'\n' && *Ascii == FALSE)
|
||||
|| (CharBuffer == '\n' && *Ascii != FALSE )
|
||||
){
|
||||
if ( EFI_ERROR(Status)
|
||||
|| CharSize == 0
|
||||
|| (CharBuffer == L'\n' && !(*Ascii))
|
||||
|| (CharBuffer == '\n' && *Ascii)
|
||||
){
|
||||
break;
|
||||
}
|
||||
//
|
||||
@ -936,7 +1001,7 @@ FileHandleReadLine(
|
||||
//
|
||||
if ((CountSoFar+1)*sizeof(CHAR16) > *Size){
|
||||
*Size = (CountSoFar+1)*sizeof(CHAR16);
|
||||
if (Truncate == FALSE) {
|
||||
if (!Truncate) {
|
||||
FileHandleSetPosition(Handle, OriginalFilePosition);
|
||||
} else {
|
||||
DEBUG((DEBUG_WARN, "The line was truncated in FileHandleReadLine"));
|
||||
@ -969,7 +1034,8 @@ EFIAPI
|
||||
FileHandleWriteLine(
|
||||
IN EFI_FILE_HANDLE Handle,
|
||||
IN CHAR16 *Buffer
|
||||
){
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINTN Size;
|
||||
|
||||
@ -1031,7 +1097,7 @@ FileHandlePrintLine(
|
||||
Status = FileHandleWriteLine(Handle, Buffer);
|
||||
|
||||
//
|
||||
// Cleanup and return
|
||||
// Cleanup and return
|
||||
//
|
||||
FreePool(Buffer);
|
||||
return (Status);
|
||||
@ -1063,15 +1129,15 @@ FileHandleEof(
|
||||
// ASSERT if Handle is NULL
|
||||
//
|
||||
ASSERT(Handle != NULL);
|
||||
|
||||
|
||||
FileHandleGetPosition(Handle, &Pos);
|
||||
Info = FileHandleGetInfo (Handle);
|
||||
ASSERT(Info != NULL);
|
||||
FileHandleSetPosition(Handle, Pos);
|
||||
|
||||
|
||||
if (Info == NULL) {
|
||||
return (FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
if (Pos == Info->FileSize) {
|
||||
RetVal = TRUE;
|
||||
|
Reference in New Issue
Block a user