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