+EFI_SMM_COMMUNICATION_PROTOCOL *mLockBoxSmmCommProtocol = NULL;\r
+UINT8 *mLockBoxSmmCommBuffer = NULL;\r
+\r
+/**\r
+ Get smm communication protocol for lockbox.\r
+\r
+ @return Pointer to smm communication protocol, NULL if not found.\r
+\r
+**/\r
+EFI_SMM_COMMUNICATION_PROTOCOL *\r
+LockBoxGetSmmCommProtocol (\r
+ VOID\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+\r
+ //\r
+ // If the protocol has been got previously, return it.\r
+ //\r
+ if (mLockBoxSmmCommProtocol != NULL) {\r
+ return mLockBoxSmmCommProtocol;\r
+ }\r
+\r
+ Status = gBS->LocateProtocol (\r
+ &gEfiSmmCommunicationProtocolGuid,\r
+ NULL,\r
+ (VOID **)&mLockBoxSmmCommProtocol\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ mLockBoxSmmCommProtocol = NULL;\r
+ }\r
+ return mLockBoxSmmCommProtocol;\r
+}\r
+\r
+/**\r
+ Get smm communication buffer for lockbox.\r
+\r
+ @return Pointer to smm communication buffer, NULL if not found.\r
+\r
+**/\r
+UINT8 *\r
+LockBoxGetSmmCommBuffer (\r
+ VOID\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ UINTN MinimalSizeNeeded;\r
+ EDKII_PI_SMM_COMMUNICATION_REGION_TABLE *PiSmmCommunicationRegionTable;\r
+ UINT32 Index;\r
+ EFI_MEMORY_DESCRIPTOR *Entry;\r
+ UINTN Size;\r
+\r
+ //\r
+ // If the buffer has been got previously, return it.\r
+ //\r
+ if (mLockBoxSmmCommBuffer != NULL) {\r
+ return mLockBoxSmmCommBuffer;\r
+ }\r
+\r
+ MinimalSizeNeeded = sizeof (EFI_GUID) +\r
+ sizeof (UINTN) +\r
+ MAX (sizeof (EFI_SMM_LOCK_BOX_PARAMETER_SAVE),\r
+ MAX (sizeof (EFI_SMM_LOCK_BOX_PARAMETER_SET_ATTRIBUTES),\r
+ MAX (sizeof (EFI_SMM_LOCK_BOX_PARAMETER_UPDATE),\r
+ MAX (sizeof (EFI_SMM_LOCK_BOX_PARAMETER_RESTORE),\r
+ sizeof (EFI_SMM_LOCK_BOX_PARAMETER_RESTORE_ALL_IN_PLACE)))));\r
+\r
+ Status = EfiGetSystemConfigurationTable (\r
+ &gEdkiiPiSmmCommunicationRegionTableGuid,\r
+ (VOID **) &PiSmmCommunicationRegionTable\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ mLockBoxSmmCommBuffer = NULL;\r
+ return mLockBoxSmmCommBuffer;\r
+ }\r
+ ASSERT (PiSmmCommunicationRegionTable != NULL);\r
+ Entry = (EFI_MEMORY_DESCRIPTOR *) (PiSmmCommunicationRegionTable + 1);\r
+ Size = 0;\r
+ for (Index = 0; Index < PiSmmCommunicationRegionTable->NumberOfEntries; Index++) {\r
+ if (Entry->Type == EfiConventionalMemory) {\r
+ Size = EFI_PAGES_TO_SIZE ((UINTN) Entry->NumberOfPages);\r
+ if (Size >= MinimalSizeNeeded) {\r
+ break;\r
+ }\r
+ }\r
+ Entry = (EFI_MEMORY_DESCRIPTOR *) ((UINT8 *) Entry + PiSmmCommunicationRegionTable->DescriptorSize);\r
+ }\r
+ if (Index >= PiSmmCommunicationRegionTable->NumberOfEntries) {\r
+ mLockBoxSmmCommBuffer = NULL;\r
+ } else {\r
+ mLockBoxSmmCommBuffer = (UINT8 *) (UINTN) Entry->PhysicalStart;\r
+ }\r
+ return mLockBoxSmmCommBuffer;\r
+}\r
+\r