+/**\r
+ Install LoadedImage protocol for SMM Core.\r
+**/\r
+VOID\r
+SmmCoreInstallLoadedImage (\r
+ VOID\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_HANDLE Handle;\r
+\r
+ //\r
+ // Allocate a Loaded Image Protocol in EfiBootServicesData\r
+ //\r
+ Status = gBS->AllocatePool (EfiBootServicesData, sizeof(EFI_LOADED_IMAGE_PROTOCOL), (VOID **)&mSmmCoreLoadedImage);\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ ZeroMem (mSmmCoreLoadedImage, sizeof (EFI_LOADED_IMAGE_PROTOCOL));\r
+ //\r
+ // Fill in the remaining fields of the Loaded Image Protocol instance.\r
+ // Note: ImageBase is an SMRAM address that can not be accessed outside of SMRAM if SMRAM window is closed.\r
+ //\r
+ mSmmCoreLoadedImage->Revision = EFI_LOADED_IMAGE_PROTOCOL_REVISION;\r
+ mSmmCoreLoadedImage->ParentHandle = gSmmCorePrivate->SmmIplImageHandle;\r
+ mSmmCoreLoadedImage->SystemTable = gST;\r
+\r
+ mSmmCoreLoadedImage->ImageBase = (VOID *)(UINTN)gSmmCorePrivate->PiSmmCoreImageBase;\r
+ mSmmCoreLoadedImage->ImageSize = gSmmCorePrivate->PiSmmCoreImageSize;\r
+ mSmmCoreLoadedImage->ImageCodeType = EfiRuntimeServicesCode;\r
+ mSmmCoreLoadedImage->ImageDataType = EfiRuntimeServicesData;\r
+\r
+ //\r
+ // Create a new image handle in the UEFI handle database for the SMM Driver\r
+ //\r
+ Handle = NULL;\r
+ Status = gBS->InstallMultipleProtocolInterfaces (\r
+ &Handle,\r
+ &gEfiLoadedImageProtocolGuid, mSmmCoreLoadedImage,\r
+ NULL\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ //\r
+ // Allocate a Loaded Image Protocol in SMM\r
+ //\r
+ Status = SmmAllocatePool (EfiRuntimeServicesData, sizeof(EFI_SMM_DRIVER_ENTRY), (VOID **)&mSmmCoreDriverEntry);\r
+ ASSERT_EFI_ERROR(Status);\r
+\r
+ ZeroMem (mSmmCoreDriverEntry, sizeof(EFI_SMM_DRIVER_ENTRY));\r
+ //\r
+ // Fill in the remaining fields of the Loaded Image Protocol instance.\r
+ //\r
+ mSmmCoreDriverEntry->Signature = EFI_SMM_DRIVER_ENTRY_SIGNATURE;\r
+ mSmmCoreDriverEntry->SmmLoadedImage.Revision = EFI_LOADED_IMAGE_PROTOCOL_REVISION;\r
+ mSmmCoreDriverEntry->SmmLoadedImage.ParentHandle = gSmmCorePrivate->SmmIplImageHandle;\r
+ mSmmCoreDriverEntry->SmmLoadedImage.SystemTable = gST;\r
+\r
+ mSmmCoreDriverEntry->SmmLoadedImage.ImageBase = (VOID *)(UINTN)gSmmCorePrivate->PiSmmCoreImageBase;\r
+ mSmmCoreDriverEntry->SmmLoadedImage.ImageSize = gSmmCorePrivate->PiSmmCoreImageSize;\r
+ mSmmCoreDriverEntry->SmmLoadedImage.ImageCodeType = EfiRuntimeServicesCode;\r
+ mSmmCoreDriverEntry->SmmLoadedImage.ImageDataType = EfiRuntimeServicesData;\r
+\r
+ mSmmCoreDriverEntry->ImageEntryPoint = gSmmCorePrivate->PiSmmCoreEntryPoint;\r
+ mSmmCoreDriverEntry->ImageBuffer = gSmmCorePrivate->PiSmmCoreImageBase;\r
+ mSmmCoreDriverEntry->NumberOfPage = EFI_SIZE_TO_PAGES((UINTN)gSmmCorePrivate->PiSmmCoreImageSize);\r
+\r
+ //\r
+ // Create a new image handle in the SMM handle database for the SMM Driver\r
+ //\r
+ mSmmCoreDriverEntry->SmmImageHandle = NULL;\r
+ Status = SmmInstallProtocolInterface (\r
+ &mSmmCoreDriverEntry->SmmImageHandle,\r
+ &gEfiLoadedImageProtocolGuid,\r
+ EFI_NATIVE_INTERFACE,\r
+ &mSmmCoreDriverEntry->SmmLoadedImage\r
+ );\r
+ ASSERT_EFI_ERROR(Status);\r
+\r
+ return ;\r
+}\r
+\r