Split the device manager library from UiApp in MdeModulePkg/Application
and put the library in MdeModulePkg/Library.

Cc: Liming Gao <liming....@intel.com>
Cc: Eric Dong <eric.d...@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Dandan Bi <dandan...@intel.com>
Reviewed-by: Eric Dong <eric.d...@intel.com>
Reviewed-by: Liming Gao <liming....@intel.com>
---
 .../Library/DeviceManagerLib/DeviceManager.c       | 925 +++++++++++++++++++++
 .../Library/DeviceManagerLib/DeviceManager.h       | 194 +++++
 .../Library/DeviceManagerLib/DeviceManagerLib.inf  |  57 ++
 .../DeviceManagerLib/DeviceManagerStrings.uni      | Bin 0 -> 7804 bytes
 .../Library/DeviceManagerLib/DeviceManagerVfr.Vfr  |  66 ++
 5 files changed, 1242 insertions(+)
 create mode 100644 MdeModulePkg/Library/DeviceManagerLib/DeviceManager.c
 create mode 100644 MdeModulePkg/Library/DeviceManagerLib/DeviceManager.h
 create mode 100644 MdeModulePkg/Library/DeviceManagerLib/DeviceManagerLib.inf
 create mode 100644 
MdeModulePkg/Library/DeviceManagerLib/DeviceManagerStrings.uni
 create mode 100644 MdeModulePkg/Library/DeviceManagerLib/DeviceManagerVfr.Vfr

diff --git a/MdeModulePkg/Library/DeviceManagerLib/DeviceManager.c 
b/MdeModulePkg/Library/DeviceManagerLib/DeviceManager.c
new file mode 100644
index 0000000..ba3f631
--- /dev/null
+++ b/MdeModulePkg/Library/DeviceManagerLib/DeviceManager.c
@@ -0,0 +1,925 @@
+/** @file
+The device manager reference implementation
+
+Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR>
+This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD 
License
+which accompanies this distribution.  The full text of the license may be 
found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#include "DeviceManager.h"
+
+DEVICE_MANAGER_CALLBACK_DATA  gDeviceManagerPrivate = {
+  DEVICE_MANAGER_CALLBACK_DATA_SIGNATURE,
+  NULL,
+  NULL,
+  {
+    DeviceManagerExtractConfig,
+    DeviceManagerRouteConfig,
+    DeviceManagerCallback
+  }
+};
+
+#define  MAX_MAC_ADDRESS_NODE_LIST_LEN    10
+
+EFI_GUID mDeviceManagerGuid = DEVICE_MANAGER_FORMSET_GUID;
+
+//
+// Which Mac Address string is select
+// it will decide what menu need to show in the NETWORK_DEVICE_FORM_ID form.
+//
+EFI_STRING  mSelectedMacAddrString;
+
+//
+// The Mac Address show in the NETWORK_DEVICE_LIST_FORM_ID
+//
+MAC_ADDRESS_NODE_LIST  mMacDeviceList;
+
+HII_VENDOR_DEVICE_PATH  mDeviceManagerHiiVendorDevicePath = {
+  {
+    {
+      HARDWARE_DEVICE_PATH,
+      HW_VENDOR_DP,
+      {
+        (UINT8) (sizeof (VENDOR_DEVICE_PATH)),
+        (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)
+      }
+    },
+    //
+    // {102579A0-3686-466e-ACD8-80C087044F4A}
+    //
+    { 0x102579a0, 0x3686, 0x466e, { 0xac, 0xd8, 0x80, 0xc0, 0x87, 0x4, 0x4f, 
0x4a } }
+  },
+  {
+    END_DEVICE_PATH_TYPE,
+    END_ENTIRE_DEVICE_PATH_SUBTYPE,
+    { 
+      (UINT8) (END_DEVICE_PATH_LENGTH),
+      (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)
+    }
+  }
+};
+
+/**
+  Extract device path for given HII handle and class guid.
+
+  @param Handle          The HII handle.
+
+  @retval  NULL          Fail to get the device path string.
+  @return  PathString    Get the device path string.
+
+**/
+CHAR16 *
+DmExtractDevicePathFromHiiHandle (
+  IN      EFI_HII_HANDLE      Handle
+  )
+{
+  EFI_STATUS                       Status;
+  EFI_HANDLE                       DriverHandle;
+
+  ASSERT (Handle != NULL);
+
+  if (Handle == NULL) {
+    return NULL;
+  }
+
+  Status = gHiiDatabase->GetPackageListHandle (gHiiDatabase, Handle, 
&DriverHandle);
+  if (EFI_ERROR (Status)) {
+    return NULL;
+  }
+  //
+  // Get device path string.
+  //
+  return ConvertDevicePathToText(DevicePathFromHandle (DriverHandle), FALSE, 
FALSE);
+}
+
+/**
+  Get the mac address string from the device path.
+  if the device path has the vlan, get the vanid also.
+  
+  @param MacAddressNode              Device path begin with mac address 
+  @param PBuffer                     Output string buffer contain mac address.
+
+**/
+BOOLEAN 
+GetMacAddressString(
+  IN  MAC_ADDR_DEVICE_PATH   *MacAddressNode,
+  OUT CHAR16                 **PBuffer
+  )
+{
+  UINTN                 HwAddressSize;
+  UINTN                 Index;
+  UINT8                 *HwAddress;
+  EFI_DEVICE_PATH_PROTOCOL  *Node;
+  UINT16                VlanId;
+  CHAR16                *String;
+  UINTN                 BufferLen;
+
+  VlanId = 0;
+  String = NULL;
+  ASSERT(MacAddressNode != NULL);
+
+  HwAddressSize = sizeof (EFI_MAC_ADDRESS);
+  if (MacAddressNode->IfType == 0x01 || MacAddressNode->IfType == 0x00) {
+    HwAddressSize = 6;
+  }
+
+  //
+  // The output format is MAC:XX:XX:XX:...\XXXX
+  // The size is the Number size + ":" size + Vlan size(\XXXX) + End
+  //
+  BufferLen = (4 + 2 * HwAddressSize + (HwAddressSize - 1) + 5 + 1) * sizeof 
(CHAR16);
+  String = AllocateZeroPool (BufferLen);
+  if (String == NULL) {
+    return FALSE;
+  }
+
+  *PBuffer = String;
+  StrCpyS(String, BufferLen / sizeof (CHAR16), L"MAC:");
+  String += 4;
+  
+  //
+  // Convert the MAC address into a unicode string.
+  //
+  HwAddress = &MacAddressNode->MacAddress.Addr[0];
+  for (Index = 0; Index < HwAddressSize; Index++) {
+    String += UnicodeValueToString (String, PREFIX_ZERO | RADIX_HEX, 
*(HwAddress++), 2);
+    if (Index < HwAddressSize - 1) {
+      *String++ = L':';
+    }
+  }
+
+  //
+  // If VLAN is configured, it will need extra 5 characters like "\0005".
+  // Plus one unicode character for the null-terminator.
+  //
+  Node = (EFI_DEVICE_PATH_PROTOCOL  *)MacAddressNode;
+  while (!IsDevicePathEnd (Node)) {
+    if (Node->Type == MESSAGING_DEVICE_PATH && Node->SubType == MSG_VLAN_DP) {
+      VlanId = ((VLAN_DEVICE_PATH *) Node)->VlanId;
+    }
+    Node = NextDevicePathNode (Node);
+  }
+
+  if (VlanId != 0) {
+    *String++ = L'\\';
+    String += UnicodeValueToString (String, PREFIX_ZERO | RADIX_HEX, VlanId, 
4);
+  }
+
+  //
+  // Null terminate the Unicode string
+  //
+  *String = L'\0';
+
+  return TRUE;
+}
+
+/**
+  Save question id and prompt id to the mac device list.
+  If the same mac address has saved yet, no need to add more.
+
+  @param MacAddrString               Mac address string.
+
+  @retval  EFI_SUCCESS               Add the item is successful.
+  @return  Other values if failed to Add the item.
+**/
+BOOLEAN 
+AddIdToMacDeviceList (
+  IN  EFI_STRING        MacAddrString
+  )
+{
+  MENU_INFO_ITEM *TempDeviceList;
+  UINTN          Index;
+  EFI_STRING     StoredString;
+  EFI_STRING_ID  PromptId;
+  EFI_HII_HANDLE HiiHandle;
+
+  HiiHandle =   gDeviceManagerPrivate.HiiHandle;
+  TempDeviceList = NULL;
+
+  for (Index = 0; Index < mMacDeviceList.CurListLen; Index ++) {
+    StoredString = HiiGetString (HiiHandle, 
mMacDeviceList.NodeList[Index].PromptId, NULL);
+    if (StoredString == NULL) {
+      return FALSE;
+    }
+
+    //
+    // Already has save the same mac address to the list.
+    //
+    if (StrCmp (MacAddrString, StoredString) == 0) {
+      return FALSE;
+    }
+  }
+
+  PromptId = HiiSetString(HiiHandle, 0, MacAddrString, NULL);
+  //
+  // If not in the list, save it.
+  //
+  if (mMacDeviceList.MaxListLen > mMacDeviceList.CurListLen + 1) {
+    mMacDeviceList.NodeList[mMacDeviceList.CurListLen].PromptId = PromptId;
+    mMacDeviceList.NodeList[mMacDeviceList.CurListLen].QuestionId = 
(EFI_QUESTION_ID) (mMacDeviceList.CurListLen + NETWORK_DEVICE_LIST_KEY_OFFSET);
+  } else {
+    mMacDeviceList.MaxListLen += MAX_MAC_ADDRESS_NODE_LIST_LEN;
+    if (mMacDeviceList.CurListLen != 0) {
+      TempDeviceList = (MENU_INFO_ITEM *)AllocateCopyPool (sizeof 
(MENU_INFO_ITEM) * mMacDeviceList.MaxListLen, (VOID *)mMacDeviceList.NodeList);
+    } else {
+      TempDeviceList = (MENU_INFO_ITEM *)AllocatePool (sizeof (MENU_INFO_ITEM) 
* mMacDeviceList.MaxListLen);
+    }
+
+    if (TempDeviceList == NULL) {
+      return FALSE;
+    }
+    TempDeviceList[mMacDeviceList.CurListLen].PromptId = PromptId;  
+    TempDeviceList[mMacDeviceList.CurListLen].QuestionId = (EFI_QUESTION_ID) 
(mMacDeviceList.CurListLen + NETWORK_DEVICE_LIST_KEY_OFFSET);
+
+    if (mMacDeviceList.CurListLen > 0) {
+      FreePool(mMacDeviceList.NodeList);
+    }
+
+    mMacDeviceList.NodeList = TempDeviceList;
+  }
+  mMacDeviceList.CurListLen ++;
+
+  return TRUE;
+}
+
+/**
+  Check the devcie path, try to find whether it has mac address path.
+
+  In this function, first need to check whether this path has mac address path.
+  second, when the mac address device path has find, also need to deicide 
whether
+  need to add this mac address relate info to the menu.
+
+  @param    *Node            Input device which need to be check.
+  @param    NextShowFormId   FormId Which need to be show.
+  @param    *NeedAddItem     Whether need to add the menu in the network 
device list.
+
+  @retval  TRUE              Has mac address device path.
+  @retval  FALSE             NOT Has mac address device path.
+
+**/
+BOOLEAN
+IsMacAddressDevicePath (
+  IN  VOID          *Node,
+  IN EFI_FORM_ID    NextShowFormId,
+  OUT BOOLEAN       *NeedAddItem
+  )
+{
+  EFI_DEVICE_PATH_PROTOCOL   *DevicePath;
+  CHAR16                     *Buffer;
+  BOOLEAN                    ReturnVal;
+
+  ASSERT (Node != NULL);
+  *NeedAddItem = FALSE;
+  ReturnVal    = FALSE;
+  Buffer    = NULL;
+
+  DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) Node;
+
+  //
+  // find the partition device path node
+  //
+  while (!IsDevicePathEnd (DevicePath)) {
+    if ((DevicePathType (DevicePath) == MESSAGING_DEVICE_PATH) &&
+       (DevicePathSubType (DevicePath) == MSG_MAC_ADDR_DP)) {
+      ReturnVal = TRUE;
+
+      if (DEVICE_MANAGER_FORM_ID == NextShowFormId) {
+        *NeedAddItem = TRUE;
+        break;
+      } 
+      
+      if (!GetMacAddressString((MAC_ADDR_DEVICE_PATH*)DevicePath, &Buffer)) {
+        break;
+      }
+
+      if (NETWORK_DEVICE_FORM_ID == NextShowFormId) {
+        if (StrCmp (Buffer, mSelectedMacAddrString) == 0) {
+          *NeedAddItem = TRUE;
+        }
+        break;
+      }
+
+      if (NETWORK_DEVICE_LIST_FORM_ID == NextShowFormId) {
+        //
+        // Same handle may has two network child handle, so the questionid 
+        // has the offset of SAME_HANDLE_KEY_OFFSET.
+        //
+        if (AddIdToMacDeviceList (Buffer)) {
+          *NeedAddItem = TRUE;
+        }
+        break;
+      }
+    }
+    DevicePath = NextDevicePathNode (DevicePath);
+  }
+
+  if (Buffer != NULL) {
+    FreePool (Buffer);
+  }
+
+  return ReturnVal;
+}
+
+/**
+  Check to see if the device path is for the network device.
+
+  @param Handle          The HII handle which include the mac address device 
path.
+  @param NextShowFormId  The FormId of the form which will be show next time.
+  @param ItemCount       The new add Mac address item count.
+
+  @retval  TRUE          Need to add new item in the menu.
+  @return  FALSE         Do not need to add the menu about the network.
+
+**/
+BOOLEAN 
+IsNeedAddNetworkMenu (
+  IN      EFI_HII_HANDLE      Handle,
+  IN      EFI_FORM_ID         NextShowFormId,
+  OUT     UINTN               *ItemCount
+  )
+{
+  EFI_STATUS     Status;
+  UINTN          EntryCount;
+  UINTN          Index;  
+  EFI_HII_HANDLE HiiDeviceManagerHandle;
+  EFI_HANDLE     DriverHandle;
+  EFI_HANDLE     ControllerHandle;
+  EFI_DEVICE_PATH_PROTOCOL   *DevicePath;
+  EFI_DEVICE_PATH_PROTOCOL   *TmpDevicePath;
+  EFI_DEVICE_PATH_PROTOCOL   *ChildDevicePath;
+  EFI_OPEN_PROTOCOL_INFORMATION_ENTRY   *OpenInfoBuffer;
+  BOOLEAN        IsNeedAdd;
+
+  HiiDeviceManagerHandle = gDeviceManagerPrivate.HiiHandle;
+  IsNeedAdd  = FALSE;
+  OpenInfoBuffer = NULL;
+  if ((Handle == NULL) || (ItemCount == NULL)) {
+    return FALSE;
+  }
+  *ItemCount = 0;
+
+  Status = gHiiDatabase->GetPackageListHandle (gHiiDatabase, Handle, 
&DriverHandle);
+  if (EFI_ERROR (Status)) {
+    return FALSE;
+  }
+  //
+  // Get the device path by the got Driver handle .
+  //
+  Status = gBS->HandleProtocol (DriverHandle, &gEfiDevicePathProtocolGuid, 
(VOID **) &DevicePath);
+  if (EFI_ERROR (Status)) {
+    return FALSE;
+  }
+  TmpDevicePath = DevicePath;
+
+  // 
+  // Check whether this device path include mac address device path.
+  // If this path has mac address path, get the value whether need 
+  // add this info to the menu and return.
+  // Else check more about the child handle devcie path.
+  //
+  if (IsMacAddressDevicePath(TmpDevicePath, NextShowFormId,&IsNeedAdd)) {
+    if ((NETWORK_DEVICE_LIST_FORM_ID == NextShowFormId) && IsNeedAdd) {
+      (*ItemCount) = 1;
+    }
+    return IsNeedAdd;
+  }
+
+  //
+  // Search whether this path is the controller path, not he child handle path.
+  // And the child handle has the network devcie connected.
+  //
+  TmpDevicePath = DevicePath;
+  Status = gBS->LocateDevicePath(&gEfiDevicePathProtocolGuid, &TmpDevicePath, 
&ControllerHandle);
+  if (EFI_ERROR (Status)) {
+    return FALSE;
+  }
+
+  if (!IsDevicePathEnd (TmpDevicePath)) {
+    return FALSE;    
+  }
+
+  //
+  // Retrieve the list of agents that are consuming the specific protocol
+  // on ControllerHandle.
+  // The buffer point by OpenInfoBuffer need be free at this function.
+  //
+  Status = gBS->OpenProtocolInformation (
+                  ControllerHandle,
+                  &gEfiPciIoProtocolGuid,
+                  &OpenInfoBuffer,
+                  &EntryCount
+                  );
+  if (EFI_ERROR (Status)) {
+    return FALSE;
+  }
+
+  //
+  // Inspect if ChildHandle is one of the agents.
+  //
+  Status = EFI_UNSUPPORTED;
+  for (Index = 0; Index < EntryCount; Index++) {
+    //
+    // Query all the children created by the controller handle's driver
+    //
+    if ((OpenInfoBuffer[Index].Attributes & 
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {
+      Status = gBS->OpenProtocol (
+                      OpenInfoBuffer[Index].ControllerHandle,
+                      &gEfiDevicePathProtocolGuid,
+                      (VOID **) &ChildDevicePath,
+                      NULL,
+                      NULL,
+                      EFI_OPEN_PROTOCOL_GET_PROTOCOL
+                      );
+      if (EFI_ERROR (Status)) {
+        continue;
+      }
+
+      // 
+      // Check whether this device path include mac address device path.
+      //
+      if (!IsMacAddressDevicePath(ChildDevicePath, NextShowFormId,&IsNeedAdd)) 
{
+        //
+        // If this path not has mac address path, check the other.
+        //
+        continue;
+      } else {
+        //
+        // If need to update the NETWORK_DEVICE_LIST_FORM, try to get more.
+        //
+        if ((NETWORK_DEVICE_LIST_FORM_ID == NextShowFormId)) {
+          if (IsNeedAdd) {
+            (*ItemCount) += 1;
+          }
+          continue;
+        } else {
+          //
+          // If need to update other form, return whether need to add to the 
menu.
+          //          
+          goto Done;
+        }
+      }
+    }
+  }
+
+Done:
+  if (OpenInfoBuffer != NULL) {
+    FreePool (OpenInfoBuffer);  
+  }
+  return IsNeedAdd; 
+}
+
+/**
+  Dynamic create Hii information for Device Manager.
+
+  @param   NextShowFormId     The FormId which need to be show.
+
+**/
+VOID
+CreateDeviceManagerForm(
+  IN EFI_FORM_ID      NextShowFormId
+)
+{
+  UINTN                       Index;
+  EFI_STRING                  String;
+  EFI_STRING_ID               Token;
+  EFI_STRING_ID               TokenHelp;
+  EFI_HII_HANDLE              *HiiHandles;
+  EFI_HII_HANDLE              HiiHandle;
+  EFI_GUID                    FormSetGuid;
+  VOID                        *StartOpCodeHandle;
+  VOID                        *EndOpCodeHandle;
+  EFI_IFR_GUID_LABEL          *StartLabel;
+  EFI_IFR_GUID_LABEL          *EndLabel;
+  BOOLEAN                     AddNetworkMenu;
+  UINTN                       AddItemCount;
+  UINTN                       NewStringLen;
+  EFI_STRING                  NewStringTitle;
+  CHAR16                      *DevicePathStr;
+  EFI_STRING_ID               DevicePathId;
+  EFI_IFR_FORM_SET            *Buffer;      
+  UINTN                       BufferSize;   
+  UINT8                       ClassGuidNum; 
+  EFI_GUID                    *ClassGuid;   
+  UINTN                       TempSize;
+  UINT8                       *Ptr;
+  EFI_STATUS                  Status;
+
+  TempSize =0;
+  BufferSize = 0;
+  Buffer = NULL;
+
+  HiiHandle = gDeviceManagerPrivate.HiiHandle;
+  AddNetworkMenu = FALSE;
+  AddItemCount = 0;
+  //
+  // If need show the Network device list form, clear the old save list first.
+  //
+  if ((NextShowFormId == NETWORK_DEVICE_LIST_FORM_ID) && 
(mMacDeviceList.CurListLen > 0)) {
+    mMacDeviceList.CurListLen = 0;
+  }
+
+  //
+  // Update the network device form titile.
+  //
+  if (NextShowFormId == NETWORK_DEVICE_FORM_ID) {
+    String = HiiGetString (HiiHandle, STRING_TOKEN 
(STR_FORM_NETWORK_DEVICE_TITLE), NULL);
+    NewStringLen = StrLen(mSelectedMacAddrString) * 2;
+    NewStringLen += (StrLen(String) + 2) * 2;
+    NewStringTitle = AllocatePool (NewStringLen);
+    UnicodeSPrint (NewStringTitle, NewStringLen, L"%s %s", String, 
mSelectedMacAddrString);
+    HiiSetString (HiiHandle, STRING_TOKEN (STR_FORM_NETWORK_DEVICE_TITLE), 
NewStringTitle, NULL);    
+    FreePool (String);
+    FreePool (NewStringTitle);
+  }
+
+  //
+  // Allocate space for creation of UpdateData Buffer
+  //
+  StartOpCodeHandle = HiiAllocateOpCodeHandle ();
+  ASSERT (StartOpCodeHandle != NULL);
+
+  EndOpCodeHandle = HiiAllocateOpCodeHandle ();
+  ASSERT (EndOpCodeHandle != NULL);
+
+  //
+  // Create Hii Extend Label OpCode as the start opcode
+  //
+  StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (StartOpCodeHandle, 
&gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));
+  StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
+  //
+  // According to the next show Form id(mNextShowFormId) to decide which form 
need to update.
+  //
+  StartLabel->Number       = (UINT16) (LABEL_FORM_ID_OFFSET + NextShowFormId);
+
+  //
+  // Create Hii Extend Label OpCode as the end opcode
+  //
+  EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (EndOpCodeHandle, 
&gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));
+  EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
+  EndLabel->Number       = LABEL_END;
+
+  //
+  // Get all the Hii handles
+  //
+  HiiHandles = HiiGetHiiHandles (NULL);
+  ASSERT (HiiHandles != NULL);
+
+  //
+  // Search for formset of each class type
+  //
+  for (Index = 0; HiiHandles[Index] != NULL; Index++) {
+    Status = HiiGetFormSetFromHiiHandle(HiiHandles[Index], 
&Buffer,&BufferSize);
+    if (EFI_ERROR (Status)){
+      continue;
+    }
+    Ptr = (UINT8 *)Buffer;
+    while(TempSize < BufferSize)  {
+      TempSize += ((EFI_IFR_OP_HEADER *) Ptr)->Length;
+      if (((EFI_IFR_OP_HEADER *) Ptr)->Length <= OFFSET_OF (EFI_IFR_FORM_SET, 
Flags)){
+        Ptr += ((EFI_IFR_OP_HEADER *) Ptr)->Length;
+        continue;
+      } 
+
+      ClassGuidNum = (UINT8) (((EFI_IFR_FORM_SET *)Ptr)->Flags & 0x3);
+      ClassGuid = (EFI_GUID *) (VOID *)(Ptr + sizeof (EFI_IFR_FORM_SET));
+      while (ClassGuidNum-- > 0) {
+        if (CompareGuid (&gEfiHiiPlatformSetupFormsetGuid, ClassGuid)== 0) {
+          ClassGuid ++;
+          continue;
+        }
+
+        String = HiiGetString (HiiHandles[Index], ((EFI_IFR_FORM_SET 
*)Ptr)->FormSetTitle, NULL);
+        if (String == NULL) {
+          String = HiiGetString (HiiHandle, STRING_TOKEN (STR_MISSING_STRING), 
NULL);
+          ASSERT (String != NULL);
+        }
+        Token = HiiSetString (HiiHandle, 0, String, NULL);
+        FreePool (String);
+
+        String = HiiGetString (HiiHandles[Index], ((EFI_IFR_FORM_SET 
*)Ptr)->Help, NULL);
+        if (String == NULL) {
+          String = HiiGetString (HiiHandle, STRING_TOKEN (STR_MISSING_STRING), 
NULL);
+          ASSERT (String != NULL);
+        }
+        TokenHelp = HiiSetString (HiiHandle, 0, String, NULL);
+        FreePool (String);
+
+        FormSetGuid = ((EFI_IFR_FORM_SET *)Ptr)->Guid;
+
+        //
+        // Network device process
+        // 
+        if (IsNeedAddNetworkMenu (HiiHandles[Index], 
NextShowFormId,&AddItemCount)) {
+          if (NextShowFormId == DEVICE_MANAGER_FORM_ID) {
+            //
+            // Only show one menu item "Network Config" in the device manger 
form.
+            //
+            if (!AddNetworkMenu) {
+              AddNetworkMenu = TRUE;
+              HiiCreateGotoOpCode (
+                StartOpCodeHandle,
+                NETWORK_DEVICE_LIST_FORM_ID,
+                STRING_TOKEN (STR_FORM_NETWORK_DEVICE_LIST_TITLE),
+                STRING_TOKEN (STR_FORM_NETWORK_DEVICE_LIST_HELP),
+                EFI_IFR_FLAG_CALLBACK,
+                (EFI_QUESTION_ID) QUESTION_NETWORK_DEVICE_ID
+              );
+            }
+          } else if (NextShowFormId == NETWORK_DEVICE_LIST_FORM_ID) {
+            //
+            // In network device list form, same mac address device only show 
one menu.
+            //
+            while (AddItemCount > 0) {
+              HiiCreateGotoOpCode (
+                StartOpCodeHandle,
+                NETWORK_DEVICE_FORM_ID,
+                mMacDeviceList.NodeList[mMacDeviceList.CurListLen - 
AddItemCount].PromptId,
+                STRING_TOKEN (STR_NETWORK_DEVICE_HELP),
+                EFI_IFR_FLAG_CALLBACK,
+                mMacDeviceList.NodeList[mMacDeviceList.CurListLen - 
AddItemCount].QuestionId
+              );
+              AddItemCount -= 1;
+            }
+          } else if (NextShowFormId == NETWORK_DEVICE_FORM_ID) {
+            //
+            // In network device form, only the selected mac address device 
need to be show.
+            //
+            DevicePathStr = 
DmExtractDevicePathFromHiiHandle(HiiHandles[Index]);
+            DevicePathId  = 0;
+            if (DevicePathStr != NULL){
+              DevicePathId =  HiiSetString (HiiHandle, 0, DevicePathStr, NULL);
+              FreePool(DevicePathStr);
+            }
+            HiiCreateGotoExOpCode (
+              StartOpCodeHandle,
+              0,
+              Token,
+              TokenHelp,
+              0,
+              (EFI_QUESTION_ID) (Index + DEVICE_KEY_OFFSET),
+              0,
+              &FormSetGuid,    
+              DevicePathId
+            );
+          }
+        } else {
+          //
+          // Not network device process, only need to show at device manger 
form.
+          //
+          if (NextShowFormId == DEVICE_MANAGER_FORM_ID) {
+            DevicePathStr = 
DmExtractDevicePathFromHiiHandle(HiiHandles[Index]);
+            DevicePathId  = 0;
+            if (DevicePathStr != NULL){
+              DevicePathId =  HiiSetString (HiiHandle, 0, DevicePathStr, NULL);
+              FreePool(DevicePathStr);
+            }
+            HiiCreateGotoExOpCode (
+              StartOpCodeHandle,
+              0,
+              Token,
+              TokenHelp,
+              0,
+              (EFI_QUESTION_ID) (Index + DEVICE_KEY_OFFSET),
+              0,
+              &FormSetGuid,
+              DevicePathId
+            );
+          }
+        }
+        break;
+      }
+
+      Ptr += ((EFI_IFR_OP_HEADER *) Ptr)->Length;
+    }
+    FreePool(Buffer);
+    Buffer = NULL;
+    TempSize = 0;
+    BufferSize = 0;
+  }
+
+  HiiUpdateForm (
+    HiiHandle,
+    &mDeviceManagerGuid,
+    NextShowFormId,
+    StartOpCodeHandle,
+    EndOpCodeHandle
+    );
+
+  HiiFreeOpCodeHandle (StartOpCodeHandle);
+  HiiFreeOpCodeHandle (EndOpCodeHandle);
+  FreePool (HiiHandles);
+}
+
+/**
+  This function allows a caller to extract the current configuration for one
+  or more named elements from the target driver.
+
+
+  @param This            Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
+  @param Request         A null-terminated Unicode string in <ConfigRequest> 
format.
+  @param Progress        On return, points to a character in the Request 
string.
+                         Points to the string's null terminator if request was 
successful.
+                         Points to the most recent '&' before the first 
failing name/value
+                         pair (or the beginning of the string if the failure 
is in the
+                         first name/value pair) if the request was not 
successful.
+  @param Results         A null-terminated Unicode string in <ConfigAltResp> 
format which
+                         has all values filled in for the names in the Request 
string.
+                         String to be allocated by the called function.
+
+  @retval  EFI_SUCCESS            The Results is filled with the requested 
values.
+  @retval  EFI_OUT_OF_RESOURCES   Not enough memory to store the results.
+  @retval  EFI_INVALID_PARAMETER  Request is illegal syntax, or unknown name.
+  @retval  EFI_NOT_FOUND          Routing data doesn't match any storage in 
this driver.
+
+**/
+EFI_STATUS
+EFIAPI
+DeviceManagerExtractConfig (
+  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,
+  IN  CONST EFI_STRING                       Request,
+  OUT EFI_STRING                             *Progress,
+  OUT EFI_STRING                             *Results
+  )
+{
+  if (Progress == NULL || Results == NULL) {
+    return EFI_INVALID_PARAMETER;
+  }
+  *Progress = Request;
+  return EFI_NOT_FOUND;
+}
+
+/**
+  This function processes the results of changes in configuration.
+
+  @param This            Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
+  @param Configuration   A null-terminated Unicode string in <ConfigResp> 
format.
+  @param Progress        A pointer to a string filled in with the offset of 
the most
+                         recent '&' before the first failing name/value pair 
(or the
+                         beginning of the string if the failure is in the first
+                         name/value pair) or the terminating NULL if all was 
successful.
+
+  @retval  EFI_SUCCESS            The Results is processed successfully.
+  @retval  EFI_INVALID_PARAMETER  Configuration is NULL.
+  @retval  EFI_NOT_FOUND          Routing data doesn't match any storage in 
this driver.
+
+**/
+EFI_STATUS
+EFIAPI
+DeviceManagerRouteConfig (
+  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,
+  IN  CONST EFI_STRING                       Configuration,
+  OUT EFI_STRING                             *Progress
+  )
+{
+  if (Configuration == NULL || Progress == NULL) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  *Progress = Configuration;
+
+  return EFI_NOT_FOUND;
+}
+
+/**
+  This function is invoked if user selected a interactive opcode from Device 
Manager's
+  Formset. If user set VBIOS, the new value is saved to EFI variable.
+
+  @param This            Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
+  @param Action          Specifies the type of action taken by the browser.
+  @param QuestionId      A unique value which is sent to the original 
exporting driver
+                         so that it can identify the type of data to expect.
+  @param Type            The type of value for the question.
+  @param Value           A pointer to the data being sent to the original 
exporting driver.
+  @param ActionRequest   On return, points to the action requested by the 
callback function.
+
+  @retval  EFI_SUCCESS           The callback successfully handled the action.
+  @retval  EFI_INVALID_PARAMETER The setup browser call this function with 
invalid parameters.
+
+**/
+EFI_STATUS
+EFIAPI
+DeviceManagerCallback (
+  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,
+  IN  EFI_BROWSER_ACTION                     Action,
+  IN  EFI_QUESTION_ID                        QuestionId,
+  IN  UINT8                                  Type,
+  IN  EFI_IFR_TYPE_VALUE                     *Value,
+  OUT EFI_BROWSER_ACTION_REQUEST             *ActionRequest
+  )
+{
+  UINTN CurIndex;
+
+  if (Action != EFI_BROWSER_ACTION_CHANGING) {
+    //
+    // Do nothing for other UEFI Action. Only do call back when data is 
changed.
+    //
+    return EFI_UNSUPPORTED;
+  }
+  if ((Value == NULL) || (ActionRequest == NULL)) {
+    return EFI_INVALID_PARAMETER;
+  }
+  if ((QuestionId < MAX_KEY_SECTION_LEN + NETWORK_DEVICE_LIST_KEY_OFFSET) && 
(QuestionId >= NETWORK_DEVICE_LIST_KEY_OFFSET)) {
+    //
+    // If user select the mac address, need to record mac address string to 
support next form show.
+    //
+    for (CurIndex = 0; CurIndex < mMacDeviceList.CurListLen; CurIndex ++) {
+      if (mMacDeviceList.NodeList[CurIndex].QuestionId == QuestionId) {
+         mSelectedMacAddrString = HiiGetString 
(gDeviceManagerPrivate.HiiHandle, mMacDeviceList.NodeList[CurIndex].PromptId, 
NULL);
+      }
+    }
+    CreateDeviceManagerForm(NETWORK_DEVICE_FORM_ID);
+  } else if(QuestionId == QUESTION_NETWORK_DEVICE_ID){
+    CreateDeviceManagerForm(NETWORK_DEVICE_LIST_FORM_ID);
+  }
+
+  return EFI_SUCCESS;
+}
+
+/**
+  Install Boot Manager Menu driver.
+
+  @param ImageHandle     The image handle.
+  @param SystemTable     The system table.
+
+  @retval  EFI_SUCEESS  Install Boot manager menu success.
+  @retval  Other        Return error status.
+
+**/
+EFI_STATUS
+EFIAPI
+DeviceManagerLibConstructor (
+  IN EFI_HANDLE                            ImageHandle,
+  IN EFI_SYSTEM_TABLE                      *SystemTable
+)
+{
+  EFI_STATUS                  Status;
+
+  gDeviceManagerPrivate.DriverHandle = NULL;
+  Status = gBS->InstallMultipleProtocolInterfaces (
+                  &gDeviceManagerPrivate.DriverHandle,
+                  &gEfiDevicePathProtocolGuid,
+                  &mDeviceManagerHiiVendorDevicePath,
+                  &gEfiHiiConfigAccessProtocolGuid,
+                  &gDeviceManagerPrivate.ConfigAccess,
+                  NULL
+                  );
+  ASSERT_EFI_ERROR (Status);
+
+  //
+  // Publish our HII data.
+  //
+  gDeviceManagerPrivate.HiiHandle = HiiAddPackages (
+                  &mDeviceManagerGuid,
+                  gDeviceManagerPrivate.DriverHandle,
+                  DeviceManagerVfrBin,
+                  DeviceManagerLibStrings,
+                  NULL
+                  );
+  ASSERT (gDeviceManagerPrivate.HiiHandle != NULL);
+
+  //
+  // Update boot manager page 
+  //
+  CreateDeviceManagerForm (DEVICE_MANAGER_FORM_ID);
+
+  return EFI_SUCCESS;
+}
+
+/**
+  Unloads the application and its installed protocol.
+
+  @param  ImageHandle     Handle that identifies the image to be unloaded.
+  @param  SystemTable     The system table.
+
+  @retval EFI_SUCCESS           The image has been unloaded.
+**/
+EFI_STATUS
+EFIAPI
+DeviceManagerLibDestructor(
+  IN EFI_HANDLE                            ImageHandle,
+  IN EFI_SYSTEM_TABLE                      *SystemTable
+)
+{
+  EFI_STATUS                  Status;
+
+  Status = gBS->UninstallMultipleProtocolInterfaces (
+                  gDeviceManagerPrivate.DriverHandle,
+                  &gEfiDevicePathProtocolGuid,
+                  &mDeviceManagerHiiVendorDevicePath,
+                  &gEfiHiiConfigAccessProtocolGuid,
+                  &gDeviceManagerPrivate.ConfigAccess,
+                  NULL
+                  );
+  ASSERT_EFI_ERROR (Status);
+
+  HiiRemovePackages (gDeviceManagerPrivate.HiiHandle);
+
+  return EFI_SUCCESS;
+}
+
diff --git a/MdeModulePkg/Library/DeviceManagerLib/DeviceManager.h 
b/MdeModulePkg/Library/DeviceManagerLib/DeviceManager.h
new file mode 100644
index 0000000..88606ce
--- /dev/null
+++ b/MdeModulePkg/Library/DeviceManagerLib/DeviceManager.h
@@ -0,0 +1,194 @@
+/** @file
+The device manager reference implement
+
+Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR>
+This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD 
License
+which accompanies this distribution.  The full text of the license may be 
found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#ifndef _DEVICE_MANAGER_H_
+#define _DEVICE_MANAGER_H_
+
+#include <Guid/MdeModuleHii.h>
+#include <Guid/HiiPlatformSetupFormset.h>
+
+#include <Protocol/HiiConfigAccess.h>
+#include <Protocol/PciIo.h>
+
+#include <Library/PrintLib.h>
+#include <Library/DebugLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/BaseLib.h>
+#include <Library/HiiLib.h>
+#include <Library/DevicePathLib.h>
+#include <Library/UefiHiiServicesLib.h>
+
+//
+// These are defined as the same with vfr file
+//
+#define DEVICE_MANAGER_FORMSET_GUID  \
+  { \
+  0x3ebfa8e6, 0x511d, 0x4b5b, {0xa9, 0x5f, 0xfb, 0x38, 0x26, 0xf, 0x1c, 0x27} \
+  }
+
+#define LABEL_END                            0xffff
+#define LABEL_FORM_ID_OFFSET                 0x0100
+
+#define DEVICE_MANAGER_FORM_ID               0x1000
+#define NETWORK_DEVICE_LIST_FORM_ID          0x1001
+#define NETWORK_DEVICE_FORM_ID               0x1002
+#define DEVICE_KEY_OFFSET                    0x4000
+#define NETWORK_DEVICE_LIST_KEY_OFFSET       0x2000
+
+#define MAX_KEY_SECTION_LEN                  0x1000
+
+#define QUESTION_NETWORK_DEVICE_ID           0x3FFF
+//
+// These are the VFR compiler generated data representing our VFR data.
+//
+extern UINT8  DeviceManagerVfrBin[];
+
+#define DEVICE_MANAGER_CALLBACK_DATA_SIGNATURE  SIGNATURE_32 ('D', 'M', 'C', 
'B')
+
+///
+/// HII specific Vendor Device Path definition.
+///
+typedef struct {
+  VENDOR_DEVICE_PATH             VendorDevicePath;
+  EFI_DEVICE_PATH_PROTOCOL       End;
+} HII_VENDOR_DEVICE_PATH;
+
+typedef struct {
+  UINTN                           Signature;
+
+  ///
+  /// Device Manager HII relative handles
+  ///
+  EFI_HII_HANDLE                  HiiHandle;
+
+  EFI_HANDLE                      DriverHandle;
+
+  ///
+  /// Device Manager Produced protocols
+  ///
+  EFI_HII_CONFIG_ACCESS_PROTOCOL  ConfigAccess;
+
+  ///
+  /// Configuration data
+  ///
+  UINT8                           VideoBios;
+} DEVICE_MANAGER_CALLBACK_DATA;
+
+typedef struct {
+  EFI_STRING_ID    PromptId;
+  EFI_QUESTION_ID  QuestionId;
+}MENU_INFO_ITEM;
+
+typedef struct {
+  UINTN           CurListLen;
+  UINTN           MaxListLen;
+  MENU_INFO_ITEM  *NodeList;
+} MAC_ADDRESS_NODE_LIST;
+
+#define DEVICE_MANAGER_CALLBACK_DATA_FROM_THIS(a) \
+  CR (a, \
+      DEVICE_MANAGER_CALLBACK_DATA, \
+      ConfigAccess, \
+      DEVICE_MANAGER_CALLBACK_DATA_SIGNATURE \
+      )
+typedef struct {
+  EFI_STRING_ID  StringId;
+  UINT16         Class;
+} DEVICE_MANAGER_MENU_ITEM;
+
+/**
+  This function allows a caller to extract the current configuration for one
+  or more named elements from the target driver.
+
+
+  @param This            Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
+  @param Request         A null-terminated Unicode string in <ConfigRequest> 
format.
+  @param Progress        On return, points to a character in the Request 
string.
+                         Points to the string's null terminator if request was 
successful.
+                         Points to the most recent '&' before the first 
failing name/value
+                         pair (or the beginning of the string if the failure 
is in the
+                         first name/value pair) if the request was not 
successful.
+  @param Results         A null-terminated Unicode string in <ConfigAltResp> 
format which
+                         has all values filled in for the names in the Request 
string.
+                         String to be allocated by the called function.
+
+  @retval  EFI_SUCCESS            The Results is filled with the requested 
values.
+  @retval  EFI_OUT_OF_RESOURCES   Not enough memory to store the results.
+  @retval  EFI_INVALID_PARAMETER  Request is illegal syntax, or unknown name.
+  @retval  EFI_NOT_FOUND          Routing data doesn't match any storage in 
this driver.
+
+**/
+EFI_STATUS
+EFIAPI
+DeviceManagerExtractConfig (
+  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,
+  IN  CONST EFI_STRING                       Request,
+  OUT EFI_STRING                             *Progress,
+  OUT EFI_STRING                             *Results
+  );
+
+/**
+  This function processes the results of changes in configuration.
+
+
+  @param This            Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
+  @param Configuration   A null-terminated Unicode string in <ConfigResp> 
format.
+  @param Progress        A pointer to a string filled in with the offset of 
the most
+                         recent '&' before the first failing name/value pair 
(or the
+                         beginning of the string if the failure is in the first
+                         name/value pair) or the terminating NULL if all was 
successful.
+
+  @retval  EFI_SUCCESS            The Results is processed successfully.
+  @retval  EFI_INVALID_PARAMETER  Configuration is NULL.
+  @retval  EFI_NOT_FOUND          Routing data doesn't match any storage in 
this driver.
+
+**/
+EFI_STATUS
+EFIAPI
+DeviceManagerRouteConfig (
+  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,
+  IN  CONST EFI_STRING                       Configuration,
+  OUT EFI_STRING                             *Progress
+  );
+
+/**
+  This function is invoked if user selected a interactive opcode from Device 
Manager's
+  Formset. If user set VBIOS, the new value is saved to EFI variable.
+
+  @param This            Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
+  @param Action          Specifies the type of action taken by the browser.
+  @param QuestionId      A unique value which is sent to the original 
exporting driver
+                         so that it can identify the type of data to expect.
+  @param Type            The type of value for the question.
+  @param Value           A pointer to the data being sent to the original 
exporting driver.
+  @param ActionRequest   On return, points to the action requested by the 
callback function.
+
+  @retval  EFI_SUCCESS           The callback successfully handled the action.
+  @retval  EFI_INVALID_PARAMETER The setup browser call this function with 
invalid parameters.
+
+**/
+EFI_STATUS
+EFIAPI
+DeviceManagerCallback (
+  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,
+  IN  EFI_BROWSER_ACTION                     Action,
+  IN  EFI_QUESTION_ID                        QuestionId,
+  IN  UINT8                                  Type,
+  IN  EFI_IFR_TYPE_VALUE                     *Value,
+  OUT EFI_BROWSER_ACTION_REQUEST             *ActionRequest
+  );
+
+#endif
diff --git a/MdeModulePkg/Library/DeviceManagerLib/DeviceManagerLib.inf 
b/MdeModulePkg/Library/DeviceManagerLib/DeviceManagerLib.inf
new file mode 100644
index 0000000..6c24756
--- /dev/null
+++ b/MdeModulePkg/Library/DeviceManagerLib/DeviceManagerLib.inf
@@ -0,0 +1,57 @@
+## @file
+#  Device Manager Library used by UiApp
+#
+#  Copyright (c) 2011 - 2015, Intel Corporation. All rights reserved.<BR>
+#  This software and associated documentation (if any) is furnished
+#  under a license and may only be used or copied in accordance
+#  with the terms of the license. Except as permitted by such
+#  license, no part of this software or documentation may be
+#  reproduced, stored in a retrieval system, or transmitted in any
+#  form or by any means without the express written consent of
+#  Intel Corporation.
+#  
+##
+
+[Defines]
+  INF_VERSION                    = 0x00010005
+  BASE_NAME                      = DeviceManagerLib
+  FILE_GUID                      = 75EBDC2E-5323-4F31-A41D-FD1A7A9FC65E
+  MODULE_TYPE                    = DXE_DRIVER
+  VERSION_STRING                 = 1.0
+  LIBRARY_CLASS                  = NULL|DXE_DRIVER UEFI_APPLICATION
+  CONSTRUCTOR                    = DeviceManagerLibConstructor
+  DESTRUCTOR                     = DeviceManagerLibDestructor
+#
+# The following information is for reference only and not required by the 
build tools.
+#
+#  VALID_ARCHITECTURES           = IA32 X64 IPF EBC
+#
+
+[Sources]
+  DeviceManager.h
+  DeviceManagerVfr.Vfr
+  DeviceManagerStrings.uni
+  DeviceManager.c
+
+[Packages]
+  MdePkg/MdePkg.dec
+  MdeModulePkg/MdeModulePkg.dec
+
+[LibraryClasses]
+  DevicePathLib
+  BaseLib
+  MemoryAllocationLib
+  UefiBootServicesTableLib
+  BaseMemoryLib
+  DebugLib
+  PrintLib
+  HiiLib
+  UefiHiiServicesLib
+
+[Guids]
+  gEfiHiiPlatformSetupFormsetGuid               ## CONSUMES ## GUID (Indicate 
the formset class guid to be displayed)
+  gEfiIfrTianoGuid                              ## CONSUMES ## GUID (Extended 
IFR Guid Opcode)
+  gEfiIfrFrontPageGuid                          ## CONSUMES ## GUID (Indicate 
the formset in this library need to dispaly in which page)
+
+[Protocols]
+  gEfiHiiConfigAccessProtocolGuid               ## CONSUMES
diff --git a/MdeModulePkg/Library/DeviceManagerLib/DeviceManagerStrings.uni 
b/MdeModulePkg/Library/DeviceManagerLib/DeviceManagerStrings.uni
new file mode 100644
index 
0000000000000000000000000000000000000000..0bed7bd679b610c9d53ac0df0e9df03622872af0
GIT binary patch
literal 7804
zcmd^^-%cYp6vlmBsqZifH{EIpZPngXZPjH7ZM2&Nk+5v9qL2WK77~;RP@cGNvF-0W
z#+jKkGdM+TB2`glY>$2XozKU|f6m{ZcAS1+^Gn>X?#x}dOLywNbYEC`cqe@Ax|y5u
zeeBN3ji{yCWBxP#6H+PVXQZaQXYK<v61T_mmhVH$wcLPu10<YMtG=|K*GRZ__tw`r
zQf5f`iuNyff9Jm8_dTiYhupXB2ltY66S*^_UXqrCDKhjN%+b~P@`~@OAw9foVV=@1
zHAJ^ON8tL&?Ycwv%N(Ed?}6pQbiAg;g!Ynt#TV%`;vIAzfObfYD=_HWJ?%VeSB6Kr
zUy!;)TAty7AxS9re2G!v$$C(GF|U$a{u-@;JK?Fa8^a;#85VIe1&Q<wIE77!iz7E-
z?6P*djQ1Y-w*@SDw0FkGkf$UUHNK!%^(aO>XX-5_FU?Ot8f-?R;<=RuXMFJ^B;0>e
zD*<aBSCN|p%?9wBAk(*>Jg^{4vjV%aq!}afqgl3W>=YJK<llfw_E{%AWn6a_Mj)l+
zgqkC)uGoJaDIfUfdC8}H?swM!-2v9rali3=<yz#Mu&cSDcaPF0_I5<7VVobiHtz=I
zV#Z6z#-oXSH>lAy$sJO%YdvecC09~wymu|H+{*&OV`@ll$NEg%G4&1&TbuGGawVl>
z{U4GOdX=fy9(7em{rXz_)K&j~@P5M=Vb_doJoMuAXt?)tIhph(Y#d-?>T@sW4`dU8
zNBO25%lVR@-PSy}#dyf7&uv!7PW02bZljy}sUcb4HEt<mRkOCs+nq7`+iu_VuJP9V
z9=pGIs;zG+3|r*#zR-_h-*gZIP1i>+v2{dBZ1vDlcChT1VY#6vdB&m!(xJ+WdR)sS
z|M#+GnDXqzVOotR+4)<np$zphO!<)(rp!mnbIL0Y87aRyCGL(?@Gb-Q(U`us`7cj3
zq37ViH<9npr(4;$$tS(Tn&p4GShnV^Y`<*8e0j{c<@rvLr&ULDY!htz-+0RT5g%`0
zCeKtgI|<$-_^_(^FFroPOp&Se@l%DTj33#KnCYy<Pz*osu$K|@S#x+Z7<vp*8AomS
z>9Hbf^^Lcr7>?TTGs6dJkFz<J6oaaaEA2H7Y!9=_jEmt)r-^IZrEZEnJ%*@^Bkj}r
z>;yZu$J>jXc`+Qduq3};PT3t#*t<-bgPX$FD(K3&^SkfENY>)lyUv`sP2uY?L}eVc
zY!A@o+2(xHxBY<5Gs=~(d~x=rH73Qg`?GWY{$X9~Ud#3+RhY_nYS>Aq$0;e6Be565
z)4I6u{g&(d9xLdrq-~tO2lyG?E@)q-eduf6e)p~$1KnxV*S2qr$5zJMzODQ%c&pk8
zES@T3?4)X?U6&0#j_Ij96;G8<<tgFTMCZzDY)rpR<ZU^|G9Ig~EZj~ldh@69xQV<~
z`?J`28P3FgySK~kGh!I)nr-<zi|j69ys&TAIVZbO4>zycdxe!U++wuY^T|8v&UiHU
zn$N*~w$d-tbMfZrbLv@U_p6U*@g8rPo{P6pRo?A+?>JT)k5zD%@mcLhvRUz59_9bV
zXK_`_MmtMA)jrqnC915_qf_KEL<zJPR5VAi9NnPH2Py*OQ#wf`ws+6`s&3tM$C%hN
zL^gdq>eyt2c-##&f^XISGGYDCM*w|PPcb{i^e%}<WvKklbYwSE#i)V4=ni^}JYn7j
zdx``f0nq)m;#Iz1p<gAkDxK8QM_uo7+GNOl6i}EH<(L_6k7Q_geB{)hy~L*HP!Ua!
f@Pw35>ddcrqV^q%eTW@J*A&UiM_)tFVbuNsxGEki

literal 0
HcmV?d00001

diff --git a/MdeModulePkg/Library/DeviceManagerLib/DeviceManagerVfr.Vfr 
b/MdeModulePkg/Library/DeviceManagerLib/DeviceManagerVfr.Vfr
new file mode 100644
index 0000000..f7b2080
--- /dev/null
+++ b/MdeModulePkg/Library/DeviceManagerLib/DeviceManagerVfr.Vfr
@@ -0,0 +1,66 @@
+///** @file
+//
+//  Device Manager formset.
+//
+//  Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR>
+//  This program and the accompanying materials
+//  are licensed and made available under the terms and conditions of the BSD 
License
+//  which accompanies this distribution.  The full text of the license may be 
found at
+//  http://opensource.org/licenses/bsd-license.php
+//  
+//  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR 
IMPLIED.
+//  
+//**/
+
+#define FORMSET_GUID  { 0x3ebfa8e6, 0x511d, 0x4b5b, 0xa9, 0x5f, 0xfb, 0x38, 
0x26, 0xf, 0x1c, 0x27 }
+
+#define LABEL_DEVICES_LIST                 0x1100
+#define LABEL_NETWORK_DEVICE_LIST_ID       0x1101
+#define LABEL_NETWORK_DEVICE_ID            0x1102
+#define LABEL_END                          0xffff
+
+#define DEVICE_MANAGER_FORM_ID             0x1000
+#define NETWORK_DEVICE_LIST_FORM_ID        0x1001
+#define NETWORK_DEVICE_FORM_ID             0x1002
+
+formset
+  guid      = FORMSET_GUID,
+  title     = STRING_TOKEN(STR_EDKII_MENU_TITLE),
+  help      = STRING_TOKEN(STR_EDKII_MENU_HELP),
+  classguid = gEfiIfrFrontPageGuid,
+
+  form formid = DEVICE_MANAGER_FORM_ID,
+    title  = STRING_TOKEN(STR_EDKII_MENU_TITLE);
+    subtitle text = STRING_TOKEN(STR_DEVICES_LIST);
+
+    label LABEL_DEVICES_LIST;
+    label LABEL_END;
+
+    subtitle text = STRING_TOKEN(STR_EMPTY_STRING);
+    subtitle text = STRING_TOKEN(STR_EMPTY_STRING);
+    subtitle text = STRING_TOKEN(STR_EXIT_STRING);
+  endform;
+
+  form formid = NETWORK_DEVICE_LIST_FORM_ID,
+    title = STRING_TOKEN(STR_FORM_NETWORK_DEVICE_LIST_TITLE);
+    subtitle text = STRING_TOKEN(STR_NETWORK_DEVICE_LIST_STRING);
+
+    label LABEL_NETWORK_DEVICE_LIST_ID;
+    label LABEL_END;
+
+    subtitle text = STRING_TOKEN(STR_EMPTY_STRING);
+    subtitle text = STRING_TOKEN(STR_EXIT_STRING);
+  endform;
+
+  form formid = NETWORK_DEVICE_FORM_ID,
+    title = STRING_TOKEN(STR_FORM_NETWORK_DEVICE_TITLE);
+    subtitle text = STRING_TOKEN(STR_NETWORK_DEVICE_STRING);
+
+    label LABEL_NETWORK_DEVICE_ID;
+    label LABEL_END;
+
+    subtitle text = STRING_TOKEN(STR_EMPTY_STRING);
+    subtitle text = STRING_TOKEN(STR_EXIT_STRING);
+  endform;
+endformset;
\ No newline at end of file
-- 
1.9.5.msysgit.1

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to