+\r
+ //\r
+ // The parameter "Image" of FmpDeviceGetImage() is extended to contain the dependency.\r
+ // Get the Fmp Payload from the Image.\r
+ //\r
+ ImageBufferSize = Size;\r
+ ImageBuffer = AllocatePool (ImageBufferSize);\r
+ if (ImageBuffer == NULL) {\r
+ DEBUG ((DEBUG_ERROR, "FmpDxe(%s): GetImage() - AllocatePool fails.\n", mImageIdName));\r
+ Status = EFI_NOT_FOUND;\r
+ goto cleanup;\r
+ }\r
+ Status = FmpDeviceGetImage (ImageBuffer, &ImageBufferSize);\r
+ if (Status == EFI_BUFFER_TOO_SMALL) {\r
+ FreePool (ImageBuffer);\r
+ ImageBuffer = AllocatePool (ImageBufferSize);\r
+ if (ImageBuffer == NULL) {\r
+ DEBUG ((DEBUG_ERROR, "FmpDxe(%s): GetImage() - AllocatePool fails.\n", mImageIdName));\r
+ Status = EFI_NOT_FOUND;\r
+ goto cleanup;\r
+ }\r
+ Status = FmpDeviceGetImage (ImageBuffer, &ImageBufferSize);\r
+ }\r
+ if (EFI_ERROR (Status)) {\r
+ goto cleanup;\r
+ }\r
+\r
+ //\r
+ // Check the attribute IMAGE_ATTRIBUTE_DEPENDENCY\r
+ //\r
+ if (Private->Descriptor.AttributesSetting & IMAGE_ATTRIBUTE_DEPENDENCY) {\r
+ //\r
+ // Validate the dependency to get its size.\r
+ //\r
+ ValidateImageDepex ((EFI_FIRMWARE_IMAGE_DEP *) ImageBuffer, ImageBufferSize, &DepexSize);\r
+ }\r
+\r
+ if (*ImageSize < ImageBufferSize - DepexSize) {\r
+ *ImageSize = ImageBufferSize - DepexSize;\r