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