From 8472f1f59d63f3fc5df3c9ae52ffb26c7bb757a6 Mon Sep 17 00:00:00 2001 From: lzeng14 Date: Thu, 8 Nov 2012 01:12:56 +0000 Subject: Build the registered guid HOB and SystemTable to record the GUID itself in PeiExtractGuidedSectionLib and DxeExtractGuidedSectionLib, and also state the restriction in BaseExtractGuidedSectionLib. Signed-off-by: Star Zeng Reviewed-by: Michael Kinney git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13930 6f19259b-4bc3-4df7-8a09-765794883524 --- .../SectionExtractionDxe/SectionExtraction.c | 57 ++++++++++++++++++++-- .../SectionExtractionDxe/SectionExtractionDxe.inf | 3 +- 2 files changed, 54 insertions(+), 6 deletions(-) (limited to 'IntelFrameworkModulePkg/Universal/SectionExtractionDxe') diff --git a/IntelFrameworkModulePkg/Universal/SectionExtractionDxe/SectionExtraction.c b/IntelFrameworkModulePkg/Universal/SectionExtractionDxe/SectionExtraction.c index 86bf2be632..dfe3070268 100644 --- a/IntelFrameworkModulePkg/Universal/SectionExtractionDxe/SectionExtraction.c +++ b/IntelFrameworkModulePkg/Universal/SectionExtractionDxe/SectionExtraction.c @@ -45,6 +45,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #include #include #include +#include #include #include #include @@ -539,6 +540,53 @@ CreateProtocolNotifyEvent ( return Event; } +/** + Verify the Guided Section GUID by checking if there is the Guided Section GUID configuration table recorded the GUID itself. + + @param GuidedSectionGuid The Guided Section GUID. + @param GuidedSectionExtraction A pointer to the pointer to the supported Guided Section Extraction Protocol + for the Guided Section. + + @return TRUE The GuidedSectionGuid could be identified, and the pointer to + the Guided Section Extraction Protocol will be returned to *GuidedSectionExtraction. + @return FALSE The GuidedSectionGuid could not be identified, or + the Guided Section Extraction Protocol has not been installed yet. + +**/ +BOOLEAN +VerifyGuidedSectionGuid ( + IN EFI_GUID *GuidedSectionGuid, + OUT EFI_GUIDED_SECTION_EXTRACTION_PROTOCOL **GuidedSectionExtraction + ) +{ + EFI_GUID *GuidRecorded; + VOID *Interface; + EFI_STATUS Status; + + // + // Check if there is the Guided Section GUID configuration table recorded the GUID itself. + // + Status = EfiGetSystemConfigurationTable (GuidedSectionGuid, (VOID **) &GuidRecorded); + if (Status == EFI_SUCCESS) { + if (CompareGuid (GuidRecorded, GuidedSectionGuid)) { + // + // Found the recorded GuidedSectionGuid. + // + Status = gBS->LocateProtocol (GuidedSectionGuid, NULL, (VOID **) &Interface); + if (!EFI_ERROR (Status) && Interface != NULL) { + // + // Found the supported Guided Section Extraction Porotocol for the Guided Section. + // + *GuidedSectionExtraction = (EFI_GUIDED_SECTION_EXTRACTION_PROTOCOL *) Interface; + return TRUE; + } + return FALSE; + } + } + + return FALSE; +} + /** RPN callback function. 1. Initialize the section stream when the GUIDED_SECTION_EXTRACTION_PROTOCOL is installed. @@ -579,10 +627,10 @@ NotifyGuidedExtraction ( (Context->ParentStream->StreamBuffer + Context->ChildNode->OffsetInStream); ASSERT (GuidedHeader->CommonHeader.Type == EFI_SECTION_GUID_DEFINED); - Status = gBS->LocateProtocol (Context->ChildNode->EncapsulationGuid, NULL, (VOID **)&GuidedExtraction); - ASSERT_EFI_ERROR (Status); + if (!VerifyGuidedSectionGuid (Context->ChildNode->EncapsulationGuid, &GuidedExtraction)) { + return; + } - Status = GuidedExtraction->ExtractSection ( GuidedExtraction, GuidedHeader, @@ -842,8 +890,7 @@ CreateChildNode ( Node->EncapsulationGuid = &GuidedHeader->SectionDefinitionGuid; GuidedSectionAttributes = GuidedHeader->Attributes; } - Status = gBS->LocateProtocol (Node->EncapsulationGuid, NULL, (VOID **)&GuidedExtraction); - if (!EFI_ERROR (Status)) { + if (VerifyGuidedSectionGuid (Node->EncapsulationGuid, &GuidedExtraction)) { // // NewStreamBuffer is always allocated by ExtractSection... No caller // allocation here. diff --git a/IntelFrameworkModulePkg/Universal/SectionExtractionDxe/SectionExtractionDxe.inf b/IntelFrameworkModulePkg/Universal/SectionExtractionDxe/SectionExtractionDxe.inf index 487f4a2846..5353149ebe 100644 --- a/IntelFrameworkModulePkg/Universal/SectionExtractionDxe/SectionExtractionDxe.inf +++ b/IntelFrameworkModulePkg/Universal/SectionExtractionDxe/SectionExtractionDxe.inf @@ -6,7 +6,7 @@ # where each stream contains a linked list of children, which may be leaves or # encapsulations. Encapsulation section will further generate new section stream entries. # -# Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.
+# Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.
# This program and the accompanying materials # are licensed and made available under the terms and conditions of the BSD License # which accompanies this distribution. The full text of the license may be found at @@ -40,6 +40,7 @@ BaseLib BaseMemoryLib UefiDriverEntryPoint + UefiLib [Packages] MdePkg/MdePkg.dec -- cgit v1.2.3