#ifndef __DXE_SERVICES_LIB_H__\r
#define __DXE_SERVICES_LIB_H__\r
\r
+/**\r
+ Searches all the available firmware volumes and returns the first matching FFS section. \r
+\r
+ This function searches all the firmware volumes for FFS files with FV file type specified by FileType\r
+ The order that the firmware volumes is searched is not deterministic. For each available FV a search \r
+ is made for FFS file of type FileType. If the FV contains more than one FFS file with the same FileType, \r
+ the FileInstance instance will be the matched FFS file. For each FFS file found a search \r
+ is made for FFS sections of type SectionType. If the FFS file contains at least SectionInstance instances \r
+ of the FFS section specified by SectionType, then the SectionInstance instance is returned in Buffer. \r
+ Buffer is allocated using AllocatePool(), and the size of the allocated buffer is returned in Size. \r
+ It is the caller's responsibility to use FreePool() to free the allocated buffer. \r
+ See EFI_FIRMWARE_VOLUME2_PROTOCOL.ReadSection() for details on how sections \r
+ are retrieved from an FFS file based on SectionType and SectionInstance.\r
+\r
+ If SectionType is EFI_SECTION_TE, and the search with an FFS file fails, \r
+ the search will be retried with a section type of EFI_SECTION_PE32.\r
+ This function must be called with a TPL <= TPL_NOTIFY.\r
+\r
+ If Buffer is NULL, then ASSERT().\r
+ If Size is NULL, then ASSERT().\r
+\r
+ @param FileType Indicates the FV file type to search for within all available FVs.\r
+ @param FileInstance Indicates which file instance within all available FVs specified by FileType.\r
+ FileInstance starts from zero.\r
+ @param SectionType Indicates the FFS section type to search for within the FFS file \r
+ specified by FileType with FileInstance.\r
+ @param SectionInstance Indicates which section instance within the FFS file \r
+ specified by FileType with FileInstance to retrieve. SectionInstance starts from zero.\r
+ @param Buffer On output, a pointer to a callee allocated buffer containing the FFS file section that was found.\r
+ Is it the caller's responsibility to free this buffer using FreePool().\r
+ @param Size On output, a pointer to the size, in bytes, of Buffer.\r
+\r
+ @retval EFI_SUCCESS The specified FFS section was returned.\r
+ @retval EFI_NOT_FOUND The specified FFS section could not be found.\r
+ @retval EFI_OUT_OF_RESOURCES There are not enough resources available to retrieve the matching FFS section.\r
+ @retval EFI_DEVICE_ERROR The FFS section could not be retrieves due to a device error.\r
+ @retval EFI_ACCESS_DENIED The FFS section could not be retrieves because the firmware volume that \r
+ contains the matching FFS section does not allow reads.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+GetSectionFromAnyFvByFileType (\r
+ IN EFI_FV_FILETYPE FileType,\r
+ IN UINTN FileInstance,\r
+ IN EFI_SECTION_TYPE SectionType,\r
+ IN UINTN SectionInstance,\r
+ OUT VOID **Buffer,\r
+ OUT UINTN *Size\r
+ );\r
+\r
/**\r
Searches all the available firmware volumes and returns the first matching FFS section. \r
\r
return Status;\r
}\r
\r
+/**\r
+ Searches all the available firmware volumes and returns the first matching FFS section. \r
+\r
+ This function searches all the firmware volumes for FFS files with FV file type specified by FileType\r
+ The order that the firmware volumes is searched is not deterministic. For each available FV a search \r
+ is made for FFS file of type FileType. If the FV contains more than one FFS file with the same FileType, \r
+ the FileInstance instance will be the matched FFS file. For each FFS file found a search \r
+ is made for FFS sections of type SectionType. If the FFS file contains at least SectionInstance instances \r
+ of the FFS section specified by SectionType, then the SectionInstance instance is returned in Buffer. \r
+ Buffer is allocated using AllocatePool(), and the size of the allocated buffer is returned in Size. \r
+ It is the caller's responsibility to use FreePool() to free the allocated buffer. \r
+ See EFI_FIRMWARE_VOLUME2_PROTOCOL.ReadSection() for details on how sections \r
+ are retrieved from an FFS file based on SectionType and SectionInstance.\r
+\r
+ If SectionType is EFI_SECTION_TE, and the search with an FFS file fails, \r
+ the search will be retried with a section type of EFI_SECTION_PE32.\r
+ This function must be called with a TPL <= TPL_NOTIFY.\r
+\r
+ If Buffer is NULL, then ASSERT().\r
+ If Size is NULL, then ASSERT().\r
+\r
+ @param FileType Indicates the FV file type to search for within all available FVs.\r
+ @param FileInstance Indicates which file instance within all available FVs specified by FileType.\r
+ FileInstance starts from zero.\r
+ @param SectionType Indicates the FFS section type to search for within the FFS file \r
+ specified by FileType with FileInstance.\r
+ @param SectionInstance Indicates which section instance within the FFS file \r
+ specified by FileType with FileInstance to retrieve. SectionInstance starts from zero.\r
+ @param Buffer On output, a pointer to a callee allocated buffer containing the FFS file section that was found.\r
+ Is it the caller's responsibility to free this buffer using FreePool().\r
+ @param Size On output, a pointer to the size, in bytes, of Buffer.\r
+\r
+ @retval EFI_SUCCESS The specified FFS section was returned.\r
+ @retval EFI_NOT_FOUND The specified FFS section could not be found.\r
+ @retval EFI_OUT_OF_RESOURCES There are not enough resources available to retrieve the matching FFS section.\r
+ @retval EFI_DEVICE_ERROR The FFS section could not be retrieves due to a device error.\r
+ @retval EFI_ACCESS_DENIED The FFS section could not be retrieves because the firmware volume that \r
+ contains the matching FFS section does not allow reads.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+GetSectionFromAnyFvByFileType (\r
+ IN EFI_FV_FILETYPE FileType,\r
+ IN UINTN FileInstance,\r
+ IN EFI_SECTION_TYPE SectionType,\r
+ IN UINTN SectionInstance,\r
+ OUT VOID **Buffer,\r
+ OUT UINTN *Size\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_HANDLE *HandleBuffer;\r
+ UINTN HandleCount;\r
+ UINTN IndexFv;\r
+ UINTN IndexFile;\r
+ UINTN Key;\r
+ EFI_GUID NameGuid;\r
+ EFI_FV_FILE_ATTRIBUTES Attributes;\r
+ EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv;\r
+\r
+ //\r
+ // Locate all available FVs.\r
+ //\r
+ HandleBuffer = NULL;\r
+ Status = gBS->LocateHandleBuffer (\r
+ ByProtocol,\r
+ &gEfiFirmwareVolume2ProtocolGuid,\r
+ NULL,\r
+ &HandleCount,\r
+ &HandleBuffer\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+\r
+ //\r
+ // Go through FVs one by one to find the required section data.\r
+ //\r
+ for (IndexFv = 0; IndexFv < HandleCount; IndexFv++) {\r
+ Status = gBS->HandleProtocol (\r
+ HandleBuffer[IndexFv],\r
+ &gEfiFirmwareVolume2ProtocolGuid,\r
+ (VOID **)&Fv\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ continue;\r
+ }\r
\r
+ //\r
+ // Use Firmware Volume 2 Protocol to search for a file of type FileType in all FVs.\r
+ //\r
+ IndexFile = FileInstance + 1;\r
+ Key = 0;\r
+ do {\r
+ Status = Fv->GetNextFile (Fv, &Key, &FileType, &NameGuid, &Attributes, Size);\r
+ if (EFI_ERROR (Status)) {\r
+ break;\r
+ }\r
+ IndexFile --;\r
+ } while (IndexFile > 0);\r
+\r
+ //\r
+ // Fv File with the required FV file type is found.\r
+ // Search the section file in the found FV file.\r
+ //\r
+ if (IndexFile == 0) {\r
+ Status = InternalGetSectionFromFv (\r
+ HandleBuffer[IndexFv], \r
+ &NameGuid,\r
+ SectionType,\r
+ SectionInstance,\r
+ Buffer,\r
+ Size\r
+ );\r
+\r
+ if (!EFI_ERROR (Status)) {\r
+ goto Done;\r
+ }\r
+ }\r
+ }\r
+\r
+ //\r
+ // The required FFS section file is not found. \r
+ //\r
+ if (IndexFv == HandleCount) {\r
+ Status = EFI_NOT_FOUND;\r
+ }\r
+\r
+Done:\r
+ if (HandleBuffer != NULL) { \r
+ FreePool(HandleBuffer);\r
+ }\r
+\r
+ return Status;\r
+}\r
\r
/**\r
Searches all the availables firmware volumes and returns the first matching FFS section. \r