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