--- /dev/null
+/** @file\r
+ HII Library implementation that uses DXE protocols and services.\r
+\r
+ Copyright (c) 2006, Intel Corporation<BR>\r
+ All rights reserved. This program and the accompanying materials\r
+ are licensed and made available under the terms and conditions of the BSD License\r
+ which accompanies this distribution. The full text of the license may be found at\r
+ http://opensource.org/licenses/bsd-license.php\r
+\r
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+ Module Name: HiiLib.c\r
+\r
+**/\r
+\r
+\r
+#include <FrameworkDxe.h>\r
+\r
+\r
+#include <Protocol/FrameworkHii.h>\r
+\r
+#include <Library/HiiLib.h>\r
+#include <Library/DebugLib.h>\r
+#include <Library/UefiBootServicesTableLib.h>\r
+#include <Library/MemoryAllocationLib.h>\r
+\r
+EFI_HII_PROTOCOL *gHiiProtocol = NULL;\r
+\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+HiiLibFrameworkConstructor (\r
+ IN EFI_HANDLE ImageHandle,\r
+ IN EFI_SYSTEM_TABLE *SystemTable\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+\r
+ Status = gBS->LocateProtocol (\r
+ &gEfiHiiProtocolGuid,\r
+ NULL,\r
+ &gHiiProtocol\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ return Status;\r
+ \r
+}\r
+\r
+/**\r
+ This function allocates pool for an EFI_HII_PACKAGES structure\r
+ with enough space for the variable argument list of package pointers.\r
+ The allocated structure is initialized using NumberOfPackages, Guid,\r
+ and the variable length argument list of package pointers.\r
+\r
+ @param NumberOfPackages The number of HII packages to prepare.\r
+ @param Guid Package GUID.\r
+\r
+ @return The allocated and initialized packages.\r
+\r
+**/\r
+EFI_HII_PACKAGES *\r
+InternalPreparePackages (\r
+ IN UINTN NumberOfPackages,\r
+ IN CONST EFI_GUID *Guid OPTIONAL,\r
+ IN VA_LIST Args\r
+ )\r
+{\r
+ EFI_HII_PACKAGES *HiiPackages;\r
+ VOID **Package;\r
+ UINTN Index;\r
+\r
+ ASSERT (NumberOfPackages > 0);\r
+\r
+ HiiPackages = AllocateZeroPool (sizeof (EFI_HII_PACKAGES) + NumberOfPackages * sizeof (VOID *));\r
+ ASSERT (HiiPackages != NULL);\r
+\r
+ HiiPackages->GuidId = (EFI_GUID *) Guid;\r
+ HiiPackages->NumberOfPackages = NumberOfPackages;\r
+ Package = (VOID **) (((UINT8 *) HiiPackages) + sizeof (EFI_HII_PACKAGES));\r
+\r
+ for (Index = 0; Index < NumberOfPackages; Index++) {\r
+ *Package = VA_ARG (Args, VOID *);\r
+ Package++;\r
+ }\r
+\r
+ return HiiPackages;\r
+\r
+}\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+PrepareAndCreateNewPackages (\r
+ IN UINTN NumberOfPackages,\r
+ IN CONST EFI_GUID *GuidId,\r
+ OUT VOID **HiiHandle, //Framework is FRAMEWORK_HII_HANDLE; UEFI is EFI_HII_HANDLE; \r
+ // C:\D\Work\Tiano\Tiano_Main_Trunk\TIANO\Platform\IntelEpg\SR870BN4\MemorySubClassDriver\DualChannelDdr\MemorySubClass.c make use of this output value\r
+ ...\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_HII_PACKAGES *PackageList;\r
+ VA_LIST Args;\r
+ FRAMEWORK_EFI_HII_HANDLE FrameworkHiiHandle;\r
+\r
+ \r
+ VA_START (Args, HiiHandle);\r
+ PackageList = InternalPreparePackages (NumberOfPackages, GuidId, Args);\r
+ VA_END (Args);\r
+ \r
+ Status = gHiiProtocol->NewPack (gHiiProtocol, PackageList, &FrameworkHiiHandle);\r
+ *HiiHandle = (VOID *) (UINTN) FrameworkHiiHandle;\r
+\r
+ return Status;\r
+}\r
+\r
+\r