mirror of
https://github.com/CloverHackyColor/CloverBootloader.git
synced 2024-11-24 11:45:27 +01:00
108 lines
2.5 KiB
C
108 lines
2.5 KiB
C
|
/** @file
|
||
|
Internal file explorer helper functions for RamDiskDxe driver.
|
||
|
|
||
|
Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>
|
||
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||
|
|
||
|
**/
|
||
|
|
||
|
#include "RamDiskImpl.h"
|
||
|
|
||
|
|
||
|
/**
|
||
|
Helper function called as part of the code needed to allocate the proper
|
||
|
sized buffer for various EFI interfaces.
|
||
|
|
||
|
@param[in, out] Status Current status.
|
||
|
@param[in, out] Buffer Current allocated buffer, or NULL.
|
||
|
@param[in] BufferSize Current buffer size needed.
|
||
|
|
||
|
@retval TRUE If the buffer was reallocated and the caller should
|
||
|
try the API again.
|
||
|
@retval FALSE The caller should not call this function again.
|
||
|
|
||
|
**/
|
||
|
BOOLEAN
|
||
|
GrowBuffer (
|
||
|
IN OUT EFI_STATUS *Status,
|
||
|
IN OUT VOID **Buffer,
|
||
|
IN UINTN BufferSize
|
||
|
)
|
||
|
{
|
||
|
BOOLEAN TryAgain;
|
||
|
|
||
|
//
|
||
|
// If this is an initial request, buffer will be null with a new buffer size
|
||
|
//
|
||
|
if ((*Buffer == NULL) && (BufferSize != 0)) {
|
||
|
*Status = EFI_BUFFER_TOO_SMALL;
|
||
|
}
|
||
|
//
|
||
|
// If the status code is "buffer too small", resize the buffer
|
||
|
//
|
||
|
TryAgain = FALSE;
|
||
|
if (*Status == EFI_BUFFER_TOO_SMALL) {
|
||
|
|
||
|
if (*Buffer != NULL) {
|
||
|
FreePool (*Buffer);
|
||
|
}
|
||
|
|
||
|
*Buffer = AllocateZeroPool (BufferSize);
|
||
|
|
||
|
if (*Buffer != NULL) {
|
||
|
TryAgain = TRUE;
|
||
|
} else {
|
||
|
*Status = EFI_OUT_OF_RESOURCES;
|
||
|
}
|
||
|
}
|
||
|
//
|
||
|
// If there's an error, free the buffer
|
||
|
//
|
||
|
if (!TryAgain && EFI_ERROR (*Status) && (*Buffer != NULL)) {
|
||
|
FreePool (*Buffer);
|
||
|
*Buffer = NULL;
|
||
|
}
|
||
|
|
||
|
return TryAgain;
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
This function gets the file information from an open file descriptor,
|
||
|
and stores it in a buffer allocated from pool.
|
||
|
|
||
|
@param[in] FHand File Handle.
|
||
|
|
||
|
@return A pointer to a buffer with file information or NULL is returned.
|
||
|
|
||
|
**/
|
||
|
EFI_FILE_INFO *
|
||
|
FileInfo (
|
||
|
IN EFI_FILE_HANDLE FHand
|
||
|
)
|
||
|
{
|
||
|
EFI_STATUS Status;
|
||
|
EFI_FILE_INFO *Buffer;
|
||
|
UINTN BufferSize;
|
||
|
|
||
|
//
|
||
|
// Initialize for GrowBuffer loop
|
||
|
//
|
||
|
Buffer = NULL;
|
||
|
BufferSize = SIZE_OF_EFI_FILE_INFO + 200;
|
||
|
|
||
|
//
|
||
|
// Call the real function
|
||
|
//
|
||
|
while (GrowBuffer (&Status, (VOID **) &Buffer, BufferSize)) {
|
||
|
Status = FHand->GetInfo (
|
||
|
FHand,
|
||
|
&gEfiFileInfoGuid,
|
||
|
&BufferSize,
|
||
|
Buffer
|
||
|
);
|
||
|
}
|
||
|
|
||
|
return Buffer;
|
||
|
}
|