OpenCore  1.0.4
OpenCore Bootloader
Loading...
Searching...
No Matches
ReadFile.c
Go to the documentation of this file.
1
15#include <Uefi.h>
16
17#include <Guid/FileInfo.h>
18
19#include <Protocol/SimpleFileSystem.h>
20
21#include <Library/UefiLib.h>
22#include <Library/BaseLib.h>
23#include <Library/BaseMemoryLib.h>
24#include <Library/BaseOverflowLib.h>
25#include <Library/DebugLib.h>
26#include <Library/DevicePathLib.h>
27#include <Library/MemoryAllocationLib.h>
28#include <Library/UefiBootServicesTableLib.h>
30#include <Library/OcFileLib.h>
31
32VOID *
34 IN CONST EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *FileSystem,
35 IN CONST CHAR16 *FilePath,
36 OUT UINT32 *FileSize OPTIONAL,
37 IN CONST UINT32 MaxFileSize OPTIONAL
38 )
39{
40 EFI_STATUS Status;
41 EFI_FILE_HANDLE Volume;
42 EFI_FILE_HANDLE FileHandle;
43 UINT8 *FileBuffer;
44 UINT32 FileBufferSize;
45 UINT32 FileReadSize;
46
47 ASSERT (FileSystem != NULL);
48 ASSERT (FilePath != NULL);
49
50 Status = FileSystem->OpenVolume (
51 (EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *)FileSystem,
52 &Volume
53 );
54 if (EFI_ERROR (Status)) {
55 return NULL;
56 }
57
58 Status = OcSafeFileOpen (
59 Volume,
60 &FileHandle,
62 EFI_FILE_MODE_READ,
63 0
64 );
65
66 Volume->Close (Volume);
67
68 if (EFI_ERROR (Status)) {
69 return NULL;
70 }
71
72 Status = OcGetFileSize (
73 FileHandle,
74 &FileReadSize
75 );
76 if ( EFI_ERROR (Status)
77 || BaseOverflowAddU32 (FileReadSize, sizeof (CHAR16), &FileBufferSize)
78 || ((MaxFileSize > 0) && (FileReadSize > MaxFileSize)))
79 {
80 FileHandle->Close (FileHandle);
81 return NULL;
82 }
83
84 FileBuffer = AllocatePool (FileBufferSize);
85 if (FileBuffer != NULL) {
86 Status = OcGetFileData (
87 FileHandle,
88 0,
89 FileReadSize,
90 FileBuffer
91 );
92
93 if (!EFI_ERROR (Status)) {
94 FileBuffer[FileReadSize] = 0;
95 FileBuffer[FileReadSize + 1] = 0;
96 if (FileSize != NULL) {
97 *FileSize = FileReadSize;
98 }
99 } else {
100 FreePool (FileBuffer);
101 FileBuffer = NULL;
102 }
103 }
104
105 FileHandle->Close (FileHandle);
106 return FileBuffer;
107}
108
109EFI_STATUS
111 IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *FileSystem,
112 IN CONST CHAR16 *FilePath,
113 OUT UINT32 *Size
114 )
115{
116 EFI_STATUS Status;
117 EFI_FILE_HANDLE Volume;
118 EFI_FILE_HANDLE FileHandle;
119
120 ASSERT (FileSystem != NULL);
121 ASSERT (FilePath != NULL);
122 ASSERT (Size != NULL);
123
124 Status = FileSystem->OpenVolume (
125 FileSystem,
126 &Volume
127 );
128 if (EFI_ERROR (Status)) {
129 return Status;
130 }
131
132 Status = OcSafeFileOpen (
133 Volume,
134 &FileHandle,
135 (CHAR16 *)FilePath,
136 EFI_FILE_MODE_READ,
137 0
138 );
139
140 Volume->Close (Volume);
141
142 if (EFI_ERROR (Status)) {
143 return Status;
144 }
145
146 Status = OcGetFileSize (
147 FileHandle,
148 Size
149 );
150
151 return Status;
152}
153
154VOID *
156 IN CONST EFI_FILE_PROTOCOL *RootDirectory,
157 IN CONST CHAR16 *FilePath,
158 OUT UINT32 *FileSize OPTIONAL,
159 IN UINT32 MaxFileSize OPTIONAL
160 )
161{
162 EFI_STATUS Status;
163 EFI_FILE_PROTOCOL *File;
164 UINT32 Size;
165 UINT8 *FileBuffer;
166
167 ASSERT (RootDirectory != NULL);
168 ASSERT (FilePath != NULL);
169
170 Status = OcSafeFileOpen (
171 RootDirectory,
172 &File,
173 FilePath,
174 EFI_FILE_MODE_READ,
175 0
176 );
177
178 if (EFI_ERROR (Status)) {
179 return NULL;
180 }
181
182 Status = OcGetFileSize (File, &Size);
183 if ( EFI_ERROR (Status)
184 || (Size >= MAX_UINT32 - 1)
185 || ((MaxFileSize > 0) && (Size > MaxFileSize)))
186 {
187 File->Close (File);
188 return NULL;
189 }
190
191 FileBuffer = AllocatePool (Size + 2);
192 if (FileBuffer == NULL) {
193 File->Close (File);
194 return NULL;
195 }
196
197 Status = OcGetFileData (File, 0, Size, FileBuffer);
198 File->Close (File);
199 if (EFI_ERROR (Status)) {
200 FreePool (FileBuffer);
201 return NULL;
202 }
203
204 FileBuffer[Size] = 0;
205 FileBuffer[Size + 1] = 0;
206
207 if (FileSize != NULL) {
208 *FileSize = Size;
209 }
210
211 return FileBuffer;
212}
DMG_FILEPATH_DEVICE_PATH FilePath
DMG_SIZE_DEVICE_PATH Size
EFI_STATUS OcGetFileSize(IN EFI_FILE_PROTOCOL *File, OUT UINT32 *Size)
EFI_STATUS OcGetFileData(IN EFI_FILE_PROTOCOL *File, IN UINT32 Position, IN UINT32 Size, OUT UINT8 *Buffer)
EFI_STATUS OcSafeFileOpen(IN CONST EFI_FILE_PROTOCOL *Directory, OUT EFI_FILE_PROTOCOL **NewHandle, IN CONST CHAR16 *FileName, IN CONST UINT64 OpenMode, IN CONST UINT64 Attributes)
Definition OpenFile.c:29
VOID * OcReadFileFromDirectory(IN CONST EFI_FILE_PROTOCOL *RootDirectory, IN CONST CHAR16 *FilePath, OUT UINT32 *FileSize OPTIONAL, IN UINT32 MaxFileSize OPTIONAL)
Definition ReadFile.c:155
EFI_STATUS OcReadFileSize(IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *FileSystem, IN CONST CHAR16 *FilePath, OUT UINT32 *Size)
Definition ReadFile.c:110
VOID * OcReadFile(IN CONST EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *FileSystem, IN CONST CHAR16 *FilePath, OUT UINT32 *FileSize OPTIONAL, IN CONST UINT32 MaxFileSize OPTIONAL)
Definition ReadFile.c:33
#define ASSERT(x)
Definition coder.h:55