+/**\r
+ Get image name from Image Handle.\r
+\r
+ @param[in] Handle Image Handle\r
+\r
+ @return A pointer to the image name as a string.\r
+**/\r
+CHAR16 *\r
+GetImageNameFromHandle (\r
+ IN CONST EFI_HANDLE Handle\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_DRIVER_BINDING_PROTOCOL *DriverBinding;\r
+ EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;\r
+ EFI_DEVICE_PATH_PROTOCOL *DevPathNode;\r
+ EFI_GUID *NameGuid;\r
+ CHAR16 *ImageName;\r
+ UINTN BufferSize;\r
+ UINT32 AuthenticationStatus;\r
+ EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv2;\r
+\r
+ LoadedImage = NULL;\r
+ DriverBinding = NULL;\r
+ ImageName = NULL;\r
+\r
+ Status = gBS->OpenProtocol (\r
+ Handle,\r
+ &gEfiDriverBindingProtocolGuid,\r
+ (VOID **) &DriverBinding,\r
+ NULL,\r
+ NULL,\r
+ EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ return NULL;\r
+ }\r
+ Status = gBS->OpenProtocol (\r
+ DriverBinding->ImageHandle,\r
+ &gEfiLoadedImageProtocolGuid,\r
+ (VOID**)&LoadedImage,\r
+ gImageHandle,\r
+ NULL,\r
+ EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
+ );\r
+ if (!EFI_ERROR (Status)) {\r
+ DevPathNode = LoadedImage->FilePath;\r
+ if (DevPathNode == NULL) {\r
+ return NULL;\r
+ }\r
+ while (!IsDevicePathEnd (DevPathNode)) {\r
+ NameGuid = EfiGetNameGuidFromFwVolDevicePathNode ((MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *)DevPathNode);\r
+ if (NameGuid != NULL) {\r
+ Status = gBS->HandleProtocol (\r
+ LoadedImage->DeviceHandle,\r
+ &gEfiFirmwareVolume2ProtocolGuid,\r
+ &Fv2\r
+ );\r
+ if (!EFI_ERROR (Status)) {\r
+ Status = Fv2->ReadSection (\r
+ Fv2,\r
+ NameGuid,\r
+ EFI_SECTION_USER_INTERFACE,\r
+ 0,\r
+ (VOID **)&ImageName,\r
+ &BufferSize,\r
+ &AuthenticationStatus\r
+ );\r
+ if (!EFI_ERROR (Status)) {\r
+ break;\r
+ }\r
+ ImageName = NULL;\r
+ }\r
+ }\r
+ //\r
+ // Next device path node\r
+ //\r
+ DevPathNode = NextDevicePathNode (DevPathNode);\r
+ }\r
+ if (ImageName == NULL) {\r
+ ImageName = ConvertDevicePathToText (LoadedImage->FilePath, TRUE, TRUE);\r
+ }\r
+ }\r
+ return ImageName;\r
+}\r
+\r