+ //\r
+ // Initialize GUID as zero value.\r
+ //\r
+ TempGuid = &gZeroGuid;\r
+ //\r
+ // Initialize it as "" string.\r
+ //\r
+ NameString[0] = 0;\r
+\r
+ if (Handle != NULL) {\r
+ //\r
+ // Try Handle as ImageHandle.\r
+ //\r
+ Status = gBS->HandleProtocol (\r
+ Handle,\r
+ &gEfiLoadedImageProtocolGuid,\r
+ (VOID**) &LoadedImage\r
+ );\r
+\r
+ if (EFI_ERROR (Status)) {\r
+ //\r
+ // Try Handle as Controller Handle\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
+ //\r
+ // Get Image protocol from ImageHandle\r
+ //\r
+ Status = gBS->HandleProtocol (\r
+ DriverBinding->ImageHandle,\r
+ &gEfiLoadedImageProtocolGuid,\r
+ (VOID**) &LoadedImage\r
+ );\r
+ }\r
+ }\r
+ }\r
+\r
+ if (!EFI_ERROR (Status) && LoadedImage != NULL) {\r
+ //\r
+ // Get Module Guid from DevicePath.\r
+ //\r
+ if (LoadedImage->FilePath != NULL &&\r
+ LoadedImage->FilePath->Type == MEDIA_DEVICE_PATH &&\r
+ LoadedImage->FilePath->SubType == MEDIA_PIWG_FW_FILE_DP\r
+ ) {\r
+ //\r
+ // Determine GUID associated with module logging performance\r
+ //\r
+ ModuleGuidIsGet = TRUE;\r
+ FvFilePath = (MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *) LoadedImage->FilePath;\r
+ TempGuid = &FvFilePath->FvFileName;\r
+ }\r
+\r
+ //\r
+ // Method 1 Get Module Name from PDB string.\r
+ //\r
+ PdbFileName = PeCoffLoaderGetPdbPointer (LoadedImage->ImageBase);\r
+ if (PdbFileName != NULL && BufferSize > 0) {\r
+ StartIndex = 0;\r
+ for (Index = 0; PdbFileName[Index] != 0; Index++) {\r
+ if ((PdbFileName[Index] == '\\') || (PdbFileName[Index] == '/')) {\r
+ StartIndex = Index + 1;\r
+ }\r
+ }\r
+ //\r
+ // Copy the PDB file name to our temporary string.\r
+ // If the length is bigger than BufferSize, trim the redudant characters to avoid overflow in array boundary.\r
+ //\r
+ for (Index = 0; Index < BufferSize - 1; Index++) {\r
+ NameString[Index] = PdbFileName[Index + StartIndex];\r
+ if (NameString[Index] == 0 || NameString[Index] == '.') {\r
+ NameString[Index] = 0;\r
+ break;\r
+ }\r
+ }\r
+\r
+ if (Index == BufferSize - 1) {\r
+ NameString[Index] = 0;\r
+ }\r
+ //\r
+ // Module Name is got.\r
+ //\r
+ goto Done;\r
+ }\r
+ }\r
+\r
+ if (ModuleGuidIsGet) {\r
+ //\r
+ // Method 2 Try to get the image's FFS UI section by image GUID\r
+ //\r
+ StringPtr = NULL;\r
+ StringSize = 0;\r
+ Status = GetSectionFromAnyFv (\r
+ TempGuid,\r
+ EFI_SECTION_USER_INTERFACE,\r
+ 0,\r
+ (VOID **) &StringPtr,\r
+ &StringSize\r
+ );\r
+\r
+ if (!EFI_ERROR (Status)) {\r
+ //\r
+ // Method 3. Get the name string from FFS UI section\r
+ //\r
+ for (Index = 0; Index < BufferSize - 1 && StringPtr[Index] != 0; Index++) {\r
+ NameString[Index] = (CHAR8) StringPtr[Index];\r
+ }\r
+ NameString[Index] = 0;\r
+ FreePool (StringPtr);\r
+ }\r
+ }\r
+\r
+Done:\r
+ //\r
+ // Copy Module Guid\r
+ //\r
+ if (ModuleGuid != NULL) {\r
+ CopyGuid (ModuleGuid, TempGuid);\r
+ if (IsZeroGuid(TempGuid) && (Handle != NULL) && !ModuleGuidIsGet) {\r
+ // Handle is GUID\r
+ CopyGuid (ModuleGuid, (EFI_GUID *) Handle);\r
+ }\r
+ }\r
+\r
+ //\r
+ // Cache the Handle and Guid pairs.\r
+ //\r
+ if (mCachePairCount < CACHE_HANDLE_GUID_COUNT) {\r
+ mCacheHandleGuidTable[mCachePairCount].Handle = Handle;\r
+ CopyGuid (&mCacheHandleGuidTable[mCachePairCount].ModuleGuid, ModuleGuid);\r
+ AsciiStrCpyS (mCacheHandleGuidTable[mCachePairCount].NameString, FPDT_STRING_EVENT_RECORD_NAME_LENGTH, NameString);\r
+ mCachePairCount ++;\r
+ }\r
+\r
+ return Status;\r
+}\r
+\r
+/**\r
+ Add performance log to FPDT boot record table.\r
+\r
+ @param IsStart TRUE if the performance log is start log.\r