+ @retval EFI_SUCCESS Sucessfully locate the measure boot protocol instances (at least one instance).\r
+ @retval EFI_UNSUPPORTED Measure boot is not supported.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+GetMeasureBootProtocols (\r
+ MEASURE_BOOT_PROTOCOLS *MeasureBootProtocols\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_TCG2_PROTOCOL *Tcg2Protocol;\r
+ EFI_CC_MEASUREMENT_PROTOCOL *CcProtocol;\r
+ EFI_TCG2_BOOT_SERVICE_CAPABILITY Tcg2ProtocolCapability;\r
+ EFI_CC_BOOT_SERVICE_CAPABILITY CcProtocolCapability;\r
+\r
+ CcProtocol = NULL;\r
+ Status = gBS->LocateProtocol (&gEfiCcMeasurementProtocolGuid, NULL, (VOID **)&CcProtocol);\r
+ if (EFI_ERROR (Status)) {\r
+ //\r
+ // Cc Measurement protocol is not installed.\r
+ //\r
+ DEBUG ((DEBUG_VERBOSE, "CcMeasurementProtocol is not installed. - %r\n", Status));\r
+ } else {\r
+ ZeroMem (&CcProtocolCapability, sizeof (CcProtocolCapability));\r
+ CcProtocolCapability.Size = sizeof (CcProtocolCapability);\r
+ Status = CcProtocol->GetCapability (CcProtocol, &CcProtocolCapability);\r
+ if (EFI_ERROR (Status) || (CcProtocolCapability.CcType.Type == EFI_CC_TYPE_NONE)) {\r
+ DEBUG ((DEBUG_ERROR, " CcProtocol->GetCapability returns : %x, %r\n", CcProtocolCapability.CcType.Type, Status));\r
+ CcProtocol = NULL;\r
+ }\r
+ }\r
+\r
+ Tcg2Protocol = NULL;\r
+ Status = gBS->LocateProtocol (&gEfiTcg2ProtocolGuid, NULL, (VOID **)&Tcg2Protocol);\r
+ if (EFI_ERROR (Status)) {\r
+ //\r
+ // Tcg2 protocol is not installed. So, TPM2 is not present.\r
+ //\r
+ DEBUG ((DEBUG_VERBOSE, "Tcg2Protocol is not installed. - %r\n", Status));\r
+ } else {\r
+ Tcg2ProtocolCapability.Size = (UINT8)sizeof (Tcg2ProtocolCapability);\r
+ Status = Tcg2Protocol->GetCapability (Tcg2Protocol, &Tcg2ProtocolCapability);\r
+ if (EFI_ERROR (Status) || (!Tcg2ProtocolCapability.TPMPresentFlag)) {\r
+ //\r
+ // TPM device doesn't work or activate.\r
+ //\r
+ DEBUG ((DEBUG_ERROR, "TPMPresentFlag=FALSE %r\n", Status));\r
+ Tcg2Protocol = NULL;\r
+ }\r
+ }\r
+\r
+ MeasureBootProtocols->Tcg2Protocol = Tcg2Protocol;\r
+ MeasureBootProtocols->CcProtocol = CcProtocol;\r
+\r
+ return (Tcg2Protocol == NULL && CcProtocol == NULL) ? EFI_UNSUPPORTED : EFI_SUCCESS;\r
+}\r