]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - MdePkg/Library/PeiExtractGuidedSectionLib/PeiExtractGuidedSectionLib.c
MdePkg: Fix typos in comments
[mirror_edk2.git] / MdePkg / Library / PeiExtractGuidedSectionLib / PeiExtractGuidedSectionLib.c
... / ...
CommitLineData
1/** @file\r
2 Provide generic extract guided section functions for PEI phase.\r
3\r
4 Copyright (c) 2007 - 2012, Intel Corporation. All rights reserved.<BR>\r
5 This program and the accompanying materials\r
6 are licensed and made available under the terms and conditions of the BSD License\r
7 which accompanies this distribution. The full text of the license may be found at\r
8 http://opensource.org/licenses/bsd-license.php.\r
9\r
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
15#include <PiPei.h>\r
16\r
17#include <Library/DebugLib.h>\r
18#include <Library/PcdLib.h>\r
19#include <Library/BaseMemoryLib.h>\r
20#include <Library/HobLib.h>\r
21#include <Library/ExtractGuidedSectionLib.h>\r
22\r
23#define PEI_EXTRACT_HANDLER_INFO_SIGNATURE SIGNATURE_32 ('P', 'E', 'H', 'I')\r
24\r
25typedef struct {\r
26 UINT32 Signature;\r
27 UINT32 NumberOfExtractHandler;\r
28 GUID *ExtractHandlerGuidTable;\r
29 EXTRACT_GUIDED_SECTION_DECODE_HANDLER *ExtractDecodeHandlerTable;\r
30 EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER *ExtractGetInfoHandlerTable;\r
31} PEI_EXTRACT_GUIDED_SECTION_HANDLER_INFO;\r
32\r
33/**\r
34 Build guid hob for the global memory to store the registered guid and Handler list.\r
35 If GuidHob exists, HandlerInfo will be directly got from Guid hob data.\r
36\r
37 @param[in, out] InfoPointer The pointer to pei handler information structure.\r
38\r
39 @retval RETURN_SUCCESS Build Guid hob for the global memory space to store guid and function tables.\r
40 @retval RETURN_OUT_OF_RESOURCES No enough memory to allocated.\r
41**/\r
42RETURN_STATUS\r
43PeiGetExtractGuidedSectionHandlerInfo (\r
44 IN OUT PEI_EXTRACT_GUIDED_SECTION_HANDLER_INFO **InfoPointer\r
45 )\r
46{\r
47 PEI_EXTRACT_GUIDED_SECTION_HANDLER_INFO *HandlerInfo;\r
48 EFI_PEI_HOB_POINTERS Hob;\r
49 \r
50 //\r
51 // First try to get handler information from guid hob specified by CallerId.\r
52 //\r
53 Hob.Raw = GetNextHob (EFI_HOB_TYPE_GUID_EXTENSION, GetHobList ());\r
54 while (Hob.Raw != NULL) {\r
55 if (CompareGuid (&(Hob.Guid->Name), &gEfiCallerIdGuid)) {\r
56 HandlerInfo = (PEI_EXTRACT_GUIDED_SECTION_HANDLER_INFO *) GET_GUID_HOB_DATA (Hob.Guid);\r
57 if (HandlerInfo->Signature == PEI_EXTRACT_HANDLER_INFO_SIGNATURE) {\r
58 //\r
59 // Update Table Pointer when hob start address is changed.\r
60 //\r
61 if (HandlerInfo->ExtractHandlerGuidTable != (GUID *) (HandlerInfo + 1)) {\r
62 HandlerInfo->ExtractHandlerGuidTable = (GUID *) (HandlerInfo + 1);\r
63 HandlerInfo->ExtractDecodeHandlerTable = (EXTRACT_GUIDED_SECTION_DECODE_HANDLER *) (\r
64 (UINT8 *)HandlerInfo->ExtractHandlerGuidTable + \r
65 PcdGet32 (PcdMaximumGuidedExtractHandler) * sizeof (GUID)\r
66 );\r
67 HandlerInfo->ExtractGetInfoHandlerTable = (EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER *) (\r
68 (UINT8 *)HandlerInfo->ExtractDecodeHandlerTable + \r
69 PcdGet32 (PcdMaximumGuidedExtractHandler) * \r
70 sizeof (EXTRACT_GUIDED_SECTION_DECODE_HANDLER)\r
71 );\r
72 }\r
73 //\r
74 // Return HandlerInfo pointer.\r
75 //\r
76 *InfoPointer = HandlerInfo;\r
77 return EFI_SUCCESS;\r
78 }\r
79 }\r
80 Hob.Raw = GET_NEXT_HOB (Hob);\r
81 Hob.Raw = GetNextHob (EFI_HOB_TYPE_GUID_EXTENSION, Hob.Raw);\r
82 }\r
83 \r
84 //\r
85 // If Guid Hob is not found, Build CallerId Guid hob to store Handler Info\r
86 //\r
87 HandlerInfo = BuildGuidHob (\r
88 &gEfiCallerIdGuid, \r
89 sizeof (PEI_EXTRACT_GUIDED_SECTION_HANDLER_INFO) +\r
90 PcdGet32 (PcdMaximumGuidedExtractHandler) * \r
91 (sizeof (GUID) + sizeof (EXTRACT_GUIDED_SECTION_DECODE_HANDLER) + sizeof (EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER))\r
92 );\r
93 if (HandlerInfo == NULL) {\r
94 //\r
95 // No enough resource to build guid hob.\r
96 //\r
97 *InfoPointer = NULL;\r
98 return EFI_OUT_OF_RESOURCES;\r
99 }\r
100 //\r
101 // Init HandlerInfo structure\r
102 //\r
103 HandlerInfo->Signature = PEI_EXTRACT_HANDLER_INFO_SIGNATURE;\r
104 HandlerInfo->NumberOfExtractHandler = 0;\r
105 HandlerInfo->ExtractHandlerGuidTable = (GUID *) (HandlerInfo + 1);\r
106 HandlerInfo->ExtractDecodeHandlerTable = (EXTRACT_GUIDED_SECTION_DECODE_HANDLER *) (\r
107 (UINT8 *)HandlerInfo->ExtractHandlerGuidTable + \r
108 PcdGet32 (PcdMaximumGuidedExtractHandler) * sizeof (GUID)\r
109 );\r
110 HandlerInfo->ExtractGetInfoHandlerTable = (EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER *) (\r
111 (UINT8 *)HandlerInfo->ExtractDecodeHandlerTable + \r
112 PcdGet32 (PcdMaximumGuidedExtractHandler) * \r
113 sizeof (EXTRACT_GUIDED_SECTION_DECODE_HANDLER)\r
114 );\r
115 //\r
116 // return the created HandlerInfo.\r
117 //\r
118 *InfoPointer = HandlerInfo;\r
119 return EFI_SUCCESS;\r
120}\r
121\r
122/**\r
123 Retrieve the list GUIDs that have been registered through ExtractGuidedSectionRegisterHandlers().\r
124\r
125 Sets ExtractHandlerGuidTable so it points at a callee allocated array of registered GUIDs.\r
126 The total number of GUIDs in the array are returned. Since the array of GUIDs is callee allocated\r
127 and caller must treat this array of GUIDs as read-only data. \r
128 If ExtractHandlerGuidTable is NULL, then ASSERT().\r
129\r
130 @param[out] ExtractHandlerGuidTable A pointer to the array of GUIDs that have been registered through\r
131 ExtractGuidedSectionRegisterHandlers().\r
132\r
133 @return the number of the supported extract guided Handler.\r
134\r
135**/\r
136UINTN\r
137EFIAPI\r
138ExtractGuidedSectionGetGuidList (\r
139 OUT GUID **ExtractHandlerGuidTable\r
140 )\r
141{\r
142 EFI_STATUS Status;\r
143 PEI_EXTRACT_GUIDED_SECTION_HANDLER_INFO *HandlerInfo;\r
144\r
145 ASSERT (ExtractHandlerGuidTable != NULL);\r
146\r
147 //\r
148 // Get all registered handler information\r
149 //\r
150 Status = PeiGetExtractGuidedSectionHandlerInfo (&HandlerInfo);\r
151 if (EFI_ERROR (Status)) {\r
152 *ExtractHandlerGuidTable = NULL;\r
153 return 0;\r
154 }\r
155\r
156 //\r
157 // Get GuidTable and Table Number\r
158 //\r
159 ASSERT (HandlerInfo != NULL);\r
160 *ExtractHandlerGuidTable = HandlerInfo->ExtractHandlerGuidTable;\r
161 return HandlerInfo->NumberOfExtractHandler;\r
162}\r
163\r
164/**\r
165 Registers handlers of type EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER and EXTRACT_GUIDED_SECTION_DECODE_HANDLER\r
166 for a specific GUID section type.\r
167\r
168 Registers the handlers specified by GetInfoHandler and DecodeHandler with the GUID specified by SectionGuid.\r
169 If the GUID value specified by SectionGuid has already been registered, then return RETURN_ALREADY_STARTED.\r
170 If there are not enough resources available to register the handlers then RETURN_OUT_OF_RESOURCES is returned.\r
171 \r
172 If SectionGuid is NULL, then ASSERT().\r
173 If GetInfoHandler is NULL, then ASSERT().\r
174 If DecodeHandler is NULL, then ASSERT().\r
175\r
176 @param[in] SectionGuid A pointer to the GUID associated with the the handlers\r
177 of the GUIDed section type being registered.\r
178 @param[in] GetInfoHandler The pointer to a function that examines a GUIDed section and returns the\r
179 size of the decoded buffer and the size of an optional scratch buffer\r
180 required to actually decode the data in a GUIDed section.\r
181 @param[in] DecodeHandler The pointer to a function that decodes a GUIDed section into a caller\r
182 allocated output buffer. \r
183\r
184 @retval RETURN_SUCCESS The handlers were registered.\r
185 @retval RETURN_OUT_OF_RESOURCES There are not enough resources available to register the handlers.\r
186\r
187**/\r
188RETURN_STATUS\r
189EFIAPI\r
190ExtractGuidedSectionRegisterHandlers (\r
191 IN CONST GUID *SectionGuid,\r
192 IN EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER GetInfoHandler,\r
193 IN EXTRACT_GUIDED_SECTION_DECODE_HANDLER DecodeHandler\r
194 )\r
195{\r
196 EFI_STATUS Status;\r
197 UINT32 Index;\r
198 PEI_EXTRACT_GUIDED_SECTION_HANDLER_INFO *HandlerInfo;\r
199\r
200 //\r
201 // Check input parameter\r
202 //\r
203 ASSERT (SectionGuid != NULL);\r
204 ASSERT (GetInfoHandler != NULL);\r
205 ASSERT (DecodeHandler != NULL);\r
206\r
207\r
208\r
209 //\r
210 // Get the registered handler information\r
211 //\r
212 Status = PeiGetExtractGuidedSectionHandlerInfo (&HandlerInfo);\r
213 if (EFI_ERROR (Status)) {\r
214 return Status;\r
215 }\r
216\r
217 //\r
218 // Search the match registered GetInfo handler for the input guided section.\r
219 //\r
220 ASSERT (HandlerInfo != NULL);\r
221 for (Index = 0; Index < HandlerInfo->NumberOfExtractHandler; Index ++) {\r
222 if (CompareGuid (HandlerInfo->ExtractHandlerGuidTable + Index, SectionGuid)) {\r
223 //\r
224 // If the guided handler has been registered before, only update its handler.\r
225 //\r
226 HandlerInfo->ExtractDecodeHandlerTable [Index] = DecodeHandler;\r
227 HandlerInfo->ExtractGetInfoHandlerTable [Index] = GetInfoHandler;\r
228 return RETURN_SUCCESS;\r
229 }\r
230 }\r
231\r
232 //\r
233 // Check the global table is enough to contain new Handler.\r
234 //\r
235 if (HandlerInfo->NumberOfExtractHandler >= PcdGet32 (PcdMaximumGuidedExtractHandler)) {\r
236 return RETURN_OUT_OF_RESOURCES;\r
237 }\r
238 \r
239 //\r
240 // Register new Handler and guid value.\r
241 //\r
242 CopyGuid (HandlerInfo->ExtractHandlerGuidTable + HandlerInfo->NumberOfExtractHandler, SectionGuid);\r
243 HandlerInfo->ExtractDecodeHandlerTable [HandlerInfo->NumberOfExtractHandler] = DecodeHandler;\r
244 HandlerInfo->ExtractGetInfoHandlerTable [HandlerInfo->NumberOfExtractHandler++] = GetInfoHandler;\r
245\r
246 //\r
247 // Build the Guided Section GUID HOB to record the GUID itself.\r
248 // Then the content of the GUIDed HOB will be the same as the GUID value itself.\r
249 //\r
250 BuildGuidDataHob (\r
251 (EFI_GUID *) SectionGuid,\r
252 (VOID *) SectionGuid,\r
253 sizeof (GUID)\r
254 );\r
255\r
256 return RETURN_SUCCESS;\r
257}\r
258\r
259/**\r
260 Retrieves a GUID from a GUIDed section and uses that GUID to select an associated handler of type\r
261 EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER that was registered with ExtractGuidedSectionRegisterHandlers().\r
262 The selected handler is used to retrieve and return the size of the decoded buffer and the size of an\r
263 optional scratch buffer required to actually decode the data in a GUIDed section.\r
264\r
265 Examines a GUIDed section specified by InputSection. \r
266 If GUID for InputSection does not match any of the GUIDs registered through ExtractGuidedSectionRegisterHandlers(),\r
267 then RETURN_UNSUPPORTED is returned. \r
268 If the GUID of InputSection does match the GUID that this handler supports, then the the associated handler \r
269 of type EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER that was registered with ExtractGuidedSectionRegisterHandlers()\r
270 is used to retrieve the OututBufferSize, ScratchSize, and Attributes values. The return status from the handler of\r
271 type EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER is returned.\r
272 \r
273 If InputSection is NULL, then ASSERT().\r
274 If OutputBufferSize is NULL, then ASSERT().\r
275 If ScratchBufferSize is NULL, then ASSERT().\r
276 If SectionAttribute is NULL, then ASSERT().\r
277\r
278 @param[in] InputSection A pointer to a GUIDed section of an FFS formatted file.\r
279 @param[out] OutputBufferSize A pointer to the size, in bytes, of an output buffer required if the buffer\r
280 specified by InputSection were decoded.\r
281 @param[out] ScratchBufferSize A pointer to the size, in bytes, required as scratch space if the buffer specified by\r
282 InputSection were decoded.\r
283 @param[out] SectionAttribute A pointer to the attributes of the GUIDed section. See the Attributes field of\r
284 EFI_GUID_DEFINED_SECTION in the PI Specification.\r
285\r
286 @retval RETURN_SUCCESS Get the required information successfully.\r
287 @retval RETURN_UNSUPPORTED The GUID from the section specified by InputSection does not match any of\r
288 the GUIDs registered with ExtractGuidedSectionRegisterHandlers().\r
289 @retval Others The return status from the handler associated with the GUID retrieved from\r
290 the section specified by InputSection.\r
291\r
292**/\r
293RETURN_STATUS\r
294EFIAPI\r
295ExtractGuidedSectionGetInfo (\r
296 IN CONST VOID *InputSection,\r
297 OUT UINT32 *OutputBufferSize,\r
298 OUT UINT32 *ScratchBufferSize,\r
299 OUT UINT16 *SectionAttribute \r
300 )\r
301{\r
302 UINT32 Index;\r
303 EFI_STATUS Status;\r
304 PEI_EXTRACT_GUIDED_SECTION_HANDLER_INFO *HandlerInfo;\r
305 EFI_GUID *SectionDefinitionGuid;\r
306 \r
307 //\r
308 // Check input parameter\r
309 //\r
310 ASSERT (InputSection != NULL);\r
311 ASSERT (OutputBufferSize != NULL);\r
312 ASSERT (ScratchBufferSize != NULL);\r
313 ASSERT (SectionAttribute != NULL);\r
314\r
315 //\r
316 // Get all registered handler information.\r
317 //\r
318 Status = PeiGetExtractGuidedSectionHandlerInfo (&HandlerInfo);\r
319 if (EFI_ERROR (Status)) {\r
320 return Status;\r
321 }\r
322\r
323 if (IS_SECTION2 (InputSection)) {\r
324 SectionDefinitionGuid = &(((EFI_GUID_DEFINED_SECTION2 *) InputSection)->SectionDefinitionGuid);\r
325 } else {\r
326 SectionDefinitionGuid = &(((EFI_GUID_DEFINED_SECTION *) InputSection)->SectionDefinitionGuid);\r
327 }\r
328\r
329 //\r
330 // Search the match registered GetInfo handler for the input guided section.\r
331 //\r
332 ASSERT (HandlerInfo != NULL);\r
333 for (Index = 0; Index < HandlerInfo->NumberOfExtractHandler; Index ++) {\r
334 if (CompareGuid (HandlerInfo->ExtractHandlerGuidTable + Index, SectionDefinitionGuid)) {\r
335 //\r
336 // Call the match handler to get information for the input section data.\r
337 //\r
338 return HandlerInfo->ExtractGetInfoHandlerTable [Index] (\r
339 InputSection,\r
340 OutputBufferSize,\r
341 ScratchBufferSize,\r
342 SectionAttribute\r
343 );\r
344 }\r
345 }\r
346\r
347 //\r
348 // Not found, the input guided section is not supported. \r
349 //\r
350 return RETURN_UNSUPPORTED;\r
351}\r
352\r
353/**\r
354 Retrieves the GUID from a GUIDed section and uses that GUID to select an associated handler of type\r
355 EXTRACT_GUIDED_SECTION_DECODE_HANDLER that was registered with ExtractGuidedSectionRegisterHandlers().\r
356 The selected handler is used to decode the data in a GUIDed section and return the result in a caller\r
357 allocated output buffer.\r
358\r
359 Decodes the GUIDed section specified by InputSection. \r
360 If GUID for InputSection does not match any of the GUIDs registered through ExtractGuidedSectionRegisterHandlers(),\r
361 then RETURN_UNSUPPORTED is returned. \r
362 If the GUID of InputSection does match the GUID that this handler supports, then the the associated handler\r
363 of type EXTRACT_GUIDED_SECTION_DECODE_HANDLER that was registered with ExtractGuidedSectionRegisterHandlers()\r
364 is used to decode InputSection into the buffer specified by OutputBuffer and the authentication status of this\r
365 decode operation is returned in AuthenticationStatus. If the decoded buffer is identical to the data in InputSection,\r
366 then OutputBuffer is set to point at the data in InputSection. Otherwise, the decoded data will be placed in caller\r
367 allocated buffer specified by OutputBuffer. This function is responsible for computing the EFI_AUTH_STATUS_PLATFORM_OVERRIDE\r
368 bit of in AuthenticationStatus. The return status from the handler of type EXTRACT_GUIDED_SECTION_DECODE_HANDLER is returned. \r
369 \r
370 If InputSection is NULL, then ASSERT().\r
371 If OutputBuffer is NULL, then ASSERT().\r
372 If ScratchBuffer is NULL and this decode operation requires a scratch buffer, then ASSERT().\r
373 If AuthenticationStatus is NULL, then ASSERT(). \r
374\r
375 @param[in] InputSection A pointer to a GUIDed section of an FFS formatted file.\r
376 @param[out] OutputBuffer A pointer to a buffer that contains the result of a decode operation. \r
377 @param[in] ScratchBuffer A caller allocated buffer that may be required by this function as a scratch buffer to perform the decode operation. \r
378 @param[out] AuthenticationStatus \r
379 A pointer to the authentication status of the decoded output buffer. See the definition\r
380 of authentication status in the EFI_PEI_GUIDED_SECTION_EXTRACTION_PPI section of the PI\r
381 Specification.\r
382\r
383 @retval RETURN_SUCCESS The buffer specified by InputSection was decoded.\r
384 @retval RETURN_UNSUPPORTED The section specified by InputSection does not match the GUID this handler supports.\r
385 @retval RETURN_INVALID_PARAMETER The section specified by InputSection can not be decoded.\r
386\r
387**/\r
388RETURN_STATUS\r
389EFIAPI\r
390ExtractGuidedSectionDecode (\r
391 IN CONST VOID *InputSection,\r
392 OUT VOID **OutputBuffer,\r
393 IN VOID *ScratchBuffer, OPTIONAL\r
394 OUT UINT32 *AuthenticationStatus \r
395 )\r
396{\r
397 UINT32 Index;\r
398 EFI_STATUS Status;\r
399 PEI_EXTRACT_GUIDED_SECTION_HANDLER_INFO *HandlerInfo;\r
400 EFI_GUID *SectionDefinitionGuid;\r
401 \r
402 //\r
403 // Check input parameter\r
404 //\r
405 ASSERT (InputSection != NULL);\r
406 ASSERT (OutputBuffer != NULL);\r
407 ASSERT (AuthenticationStatus != NULL);\r
408\r
409 //\r
410 // Get all registered handler information.\r
411 // \r
412 Status = PeiGetExtractGuidedSectionHandlerInfo (&HandlerInfo);\r
413 if (EFI_ERROR (Status)) {\r
414 return Status;\r
415 }\r
416\r
417 if (IS_SECTION2 (InputSection)) {\r
418 SectionDefinitionGuid = &(((EFI_GUID_DEFINED_SECTION2 *) InputSection)->SectionDefinitionGuid);\r
419 } else {\r
420 SectionDefinitionGuid = &(((EFI_GUID_DEFINED_SECTION *) InputSection)->SectionDefinitionGuid);\r
421 }\r
422\r
423 //\r
424 // Search the match registered Extract handler for the input guided section.\r
425 //\r
426 ASSERT (HandlerInfo != NULL);\r
427 for (Index = 0; Index < HandlerInfo->NumberOfExtractHandler; Index ++) {\r
428 if (CompareGuid (HandlerInfo->ExtractHandlerGuidTable + Index, SectionDefinitionGuid)) {\r
429 //\r
430 // Call the match handler to extract raw data for the input guided section.\r
431 //\r
432 return HandlerInfo->ExtractDecodeHandlerTable [Index] (\r
433 InputSection,\r
434 OutputBuffer,\r
435 ScratchBuffer,\r
436 AuthenticationStatus\r
437 );\r
438 }\r
439 }\r
440\r
441 //\r
442 // Not found, the input guided section is not supported. \r
443 //\r
444 return RETURN_UNSUPPORTED;\r
445}\r
446\r
447/**\r
448 Retrieves handlers of type EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER and \r
449 EXTRACT_GUIDED_SECTION_DECODE_HANDLER for a specific GUID section type.\r
450 \r
451 Retrieves the handlers associated with SectionGuid and returns them in \r
452 GetInfoHandler and DecodeHandler.\r
453\r
454 If the GUID value specified by SectionGuid has not been registered, then \r
455 return RETURN_NOT_FOUND.\r
456 \r
457 If SectionGuid is NULL, then ASSERT().\r
458\r
459 @param[in] SectionGuid A pointer to the GUID associated with the handlersof the GUIDed \r
460 section type being retrieved.\r
461 @param[out] GetInfoHandler Pointer to a function that examines a GUIDed section and returns \r
462 the size of the decoded buffer and the size of an optional scratch \r
463 buffer required to actually decode the data in a GUIDed section. \r
464 This is an optional parameter that may be NULL. If it is NULL, then \r
465 the previously registered handler is not returned.\r
466 @param[out] DecodeHandler Pointer to a function that decodes a GUIDed section into a caller\r
467 allocated output buffer. This is an optional parameter that may be NULL.\r
468 If it is NULL, then the previously registered handler is not returned.\r
469\r
470 @retval RETURN_SUCCESS The handlers were retrieved.\r
471 @retval RETURN_NOT_FOUND No handlers have been registered with the specified GUID.\r
472\r
473**/\r
474RETURN_STATUS\r
475EFIAPI\r
476ExtractGuidedSectionGetHandlers (\r
477 IN CONST GUID *SectionGuid,\r
478 OUT EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER *GetInfoHandler, OPTIONAL\r
479 OUT EXTRACT_GUIDED_SECTION_DECODE_HANDLER *DecodeHandler OPTIONAL\r
480 )\r
481{\r
482 EFI_STATUS Status;\r
483 UINT32 Index;\r
484 PEI_EXTRACT_GUIDED_SECTION_HANDLER_INFO *HandlerInfo;\r
485\r
486 //\r
487 // Check input parameter\r
488 //\r
489 ASSERT (SectionGuid != NULL);\r
490\r
491 //\r
492 // Get the registered handler information\r
493 //\r
494 Status = PeiGetExtractGuidedSectionHandlerInfo (&HandlerInfo);\r
495 if (EFI_ERROR (Status)) {\r
496 return Status;\r
497 }\r
498\r
499 //\r
500 // Search the match registered GetInfo handler for the input guided section.\r
501 //\r
502 ASSERT (HandlerInfo != NULL);\r
503 for (Index = 0; Index < HandlerInfo->NumberOfExtractHandler; Index ++) {\r
504 if (CompareGuid (HandlerInfo->ExtractHandlerGuidTable + Index, SectionGuid)) {\r
505\r
506 //\r
507 // If the guided handler has been registered before, then return the registered handlers.\r
508 //\r
509 if (GetInfoHandler != NULL) {\r
510 *GetInfoHandler = HandlerInfo->ExtractGetInfoHandlerTable[Index];\r
511 }\r
512 if (DecodeHandler != NULL) {\r
513 *DecodeHandler = HandlerInfo->ExtractDecodeHandlerTable[Index];\r
514 }\r
515 return RETURN_SUCCESS;\r
516 }\r
517 }\r
518 return RETURN_NOT_FOUND;\r
519}\r