]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/EbcDxe/EbcDebugger/EdbSupportFile.c
MdeModulePkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / MdeModulePkg / Universal / EbcDxe / EbcDebugger / EdbSupportFile.c
CommitLineData
e8a5ac7c 1/** @file\r
748edcd5 2\r
e8a5ac7c 3Copyright (c) 2007, Intel Corporation. All rights reserved.<BR>\r
9d510e61 4SPDX-License-Identifier: BSD-2-Clause-Patent\r
748edcd5 5\r
748edcd5 6\r
e8a5ac7c 7**/\r
748edcd5 8\r
e8a5ac7c 9#include "Edb.h"\r
748edcd5 10\r
e8a5ac7c
DB
11/**\r
12 Read a file.\r
748edcd5 13\r
e8a5ac7c
DB
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
748edcd5 18\r
e8a5ac7c
DB
19 @retval EFI_SUCCESS - read file successfully\r
20 @retval EFI_NOT_FOUND - file not found\r
748edcd5 21\r
e8a5ac7c 22**/\r
748edcd5
PB
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
748edcd5
PB
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
e8a5ac7c
DB
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
748edcd5
PB
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
748edcd5
PB
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 // Read file directly from Vol\r
175 //\r
176 return ReadFileFromVol (DebuggerPrivate->Vol, FileName, BufferSize, Buffer);\r
177 }\r
178\r
179 //\r
180 // need scan fs\r
181 //\r
182\r
183 //\r
184 // Get all Vol handle\r
185 //\r
186 Status = gBS->LocateHandleBuffer (\r
187 ByProtocol,\r
188 &gEfiSimpleFileSystemProtocolGuid,\r
189 NULL,\r
190 &NoHandles,\r
191 &HandleBuffer\r
192 );\r
193 if (EFI_ERROR (Status) && (NoHandles == 0)) {\r
194 return EFI_NOT_FOUND;\r
195 }\r
196\r
197 //\r
198 // Walk through each Vol\r
199 //\r
200 DebuggerPrivate->Vol = NULL;\r
201 *BufferSize = 0;\r
202 *Buffer = NULL;\r
203 for (Index = 0; Index < NoHandles; Index++) {\r
204 Status = gBS->HandleProtocol (\r
205 HandleBuffer[Index],\r
206 &gEfiSimpleFileSystemProtocolGuid,\r
207 (VOID**) &Vol\r
208 );\r
209 if (EFI_ERROR(Status)) {\r
210 continue;\r
211 }\r
212\r
213 Status = ReadFileFromVol (Vol, FileName, &TempBufferSize, &TempBuffer);\r
214 if (!EFI_ERROR (Status)) {\r
215 //\r
216 // Read file OK, check duplication\r
217 //\r
218 if (DebuggerPrivate->Vol != NULL) {\r
219 //\r
220 // Find the duplicated file\r
221 //\r
222 gBS->FreePool (TempBuffer);\r
223 gBS->FreePool (*Buffer);\r
224 EDBPrint (L"Duplicated FileName found!\n");\r
225 return EFI_NO_MAPPING;\r
226 } else {\r
227 //\r
228 // Record value\r
229 //\r
230 DebuggerPrivate->Vol = Vol;\r
231 *BufferSize = TempBufferSize;\r
232 *Buffer = TempBuffer;\r
233 }\r
234 }\r
235 }\r
236\r
237 //\r
238 // Scan Fs done\r
239 //\r
240 if (DebuggerPrivate->Vol == NULL) {\r
241 return EFI_NOT_FOUND;\r
242 }\r
243\r
244 //\r
245 // Done\r
246 //\r
247 return EFI_SUCCESS;\r
248}\r
249\r
e8a5ac7c
DB
250/**\r
251\r
252 Get file name under this dir with index\r
253\r
254 @param DebuggerPrivate - EBC Debugger private data structure\r
255 @param DirName - The dir to be read.\r
256 @param FileName - The file name pattern under this dir\r
257 @param Index - The file index under this dir\r
258\r
259 @return File Name which match the pattern and index.\r
260\r
261**/\r
748edcd5
PB
262CHAR16 *\r
263EFIAPI\r
264GetFileNameUnderDir (\r
265 IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,\r
266 IN CHAR16 *DirName,\r
267 IN CHAR16 *FileName,\r
268 IN OUT UINTN *Index\r
269 )\r
748edcd5
PB
270{\r
271 EFI_STATUS Status;\r
272 EFI_FILE_HANDLE RootDir;\r
273 EFI_FILE_HANDLE Handle;\r
274 UINTN FileInfoSize;\r
275 EFI_FILE_INFO *FileInfo;\r
276 EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *Vol;\r
277 VOID *TempName;\r
278 UINTN FileIndex;\r
279\r
280 if (DebuggerPrivate->Vol == NULL) {\r
281 Status = gBS->LocateProtocol (\r
282 &gEfiSimpleFileSystemProtocolGuid,\r
283 NULL,\r
284 (VOID**) &DebuggerPrivate->Vol\r
285 );\r
286 if (EFI_ERROR(Status)) {\r
287 return NULL;\r
288 }\r
289 }\r
290 Vol = DebuggerPrivate->Vol;\r
291\r
292 //\r
293 // Open the root directory\r
294 //\r
295 Status = Vol->OpenVolume (Vol, &RootDir);\r
296 if (EFI_ERROR (Status)) {\r
297 return NULL;\r
298 }\r
299\r
300 //\r
301 // Open the file\r
302 //\r
303 Status = RootDir->Open (\r
304 RootDir,\r
305 &Handle,\r
306 DirName,\r
307 EFI_FILE_MODE_READ,\r
308 EFI_FILE_DIRECTORY\r
309 );\r
310 if (EFI_ERROR (Status)) {\r
311 RootDir->Close (RootDir);\r
312 return NULL;\r
313 }\r
314 RootDir->Close (RootDir);\r
315\r
316 //\r
317 // Set Dir Position\r
318 //\r
319 Status = Handle->SetPosition (Handle, 0);\r
320 if (EFI_ERROR (Status)) {\r
321 Handle->Close (Handle);\r
322 return NULL;\r
323 }\r
324\r
325 //\r
326 // Get the file information\r
327 //\r
328 FileInfoSize = sizeof(EFI_FILE_INFO) + 1024;\r
329\r
330 FileInfo = AllocateZeroPool (FileInfoSize);\r
331 if (FileInfo == NULL) {\r
332 Handle->Close (Handle);\r
333 return NULL;\r
334 }\r
335\r
336 //\r
337 // Walk through each file in the directory\r
338 //\r
339 FileIndex = 0;\r
340 TempName = NULL;\r
341 while (TRUE) {\r
342 //\r
343 // Read a file entry\r
344 //\r
345 FileInfoSize = sizeof(EFI_FILE_INFO) + 1024;\r
346\r
347 Status = Handle->Read (\r
348 Handle,\r
349 &FileInfoSize,\r
350 FileInfo\r
351 );\r
352 if (EFI_ERROR (Status) || (FileInfoSize == 0)) {\r
353 break;\r
354 }\r
355\r
356 if ((FileInfo->Attribute & EFI_FILE_DIRECTORY) == 0) {\r
357 //\r
358 // This is a file\r
359 //\r
360\r
361 //\r
362 // Only deal with the EFI key file\r
363 //\r
364 if (!StrEndWith (FileInfo->FileName, FileName)) {\r
365 continue;\r
366 }\r
367\r
368 if (FileIndex == *Index) {\r
369 TempName = StrDuplicate (FileInfo->FileName);\r
370 *Index = *Index + 1;\r
371 break;\r
372 }\r
373 FileIndex ++;\r
374 }\r
375 }\r
376\r
377 //\r
378 // Free resources\r
379 //\r
380 gBS->FreePool (FileInfo);\r
381 Handle->Close (Handle);\r
382\r
383 return TempName;\r
384}\r