}\r
}\r
\r
+/**\r
+ Verify the Guided Section GUID by checking if there is the Guided Section GUID configuration table recorded the GUID itself.\r
+\r
+ @param GuidedSectionGuid The Guided Section GUID.\r
+ @param GuidedSectionExtraction A pointer to the pointer to the supported Guided Section Extraction Protocol\r
+ for the Guided Section.\r
+\r
+ @return TRUE The GuidedSectionGuid could be identified, and the pointer to\r
+ the Guided Section Extraction Protocol will be returned to *GuidedSectionExtraction.\r
+ @return FALSE The GuidedSectionGuid could not be identified, or \r
+ the Guided Section Extraction Protocol has not been installed yet.\r
+\r
+**/\r
+BOOLEAN\r
+VerifyGuidedSectionGuid (\r
+ IN EFI_GUID *GuidedSectionGuid,\r
+ OUT EFI_GUIDED_SECTION_EXTRACTION_PROTOCOL **GuidedSectionExtraction\r
+ )\r
+{\r
+ EFI_GUID *GuidRecorded;\r
+ VOID *Interface;\r
+ EFI_STATUS Status;\r
+\r
+ //\r
+ // Check if there is the Guided Section GUID configuration table recorded the GUID itself.\r
+ //\r
+ Status = EfiGetSystemConfigurationTable (GuidedSectionGuid, (VOID **) &GuidRecorded);\r
+ if (Status == EFI_SUCCESS) {\r
+ if (CompareGuid (GuidRecorded, GuidedSectionGuid)) {\r
+ //\r
+ // Found the recorded GuidedSectionGuid.\r
+ //\r
+ Status = CoreLocateProtocol (GuidedSectionGuid, NULL, (VOID **) &Interface);\r
+ if (!EFI_ERROR (Status) && Interface != NULL) {\r
+ //\r
+ // Found the supported Guided Section Extraction Porotocol for the Guided Section.\r
+ //\r
+ *GuidedSectionExtraction = (EFI_GUIDED_SECTION_EXTRACTION_PROTOCOL *) Interface;\r
+ return TRUE;\r
+ }\r
+ return FALSE;\r
+ }\r
+ }\r
+\r
+ return FALSE;\r
+}\r
+\r
/**\r
RPN callback function. Initializes the section stream\r
when GUIDED_SECTION_EXTRACTION_PROTOCOL is installed.\r
\r
GuidedHeader = (EFI_GUID_DEFINED_SECTION *) (Context->ParentStream->StreamBuffer + Context->ChildNode->OffsetInStream);\r
ASSERT (GuidedHeader->CommonHeader.Type == EFI_SECTION_GUID_DEFINED);\r
- \r
- Status = gBS->LocateProtocol (Context->ChildNode->EncapsulationGuid, NULL, (VOID **)&GuidedExtraction);\r
- if (EFI_ERROR (Status)) {\r
+\r
+ if (!VerifyGuidedSectionGuid (Context->ChildNode->EncapsulationGuid, &GuidedExtraction)) {\r
return;\r
}\r
- \r
+\r
Status = GuidedExtraction->ExtractSection (\r
GuidedExtraction,\r
GuidedHeader,\r
Node->EncapsulationGuid = &GuidedHeader->SectionDefinitionGuid;\r
GuidedSectionAttributes = GuidedHeader->Attributes;\r
}\r
- Status = CoreLocateProtocol (Node->EncapsulationGuid, NULL, (VOID **)&GuidedExtraction);\r
- if (!EFI_ERROR (Status) && GuidedExtraction != NULL) {\r
+ if (VerifyGuidedSectionGuid (Node->EncapsulationGuid, &GuidedExtraction)) {\r
//\r
// NewStreamBuffer is always allocated by ExtractSection... No caller\r
// allocation here.\r