1 /** @file
2   Internal file explorer helper functions for RamDiskDxe driver.
3 
4   Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>
5   SPDX-License-Identifier: BSD-2-Clause-Patent
6 
7 **/
8 
9 #include "RamDiskImpl.h"
10 
11 
12 /**
13   Helper function called as part of the code needed to allocate the proper
14   sized buffer for various EFI interfaces.
15 
16   @param[in, out] Status     Current status.
17   @param[in, out] Buffer     Current allocated buffer, or NULL.
18   @param[in]      BufferSize Current buffer size needed.
19 
20   @retval  TRUE         If the buffer was reallocated and the caller should
21                         try the API again.
22   @retval  FALSE        The caller should not call this function again.
23 
24 **/
25 BOOLEAN
GrowBuffer(IN OUT EFI_STATUS * Status,IN OUT VOID ** Buffer,IN UINTN BufferSize)26 GrowBuffer (
27   IN OUT EFI_STATUS   *Status,
28   IN OUT VOID         **Buffer,
29   IN UINTN            BufferSize
30   )
31 {
32   BOOLEAN TryAgain;
33 
34   //
35   // If this is an initial request, buffer will be null with a new buffer size
36   //
37   if ((*Buffer == NULL) && (BufferSize != 0)) {
38     *Status = EFI_BUFFER_TOO_SMALL;
39   }
40   //
41   // If the status code is "buffer too small", resize the buffer
42   //
43   TryAgain = FALSE;
44   if (*Status == EFI_BUFFER_TOO_SMALL) {
45 
46     if (*Buffer != NULL) {
47       FreePool (*Buffer);
48     }
49 
50     *Buffer = AllocateZeroPool (BufferSize);
51 
52     if (*Buffer != NULL) {
53       TryAgain = TRUE;
54     } else {
55       *Status = EFI_OUT_OF_RESOURCES;
56     }
57   }
58   //
59   // If there's an error, free the buffer
60   //
61   if (!TryAgain && EFI_ERROR (*Status) && (*Buffer != NULL)) {
62     FreePool (*Buffer);
63     *Buffer = NULL;
64   }
65 
66   return TryAgain;
67 }
68 
69 
70 /**
71   This function gets the file information from an open file descriptor,
72   and stores it in a buffer allocated from pool.
73 
74   @param[in] FHand           File Handle.
75 
76   @return    A pointer to a buffer with file information or NULL is returned.
77 
78 **/
79 EFI_FILE_INFO *
FileInfo(IN EFI_FILE_HANDLE FHand)80 FileInfo (
81   IN EFI_FILE_HANDLE                        FHand
82   )
83 {
84   EFI_STATUS                           Status;
85   EFI_FILE_INFO                        *Buffer;
86   UINTN                                BufferSize;
87 
88   //
89   // Initialize for GrowBuffer loop
90   //
91   Buffer      = NULL;
92   BufferSize  = SIZE_OF_EFI_FILE_INFO + 200;
93 
94   //
95   // Call the real function
96   //
97   while (GrowBuffer (&Status, (VOID **) &Buffer, BufferSize)) {
98     Status = FHand->GetInfo (
99                       FHand,
100                       &gEfiFileInfoGuid,
101                       &BufferSize,
102                       Buffer
103                       );
104   }
105 
106   return Buffer;
107 }
108