132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi/** @file
232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan BiThe device manager reference implementation
332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan BiCopyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR>
532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan BiThis program and the accompanying materials
632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Biare licensed and made available under the terms and conditions of the BSD License
732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Biwhich accompanies this distribution.  The full text of the license may be found at
832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bihttp://opensource.org/licenses/bsd-license.php
932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
1032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan BiTHE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
1132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan BiWITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
1232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
1332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi**/
1432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
1532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi#include "DeviceManager.h"
1632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
1732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan BiDEVICE_MANAGER_CALLBACK_DATA  gDeviceManagerPrivate = {
1832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  DEVICE_MANAGER_CALLBACK_DATA_SIGNATURE,
1932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  NULL,
2032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  NULL,
2132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  {
2232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    DeviceManagerExtractConfig,
2332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    DeviceManagerRouteConfig,
2432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    DeviceManagerCallback
2532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  }
2632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi};
2732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
2832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi#define  MAX_MAC_ADDRESS_NODE_LIST_LEN    10
2932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
3032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan BiEFI_GUID mDeviceManagerGuid = DEVICE_MANAGER_FORMSET_GUID;
3132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
3232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi//
3332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi// Which Mac Address string is select
3432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi// it will decide what menu need to show in the NETWORK_DEVICE_FORM_ID form.
3532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi//
3632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan BiEFI_STRING  mSelectedMacAddrString;
3732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
3832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi//
3932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi// The Mac Address show in the NETWORK_DEVICE_LIST_FORM_ID
4032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi//
4132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan BiMAC_ADDRESS_NODE_LIST  mMacDeviceList;
4232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
4332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan BiHII_VENDOR_DEVICE_PATH  mDeviceManagerHiiVendorDevicePath = {
4432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  {
4532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    {
4632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi      HARDWARE_DEVICE_PATH,
4732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi      HW_VENDOR_DP,
4832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi      {
4932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi        (UINT8) (sizeof (VENDOR_DEVICE_PATH)),
5032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi        (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)
5132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi      }
5232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    },
5332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    //
5432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    // {102579A0-3686-466e-ACD8-80C087044F4A}
5532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    //
5632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    { 0x102579a0, 0x3686, 0x466e, { 0xac, 0xd8, 0x80, 0xc0, 0x87, 0x4, 0x4f, 0x4a } }
5732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  },
5832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  {
5932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    END_DEVICE_PATH_TYPE,
6032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    END_ENTIRE_DEVICE_PATH_SUBTYPE,
6132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    {
6232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi      (UINT8) (END_DEVICE_PATH_LENGTH),
6332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi      (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)
6432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    }
6532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  }
6632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi};
6732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
6832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi/**
6932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  Extract device path for given HII handle and class guid.
7032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
7132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  @param Handle          The HII handle.
7232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
7332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  @retval  NULL          Fail to get the device path string.
7432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  @return  PathString    Get the device path string.
7532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
7632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi**/
7732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan BiCHAR16 *
7832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan BiDmExtractDevicePathFromHiiHandle (
7932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  IN      EFI_HII_HANDLE      Handle
8032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  )
8132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi{
8232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  EFI_STATUS                       Status;
8332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  EFI_HANDLE                       DriverHandle;
8432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
8532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  ASSERT (Handle != NULL);
8632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
8732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  if (Handle == NULL) {
8832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    return NULL;
8932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  }
9032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
9132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  Status = gHiiDatabase->GetPackageListHandle (gHiiDatabase, Handle, &DriverHandle);
9232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  if (EFI_ERROR (Status)) {
9332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    return NULL;
9432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  }
9532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  //
9632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  // Get device path string.
9732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  //
9832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  return ConvertDevicePathToText(DevicePathFromHandle (DriverHandle), FALSE, FALSE);
9932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi}
10032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
10132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi/**
10232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  Get the mac address string from the device path.
10332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  if the device path has the vlan, get the vanid also.
10432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
10532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  @param MacAddressNode              Device path begin with mac address
10632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  @param PBuffer                     Output string buffer contain mac address.
10732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
10832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi**/
10932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan BiBOOLEAN
11032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan BiGetMacAddressString(
11132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  IN  MAC_ADDR_DEVICE_PATH   *MacAddressNode,
11232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  OUT CHAR16                 **PBuffer
11332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  )
11432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi{
11532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  UINTN                 HwAddressSize;
11632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  UINTN                 Index;
11732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  UINT8                 *HwAddress;
11832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  EFI_DEVICE_PATH_PROTOCOL  *Node;
11932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  UINT16                VlanId;
12032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  CHAR16                *String;
12132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  UINTN                 BufferLen;
12232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
12332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  VlanId = 0;
12432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  String = NULL;
12532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  ASSERT(MacAddressNode != NULL);
12632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
12732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  HwAddressSize = sizeof (EFI_MAC_ADDRESS);
12832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  if (MacAddressNode->IfType == 0x01 || MacAddressNode->IfType == 0x00) {
12932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    HwAddressSize = 6;
13032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  }
13132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
13232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  //
13332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  // The output format is MAC:XX:XX:XX:...\XXXX
13432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  // The size is the Number size + ":" size + Vlan size(\XXXX) + End
13532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  //
13632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  BufferLen = (4 + 2 * HwAddressSize + (HwAddressSize - 1) + 5 + 1) * sizeof (CHAR16);
13732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  String = AllocateZeroPool (BufferLen);
13832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  if (String == NULL) {
13932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    return FALSE;
14032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  }
14132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
14232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  *PBuffer = String;
14332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  StrCpyS(String, BufferLen / sizeof (CHAR16), L"MAC:");
14432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  String += 4;
14532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
14632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  //
14732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  // Convert the MAC address into a unicode string.
14832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  //
14932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  HwAddress = &MacAddressNode->MacAddress.Addr[0];
15032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  for (Index = 0; Index < HwAddressSize; Index++) {
15132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    String += UnicodeValueToString (String, PREFIX_ZERO | RADIX_HEX, *(HwAddress++), 2);
15232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    if (Index < HwAddressSize - 1) {
15332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi      *String++ = L':';
15432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    }
15532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  }
15632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
15732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  //
15832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  // If VLAN is configured, it will need extra 5 characters like "\0005".
15932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  // Plus one unicode character for the null-terminator.
16032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  //
16132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  Node = (EFI_DEVICE_PATH_PROTOCOL  *)MacAddressNode;
16232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  while (!IsDevicePathEnd (Node)) {
16332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    if (Node->Type == MESSAGING_DEVICE_PATH && Node->SubType == MSG_VLAN_DP) {
16432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi      VlanId = ((VLAN_DEVICE_PATH *) Node)->VlanId;
16532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    }
16632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    Node = NextDevicePathNode (Node);
16732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  }
16832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
16932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  if (VlanId != 0) {
17032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    *String++ = L'\\';
17132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    String += UnicodeValueToString (String, PREFIX_ZERO | RADIX_HEX, VlanId, 4);
17232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  }
17332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
17432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  //
17532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  // Null terminate the Unicode string
17632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  //
17732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  *String = L'\0';
17832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
17932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  return TRUE;
18032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi}
18132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
18232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi/**
18332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  Save question id and prompt id to the mac device list.
18432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  If the same mac address has saved yet, no need to add more.
18532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
18632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  @param MacAddrString               Mac address string.
18732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
18832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  @retval  EFI_SUCCESS               Add the item is successful.
18932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  @return  Other values if failed to Add the item.
19032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi**/
19132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan BiBOOLEAN
19232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan BiAddIdToMacDeviceList (
19332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  IN  EFI_STRING        MacAddrString
19432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  )
19532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi{
19632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  MENU_INFO_ITEM *TempDeviceList;
19732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  UINTN          Index;
19832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  EFI_STRING     StoredString;
19932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  EFI_STRING_ID  PromptId;
20032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  EFI_HII_HANDLE HiiHandle;
20132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
20232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  HiiHandle =   gDeviceManagerPrivate.HiiHandle;
20332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  TempDeviceList = NULL;
20432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
20532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  for (Index = 0; Index < mMacDeviceList.CurListLen; Index ++) {
20632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    StoredString = HiiGetString (HiiHandle, mMacDeviceList.NodeList[Index].PromptId, NULL);
20732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    if (StoredString == NULL) {
20832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi      return FALSE;
20932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    }
21032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
21132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    //
21232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    // Already has save the same mac address to the list.
21332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    //
21432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    if (StrCmp (MacAddrString, StoredString) == 0) {
21532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi      return FALSE;
21632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    }
21732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  }
21832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
21932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  PromptId = HiiSetString(HiiHandle, 0, MacAddrString, NULL);
22032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  //
22132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  // If not in the list, save it.
22232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  //
22332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  if (mMacDeviceList.MaxListLen > mMacDeviceList.CurListLen + 1) {
22432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    mMacDeviceList.NodeList[mMacDeviceList.CurListLen].PromptId = PromptId;
22532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    mMacDeviceList.NodeList[mMacDeviceList.CurListLen].QuestionId = (EFI_QUESTION_ID) (mMacDeviceList.CurListLen + NETWORK_DEVICE_LIST_KEY_OFFSET);
22632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  } else {
22732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    mMacDeviceList.MaxListLen += MAX_MAC_ADDRESS_NODE_LIST_LEN;
22832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    if (mMacDeviceList.CurListLen != 0) {
22932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi      TempDeviceList = (MENU_INFO_ITEM *)AllocateCopyPool (sizeof (MENU_INFO_ITEM) * mMacDeviceList.MaxListLen, (VOID *)mMacDeviceList.NodeList);
23032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    } else {
23132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi      TempDeviceList = (MENU_INFO_ITEM *)AllocatePool (sizeof (MENU_INFO_ITEM) * mMacDeviceList.MaxListLen);
23232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    }
23332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
23432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    if (TempDeviceList == NULL) {
23532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi      return FALSE;
23632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    }
23732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    TempDeviceList[mMacDeviceList.CurListLen].PromptId = PromptId;
23832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    TempDeviceList[mMacDeviceList.CurListLen].QuestionId = (EFI_QUESTION_ID) (mMacDeviceList.CurListLen + NETWORK_DEVICE_LIST_KEY_OFFSET);
23932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
24032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    if (mMacDeviceList.CurListLen > 0) {
24132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi      FreePool(mMacDeviceList.NodeList);
24232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    }
24332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
24432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    mMacDeviceList.NodeList = TempDeviceList;
24532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  }
24632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  mMacDeviceList.CurListLen ++;
24732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
24832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  return TRUE;
24932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi}
25032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
25132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi/**
25232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  Check the devcie path, try to find whether it has mac address path.
25332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
25432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  In this function, first need to check whether this path has mac address path.
25532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  second, when the mac address device path has find, also need to deicide whether
25632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  need to add this mac address relate info to the menu.
25732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
25832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  @param    *Node            Input device which need to be check.
25932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  @param    NextShowFormId   FormId Which need to be show.
26032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  @param    *NeedAddItem     Whether need to add the menu in the network device list.
26132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
26232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  @retval  TRUE              Has mac address device path.
26332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  @retval  FALSE             NOT Has mac address device path.
26432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
26532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi**/
26632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan BiBOOLEAN
26732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan BiIsMacAddressDevicePath (
26832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  IN  VOID          *Node,
26932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  IN EFI_FORM_ID    NextShowFormId,
27032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  OUT BOOLEAN       *NeedAddItem
27132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  )
27232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi{
27332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  EFI_DEVICE_PATH_PROTOCOL   *DevicePath;
27432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  CHAR16                     *Buffer;
27532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  BOOLEAN                    ReturnVal;
27632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
27732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  ASSERT (Node != NULL);
27832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  *NeedAddItem = FALSE;
27932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  ReturnVal    = FALSE;
28032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  Buffer    = NULL;
28132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
28232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) Node;
28332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
28432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  //
28532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  // find the partition device path node
28632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  //
28732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  while (!IsDevicePathEnd (DevicePath)) {
28832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    if ((DevicePathType (DevicePath) == MESSAGING_DEVICE_PATH) &&
28932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi       (DevicePathSubType (DevicePath) == MSG_MAC_ADDR_DP)) {
29032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi      ReturnVal = TRUE;
29132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
29232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi      if (DEVICE_MANAGER_FORM_ID == NextShowFormId) {
29332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi        *NeedAddItem = TRUE;
29432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi        break;
29532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi      }
29632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
29732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi      if (!GetMacAddressString((MAC_ADDR_DEVICE_PATH*)DevicePath, &Buffer)) {
29832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi        break;
29932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi      }
30032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
30132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi      if (NETWORK_DEVICE_FORM_ID == NextShowFormId) {
30232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi        if (StrCmp (Buffer, mSelectedMacAddrString) == 0) {
30332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi          *NeedAddItem = TRUE;
30432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi        }
30532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi        break;
30632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi      }
30732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
30832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi      if (NETWORK_DEVICE_LIST_FORM_ID == NextShowFormId) {
30932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi        //
31032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi        // Same handle may has two network child handle, so the questionid
31132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi        // has the offset of SAME_HANDLE_KEY_OFFSET.
31232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi        //
31332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi        if (AddIdToMacDeviceList (Buffer)) {
31432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi          *NeedAddItem = TRUE;
31532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi        }
31632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi        break;
31732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi      }
31832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    }
31932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    DevicePath = NextDevicePathNode (DevicePath);
32032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  }
32132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
32232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  if (Buffer != NULL) {
32332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    FreePool (Buffer);
32432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  }
32532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
32632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  return ReturnVal;
32732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi}
32832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
32932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi/**
33032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  Check to see if the device path is for the network device.
33132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
33232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  @param Handle          The HII handle which include the mac address device path.
33332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  @param NextShowFormId  The FormId of the form which will be show next time.
33432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  @param ItemCount       The new add Mac address item count.
33532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
33632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  @retval  TRUE          Need to add new item in the menu.
33732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  @return  FALSE         Do not need to add the menu about the network.
33832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
33932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi**/
34032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan BiBOOLEAN
34132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan BiIsNeedAddNetworkMenu (
34232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  IN      EFI_HII_HANDLE      Handle,
34332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  IN      EFI_FORM_ID         NextShowFormId,
34432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  OUT     UINTN               *ItemCount
34532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  )
34632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi{
34732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  EFI_STATUS     Status;
34832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  UINTN          EntryCount;
34932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  UINTN          Index;
35032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  EFI_HANDLE     DriverHandle;
35132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  EFI_HANDLE     ControllerHandle;
35232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  EFI_DEVICE_PATH_PROTOCOL   *DevicePath;
35332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  EFI_DEVICE_PATH_PROTOCOL   *TmpDevicePath;
35432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  EFI_DEVICE_PATH_PROTOCOL   *ChildDevicePath;
35532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  EFI_OPEN_PROTOCOL_INFORMATION_ENTRY   *OpenInfoBuffer;
35632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  BOOLEAN        IsNeedAdd;
35732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
35832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  IsNeedAdd  = FALSE;
35932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  OpenInfoBuffer = NULL;
36032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  if ((Handle == NULL) || (ItemCount == NULL)) {
36132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    return FALSE;
36232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  }
36332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  *ItemCount = 0;
36432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
36532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  Status = gHiiDatabase->GetPackageListHandle (gHiiDatabase, Handle, &DriverHandle);
36632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  if (EFI_ERROR (Status)) {
36732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    return FALSE;
36832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  }
36932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  //
37032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  // Get the device path by the got Driver handle .
37132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  //
37232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  Status = gBS->HandleProtocol (DriverHandle, &gEfiDevicePathProtocolGuid, (VOID **) &DevicePath);
37332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  if (EFI_ERROR (Status)) {
37432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    return FALSE;
37532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  }
37632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  TmpDevicePath = DevicePath;
37732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
37832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  //
37932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  // Check whether this device path include mac address device path.
38032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  // If this path has mac address path, get the value whether need
38132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  // add this info to the menu and return.
38232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  // Else check more about the child handle devcie path.
38332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  //
38432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  if (IsMacAddressDevicePath(TmpDevicePath, NextShowFormId,&IsNeedAdd)) {
38532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    if ((NETWORK_DEVICE_LIST_FORM_ID == NextShowFormId) && IsNeedAdd) {
38632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi      (*ItemCount) = 1;
38732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    }
38832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    return IsNeedAdd;
38932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  }
39032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
39132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  //
39232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  // Search whether this path is the controller path, not he child handle path.
39332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  // And the child handle has the network devcie connected.
39432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  //
39532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  TmpDevicePath = DevicePath;
39632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  Status = gBS->LocateDevicePath(&gEfiDevicePathProtocolGuid, &TmpDevicePath, &ControllerHandle);
39732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  if (EFI_ERROR (Status)) {
39832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    return FALSE;
39932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  }
40032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
40132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  if (!IsDevicePathEnd (TmpDevicePath)) {
40232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    return FALSE;
40332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  }
40432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
40532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  //
40632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  // Retrieve the list of agents that are consuming the specific protocol
40732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  // on ControllerHandle.
40832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  // The buffer point by OpenInfoBuffer need be free at this function.
40932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  //
41032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  Status = gBS->OpenProtocolInformation (
41132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi                  ControllerHandle,
41232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi                  &gEfiPciIoProtocolGuid,
41332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi                  &OpenInfoBuffer,
41432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi                  &EntryCount
41532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi                  );
41632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  if (EFI_ERROR (Status)) {
41732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    return FALSE;
41832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  }
41932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
42032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  //
42132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  // Inspect if ChildHandle is one of the agents.
42232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  //
42332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  Status = EFI_UNSUPPORTED;
42432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  for (Index = 0; Index < EntryCount; Index++) {
42532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    //
42632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    // Query all the children created by the controller handle's driver
42732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    //
42832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    if ((OpenInfoBuffer[Index].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {
42932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi      Status = gBS->OpenProtocol (
43032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi                      OpenInfoBuffer[Index].ControllerHandle,
43132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi                      &gEfiDevicePathProtocolGuid,
43232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi                      (VOID **) &ChildDevicePath,
43332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi                      NULL,
43432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi                      NULL,
43532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi                      EFI_OPEN_PROTOCOL_GET_PROTOCOL
43632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi                      );
43732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi      if (EFI_ERROR (Status)) {
43832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi        continue;
43932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi      }
44032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
44132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi      //
44232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi      // Check whether this device path include mac address device path.
44332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi      //
44432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi      if (!IsMacAddressDevicePath(ChildDevicePath, NextShowFormId,&IsNeedAdd)) {
44532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi        //
44632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi        // If this path not has mac address path, check the other.
44732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi        //
44832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi        continue;
44932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi      } else {
45032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi        //
45132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi        // If need to update the NETWORK_DEVICE_LIST_FORM, try to get more.
45232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi        //
45332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi        if ((NETWORK_DEVICE_LIST_FORM_ID == NextShowFormId)) {
45432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi          if (IsNeedAdd) {
45532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi            (*ItemCount) += 1;
45632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi          }
45732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi          continue;
45832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi        } else {
45932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi          //
46032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi          // If need to update other form, return whether need to add to the menu.
46132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi          //
46232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi          goto Done;
46332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi        }
46432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi      }
46532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    }
46632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  }
46732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
46832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan BiDone:
46932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  if (OpenInfoBuffer != NULL) {
47032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    FreePool (OpenInfoBuffer);
47132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  }
47232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  return IsNeedAdd;
47332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi}
47432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
47532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi/**
47632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  Dynamic create Hii information for Device Manager.
47732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
47832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  @param   NextShowFormId     The FormId which need to be show.
47932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
48032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi**/
48132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan BiVOID
48232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan BiCreateDeviceManagerForm(
48332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  IN EFI_FORM_ID      NextShowFormId
48432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi)
48532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi{
48632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  UINTN                       Index;
48732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  EFI_STRING                  String;
48832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  EFI_STRING_ID               Token;
48932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  EFI_STRING_ID               TokenHelp;
49032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  EFI_HII_HANDLE              *HiiHandles;
49132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  EFI_HII_HANDLE              HiiHandle;
49232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  EFI_GUID                    FormSetGuid;
49332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  VOID                        *StartOpCodeHandle;
49432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  VOID                        *EndOpCodeHandle;
49532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  EFI_IFR_GUID_LABEL          *StartLabel;
49632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  EFI_IFR_GUID_LABEL          *EndLabel;
49732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  BOOLEAN                     AddNetworkMenu;
49832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  UINTN                       AddItemCount;
49932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  UINTN                       NewStringLen;
50032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  EFI_STRING                  NewStringTitle;
50132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  CHAR16                      *DevicePathStr;
50232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  EFI_STRING_ID               DevicePathId;
50332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  EFI_IFR_FORM_SET            *Buffer;
50432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  UINTN                       BufferSize;
50532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  UINT8                       ClassGuidNum;
50632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  EFI_GUID                    *ClassGuid;
50732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  UINTN                       TempSize;
50832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  UINT8                       *Ptr;
50932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  EFI_STATUS                  Status;
51032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
51132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  TempSize =0;
51232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  BufferSize = 0;
51332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  Buffer = NULL;
51432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
51532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  HiiHandle = gDeviceManagerPrivate.HiiHandle;
51632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  AddNetworkMenu = FALSE;
51732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  AddItemCount = 0;
51832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  //
51932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  // If need show the Network device list form, clear the old save list first.
52032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  //
52132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  if ((NextShowFormId == NETWORK_DEVICE_LIST_FORM_ID) && (mMacDeviceList.CurListLen > 0)) {
52232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    mMacDeviceList.CurListLen = 0;
52332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  }
52432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
52532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  //
52632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  // Update the network device form titile.
52732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  //
52832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  if (NextShowFormId == NETWORK_DEVICE_FORM_ID) {
52932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    String = HiiGetString (HiiHandle, STRING_TOKEN (STR_FORM_NETWORK_DEVICE_TITLE), NULL);
53032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    NewStringLen = StrLen(mSelectedMacAddrString) * 2;
53132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    NewStringLen += (StrLen(String) + 2) * 2;
53232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    NewStringTitle = AllocatePool (NewStringLen);
53332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    UnicodeSPrint (NewStringTitle, NewStringLen, L"%s %s", String, mSelectedMacAddrString);
53432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    HiiSetString (HiiHandle, STRING_TOKEN (STR_FORM_NETWORK_DEVICE_TITLE), NewStringTitle, NULL);
53532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    FreePool (String);
53632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    FreePool (NewStringTitle);
53732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  }
53832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
53932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  //
54032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  // Allocate space for creation of UpdateData Buffer
54132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  //
54232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  StartOpCodeHandle = HiiAllocateOpCodeHandle ();
54332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  ASSERT (StartOpCodeHandle != NULL);
54432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
54532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  EndOpCodeHandle = HiiAllocateOpCodeHandle ();
54632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  ASSERT (EndOpCodeHandle != NULL);
54732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
54832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  //
54932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  // Create Hii Extend Label OpCode as the start opcode
55032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  //
55132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (StartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));
55232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
55332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  //
55432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  // According to the next show Form id(mNextShowFormId) to decide which form need to update.
55532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  //
55632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  StartLabel->Number       = (UINT16) (LABEL_FORM_ID_OFFSET + NextShowFormId);
55732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
55832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  //
55932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  // Create Hii Extend Label OpCode as the end opcode
56032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  //
56132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (EndOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));
56232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
56332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  EndLabel->Number       = LABEL_END;
56432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
56532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  //
56632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  // Get all the Hii handles
56732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  //
56832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  HiiHandles = HiiGetHiiHandles (NULL);
56932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  ASSERT (HiiHandles != NULL);
57032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
57132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  //
57232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  // Search for formset of each class type
57332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  //
57432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  for (Index = 0; HiiHandles[Index] != NULL; Index++) {
57532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    Status = HiiGetFormSetFromHiiHandle(HiiHandles[Index], &Buffer,&BufferSize);
57632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    if (EFI_ERROR (Status)){
57732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi      continue;
57832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    }
57932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    Ptr = (UINT8 *)Buffer;
58032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    while(TempSize < BufferSize)  {
58132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi      TempSize += ((EFI_IFR_OP_HEADER *) Ptr)->Length;
58232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi      if (((EFI_IFR_OP_HEADER *) Ptr)->Length <= OFFSET_OF (EFI_IFR_FORM_SET, Flags)){
58332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi        Ptr += ((EFI_IFR_OP_HEADER *) Ptr)->Length;
58432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi        continue;
58532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi      }
58632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
58732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi      ClassGuidNum = (UINT8) (((EFI_IFR_FORM_SET *)Ptr)->Flags & 0x3);
58832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi      ClassGuid = (EFI_GUID *) (VOID *)(Ptr + sizeof (EFI_IFR_FORM_SET));
58932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi      while (ClassGuidNum-- > 0) {
59032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi        if (CompareGuid (&gEfiHiiPlatformSetupFormsetGuid, ClassGuid)== 0) {
59132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi          ClassGuid ++;
59232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi          continue;
59332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi        }
59432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
59532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi        String = HiiGetString (HiiHandles[Index], ((EFI_IFR_FORM_SET *)Ptr)->FormSetTitle, NULL);
59632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi        if (String == NULL) {
59732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi          String = HiiGetString (HiiHandle, STRING_TOKEN (STR_MISSING_STRING), NULL);
59832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi          ASSERT (String != NULL);
59932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi        }
60032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi        Token = HiiSetString (HiiHandle, 0, String, NULL);
60132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi        FreePool (String);
60232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
60332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi        String = HiiGetString (HiiHandles[Index], ((EFI_IFR_FORM_SET *)Ptr)->Help, NULL);
60432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi        if (String == NULL) {
60532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi          String = HiiGetString (HiiHandle, STRING_TOKEN (STR_MISSING_STRING), NULL);
60632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi          ASSERT (String != NULL);
60732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi        }
60832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi        TokenHelp = HiiSetString (HiiHandle, 0, String, NULL);
60932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi        FreePool (String);
61032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
61132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi        FormSetGuid = ((EFI_IFR_FORM_SET *)Ptr)->Guid;
61232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
61332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi        //
61432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi        // Network device process
61532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi        //
61632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi        if (IsNeedAddNetworkMenu (HiiHandles[Index], NextShowFormId,&AddItemCount)) {
61732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi          if (NextShowFormId == DEVICE_MANAGER_FORM_ID) {
61832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi            //
61932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi            // Only show one menu item "Network Config" in the device manger form.
62032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi            //
62132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi            if (!AddNetworkMenu) {
62232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi              AddNetworkMenu = TRUE;
62332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi              HiiCreateGotoOpCode (
62432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi                StartOpCodeHandle,
62532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi                NETWORK_DEVICE_LIST_FORM_ID,
62632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi                STRING_TOKEN (STR_FORM_NETWORK_DEVICE_LIST_TITLE),
62732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi                STRING_TOKEN (STR_FORM_NETWORK_DEVICE_LIST_HELP),
62832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi                EFI_IFR_FLAG_CALLBACK,
62932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi                (EFI_QUESTION_ID) QUESTION_NETWORK_DEVICE_ID
63032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi              );
63132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi            }
63232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi          } else if (NextShowFormId == NETWORK_DEVICE_LIST_FORM_ID) {
63332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi            //
63432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi            // In network device list form, same mac address device only show one menu.
63532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi            //
63632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi            while (AddItemCount > 0) {
63732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi              HiiCreateGotoOpCode (
63832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi                StartOpCodeHandle,
63932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi                NETWORK_DEVICE_FORM_ID,
64032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi                mMacDeviceList.NodeList[mMacDeviceList.CurListLen - AddItemCount].PromptId,
64132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi                STRING_TOKEN (STR_NETWORK_DEVICE_HELP),
64232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi                EFI_IFR_FLAG_CALLBACK,
64332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi                mMacDeviceList.NodeList[mMacDeviceList.CurListLen - AddItemCount].QuestionId
64432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi              );
64532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi              AddItemCount -= 1;
64632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi            }
64732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi          } else if (NextShowFormId == NETWORK_DEVICE_FORM_ID) {
64832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi            //
64932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi            // In network device form, only the selected mac address device need to be show.
65032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi            //
65132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi            DevicePathStr = DmExtractDevicePathFromHiiHandle(HiiHandles[Index]);
65232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi            DevicePathId  = 0;
65332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi            if (DevicePathStr != NULL){
65432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi              DevicePathId =  HiiSetString (HiiHandle, 0, DevicePathStr, NULL);
65532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi              FreePool(DevicePathStr);
65632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi            }
65732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi            HiiCreateGotoExOpCode (
65832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi              StartOpCodeHandle,
65932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi              0,
66032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi              Token,
66132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi              TokenHelp,
66232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi              0,
66332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi              (EFI_QUESTION_ID) (Index + DEVICE_KEY_OFFSET),
66432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi              0,
66532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi              &FormSetGuid,
66632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi              DevicePathId
66732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi            );
66832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi          }
66932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi        } else {
67032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi          //
67132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi          // Not network device process, only need to show at device manger form.
67232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi          //
67332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi          if (NextShowFormId == DEVICE_MANAGER_FORM_ID) {
67432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi            DevicePathStr = DmExtractDevicePathFromHiiHandle(HiiHandles[Index]);
67532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi            DevicePathId  = 0;
67632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi            if (DevicePathStr != NULL){
67732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi              DevicePathId =  HiiSetString (HiiHandle, 0, DevicePathStr, NULL);
67832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi              FreePool(DevicePathStr);
67932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi            }
68032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi            HiiCreateGotoExOpCode (
68132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi              StartOpCodeHandle,
68232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi              0,
68332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi              Token,
68432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi              TokenHelp,
68532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi              0,
68632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi              (EFI_QUESTION_ID) (Index + DEVICE_KEY_OFFSET),
68732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi              0,
68832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi              &FormSetGuid,
68932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi              DevicePathId
69032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi            );
69132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi          }
69232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi        }
69332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi        break;
69432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi      }
69532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
69632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi      Ptr += ((EFI_IFR_OP_HEADER *) Ptr)->Length;
69732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    }
69832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    FreePool(Buffer);
69932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    Buffer = NULL;
70032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    TempSize = 0;
70132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    BufferSize = 0;
70232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  }
70332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
70432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  HiiUpdateForm (
70532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    HiiHandle,
70632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    &mDeviceManagerGuid,
70732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    NextShowFormId,
70832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    StartOpCodeHandle,
70932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    EndOpCodeHandle
71032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    );
71132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
71232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  HiiFreeOpCodeHandle (StartOpCodeHandle);
71332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  HiiFreeOpCodeHandle (EndOpCodeHandle);
71432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  FreePool (HiiHandles);
71532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi}
71632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
71732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi/**
71832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  This function allows a caller to extract the current configuration for one
71932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  or more named elements from the target driver.
72032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
72132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
72232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  @param This            Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
72332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  @param Request         A null-terminated Unicode string in <ConfigRequest> format.
72432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  @param Progress        On return, points to a character in the Request string.
72532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi                         Points to the string's null terminator if request was successful.
72632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi                         Points to the most recent '&' before the first failing name/value
72732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi                         pair (or the beginning of the string if the failure is in the
72832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi                         first name/value pair) if the request was not successful.
72932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  @param Results         A null-terminated Unicode string in <ConfigAltResp> format which
73032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi                         has all values filled in for the names in the Request string.
73132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi                         String to be allocated by the called function.
73232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
73332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  @retval  EFI_SUCCESS            The Results is filled with the requested values.
73432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  @retval  EFI_OUT_OF_RESOURCES   Not enough memory to store the results.
73532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  @retval  EFI_INVALID_PARAMETER  Request is illegal syntax, or unknown name.
73632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  @retval  EFI_NOT_FOUND          Routing data doesn't match any storage in this driver.
73732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
73832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi**/
73932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan BiEFI_STATUS
74032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan BiEFIAPI
74132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan BiDeviceManagerExtractConfig (
74232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,
74332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  IN  CONST EFI_STRING                       Request,
74432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  OUT EFI_STRING                             *Progress,
74532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  OUT EFI_STRING                             *Results
74632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  )
74732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi{
74832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  if (Progress == NULL || Results == NULL) {
74932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    return EFI_INVALID_PARAMETER;
75032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  }
75132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  *Progress = Request;
75232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  return EFI_NOT_FOUND;
75332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi}
75432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
75532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi/**
75632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  This function processes the results of changes in configuration.
75732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
75832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  @param This            Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
75932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  @param Configuration   A null-terminated Unicode string in <ConfigResp> format.
76032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  @param Progress        A pointer to a string filled in with the offset of the most
76132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi                         recent '&' before the first failing name/value pair (or the
76232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi                         beginning of the string if the failure is in the first
76332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi                         name/value pair) or the terminating NULL if all was successful.
76432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
76532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  @retval  EFI_SUCCESS            The Results is processed successfully.
76632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  @retval  EFI_INVALID_PARAMETER  Configuration is NULL.
76732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  @retval  EFI_NOT_FOUND          Routing data doesn't match any storage in this driver.
76832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
76932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi**/
77032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan BiEFI_STATUS
77132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan BiEFIAPI
77232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan BiDeviceManagerRouteConfig (
77332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,
77432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  IN  CONST EFI_STRING                       Configuration,
77532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  OUT EFI_STRING                             *Progress
77632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  )
77732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi{
77832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  if (Configuration == NULL || Progress == NULL) {
77932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    return EFI_INVALID_PARAMETER;
78032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  }
78132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
78232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  *Progress = Configuration;
78332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
78432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  return EFI_NOT_FOUND;
78532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi}
78632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
78732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi/**
78832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  This function is invoked if user selected a interactive opcode from Device Manager's
78932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  Formset. If user set VBIOS, the new value is saved to EFI variable.
79032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
79132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  @param This            Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
79232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  @param Action          Specifies the type of action taken by the browser.
79332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  @param QuestionId      A unique value which is sent to the original exporting driver
79432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi                         so that it can identify the type of data to expect.
79532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  @param Type            The type of value for the question.
79632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  @param Value           A pointer to the data being sent to the original exporting driver.
79732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  @param ActionRequest   On return, points to the action requested by the callback function.
79832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
79932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  @retval  EFI_SUCCESS           The callback successfully handled the action.
80032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  @retval  EFI_INVALID_PARAMETER The setup browser call this function with invalid parameters.
80132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
80232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi**/
80332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan BiEFI_STATUS
80432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan BiEFIAPI
80532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan BiDeviceManagerCallback (
80632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,
80732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  IN  EFI_BROWSER_ACTION                     Action,
80832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  IN  EFI_QUESTION_ID                        QuestionId,
80932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  IN  UINT8                                  Type,
81032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  IN  EFI_IFR_TYPE_VALUE                     *Value,
81132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  OUT EFI_BROWSER_ACTION_REQUEST             *ActionRequest
81232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  )
81332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi{
81432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  UINTN CurIndex;
81532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
81632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  if (Action != EFI_BROWSER_ACTION_CHANGING) {
81732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    //
81832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    // Do nothing for other UEFI Action. Only do call back when data is changed.
81932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    //
82032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    return EFI_UNSUPPORTED;
82132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  }
82232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  if ((Value == NULL) || (ActionRequest == NULL)) {
82332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    return EFI_INVALID_PARAMETER;
82432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  }
82532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  if ((QuestionId < MAX_KEY_SECTION_LEN + NETWORK_DEVICE_LIST_KEY_OFFSET) && (QuestionId >= NETWORK_DEVICE_LIST_KEY_OFFSET)) {
82632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    //
82732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    // If user select the mac address, need to record mac address string to support next form show.
82832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    //
82932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    for (CurIndex = 0; CurIndex < mMacDeviceList.CurListLen; CurIndex ++) {
83032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi      if (mMacDeviceList.NodeList[CurIndex].QuestionId == QuestionId) {
83132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi         mSelectedMacAddrString = HiiGetString (gDeviceManagerPrivate.HiiHandle, mMacDeviceList.NodeList[CurIndex].PromptId, NULL);
83232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi      }
83332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    }
83432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    CreateDeviceManagerForm(NETWORK_DEVICE_FORM_ID);
83532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  } else if(QuestionId == QUESTION_NETWORK_DEVICE_ID){
83632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi    CreateDeviceManagerForm(NETWORK_DEVICE_LIST_FORM_ID);
83732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  }
83832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
83932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  return EFI_SUCCESS;
84032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi}
84132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
84232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi/**
84332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  Install Boot Manager Menu driver.
84432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
84532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  @param ImageHandle     The image handle.
84632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  @param SystemTable     The system table.
84732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
84832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  @retval  EFI_SUCEESS  Install Boot manager menu success.
84932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  @retval  Other        Return error status.
85032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
85132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi**/
85232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan BiEFI_STATUS
85332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan BiEFIAPI
8543910f6691869a1cf9220ae7b9f419a41d915479bDandan BiDeviceManagerUiLibConstructor (
85532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  IN EFI_HANDLE                            ImageHandle,
85632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  IN EFI_SYSTEM_TABLE                      *SystemTable
85732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi)
85832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi{
85932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  EFI_STATUS                  Status;
86032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
86132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  gDeviceManagerPrivate.DriverHandle = NULL;
86232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  Status = gBS->InstallMultipleProtocolInterfaces (
86332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi                  &gDeviceManagerPrivate.DriverHandle,
86432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi                  &gEfiDevicePathProtocolGuid,
86532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi                  &mDeviceManagerHiiVendorDevicePath,
86632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi                  &gEfiHiiConfigAccessProtocolGuid,
86732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi                  &gDeviceManagerPrivate.ConfigAccess,
86832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi                  NULL
86932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi                  );
87032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  ASSERT_EFI_ERROR (Status);
87132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
87232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  //
87332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  // Publish our HII data.
87432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  //
87532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  gDeviceManagerPrivate.HiiHandle = HiiAddPackages (
87632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi                  &mDeviceManagerGuid,
87732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi                  gDeviceManagerPrivate.DriverHandle,
87832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi                  DeviceManagerVfrBin,
8793910f6691869a1cf9220ae7b9f419a41d915479bDandan Bi                  DeviceManagerUiLibStrings,
88032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi                  NULL
88132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi                  );
88232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  ASSERT (gDeviceManagerPrivate.HiiHandle != NULL);
88332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
88432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  //
88532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  // Update boot manager page
88632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  //
88732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  CreateDeviceManagerForm (DEVICE_MANAGER_FORM_ID);
88832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
88932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  return EFI_SUCCESS;
89032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi}
89132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
89232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi/**
89332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  Unloads the application and its installed protocol.
89432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
89532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  @param  ImageHandle     Handle that identifies the image to be unloaded.
89632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  @param  SystemTable     The system table.
89732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
89832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  @retval EFI_SUCCESS           The image has been unloaded.
89932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi**/
90032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan BiEFI_STATUS
90132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan BiEFIAPI
9023910f6691869a1cf9220ae7b9f419a41d915479bDandan BiDeviceManagerUiLibDestructor(
90332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  IN EFI_HANDLE                            ImageHandle,
90432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  IN EFI_SYSTEM_TABLE                      *SystemTable
90532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi)
90632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi{
90732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  EFI_STATUS                  Status;
90832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
90932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  Status = gBS->UninstallMultipleProtocolInterfaces (
91032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi                  gDeviceManagerPrivate.DriverHandle,
91132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi                  &gEfiDevicePathProtocolGuid,
91232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi                  &mDeviceManagerHiiVendorDevicePath,
91332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi                  &gEfiHiiConfigAccessProtocolGuid,
91432465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi                  &gDeviceManagerPrivate.ConfigAccess,
91532465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi                  NULL
91632465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi                  );
91732465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  ASSERT_EFI_ERROR (Status);
91832465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
91932465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  HiiRemovePackages (gDeviceManagerPrivate.HiiHandle);
92032465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
92132465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi  return EFI_SUCCESS;
92232465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi}
92332465d9ae7eed891154780f0b13fabf0b15ae7c3Dandan Bi
924