]> git.proxmox.com Git - mirror_edk2.git/blob - MdeModulePkg/Universal/Disk/RamDiskDxe/RamDiskFileExplorer.c
3a000389f033a6595d9b4d6b7d45c9e460bf6a47
[mirror_edk2.git] / MdeModulePkg / Universal / Disk / RamDiskDxe / RamDiskFileExplorer.c
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
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 *
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 }