]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - MdeModulePkg/Universal/EbcDxe/EbcDebugger/EdbSupportFile.c
MdeModulePkg: Apply uncrustify changes
[mirror_edk2.git] / MdeModulePkg / Universal / EbcDxe / EbcDebugger / EdbSupportFile.c
... / ...
CommitLineData
1/** @file\r
2\r
3Copyright (c) 2007, Intel Corporation. All rights reserved.<BR>\r
4SPDX-License-Identifier: BSD-2-Clause-Patent\r
5\r
6\r
7**/\r
8\r
9#include "Edb.h"\r
10\r
11/**\r
12 Read a file.\r
13\r
14 @param Vol - File System Volume\r
15 @param FileName - The file to be read.\r
16 @param BufferSize - The file buffer size\r
17 @param Buffer - The file buffer\r
18\r
19 @retval EFI_SUCCESS - read file successfully\r
20 @retval EFI_NOT_FOUND - file not found\r
21\r
22**/\r
23EFI_STATUS\r
24EFIAPI\r
25ReadFileFromVol (\r
26 IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *Vol,\r
27 IN CHAR16 *FileName,\r
28 OUT UINTN *BufferSize,\r
29 OUT VOID **Buffer\r
30 )\r
31{\r
32 EFI_STATUS Status;\r
33 EFI_FILE_HANDLE RootDir;\r
34 EFI_FILE_HANDLE Handle;\r
35 UINTN FileInfoSize;\r
36 EFI_FILE_INFO *FileInfo;\r
37 UINTN TempBufferSize;\r
38 VOID *TempBuffer;\r
39\r
40 //\r
41 // Open the root directory\r
42 //\r
43 Status = Vol->OpenVolume (Vol, &RootDir);\r
44 if (EFI_ERROR (Status)) {\r
45 return Status;\r
46 }\r
47\r
48 //\r
49 // Open the file\r
50 //\r
51 Status = RootDir->Open (\r
52 RootDir,\r
53 &Handle,\r
54 FileName,\r
55 EFI_FILE_MODE_READ,\r
56 0\r
57 );\r
58 if (EFI_ERROR (Status)) {\r
59 RootDir->Close (RootDir);\r
60 return Status;\r
61 }\r
62\r
63 RootDir->Close (RootDir);\r
64\r
65 //\r
66 // Get the file information\r
67 //\r
68 FileInfoSize = sizeof (EFI_FILE_INFO) + 1024;\r
69\r
70 FileInfo = AllocateZeroPool (FileInfoSize);\r
71 if (FileInfo == NULL) {\r
72 Handle->Close (Handle);\r
73 return Status;\r
74 }\r
75\r
76 Status = Handle->GetInfo (\r
77 Handle,\r
78 &gEfiFileInfoGuid,\r
79 &FileInfoSize,\r
80 FileInfo\r
81 );\r
82 if (EFI_ERROR (Status)) {\r
83 Handle->Close (Handle);\r
84 gBS->FreePool (FileInfo);\r
85 return Status;\r
86 }\r
87\r
88 //\r
89 // Allocate buffer for the file data. The last CHAR16 is for L'\0'\r
90 //\r
91 TempBufferSize = (UINTN)FileInfo->FileSize + sizeof (CHAR16);\r
92 TempBuffer = AllocateZeroPool (TempBufferSize);\r
93 if (TempBuffer == NULL) {\r
94 Handle->Close (Handle);\r
95 gBS->FreePool (FileInfo);\r
96 return Status;\r
97 }\r
98\r
99 gBS->FreePool (FileInfo);\r
100\r
101 //\r
102 // Read the file data to the buffer\r
103 //\r
104 Status = Handle->Read (\r
105 Handle,\r
106 &TempBufferSize,\r
107 TempBuffer\r
108 );\r
109 if (EFI_ERROR (Status)) {\r
110 Handle->Close (Handle);\r
111 gBS->FreePool (TempBuffer);\r
112 return Status;\r
113 }\r
114\r
115 Handle->Close (Handle);\r
116\r
117 *BufferSize = TempBufferSize;\r
118 *Buffer = TempBuffer;\r
119 return EFI_SUCCESS;\r
120}\r
121\r
122/**\r
123\r
124 Read a file.\r
125 If ScanFs is FLASE, it will use DebuggerPrivate->Vol as default Fs.\r
126 If ScanFs is TRUE, it will scan all FS and check the file.\r
127 If there is only one file match the name, it will be read.\r
128 If there is more than one file match the name, it will return Error.\r
129\r
130 @param DebuggerPrivate - EBC Debugger private data structure\r
131 @param FileName - The file to be read.\r
132 @param BufferSize - The file buffer size\r
133 @param Buffer - The file buffer\r
134 @param ScanFs - Need Scan all FS\r
135\r
136 @retval EFI_SUCCESS - read file successfully\r
137 @retval EFI_NOT_FOUND - file not found\r
138 @retval EFI_NO_MAPPING - there is duplicated files found\r
139\r
140**/\r
141EFI_STATUS\r
142EFIAPI\r
143ReadFileToBuffer (\r
144 IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,\r
145 IN CHAR16 *FileName,\r
146 OUT UINTN *BufferSize,\r
147 OUT VOID **Buffer,\r
148 IN BOOLEAN ScanFs\r
149 )\r
150{\r
151 EFI_STATUS Status;\r
152 EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *Vol;\r
153 UINTN TempBufferSize;\r
154 VOID *TempBuffer;\r
155 UINTN NoHandles;\r
156 EFI_HANDLE *HandleBuffer;\r
157 UINTN Index;\r
158\r
159 //\r
160 // Check parameters\r
161 //\r
162 if ((FileName == NULL) || (Buffer == NULL)) {\r
163 return EFI_INVALID_PARAMETER;\r
164 }\r
165\r
166 //\r
167 // not scan fs\r
168 //\r
169 if (!ScanFs) {\r
170 if (DebuggerPrivate->Vol == NULL) {\r
171 return EFI_INVALID_PARAMETER;\r
172 }\r
173\r
174 //\r
175 // Read file directly from Vol\r
176 //\r
177 return ReadFileFromVol (DebuggerPrivate->Vol, FileName, BufferSize, Buffer);\r
178 }\r
179\r
180 //\r
181 // need scan fs\r
182 //\r
183\r
184 //\r
185 // Get all Vol handle\r
186 //\r
187 Status = gBS->LocateHandleBuffer (\r
188 ByProtocol,\r
189 &gEfiSimpleFileSystemProtocolGuid,\r
190 NULL,\r
191 &NoHandles,\r
192 &HandleBuffer\r
193 );\r
194 if (EFI_ERROR (Status) && (NoHandles == 0)) {\r
195 return EFI_NOT_FOUND;\r
196 }\r
197\r
198 //\r
199 // Walk through each Vol\r
200 //\r
201 DebuggerPrivate->Vol = NULL;\r
202 *BufferSize = 0;\r
203 *Buffer = NULL;\r
204 for (Index = 0; Index < NoHandles; Index++) {\r
205 Status = gBS->HandleProtocol (\r
206 HandleBuffer[Index],\r
207 &gEfiSimpleFileSystemProtocolGuid,\r
208 (VOID **)&Vol\r
209 );\r
210 if (EFI_ERROR (Status)) {\r
211 continue;\r
212 }\r
213\r
214 Status = ReadFileFromVol (Vol, FileName, &TempBufferSize, &TempBuffer);\r
215 if (!EFI_ERROR (Status)) {\r
216 //\r
217 // Read file OK, check duplication\r
218 //\r
219 if (DebuggerPrivate->Vol != NULL) {\r
220 //\r
221 // Find the duplicated file\r
222 //\r
223 gBS->FreePool (TempBuffer);\r
224 gBS->FreePool (*Buffer);\r
225 EDBPrint (L"Duplicated FileName found!\n");\r
226 return EFI_NO_MAPPING;\r
227 } else {\r
228 //\r
229 // Record value\r
230 //\r
231 DebuggerPrivate->Vol = Vol;\r
232 *BufferSize = TempBufferSize;\r
233 *Buffer = TempBuffer;\r
234 }\r
235 }\r
236 }\r
237\r
238 //\r
239 // Scan Fs done\r
240 //\r
241 if (DebuggerPrivate->Vol == NULL) {\r
242 return EFI_NOT_FOUND;\r
243 }\r
244\r
245 //\r
246 // Done\r
247 //\r
248 return EFI_SUCCESS;\r
249}\r
250\r
251/**\r
252\r
253 Get file name under this dir with index\r
254\r
255 @param DebuggerPrivate - EBC Debugger private data structure\r
256 @param DirName - The dir to be read.\r
257 @param FileName - The file name pattern under this dir\r
258 @param Index - The file index under this dir\r
259\r
260 @return File Name which match the pattern and index.\r
261\r
262**/\r
263CHAR16 *\r
264EFIAPI\r
265GetFileNameUnderDir (\r
266 IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,\r
267 IN CHAR16 *DirName,\r
268 IN CHAR16 *FileName,\r
269 IN OUT UINTN *Index\r
270 )\r
271{\r
272 EFI_STATUS Status;\r
273 EFI_FILE_HANDLE RootDir;\r
274 EFI_FILE_HANDLE Handle;\r
275 UINTN FileInfoSize;\r
276 EFI_FILE_INFO *FileInfo;\r
277 EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *Vol;\r
278 VOID *TempName;\r
279 UINTN FileIndex;\r
280\r
281 if (DebuggerPrivate->Vol == NULL) {\r
282 Status = gBS->LocateProtocol (\r
283 &gEfiSimpleFileSystemProtocolGuid,\r
284 NULL,\r
285 (VOID **)&DebuggerPrivate->Vol\r
286 );\r
287 if (EFI_ERROR (Status)) {\r
288 return NULL;\r
289 }\r
290 }\r
291\r
292 Vol = DebuggerPrivate->Vol;\r
293\r
294 //\r
295 // Open the root directory\r
296 //\r
297 Status = Vol->OpenVolume (Vol, &RootDir);\r
298 if (EFI_ERROR (Status)) {\r
299 return NULL;\r
300 }\r
301\r
302 //\r
303 // Open the file\r
304 //\r
305 Status = RootDir->Open (\r
306 RootDir,\r
307 &Handle,\r
308 DirName,\r
309 EFI_FILE_MODE_READ,\r
310 EFI_FILE_DIRECTORY\r
311 );\r
312 if (EFI_ERROR (Status)) {\r
313 RootDir->Close (RootDir);\r
314 return NULL;\r
315 }\r
316\r
317 RootDir->Close (RootDir);\r
318\r
319 //\r
320 // Set Dir Position\r
321 //\r
322 Status = Handle->SetPosition (Handle, 0);\r
323 if (EFI_ERROR (Status)) {\r
324 Handle->Close (Handle);\r
325 return NULL;\r
326 }\r
327\r
328 //\r
329 // Get the file information\r
330 //\r
331 FileInfoSize = sizeof (EFI_FILE_INFO) + 1024;\r
332\r
333 FileInfo = AllocateZeroPool (FileInfoSize);\r
334 if (FileInfo == NULL) {\r
335 Handle->Close (Handle);\r
336 return NULL;\r
337 }\r
338\r
339 //\r
340 // Walk through each file in the directory\r
341 //\r
342 FileIndex = 0;\r
343 TempName = NULL;\r
344 while (TRUE) {\r
345 //\r
346 // Read a file entry\r
347 //\r
348 FileInfoSize = sizeof (EFI_FILE_INFO) + 1024;\r
349\r
350 Status = Handle->Read (\r
351 Handle,\r
352 &FileInfoSize,\r
353 FileInfo\r
354 );\r
355 if (EFI_ERROR (Status) || (FileInfoSize == 0)) {\r
356 break;\r
357 }\r
358\r
359 if ((FileInfo->Attribute & EFI_FILE_DIRECTORY) == 0) {\r
360 //\r
361 // This is a file\r
362 //\r
363\r
364 //\r
365 // Only deal with the EFI key file\r
366 //\r
367 if (!StrEndWith (FileInfo->FileName, FileName)) {\r
368 continue;\r
369 }\r
370\r
371 if (FileIndex == *Index) {\r
372 TempName = StrDuplicate (FileInfo->FileName);\r
373 *Index = *Index + 1;\r
374 break;\r
375 }\r
376\r
377 FileIndex++;\r
378 }\r
379 }\r
380\r
381 //\r
382 // Free resources\r
383 //\r
384 gBS->FreePool (FileInfo);\r
385 Handle->Close (Handle);\r
386\r
387 return TempName;\r
388}\r