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