]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c
ShellPkg/dh: Modify the dump of BusSpecificDriverOverride protocol
[mirror_edk2.git] / ShellPkg / Library / UefiHandleParsingLib / UefiHandleParsingLib.c
CommitLineData
a405b86d 1/** @file\r
2 Provides interface to advanced shell functionality for parsing both handle and protocol database.\r
3\r
d4ec9a57 4 Copyright (c) 2010 - 2017, Intel Corporation. All rights reserved.<BR>\r
256aa6d0 5 (C) Copyright 2013-2015 Hewlett-Packard Development Company, L.P.<BR>\r
8985d612 6 (C) Copyright 2015-2016 Hewlett Packard Enterprise Development LP<BR>\r
a405b86d 7 This program and the accompanying materials\r
8 are licensed and made available under the terms and conditions of the BSD License\r
9 which accompanies this distribution. The full text of the license may be found at\r
10 http://opensource.org/licenses/bsd-license.php\r
11\r
12 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
13 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
14\r
15**/\r
16\r
17#include "UefiHandleParsingLib.h"\r
f4f3c6bf 18#include "IndustryStandard/Acpi10.h"\r
f4ac4354
JW
19#include <PiDxe.h>\r
20#include <Protocol/FirmwareVolume2.h>\r
a405b86d 21\r
e7e0e42b 22EFI_HANDLE mHandleParsingHiiHandle = NULL;\r
a405b86d 23HANDLE_INDEX_LIST mHandleList = {{{NULL,NULL},0,0},0};\r
d4ec9a57
RN
24GUID_INFO_BLOCK *mGuidList;\r
25UINTN mGuidListCount;\r
f4ac4354
JW
26\r
27/**\r
28 Function to find the file name associated with a LoadedImageProtocol.\r
29\r
30 @param[in] LoadedImage An instance of LoadedImageProtocol.\r
31\r
32 @retval A string representation of the file name associated\r
33 with LoadedImage, or NULL if no name can be found.\r
34**/\r
35CHAR16*\r
36FindLoadedImageFileName (\r
37 IN EFI_LOADED_IMAGE_PROTOCOL *LoadedImage\r
38 )\r
39{\r
40 EFI_GUID *NameGuid;\r
41 EFI_STATUS Status;\r
42 EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv;\r
43 VOID *Buffer;\r
44 UINTN BufferSize;\r
45 UINT32 AuthenticationStatus;\r
46\r
47 if ((LoadedImage == NULL) || (LoadedImage->FilePath == NULL)) {\r
48 return NULL;\r
49 }\r
50\r
51 NameGuid = EfiGetNameGuidFromFwVolDevicePathNode((MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *)LoadedImage->FilePath);\r
52\r
53 if (NameGuid == NULL) {\r
54 return NULL;\r
55 }\r
56\r
57 //\r
58 // Get the FirmwareVolume2Protocol of the device handle that this image was loaded from.\r
59 //\r
60 Status = gBS->HandleProtocol (LoadedImage->DeviceHandle, &gEfiFirmwareVolume2ProtocolGuid, (VOID**) &Fv);\r
61\r
62 //\r
63 // FirmwareVolume2Protocol is PI, and is not required to be available.\r
64 //\r
65 if (EFI_ERROR (Status)) {\r
66 return NULL;\r
67 }\r
68\r
69 //\r
70 // Read the user interface section of the image.\r
71 //\r
72 Buffer = NULL;\r
73 Status = Fv->ReadSection(Fv, NameGuid, EFI_SECTION_USER_INTERFACE, 0, &Buffer, &BufferSize, &AuthenticationStatus);\r
74\r
75 if (EFI_ERROR (Status)) {\r
76 return NULL;\r
77 }\r
78\r
79 //\r
80 // ReadSection returns just the section data, without any section header. For\r
81 // a user interface section, the only data is the file name.\r
82 //\r
83 return Buffer;\r
84}\r
85\r
efb76d1a
JC
86/**\r
87 Function to translate the EFI_MEMORY_TYPE into a string.\r
88\r
89 @param[in] Memory The memory type.\r
90\r
91 @retval A string representation of the type allocated from BS Pool.\r
92**/\r
93CHAR16*\r
efb76d1a
JC
94ConvertMemoryType (\r
95 IN CONST EFI_MEMORY_TYPE Memory\r
96 )\r
97{\r
98 CHAR16 *RetVal;\r
99 RetVal = NULL;\r
100\r
101 switch (Memory) {\r
102 case EfiReservedMemoryType: StrnCatGrow(&RetVal, NULL, L"EfiReservedMemoryType", 0); break;\r
103 case EfiLoaderCode: StrnCatGrow(&RetVal, NULL, L"EfiLoaderCode", 0); break;\r
104 case EfiLoaderData: StrnCatGrow(&RetVal, NULL, L"EfiLoaderData", 0); break;\r
105 case EfiBootServicesCode: StrnCatGrow(&RetVal, NULL, L"EfiBootServicesCode", 0); break;\r
106 case EfiBootServicesData: StrnCatGrow(&RetVal, NULL, L"EfiBootServicesData", 0); break;\r
107 case EfiRuntimeServicesCode: StrnCatGrow(&RetVal, NULL, L"EfiRuntimeServicesCode", 0); break;\r
108 case EfiRuntimeServicesData: StrnCatGrow(&RetVal, NULL, L"EfiRuntimeServicesData", 0); break;\r
109 case EfiConventionalMemory: StrnCatGrow(&RetVal, NULL, L"EfiConventionalMemory", 0); break;\r
110 case EfiUnusableMemory: StrnCatGrow(&RetVal, NULL, L"EfiUnusableMemory", 0); break;\r
111 case EfiACPIReclaimMemory: StrnCatGrow(&RetVal, NULL, L"EfiACPIReclaimMemory", 0); break;\r
112 case EfiACPIMemoryNVS: StrnCatGrow(&RetVal, NULL, L"EfiACPIMemoryNVS", 0); break;\r
113 case EfiMemoryMappedIO: StrnCatGrow(&RetVal, NULL, L"EfiMemoryMappedIO", 0); break;\r
114 case EfiMemoryMappedIOPortSpace: StrnCatGrow(&RetVal, NULL, L"EfiMemoryMappedIOPortSpace", 0); break;\r
115 case EfiPalCode: StrnCatGrow(&RetVal, NULL, L"EfiPalCode", 0); break;\r
116 case EfiMaxMemoryType: StrnCatGrow(&RetVal, NULL, L"EfiMaxMemoryType", 0); break;\r
117 default: ASSERT(FALSE);\r
118 }\r
119 return (RetVal);\r
120}\r
121\r
609e0c58
JC
122/**\r
123 Function to translate the EFI_GRAPHICS_PIXEL_FORMAT into a string.\r
124\r
9145d314 125 @param[in] Fmt The format type.\r
609e0c58
JC
126\r
127 @retval A string representation of the type allocated from BS Pool.\r
128**/\r
129CHAR16*\r
609e0c58
JC
130ConvertPixelFormat (\r
131 IN CONST EFI_GRAPHICS_PIXEL_FORMAT Fmt\r
132 )\r
133{\r
134 CHAR16 *RetVal;\r
135 RetVal = NULL;\r
136\r
137 switch (Fmt) {\r
138 case PixelRedGreenBlueReserved8BitPerColor: StrnCatGrow(&RetVal, NULL, L"PixelRedGreenBlueReserved8BitPerColor", 0); break;\r
139 case PixelBlueGreenRedReserved8BitPerColor: StrnCatGrow(&RetVal, NULL, L"PixelBlueGreenRedReserved8BitPerColor", 0); break;\r
140 case PixelBitMask: StrnCatGrow(&RetVal, NULL, L"PixelBitMask", 0); break;\r
141 case PixelBltOnly: StrnCatGrow(&RetVal, NULL, L"PixelBltOnly", 0); break;\r
142 case PixelFormatMax: StrnCatGrow(&RetVal, NULL, L"PixelFormatMax", 0); break;\r
143 default: ASSERT(FALSE);\r
144 }\r
145 return (RetVal);\r
146}\r
147\r
a405b86d 148/**\r
149 Constructor for the library.\r
150\r
151 @param[in] ImageHandle Ignored.\r
152 @param[in] SystemTable Ignored.\r
153\r
154 @retval EFI_SUCCESS The operation was successful.\r
155**/\r
156EFI_STATUS\r
157EFIAPI\r
158HandleParsingLibConstructor (\r
159 IN EFI_HANDLE ImageHandle,\r
160 IN EFI_SYSTEM_TABLE *SystemTable\r
161 )\r
162{\r
d4ec9a57
RN
163 mGuidListCount = 0;\r
164 mGuidList = NULL;\r
6306fd90 165\r
e7e0e42b
CP
166 //\r
167 // Do nothing with mHandleParsingHiiHandle. Initialize HII as needed.\r
168 //\r
169 return (EFI_SUCCESS);\r
170}\r
171\r
1a6f74d9 172/**\r
e7e0e42b 173 Initialization function for HII packages.\r
1a6f74d9 174\r
e7e0e42b
CP
175**/\r
176VOID\r
177HandleParsingHiiInit (VOID)\r
178{\r
a405b86d 179 if (mHandleParsingHiiHandle == NULL) {\r
e7e0e42b
CP
180 mHandleParsingHiiHandle = HiiAddPackages (&gHandleParsingHiiGuid, gImageHandle, UefiHandleParsingLibStrings, NULL);\r
181 ASSERT (mHandleParsingHiiHandle != NULL);\r
a405b86d 182 }\r
a405b86d 183}\r
184\r
185/**\r
186 Destructor for the library. free any resources.\r
187\r
188 @param[in] ImageHandle Ignored.\r
189 @param[in] SystemTable Ignored.\r
190\r
191 @retval EFI_SUCCESS The operation was successful.\r
192**/\r
193EFI_STATUS\r
194EFIAPI\r
195HandleParsingLibDestructor (\r
196 IN EFI_HANDLE ImageHandle,\r
197 IN EFI_SYSTEM_TABLE *SystemTable\r
198 )\r
199{\r
6306fd90
JC
200 UINTN LoopCount;\r
201\r
d4ec9a57
RN
202 for (LoopCount = 0; mGuidList != NULL && LoopCount < mGuidListCount; LoopCount++) {\r
203 SHELL_FREE_NON_NULL(mGuidList[LoopCount].GuidId);\r
6306fd90
JC
204 }\r
205\r
d4ec9a57 206 SHELL_FREE_NON_NULL(mGuidList);\r
a405b86d 207 if (mHandleParsingHiiHandle != NULL) {\r
208 HiiRemovePackages(mHandleParsingHiiHandle);\r
209 }\r
210 return (EFI_SUCCESS);\r
211}\r
212\r
efb76d1a
JC
213/**\r
214 Function to dump information about LoadedImage.\r
215\r
216 This will allocate the return buffer from boot services pool.\r
217\r
218 @param[in] TheHandle The handle that has LoadedImage installed.\r
219 @param[in] Verbose TRUE for additional information, FALSE otherwise.\r
220\r
221 @retval A poitner to a string containing the information.\r
222**/\r
a405b86d 223CHAR16*\r
224EFIAPI\r
225LoadedImageProtocolDumpInformation(\r
226 IN CONST EFI_HANDLE TheHandle,\r
227 IN CONST BOOLEAN Verbose\r
228 )\r
229{\r
efb76d1a 230 EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;\r
a405b86d 231 EFI_STATUS Status;\r
efb76d1a
JC
232 CHAR16 *RetVal;\r
233 CHAR16 *Temp;\r
f4ac4354 234 CHAR16 *FileName;\r
4f67a614 235 CHAR8 *PdbFileName;\r
c15323ae 236 CHAR16 *FilePath;\r
efb76d1a
JC
237 CHAR16 *CodeType;\r
238 CHAR16 *DataType;\r
a405b86d 239\r
efb76d1a
JC
240 Status = gBS->OpenProtocol (\r
241 TheHandle,\r
242 &gEfiLoadedImageProtocolGuid,\r
243 (VOID**)&LoadedImage,\r
244 gImageHandle,\r
245 NULL,\r
246 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
247 );\r
248\r
5f119dfc 249 if (EFI_ERROR (Status)) {\r
bbb212af
JW
250 return NULL;\r
251 }\r
252\r
f4ac4354 253 FileName = FindLoadedImageFileName(LoadedImage);\r
4f67a614
HL
254 FilePath = ConvertDevicePathToText(LoadedImage->FilePath, TRUE, TRUE);\r
255 if (!Verbose) {\r
256 if (FileName == NULL) {\r
257 FileName = FilePath;\r
258 } else {\r
259 SHELL_FREE_NON_NULL(FilePath);\r
260 }\r
261 RetVal = CatSPrint(NULL, FileName);\r
262 SHELL_FREE_NON_NULL(FileName);\r
263 return RetVal;\r
264 }\r
f4ac4354 265\r
4f67a614 266 HandleParsingHiiInit();\r
f4ac4354
JW
267 RetVal = NULL;\r
268 if (FileName != NULL) {\r
269 Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_LI_DUMP_NAME), NULL);\r
270\r
271 if (Temp != NULL) {\r
272 RetVal = CatSPrint(NULL, Temp, FileName);\r
273 }\r
274\r
275 SHELL_FREE_NON_NULL(Temp);\r
276 SHELL_FREE_NON_NULL(FileName);\r
277 }\r
278\r
bbb212af
JW
279 Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_LI_DUMP_MAIN), NULL);\r
280 if (Temp == NULL) {\r
5f119dfc
HL
281 return NULL;\r
282 }\r
4f67a614 283 PdbFileName = PeCoffLoaderGetPdbPointer (LoadedImage->ImageBase);\r
efb76d1a
JC
284 DataType = ConvertMemoryType(LoadedImage->ImageDataType);\r
285 CodeType = ConvertMemoryType(LoadedImage->ImageCodeType);\r
286\r
1a6f74d9 287 RetVal = CatSPrint(\r
f4ac4354 288 RetVal,\r
1a6f74d9
CS
289 Temp,\r
290 LoadedImage->Revision,\r
291 LoadedImage->ParentHandle,\r
292 LoadedImage->SystemTable,\r
293 LoadedImage->DeviceHandle,\r
c15323ae 294 FilePath,\r
4f67a614 295 PdbFileName,\r
1a6f74d9
CS
296 LoadedImage->LoadOptionsSize,\r
297 LoadedImage->LoadOptions,\r
298 LoadedImage->ImageBase,\r
299 LoadedImage->ImageSize,\r
300 CodeType,\r
301 DataType,\r
302 LoadedImage->Unload\r
303 );\r
304\r
305\r
efb76d1a 306 SHELL_FREE_NON_NULL(Temp);\r
c15323ae 307 SHELL_FREE_NON_NULL(FilePath);\r
efb76d1a
JC
308 SHELL_FREE_NON_NULL(CodeType);\r
309 SHELL_FREE_NON_NULL(DataType);\r
310\r
311 return RetVal;\r
a405b86d 312}\r
a405b86d 313\r
609e0c58
JC
314/**\r
315 Function to dump information about GOP.\r
316\r
317 This will allocate the return buffer from boot services pool.\r
318\r
319 @param[in] TheHandle The handle that has LoadedImage installed.\r
320 @param[in] Verbose TRUE for additional information, FALSE otherwise.\r
321\r
322 @retval A poitner to a string containing the information.\r
323**/\r
324CHAR16*\r
325EFIAPI\r
326GraphicsOutputProtocolDumpInformation(\r
327 IN CONST EFI_HANDLE TheHandle,\r
328 IN CONST BOOLEAN Verbose\r
329 )\r
330{\r
e918029f
RN
331 EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;\r
332 EFI_STATUS Status;\r
333 CHAR16 *RetVal;\r
334 CHAR16 *Temp;\r
335 CHAR16 *Fmt;\r
336 CHAR16 *TempRetVal;\r
337 UINTN GopInfoSize;\r
338 UINT32 Mode;\r
339 EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *GopInfo;\r
609e0c58
JC
340\r
341 if (!Verbose) {\r
342 return (CatSPrint(NULL, L"GraphicsOutput"));\r
343 }\r
344\r
e7e0e42b
CP
345 HandleParsingHiiInit();\r
346\r
609e0c58 347 Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_GOP_DUMP_MAIN), NULL);\r
1a6f74d9 348 if (Temp == NULL) {\r
609e0c58
JC
349 return NULL;\r
350 }\r
351\r
352 Status = gBS->OpenProtocol (\r
353 TheHandle,\r
354 &gEfiGraphicsOutputProtocolGuid,\r
355 (VOID**)&GraphicsOutput,\r
356 gImageHandle,\r
357 NULL,\r
358 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
359 );\r
360\r
361 if (EFI_ERROR (Status)) {\r
362 SHELL_FREE_NON_NULL (Temp);\r
609e0c58
JC
363 return NULL;\r
364 }\r
365\r
366 Fmt = ConvertPixelFormat(GraphicsOutput->Mode->Info->PixelFormat);\r
367\r
1a6f74d9
CS
368 RetVal = CatSPrint(\r
369 NULL,\r
370 Temp,\r
371 GraphicsOutput->Mode->MaxMode,\r
372 GraphicsOutput->Mode->Mode,\r
373 GraphicsOutput->Mode->FrameBufferBase,\r
374 (UINT64)GraphicsOutput->Mode->FrameBufferSize,\r
375 (UINT64)GraphicsOutput->Mode->SizeOfInfo,\r
376 GraphicsOutput->Mode->Info->Version,\r
377 GraphicsOutput->Mode->Info->HorizontalResolution,\r
378 GraphicsOutput->Mode->Info->VerticalResolution,\r
379 Fmt,\r
380 GraphicsOutput->Mode->Info->PixelsPerScanLine,\r
381 GraphicsOutput->Mode->Info->PixelFormat!=PixelBitMask?0:GraphicsOutput->Mode->Info->PixelInformation.RedMask,\r
382 GraphicsOutput->Mode->Info->PixelFormat!=PixelBitMask?0:GraphicsOutput->Mode->Info->PixelInformation.GreenMask,\r
383 GraphicsOutput->Mode->Info->PixelFormat!=PixelBitMask?0:GraphicsOutput->Mode->Info->PixelInformation.BlueMask\r
384 );\r
385\r
e918029f
RN
386 SHELL_FREE_NON_NULL (Temp);\r
387\r
6d3911d4
QS
388 Temp = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_GOP_RES_LIST_MAIN), NULL);\r
389 if (Temp == NULL) {\r
390 SHELL_FREE_NON_NULL (RetVal);\r
391 goto EXIT;\r
392 }\r
e918029f
RN
393\r
394 TempRetVal = CatSPrint (RetVal, Temp);\r
6d3911d4
QS
395 SHELL_FREE_NON_NULL (RetVal);\r
396 if (TempRetVal == NULL) {\r
397 goto EXIT;\r
398 }\r
e918029f
RN
399 RetVal = TempRetVal;\r
400 SHELL_FREE_NON_NULL (Temp);\r
401\r
6d3911d4
QS
402 Temp = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_GOP_RES_LIST_ENTRY), NULL);\r
403 if (Temp == NULL) {\r
404 SHELL_FREE_NON_NULL (RetVal);\r
405 goto EXIT;\r
406 }\r
407\r
e918029f
RN
408\r
409 for (Mode = 0; Mode < GraphicsOutput->Mode->MaxMode; Mode++) {\r
410 Status = GraphicsOutput->QueryMode (\r
411 GraphicsOutput,\r
412 Mode,\r
413 &GopInfoSize,\r
414 &GopInfo\r
415 );\r
416 if (EFI_ERROR (Status)) {\r
417 continue;\r
418 }\r
419\r
420 TempRetVal = CatSPrint (\r
421 RetVal,\r
422 Temp,\r
423 Mode,\r
424 GopInfo->HorizontalResolution,\r
425 GopInfo->VerticalResolution\r
426 );\r
427\r
428 SHELL_FREE_NON_NULL (GopInfo);\r
429 SHELL_FREE_NON_NULL (RetVal);\r
430 RetVal = TempRetVal;\r
431 }\r
432\r
6d3911d4
QS
433\r
434EXIT:\r
609e0c58
JC
435 SHELL_FREE_NON_NULL(Temp);\r
436 SHELL_FREE_NON_NULL(Fmt);\r
437\r
438 return RetVal;\r
439}\r
440\r
f4f3c6bf 441/**\r
e918029f
RN
442 Function to dump information about EDID Discovered Protocol.\r
443\r
444 This will allocate the return buffer from boot services pool.\r
445\r
446 @param[in] TheHandle The handle that has LoadedImage installed.\r
447 @param[in] Verbose TRUE for additional information, FALSE otherwise.\r
448\r
449 @retval A pointer to a string containing the information.\r
450**/\r
451CHAR16*\r
452EFIAPI\r
453EdidDiscoveredProtocolDumpInformation (\r
454 IN CONST EFI_HANDLE TheHandle,\r
455 IN CONST BOOLEAN Verbose\r
456 )\r
457{\r
458 EFI_EDID_DISCOVERED_PROTOCOL *EdidDiscovered;\r
459 EFI_STATUS Status;\r
460 CHAR16 *RetVal;\r
461 CHAR16 *Temp;\r
462 CHAR16 *TempRetVal;\r
463\r
464 if (!Verbose) {\r
465 return (CatSPrint (NULL, L"EDIDDiscovered"));\r
466 }\r
467\r
468 Status = gBS->OpenProtocol (\r
469 TheHandle,\r
470 &gEfiEdidDiscoveredProtocolGuid,\r
471 (VOID**)&EdidDiscovered,\r
472 NULL,\r
473 NULL,\r
474 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
475 );\r
476\r
477 if (EFI_ERROR (Status)) {\r
478 return NULL;\r
479 }\r
480\r
481 Temp = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_EDID_DISCOVERED_MAIN), NULL);\r
482 if (Temp == NULL) {\r
483 return NULL;\r
484 }\r
485\r
486 RetVal = CatSPrint (NULL, Temp, EdidDiscovered->SizeOfEdid);\r
487 SHELL_FREE_NON_NULL (Temp);\r
488\r
489 if (EdidDiscovered->SizeOfEdid != 0) {\r
490 Temp = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_EDID_DISCOVERED_DATA), NULL);\r
491 if (Temp == NULL) {\r
492 SHELL_FREE_NON_NULL (RetVal);\r
493 return NULL;\r
494 }\r
495 TempRetVal = CatSPrint (RetVal, Temp);\r
496 SHELL_FREE_NON_NULL (RetVal);\r
497 RetVal = TempRetVal;\r
498\r
499 TempRetVal = CatSDumpHex (RetVal, 7, 0, EdidDiscovered->SizeOfEdid, EdidDiscovered->Edid);\r
500 RetVal = TempRetVal;\r
501 }\r
502 return RetVal;\r
503}\r
504\r
505/**\r
506 Function to dump information about EDID Active Protocol.\r
507\r
508 This will allocate the return buffer from boot services pool.\r
509\r
510 @param[in] TheHandle The handle that has LoadedImage installed.\r
511 @param[in] Verbose TRUE for additional information, FALSE otherwise.\r
512\r
513 @retval A pointer to a string containing the information.\r
514**/\r
515CHAR16*\r
516EFIAPI\r
517EdidActiveProtocolDumpInformation (\r
518 IN CONST EFI_HANDLE TheHandle,\r
519 IN CONST BOOLEAN Verbose\r
520 )\r
521{\r
522 EFI_EDID_ACTIVE_PROTOCOL *EdidActive;\r
523 EFI_STATUS Status;\r
524 CHAR16 *RetVal;\r
525 CHAR16 *Temp;\r
526 CHAR16 *TempRetVal;\r
527\r
528 if (!Verbose) {\r
529 return (CatSPrint (NULL, L"EDIDActive"));\r
530 }\r
531\r
532 Status = gBS->OpenProtocol (\r
533 TheHandle,\r
534 &gEfiEdidActiveProtocolGuid,\r
535 (VOID**)&EdidActive,\r
536 NULL,\r
537 NULL,\r
538 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
539 );\r
540\r
541 if (EFI_ERROR (Status)) {\r
542 return NULL;\r
543 }\r
544\r
545 Temp = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_EDID_ACTIVE_MAIN), NULL);\r
546 if (Temp == NULL) {\r
547 return NULL;\r
548 }\r
549\r
550 RetVal = CatSPrint (NULL, Temp, EdidActive->SizeOfEdid);\r
551 SHELL_FREE_NON_NULL (Temp);\r
552\r
553 if (EdidActive->SizeOfEdid != 0) {\r
554 Temp = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_EDID_ACTIVE_DATA), NULL);\r
555 if (Temp == NULL) {\r
556 SHELL_FREE_NON_NULL (RetVal);\r
557 return NULL;\r
558 }\r
559 TempRetVal = CatSPrint (RetVal, Temp);\r
560 SHELL_FREE_NON_NULL (RetVal);\r
561 RetVal = TempRetVal;\r
562\r
563 TempRetVal = CatSDumpHex (RetVal, 7, 0, EdidActive->SizeOfEdid, EdidActive->Edid);\r
564 RetVal = TempRetVal;\r
565 }\r
566 return RetVal;\r
567}\r
568\r
569/**\r
f4f3c6bf 570 Function to dump information about PciRootBridgeIo.\r
571\r
572 This will allocate the return buffer from boot services pool.\r
573\r
574 @param[in] TheHandle The handle that has PciRootBridgeIo installed.\r
575 @param[in] Verbose TRUE for additional information, FALSE otherwise.\r
576\r
577 @retval A poitner to a string containing the information.\r
578**/\r
579CHAR16*\r
580EFIAPI\r
581PciRootBridgeIoDumpInformation(\r
582 IN CONST EFI_HANDLE TheHandle,\r
583 IN CONST BOOLEAN Verbose\r
584 )\r
585{\r
586 EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *PciRootBridgeIo;\r
587 EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *Configuration;\r
588 UINT64 Supports;\r
589 UINT64 Attributes;\r
590 CHAR16 *Temp;\r
591 CHAR16 *Temp2;\r
592 CHAR16 *RetVal;\r
593 EFI_STATUS Status;\r
594\r
595 RetVal = NULL;\r
596\r
597 if (!Verbose) {\r
598 return (CatSPrint(NULL, L"PciRootBridgeIo"));\r
599 }\r
600\r
e7e0e42b
CP
601 HandleParsingHiiInit();\r
602\r
f4f3c6bf 603 Status = gBS->HandleProtocol(\r
604 TheHandle,\r
605 &gEfiPciRootBridgeIoProtocolGuid,\r
606 (VOID**)&PciRootBridgeIo);\r
607\r
608 if (EFI_ERROR(Status)) {\r
609 return NULL;\r
610 }\r
611\r
612 Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_PCIRB_DUMP_PH), NULL);\r
1d6ccad2
QS
613 if (Temp == NULL) {\r
614 return NULL;\r
615 }\r
f4f3c6bf 616 Temp2 = CatSPrint(L"\r\n", Temp, PciRootBridgeIo->ParentHandle);\r
617 FreePool(Temp);\r
618 RetVal = Temp2;\r
619 Temp2 = NULL;\r
1a6f74d9 620\r
f4f3c6bf 621 Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_PCIRB_DUMP_SEG), NULL);\r
1d6ccad2
QS
622 if (Temp == NULL) {\r
623 SHELL_FREE_NON_NULL(RetVal);\r
624 return NULL;\r
625 }\r
f4f3c6bf 626 Temp2 = CatSPrint(RetVal, Temp, PciRootBridgeIo->SegmentNumber);\r
627 FreePool(Temp);\r
628 FreePool(RetVal);\r
629 RetVal = Temp2;\r
630 Temp2 = NULL;\r
631\r
632 Supports = 0;\r
633 Attributes = 0;\r
634 Status = PciRootBridgeIo->GetAttributes (PciRootBridgeIo, &Supports, &Attributes);\r
635 if (!EFI_ERROR(Status)) {\r
636 Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_PCIRB_DUMP_ATT), NULL);\r
1d6ccad2
QS
637 if (Temp == NULL) {\r
638 SHELL_FREE_NON_NULL(RetVal);\r
639 return NULL;\r
1a6f74d9 640 }\r
f4f3c6bf 641 Temp2 = CatSPrint(RetVal, Temp, Attributes);\r
642 FreePool(Temp);\r
643 FreePool(RetVal);\r
644 RetVal = Temp2;\r
645 Temp2 = NULL;\r
1a6f74d9 646\r
f4f3c6bf 647 Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_PCIRB_DUMP_SUPPORTS), NULL);\r
1d6ccad2
QS
648 if (Temp == NULL) {\r
649 SHELL_FREE_NON_NULL(RetVal);\r
650 return NULL;\r
651 }\r
f4f3c6bf 652 Temp2 = CatSPrint(RetVal, Temp, Supports);\r
653 FreePool(Temp);\r
654 FreePool(RetVal);\r
655 RetVal = Temp2;\r
656 Temp2 = NULL;\r
657 }\r
658\r
659 Configuration = NULL;\r
660 Status = PciRootBridgeIo->Configuration (PciRootBridgeIo, (VOID **) &Configuration);\r
661 if (!EFI_ERROR(Status) && Configuration != NULL) {\r
662 Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_PCIRB_DUMP_TITLE), NULL);\r
1d6ccad2
QS
663 if (Temp == NULL) {\r
664 SHELL_FREE_NON_NULL(RetVal);\r
665 return NULL;\r
666 }\r
f4f3c6bf 667 Temp2 = CatSPrint(RetVal, Temp, Supports);\r
668 FreePool(Temp);\r
669 FreePool(RetVal);\r
670 RetVal = Temp2;\r
671 Temp2 = NULL;\r
672 while (Configuration->Desc == ACPI_ADDRESS_SPACE_DESCRIPTOR) {\r
673 Temp = NULL;\r
674 switch (Configuration->ResType) {\r
675 case ACPI_ADDRESS_SPACE_TYPE_MEM:\r
676 Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_PCIRB_DUMP_MEM), NULL);\r
677 break;\r
678 case ACPI_ADDRESS_SPACE_TYPE_IO:\r
679 Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_PCIRB_DUMP_IO), NULL);\r
680 break;\r
681 case ACPI_ADDRESS_SPACE_TYPE_BUS:\r
682 Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_PCIRB_DUMP_BUS), NULL);\r
683 break;\r
684 }\r
685 if (Temp != NULL) {\r
686 Temp2 = CatSPrint(RetVal, L"%s", Temp);\r
687 FreePool(Temp);\r
688 FreePool(RetVal);\r
689 RetVal = Temp2;\r
690 Temp2 = NULL;\r
691 }\r
692\r
1a6f74d9 693 Temp2 = CatSPrint(RetVal,\r
f4f3c6bf 694 L"%H%02x %016lx %016lx %02x%N\r\n",\r
695 Configuration->SpecificFlag,\r
696 Configuration->AddrRangeMin,\r
697 Configuration->AddrRangeMax,\r
698 Configuration->AddrSpaceGranularity\r
699 );\r
700 FreePool(RetVal);\r
701 RetVal = Temp2;\r
702 Temp2 = NULL;\r
703 Configuration++;\r
704 }\r
705 }\r
706 return (RetVal);\r
707}\r
708\r
a405b86d 709/**\r
710 Function to dump information about SimpleTextOut.\r
711\r
712 This will allocate the return buffer from boot services pool.\r
713\r
714 @param[in] TheHandle The handle that has SimpleTextOut installed.\r
715 @param[in] Verbose TRUE for additional information, FALSE otherwise.\r
716\r
717 @retval A poitner to a string containing the information.\r
718**/\r
719CHAR16*\r
720EFIAPI\r
721TxtOutProtocolDumpInformation(\r
722 IN CONST EFI_HANDLE TheHandle,\r
723 IN CONST BOOLEAN Verbose\r
724 )\r
725{\r
726 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *Dev;\r
727 INTN Index;\r
728 UINTN Col;\r
729 UINTN Row;\r
730 EFI_STATUS Status;\r
731 CHAR16 *RetVal;\r
732 UINTN Size;\r
733 CHAR16 *Temp;\r
734 UINTN NewSize;\r
735\r
736 if (!Verbose) {\r
737 return (NULL);\r
738 }\r
739\r
e7e0e42b
CP
740 HandleParsingHiiInit();\r
741\r
a405b86d 742 RetVal = NULL;\r
743 Size = 0;\r
744\r
745 Status = gBS->HandleProtocol(\r
746 TheHandle,\r
747 &gEfiSimpleTextOutProtocolGuid,\r
748 (VOID**)&Dev);\r
749\r
750 ASSERT_EFI_ERROR(Status);\r
751 ASSERT (Dev != NULL && Dev->Mode != NULL);\r
752\r
753 Size = (Dev->Mode->MaxMode + 1) * 80;\r
754 RetVal = AllocateZeroPool(Size);\r
755\r
756 Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_TXT_OUT_DUMP_HEADER), NULL);\r
ecae5117 757 if (Temp != NULL) {\r
758 UnicodeSPrint(RetVal, Size, Temp, Dev, Dev->Mode->Attribute);\r
759 FreePool(Temp);\r
760 }\r
a405b86d 761\r
762 //\r
763 // Dump TextOut Info\r
764 //\r
765 Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_TXT_OUT_DUMP_LINE), NULL);\r
766 for (Index = 0; Index < Dev->Mode->MaxMode; Index++) {\r
767 Status = Dev->QueryMode (Dev, Index, &Col, &Row);\r
768 NewSize = Size - StrSize(RetVal);\r
769 UnicodeSPrint(\r
770 RetVal + StrLen(RetVal),\r
771 NewSize,\r
ecae5117 772 Temp == NULL?L"":Temp,\r
a405b86d 773 Index == Dev->Mode->Mode ? L'*' : L' ',\r
774 Index,\r
28981267 775 !EFI_ERROR(Status)?(INTN)Col:-1,\r
776 !EFI_ERROR(Status)?(INTN)Row:-1\r
a405b86d 777 );\r
778 }\r
779 FreePool(Temp);\r
780 return (RetVal);\r
781}\r
782\r
783STATIC CONST UINTN VersionStringSize = 60;\r
784\r
785/**\r
786 Function to dump information about EfiDriverSupportedEfiVersion protocol.\r
787\r
788 This will allocate the return buffer from boot services pool.\r
789\r
790 @param[in] TheHandle The handle that has the protocol installed.\r
791 @param[in] Verbose TRUE for additional information, FALSE otherwise.\r
792\r
793 @retval A poitner to a string containing the information.\r
794**/\r
795CHAR16*\r
796EFIAPI\r
797DriverEfiVersionProtocolDumpInformation(\r
798 IN CONST EFI_HANDLE TheHandle,\r
799 IN CONST BOOLEAN Verbose\r
800 )\r
801{\r
802 EFI_DRIVER_SUPPORTED_EFI_VERSION_PROTOCOL *DriverEfiVersion;\r
803 EFI_STATUS Status;\r
804 CHAR16 *RetVal;\r
805\r
806 Status = gBS->HandleProtocol(\r
807 TheHandle,\r
808 &gEfiDriverSupportedEfiVersionProtocolGuid,\r
809 (VOID**)&DriverEfiVersion);\r
810\r
811 ASSERT_EFI_ERROR(Status);\r
812\r
78ed876b 813 RetVal = AllocateZeroPool(VersionStringSize);\r
aa3276c1
RN
814 if (RetVal != NULL) {\r
815 UnicodeSPrint (RetVal, VersionStringSize, L"0x%08x", DriverEfiVersion->FirmwareVersion);\r
816 }\r
a405b86d 817 return (RetVal);\r
818}\r
5e32460d
RN
819/**\r
820 Function to convert device path to string.\r
821\r
822 This will allocate the return buffer from boot services pool.\r
823\r
824 @param[in] DevPath Pointer to device path instance.\r
825 @param[in] Verbose TRUE for additional information, FALSE otherwise.\r
826 @param[in] Length Maximum allowed text length of the device path.\r
827\r
828 @retval A pointer to a string containing the information.\r
829**/\r
830CHAR16*\r
831ConvertDevicePathToShortText(\r
832 IN CONST EFI_DEVICE_PATH_PROTOCOL *DevPath,\r
833 IN CONST BOOLEAN Verbose,\r
834 IN CONST UINTN Length\r
835 )\r
836{\r
837 CHAR16 *Temp;\r
838 CHAR16 *Temp2;\r
839 UINTN Size;\r
840\r
841 //\r
842 // I cannot decide whether to allow shortcuts here (the second BOOLEAN on the next line)\r
843 //\r
844 Temp = ConvertDevicePathToText(DevPath, TRUE, TRUE);\r
845 if (!Verbose && Temp != NULL && StrLen(Temp) > Length) {\r
846 Temp2 = NULL;\r
847 Size = 0;\r
848 Temp2 = StrnCatGrow(&Temp2, &Size, L"..", 0);\r
849 Temp2 = StrnCatGrow(&Temp2, &Size, Temp+(StrLen(Temp) - (Length - 2)), 0);\r
850 FreePool(Temp);\r
851 Temp = Temp2;\r
852 }\r
853 return (Temp);\r
854}\r
a405b86d 855\r
f6e0c4b4
HL
856/**\r
857 Function to dump protocol information.\r
858\r
859 This will allocate the return buffer from boot services pool.\r
860\r
861 @param[in] TheHandle The handle that has the protocol installed.\r
862 @param[in] Verbose TRUE for additional information, FALSE otherwise.\r
863 @param[in] Protocol The protocol is needed to dump.\r
864\r
865 @retval A pointer to a string containing the information.\r
866**/\r
867STATIC CHAR16*\r
868EFIAPI\r
869DevicePathProtocolDumpInformationEx (\r
870 IN CONST EFI_HANDLE TheHandle,\r
871 IN CONST BOOLEAN Verbose,\r
872 IN EFI_GUID *Protocol\r
873)\r
874{\r
875 EFI_DEVICE_PATH_PROTOCOL *DevPath;\r
876 CHAR16 *DevPathStr;\r
877 CHAR16 *DevPathStrTemp;\r
878 UINTN Size;\r
879 EFI_STATUS Status;\r
880 DevPathStr = NULL;\r
881 DevPathStrTemp = NULL;\r
882 Status = gBS->OpenProtocol(TheHandle, Protocol, (VOID**)&DevPath, gImageHandle, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL);\r
883 if (!EFI_ERROR(Status)) {\r
884 DevPathStr = ConvertDevicePathToShortText (DevPath, Verbose, 30);\r
885 if (Verbose) {\r
886 Size = StrSize(DevPathStr) + sizeof(CHAR16) * 2;\r
887 DevPathStrTemp = AllocateZeroPool (Size);\r
888 if (DevPathStrTemp != NULL) {\r
889 StrnCatS (DevPathStrTemp, Size/sizeof(CHAR16), L" ", 2);\r
890 StrnCatS (DevPathStrTemp, Size/sizeof(CHAR16), DevPathStr, StrLen (DevPathStr));\r
891 }\r
892 FreePool (DevPathStr);\r
893 DevPathStr = DevPathStrTemp;\r
894 }\r
895 gBS->CloseProtocol(TheHandle, Protocol, gImageHandle, NULL);\r
896 }\r
897 return DevPathStr;\r
898}\r
899\r
a405b86d 900/**\r
901 Function to dump information about DevicePath protocol.\r
902\r
903 This will allocate the return buffer from boot services pool.\r
904\r
905 @param[in] TheHandle The handle that has the protocol installed.\r
906 @param[in] Verbose TRUE for additional information, FALSE otherwise.\r
907\r
5e32460d 908 @retval A pointer to a string containing the information.\r
a405b86d 909**/\r
910CHAR16*\r
911EFIAPI\r
912DevicePathProtocolDumpInformation(\r
913 IN CONST EFI_HANDLE TheHandle,\r
914 IN CONST BOOLEAN Verbose\r
915 )\r
916{\r
f6e0c4b4 917 return DevicePathProtocolDumpInformationEx (TheHandle, Verbose, &gEfiDevicePathProtocolGuid);\r
5e32460d
RN
918}\r
919\r
920/**\r
921 Function to dump information about LoadedImageDevicePath protocol.\r
922\r
923 This will allocate the return buffer from boot services pool.\r
924\r
925 @param[in] TheHandle The handle that has the protocol installed.\r
926 @param[in] Verbose TRUE for additional information, FALSE otherwise.\r
927\r
928 @retval A pointer to a string containing the information.\r
929**/\r
930CHAR16*\r
931EFIAPI\r
932LoadedImageDevicePathProtocolDumpInformation(\r
933 IN CONST EFI_HANDLE TheHandle,\r
934 IN CONST BOOLEAN Verbose\r
935 )\r
936{\r
f6e0c4b4 937 return DevicePathProtocolDumpInformationEx (TheHandle, Verbose, &gEfiLoadedImageDevicePathProtocolGuid);\r
a405b86d 938}\r
939\r
d772f5f3
HL
940/**\r
941 Function to dump information about BusSpecificDriverOverride protocol.\r
942\r
943 This will allocate the return buffer from boot services pool.\r
944\r
945 @param[in] TheHandle The handle that has the protocol installed.\r
946 @param[in] Verbose TRUE for additional information, FALSE otherwise.\r
947\r
948 @retval A pointer to a string containing the information.\r
949**/\r
950CHAR16*\r
951EFIAPI\r
952BusSpecificDriverOverrideProtocolDumpInformation (\r
953 IN CONST EFI_HANDLE TheHandle,\r
954 IN CONST BOOLEAN Verbose\r
955 )\r
956{\r
957 EFI_STATUS Status;\r
958 CHAR16 *GetString;\r
959 CHAR16 *RetVal;\r
960 CHAR16 *TempRetVal;\r
961 EFI_BUS_SPECIFIC_DRIVER_OVERRIDE_PROTOCOL *BusSpecificDriverOverride;\r
962 EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;\r
963 EFI_HANDLE ImageHandle;\r
964 UINTN Size;\r
965\r
966 if (!Verbose) {\r
967 return NULL;\r
968 }\r
969 Size = 0;\r
970 GetString = NULL;\r
971 RetVal = NULL;\r
972 TempRetVal = NULL;\r
973 ImageHandle = 0;\r
974\r
975 Status = gBS->OpenProtocol (\r
976 TheHandle,\r
977 &gEfiBusSpecificDriverOverrideProtocolGuid,\r
978 (VOID**)&BusSpecificDriverOverride,\r
979 gImageHandle,\r
980 NULL,\r
981 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
982 );\r
983 if (EFI_ERROR (Status)) {\r
984 return NULL;\r
985 }\r
986 HandleParsingHiiInit ();\r
987 GetString = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_BSDO_DUMP_MAIN), NULL);\r
988 if (GetString == NULL) {\r
989 return NULL;\r
990 }\r
991 do {\r
992 Status = BusSpecificDriverOverride->GetDriver (\r
993 BusSpecificDriverOverride,\r
994 &ImageHandle\r
995 );\r
996 if (!EFI_ERROR (Status)) {\r
997 Status = gBS->HandleProtocol (\r
998 ImageHandle,\r
999 &gEfiLoadedImageProtocolGuid,\r
1000 (VOID **) &LoadedImage\r
1001 );\r
1002 if(!EFI_ERROR (Status)) {\r
1003 TempRetVal = CatSPrint (\r
1004 TempRetVal,\r
1005 GetString,\r
1006 ConvertHandleToHandleIndex (ImageHandle),\r
1007 ConvertDevicePathToText (LoadedImage->FilePath, TRUE, TRUE)\r
1008 );\r
1009 StrnCatGrow (&RetVal, &Size, TempRetVal, 0);\r
1010 SHELL_FREE_NON_NULL (TempRetVal);\r
1011 }\r
1012 }\r
1013 } while (!EFI_ERROR (Status));\r
1014\r
1015 SHELL_FREE_NON_NULL (GetString);\r
1016 return RetVal;\r
1017}\r
1018\r
59febea1
SEHM
1019/**\r
1020 Function to dump information about EfiAdapterInformation Protocol.\r
1021\r
1022 @param[in] TheHandle The handle that has the protocol installed.\r
1023 @param[in] Verbose TRUE for additional information, FALSE otherwise.\r
1024\r
1025 @retval A pointer to a string containing the information.\r
1026**/\r
1027CHAR16*\r
1028EFIAPI\r
1029AdapterInformationDumpInformation (\r
1030 IN CONST EFI_HANDLE TheHandle,\r
1031 IN CONST BOOLEAN Verbose\r
1032 )\r
1033{\r
1034 EFI_STATUS Status;\r
1035 EFI_ADAPTER_INFORMATION_PROTOCOL *EfiAdptrInfoProtocol;\r
1036 UINTN InfoTypesBufferCount;\r
1037 UINTN GuidIndex;\r
1038 EFI_GUID *InfoTypesBuffer;\r
1039 CHAR16 *GuidStr;\r
1040 CHAR16 *TempStr;\r
1041 CHAR16 *RetVal;\r
1a6f74d9 1042 CHAR16 *TempRetVal;\r
59febea1
SEHM
1043 VOID *InformationBlock;\r
1044 UINTN InformationBlockSize;\r
1a6f74d9 1045\r
59febea1
SEHM
1046 if (!Verbose) {\r
1047 return (CatSPrint(NULL, L"AdapterInfo"));\r
1048 }\r
1049\r
1d6ccad2
QS
1050 InfoTypesBuffer = NULL;\r
1051 InformationBlock = NULL;\r
1a6f74d9 1052\r
59febea1
SEHM
1053\r
1054 Status = gBS->OpenProtocol (\r
1055 (EFI_HANDLE) (TheHandle),\r
1056 &gEfiAdapterInformationProtocolGuid,\r
1057 (VOID **) &EfiAdptrInfoProtocol,\r
1058 NULL,\r
1059 NULL,\r
1060 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
1061 );\r
1062\r
1063 if (EFI_ERROR (Status)) {\r
59febea1
SEHM
1064 return NULL;\r
1065 }\r
1066\r
1067 //\r
1068 // Get a list of supported information types for this instance of the protocol.\r
1069 //\r
1070 Status = EfiAdptrInfoProtocol->GetSupportedTypes (\r
1071 EfiAdptrInfoProtocol,\r
1a6f74d9 1072 &InfoTypesBuffer,\r
59febea1
SEHM
1073 &InfoTypesBufferCount\r
1074 );\r
1a6f74d9 1075 RetVal = NULL;\r
59febea1
SEHM
1076 if (EFI_ERROR (Status)) {\r
1077 TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_GET_SUPP_TYPES_FAILED), NULL);\r
1d6ccad2 1078 if (TempStr != NULL) {\r
1a6f74d9 1079 RetVal = CatSPrint (NULL, TempStr, Status);\r
1d6ccad2
QS
1080 } else {\r
1081 goto ERROR_EXIT;\r
1a6f74d9 1082 }\r
59febea1
SEHM
1083 } else {\r
1084 TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_SUPP_TYPE_HEADER), NULL);\r
1d6ccad2
QS
1085 if (TempStr == NULL) {\r
1086 goto ERROR_EXIT;\r
1087 }\r
1a6f74d9 1088 RetVal = CatSPrint (NULL, TempStr);\r
59febea1
SEHM
1089 SHELL_FREE_NON_NULL (TempStr);\r
1090\r
1091 for (GuidIndex = 0; GuidIndex < InfoTypesBufferCount; GuidIndex++) {\r
1092 TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_GUID_NUMBER), NULL);\r
1d6ccad2
QS
1093 if (TempStr == NULL) {\r
1094 goto ERROR_EXIT;\r
1095 }\r
5d54bbec 1096 TempRetVal = CatSPrint (RetVal, TempStr, (GuidIndex + 1), &InfoTypesBuffer[GuidIndex]);\r
1a6f74d9
CS
1097 SHELL_FREE_NON_NULL (RetVal);\r
1098 RetVal = TempRetVal;\r
59febea1
SEHM
1099 SHELL_FREE_NON_NULL (TempStr);\r
1100\r
1101 TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_GUID_STRING), NULL);\r
1d6ccad2
QS
1102 if (TempStr == NULL) {\r
1103 goto ERROR_EXIT;\r
1104 }\r
59febea1
SEHM
1105\r
1106 if (CompareGuid (&InfoTypesBuffer[GuidIndex], &gEfiAdapterInfoMediaStateGuid)) {\r
1a6f74d9
CS
1107 TempRetVal = CatSPrint (RetVal, TempStr, L"gEfiAdapterInfoMediaStateGuid");\r
1108 SHELL_FREE_NON_NULL (RetVal);\r
1109 RetVal = TempRetVal;\r
59febea1 1110 } else if (CompareGuid (&InfoTypesBuffer[GuidIndex], &gEfiAdapterInfoNetworkBootGuid)) {\r
1a6f74d9
CS
1111 TempRetVal = CatSPrint (RetVal, TempStr, L"gEfiAdapterInfoNetworkBootGuid");\r
1112 SHELL_FREE_NON_NULL (RetVal);\r
1113 RetVal = TempRetVal;\r
59febea1 1114 } else if (CompareGuid (&InfoTypesBuffer[GuidIndex], &gEfiAdapterInfoSanMacAddressGuid)) {\r
1a6f74d9
CS
1115 TempRetVal = CatSPrint (RetVal, TempStr, L"gEfiAdapterInfoSanMacAddressGuid");\r
1116 SHELL_FREE_NON_NULL (RetVal);\r
1117 RetVal = TempRetVal;\r
256aa6d0
SEHM
1118 } else if (CompareGuid (&InfoTypesBuffer[GuidIndex], &gEfiAdapterInfoUndiIpv6SupportGuid)) {\r
1119 TempRetVal = CatSPrint (RetVal, TempStr, L"gEfiAdapterInfoUndiIpv6SupportGuid");\r
1120 SHELL_FREE_NON_NULL (RetVal);\r
1121 RetVal = TempRetVal;\r
59febea1
SEHM
1122 } else {\r
1123\r
1124 GuidStr = GetStringNameFromGuid (&InfoTypesBuffer[GuidIndex], NULL);\r
0e88348e
RN
1125 if (GuidStr == NULL) {\r
1126 TempRetVal = CatSPrint (RetVal, TempStr, L"UnknownInfoType");\r
1127 SHELL_FREE_NON_NULL (RetVal);\r
1128 RetVal = TempRetVal;\r
1a6f74d9 1129\r
0e88348e
RN
1130 SHELL_FREE_NON_NULL (TempStr);\r
1131 SHELL_FREE_NON_NULL(GuidStr);\r
1132 //\r
1133 // So that we never have to pass this UnknownInfoType to the parsing function "GetInformation" service of AIP\r
1134 //\r
1135 continue;\r
1136 } else {\r
1137 TempRetVal = CatSPrint (RetVal, TempStr, GuidStr);\r
1138 SHELL_FREE_NON_NULL (RetVal);\r
1139 RetVal = TempRetVal;\r
1140 SHELL_FREE_NON_NULL(GuidStr);\r
59febea1
SEHM
1141 }\r
1142 }\r
1a6f74d9 1143\r
59febea1
SEHM
1144 SHELL_FREE_NON_NULL (TempStr);\r
1145\r
1146 Status = EfiAdptrInfoProtocol->GetInformation (\r
1147 EfiAdptrInfoProtocol,\r
1148 &InfoTypesBuffer[GuidIndex],\r
1149 &InformationBlock,\r
1150 &InformationBlockSize\r
1151 );\r
1152\r
1153 if (EFI_ERROR (Status)) {\r
1154 TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_GETINFO_FAILED), NULL);\r
1d6ccad2
QS
1155 if (TempStr == NULL) {\r
1156 goto ERROR_EXIT;\r
1157 }\r
1a6f74d9
CS
1158 TempRetVal = CatSPrint (RetVal, TempStr, Status);\r
1159 SHELL_FREE_NON_NULL (RetVal);\r
1160 RetVal = TempRetVal;\r
59febea1
SEHM
1161 } else {\r
1162 if (CompareGuid (&InfoTypesBuffer[GuidIndex], &gEfiAdapterInfoMediaStateGuid)) {\r
1163 TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_MEDIA_STATE), NULL);\r
1d6ccad2
QS
1164 if (TempStr == NULL) {\r
1165 goto ERROR_EXIT;\r
1166 }\r
1a6f74d9
CS
1167 TempRetVal = CatSPrint (\r
1168 RetVal,\r
1169 TempStr,\r
1170 ((EFI_ADAPTER_INFO_MEDIA_STATE *)InformationBlock)->MediaState,\r
1171 ((EFI_ADAPTER_INFO_MEDIA_STATE *)InformationBlock)->MediaState\r
1172 );\r
1173 SHELL_FREE_NON_NULL (RetVal);\r
1174 RetVal = TempRetVal;\r
59febea1
SEHM
1175 } else if (CompareGuid (&InfoTypesBuffer[GuidIndex], &gEfiAdapterInfoNetworkBootGuid)) {\r
1176 TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_NETWORK_BOOT_INFO), NULL);\r
1d6ccad2
QS
1177 if (TempStr == NULL) {\r
1178 goto ERROR_EXIT;\r
1179 }\r
1a6f74d9
CS
1180 TempRetVal = CatSPrint (\r
1181 RetVal,\r
1182 TempStr,\r
1183 ((EFI_ADAPTER_INFO_NETWORK_BOOT *)InformationBlock)->iScsiIpv4BootCapablity,\r
1184 ((EFI_ADAPTER_INFO_NETWORK_BOOT *)InformationBlock)->iScsiIpv6BootCapablity,\r
1185 ((EFI_ADAPTER_INFO_NETWORK_BOOT *)InformationBlock)->FCoeBootCapablity,\r
1186 ((EFI_ADAPTER_INFO_NETWORK_BOOT *)InformationBlock)->OffloadCapability,\r
1187 ((EFI_ADAPTER_INFO_NETWORK_BOOT *)InformationBlock)->iScsiMpioCapability,\r
1188 ((EFI_ADAPTER_INFO_NETWORK_BOOT *)InformationBlock)->iScsiIpv4Boot,\r
1189 ((EFI_ADAPTER_INFO_NETWORK_BOOT *)InformationBlock)->iScsiIpv6Boot,\r
1190 ((EFI_ADAPTER_INFO_NETWORK_BOOT *)InformationBlock)->FCoeBoot\r
1191 );\r
1192 SHELL_FREE_NON_NULL (RetVal);\r
1193 RetVal = TempRetVal;\r
1194 } else if (CompareGuid (&InfoTypesBuffer[GuidIndex], &gEfiAdapterInfoSanMacAddressGuid) == TRUE) {\r
59febea1 1195 TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_SAN_MAC_ADDRESS_INFO), NULL);\r
1d6ccad2
QS
1196 if (TempStr == NULL) {\r
1197 goto ERROR_EXIT;\r
1198 }\r
1a6f74d9
CS
1199 TempRetVal = CatSPrint (\r
1200 RetVal,\r
1201 TempStr,\r
1202 ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS *)InformationBlock)->SanMacAddress.Addr[0],\r
1203 ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS *)InformationBlock)->SanMacAddress.Addr[1],\r
1204 ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS *)InformationBlock)->SanMacAddress.Addr[2],\r
1205 ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS *)InformationBlock)->SanMacAddress.Addr[3],\r
1206 ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS *)InformationBlock)->SanMacAddress.Addr[4],\r
1207 ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS *)InformationBlock)->SanMacAddress.Addr[5]\r
1208 );\r
1209 SHELL_FREE_NON_NULL (RetVal);\r
1210 RetVal = TempRetVal;\r
256aa6d0
SEHM
1211 } else if (CompareGuid (&InfoTypesBuffer[GuidIndex], &gEfiAdapterInfoUndiIpv6SupportGuid) == TRUE) {\r
1212 TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_UNDI_IPV6_INFO), NULL);\r
1213 if (TempStr == NULL) {\r
1214 goto ERROR_EXIT;\r
1215 }\r
1216\r
1217 TempRetVal = CatSPrint (\r
1218 RetVal,\r
1219 TempStr,\r
1220 ((EFI_ADAPTER_INFO_UNDI_IPV6_SUPPORT *)InformationBlock)->Ipv6Support\r
e918029f 1221 );\r
256aa6d0
SEHM
1222 SHELL_FREE_NON_NULL (RetVal);\r
1223 RetVal = TempRetVal;\r
59febea1
SEHM
1224 } else {\r
1225 TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_UNKNOWN_INFO_TYPE), NULL);\r
1d6ccad2
QS
1226 if (TempStr == NULL) {\r
1227 goto ERROR_EXIT;\r
1228 }\r
1a6f74d9
CS
1229 TempRetVal = CatSPrint (RetVal, TempStr, &InfoTypesBuffer[GuidIndex]);\r
1230 SHELL_FREE_NON_NULL (RetVal);\r
1231 RetVal = TempRetVal;\r
59febea1
SEHM
1232 }\r
1233 }\r
1234 SHELL_FREE_NON_NULL (TempStr);\r
1235 SHELL_FREE_NON_NULL (InformationBlock);\r
1236 }\r
1237 }\r
1238\r
1d6ccad2 1239 SHELL_FREE_NON_NULL (InfoTypesBuffer);\r
59febea1 1240 return RetVal;\r
1d6ccad2
QS
1241\r
1242ERROR_EXIT:\r
1243 SHELL_FREE_NON_NULL (RetVal);\r
1244 SHELL_FREE_NON_NULL (InfoTypesBuffer);\r
1245 SHELL_FREE_NON_NULL (InformationBlock);\r
1246 return NULL;\r
59febea1 1247}\r
8985d612
TS
1248\r
1249/**\r
1250 Function to dump information about EFI_FIRMWARE_MANAGEMENT_PROTOCOL Protocol.\r
1251\r
1252 @param[in] TheHandle The handle that has the protocol installed.\r
1253 @param[in] Verbose TRUE for additional information, FALSE otherwise.\r
1254\r
1255 @retval A pointer to a string containing the information.\r
1256**/\r
1257CHAR16*\r
1258EFIAPI\r
1259FirmwareManagementDumpInformation (\r
1260 IN CONST EFI_HANDLE TheHandle,\r
1261 IN CONST BOOLEAN Verbose\r
1262 )\r
1263{\r
1264 EFI_STATUS Status;\r
1265 EFI_FIRMWARE_MANAGEMENT_PROTOCOL *EfiFwMgmtProtocol;\r
1266 EFI_FIRMWARE_IMAGE_DESCRIPTOR *ImageInfo;\r
1267 EFI_FIRMWARE_IMAGE_DESCRIPTOR_V1 *ImageInfoV1;\r
1268 EFI_FIRMWARE_IMAGE_DESCRIPTOR_V2 *ImageInfoV2;\r
1269 UINT64 AttributeSetting;\r
1270 UINTN ImageInfoSize;\r
1271 UINTN DescriptorSize;\r
1272 UINT32 DescriptorVersion;\r
1273 UINT32 PackageVersion;\r
1274 UINT8 DescriptorCount;\r
1275 UINT8 Index;\r
1276 UINT8 Index1;\r
1277 UINT8 ImageCount;\r
1278 CHAR16 *PackageVersionName;\r
1279 CHAR16 *TempStr;\r
1280 CHAR16 *RetVal;\r
1281 CHAR16 *TempRetVal;\r
1282 CHAR16 *AttributeSettingStr;\r
1283 BOOLEAN Found;\r
1284 BOOLEAN AttributeSupported;\r
1285\r
1286 //\r
1287 // Initialize local variables\r
1288 //\r
1289 ImageCount = 0;\r
1290 ImageInfoSize = 1;\r
1291 AttributeSetting = 0;\r
1292 Found = FALSE;\r
1293 AttributeSupported = FALSE;\r
1294 ImageInfo = NULL;\r
1295 ImageInfoV1 = NULL;\r
1296 ImageInfoV2 = NULL;\r
1297 PackageVersionName = NULL;\r
1298 RetVal = NULL;\r
1299 TempRetVal = NULL;\r
1300 TempStr = NULL;\r
1301 AttributeSettingStr = NULL;\r
1302\r
1303 if (!Verbose) {\r
1304 return (CatSPrint(NULL, L"FirmwareManagement"));\r
1305 }\r
1306\r
1307 Status = gBS->OpenProtocol (\r
1308 (EFI_HANDLE) (TheHandle),\r
1309 &gEfiFirmwareManagementProtocolGuid,\r
1310 (VOID **) &EfiFwMgmtProtocol,\r
1311 NULL,\r
1312 NULL,\r
1313 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
1314 );\r
1315\r
1316 if (EFI_ERROR (Status)) {\r
1317 return NULL;\r
1318 }\r
1319\r
1320 Status = EfiFwMgmtProtocol->GetImageInfo (\r
1321 EfiFwMgmtProtocol,\r
1322 &ImageInfoSize,\r
1323 ImageInfo,\r
1324 &DescriptorVersion,\r
1325 &DescriptorCount,\r
1326 &DescriptorSize,\r
1327 &PackageVersion,\r
1328 &PackageVersionName\r
1329 );\r
1330\r
1331 if (Status == EFI_BUFFER_TOO_SMALL) {\r
1332 ImageInfo = AllocateZeroPool (ImageInfoSize);\r
1333\r
1334 if (ImageInfo == NULL) {\r
1335 Status = EFI_OUT_OF_RESOURCES;\r
1336 } else {\r
1337 Status = EfiFwMgmtProtocol->GetImageInfo (\r
1338 EfiFwMgmtProtocol,\r
1339 &ImageInfoSize,\r
1340 ImageInfo,\r
1341 &DescriptorVersion,\r
1342 &DescriptorCount,\r
1343 &DescriptorSize,\r
1344 &PackageVersion,\r
1345 &PackageVersionName\r
1346 );\r
1347 }\r
1348 }\r
1349\r
1350 if (EFI_ERROR (Status)) {\r
1351 goto ERROR_EXIT;\r
1352 }\r
1353\r
1354 //\r
1355 // Decode Image Descriptor data only if its version is supported\r
1356 //\r
1357 if (DescriptorVersion <= EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION) {\r
1358\r
1359 if (ImageInfo == NULL) {\r
1360 goto ERROR_EXIT;\r
1361 }\r
1362\r
1363 ImageInfoV1 = (EFI_FIRMWARE_IMAGE_DESCRIPTOR_V1 *)ImageInfo;\r
1364 ImageInfoV2 = (EFI_FIRMWARE_IMAGE_DESCRIPTOR_V2 *)ImageInfo;\r
1365\r
1366 //\r
1367 // Set ImageInfoSize in return buffer\r
1368 //\r
1369 TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_FMP_IMAGE_INFO_SIZE), NULL);\r
1370 if (TempStr == NULL) {\r
1371 goto ERROR_EXIT;\r
1372 }\r
1373 RetVal = CatSPrint (NULL, TempStr, ImageInfoSize);\r
1374 SHELL_FREE_NON_NULL (TempStr);\r
1375\r
1376 //\r
1377 // Set DescriptorVersion in return buffer\r
1378 //\r
1379 TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_FMP_DESCRIPTOR_VERSION), NULL);\r
1380 if (TempStr == NULL) {\r
1381 goto ERROR_EXIT;\r
1382 }\r
1383 TempRetVal = CatSPrint (RetVal, TempStr, DescriptorVersion);\r
1384 SHELL_FREE_NON_NULL (RetVal);\r
1385 RetVal = TempRetVal;\r
1386 SHELL_FREE_NON_NULL (TempStr);\r
1387\r
1388 //\r
1389 // Set DescriptorCount in return buffer\r
1390 //\r
1391 TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_FMP_DESCRIPTOR_COUNT), NULL);\r
1392 if (TempStr == NULL) {\r
1393 goto ERROR_EXIT;\r
1394 }\r
1395 TempRetVal = CatSPrint (RetVal, TempStr, DescriptorCount);\r
1396 SHELL_FREE_NON_NULL (RetVal);\r
1397 RetVal = TempRetVal;\r
1398 SHELL_FREE_NON_NULL (TempStr);\r
1399\r
1400\r
1401 //\r
1402 // Set DescriptorSize in return buffer\r
1403 //\r
1404 TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_FMP_DESCRIPTOR_SIZE), NULL);\r
1405 if (TempStr == NULL) {\r
1406 goto ERROR_EXIT;\r
1407 }\r
1408 TempRetVal = CatSPrint (RetVal, TempStr, DescriptorSize);\r
1409 SHELL_FREE_NON_NULL (RetVal);\r
1410 RetVal = TempRetVal;\r
1411 SHELL_FREE_NON_NULL (TempStr);\r
1412\r
1413 //\r
1414 // Set PackageVersion in return buffer\r
1415 //\r
1416 TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_FMP_PACKAGE_VERSION), NULL);\r
1417 if (TempStr == NULL) {\r
1418 goto ERROR_EXIT;\r
1419 }\r
1420 TempRetVal = CatSPrint (RetVal, TempStr, PackageVersion);\r
1421 SHELL_FREE_NON_NULL (RetVal);\r
1422 RetVal = TempRetVal;\r
1423 SHELL_FREE_NON_NULL (TempStr);\r
1424\r
1425 //\r
1426 // Set PackageVersionName in return buffer\r
1427 //\r
1428 TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_FMP_PACKAGE_VERSION_NAME), NULL);\r
1429 if (TempStr == NULL) {\r
1430 goto ERROR_EXIT;\r
1431 }\r
1432 TempRetVal = CatSPrint (RetVal, TempStr, PackageVersionName);\r
1433 SHELL_FREE_NON_NULL (RetVal);\r
1434 RetVal = TempRetVal;\r
1435 SHELL_FREE_NON_NULL (TempStr);\r
1436\r
1437 for (Index = 0; Index < DescriptorCount; Index++) {\r
1438 //\r
1439 // First check if Attribute is supported\r
1440 // and generate a string for AttributeSetting field\r
1441 //\r
1442 SHELL_FREE_NON_NULL (AttributeSettingStr);\r
1443 AttributeSupported = FALSE;\r
1444 AttributeSetting = 0;\r
1445 if (DescriptorVersion == EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION_V1) {\r
1446 if (ImageInfoV1[Index].AttributesSupported != 0x0) {\r
1447 AttributeSupported = TRUE;\r
1448 AttributeSetting = ImageInfoV1[Index].AttributesSetting;\r
1449 }\r
1450 } else if (DescriptorVersion == EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION_V2) {\r
1451 if (ImageInfoV2[Index].AttributesSupported != 0x0) {\r
1452 AttributeSupported = TRUE;\r
1453 AttributeSetting = ImageInfoV2[Index].AttributesSetting;\r
1454 }\r
1455 } else {\r
1456 if (ImageInfo[Index].AttributesSupported != 0x0) {\r
1457 AttributeSupported = TRUE;\r
1458 AttributeSetting = ImageInfo[Index].AttributesSetting;\r
1459 }\r
1460 }\r
1461\r
1462 if (!AttributeSupported) {\r
1463 AttributeSettingStr = CatSPrint (NULL, L"None");\r
1464 } else {\r
1465 AttributeSettingStr = CatSPrint (NULL, L"(");\r
1466\r
ac14846a 1467 if ((AttributeSetting & IMAGE_ATTRIBUTE_IMAGE_UPDATABLE) != 0x0) {\r
8985d612
TS
1468 TempRetVal = CatSPrint (AttributeSettingStr, L" IMAGE_ATTRIBUTE_IMAGE_UPDATABLE");\r
1469 SHELL_FREE_NON_NULL (AttributeSettingStr);\r
1470 AttributeSettingStr = TempRetVal;\r
1471 }\r
ac14846a 1472 if ((AttributeSetting & IMAGE_ATTRIBUTE_RESET_REQUIRED) != 0x0) {\r
8985d612
TS
1473 TempRetVal = CatSPrint (AttributeSettingStr, L" IMAGE_ATTRIBUTE_RESET_REQUIRED");\r
1474 SHELL_FREE_NON_NULL (AttributeSettingStr);\r
1475 AttributeSettingStr = TempRetVal;\r
1476 }\r
ac14846a 1477 if ((AttributeSetting & IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED) != 0x0) {\r
8985d612
TS
1478 TempRetVal = CatSPrint (AttributeSettingStr, L" IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED");\r
1479 SHELL_FREE_NON_NULL (AttributeSettingStr);\r
1480 AttributeSettingStr = TempRetVal;\r
1481 }\r
ac14846a 1482 if ((AttributeSetting & IMAGE_ATTRIBUTE_IN_USE) != 0x0) {\r
8985d612
TS
1483 TempRetVal = CatSPrint (AttributeSettingStr, L" IMAGE_ATTRIBUTE_IN_USE");\r
1484 SHELL_FREE_NON_NULL (AttributeSettingStr);\r
1485 AttributeSettingStr = TempRetVal;\r
1486 }\r
ac14846a 1487 if ((AttributeSetting & IMAGE_ATTRIBUTE_UEFI_IMAGE) != 0x0) {\r
8985d612
TS
1488 TempRetVal = CatSPrint (AttributeSettingStr, L" IMAGE_ATTRIBUTE_UEFI_IMAGE");\r
1489 SHELL_FREE_NON_NULL (AttributeSettingStr);\r
1490 AttributeSettingStr = TempRetVal;\r
1491 }\r
1492 TempRetVal = CatSPrint (AttributeSettingStr, L" )");\r
1493 SHELL_FREE_NON_NULL (AttributeSettingStr);\r
1494 AttributeSettingStr = TempRetVal;\r
1495 }\r
1496\r
1497 if (DescriptorVersion == EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION_V1) {\r
1498 if (ImageInfoV1[Index].ImageIndex != 0x0) {\r
1499 ImageCount++;\r
1500 }\r
1501\r
1502 TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_FMP_IMAGE_DESCRIPTOR_INFO_V1), NULL);\r
1503 if (TempStr == NULL) {\r
1504 goto ERROR_EXIT;\r
1505 }\r
1506 TempRetVal = CatSPrint (\r
1507 RetVal,\r
1508 TempStr,\r
1509 Index,\r
1510 ImageInfoV1[Index].ImageIndex,\r
e06a4c08 1511 &ImageInfoV1[Index].ImageTypeId,\r
8985d612
TS
1512 ImageInfoV1[Index].ImageId,\r
1513 ImageInfoV1[Index].ImageIdName,\r
1514 ImageInfoV1[Index].Version,\r
1515 ImageInfoV1[Index].VersionName,\r
1516 ImageInfoV1[Index].Size,\r
1517 ImageInfoV1[Index].AttributesSupported,\r
1518 AttributeSettingStr,\r
1519 ImageInfoV1[Index].Compatibilities\r
1520 );\r
1521 SHELL_FREE_NON_NULL (RetVal);\r
1522 RetVal = TempRetVal;\r
1523 SHELL_FREE_NON_NULL (TempStr);\r
1524 } else if (DescriptorVersion == EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION_V2) {\r
1525 if (ImageInfoV2[Index].ImageIndex != 0x0) {\r
1526 ImageCount++;\r
1527 }\r
1528\r
1529 TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_FMP_IMAGE_DESCRIPTOR_INFO_V2), NULL);\r
1530 if (TempStr == NULL) {\r
1531 goto ERROR_EXIT;\r
1532 }\r
1533 TempRetVal = CatSPrint (\r
1534 RetVal,\r
1535 TempStr,\r
1536 Index,\r
1537 ImageInfoV2[Index].ImageIndex,\r
e06a4c08 1538 &ImageInfoV2[Index].ImageTypeId,\r
8985d612
TS
1539 ImageInfoV2[Index].ImageId,\r
1540 ImageInfoV2[Index].ImageIdName,\r
1541 ImageInfoV2[Index].Version,\r
1542 ImageInfoV2[Index].VersionName,\r
1543 ImageInfoV2[Index].Size,\r
1544 ImageInfoV2[Index].AttributesSupported,\r
1545 AttributeSettingStr,\r
1546 ImageInfoV2[Index].Compatibilities,\r
1547 ImageInfoV2[Index].LowestSupportedImageVersion\r
1548 );\r
1549 SHELL_FREE_NON_NULL (RetVal);\r
1550 RetVal = TempRetVal;\r
1551 SHELL_FREE_NON_NULL (TempStr);\r
1552 } else {\r
1553 if (ImageInfo[Index].ImageIndex != 0x0) {\r
1554 ImageCount++;\r
1555 }\r
1556\r
1557 TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_FMP_IMAGE_DESCRIPTOR_INFO), NULL);\r
1558 if (TempStr == NULL) {\r
1559 goto ERROR_EXIT;\r
1560 }\r
1561 TempRetVal = CatSPrint (\r
1562 RetVal,\r
1563 TempStr,\r
1564 Index,\r
1565 ImageInfo[Index].ImageIndex,\r
e06a4c08 1566 &ImageInfo[Index].ImageTypeId,\r
8985d612
TS
1567 ImageInfo[Index].ImageId,\r
1568 ImageInfo[Index].ImageIdName,\r
1569 ImageInfo[Index].Version,\r
1570 ImageInfo[Index].VersionName,\r
1571 ImageInfo[Index].Size,\r
1572 ImageInfo[Index].AttributesSupported,\r
1573 AttributeSettingStr,\r
1574 ImageInfo[Index].Compatibilities,\r
1575 ImageInfo[Index].LowestSupportedImageVersion,\r
1576 ImageInfo[Index].LastAttemptVersion,\r
1577 ImageInfo[Index].LastAttemptStatus,\r
1578 ImageInfo[Index].HardwareInstance\r
1579 );\r
1580 SHELL_FREE_NON_NULL (RetVal);\r
1581 RetVal = TempRetVal;\r
1582 SHELL_FREE_NON_NULL (TempStr);\r
1583 }\r
1584 }\r
1585 }\r
1586\r
1587 if (ImageCount > 0) {\r
1588 for (Index=0; Index<DescriptorCount; Index++) {\r
1589 for (Index1=Index+1; Index1<DescriptorCount; Index1++) {\r
1590 if (DescriptorVersion == EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION_V1) {\r
1591 if (ImageInfoV1[Index].ImageId == ImageInfoV1[Index1].ImageId) {\r
1592 Found = TRUE;\r
1593 //\r
1594 // At least one match found indicating presense of non unique ImageId values so no more comparisons needed\r
1595 //\r
1596 goto ENDLOOP;\r
1597 }\r
1598 } else if (DescriptorVersion == EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION_V2) {\r
1599 if (ImageInfoV2[Index].ImageId == ImageInfoV2[Index1].ImageId) {\r
1600 Found = TRUE;\r
1601 //\r
1602 // At least one match found indicating presense of non unique ImageId values so no more comparisons needed\r
1603 //\r
1604 goto ENDLOOP;\r
1605 }\r
1606 } else {\r
1607 if (ImageInfo[Index].ImageId == ImageInfo[Index1].ImageId) {\r
1608 Found = TRUE;\r
1609 //\r
1610 // At least one match found indicating presense of non unique ImageId values so no more comparisons needed\r
1611 //\r
1612 goto ENDLOOP;\r
1613 }\r
1614 }\r
1615 }\r
1616 }\r
1617 }\r
1618\r
1619ENDLOOP:\r
1620 //\r
1621 // Check if ImageId with duplicate value was found\r
1622 //\r
ac14846a 1623 if (Found) {\r
8985d612
TS
1624 TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_FMP_IMAGEID_NON_UNIQUE), NULL);\r
1625 if (TempStr == NULL) {\r
1626 goto ERROR_EXIT;\r
1627 }\r
1628 TempRetVal = CatSPrint (RetVal, TempStr);\r
1629 SHELL_FREE_NON_NULL (RetVal);\r
1630 RetVal = TempRetVal;\r
1631 SHELL_FREE_NON_NULL (TempStr);\r
1632 }\r
1633\r
1634 SHELL_FREE_NON_NULL (ImageInfo);\r
1635 SHELL_FREE_NON_NULL (PackageVersionName);\r
1636 SHELL_FREE_NON_NULL (AttributeSettingStr);\r
1637\r
1638 return RetVal;\r
1639\r
1640ERROR_EXIT:\r
1641 SHELL_FREE_NON_NULL (RetVal);\r
1642 SHELL_FREE_NON_NULL (ImageInfo);\r
1643 SHELL_FREE_NON_NULL (PackageVersionName);\r
1644 SHELL_FREE_NON_NULL (AttributeSettingStr);\r
1645\r
1646 return NULL;\r
1647}\r
1648\r
a405b86d 1649//\r
1650// Put the information on the NT32 protocol GUIDs here so we are not dependant on the Nt32Pkg\r
1651//\r
1652#define LOCAL_EFI_WIN_NT_THUNK_PROTOCOL_GUID \\r
1653 { \\r
ce68d3bc 1654 0x58c518b1, 0x76f3, 0x11d4, { 0xbc, 0xea, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81 } \\r
a405b86d 1655 }\r
1656\r
1657#define LOCAL_EFI_WIN_NT_BUS_DRIVER_IO_PROTOCOL_GUID \\r
1658 { \\r
ce68d3bc 1659 0x96eb4ad6, 0xa32a, 0x11d4, { 0xbc, 0xfd, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81 } \\r
a405b86d 1660 }\r
1661\r
1662#define LOCAL_EFI_WIN_NT_SERIAL_PORT_GUID \\r
1663 { \\r
ce68d3bc 1664 0xc95a93d, 0xa006, 0x11d4, { 0xbc, 0xfa, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81 } \\r
a405b86d 1665 }\r
1666STATIC CONST EFI_GUID WinNtThunkProtocolGuid = LOCAL_EFI_WIN_NT_THUNK_PROTOCOL_GUID;\r
1667STATIC CONST EFI_GUID WinNtIoProtocolGuid = LOCAL_EFI_WIN_NT_BUS_DRIVER_IO_PROTOCOL_GUID;\r
1668STATIC CONST EFI_GUID WinNtSerialPortGuid = LOCAL_EFI_WIN_NT_SERIAL_PORT_GUID;\r
1669\r
2c23ddaa 1670//\r
1671// Deprecated protocols we dont want to link from IntelFrameworkModulePkg\r
1672//\r
1673#define LOCAL_EFI_ISA_IO_PROTOCOL_GUID \\r
1674 { \\r
1675 0x7ee2bd44, 0x3da0, 0x11d4, { 0x9a, 0x38, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d } \\r
1a6f74d9 1676 }\r
2c23ddaa 1677#define LOCAL_EFI_ISA_ACPI_PROTOCOL_GUID \\r
1678 { \\r
1679 0x64a892dc, 0x5561, 0x4536, { 0x92, 0xc7, 0x79, 0x9b, 0xfc, 0x18, 0x33, 0x55 } \\r
1680 }\r
1681STATIC CONST EFI_GUID EfiIsaIoProtocolGuid = LOCAL_EFI_ISA_IO_PROTOCOL_GUID;\r
1682STATIC CONST EFI_GUID EfiIsaAcpiProtocolGuid = LOCAL_EFI_ISA_ACPI_PROTOCOL_GUID;\r
1683\r
1684\r
dee34318 1685STATIC CONST GUID_INFO_BLOCK mGuidStringListNT[] = {\r
a405b86d 1686 {STRING_TOKEN(STR_WINNT_THUNK), (EFI_GUID*)&WinNtThunkProtocolGuid, NULL},\r
1687 {STRING_TOKEN(STR_WINNT_DRIVER_IO), (EFI_GUID*)&WinNtIoProtocolGuid, NULL},\r
1688 {STRING_TOKEN(STR_WINNT_SERIAL_PORT), (EFI_GUID*)&WinNtSerialPortGuid, NULL},\r
0e88348e 1689 {0, NULL, NULL},\r
a405b86d 1690};\r
1691\r
dee34318 1692STATIC CONST GUID_INFO_BLOCK mGuidStringList[] = {\r
efb76d1a 1693 {STRING_TOKEN(STR_LOADED_IMAGE), &gEfiLoadedImageProtocolGuid, LoadedImageProtocolDumpInformation},\r
a405b86d 1694 {STRING_TOKEN(STR_DEVICE_PATH), &gEfiDevicePathProtocolGuid, DevicePathProtocolDumpInformation},\r
5e32460d 1695 {STRING_TOKEN(STR_IMAGE_PATH), &gEfiLoadedImageDevicePathProtocolGuid, LoadedImageDevicePathProtocolDumpInformation},\r
a405b86d 1696 {STRING_TOKEN(STR_DEVICE_PATH_UTIL), &gEfiDevicePathUtilitiesProtocolGuid, NULL},\r
1697 {STRING_TOKEN(STR_DEVICE_PATH_TXT), &gEfiDevicePathToTextProtocolGuid, NULL},\r
1698 {STRING_TOKEN(STR_DEVICE_PATH_FTXT), &gEfiDevicePathFromTextProtocolGuid, NULL},\r
1699 {STRING_TOKEN(STR_DEVICE_PATH_PC), &gEfiPcAnsiGuid, NULL},\r
1700 {STRING_TOKEN(STR_DEVICE_PATH_VT100), &gEfiVT100Guid, NULL},\r
1701 {STRING_TOKEN(STR_DEVICE_PATH_VT100P), &gEfiVT100PlusGuid, NULL},\r
1702 {STRING_TOKEN(STR_DEVICE_PATH_VTUTF8), &gEfiVTUTF8Guid, NULL},\r
1703 {STRING_TOKEN(STR_DRIVER_BINDING), &gEfiDriverBindingProtocolGuid, NULL},\r
1704 {STRING_TOKEN(STR_PLATFORM_OVERRIDE), &gEfiPlatformDriverOverrideProtocolGuid, NULL},\r
d772f5f3 1705 {STRING_TOKEN(STR_BUS_OVERRIDE), &gEfiBusSpecificDriverOverrideProtocolGuid, BusSpecificDriverOverrideProtocolDumpInformation},\r
a405b86d 1706 {STRING_TOKEN(STR_DRIVER_DIAG), &gEfiDriverDiagnosticsProtocolGuid, NULL},\r
1707 {STRING_TOKEN(STR_DRIVER_DIAG2), &gEfiDriverDiagnostics2ProtocolGuid, NULL},\r
1708 {STRING_TOKEN(STR_DRIVER_CN), &gEfiComponentNameProtocolGuid, NULL},\r
1709 {STRING_TOKEN(STR_DRIVER_CN2), &gEfiComponentName2ProtocolGuid, NULL},\r
1710 {STRING_TOKEN(STR_PLAT_DRV_CFG), &gEfiPlatformToDriverConfigurationProtocolGuid, NULL},\r
1711 {STRING_TOKEN(STR_DRIVER_VERSION), &gEfiDriverSupportedEfiVersionProtocolGuid, DriverEfiVersionProtocolDumpInformation},\r
1712 {STRING_TOKEN(STR_TXT_IN), &gEfiSimpleTextInProtocolGuid, NULL},\r
1713 {STRING_TOKEN(STR_TXT_IN_EX), &gEfiSimpleTextInputExProtocolGuid, NULL},\r
1714 {STRING_TOKEN(STR_TXT_OUT), &gEfiSimpleTextOutProtocolGuid, TxtOutProtocolDumpInformation},\r
1715 {STRING_TOKEN(STR_SIM_POINTER), &gEfiSimplePointerProtocolGuid, NULL},\r
1716 {STRING_TOKEN(STR_ABS_POINTER), &gEfiAbsolutePointerProtocolGuid, NULL},\r
1717 {STRING_TOKEN(STR_SERIAL_IO), &gEfiSerialIoProtocolGuid, NULL},\r
609e0c58 1718 {STRING_TOKEN(STR_GRAPHICS_OUTPUT), &gEfiGraphicsOutputProtocolGuid, GraphicsOutputProtocolDumpInformation},\r
e918029f
RN
1719 {STRING_TOKEN(STR_EDID_DISCOVERED), &gEfiEdidDiscoveredProtocolGuid, EdidDiscoveredProtocolDumpInformation},\r
1720 {STRING_TOKEN(STR_EDID_ACTIVE), &gEfiEdidActiveProtocolGuid, EdidActiveProtocolDumpInformation},\r
a405b86d 1721 {STRING_TOKEN(STR_EDID_OVERRIDE), &gEfiEdidOverrideProtocolGuid, NULL},\r
1722 {STRING_TOKEN(STR_CON_IN), &gEfiConsoleInDeviceGuid, NULL},\r
1723 {STRING_TOKEN(STR_CON_OUT), &gEfiConsoleOutDeviceGuid, NULL},\r
1724 {STRING_TOKEN(STR_STD_ERR), &gEfiStandardErrorDeviceGuid, NULL},\r
1725 {STRING_TOKEN(STR_LOAD_FILE), &gEfiLoadFileProtocolGuid, NULL},\r
1726 {STRING_TOKEN(STR_LOAD_FILE2), &gEfiLoadFile2ProtocolGuid, NULL},\r
1727 {STRING_TOKEN(STR_SIMPLE_FILE_SYS), &gEfiSimpleFileSystemProtocolGuid, NULL},\r
a405b86d 1728 {STRING_TOKEN(STR_TAPE_IO), &gEfiTapeIoProtocolGuid, NULL},\r
1729 {STRING_TOKEN(STR_DISK_IO), &gEfiDiskIoProtocolGuid, NULL},\r
1730 {STRING_TOKEN(STR_BLK_IO), &gEfiBlockIoProtocolGuid, NULL},\r
1731 {STRING_TOKEN(STR_UC), &gEfiUnicodeCollationProtocolGuid, NULL},\r
1732 {STRING_TOKEN(STR_UC2), &gEfiUnicodeCollation2ProtocolGuid, NULL},\r
f4f3c6bf 1733 {STRING_TOKEN(STR_PCIRB_IO), &gEfiPciRootBridgeIoProtocolGuid, PciRootBridgeIoDumpInformation},\r
a405b86d 1734 {STRING_TOKEN(STR_PCI_IO), &gEfiPciIoProtocolGuid, NULL},\r
1735 {STRING_TOKEN(STR_SCSI_PT), &gEfiScsiPassThruProtocolGuid, NULL},\r
1736 {STRING_TOKEN(STR_SCSI_IO), &gEfiScsiIoProtocolGuid, NULL},\r
1737 {STRING_TOKEN(STR_SCSI_PT_EXT), &gEfiExtScsiPassThruProtocolGuid, NULL},\r
1738 {STRING_TOKEN(STR_ISCSI), &gEfiIScsiInitiatorNameProtocolGuid, NULL},\r
1739 {STRING_TOKEN(STR_USB_IO), &gEfiUsbIoProtocolGuid, NULL},\r
1740 {STRING_TOKEN(STR_USB_HC), &gEfiUsbHcProtocolGuid, NULL},\r
1741 {STRING_TOKEN(STR_USB_HC2), &gEfiUsb2HcProtocolGuid, NULL},\r
1742 {STRING_TOKEN(STR_DEBUG_SUPPORT), &gEfiDebugSupportProtocolGuid, NULL},\r
1743 {STRING_TOKEN(STR_DEBUG_PORT), &gEfiDebugPortProtocolGuid, NULL},\r
1744 {STRING_TOKEN(STR_DECOMPRESS), &gEfiDecompressProtocolGuid, NULL},\r
1745 {STRING_TOKEN(STR_ACPI_TABLE), &gEfiAcpiTableProtocolGuid, NULL},\r
1746 {STRING_TOKEN(STR_EBC_INTERPRETER), &gEfiEbcProtocolGuid, NULL},\r
1747 {STRING_TOKEN(STR_SNP), &gEfiSimpleNetworkProtocolGuid, NULL},\r
1748 {STRING_TOKEN(STR_NII), &gEfiNetworkInterfaceIdentifierProtocolGuid, NULL},\r
1749 {STRING_TOKEN(STR_NII_31), &gEfiNetworkInterfaceIdentifierProtocolGuid_31, NULL},\r
1750 {STRING_TOKEN(STR_PXE_BC), &gEfiPxeBaseCodeProtocolGuid, NULL},\r
1751 {STRING_TOKEN(STR_PXE_CB), &gEfiPxeBaseCodeCallbackProtocolGuid, NULL},\r
1752 {STRING_TOKEN(STR_BIS), &gEfiBisProtocolGuid, NULL},\r
1753 {STRING_TOKEN(STR_MNP_SB), &gEfiManagedNetworkServiceBindingProtocolGuid, NULL},\r
1754 {STRING_TOKEN(STR_MNP), &gEfiManagedNetworkProtocolGuid, NULL},\r
1755 {STRING_TOKEN(STR_ARP_SB), &gEfiArpServiceBindingProtocolGuid, NULL},\r
1756 {STRING_TOKEN(STR_ARP), &gEfiArpProtocolGuid, NULL},\r
1757 {STRING_TOKEN(STR_DHCPV4_SB), &gEfiDhcp4ServiceBindingProtocolGuid, NULL},\r
1758 {STRING_TOKEN(STR_DHCPV4), &gEfiDhcp4ProtocolGuid, NULL},\r
1759 {STRING_TOKEN(STR_TCPV4_SB), &gEfiTcp4ServiceBindingProtocolGuid, NULL},\r
1760 {STRING_TOKEN(STR_TCPV4), &gEfiTcp4ProtocolGuid, NULL},\r
1761 {STRING_TOKEN(STR_IPV4_SB), &gEfiIp4ServiceBindingProtocolGuid, NULL},\r
1762 {STRING_TOKEN(STR_IPV4), &gEfiIp4ProtocolGuid, NULL},\r
1763 {STRING_TOKEN(STR_IPV4_CFG), &gEfiIp4ConfigProtocolGuid, NULL},\r
00a6ad1b 1764 {STRING_TOKEN(STR_IPV4_CFG2), &gEfiIp4Config2ProtocolGuid, NULL},\r
a405b86d 1765 {STRING_TOKEN(STR_UDPV4_SB), &gEfiUdp4ServiceBindingProtocolGuid, NULL},\r
1766 {STRING_TOKEN(STR_UDPV4), &gEfiUdp4ProtocolGuid, NULL},\r
1767 {STRING_TOKEN(STR_MTFTPV4_SB), &gEfiMtftp4ServiceBindingProtocolGuid, NULL},\r
1768 {STRING_TOKEN(STR_MTFTPV4), &gEfiMtftp4ProtocolGuid, NULL},\r
1769 {STRING_TOKEN(STR_AUTH_INFO), &gEfiAuthenticationInfoProtocolGuid, NULL},\r
1770 {STRING_TOKEN(STR_HASH_SB), &gEfiHashServiceBindingProtocolGuid, NULL},\r
1771 {STRING_TOKEN(STR_HASH), &gEfiHashProtocolGuid, NULL},\r
1772 {STRING_TOKEN(STR_HII_FONT), &gEfiHiiFontProtocolGuid, NULL},\r
1773 {STRING_TOKEN(STR_HII_STRING), &gEfiHiiStringProtocolGuid, NULL},\r
1774 {STRING_TOKEN(STR_HII_IMAGE), &gEfiHiiImageProtocolGuid, NULL},\r
1775 {STRING_TOKEN(STR_HII_DATABASE), &gEfiHiiDatabaseProtocolGuid, NULL},\r
1776 {STRING_TOKEN(STR_HII_CONFIG_ROUT), &gEfiHiiConfigRoutingProtocolGuid, NULL},\r
1777 {STRING_TOKEN(STR_HII_CONFIG_ACC), &gEfiHiiConfigAccessProtocolGuid, NULL},\r
1778 {STRING_TOKEN(STR_HII_FORM_BROWSER2), &gEfiFormBrowser2ProtocolGuid, NULL},\r
dee34318 1779 {STRING_TOKEN(STR_DRIVER_FAM_OVERRIDE), &gEfiDriverFamilyOverrideProtocolGuid, NULL},\r
1780 {STRING_TOKEN(STR_PCD), &gPcdProtocolGuid, NULL},\r
1781 {STRING_TOKEN(STR_TCG), &gEfiTcgProtocolGuid, NULL},\r
1782 {STRING_TOKEN(STR_HII_PACKAGE_LIST), &gEfiHiiPackageListProtocolGuid, NULL},\r
1783\r
1784//\r
1785// the ones under this are deprecated by the current UEFI Spec, but may be found anyways...\r
1786//\r
a405b86d 1787 {STRING_TOKEN(STR_SHELL_INTERFACE), &gEfiShellInterfaceGuid, NULL},\r
1788 {STRING_TOKEN(STR_SHELL_ENV2), &gEfiShellEnvironment2Guid, NULL},\r
1789 {STRING_TOKEN(STR_SHELL_ENV), &gEfiShellEnvironment2Guid, NULL},\r
1790 {STRING_TOKEN(STR_DEVICE_IO), &gEfiDeviceIoProtocolGuid, NULL},\r
1791 {STRING_TOKEN(STR_UGA_DRAW), &gEfiUgaDrawProtocolGuid, NULL},\r
1792 {STRING_TOKEN(STR_UGA_IO), &gEfiUgaIoProtocolGuid, NULL},\r
1793 {STRING_TOKEN(STR_ESP), &gEfiPartTypeSystemPartGuid, NULL},\r
1794 {STRING_TOKEN(STR_GPT_NBR), &gEfiPartTypeLegacyMbrGuid, NULL},\r
1795 {STRING_TOKEN(STR_DRIVER_CONFIG), &gEfiDriverConfigurationProtocolGuid, NULL},\r
1796 {STRING_TOKEN(STR_DRIVER_CONFIG2), &gEfiDriverConfiguration2ProtocolGuid, NULL},\r
2c23ddaa 1797\r
1798//\r
1799// these are using local (non-global) definitions to reduce package dependancy.\r
1800//\r
1801 {STRING_TOKEN(STR_ISA_IO), (EFI_GUID*)&EfiIsaIoProtocolGuid, NULL},\r
1802 {STRING_TOKEN(STR_ISA_ACPI), (EFI_GUID*)&EfiIsaAcpiProtocolGuid, NULL},\r
dee34318 1803\r
1804//\r
1805// the ones under this are GUID identified structs, not protocols\r
1806//\r
1807 {STRING_TOKEN(STR_FILE_INFO), &gEfiFileInfoGuid, NULL},\r
1808 {STRING_TOKEN(STR_FILE_SYS_INFO), &gEfiFileSystemInfoGuid, NULL},\r
1809\r
1810//\r
1811// the ones under this are misc GUIDS.\r
1812//\r
1813 {STRING_TOKEN(STR_EFI_GLOBAL_VARIABLE), &gEfiGlobalVariableGuid, NULL},\r
1814\r
1815//\r
1816// UEFI 2.2\r
1817//\r
1818 {STRING_TOKEN(STR_IP6_SB), &gEfiIp6ServiceBindingProtocolGuid, NULL},\r
1819 {STRING_TOKEN(STR_IP6), &gEfiIp6ProtocolGuid, NULL},\r
1820 {STRING_TOKEN(STR_IP6_CONFIG), &gEfiIp6ConfigProtocolGuid, NULL},\r
1821 {STRING_TOKEN(STR_MTFTP6_SB), &gEfiMtftp6ServiceBindingProtocolGuid, NULL},\r
1822 {STRING_TOKEN(STR_MTFTP6), &gEfiMtftp6ProtocolGuid, NULL},\r
1823 {STRING_TOKEN(STR_DHCP6_SB), &gEfiDhcp6ServiceBindingProtocolGuid, NULL},\r
1824 {STRING_TOKEN(STR_DHCP6), &gEfiDhcp6ProtocolGuid, NULL},\r
1825 {STRING_TOKEN(STR_UDP6_SB), &gEfiUdp6ServiceBindingProtocolGuid, NULL},\r
1826 {STRING_TOKEN(STR_UDP6), &gEfiUdp6ProtocolGuid, NULL},\r
1827 {STRING_TOKEN(STR_TCP6_SB), &gEfiTcp6ServiceBindingProtocolGuid, NULL},\r
1828 {STRING_TOKEN(STR_TCP6), &gEfiTcp6ProtocolGuid, NULL},\r
1829 {STRING_TOKEN(STR_VLAN_CONFIG), &gEfiVlanConfigProtocolGuid, NULL},\r
1830 {STRING_TOKEN(STR_EAP), &gEfiEapProtocolGuid, NULL},\r
1831 {STRING_TOKEN(STR_EAP_MGMT), &gEfiEapManagementProtocolGuid, NULL},\r
1832 {STRING_TOKEN(STR_FTP4_SB), &gEfiFtp4ServiceBindingProtocolGuid, NULL},\r
1833 {STRING_TOKEN(STR_FTP4), &gEfiFtp4ProtocolGuid, NULL},\r
1834 {STRING_TOKEN(STR_IP_SEC_CONFIG), &gEfiIpSecConfigProtocolGuid, NULL},\r
1835 {STRING_TOKEN(STR_DH), &gEfiDriverHealthProtocolGuid, NULL},\r
1836 {STRING_TOKEN(STR_DEF_IMG_LOAD), &gEfiDeferredImageLoadProtocolGuid, NULL},\r
1837 {STRING_TOKEN(STR_USER_CRED), &gEfiUserCredentialProtocolGuid, NULL},\r
1838 {STRING_TOKEN(STR_USER_MNGR), &gEfiUserManagerProtocolGuid, NULL},\r
1839 {STRING_TOKEN(STR_ATA_PASS_THRU), &gEfiAtaPassThruProtocolGuid, NULL},\r
1840\r
1841//\r
1842// UEFI 2.3\r
1843//\r
8985d612 1844 {STRING_TOKEN(STR_FW_MGMT), &gEfiFirmwareManagementProtocolGuid, FirmwareManagementDumpInformation},\r
dee34318 1845 {STRING_TOKEN(STR_IP_SEC), &gEfiIpSecProtocolGuid, NULL},\r
1846 {STRING_TOKEN(STR_IP_SEC2), &gEfiIpSec2ProtocolGuid, NULL},\r
1847\r
1848//\r
1849// UEFI 2.3.1\r
1850//\r
1851 {STRING_TOKEN(STR_KMS), &gEfiKmsProtocolGuid, NULL},\r
1852 {STRING_TOKEN(STR_BLK_IO2), &gEfiBlockIo2ProtocolGuid, NULL},\r
1853 {STRING_TOKEN(STR_SSC), &gEfiStorageSecurityCommandProtocolGuid, NULL},\r
12f1a36c 1854 {STRING_TOKEN(STR_UCRED2), &gEfiUserCredential2ProtocolGuid, NULL},\r
dee34318 1855\r
28cdb62b
CP
1856//\r
1857// UEFI 2.4\r
1858//\r
1859 {STRING_TOKEN(STR_DISK_IO2), &gEfiDiskIo2ProtocolGuid, NULL},\r
59febea1 1860 {STRING_TOKEN(STR_ADAPTER_INFO), &gEfiAdapterInformationProtocolGuid, AdapterInformationDumpInformation},\r
28cdb62b 1861\r
6b640b4a
JC
1862//\r
1863// PI Spec ones\r
1864//\r
1865 {STRING_TOKEN(STR_IDE_CONT_INIT), &gEfiIdeControllerInitProtocolGuid, NULL},\r
4024c116 1866 {STRING_TOKEN(STR_DISK_INFO), &gEfiDiskInfoProtocolGuid, NULL},\r
6b640b4a 1867\r
c2788f1c
JC
1868//\r
1869// PI Spec 1.0\r
1870//\r
1871 {STRING_TOKEN(STR_BDS_ARCH), &gEfiBdsArchProtocolGuid, NULL},\r
1872 {STRING_TOKEN(STR_CPU_ARCH), &gEfiCpuArchProtocolGuid, NULL},\r
1873 {STRING_TOKEN(STR_MET_ARCH), &gEfiMetronomeArchProtocolGuid, NULL},\r
1874 {STRING_TOKEN(STR_MON_ARCH), &gEfiMonotonicCounterArchProtocolGuid, NULL},\r
1875 {STRING_TOKEN(STR_RTC_ARCH), &gEfiRealTimeClockArchProtocolGuid, NULL},\r
1876 {STRING_TOKEN(STR_RESET_ARCH), &gEfiResetArchProtocolGuid, NULL},\r
1877 {STRING_TOKEN(STR_RT_ARCH), &gEfiRuntimeArchProtocolGuid, NULL},\r
1878 {STRING_TOKEN(STR_SEC_ARCH), &gEfiSecurityArchProtocolGuid, NULL},\r
1879 {STRING_TOKEN(STR_TIMER_ARCH), &gEfiTimerArchProtocolGuid, NULL},\r
1880 {STRING_TOKEN(STR_VAR_ARCH), &gEfiVariableWriteArchProtocolGuid, NULL},\r
1881 {STRING_TOKEN(STR_V_ARCH), &gEfiVariableArchProtocolGuid, NULL},\r
1882 {STRING_TOKEN(STR_SECP), &gEfiSecurityPolicyProtocolGuid, NULL},\r
1883 {STRING_TOKEN(STR_WDT_ARCH), &gEfiWatchdogTimerArchProtocolGuid, NULL},\r
1884 {STRING_TOKEN(STR_SCR), &gEfiStatusCodeRuntimeProtocolGuid, NULL},\r
1885 {STRING_TOKEN(STR_SMB_HC), &gEfiSmbusHcProtocolGuid, NULL},\r
1886 {STRING_TOKEN(STR_FV_2), &gEfiFirmwareVolume2ProtocolGuid, NULL},\r
1887 {STRING_TOKEN(STR_FV_BLOCK), &gEfiFirmwareVolumeBlockProtocolGuid, NULL},\r
1888 {STRING_TOKEN(STR_CAP_ARCH), &gEfiCapsuleArchProtocolGuid, NULL},\r
1889 {STRING_TOKEN(STR_MP_SERVICE), &gEfiMpServiceProtocolGuid, NULL},\r
1890 {STRING_TOKEN(STR_HBRAP), &gEfiPciHostBridgeResourceAllocationProtocolGuid, NULL},\r
1891 {STRING_TOKEN(STR_PCIP), &gEfiPciPlatformProtocolGuid, NULL},\r
1892 {STRING_TOKEN(STR_PCIO), &gEfiPciOverrideProtocolGuid, NULL},\r
1893 {STRING_TOKEN(STR_PCIE), &gEfiPciEnumerationCompleteProtocolGuid, NULL},\r
1894 {STRING_TOKEN(STR_IPCID), &gEfiIncompatiblePciDeviceSupportProtocolGuid, NULL},\r
1895 {STRING_TOKEN(STR_PCIHPI), &gEfiPciHotPlugInitProtocolGuid, NULL},\r
1896 {STRING_TOKEN(STR_PCIHPR), &gEfiPciHotPlugRequestProtocolGuid, NULL},\r
1897 {STRING_TOKEN(STR_SMBIOS), &gEfiSmbiosProtocolGuid, NULL},\r
1898 {STRING_TOKEN(STR_S3_SAVE), &gEfiS3SaveStateProtocolGuid, NULL},\r
1899 {STRING_TOKEN(STR_S3_S_SMM), &gEfiS3SmmSaveStateProtocolGuid, NULL},\r
1900 {STRING_TOKEN(STR_RSC), &gEfiRscHandlerProtocolGuid, NULL},\r
1901 {STRING_TOKEN(STR_S_RSC), &gEfiSmmRscHandlerProtocolGuid, NULL},\r
1902 {STRING_TOKEN(STR_ACPI_SDT), &gEfiAcpiSdtProtocolGuid, NULL},\r
1903 {STRING_TOKEN(STR_SIO), &gEfiSioProtocolGuid, NULL},\r
1904 {STRING_TOKEN(STR_S_CPU2), &gEfiSmmCpuIo2ProtocolGuid, NULL},\r
1905 {STRING_TOKEN(STR_S_BASE2), &gEfiSmmBase2ProtocolGuid, NULL},\r
1906 {STRING_TOKEN(STR_S_ACC_2), &gEfiSmmAccess2ProtocolGuid, NULL},\r
1907 {STRING_TOKEN(STR_S_CON_2), &gEfiSmmControl2ProtocolGuid, NULL},\r
1908 {STRING_TOKEN(STR_S_CONFIG), &gEfiSmmConfigurationProtocolGuid, NULL},\r
1909 {STRING_TOKEN(STR_S_RTL), &gEfiSmmReadyToLockProtocolGuid, NULL},\r
1910 {STRING_TOKEN(STR_DS_RTL), &gEfiDxeSmmReadyToLockProtocolGuid, NULL},\r
1911 {STRING_TOKEN(STR_S_COMM), &gEfiSmmCommunicationProtocolGuid, NULL},\r
1912 {STRING_TOKEN(STR_S_STAT), &gEfiSmmStatusCodeProtocolGuid, NULL},\r
1913 {STRING_TOKEN(STR_S_CPU), &gEfiSmmCpuProtocolGuid, NULL},\r
1914 {STRING_TOKEN(STR_S_PCIRBIO), &gEfiPciRootBridgeIoProtocolGuid, NULL},\r
1915 {STRING_TOKEN(STR_S_SWD), &gEfiSmmSwDispatch2ProtocolGuid, NULL},\r
1916 {STRING_TOKEN(STR_S_SXD), &gEfiSmmSxDispatch2ProtocolGuid, NULL},\r
1917 {STRING_TOKEN(STR_S_PTD2), &gEfiSmmPeriodicTimerDispatch2ProtocolGuid, NULL},\r
1918 {STRING_TOKEN(STR_S_UD2), &gEfiSmmUsbDispatch2ProtocolGuid, NULL},\r
1919 {STRING_TOKEN(STR_S_GD2), &gEfiSmmGpiDispatch2ProtocolGuid, NULL},\r
1920 {STRING_TOKEN(STR_S_SBD2), &gEfiSmmStandbyButtonDispatch2ProtocolGuid, NULL},\r
1921 {STRING_TOKEN(STR_S_PBD2), &gEfiSmmPowerButtonDispatch2ProtocolGuid, NULL},\r
1922 {STRING_TOKEN(STR_S_ITD2), &gEfiSmmIoTrapDispatch2ProtocolGuid, NULL},\r
1923 {STRING_TOKEN(STR_PCD), &gEfiPcdProtocolGuid, NULL},\r
1924 {STRING_TOKEN(STR_FVB2), &gEfiFirmwareVolumeBlock2ProtocolGuid, NULL},\r
1925 {STRING_TOKEN(STR_CPUIO2), &gEfiCpuIo2ProtocolGuid, NULL},\r
1926 {STRING_TOKEN(STR_LEGACY_R2), &gEfiLegacyRegion2ProtocolGuid, NULL},\r
1927 {STRING_TOKEN(STR_SAL_MIP), &gEfiSalMcaInitPmiProtocolGuid, NULL},\r
1928 {STRING_TOKEN(STR_ES_BS), &gEfiExtendedSalBootServiceProtocolGuid, NULL},\r
1929 {STRING_TOKEN(STR_ES_BIO), &gEfiExtendedSalBaseIoServicesProtocolGuid, NULL},\r
1930 {STRING_TOKEN(STR_ES_STALL), &gEfiExtendedSalStallServicesProtocolGuid, NULL},\r
1931 {STRING_TOKEN(STR_ES_RTC), &gEfiExtendedSalRtcServicesProtocolGuid, NULL},\r
1932 {STRING_TOKEN(STR_ES_VS), &gEfiExtendedSalVariableServicesProtocolGuid, NULL},\r
1933 {STRING_TOKEN(STR_ES_MTC), &gEfiExtendedSalMtcServicesProtocolGuid, NULL},\r
1934 {STRING_TOKEN(STR_ES_RESET), &gEfiExtendedSalResetServicesProtocolGuid, NULL},\r
1935 {STRING_TOKEN(STR_ES_SC), &gEfiExtendedSalStatusCodeServicesProtocolGuid, NULL},\r
1936 {STRING_TOKEN(STR_ES_FBS), &gEfiExtendedSalFvBlockServicesProtocolGuid, NULL},\r
1937 {STRING_TOKEN(STR_ES_MP), &gEfiExtendedSalMpServicesProtocolGuid, NULL},\r
1938 {STRING_TOKEN(STR_ES_PAL), &gEfiExtendedSalPalServicesProtocolGuid, NULL},\r
1939 {STRING_TOKEN(STR_ES_BASE), &gEfiExtendedSalBaseServicesProtocolGuid, NULL},\r
1940 {STRING_TOKEN(STR_ES_MCA), &gEfiExtendedSalMcaServicesProtocolGuid, NULL},\r
1941 {STRING_TOKEN(STR_ES_PCI), &gEfiExtendedSalPciServicesProtocolGuid, NULL},\r
1942 {STRING_TOKEN(STR_ES_CACHE), &gEfiExtendedSalCacheServicesProtocolGuid, NULL},\r
1943 {STRING_TOKEN(STR_ES_MCA_LOG), &gEfiExtendedSalMcaLogServicesProtocolGuid, NULL},\r
1944 {STRING_TOKEN(STR_S2ARCH), &gEfiSecurity2ArchProtocolGuid, NULL},\r
1945 {STRING_TOKEN(STR_EODXE), &gEfiSmmEndOfDxeProtocolGuid, NULL},\r
1946 {STRING_TOKEN(STR_ISAHC), &gEfiIsaHcProtocolGuid, NULL},\r
1947 {STRING_TOKEN(STR_ISAHC_B), &gEfiIsaHcServiceBindingProtocolGuid, NULL},\r
1948 {STRING_TOKEN(STR_SIO_C), &gEfiSioControlProtocolGuid, NULL},\r
1949 {STRING_TOKEN(STR_GET_PCD), &gEfiGetPcdInfoProtocolGuid, NULL},\r
1950 {STRING_TOKEN(STR_I2C_M), &gEfiI2cMasterProtocolGuid, NULL},\r
1951 {STRING_TOKEN(STR_I2CIO), &gEfiI2cIoProtocolGuid, NULL},\r
1952 {STRING_TOKEN(STR_I2CEN), &gEfiI2cEnumerateProtocolGuid, NULL},\r
1953 {STRING_TOKEN(STR_I2C_H), &gEfiI2cHostProtocolGuid, NULL},\r
1954 {STRING_TOKEN(STR_I2C_BCM), &gEfiI2cBusConfigurationManagementProtocolGuid, NULL},\r
1955 {STRING_TOKEN(STR_TREE), &gEfiTrEEProtocolGuid, NULL},\r
1956 {STRING_TOKEN(STR_TCG2), &gEfiTcg2ProtocolGuid, NULL},\r
1957 {STRING_TOKEN(STR_TIMESTAMP), &gEfiTimestampProtocolGuid, NULL},\r
1958 {STRING_TOKEN(STR_RNG), &gEfiRngProtocolGuid, NULL},\r
1959 {STRING_TOKEN(STR_NVMEPT), &gEfiNvmExpressPassThruProtocolGuid, NULL},\r
1960 {STRING_TOKEN(STR_H2_SB), &gEfiHash2ServiceBindingProtocolGuid, NULL},\r
1961 {STRING_TOKEN(STR_HASH2), &gEfiHash2ProtocolGuid, NULL},\r
1962 {STRING_TOKEN(STR_BIO_C), &gEfiBlockIoCryptoProtocolGuid, NULL},\r
1963 {STRING_TOKEN(STR_SCR), &gEfiSmartCardReaderProtocolGuid, NULL},\r
1964 {STRING_TOKEN(STR_SCE), &gEfiSmartCardEdgeProtocolGuid, NULL},\r
1965 {STRING_TOKEN(STR_USB_FIO), &gEfiUsbFunctionIoProtocolGuid, NULL},\r
1966 {STRING_TOKEN(STR_BC_HC), &gEfiBluetoothHcProtocolGuid, NULL},\r
1967 {STRING_TOKEN(STR_BC_IO_SB), &gEfiBluetoothIoServiceBindingProtocolGuid, NULL},\r
1968 {STRING_TOKEN(STR_BC_IO), &gEfiBluetoothIoProtocolGuid, NULL},\r
1969 {STRING_TOKEN(STR_BC_C), &gEfiBluetoothConfigProtocolGuid, NULL},\r
1970 {STRING_TOKEN(STR_REG_EXP), &gEfiRegularExpressionProtocolGuid, NULL},\r
1971 {STRING_TOKEN(STR_B_MGR_P), &gEfiBootManagerPolicyProtocolGuid, NULL},\r
1972 {STRING_TOKEN(STR_CKH), &gEfiConfigKeywordHandlerProtocolGuid, NULL},\r
1973 {STRING_TOKEN(STR_WIFI), &gEfiWiFiProtocolGuid, NULL},\r
1974 {STRING_TOKEN(STR_EAP_M), &gEfiEapManagement2ProtocolGuid, NULL},\r
1975 {STRING_TOKEN(STR_EAP_C), &gEfiEapConfigurationProtocolGuid, NULL},\r
1976 {STRING_TOKEN(STR_PKCS7), &gEfiPkcs7VerifyProtocolGuid, NULL},\r
1977 {STRING_TOKEN(STR_NET_DNS4_SB), &gEfiDns4ServiceBindingProtocolGuid, NULL},\r
1978 {STRING_TOKEN(STR_NET_DNS4), &gEfiDns4ProtocolGuid, NULL},\r
1979 {STRING_TOKEN(STR_NET_DNS6_SB), &gEfiDns6ServiceBindingProtocolGuid, NULL},\r
1980 {STRING_TOKEN(STR_NET_DNS6), &gEfiDns6ProtocolGuid, NULL},\r
1981 {STRING_TOKEN(STR_NET_HTTP_SB), &gEfiHttpServiceBindingProtocolGuid, NULL},\r
1982 {STRING_TOKEN(STR_NET_HTTP), &gEfiHttpProtocolGuid, NULL},\r
1983 {STRING_TOKEN(STR_NET_HTTP_U), &gEfiHttpUtilitiesProtocolGuid, NULL},\r
1984 {STRING_TOKEN(STR_REST), &gEfiRestProtocolGuid, NULL},\r
1985\r
0a1eb97d
JC
1986//\r
1987// UEFI Shell Spec 2.0\r
1988//\r
1989 {STRING_TOKEN(STR_SHELL_PARAMETERS), &gEfiShellParametersProtocolGuid, NULL},\r
1990 {STRING_TOKEN(STR_SHELL), &gEfiShellProtocolGuid, NULL},\r
1991\r
1992//\r
1993// UEFI Shell Spec 2.1\r
1994//\r
1995 {STRING_TOKEN(STR_SHELL_DYNAMIC), &gEfiShellDynamicCommandProtocolGuid, NULL},\r
1996\r
c2788f1c
JC
1997//\r
1998// Misc\r
1999//\r
2000 {STRING_TOKEN(STR_PCDINFOPROT), &gGetPcdInfoProtocolGuid, NULL},\r
2001\r
dee34318 2002//\r
2003// terminator\r
2004//\r
0e88348e 2005 {0, NULL, NULL},\r
a405b86d 2006};\r
2007\r
2008/**\r
2009 Function to get the node for a protocol or struct from it's GUID.\r
2010\r
2011 if Guid is NULL, then ASSERT.\r
2012\r
2013 @param[in] Guid The GUID to look for the name of.\r
2014\r
2015 @return The node.\r
2016**/\r
dee34318 2017CONST GUID_INFO_BLOCK *\r
a405b86d 2018InternalShellGetNodeFromGuid(\r
2019 IN CONST EFI_GUID* Guid\r
2020 )\r
2021{\r
dee34318 2022 CONST GUID_INFO_BLOCK *ListWalker;\r
6306fd90 2023 UINTN LoopCount;\r
a405b86d 2024\r
2025 ASSERT(Guid != NULL);\r
2026\r
d4ec9a57 2027 for (LoopCount = 0, ListWalker = mGuidList; mGuidList != NULL && LoopCount < mGuidListCount; LoopCount++, ListWalker++) {\r
6306fd90
JC
2028 if (CompareGuid(ListWalker->GuidId, Guid)) {\r
2029 return (ListWalker);\r
2030 }\r
2031 }\r
2032\r
a405b86d 2033 if (PcdGetBool(PcdShellIncludeNtGuids)) {\r
2034 for (ListWalker = mGuidStringListNT ; ListWalker != NULL && ListWalker->GuidId != NULL ; ListWalker++) {\r
2035 if (CompareGuid(ListWalker->GuidId, Guid)) {\r
2036 return (ListWalker);\r
2037 }\r
2038 }\r
2039 }\r
2040 for (ListWalker = mGuidStringList ; ListWalker != NULL && ListWalker->GuidId != NULL ; ListWalker++) {\r
2041 if (CompareGuid(ListWalker->GuidId, Guid)) {\r
2042 return (ListWalker);\r
2043 }\r
2044 }\r
6306fd90
JC
2045 return (NULL);\r
2046}\r
2047\r
2048/**\r
2049Function to add a new GUID/Name mapping.\r
2050\r
2051@param[in] Guid The Guid\r
f5ba4007
QS
2052@param[in] NameID The STRING id of the HII string to use\r
2053@param[in] DumpFunc The pointer to the dump function\r
6306fd90
JC
2054\r
2055\r
2056@retval EFI_SUCCESS The operation was sucessful\r
2057@retval EFI_OUT_OF_RESOURCES A memory allocation failed\r
2058@retval EFI_INVALID_PARAMETER Guid NameId was invalid\r
2059**/\r
6306fd90 2060EFI_STATUS\r
6306fd90
JC
2061InsertNewGuidNameMapping(\r
2062 IN CONST EFI_GUID *Guid,\r
2063 IN CONST EFI_STRING_ID NameID,\r
2064 IN CONST DUMP_PROTOCOL_INFO DumpFunc OPTIONAL\r
2065 )\r
2066{\r
2067 ASSERT(Guid != NULL);\r
2068 ASSERT(NameID != 0);\r
2069\r
d4ec9a57
RN
2070 mGuidList = ReallocatePool(mGuidListCount * sizeof(GUID_INFO_BLOCK), mGuidListCount+1 * sizeof(GUID_INFO_BLOCK), mGuidList);\r
2071 if (mGuidList == NULL) {\r
2072 mGuidListCount = 0;\r
6306fd90
JC
2073 return (EFI_OUT_OF_RESOURCES);\r
2074 }\r
d4ec9a57 2075 mGuidListCount++;\r
6306fd90 2076\r
d4ec9a57
RN
2077 mGuidList[mGuidListCount - 1].GuidId = AllocateCopyPool(sizeof(EFI_GUID), Guid);\r
2078 mGuidList[mGuidListCount - 1].StringId = NameID;\r
2079 mGuidList[mGuidListCount - 1].DumpInfo = DumpFunc;\r
6306fd90 2080\r
d4ec9a57 2081 if (mGuidList[mGuidListCount - 1].GuidId == NULL) {\r
6306fd90
JC
2082 return (EFI_OUT_OF_RESOURCES);\r
2083 }\r
2084\r
2085 return (EFI_SUCCESS);\r
2086}\r
2087\r
2088/**\r
2089 Function to add a new GUID/Name mapping.\r
2090\r
2091 This cannot overwrite an existing mapping.\r
2092\r
2093 @param[in] Guid The Guid\r
2094 @param[in] TheName The Guid's name\r
2095 @param[in] Lang RFC4646 language code list or NULL\r
2096\r
2097 @retval EFI_SUCCESS The operation was sucessful\r
2098 @retval EFI_ACCESS_DENIED There was a duplicate\r
2099 @retval EFI_OUT_OF_RESOURCES A memory allocation failed\r
2100 @retval EFI_INVALID_PARAMETER Guid or TheName was NULL\r
2101**/\r
2102EFI_STATUS\r
2103EFIAPI\r
2104AddNewGuidNameMapping(\r
2105 IN CONST EFI_GUID *Guid,\r
2106 IN CONST CHAR16 *TheName,\r
2107 IN CONST CHAR8 *Lang OPTIONAL\r
2108 )\r
2109{\r
6306fd90
JC
2110 EFI_STRING_ID NameID;\r
2111\r
e7e0e42b
CP
2112 HandleParsingHiiInit();\r
2113\r
6306fd90
JC
2114 if (Guid == NULL || TheName == NULL){\r
2115 return (EFI_INVALID_PARAMETER);\r
2116 }\r
2117\r
931b2cff 2118 if ((InternalShellGetNodeFromGuid(Guid)) != NULL) {\r
6306fd90
JC
2119 return (EFI_ACCESS_DENIED);\r
2120 }\r
2121\r
2122 NameID = HiiSetString(mHandleParsingHiiHandle, 0, (CHAR16*)TheName, Lang);\r
2123 if (NameID == 0) {\r
2124 return (EFI_OUT_OF_RESOURCES);\r
2125 }\r
2126\r
2127 return (InsertNewGuidNameMapping(Guid, NameID, NULL));\r
a405b86d 2128}\r
2129\r
2130/**\r
2131 Function to get the name of a protocol or struct from it's GUID.\r
2132\r
2133 if Guid is NULL, then ASSERT.\r
2134\r
2135 @param[in] Guid The GUID to look for the name of.\r
2136 @param[in] Lang The language to use.\r
2137\r
2138 @return pointer to string of the name. The caller\r
2139 is responsible to free this memory.\r
2140**/\r
2141CHAR16*\r
2142EFIAPI\r
2143GetStringNameFromGuid(\r
2144 IN CONST EFI_GUID *Guid,\r
2145 IN CONST CHAR8 *Lang OPTIONAL\r
2146 )\r
2147{\r
dee34318 2148 CONST GUID_INFO_BLOCK *Id;\r
a405b86d 2149\r
e7e0e42b
CP
2150 HandleParsingHiiInit();\r
2151\r
a405b86d 2152 Id = InternalShellGetNodeFromGuid(Guid);\r
0e88348e
RN
2153 if (Id == NULL) {\r
2154 return NULL;\r
2155 }\r
2156 return HiiGetString (mHandleParsingHiiHandle, Id->StringId, Lang);\r
a405b86d 2157}\r
2158\r
2159/**\r
2160 Function to dump protocol information from a handle.\r
2161\r
2162 This function will return a allocated string buffer containing the\r
2163 information. The caller is responsible for freeing the memory.\r
2164\r
2165 If Guid is NULL, ASSERT().\r
2166 If TheHandle is NULL, ASSERT().\r
2167\r
2168 @param[in] TheHandle The handle to dump information from.\r
2169 @param[in] Guid The GUID of the protocol to dump.\r
2170 @param[in] Verbose TRUE for extra info. FALSE otherwise.\r
2171\r
2172 @return The pointer to string.\r
2173 @retval NULL An error was encountered.\r
2174**/\r
2175CHAR16*\r
2176EFIAPI\r
2177GetProtocolInformationDump(\r
2178 IN CONST EFI_HANDLE TheHandle,\r
2179 IN CONST EFI_GUID *Guid,\r
2180 IN CONST BOOLEAN Verbose\r
2181 )\r
2182{\r
dee34318 2183 CONST GUID_INFO_BLOCK *Id;\r
a405b86d 2184\r
2185 ASSERT(TheHandle != NULL);\r
2186 ASSERT(Guid != NULL);\r
2187\r
2188 if (TheHandle == NULL || Guid == NULL) {\r
2189 return (NULL);\r
2190 }\r
2191\r
2192 Id = InternalShellGetNodeFromGuid(Guid);\r
2193 if (Id != NULL && Id->DumpInfo != NULL) {\r
2194 return (Id->DumpInfo(TheHandle, Verbose));\r
2195 }\r
2196 return (NULL);\r
2197}\r
2198\r
2199/**\r
2200 Function to get the Guid for a protocol or struct based on it's string name.\r
2201\r
0a1eb97d
JC
2202 do not modify the returned Guid.\r
2203\r
a405b86d 2204 @param[in] Name The pointer to the string name.\r
2205 @param[in] Lang The pointer to the language code.\r
0a1eb97d 2206 @param[out] Guid The pointer to the Guid.\r
a405b86d 2207\r
2208 @retval EFI_SUCCESS The operation was sucessful.\r
2209**/\r
2210EFI_STATUS\r
2211EFIAPI\r
2212GetGuidFromStringName(\r
2213 IN CONST CHAR16 *Name,\r
2214 IN CONST CHAR8 *Lang OPTIONAL,\r
0a1eb97d 2215 OUT EFI_GUID **Guid\r
a405b86d 2216 )\r
2217{\r
dee34318 2218 CONST GUID_INFO_BLOCK *ListWalker;\r
a405b86d 2219 CHAR16 *String;\r
6306fd90 2220 UINTN LoopCount;\r
a405b86d 2221\r
e7e0e42b
CP
2222 HandleParsingHiiInit();\r
2223\r
a405b86d 2224 ASSERT(Guid != NULL);\r
2225 if (Guid == NULL) {\r
2226 return (EFI_INVALID_PARAMETER);\r
2227 }\r
2228 *Guid = NULL;\r
2229\r
2230 if (PcdGetBool(PcdShellIncludeNtGuids)) {\r
2231 for (ListWalker = mGuidStringListNT ; ListWalker != NULL && ListWalker->GuidId != NULL ; ListWalker++) {\r
2232 String = HiiGetString(mHandleParsingHiiHandle, ListWalker->StringId, Lang);\r
28cdb62b 2233 if (Name != NULL && String != NULL && StringNoCaseCompare (&Name, &String) == 0) {\r
a405b86d 2234 *Guid = ListWalker->GuidId;\r
2235 }\r
2236 SHELL_FREE_NON_NULL(String);\r
2237 if (*Guid != NULL) {\r
2238 return (EFI_SUCCESS);\r
2239 }\r
2240 }\r
2241 }\r
2242 for (ListWalker = mGuidStringList ; ListWalker != NULL && ListWalker->GuidId != NULL ; ListWalker++) {\r
2243 String = HiiGetString(mHandleParsingHiiHandle, ListWalker->StringId, Lang);\r
28cdb62b 2244 if (Name != NULL && String != NULL && StringNoCaseCompare (&Name, &String) == 0) {\r
a405b86d 2245 *Guid = ListWalker->GuidId;\r
2246 }\r
2247 SHELL_FREE_NON_NULL(String);\r
2248 if (*Guid != NULL) {\r
2249 return (EFI_SUCCESS);\r
2250 }\r
2251 }\r
6306fd90 2252\r
d4ec9a57 2253 for (LoopCount = 0, ListWalker = mGuidList; mGuidList != NULL && LoopCount < mGuidListCount; LoopCount++, ListWalker++) {\r
6306fd90
JC
2254 String = HiiGetString(mHandleParsingHiiHandle, ListWalker->StringId, Lang);\r
2255 if (Name != NULL && String != NULL && StringNoCaseCompare (&Name, &String) == 0) {\r
2256 *Guid = ListWalker->GuidId;\r
2257 }\r
2258 SHELL_FREE_NON_NULL(String);\r
2259 if (*Guid != NULL) {\r
2260 return (EFI_SUCCESS);\r
2261 }\r
2262 }\r
2263\r
a405b86d 2264 return (EFI_NOT_FOUND);\r
2265}\r
2266\r
36384ceb
ED
2267/**\r
2268 Get best support language for this driver.\r
1a6f74d9
CS
2269\r
2270 First base on the user input language to search, second base on the current\r
2271 platform used language to search, third get the first language from the\r
a71003f2 2272 support language list. The caller need to free the buffer of the best language.\r
36384ceb
ED
2273\r
2274 @param[in] SupportedLanguages The support languages for this driver.\r
a71003f2 2275 @param[in] InputLanguage The user input language.\r
36384ceb
ED
2276 @param[in] Iso639Language Whether get language for ISO639.\r
2277\r
2278 @return The best support language for this driver.\r
2279**/\r
2280CHAR8 *\r
a71003f2 2281EFIAPI\r
36384ceb 2282GetBestLanguageForDriver (\r
a71003f2
ED
2283 IN CONST CHAR8 *SupportedLanguages,\r
2284 IN CONST CHAR8 *InputLanguage,\r
36384ceb
ED
2285 IN BOOLEAN Iso639Language\r
2286 )\r
2287{\r
2288 CHAR8 *LanguageVariable;\r
2289 CHAR8 *BestLanguage;\r
2290\r
3cdd434e 2291 GetVariable2 (Iso639Language ? L"Lang" : L"PlatformLang", &gEfiGlobalVariableGuid, (VOID**)&LanguageVariable, NULL);\r
36384ceb
ED
2292\r
2293 BestLanguage = GetBestLanguage(\r
2294 SupportedLanguages,\r
2295 Iso639Language,\r
a71003f2 2296 (InputLanguage != NULL) ? InputLanguage : "",\r
36384ceb 2297 (LanguageVariable != NULL) ? LanguageVariable : "",\r
a71003f2 2298 SupportedLanguages,\r
36384ceb
ED
2299 NULL\r
2300 );\r
2301\r
2302 if (LanguageVariable != NULL) {\r
2303 FreePool (LanguageVariable);\r
2304 }\r
2305\r
2306 return BestLanguage;\r
2307}\r
2308\r
a405b86d 2309/**\r
2310 Function to retrieve the driver name (if possible) from the ComponentName or\r
2311 ComponentName2 protocol\r
2312\r
2313 @param[in] TheHandle The driver handle to get the name of.\r
2314 @param[in] Language The language to use.\r
2315\r
2316 @retval NULL The name could not be found.\r
2317 @return A pointer to the string name. Do not de-allocate the memory.\r
2318**/\r
2319CONST CHAR16*\r
2320EFIAPI\r
2321GetStringNameFromHandle(\r
2322 IN CONST EFI_HANDLE TheHandle,\r
2323 IN CONST CHAR8 *Language\r
2324 )\r
2325{\r
2326 EFI_COMPONENT_NAME2_PROTOCOL *CompNameStruct;\r
2327 EFI_STATUS Status;\r
2328 CHAR16 *RetVal;\r
36384ceb
ED
2329 CHAR8 *BestLang;\r
2330\r
2331 BestLang = NULL;\r
a405b86d 2332\r
2333 Status = gBS->OpenProtocol(\r
2334 TheHandle,\r
2335 &gEfiComponentName2ProtocolGuid,\r
2336 (VOID**)&CompNameStruct,\r
2337 gImageHandle,\r
2338 NULL,\r
2339 EFI_OPEN_PROTOCOL_GET_PROTOCOL);\r
2340 if (!EFI_ERROR(Status)) {\r
a71003f2
ED
2341 BestLang = GetBestLanguageForDriver (CompNameStruct->SupportedLanguages, Language, FALSE);\r
2342 Status = CompNameStruct->GetDriverName(CompNameStruct, BestLang, &RetVal);\r
36384ceb
ED
2343 if (BestLang != NULL) {\r
2344 FreePool (BestLang);\r
2345 BestLang = NULL;\r
2346 }\r
a405b86d 2347 if (!EFI_ERROR(Status)) {\r
2348 return (RetVal);\r
2349 }\r
2350 }\r
2351 Status = gBS->OpenProtocol(\r
2352 TheHandle,\r
2353 &gEfiComponentNameProtocolGuid,\r
2354 (VOID**)&CompNameStruct,\r
2355 gImageHandle,\r
2356 NULL,\r
2357 EFI_OPEN_PROTOCOL_GET_PROTOCOL);\r
2358 if (!EFI_ERROR(Status)) {\r
a71003f2
ED
2359 BestLang = GetBestLanguageForDriver (CompNameStruct->SupportedLanguages, Language, FALSE);\r
2360 Status = CompNameStruct->GetDriverName(CompNameStruct, BestLang, &RetVal);\r
36384ceb
ED
2361 if (BestLang != NULL) {\r
2362 FreePool (BestLang);\r
2363 }\r
a405b86d 2364 if (!EFI_ERROR(Status)) {\r
2365 return (RetVal);\r
2366 }\r
2367 }\r
2368 return (NULL);\r
2369}\r
2370\r
2371/**\r
2372 Function to initialize the file global mHandleList object for use in\r
2373 vonverting handles to index and index to handle.\r
2374\r
2375 @retval EFI_SUCCESS The operation was successful.\r
2376**/\r
2377EFI_STATUS\r
a405b86d 2378InternalShellInitHandleList(\r
2379 VOID\r
2380 )\r
2381{\r
2382 EFI_STATUS Status;\r
2383 EFI_HANDLE *HandleBuffer;\r
2384 UINTN HandleCount;\r
2385 HANDLE_LIST *ListWalker;\r
2386\r
2387 if (mHandleList.NextIndex != 0) {\r
2388 return EFI_SUCCESS;\r
2389 }\r
2390 InitializeListHead(&mHandleList.List.Link);\r
2391 mHandleList.NextIndex = 1;\r
2392 Status = gBS->LocateHandleBuffer (\r
2393 AllHandles,\r
2394 NULL,\r
2395 NULL,\r
2396 &HandleCount,\r
2397 &HandleBuffer\r
2398 );\r
2399 ASSERT_EFI_ERROR(Status);\r
2400 if (EFI_ERROR(Status)) {\r
2401 return (Status);\r
2402 }\r
2403 for (mHandleList.NextIndex = 1 ; mHandleList.NextIndex <= HandleCount ; mHandleList.NextIndex++){\r
78ed876b 2404 ListWalker = AllocateZeroPool(sizeof(HANDLE_LIST));\r
aa3276c1
RN
2405 if (ListWalker != NULL) {\r
2406 ListWalker->TheHandle = HandleBuffer[mHandleList.NextIndex - 1];\r
2407 ListWalker->TheIndex = mHandleList.NextIndex;\r
2408 InsertTailList (&mHandleList.List.Link, &ListWalker->Link);\r
2409 }\r
a405b86d 2410 }\r
2411 FreePool(HandleBuffer);\r
2412 return (EFI_SUCCESS);\r
2413}\r
2414\r
2415/**\r
2416 Function to retrieve the human-friendly index of a given handle. If the handle\r
2417 does not have a index one will be automatically assigned. The index value is valid\r
2418 until the termination of the shell application.\r
2419\r
2420 @param[in] TheHandle The handle to retrieve an index for.\r
2421\r
2422 @retval 0 A memory allocation failed.\r
2423 @return The index of the handle.\r
2424\r
2425**/\r
2426UINTN\r
2427EFIAPI\r
2428ConvertHandleToHandleIndex(\r
2429 IN CONST EFI_HANDLE TheHandle\r
2430 )\r
2431{\r
f330ff35 2432 EFI_STATUS Status;\r
2433 EFI_GUID **ProtocolBuffer;\r
2434 UINTN ProtocolCount;\r
2435 HANDLE_LIST *ListWalker;\r
2436\r
78ed876b 2437 if (TheHandle == NULL) {\r
2438 return 0;\r
2439 }\r
a405b86d 2440\r
2441 InternalShellInitHandleList();\r
2442\r
2443 for (ListWalker = (HANDLE_LIST*)GetFirstNode(&mHandleList.List.Link)\r
2444 ; !IsNull(&mHandleList.List.Link,&ListWalker->Link)\r
2445 ; ListWalker = (HANDLE_LIST*)GetNextNode(&mHandleList.List.Link,&ListWalker->Link)\r
2446 ){\r
2447 if (ListWalker->TheHandle == TheHandle) {\r
f330ff35 2448 //\r
2449 // Verify that TheHandle is still present in the Handle Database\r
2450 //\r
2451 Status = gBS->ProtocolsPerHandle(TheHandle, &ProtocolBuffer, &ProtocolCount);\r
2452 if (EFI_ERROR (Status)) {\r
2453 //\r
2454 // TheHandle is not present in the Handle Database, so delete from the handle list\r
2455 //\r
2456 RemoveEntryList (&ListWalker->Link);\r
2457 return 0;\r
2458 }\r
2459 FreePool (ProtocolBuffer);\r
a405b86d 2460 return (ListWalker->TheIndex);\r
2461 }\r
2462 }\r
f330ff35 2463\r
2464 //\r
2465 // Verify that TheHandle is valid handle\r
2466 //\r
2467 Status = gBS->ProtocolsPerHandle(TheHandle, &ProtocolBuffer, &ProtocolCount);\r
2468 if (EFI_ERROR (Status)) {\r
2469 //\r
2470 // TheHandle is not valid, so do not add to handle list\r
2471 //\r
2472 return 0;\r
2473 }\r
2474 FreePool (ProtocolBuffer);\r
2475\r
78ed876b 2476 ListWalker = AllocateZeroPool(sizeof(HANDLE_LIST));\r
aa3276c1
RN
2477 if (ListWalker == NULL) {\r
2478 return 0;\r
2479 }\r
a405b86d 2480 ListWalker->TheHandle = TheHandle;\r
2481 ListWalker->TheIndex = mHandleList.NextIndex++;\r
2482 InsertTailList(&mHandleList.List.Link,&ListWalker->Link);\r
2483 return (ListWalker->TheIndex);\r
2484}\r
2485\r
2486\r
2487\r
2488/**\r
2489 Function to retrieve the EFI_HANDLE from the human-friendly index.\r
2490\r
2491 @param[in] TheIndex The index to retrieve the EFI_HANDLE for.\r
2492\r
2493 @retval NULL The index was invalid.\r
2494 @return The EFI_HANDLE that index represents.\r
2495\r
2496**/\r
2497EFI_HANDLE\r
2498EFIAPI\r
2499ConvertHandleIndexToHandle(\r
2500 IN CONST UINTN TheIndex\r
2501 )\r
2502{\r
f330ff35 2503 EFI_STATUS Status;\r
2504 EFI_GUID **ProtocolBuffer;\r
2505 UINTN ProtocolCount;\r
a405b86d 2506 HANDLE_LIST *ListWalker;\r
2507\r
2508 InternalShellInitHandleList();\r
2509\r
2510 if (TheIndex >= mHandleList.NextIndex) {\r
f330ff35 2511 return NULL;\r
a405b86d 2512 }\r
2513\r
2514 for (ListWalker = (HANDLE_LIST*)GetFirstNode(&mHandleList.List.Link)\r
2515 ; !IsNull(&mHandleList.List.Link,&ListWalker->Link)\r
2516 ; ListWalker = (HANDLE_LIST*)GetNextNode(&mHandleList.List.Link,&ListWalker->Link)\r
2517 ){\r
f330ff35 2518 if (ListWalker->TheIndex == TheIndex && ListWalker->TheHandle != NULL) {\r
2519 //\r
2520 // Verify that LinkWalker->TheHandle is valid handle\r
2521 //\r
2522 Status = gBS->ProtocolsPerHandle(ListWalker->TheHandle, &ProtocolBuffer, &ProtocolCount);\r
00324f3f
RN
2523 if (!EFI_ERROR (Status)) {\r
2524 FreePool (ProtocolBuffer);\r
2525 } else {\r
f330ff35 2526 //\r
2527 // TheHandle is not valid, so do not add to handle list\r
2528 //\r
2529 ListWalker->TheHandle = NULL;\r
2530 }\r
a405b86d 2531 return (ListWalker->TheHandle);\r
2532 }\r
2533 }\r
f330ff35 2534 return NULL;\r
a405b86d 2535}\r
2536\r
2537/**\r
2538 Gets all the related EFI_HANDLEs based on the mask supplied.\r
2539\r
2540 This function scans all EFI_HANDLES in the UEFI environment's handle database\r
2541 and returns the ones with the specified relationship (Mask) to the specified\r
2542 controller handle.\r
2543\r
2544 If both DriverBindingHandle and ControllerHandle are NULL, then ASSERT.\r
2545 If MatchingHandleCount is NULL, then ASSERT.\r
2546\r
2547 If MatchingHandleBuffer is not NULL upon a successful return the memory must be\r
2548 caller freed.\r
2549\r
2550 @param[in] DriverBindingHandle The handle with Driver Binding protocol on it.\r
2551 @param[in] ControllerHandle The handle with Device Path protocol on it.\r
2552 @param[in] MatchingHandleCount The pointer to UINTN that specifies the number of HANDLES in\r
2553 MatchingHandleBuffer.\r
2554 @param[out] MatchingHandleBuffer On a successful return, a buffer of MatchingHandleCount\r
2555 EFI_HANDLEs with a terminating NULL EFI_HANDLE.\r
2556 @param[out] HandleType An array of type information.\r
2557\r
2558 @retval EFI_SUCCESS The operation was successful, and any related handles\r
2559 are in MatchingHandleBuffer.\r
2560 @retval EFI_NOT_FOUND No matching handles were found.\r
2561 @retval EFI_INVALID_PARAMETER A parameter was invalid or out of range.\r
2562**/\r
2563EFI_STATUS\r
2564EFIAPI\r
2565ParseHandleDatabaseByRelationshipWithType (\r
2566 IN CONST EFI_HANDLE DriverBindingHandle OPTIONAL,\r
2567 IN CONST EFI_HANDLE ControllerHandle OPTIONAL,\r
2568 IN UINTN *HandleCount,\r
2569 OUT EFI_HANDLE **HandleBuffer,\r
2570 OUT UINTN **HandleType\r
2571 )\r
2572{\r
2573 EFI_STATUS Status;\r
2574 UINTN HandleIndex;\r
2575 EFI_GUID **ProtocolGuidArray;\r
2576 UINTN ArrayCount;\r
2577 UINTN ProtocolIndex;\r
2578 EFI_OPEN_PROTOCOL_INFORMATION_ENTRY *OpenInfo;\r
2579 UINTN OpenInfoCount;\r
2580 UINTN OpenInfoIndex;\r
2581 UINTN ChildIndex;\r
f330ff35 2582 INTN DriverBindingHandleIndex;\r
a405b86d 2583\r
2584 ASSERT(HandleCount != NULL);\r
2585 ASSERT(HandleBuffer != NULL);\r
2586 ASSERT(HandleType != NULL);\r
2587 ASSERT(DriverBindingHandle != NULL || ControllerHandle != NULL);\r
2588\r
2589 *HandleCount = 0;\r
2590 *HandleBuffer = NULL;\r
2591 *HandleType = NULL;\r
2592\r
2593 //\r
2594 // Retrieve the list of all handles from the handle database\r
2595 //\r
2596 Status = gBS->LocateHandleBuffer (\r
2597 AllHandles,\r
2598 NULL,\r
2599 NULL,\r
2600 HandleCount,\r
2601 HandleBuffer\r
2602 );\r
2603 if (EFI_ERROR (Status)) {\r
2604 return (Status);\r
2605 }\r
2606\r
2607 *HandleType = AllocateZeroPool (*HandleCount * sizeof (UINTN));\r
aa3276c1
RN
2608 if (*HandleType == NULL) {\r
2609 SHELL_FREE_NON_NULL (*HandleBuffer);\r
94fcb76b 2610 *HandleCount = 0;\r
aa3276c1
RN
2611 return EFI_OUT_OF_RESOURCES;\r
2612 }\r
a405b86d 2613\r
f330ff35 2614 DriverBindingHandleIndex = -1;\r
2615 for (HandleIndex = 0; HandleIndex < *HandleCount; HandleIndex++) {\r
2616 if (DriverBindingHandle != NULL && (*HandleBuffer)[HandleIndex] == DriverBindingHandle) {\r
2617 DriverBindingHandleIndex = (INTN)HandleIndex;\r
2618 }\r
2619 }\r
2620\r
a405b86d 2621 for (HandleIndex = 0; HandleIndex < *HandleCount; HandleIndex++) {\r
2622 //\r
2623 // Retrieve the list of all the protocols on each handle\r
2624 //\r
2625 Status = gBS->ProtocolsPerHandle (\r
2626 (*HandleBuffer)[HandleIndex],\r
2627 &ProtocolGuidArray,\r
2628 &ArrayCount\r
2629 );\r
f330ff35 2630 if (EFI_ERROR (Status)) {\r
2631 continue;\r
2632 }\r
a405b86d 2633\r
f330ff35 2634 for (ProtocolIndex = 0; ProtocolIndex < ArrayCount; ProtocolIndex++) {\r
a405b86d 2635\r
f330ff35 2636 //\r
2637 // Set the bit describing what this handle has\r
2638 //\r
2639 if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiLoadedImageProtocolGuid) ) {\r
7aae3c35 2640 (*HandleType)[HandleIndex] |= (UINTN)HR_IMAGE_HANDLE;\r
f330ff35 2641 } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDriverBindingProtocolGuid) ) {\r
7aae3c35 2642 (*HandleType)[HandleIndex] |= (UINTN)HR_DRIVER_BINDING_HANDLE;\r
f330ff35 2643 } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDriverConfiguration2ProtocolGuid)) {\r
7aae3c35 2644 (*HandleType)[HandleIndex] |= (UINTN)HR_DRIVER_CONFIGURATION_HANDLE;\r
f330ff35 2645 } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDriverConfigurationProtocolGuid) ) {\r
7aae3c35 2646 (*HandleType)[HandleIndex] |= (UINTN)HR_DRIVER_CONFIGURATION_HANDLE;\r
f330ff35 2647 } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDriverDiagnostics2ProtocolGuid) ) {\r
7aae3c35 2648 (*HandleType)[HandleIndex] |= (UINTN)HR_DRIVER_DIAGNOSTICS_HANDLE;\r
f330ff35 2649 } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDriverDiagnosticsProtocolGuid) ) {\r
7aae3c35 2650 (*HandleType)[HandleIndex] |= (UINTN)HR_DRIVER_DIAGNOSTICS_HANDLE;\r
f330ff35 2651 } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiComponentName2ProtocolGuid) ) {\r
7aae3c35 2652 (*HandleType)[HandleIndex] |= (UINTN)HR_COMPONENT_NAME_HANDLE;\r
f330ff35 2653 } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiComponentNameProtocolGuid) ) {\r
7aae3c35 2654 (*HandleType)[HandleIndex] |= (UINTN)HR_COMPONENT_NAME_HANDLE;\r
f330ff35 2655 } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDevicePathProtocolGuid) ) {\r
7aae3c35 2656 (*HandleType)[HandleIndex] |= (UINTN)HR_DEVICE_HANDLE;\r
f330ff35 2657 }\r
2658 //\r
2659 // Retrieve the list of agents that have opened each protocol\r
2660 //\r
2661 Status = gBS->OpenProtocolInformation (\r
a405b86d 2662 (*HandleBuffer)[HandleIndex],\r
2663 ProtocolGuidArray[ProtocolIndex],\r
2664 &OpenInfo,\r
2665 &OpenInfoCount\r
2666 );\r
f330ff35 2667 if (EFI_ERROR (Status)) {\r
2668 continue;\r
2669 }\r
2670\r
2671 if (ControllerHandle == NULL) {\r
2672 //\r
1a6f74d9 2673 // ControllerHandle == NULL and DriverBindingHandle != NULL.\r
f330ff35 2674 // Return information on all the controller handles that the driver specified by DriverBindingHandle is managing\r
2675 //\r
2676 for (OpenInfoIndex = 0; OpenInfoIndex < OpenInfoCount; OpenInfoIndex++) {\r
2677 if (OpenInfo[OpenInfoIndex].AgentHandle == DriverBindingHandle && (OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_DRIVER) != 0) {\r
7aae3c35 2678 (*HandleType)[HandleIndex] |= (UINTN)(HR_DEVICE_HANDLE | HR_CONTROLLER_HANDLE);\r
f330ff35 2679 if (DriverBindingHandleIndex != -1) {\r
7aae3c35 2680 (*HandleType)[DriverBindingHandleIndex] |= (UINTN)HR_DEVICE_DRIVER;\r
f330ff35 2681 }\r
2682 }\r
2683 if (OpenInfo[OpenInfoIndex].AgentHandle == DriverBindingHandle && (OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {\r
7aae3c35 2684 (*HandleType)[HandleIndex] |= (UINTN)(HR_DEVICE_HANDLE | HR_CONTROLLER_HANDLE);\r
f330ff35 2685 if (DriverBindingHandleIndex != -1) {\r
7aae3c35 2686 (*HandleType)[DriverBindingHandleIndex] |= (UINTN)(HR_BUS_DRIVER | HR_DEVICE_DRIVER);\r
f330ff35 2687 }\r
2688 for (ChildIndex = 0; ChildIndex < *HandleCount; ChildIndex++) {\r
2689 if (OpenInfo[OpenInfoIndex].ControllerHandle == (*HandleBuffer)[ChildIndex]) {\r
7aae3c35 2690 (*HandleType)[ChildIndex] |= (UINTN)(HR_DEVICE_HANDLE | HR_CHILD_HANDLE);\r
f330ff35 2691 }\r
2692 }\r
2693 }\r
2694 }\r
2695 }\r
2696 if (DriverBindingHandle == NULL && ControllerHandle != NULL) {\r
2697 if (ControllerHandle == (*HandleBuffer)[HandleIndex]) {\r
7aae3c35 2698 (*HandleType)[HandleIndex] |= (UINTN)(HR_DEVICE_HANDLE | HR_CONTROLLER_HANDLE);\r
a405b86d 2699 for (OpenInfoIndex = 0; OpenInfoIndex < OpenInfoCount; OpenInfoIndex++) {\r
f330ff35 2700 if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_DRIVER) != 0) {\r
2701 for (ChildIndex = 0; ChildIndex < *HandleCount; ChildIndex++) {\r
2702 if (OpenInfo[OpenInfoIndex].AgentHandle == (*HandleBuffer)[ChildIndex]) {\r
7aae3c35 2703 (*HandleType)[ChildIndex] |= (UINTN)HR_DEVICE_DRIVER;\r
f330ff35 2704 }\r
a405b86d 2705 }\r
f330ff35 2706 }\r
2707 if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {\r
2708 for (ChildIndex = 0; ChildIndex < *HandleCount; ChildIndex++) {\r
2709 if (OpenInfo[OpenInfoIndex].AgentHandle == (*HandleBuffer)[ChildIndex]) {\r
7aae3c35 2710 (*HandleType)[ChildIndex] |= (UINTN)(HR_BUS_DRIVER | HR_DEVICE_DRIVER);\r
f330ff35 2711 }\r
2712 if (OpenInfo[OpenInfoIndex].ControllerHandle == (*HandleBuffer)[ChildIndex]) {\r
7aae3c35 2713 (*HandleType)[ChildIndex] |= (UINTN)(HR_DEVICE_HANDLE | HR_CHILD_HANDLE);\r
a405b86d 2714 }\r
2715 }\r
2716 }\r
f330ff35 2717 }\r
2718 } else {\r
2719 for (OpenInfoIndex = 0; OpenInfoIndex < OpenInfoCount; OpenInfoIndex++) {\r
2720 if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {\r
2721 if (OpenInfo[OpenInfoIndex].ControllerHandle == ControllerHandle) {\r
7aae3c35 2722 (*HandleType)[HandleIndex] |= (UINTN)(HR_DEVICE_HANDLE | HR_PARENT_HANDLE);\r
f330ff35 2723 }\r
2724 }\r
2725 }\r
2726 }\r
2727 }\r
2728 if (DriverBindingHandle != NULL && ControllerHandle != NULL) {\r
2729 if (ControllerHandle == (*HandleBuffer)[HandleIndex]) {\r
7aae3c35 2730 (*HandleType)[HandleIndex] |= (UINTN)(HR_DEVICE_HANDLE | HR_CONTROLLER_HANDLE);\r
f330ff35 2731 for (OpenInfoIndex = 0; OpenInfoIndex < OpenInfoCount; OpenInfoIndex++) {\r
2732 if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_DRIVER) != 0) {\r
2733 if (OpenInfo[OpenInfoIndex].AgentHandle == DriverBindingHandle) {\r
2734 if (DriverBindingHandleIndex != -1) {\r
7aae3c35 2735 (*HandleType)[DriverBindingHandleIndex] |= (UINTN)HR_DEVICE_DRIVER;\r
a405b86d 2736 }\r
2737 }\r
f330ff35 2738 }\r
2739 if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {\r
2740 if (OpenInfo[OpenInfoIndex].AgentHandle == DriverBindingHandle) {\r
a405b86d 2741 for (ChildIndex = 0; ChildIndex < *HandleCount; ChildIndex++) {\r
f330ff35 2742 if (OpenInfo[OpenInfoIndex].ControllerHandle == (*HandleBuffer)[ChildIndex]) {\r
7aae3c35 2743 (*HandleType)[ChildIndex] |= (UINTN)(HR_DEVICE_HANDLE | HR_CHILD_HANDLE);\r
a405b86d 2744 }\r
2745 }\r
2746 }\r
f330ff35 2747\r
2748 for (ChildIndex = 0; ChildIndex < *HandleCount; ChildIndex++) {\r
2749 if (OpenInfo[OpenInfoIndex].AgentHandle == (*HandleBuffer)[ChildIndex]) {\r
7aae3c35 2750 (*HandleType)[ChildIndex] |= (UINTN)(HR_BUS_DRIVER | HR_DEVICE_DRIVER);\r
f330ff35 2751 }\r
2752 }\r
2753 }\r
2754 }\r
2755 } else {\r
2756 for (OpenInfoIndex = 0; OpenInfoIndex < OpenInfoCount; OpenInfoIndex++) {\r
2757 if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {\r
2758 if (OpenInfo[OpenInfoIndex].ControllerHandle == ControllerHandle) {\r
7aae3c35 2759 (*HandleType)[HandleIndex] |= (UINTN)(HR_DEVICE_HANDLE | HR_PARENT_HANDLE);\r
f330ff35 2760 }\r
a405b86d 2761 }\r
2762 }\r
a405b86d 2763 }\r
2764 }\r
f330ff35 2765 FreePool (OpenInfo);\r
a405b86d 2766 }\r
f330ff35 2767 FreePool (ProtocolGuidArray);\r
a405b86d 2768 }\r
f330ff35 2769 return EFI_SUCCESS;\r
a405b86d 2770}\r
2771\r
2772/**\r
2773 Gets all the related EFI_HANDLEs based on the single EFI_HANDLE and the mask\r
2774 supplied.\r
2775\r
2776 This function will scan all EFI_HANDLES in the UEFI environment's handle database\r
2777 and return all the ones with the specified relationship (Mask) to the specified\r
2778 controller handle.\r
2779\r
2780 If both DriverBindingHandle and ControllerHandle are NULL, then ASSERT.\r
2781 If MatchingHandleCount is NULL, then ASSERT.\r
2782\r
2783 If MatchingHandleBuffer is not NULL upon a sucessful return the memory must be\r
2784 caller freed.\r
2785\r
2786 @param[in] DriverBindingHandle Handle to a object with Driver Binding protocol\r
2787 on it.\r
2788 @param[in] ControllerHandle Handle to a device with Device Path protocol on it.\r
2789 @param[in] Mask Mask of what relationship(s) is desired.\r
2790 @param[in] MatchingHandleCount Poitner to UINTN specifying number of HANDLES in\r
2791 MatchingHandleBuffer.\r
2792 @param[out] MatchingHandleBuffer On a sucessful return a buffer of MatchingHandleCount\r
2793 EFI_HANDLEs and a terminating NULL EFI_HANDLE.\r
2794\r
2795 @retval EFI_SUCCESS The operation was sucessful and any related handles\r
2796 are in MatchingHandleBuffer;\r
2797 @retval EFI_NOT_FOUND No matching handles were found.\r
2798 @retval EFI_INVALID_PARAMETER A parameter was invalid or out of range.\r
2799**/\r
2800EFI_STATUS\r
2801EFIAPI\r
2802ParseHandleDatabaseByRelationship (\r
2803 IN CONST EFI_HANDLE DriverBindingHandle OPTIONAL,\r
2804 IN CONST EFI_HANDLE ControllerHandle OPTIONAL,\r
2805 IN CONST UINTN Mask,\r
2806 IN UINTN *MatchingHandleCount,\r
2807 OUT EFI_HANDLE **MatchingHandleBuffer OPTIONAL\r
2808 )\r
2809{\r
2810 EFI_STATUS Status;\r
2811 UINTN HandleCount;\r
2812 EFI_HANDLE *HandleBuffer;\r
2813 UINTN *HandleType;\r
2814 UINTN HandleIndex;\r
2815\r
2816 ASSERT(MatchingHandleCount != NULL);\r
2817 ASSERT(DriverBindingHandle != NULL || ControllerHandle != NULL);\r
2818\r
2819 if ((Mask & HR_VALID_MASK) != Mask) {\r
2820 return (EFI_INVALID_PARAMETER);\r
2821 }\r
2822\r
2823 if ((Mask & HR_CHILD_HANDLE) != 0 && DriverBindingHandle == NULL) {\r
2824 return (EFI_INVALID_PARAMETER);\r
2825 }\r
2826\r
2827 *MatchingHandleCount = 0;\r
2828 if (MatchingHandleBuffer != NULL) {\r
2829 *MatchingHandleBuffer = NULL;\r
2830 }\r
2831\r
2832 HandleBuffer = NULL;\r
2833 HandleType = NULL;\r
2834\r
2835 Status = ParseHandleDatabaseByRelationshipWithType (\r
2836 DriverBindingHandle,\r
2837 ControllerHandle,\r
2838 &HandleCount,\r
2839 &HandleBuffer,\r
2840 &HandleType\r
2841 );\r
2842 if (!EFI_ERROR (Status)) {\r
2843 //\r
2844 // Count the number of handles that match the attributes in Mask\r
2845 //\r
2846 for (HandleIndex = 0; HandleIndex < HandleCount; HandleIndex++) {\r
2847 if ((HandleType[HandleIndex] & Mask) == Mask) {\r
2848 (*MatchingHandleCount)++;\r
2849 }\r
2850 }\r
2851 //\r
2852 // If no handles match the attributes in Mask then return EFI_NOT_FOUND\r
2853 //\r
2854 if (*MatchingHandleCount == 0) {\r
2855 Status = EFI_NOT_FOUND;\r
2856 } else {\r
2857\r
2858 if (MatchingHandleBuffer == NULL) {\r
2859 //\r
2860 // Someone just wanted the count...\r
2861 //\r
2862 Status = EFI_SUCCESS;\r
2863 } else {\r
2864 //\r
2865 // Allocate a handle buffer for the number of handles that matched the attributes in Mask\r
2866 //\r
78ed876b 2867 *MatchingHandleBuffer = AllocateZeroPool ((*MatchingHandleCount +1)* sizeof (EFI_HANDLE));\r
94fcb76b
RN
2868 if (*MatchingHandleBuffer == NULL) {\r
2869 Status = EFI_OUT_OF_RESOURCES;\r
2870 } else {\r
aa3276c1
RN
2871 for (HandleIndex = 0, *MatchingHandleCount = 0\r
2872 ; HandleIndex < HandleCount\r
2873 ; HandleIndex++\r
2874 ) {\r
2875 //\r
2876 // Fill the allocated buffer with the handles that matched the attributes in Mask\r
2877 //\r
2878 if ((HandleType[HandleIndex] & Mask) == Mask) {\r
2879 (*MatchingHandleBuffer)[(*MatchingHandleCount)++] = HandleBuffer[HandleIndex];\r
2880 }\r
2881 }\r
a405b86d 2882\r
a405b86d 2883 //\r
aa3276c1 2884 // Make the last one NULL\r
a405b86d 2885 //\r
aa3276c1 2886 (*MatchingHandleBuffer)[*MatchingHandleCount] = NULL;\r
a405b86d 2887\r
aa3276c1 2888 Status = EFI_SUCCESS;\r
94fcb76b 2889 } // *MatchingHandleBuffer == NULL (ELSE)\r
a405b86d 2890 } // MacthingHandleBuffer == NULL (ELSE)\r
2891 } // *MatchingHandleCount == 0 (ELSE)\r
2892 } // no error on ParseHandleDatabaseByRelationshipWithType\r
2893\r
2894 if (HandleBuffer != NULL) {\r
2895 FreePool (HandleBuffer);\r
2896 }\r
2897\r
2898 if (HandleType != NULL) {\r
2899 FreePool (HandleType);\r
2900 }\r
2901\r
94fcb76b
RN
2902 ASSERT ((MatchingHandleBuffer == NULL) ||\r
2903 (*MatchingHandleCount == 0 && *MatchingHandleBuffer == NULL) ||\r
2904 (*MatchingHandleCount != 0 && *MatchingHandleBuffer != NULL));\r
a405b86d 2905 return Status;\r
2906}\r
2907\r
2908/**\r
2909 Gets handles for any child controllers of the passed in controller.\r
2910\r
2911 @param[in] ControllerHandle The handle of the "parent controller"\r
b6c54204 2912 @param[out] MatchingHandleCount Pointer to the number of handles in\r
a405b86d 2913 MatchingHandleBuffer on return.\r
2914 @param[out] MatchingHandleBuffer Buffer containing handles on a successful\r
2915 return.\r
2916\r
2917\r
2918 @retval EFI_SUCCESS The operation was sucessful.\r
2919**/\r
2920EFI_STATUS\r
2921EFIAPI\r
2922ParseHandleDatabaseForChildControllers(\r
2923 IN CONST EFI_HANDLE ControllerHandle,\r
b6c54204 2924 OUT UINTN *MatchingHandleCount,\r
a405b86d 2925 OUT EFI_HANDLE **MatchingHandleBuffer OPTIONAL\r
2926 )\r
2927{\r
2928 EFI_STATUS Status;\r
f330ff35 2929 UINTN HandleIndex;\r
a405b86d 2930 UINTN DriverBindingHandleCount;\r
2931 EFI_HANDLE *DriverBindingHandleBuffer;\r
2932 UINTN DriverBindingHandleIndex;\r
2933 UINTN ChildControllerHandleCount;\r
2934 EFI_HANDLE *ChildControllerHandleBuffer;\r
2935 UINTN ChildControllerHandleIndex;\r
a405b86d 2936 EFI_HANDLE *HandleBufferForReturn;\r
2937\r
ff51746b 2938 if (MatchingHandleCount == NULL) {\r
2939 return (EFI_INVALID_PARAMETER);\r
2940 }\r
64d753f1 2941 *MatchingHandleCount = 0;\r
a405b86d 2942\r
2943 Status = PARSE_HANDLE_DATABASE_UEFI_DRIVERS (\r
2944 ControllerHandle,\r
2945 &DriverBindingHandleCount,\r
2946 &DriverBindingHandleBuffer\r
2947 );\r
2948 if (EFI_ERROR (Status)) {\r
2949 return Status;\r
2950 }\r
2951\r
ff51746b 2952 //\r
2953 // Get a buffer big enough for all the controllers.\r
2954 //\r
f330ff35 2955 HandleBufferForReturn = GetHandleListByProtocol(NULL);\r
a405b86d 2956 if (HandleBufferForReturn == NULL) {\r
2957 FreePool (DriverBindingHandleBuffer);\r
ff51746b 2958 return (EFI_NOT_FOUND);\r
a405b86d 2959 }\r
2960\r
a405b86d 2961 for (DriverBindingHandleIndex = 0; DriverBindingHandleIndex < DriverBindingHandleCount; DriverBindingHandleIndex++) {\r
2962 Status = PARSE_HANDLE_DATABASE_MANAGED_CHILDREN (\r
2963 DriverBindingHandleBuffer[DriverBindingHandleIndex],\r
2964 ControllerHandle,\r
2965 &ChildControllerHandleCount,\r
2966 &ChildControllerHandleBuffer\r
2967 );\r
2968 if (EFI_ERROR (Status)) {\r
2969 continue;\r
2970 }\r
2971\r
2972 for (ChildControllerHandleIndex = 0;\r
2973 ChildControllerHandleIndex < ChildControllerHandleCount;\r
2974 ChildControllerHandleIndex++\r
2975 ) {\r
f330ff35 2976 for (HandleIndex = 0; HandleIndex < *MatchingHandleCount; HandleIndex++) {\r
2977 if (HandleBufferForReturn[HandleIndex] == ChildControllerHandleBuffer[ChildControllerHandleIndex]) {\r
2978 break;\r
2979 }\r
2980 }\r
2981 if (HandleIndex >= *MatchingHandleCount) {\r
2982 HandleBufferForReturn[(*MatchingHandleCount)++] = ChildControllerHandleBuffer[ChildControllerHandleIndex];\r
2983 }\r
a405b86d 2984 }\r
2985\r
2986 FreePool (ChildControllerHandleBuffer);\r
2987 }\r
2988\r
2989 FreePool (DriverBindingHandleBuffer);\r
2990\r
7eb3bb6c
LE
2991 if (MatchingHandleBuffer == NULL || *MatchingHandleCount == 0) {\r
2992 //\r
2993 // The caller is not interested in the actual handles, or we've found none.\r
2994 //\r
2995 FreePool (HandleBufferForReturn);\r
2996 HandleBufferForReturn = NULL;\r
2997 }\r
2998\r
a405b86d 2999 if (MatchingHandleBuffer != NULL) {\r
3000 *MatchingHandleBuffer = HandleBufferForReturn;\r
a405b86d 3001 }\r
7eb3bb6c 3002\r
94fcb76b
RN
3003 ASSERT ((MatchingHandleBuffer == NULL) ||\r
3004 (*MatchingHandleCount == 0 && *MatchingHandleBuffer == NULL) ||\r
3005 (*MatchingHandleCount != 0 && *MatchingHandleBuffer != NULL));\r
a405b86d 3006\r
3007 return (EFI_SUCCESS);\r
3008}\r
3009\r
3010/**\r
3011 Appends 1 buffer to another buffer. This will re-allocate the destination buffer\r
3012 if necessary to fit all of the data.\r
3013\r
3014 If DestinationBuffer is NULL, then ASSERT().\r
3015\r
4ff7e37b
ED
3016 @param[in, out] DestinationBuffer The pointer to the pointer to the buffer to append onto.\r
3017 @param[in, out] DestinationSize The pointer to the size of DestinationBuffer.\r
3018 @param[in] SourceBuffer The pointer to the buffer to append onto DestinationBuffer.\r
3019 @param[in] SourceSize The number of bytes of SourceBuffer to append.\r
a405b86d 3020\r
3021 @retval NULL A memory allocation failed.\r
3022 @retval NULL A parameter was invalid.\r
3023 @return A pointer to (*DestinationBuffer).\r
3024**/\r
3025VOID*\r
a405b86d 3026BuffernCatGrow (\r
3027 IN OUT VOID **DestinationBuffer,\r
3028 IN OUT UINTN *DestinationSize,\r
3029 IN VOID *SourceBuffer,\r
3030 IN UINTN SourceSize\r
3031 )\r
3032{\r
3033 UINTN LocalDestinationSize;\r
3034 UINTN LocalDestinationFinalSize;\r
3035\r
3036 ASSERT(DestinationBuffer != NULL);\r
3037\r
3038 if (SourceSize == 0 || SourceBuffer == NULL) {\r
3039 return (*DestinationBuffer);\r
3040 }\r
3041\r
3042 if (DestinationSize == NULL) {\r
3043 LocalDestinationSize = 0;\r
3044 } else {\r
3045 LocalDestinationSize = *DestinationSize;\r
3046 }\r
3047\r
3048 LocalDestinationFinalSize = LocalDestinationSize + SourceSize;\r
3049\r
3050 if (DestinationSize != NULL) {\r
3051 *DestinationSize = LocalDestinationSize;\r
3052 }\r
3053\r
3054 if (LocalDestinationSize == 0) {\r
3055 // allcoate\r
78ed876b 3056 *DestinationBuffer = AllocateZeroPool(LocalDestinationFinalSize);\r
a405b86d 3057 } else {\r
3058 // reallocate\r
3059 *DestinationBuffer = ReallocatePool(LocalDestinationSize, LocalDestinationFinalSize, *DestinationBuffer);\r
3060 }\r
3061\r
3062 ASSERT(*DestinationBuffer != NULL);\r
3063\r
3064 // copy\r
3065 return (CopyMem(((UINT8*)(*DestinationBuffer)) + LocalDestinationSize, SourceBuffer, SourceSize));\r
3066}\r
3067\r
3068/**\r
3069 Gets handles for any child devices produced by the passed in driver.\r
3070\r
3071 @param[in] DriverHandle The handle of the driver.\r
3072 @param[in] MatchingHandleCount Pointer to the number of handles in\r
3073 MatchingHandleBuffer on return.\r
3074 @param[out] MatchingHandleBuffer Buffer containing handles on a successful\r
3075 return.\r
3076 @retval EFI_SUCCESS The operation was sucessful.\r
3077 @sa ParseHandleDatabaseByRelationship\r
3078**/\r
3079EFI_STATUS\r
3080EFIAPI\r
3081ParseHandleDatabaseForChildDevices(\r
3082 IN CONST EFI_HANDLE DriverHandle,\r
3083 IN UINTN *MatchingHandleCount,\r
3084 OUT EFI_HANDLE **MatchingHandleBuffer OPTIONAL\r
3085 )\r
3086{\r
3087 EFI_HANDLE *Buffer;\r
3088 EFI_HANDLE *Buffer2;\r
3089 UINTN Count1;\r
3090 UINTN Count2;\r
3091 UINTN HandleIndex;\r
3092 EFI_STATUS Status;\r
3093 UINTN HandleBufferSize;\r
3094\r
3095 ASSERT(MatchingHandleCount != NULL);\r
3096\r
3097 HandleBufferSize = 0;\r
3098 Buffer = NULL;\r
3099 Buffer2 = NULL;\r
3100 *MatchingHandleCount = 0;\r
3101\r
3102 Status = PARSE_HANDLE_DATABASE_DEVICES (\r
3103 DriverHandle,\r
3104 &Count1,\r
3105 &Buffer\r
3106 );\r
3107 if (!EFI_ERROR (Status)) {\r
3108 for (HandleIndex = 0; HandleIndex < Count1; HandleIndex++) {\r
3109 //\r
3110 // now find the children\r
3111 //\r
3112 Status = PARSE_HANDLE_DATABASE_MANAGED_CHILDREN (\r
3113 DriverHandle,\r
3114 Buffer[HandleIndex],\r
3115 &Count2,\r
3116 &Buffer2\r
3117 );\r
3118 if (EFI_ERROR(Status)) {\r
3119 break;\r
3120 }\r
3121 //\r
3122 // save out required and optional data elements\r
3123 //\r
3124 *MatchingHandleCount += Count2;\r
3125 if (MatchingHandleBuffer != NULL) {\r
3126 *MatchingHandleBuffer = BuffernCatGrow((VOID**)MatchingHandleBuffer, &HandleBufferSize, Buffer2, Count2 * sizeof(Buffer2[0]));\r
3127 }\r
3128\r
3129 //\r
3130 // free the memory\r
3131 //\r
3132 if (Buffer2 != NULL) {\r
3133 FreePool(Buffer2);\r
3134 }\r
3135 }\r
3136 }\r
3137\r
3138 if (Buffer != NULL) {\r
3139 FreePool(Buffer);\r
3140 }\r
3141 return (Status);\r
3142}\r
3143\r
3144/**\r
3145 Function to get all handles that support a given protocol or all handles.\r
3146\r
3147 @param[in] ProtocolGuid The guid of the protocol to get handles for. If NULL\r
3148 then the function will return all handles.\r
3149\r
3150 @retval NULL A memory allocation failed.\r
3151 @return A NULL terminated list of handles.\r
3152**/\r
3153EFI_HANDLE*\r
3154EFIAPI\r
40d7a9cf 3155GetHandleListByProtocol (\r
a405b86d 3156 IN CONST EFI_GUID *ProtocolGuid OPTIONAL\r
3157 )\r
3158{\r
3159 EFI_HANDLE *HandleList;\r
3160 UINTN Size;\r
3161 EFI_STATUS Status;\r
3162\r
3163 Size = 0;\r
3164 HandleList = NULL;\r
3165\r
3166 //\r
3167 // We cannot use LocateHandleBuffer since we need that NULL item on the ends of the list!\r
3168 //\r
3169 if (ProtocolGuid == NULL) {\r
3170 Status = gBS->LocateHandle(AllHandles, NULL, NULL, &Size, HandleList);\r
3171 if (Status == EFI_BUFFER_TOO_SMALL) {\r
78ed876b 3172 HandleList = AllocateZeroPool(Size + sizeof(EFI_HANDLE));\r
40d7a9cf 3173 if (HandleList == NULL) {\r
3174 return (NULL);\r
3175 }\r
a405b86d 3176 Status = gBS->LocateHandle(AllHandles, NULL, NULL, &Size, HandleList);\r
3177 HandleList[Size/sizeof(EFI_HANDLE)] = NULL;\r
3178 }\r
3179 } else {\r
3180 Status = gBS->LocateHandle(ByProtocol, (EFI_GUID*)ProtocolGuid, NULL, &Size, HandleList);\r
3181 if (Status == EFI_BUFFER_TOO_SMALL) {\r
78ed876b 3182 HandleList = AllocateZeroPool(Size + sizeof(EFI_HANDLE));\r
40d7a9cf 3183 if (HandleList == NULL) {\r
3184 return (NULL);\r
3185 }\r
a405b86d 3186 Status = gBS->LocateHandle(ByProtocol, (EFI_GUID*)ProtocolGuid, NULL, &Size, HandleList);\r
3187 HandleList[Size/sizeof(EFI_HANDLE)] = NULL;\r
3188 }\r
3189 }\r
3190 if (EFI_ERROR(Status)) {\r
3191 if (HandleList != NULL) {\r
3192 FreePool(HandleList);\r
3193 }\r
3194 return (NULL);\r
3195 }\r
3196 return (HandleList);\r
3197}\r
3198\r
3199/**\r
3200 Function to get all handles that support some protocols.\r
3201\r
3202 @param[in] ProtocolGuids A NULL terminated list of protocol GUIDs.\r
3203\r
3204 @retval NULL A memory allocation failed.\r
ff51746b 3205 @retval NULL ProtocolGuids was NULL.\r
3206 @return A NULL terminated list of EFI_HANDLEs.\r
a405b86d 3207**/\r
3208EFI_HANDLE*\r
3209EFIAPI\r
40d7a9cf 3210GetHandleListByProtocolList (\r
a405b86d 3211 IN CONST EFI_GUID **ProtocolGuids\r
3212 )\r
3213{\r
3214 EFI_HANDLE *HandleList;\r
3215 UINTN Size;\r
3216 UINTN TotalSize;\r
40d7a9cf 3217 UINTN TempSize;\r
a405b86d 3218 EFI_STATUS Status;\r
3219 CONST EFI_GUID **GuidWalker;\r
3220 EFI_HANDLE *HandleWalker1;\r
3221 EFI_HANDLE *HandleWalker2;\r
3222\r
3223 Size = 0;\r
3224 HandleList = NULL;\r
3225 TotalSize = sizeof(EFI_HANDLE);\r
3226\r
3227 for (GuidWalker = ProtocolGuids ; GuidWalker != NULL && *GuidWalker != NULL ; GuidWalker++,Size = 0){\r
3228 Status = gBS->LocateHandle(ByProtocol, (EFI_GUID*)(*GuidWalker), NULL, &Size, NULL);\r
3229 if (Status == EFI_BUFFER_TOO_SMALL) {\r
3230 TotalSize += Size;\r
3231 }\r
3232 }\r
40d7a9cf 3233\r
3234 //\r
e918029f 3235 // No handles were found...\r
40d7a9cf 3236 //\r
3237 if (TotalSize == sizeof(EFI_HANDLE)) {\r
3238 return (NULL);\r
3239 }\r
3240\r
3241 HandleList = AllocateZeroPool(TotalSize);\r
a405b86d 3242 if (HandleList == NULL) {\r
3243 return (NULL);\r
3244 }\r
3245\r
3246 Size = 0;\r
3247 for (GuidWalker = ProtocolGuids ; GuidWalker != NULL && *GuidWalker != NULL ; GuidWalker++){\r
40d7a9cf 3248 TempSize = TotalSize - Size;\r
ff51746b 3249 Status = gBS->LocateHandle(ByProtocol, (EFI_GUID*)(*GuidWalker), NULL, &TempSize, HandleList+(Size/sizeof(EFI_HANDLE)));\r
40d7a9cf 3250\r
3251 //\r
3252 // Allow for missing protocols... Only update the 'used' size upon success.\r
3253 //\r
3254 if (!EFI_ERROR(Status)) {\r
ff51746b 3255 Size += TempSize;\r
40d7a9cf 3256 }\r
a405b86d 3257 }\r
ff51746b 3258 ASSERT(HandleList[(TotalSize/sizeof(EFI_HANDLE))-1] == NULL);\r
a405b86d 3259\r
3260 for (HandleWalker1 = HandleList ; HandleWalker1 != NULL && *HandleWalker1 != NULL ; HandleWalker1++) {\r
3261 for (HandleWalker2 = HandleWalker1 + 1; HandleWalker2 != NULL && *HandleWalker2 != NULL ; HandleWalker2++) {\r
3262 if (*HandleWalker1 == *HandleWalker2) {\r
3263 //\r
3264 // copy memory back 1 handle width.\r
3265 //\r
3266 CopyMem(HandleWalker2, HandleWalker2 + 1, TotalSize - ((HandleWalker2-HandleList+1)*sizeof(EFI_HANDLE)));\r
3267 }\r
3268 }\r
3269 }\r
3270\r
3271 return (HandleList);\r
3272}\r
0976f908
CC
3273\r
3274/**\r
3275 Return all supported GUIDs.\r
3276\r
3277 @param[out] Guids The buffer to return all supported GUIDs.\r
3278 @param[in, out] Count On input, the count of GUIDs the buffer can hold,\r
3279 On output, the count of GUIDs to return.\r
3280\r
3281 @retval EFI_INVALID_PARAMETER Count is NULL.\r
3282 @retval EFI_BUFFER_TOO_SMALL Buffer is not enough to hold all GUIDs.\r
3283 @retval EFI_SUCCESS GUIDs are returned successfully.\r
3284**/\r
3285EFI_STATUS\r
3286EFIAPI\r
3287GetAllMappingGuids (\r
3288 OUT EFI_GUID *Guids,\r
3289 IN OUT UINTN *Count\r
3290 )\r
3291{\r
3292 UINTN GuidCount;\r
7c14bc87 3293 UINTN NtGuidCount;\r
0976f908
CC
3294 UINTN Index;\r
3295\r
3296 if (Count == NULL) {\r
3297 return EFI_INVALID_PARAMETER;\r
3298 }\r
3299\r
3300 NtGuidCount = 0;\r
3301 if (PcdGetBool (PcdShellIncludeNtGuids)) {\r
3302 NtGuidCount = ARRAY_SIZE (mGuidStringListNT) - 1;\r
3303 }\r
3304 GuidCount = ARRAY_SIZE (mGuidStringList) - 1;\r
3305\r
3306 if (*Count < NtGuidCount + GuidCount + mGuidListCount) {\r
3307 *Count = NtGuidCount + GuidCount + mGuidListCount;\r
3308 return EFI_BUFFER_TOO_SMALL;\r
3309 }\r
3310\r
3311 for (Index = 0; Index < NtGuidCount; Index++) {\r
3312 CopyGuid (&Guids[Index], mGuidStringListNT[Index].GuidId);\r
3313 }\r
3314\r
3315 for (Index = 0; Index < GuidCount; Index++) {\r
3316 CopyGuid (&Guids[NtGuidCount + Index], mGuidStringList[Index].GuidId);\r
3317 }\r
3318\r
3319 for (Index = 0; Index < mGuidListCount; Index++) {\r
3320 CopyGuid (&Guids[NtGuidCount + GuidCount + Index], mGuidList[Index].GuidId);\r
3321 }\r
3322\r
3323 return EFI_SUCCESS;\r
3324}\r