From f6f910dd125144707e3516bbb517b8ec7a388c06 Mon Sep 17 00:00:00 2001
From: rsun3 <rsun3@6f19259b-4bc3-4df7-8a09-765794883524>
Date: Thu, 2 Apr 2009 08:48:03 +0000
Subject: [PATCH] Retire Extended HII library class.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@8011 6f19259b-4bc3-4df7-8a09-765794883524
---
 DuetPkg/DuetPkg.dsc                           |   1 -
 .../FrameworkHiiOnUefiHiiThunk/ConfigAccess.c |  39 ++++-
 .../FrameworkHiiOnUefiHiiThunk.inf            |   1 -
 .../FrameworkHiiOnUefiHiiThunk/HiiDatabase.h  |  12 +-
 EdkCompatibilityPkg/EdkCompatibilityPkg.dsc   |   1 -
 .../IntelFrameworkModulePkg.dsc               |   1 -
 .../Universal/BdsDxe/Bds.h                    |  14 +-
 .../Universal/BdsDxe/BdsDxe.inf               |   1 -
 .../Universal/BdsDxe/BootMaint/BootMaint.c    |  85 +++++++---
 .../Universal/BdsDxe/BootMngr/BootManager.c   |  45 ++++--
 .../Universal/BdsDxe/BootMngr/BootManager.h   |   2 +-
 .../BdsDxe/DeviceMngr/DeviceManager.c         |  43 ++++--
 .../Universal/BdsDxe/FrontPage.c              |  43 ++++--
 .../Universal/BdsDxe/Language.c               |  12 +-
 .../Universal/BdsDxe/String.c                 |  11 +-
 .../Application/PlatOverMngr/PlatOverMngr.c   |  74 ++++++---
 .../Application/PlatOverMngr/PlatOverMngr.inf |   3 +-
 MdeModulePkg/Include/Guid/MdeModuleHii.h      |  20 ---
 MdeModulePkg/Include/Library/ExtendedHiiLib.h |  57 -------
 .../Library/ExtendedHiiLib/ExtendedHiiLib.c   | 145 ------------------
 .../Library/ExtendedHiiLib/ExtendedHiiLib.inf |  48 ------
 MdeModulePkg/MdeModulePkg.dec                 |   5 -
 MdeModulePkg/MdeModulePkg.dsc                 |   2 -
 .../Universal/DriverSampleDxe/DriverSample.c  |  83 ++++++++--
 .../Universal/DriverSampleDxe/DriverSample.h  |  14 +-
 .../DriverSampleDxe/DriverSampleDxe.inf       |   1 -
 .../Universal/Network/IScsiDxe/IScsiConfig.c  |  61 +++++---
 .../Universal/Network/IScsiDxe/IScsiConfig.h  |  14 +-
 .../Universal/Network/IScsiDxe/IScsiDxe.inf   |   1 -
 .../Universal/SetupBrowserDxe/Setup.c         |   6 +-
 .../Universal/SetupBrowserDxe/Setup.h         |   1 -
 .../SetupBrowserDxe/SetupBrowserDxe.inf       |   1 -
 Nt32Pkg/Nt32Pkg.dsc                           |   1 -
 UnixPkg/UnixPkg.dsc                           |   1 -
 34 files changed, 403 insertions(+), 446 deletions(-)
 delete mode 100644 MdeModulePkg/Include/Library/ExtendedHiiLib.h
 delete mode 100644 MdeModulePkg/Library/ExtendedHiiLib/ExtendedHiiLib.c
 delete mode 100644 MdeModulePkg/Library/ExtendedHiiLib/ExtendedHiiLib.inf

diff --git a/DuetPkg/DuetPkg.dsc b/DuetPkg/DuetPkg.dsc
index 7c8153b3d2..cfb02df523 100644
--- a/DuetPkg/DuetPkg.dsc
+++ b/DuetPkg/DuetPkg.dsc
@@ -32,7 +32,6 @@
   ExtendedIfrSupportLib|MdeModulePkg/Library/ExtendedIfrSupportLib/ExtendedIfrSupportLib.inf
   GenericBdsLib|IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsLib.inf
   PerformanceLib|MdePkg/Library/BasePerformanceLibNull/BasePerformanceLibNull.inf
-  ExtendedHiiLib|MdeModulePkg/Library/ExtendedHiiLib/ExtendedHiiLib.inf
   CapsuleLib|MdeModulePkg/Library/DxeCapsuleLibNull/DxeCapsuleLibNull.inf
   DxeServicesLib|MdePkg/Library/DxeServicesLib/DxeServicesLib.inf
   PeCoffGetEntryPointLib|MdePkg/Library/BasePeCoffGetEntryPointLib/BasePeCoffGetEntryPointLib.inf
diff --git a/EdkCompatibilityPkg/Compatibility/FrameworkHiiOnUefiHiiThunk/ConfigAccess.c b/EdkCompatibilityPkg/Compatibility/FrameworkHiiOnUefiHiiThunk/ConfigAccess.c
index 6be0496c61..341d31cb1c 100644
--- a/EdkCompatibilityPkg/Compatibility/FrameworkHiiOnUefiHiiThunk/ConfigAccess.c
+++ b/EdkCompatibilityPkg/Compatibility/FrameworkHiiOnUefiHiiThunk/ConfigAccess.c
@@ -19,6 +19,31 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 
 BOOLEAN            mHiiPackageListUpdated = FALSE;
 
+HII_VENDOR_DEVICE_PATH  mUefiHiiVendorDevicePath = {
+  {
+    {
+      HARDWARE_DEVICE_PATH,
+      HW_VENDOR_DP,
+      {
+        (UINT8) (sizeof (VENDOR_DEVICE_PATH)),
+        (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)
+      }
+    },
+    //
+    // {2A1F1827-03E2-4b2f-83DE-89B6073A0182}
+    //
+    { 0x2a1f1827, 0x3e2, 0x4b2f, { 0x83, 0xde, 0x89, 0xb6, 0x7, 0x3a, 0x1, 0x82 } }
+  },
+  {
+    END_DEVICE_PATH_TYPE,
+    END_ENTIRE_DEVICE_PATH_SUBTYPE,
+    { 
+      (UINT8) (END_DEVICE_PATH_LENGTH),
+      (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)
+    }
+  }
+};
+
 CONFIG_ACCESS_PRIVATE gConfigAccessPrivateTempate = {
   CONFIG_ACCESS_PRIVATE_SIGNATURE,
   {
@@ -198,9 +223,6 @@ InstallDefaultConfigAccessProtocol (
 
   ASSERT (ThunkContext->IfrPackageCount != 0);
 
-  Status = HiiLibCreateHiiDriverHandle (&ThunkContext->UefiHiiDriverHandle);
-  ASSERT_EFI_ERROR (Status);
-  
   ConfigAccessInstance = AllocateCopyPool (
                            sizeof (CONFIG_ACCESS_PRIVATE), 
                            &gConfigAccessPrivateTempate
@@ -209,6 +231,8 @@ InstallDefaultConfigAccessProtocol (
   
   Status = gBS->InstallMultipleProtocolInterfaces (
           &ThunkContext->UefiHiiDriverHandle,
+          &gEfiDevicePathProtocolGuid,          
+          &mUefiHiiVendorDevicePath,
           &gEfiHiiConfigAccessProtocolGuid,
           &ConfigAccessInstance->ConfigAccessProtocol,
           NULL
@@ -237,8 +261,6 @@ UninstallDefaultConfigAccessProtocol (
   EFI_STATUS                      Status;
   EFI_HII_CONFIG_ACCESS_PROTOCOL  *ConfigAccess;
   
-  HiiLibDestroyHiiDriverHandle (ThunkContext->UefiHiiDriverHandle);
-
   Status = gBS->HandleProtocol (
                   ThunkContext->UefiHiiDriverHandle,
                   &gEfiHiiConfigAccessProtocolGuid,
@@ -246,10 +268,13 @@ UninstallDefaultConfigAccessProtocol (
                   );
   ASSERT_EFI_ERROR (Status);
 
-  Status = gBS->UninstallProtocolInterface (
+  Status = gBS->UninstallMultipleProtocolInterfaces (
                   ThunkContext->UefiHiiDriverHandle,
+                  &gEfiDevicePathProtocolGuid,
+                  &mUefiHiiVendorDevicePath,
                   &gEfiHiiConfigAccessProtocolGuid,
-                  ConfigAccess
+                  ConfigAccess,
+                  NULL
                   );
   ASSERT_EFI_ERROR (Status);
 
diff --git a/EdkCompatibilityPkg/Compatibility/FrameworkHiiOnUefiHiiThunk/FrameworkHiiOnUefiHiiThunk.inf b/EdkCompatibilityPkg/Compatibility/FrameworkHiiOnUefiHiiThunk/FrameworkHiiOnUefiHiiThunk.inf
index 4a7ae4d0f8..9b09c0b52d 100644
--- a/EdkCompatibilityPkg/Compatibility/FrameworkHiiOnUefiHiiThunk/FrameworkHiiOnUefiHiiThunk.inf
+++ b/EdkCompatibilityPkg/Compatibility/FrameworkHiiOnUefiHiiThunk/FrameworkHiiOnUefiHiiThunk.inf
@@ -76,7 +76,6 @@
   DebugLib
   BaseLib
   HiiLib
-  ExtendedHiiLib
   IfrSupportLib
   ExtendedIfrSupportLib
   PrintLib
diff --git a/EdkCompatibilityPkg/Compatibility/FrameworkHiiOnUefiHiiThunk/HiiDatabase.h b/EdkCompatibilityPkg/Compatibility/FrameworkHiiOnUefiHiiThunk/HiiDatabase.h
index f09c3cea92..94b79e5e2d 100644
--- a/EdkCompatibilityPkg/Compatibility/FrameworkHiiOnUefiHiiThunk/HiiDatabase.h
+++ b/EdkCompatibilityPkg/Compatibility/FrameworkHiiOnUefiHiiThunk/HiiDatabase.h
@@ -45,7 +45,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #include <Library/UefiBootServicesTableLib.h>
 #include <Library/UefiRuntimeServicesTableLib.h>
 #include <Library/HiiLib.h>
-#include <Library/ExtendedHiiLib.h>
+#include <Library/DevicePathLib.h>
 #include <Library/UefiLib.h>
 
 #include <Library/IfrSupportLib.h>
@@ -185,7 +185,17 @@ typedef struct {
   UINT16     VarStoreId;
 } BUFFER_STORAGE_ENTRY;
 
+#pragma pack(1)
 
+///
+/// HII specific Vendor Device Path definition.
+///
+typedef struct {
+  VENDOR_DEVICE_PATH             VendorDevicePath;
+  EFI_DEVICE_PATH_PROTOCOL       End;
+} HII_VENDOR_DEVICE_PATH;
+
+#pragma pack()
 
 #define CONFIG_ACCESS_PRIVATE_SIGNATURE            SIGNATURE_32 ('H', 'T', 'c', 'a')
 #define CONFIG_ACCESS_PRIVATE_FROM_PROTOCOL(Record) CR(Record, CONFIG_ACCESS_PRIVATE, ConfigAccessProtocol, CONFIG_ACCESS_PRIVATE_SIGNATURE)
diff --git a/EdkCompatibilityPkg/EdkCompatibilityPkg.dsc b/EdkCompatibilityPkg/EdkCompatibilityPkg.dsc
index b73fce94c3..00c08bdca6 100644
--- a/EdkCompatibilityPkg/EdkCompatibilityPkg.dsc
+++ b/EdkCompatibilityPkg/EdkCompatibilityPkg.dsc
@@ -46,7 +46,6 @@ define GCC_MACRO                 = -DEFI_SPECIFICATION_VERSION=0x00020000 -DPI_S
   SynchronizationLib|MdePkg/Library/BaseSynchronizationLib/BaseSynchronizationLib.inf
   UefiBootServicesTableLib|MdePkg/Library/UefiBootServicesTableLib/UefiBootServicesTableLib.inf
   HiiLib|MdeModulePkg/Library/UefiHiiLib/UefiHiiLib.inf
-  ExtendedHiiLib|MdeModulePkg/Library/ExtendedHiiLib/ExtendedHiiLib.inf
   IfrSupportLib|MdeModulePkg/Library/UefiIfrSupportLib/UefiIfrSupportLib.inf
   ExtendedIfrSupportLib|MdeModulePkg/Library/ExtendedIfrSupportLib/ExtendedIfrSupportLib.inf
   UefiRuntimeServicesTableLib|MdePkg/Library/UefiRuntimeServicesTableLib/UefiRuntimeServicesTableLib.inf
diff --git a/IntelFrameworkModulePkg/IntelFrameworkModulePkg.dsc b/IntelFrameworkModulePkg/IntelFrameworkModulePkg.dsc
index 058b100b5b..3fc9e41b9f 100644
--- a/IntelFrameworkModulePkg/IntelFrameworkModulePkg.dsc
+++ b/IntelFrameworkModulePkg/IntelFrameworkModulePkg.dsc
@@ -63,7 +63,6 @@
   ExtendedIfrSupportLib|MdeModulePkg/Library/ExtendedIfrSupportLib/ExtendedIfrSupportLib.inf
   GenericBdsLib|IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsLib.inf
   HiiLib|MdeModulePkg/Library/UefiHiiLib/UefiHiiLib.inf
-  ExtendedHiiLib|MdeModulePkg/Library/ExtendedHiiLib/ExtendedHiiLib.inf
   PlatformBdsLib|IntelFrameworkModulePkg/Library/PlatformBdsLibNull/PlatformBdsLibNull.inf
   CapsuleLib|MdeModulePkg/Library/DxeCapsuleLibNull/DxeCapsuleLibNull.inf
   PeCoffGetEntryPointLib|MdePkg/Library/BasePeCoffGetEntryPointLib/BasePeCoffGetEntryPointLib.inf
diff --git a/IntelFrameworkModulePkg/Universal/BdsDxe/Bds.h b/IntelFrameworkModulePkg/Universal/BdsDxe/Bds.h
index 50e5689cce..34327ce77e 100644
--- a/IntelFrameworkModulePkg/Universal/BdsDxe/Bds.h
+++ b/IntelFrameworkModulePkg/Universal/BdsDxe/Bds.h
@@ -60,7 +60,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #include <Library/PcdLib.h>
 #include <Library/CapsuleLib.h>
 #include <Library/HiiLib.h>
-#include <Library/ExtendedHiiLib.h>
+#include <Library/DevicePathLib.h>
 #include <Library/PcdLib.h>
 
 #include <Library/GenericBdsLib.h>
@@ -73,6 +73,18 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
       EFI_BDS_ARCH_PROTOCOL_INSTANCE_SIGNATURE          \
       )
 
+#pragma pack(1)
+
+///
+/// HII specific Vendor Device Path definition.
+///
+typedef struct {
+  VENDOR_DEVICE_PATH             VendorDevicePath;
+  EFI_DEVICE_PATH_PROTOCOL       End;
+} HII_VENDOR_DEVICE_PATH;
+
+#pragma pack()
+
 /**
 
   Show progress bar with title above it. It only works in Graphics mode.
diff --git a/IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf b/IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf
index 2daacb6d6f..08f36f247c 100644
--- a/IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf
+++ b/IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf
@@ -107,7 +107,6 @@
   DebugLib
   PrintLib
   HiiLib
-  ExtendedHiiLib
   UefiDriverEntryPoint
   PlatformBdsLib
   CapsuleLib
diff --git a/IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/BootMaint.c b/IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/BootMaint.c
index d935347487..efc862e64b 100644
--- a/IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/BootMaint.c
+++ b/IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/BootMaint.c
@@ -28,6 +28,55 @@ EFI_DEVICE_PATH_PROTOCOL  EndDevicePath[] = {
   }
 };
 
+HII_VENDOR_DEVICE_PATH  mBmmHiiVendorDevicePath = {
+  {
+    {
+      HARDWARE_DEVICE_PATH,
+      HW_VENDOR_DP,
+      {
+        (UINT8) (sizeof (VENDOR_DEVICE_PATH)),
+        (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)
+      }
+    },
+    //
+    // {165A028F-0BB2-4b5f-8747-77592E3F6499}
+    //
+    { 0x165a028f, 0xbb2, 0x4b5f, { 0x87, 0x47, 0x77, 0x59, 0x2e, 0x3f, 0x64, 0x99 } }
+  },
+  {
+    END_DEVICE_PATH_TYPE,
+    END_ENTIRE_DEVICE_PATH_SUBTYPE,
+    { 
+      (UINT8) (END_DEVICE_PATH_LENGTH),
+      (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)
+    }
+  }
+};
+
+HII_VENDOR_DEVICE_PATH  mFeHiiVendorDevicePath = {
+  {
+    {
+      HARDWARE_DEVICE_PATH,
+      HW_VENDOR_DP,
+      {
+        (UINT8) (sizeof (VENDOR_DEVICE_PATH)),
+        (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)
+      }
+    },
+    //
+    // {91DB4238-B0C8-472e-BBCF-F3A6541010F4}
+    //
+    { 0x91db4238, 0xb0c8, 0x472e, { 0xbb, 0xcf, 0xf3, 0xa6, 0x54, 0x10, 0x10, 0xf4 } }
+  },
+  {
+    END_DEVICE_PATH_TYPE,
+    END_ENTIRE_DEVICE_PATH_SUBTYPE,
+    { 
+      (UINT8) (END_DEVICE_PATH_LENGTH),
+      (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)
+    }
+  }
+};
 
 EFI_GUID EfiLegacyDevOrderGuid  = EFI_LEGACY_DEV_ORDER_VARIABLE_GUID;
 EFI_GUID mBootMaintGuid         = BOOT_MAINT_FORMSET_GUID;
@@ -850,42 +899,30 @@ InitializeBM (
   BmmCallbackInfo->FeDisplayContext              = UNKNOWN_CONTEXT;
 
   //
-  // Create driver handle used by HII database
+  // Install Device Path Protocol and Config Access protocol to driver handle
   //
-  Status = HiiLibCreateHiiDriverHandle (&BmmCallbackInfo->BmmDriverHandle);
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  //
-  // Install Config Access protocol to driver handle
-  //
-  Status = gBS->InstallProtocolInterface (
+  Status = gBS->InstallMultipleProtocolInterfaces (
                   &BmmCallbackInfo->BmmDriverHandle,
+                  &gEfiDevicePathProtocolGuid,
+                  &mBmmHiiVendorDevicePath,
                   &gEfiHiiConfigAccessProtocolGuid,
-                  EFI_NATIVE_INTERFACE,
-                  &BmmCallbackInfo->BmmConfigAccess
+                  &BmmCallbackInfo->BmmConfigAccess,
+                  NULL
                   );
   if (EFI_ERROR (Status)) {
     return Status;
   }
 
   //
-  // Create driver handle used by HII database
+  // Install Device Path Protocol and Config Access protocol to driver handle
   //
-  Status = HiiLibCreateHiiDriverHandle (&BmmCallbackInfo->FeDriverHandle);
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  //
-  // Install Config Access protocol to driver handle
-  //
-  Status = gBS->InstallProtocolInterface (
+  Status = gBS->InstallMultipleProtocolInterfaces (
                   &BmmCallbackInfo->FeDriverHandle,
+                  &gEfiDevicePathProtocolGuid,
+                  &mFeHiiVendorDevicePath,
                   &gEfiHiiConfigAccessProtocolGuid,
-                  EFI_NATIVE_INTERFACE,
-                  &BmmCallbackInfo->FeConfigAccess
+                  &BmmCallbackInfo->FeConfigAccess,
+                  NULL
                   );
   if (EFI_ERROR (Status)) {
     return Status;
diff --git a/IntelFrameworkModulePkg/Universal/BdsDxe/BootMngr/BootManager.c b/IntelFrameworkModulePkg/Universal/BdsDxe/BootMngr/BootManager.c
index a1612cd1b1..615c189d8d 100644
--- a/IntelFrameworkModulePkg/Universal/BdsDxe/BootMngr/BootManager.c
+++ b/IntelFrameworkModulePkg/Universal/BdsDxe/BootMngr/BootManager.c
@@ -19,6 +19,31 @@ EFI_GUID           mBootManagerGuid = BOOT_MANAGER_FORMSET_GUID;
 LIST_ENTRY         *mBootOptionsList;
 BDS_COMMON_OPTION  *gOption;
 
+HII_VENDOR_DEVICE_PATH  mBootManagerHiiVendorDevicePath = {
+  {
+    {
+      HARDWARE_DEVICE_PATH,
+      HW_VENDOR_DP,
+      {
+        (UINT8) (sizeof (VENDOR_DEVICE_PATH)),
+        (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)
+      }
+    },
+    //
+    // {1DDDBE15-481D-4d2b-8277-B191EAF66525}
+    //
+    { 0x1dddbe15, 0x481d, 0x4d2b, { 0x82, 0x77, 0xb1, 0x91, 0xea, 0xf6, 0x65, 0x25 } }
+  },
+  {
+    END_DEVICE_PATH_TYPE,
+    END_ENTIRE_DEVICE_PATH_SUBTYPE,
+    { 
+      (UINT8) (END_DEVICE_PATH_LENGTH),
+      (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)
+    }
+  }
+};
+
 BOOT_MANAGER_CALLBACK_DATA  gBootManagerPrivate = {
   BOOT_MANAGER_CALLBACK_DATA_SIGNATURE,
   NULL,
@@ -104,7 +129,7 @@ BootManagerCallback (
   Registers HII packages for the Boot Manger to HII Database.
   It also registers the browser call back function.
 
-  @return Status of HiiLibCreateHiiDriverHandle() and gHiiDatabase->NewPackageList()
+  @return Status of gBS->InstallMultipleProtocolInterfaces() and gHiiDatabase->NewPackageList()
 
 **/
 EFI_STATUS
@@ -116,21 +141,15 @@ InitializeBootManager (
   EFI_HII_PACKAGE_LIST_HEADER *PackageList;
 
   //
-  // Create driver handle used by HII database
+  // Install Device Path Protocol and Config Access protocol to driver handle
   //
-  Status = HiiLibCreateHiiDriverHandle (&gBootManagerPrivate.DriverHandle);
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  //
-  // Install Config Access protocol to driver handle
-  //
-  Status = gBS->InstallProtocolInterface (
+  Status = gBS->InstallMultipleProtocolInterfaces (
                   &gBootManagerPrivate.DriverHandle,
+                  &gEfiDevicePathProtocolGuid,
+                  &mBootManagerHiiVendorDevicePath,
                   &gEfiHiiConfigAccessProtocolGuid,
-                  EFI_NATIVE_INTERFACE,
-                  &gBootManagerPrivate.ConfigAccess
+                  &gBootManagerPrivate.ConfigAccess,
+                  NULL
                   );
   ASSERT_EFI_ERROR (Status);
 
diff --git a/IntelFrameworkModulePkg/Universal/BdsDxe/BootMngr/BootManager.h b/IntelFrameworkModulePkg/Universal/BdsDxe/BootMngr/BootManager.h
index 4e460788a7..d7566f4ccf 100644
--- a/IntelFrameworkModulePkg/Universal/BdsDxe/BootMngr/BootManager.h
+++ b/IntelFrameworkModulePkg/Universal/BdsDxe/BootMngr/BootManager.h
@@ -86,7 +86,7 @@ BootManagerCallback (
   Registers HII packages for the Boot Manger to HII Database.
   It also registers the browser call back function.
 
-  @return Status of HiiLibCreateHiiDriverHandle() and gHiiDatabase->NewPackageList()
+  @return Status of gBS->InstallMultipleProtocolInterfaces() and gHiiDatabase->NewPackageList()
 **/
 EFI_STATUS
 InitializeBootManager (
diff --git a/IntelFrameworkModulePkg/Universal/BdsDxe/DeviceMngr/DeviceManager.c b/IntelFrameworkModulePkg/Universal/BdsDxe/DeviceMngr/DeviceManager.c
index 9492de441c..9264734ddc 100644
--- a/IntelFrameworkModulePkg/Universal/BdsDxe/DeviceMngr/DeviceManager.c
+++ b/IntelFrameworkModulePkg/Universal/BdsDxe/DeviceMngr/DeviceManager.c
@@ -36,6 +36,31 @@ DEVICE_MANAGER_MENU_ITEM  mDeviceManagerMenuItemTable[] = {
   { STRING_TOKEN (STR_OTHER_DEVICE),    EFI_OTHER_DEVICE_CLASS }
 };
 
+HII_VENDOR_DEVICE_PATH  mDeviceManagerHiiVendorDevicePath = {
+  {
+    {
+      HARDWARE_DEVICE_PATH,
+      HW_VENDOR_DP,
+      {
+        (UINT8) (sizeof (VENDOR_DEVICE_PATH)),
+        (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)
+      }
+    },
+    //
+    // {102579A0-3686-466e-ACD8-80C087044F4A}
+    //
+    { 0x102579a0, 0x3686, 0x466e, { 0xac, 0xd8, 0x80, 0xc0, 0x87, 0x4, 0x4f, 0x4a } }
+  },
+  {
+    END_DEVICE_PATH_TYPE,
+    END_ENTIRE_DEVICE_PATH_SUBTYPE,
+    { 
+      (UINT8) (END_DEVICE_PATH_LENGTH),
+      (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)
+    }
+  }
+};
+
 #define MENU_ITEM_NUM  \
   (sizeof (mDeviceManagerMenuItemTable) / sizeof (DEVICE_MANAGER_MENU_ITEM))
 
@@ -100,21 +125,15 @@ InitializeDeviceManager (
   EFI_HII_PACKAGE_LIST_HEADER *PackageList;
 
   //
-  // Create driver handle used by HII database
+  // Install Device Path Protocol and Config Access protocol to driver handle
   //
-  Status = HiiLibCreateHiiDriverHandle (&gDeviceManagerPrivate.DriverHandle);
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  //
-  // Install Config Access protocol to driver handle
-  //
-  Status = gBS->InstallProtocolInterface (
+  Status = gBS->InstallMultipleProtocolInterfaces (
                   &gDeviceManagerPrivate.DriverHandle,
+                  &gEfiDevicePathProtocolGuid,
+                  &mDeviceManagerHiiVendorDevicePath,
                   &gEfiHiiConfigAccessProtocolGuid,
-                  EFI_NATIVE_INTERFACE,
-                  &gDeviceManagerPrivate.ConfigAccess
+                  &gDeviceManagerPrivate.ConfigAccess,
+                  NULL
                   );
   ASSERT_EFI_ERROR (Status);
 
diff --git a/IntelFrameworkModulePkg/Universal/BdsDxe/FrontPage.c b/IntelFrameworkModulePkg/Universal/BdsDxe/FrontPage.c
index 29974769bb..fbfac08178 100644
--- a/IntelFrameworkModulePkg/Universal/BdsDxe/FrontPage.c
+++ b/IntelFrameworkModulePkg/Universal/BdsDxe/FrontPage.c
@@ -37,6 +37,31 @@ FRONT_PAGE_CALLBACK_DATA  gFrontPagePrivate = {
   }
 };
 
+HII_VENDOR_DEVICE_PATH  mFrontPageHiiVendorDevicePath = {
+  {
+    {
+      HARDWARE_DEVICE_PATH,
+      HW_VENDOR_DP,
+      {
+        (UINT8) (sizeof (VENDOR_DEVICE_PATH)),
+        (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)
+      }
+    },
+    //
+    // {8E6D99EE-7531-48f8-8745-7F6144468FF2}
+    //
+    { 0x8e6d99ee, 0x7531, 0x48f8, { 0x87, 0x45, 0x7f, 0x61, 0x44, 0x46, 0x8f, 0xf2 } }
+  },
+  {
+    END_DEVICE_PATH_TYPE,
+    END_ENTIRE_DEVICE_PATH_SUBTYPE,
+    { 
+      (UINT8) (END_DEVICE_PATH_LENGTH),
+      (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)
+    }
+  }
+};
+
 /**
   This function allows a caller to extract the current configuration for one
   or more named elements from the target driver.
@@ -324,21 +349,15 @@ InitializeFrontPage (
     }
 
     //
-    // Create driver handle used by HII database
+    // Install Device Path Protocol and Config Access protocol to driver handle
     //
-    Status = HiiLibCreateHiiDriverHandle (&gFrontPagePrivate.DriverHandle);
-    if (EFI_ERROR (Status)) {
-      return Status;
-    }
-
-    //
-    // Install Config Access protocol to driver handle
-    //
-    Status = gBS->InstallProtocolInterface (
+    Status = gBS->InstallMultipleProtocolInterfaces (
                     &gFrontPagePrivate.DriverHandle,
+                    &gEfiDevicePathProtocolGuid,
+                    &mFrontPageHiiVendorDevicePath,
                     &gEfiHiiConfigAccessProtocolGuid,
-                    EFI_NATIVE_INTERFACE,
-                    &gFrontPagePrivate.ConfigAccess
+                    &gFrontPagePrivate.ConfigAccess,
+                    NULL
                     );
     ASSERT_EFI_ERROR (Status);
 
diff --git a/IntelFrameworkModulePkg/Universal/BdsDxe/Language.c b/IntelFrameworkModulePkg/Universal/BdsDxe/Language.c
index 4e7537c9e4..c9e19c5ff0 100644
--- a/IntelFrameworkModulePkg/Universal/BdsDxe/Language.c
+++ b/IntelFrameworkModulePkg/Universal/BdsDxe/Language.c
@@ -259,23 +259,13 @@ ExportFonts (
   VOID
   )
 {
-  EFI_STATUS                   Status;
-  EFI_HANDLE                   DriverHandle;
   EFI_HII_HANDLE               HiiHandle;
   EFI_HII_PACKAGE_LIST_HEADER  *PackageList;
 
-  //
-  // Create driver handle used by HII database
-  //
-  Status = HiiLibCreateHiiDriverHandle (&DriverHandle);
-  if (EFI_ERROR (Status)) {
-    return ;
-  }
-
   PackageList = HiiLibPreparePackageList (1, &mFontPackageGuid, &mFontBin);
   ASSERT (PackageList != NULL);
 
-  gHiiDatabase->NewPackageList (gHiiDatabase, PackageList, DriverHandle, &HiiHandle);
+  gHiiDatabase->NewPackageList (gHiiDatabase, PackageList, mBdsImageHandle, &HiiHandle);
   FreePool (PackageList);
 }
 
diff --git a/IntelFrameworkModulePkg/Universal/BdsDxe/String.c b/IntelFrameworkModulePkg/Universal/BdsDxe/String.c
index d1c6651977..a509a85df1 100644
--- a/IntelFrameworkModulePkg/Universal/BdsDxe/String.c
+++ b/IntelFrameworkModulePkg/Universal/BdsDxe/String.c
@@ -34,7 +34,6 @@ InitializeStringSupport (
   )
 {
   EFI_STATUS                   Status;
-  EFI_HANDLE                   DriverHandle;
   EFI_HII_PACKAGE_LIST_HEADER  *PackageList;
 
   Status = gBS->LocateProtocol (&gEfiHiiDatabaseProtocolGuid, NULL, (VOID **) &gHiiDatabase);
@@ -42,21 +41,13 @@ InitializeStringSupport (
     return Status;
   }
 
-  //
-  // Create driver handle used by HII database
-  //
-  Status = HiiLibCreateHiiDriverHandle (&DriverHandle);
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
   PackageList = HiiLibPreparePackageList (1, &mBdsStringPackGuid, &BdsDxeStrings);
   ASSERT (PackageList != NULL);
 
   Status = gHiiDatabase->NewPackageList (
                            gHiiDatabase,
                            PackageList,
-                           DriverHandle,
+                           mBdsImageHandle,
                            &gStringPackHandle
                            );
 
diff --git a/MdeModulePkg/Application/PlatOverMngr/PlatOverMngr.c b/MdeModulePkg/Application/PlatOverMngr/PlatOverMngr.c
index aa110226f1..543f896a74 100644
--- a/MdeModulePkg/Application/PlatOverMngr/PlatOverMngr.c
+++ b/MdeModulePkg/Application/PlatOverMngr/PlatOverMngr.c
@@ -39,6 +39,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #include <Protocol/DevicePathToText.h>
 #include <Protocol/DevicePath.h>
 
+#include <Library/DevicePathLib.h>
 #include <Library/BaseLib.h>
 #include <Library/DebugLib.h>
 #include <Library/UefiLib.h>
@@ -47,7 +48,6 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #include <Library/PlatformDriverOverrideLib.h>
 #include <Library/HiiLib.h>
 #include <Library/IfrSupportLib.h>
-#include <Library/ExtendedHiiLib.h>
 #include <Library/ExtendedIfrSupportLib.h>
 #include <Library/BaseMemoryLib.h>
 #include <Library/MemoryAllocationLib.h>
@@ -66,6 +66,18 @@ typedef struct {
   EFI_HII_CONFIG_ACCESS_PROTOCOL  ConfigAccess;
 } EFI_CALLBACK_INFO;
 
+#pragma pack(1)
+
+///
+/// HII specific Vendor Device Path definition.
+///
+typedef struct {
+  VENDOR_DEVICE_PATH             VendorDevicePath;
+  EFI_DEVICE_PATH_PROTOCOL       End;
+} HII_VENDOR_DEVICE_PATH;
+
+#pragma pack()
+
 //
 // uni string and Vfr Binary data.
 //
@@ -92,6 +104,31 @@ UINTN                        mSelectedDriverImageNum;
 UINTN                        mLastSavedDriverImageNum;
 UINT16                       mCurrentPage;
 
+HII_VENDOR_DEVICE_PATH  mHiiVendorDevicePath = {
+  {
+    {
+      HARDWARE_DEVICE_PATH,
+      HW_VENDOR_DP,
+      {
+        (UINT8) (sizeof (VENDOR_DEVICE_PATH)),
+        (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)
+      }
+    },
+    //
+    // {99936717-BF3D-4b04-9787-76CEE324D76F}
+    //
+    { 0x99936717, 0xbf3d, 0x4b04, { 0x97, 0x87, 0x76, 0xce, 0xe3, 0x24, 0xd7, 0x6f } }
+  },
+  {
+    END_DEVICE_PATH_TYPE,
+    END_ENTIRE_DEVICE_PATH_SUBTYPE,
+    { 
+      (UINT8) (END_DEVICE_PATH_LENGTH),
+      (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)
+    }
+  }
+};
+
 /**
   Converting a given device to an unicode string. 
   
@@ -1276,8 +1313,7 @@ PlatOverMngrInit (
   EFI_HII_DATABASE_PROTOCOL   *HiiDatabase;
   EFI_HII_PACKAGE_LIST_HEADER *PackageList;
   EFI_CALLBACK_INFO           *CallbackInfo;
-  EFI_HANDLE                  DriverHandle;
-  EFI_FORM_BROWSER2_PROTOCOL       *FormBrowser2;
+  EFI_FORM_BROWSER2_PROTOCOL  *FormBrowser2;
   
   //
   // There should only be one HII protocol
@@ -1314,22 +1350,15 @@ PlatOverMngrInit (
   CallbackInfo->ConfigAccess.Callback      = PlatOverMngrCallback;
 
   //
-  // Create driver handle used by HII database
+  // Install Device Path Protocol and Config Access protocol to driver handle
   //
-  Status = HiiLibCreateHiiDriverHandle (&DriverHandle);
-  if (EFI_ERROR (Status)) {
-    goto Finish;
-  }
-  CallbackInfo->DriverHandle = DriverHandle;
-
-  //
-  // Install Config Access protocol to driver handle
-  //
-  Status = gBS->InstallProtocolInterface (
-                  &DriverHandle,
+  Status = gBS->InstallMultipleProtocolInterfaces (
+                  &CallbackInfo->DriverHandle,
+                  &gEfiDevicePathProtocolGuid,
+                  &mHiiVendorDevicePath,
                   &gEfiHiiConfigAccessProtocolGuid,
-                  EFI_NATIVE_INTERFACE,
-                  &CallbackInfo->ConfigAccess
+                  &CallbackInfo->ConfigAccess,
+                  NULL
                   );
   if (EFI_ERROR (Status)) {
     goto Finish;
@@ -1349,7 +1378,7 @@ PlatOverMngrInit (
   Status = HiiDatabase->NewPackageList (
                            HiiDatabase,
                            PackageList,
-                           DriverHandle,
+                           CallbackInfo->DriverHandle,
                            &CallbackInfo->RegisteredHandle
                            );
   FreePool (PackageList);
@@ -1405,7 +1434,14 @@ PlatOverMngrInit (
 
 Finish:
   if (CallbackInfo->DriverHandle != NULL) {
-    HiiLibDestroyHiiDriverHandle (CallbackInfo->DriverHandle);
+    gBS->UninstallMultipleProtocolInterfaces (
+           CallbackInfo->DriverHandle,
+           &gEfiDevicePathProtocolGuid,
+           &mHiiVendorDevicePath,
+           &gEfiHiiConfigAccessProtocolGuid,
+           &CallbackInfo->ConfigAccess,
+           NULL
+           );
   }
   if (CallbackInfo != NULL) {
     FreePool (CallbackInfo);
diff --git a/MdeModulePkg/Application/PlatOverMngr/PlatOverMngr.inf b/MdeModulePkg/Application/PlatOverMngr/PlatOverMngr.inf
index 8d22f62b4b..6b42f05bdf 100644
--- a/MdeModulePkg/Application/PlatOverMngr/PlatOverMngr.inf
+++ b/MdeModulePkg/Application/PlatOverMngr/PlatOverMngr.inf
@@ -58,7 +58,6 @@
   PlatformDriverOverrideLib
   HiiLib
   IfrSupportLib
-  ExtendedHiiLib
   ExtendedIfrSupportLib
   BaseMemoryLib
   MemoryAllocationLib
@@ -85,4 +84,4 @@
   gEfiFormBrowser2ProtocolGuid                  ## CONSUMED
   gEfiHiiConfigRoutingProtocolGuid              ## CONSUMED
   gEfiHiiConfigAccessProtocolGuid               ## PRODUCED
-  gEfiDevicePathToTextProtocolGuid              ## CONSUMED
\ No newline at end of file
+  gEfiDevicePathToTextProtocolGuid              ## CONSUMED
diff --git a/MdeModulePkg/Include/Guid/MdeModuleHii.h b/MdeModulePkg/Include/Guid/MdeModuleHii.h
index e66a944c08..f5795ef31f 100644
--- a/MdeModulePkg/Include/Guid/MdeModuleHii.h
+++ b/MdeModulePkg/Include/Guid/MdeModuleHii.h
@@ -25,26 +25,6 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #define BROWSER_STATE_VALIDATE_PASSWORD  0
 #define BROWSER_STATE_SET_PASSWORD       1
 
-
-///
-/// HII specific Vendor Device Path Node definition.
-///
-#pragma pack(1)
-typedef struct {
-  VENDOR_DEVICE_PATH             VendorDevicePath;
-  UINT32                         Reserved;
-  UINT64                         UniqueId;
-} HII_VENDOR_DEVICE_PATH_NODE;
-#pragma pack()
-
-///
-/// HII specific Vendor Device Path definition.
-///
-typedef struct {
-  HII_VENDOR_DEVICE_PATH_NODE    Node;
-  EFI_DEVICE_PATH_PROTOCOL       End;
-} HII_VENDOR_DEVICE_PATH;
-
 ///
 /// GUIDed opcodes defined for EDKII implementation
 ///
diff --git a/MdeModulePkg/Include/Library/ExtendedHiiLib.h b/MdeModulePkg/Include/Library/ExtendedHiiLib.h
deleted file mode 100644
index 15c9760355..0000000000
--- a/MdeModulePkg/Include/Library/ExtendedHiiLib.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/** @file
-  This library includes two extended HII functions to 
-  create and destory Hii Package by create the virtual Driver Handle.
-
-Copyright (c) 2008, Intel Corporation. <BR>
-All rights reserved. This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution.  The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#ifndef __EXTENDED_HII_LIB_H__
-#define __EXTENDED_HII_LIB_H__
-
-/**
-  The HII driver handle passed in for HiiDatabase.NewPackageList() requires
-  that there should be DevicePath Protocol installed on it.
-  This routine create a virtual Driver Handle by installing a vendor device
-  path on it, so as to use it to invoke HiiDatabase.NewPackageList().
-  The Device Path created is a Vendor Device Path specific to Intel's implemenation
-  and it is defined as HII_VENDOR_DEVICE_PATH_NODE.
-  
-
-  @param  DriverHandle           Handle to be returned
-
-  @retval EFI_SUCCESS            Handle destroy success.
-  @retval EFI_OUT_OF_RESOURCES   Not enough memory.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiLibCreateHiiDriverHandle (
-  OUT EFI_HANDLE               *DriverHandle
-  );
-
-/**
-  Destroy the Driver Handle created by CreateHiiDriverHandle().
-
-  If no Device Path protocol is installed on the DriverHandle, then ASSERT.
-  If this Device Path protocol is failed to be uninstalled, then ASSERT.
-
-  @param  DriverHandle           Handle returned by CreateHiiDriverHandle()
-
-
-**/
-VOID
-EFIAPI
-HiiLibDestroyHiiDriverHandle (
-  IN EFI_HANDLE                 DriverHandle
-  );
-
-
-#endif
diff --git a/MdeModulePkg/Library/ExtendedHiiLib/ExtendedHiiLib.c b/MdeModulePkg/Library/ExtendedHiiLib/ExtendedHiiLib.c
deleted file mode 100644
index 4aaf123f68..0000000000
--- a/MdeModulePkg/Library/ExtendedHiiLib/ExtendedHiiLib.c
+++ /dev/null
@@ -1,145 +0,0 @@
-/** @file
-Library instance for ExtendedHiiLib.
-  
-This library instance implements the common HII routines which is
-related to HII but reference data structures that are not defined in 
-UEFI specification, for example HII_VENDOR_DEVICE_PATH.
-
-
-Copyright (c) 2006 - 2008, Intel Corporation. <BR>
-All rights reserved. This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution.  The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-
-#include <Uefi.h>
-#include <Protocol/DevicePath.h>
-#include <Library/DebugLib.h>
-#include <Library/MemoryAllocationLib.h>
-#include <Library/UefiBootServicesTableLib.h>
-#include <Library/DevicePathLib.h>
-#include <Guid/MdeModuleHii.h>
-
-
-//
-// Hii vendor device path template
-//
-GLOBAL_REMOVE_IF_UNREFERENCED CONST HII_VENDOR_DEVICE_PATH  mHiiVendorDevicePathTemplate = {
-  {
-    {
-      {
-        HARDWARE_DEVICE_PATH,
-        HW_VENDOR_DP,
-        {
-          (UINT8) (sizeof (HII_VENDOR_DEVICE_PATH_NODE)),
-          (UINT8) ((sizeof (HII_VENDOR_DEVICE_PATH_NODE)) >> 8)
-        }
-      },
-      EFI_IFR_TIANO_GUID
-    },
-    0,
-    0
-  },
-  {
-    END_DEVICE_PATH_TYPE,
-    END_ENTIRE_DEVICE_PATH_SUBTYPE,
-    { 
-      END_DEVICE_PATH_LENGTH
-    }
-  }
-};
-
-/**
-  The HII driver handle passed in for HiiDatabase.NewPackageList() requires
-  that there should be DevicePath Protocol installed on it.
-  This routine create a virtual Driver Handle by installing a vendor device
-  path on it, so as to use it to invoke HiiDatabase.NewPackageList().
-  The Device Path created is a Vendor Device Path specific to Intel's implemenation
-  and it is defined as HII_VENDOR_DEVICE_PATH_NODE.
-  
-
-  @param  DriverHandle           Handle to be returned
-
-  @retval EFI_SUCCESS            Handle destroy success.
-  @retval EFI_OUT_OF_RESOURCES   Not enough memory.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiLibCreateHiiDriverHandle (
-  OUT EFI_HANDLE               *DriverHandle
-  )
-{
-  EFI_STATUS                   Status;
-  HII_VENDOR_DEVICE_PATH_NODE  *VendorDevicePath;
-
-  VendorDevicePath = AllocateCopyPool (sizeof (HII_VENDOR_DEVICE_PATH), &mHiiVendorDevicePathTemplate);
-  if (VendorDevicePath == NULL) {
-    return EFI_OUT_OF_RESOURCES;
-  }
-
-  //
-  // Use memory address as unique ID to distinguish from different device paths
-  //
-  VendorDevicePath->UniqueId = (UINT64) ((UINTN) VendorDevicePath);
-
-  *DriverHandle = NULL;
-  Status = gBS->InstallMultipleProtocolInterfaces (
-                  DriverHandle,
-                  &gEfiDevicePathProtocolGuid,
-                  VendorDevicePath,
-                  NULL
-                  );
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  return EFI_SUCCESS;
-}
-
-
-/**
-  Destroy the Driver Handle created by CreateHiiDriverHandle().
-
-  If no Device Path protocol is installed on the DriverHandle, then ASSERT.
-  If this Device Path protocol is failed to be uninstalled, then ASSERT.
-
-  @param  DriverHandle           Handle returned by CreateHiiDriverHandle()
-
-
-**/
-VOID
-EFIAPI
-HiiLibDestroyHiiDriverHandle (
-  IN EFI_HANDLE               DriverHandle
-  )
-{
-  EFI_STATUS                   Status;
-  EFI_DEVICE_PATH_PROTOCOL     *DevicePath;
-
-  Status = gBS->HandleProtocol (
-                  DriverHandle,
-                  &gEfiDevicePathProtocolGuid,
-                  (VOID **) &DevicePath
-                  );
-  ASSERT_EFI_ERROR (Status);
-
-  Status = gBS->UninstallProtocolInterface (
-                  DriverHandle,
-                  &gEfiDevicePathProtocolGuid,
-                  DevicePath
-                  );
-  ASSERT_EFI_ERROR (Status);
-
-  FreePool (DevicePath);
-
-}
-
-
-
diff --git a/MdeModulePkg/Library/ExtendedHiiLib/ExtendedHiiLib.inf b/MdeModulePkg/Library/ExtendedHiiLib/ExtendedHiiLib.inf
deleted file mode 100644
index e485edaf43..0000000000
--- a/MdeModulePkg/Library/ExtendedHiiLib/ExtendedHiiLib.inf
+++ /dev/null
@@ -1,48 +0,0 @@
-#/** @file
-#  
-#  Library instance for ExtendedHiiLib.
-#  
-#  This library instance implements the common HII routines which is
-#  related to HII but reference data structures that are not defined in 
-#  UEFI specification, for example HII_VENDOR_DEVICE_PATH.
-#  
-#  Copyright (c) 2006 - 2008, Intel Corporation. <BR>
-#  All rights reserved. This program and the accompanying materials
-#  are licensed and made available under the terms and conditions of the BSD License
-#  which accompanies this distribution.  The full text of the license may be found at
-#  http://opensource.org/licenses/bsd-license.php
-#  
-#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-#  
-#**/
-
-[Defines]
-  INF_VERSION                    = 0x00010005
-  BASE_NAME                      = ExtendedHiiLib
-  FILE_GUID                      = 35961516-ABA1-4636-A4C0-608E62BE8BB0
-  MODULE_TYPE                    = DXE_DRIVER
-  VERSION_STRING                 = 1.0
-  LIBRARY_CLASS                  = ExtendedHiiLib|DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SAL_DRIVER DXE_SMM_DRIVER UEFI_APPLICATION UEFI_DRIVER
-  EFI_SPECIFICATION_VERSION      = 0x0002000A
-  
-#
-#  VALID_ARCHITECTURES           = IA32 X64 IPF EBC
-#
-
-[Sources.common]
-  ExtendedHiiLib.c
-
-
-[Packages]
-  MdePkg/MdePkg.dec
-  MdeModulePkg/MdeModulePkg.dec
-
-[LibraryClasses]
-  MemoryAllocationLib
-  DebugLib
-  DevicePathLib
-  
-[Protocols]
-  gEfiDevicePathProtocolGuid  ## SOMETIMES_PRODUCES
-  
diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec
index 95c7e7a583..366a4be8d9 100644
--- a/MdeModulePkg/MdeModulePkg.dec
+++ b/MdeModulePkg/MdeModulePkg.dec
@@ -60,11 +60,6 @@
   ##  @libraryclass  Provides a set of interfaces to do IFR opcode creation and interact with a UEFI Form Browser.
   IfrSupportLib|Include/Library/IfrSupportLib.h
   
-  ##  @libraryclass  Includes two extended HII functions to create and destory Hii Package 
-  #                  by create the virtual Driver Handle.
-  ##
-  ExtendedHiiLib|Include/Library/ExtendedHiiLib.h
-  
   ##  @libraryclass  Defines APIs that is related to IFR operations but specific to EDK II
   #                  implementation.
   ##
diff --git a/MdeModulePkg/MdeModulePkg.dsc b/MdeModulePkg/MdeModulePkg.dsc
index 2644557e45..a38c73c013 100644
--- a/MdeModulePkg/MdeModulePkg.dsc
+++ b/MdeModulePkg/MdeModulePkg.dsc
@@ -62,7 +62,6 @@
   UefiRuntimeServicesTableLib|MdePkg/Library/UefiRuntimeServicesTableLib/UefiRuntimeServicesTableLib.inf
   UefiRuntimeLib|MdePkg/Library/UefiRuntimeLib/UefiRuntimeLib.inf
   UefiScsiLib|MdePkg/Library/UefiScsiLib/UefiScsiLib.inf
-  ExtendedHiiLib|MdeModulePkg/Library/ExtendedHiiLib/ExtendedHiiLib.inf
   UefiUsbLib|MdePkg/Library/UefiUsbLib/UefiUsbLib.inf
   NetLib|MdeModulePkg/Library/DxeNetLib/DxeNetLib.inf
   IpIoLib|MdeModulePkg/Library/DxeIpIoLib/DxeIpIoLib.inf
@@ -276,7 +275,6 @@
   MdeModulePkg/Library/DxePlatDriOverLib/DxePlatDriOverLib.inf
   MdeModulePkg/Library/DxeUdpIoLib/DxeUdpIoLib.inf
   MdeModulePkg/Library/DxePrintLibPrint2Protocol/DxePrintLibPrint2Protocol.inf
-  MdeModulePkg/Library/ExtendedHiiLib/ExtendedHiiLib.inf
   MdeModulePkg/Library/ExtendedIfrSupportLib/ExtendedIfrSupportLib.inf
   MdeModulePkg/Library/PeiPerformanceLib/PeiPerformanceLib.inf
   MdeModulePkg/Library/PeiRecoveryLibNull/PeiRecoveryLibNull.inf
diff --git a/MdeModulePkg/Universal/DriverSampleDxe/DriverSample.c b/MdeModulePkg/Universal/DriverSampleDxe/DriverSample.c
index e470a82cc7..8fcce40327 100644
--- a/MdeModulePkg/Universal/DriverSampleDxe/DriverSample.c
+++ b/MdeModulePkg/Universal/DriverSampleDxe/DriverSample.c
@@ -23,6 +23,56 @@ EFI_GUID   mInventoryGuid = INVENTORY_GUID;
 
 CHAR16     VariableName[] = L"MyIfrNVData";
 
+HII_VENDOR_DEVICE_PATH  mHiiVendorDevicePath1 = {
+  {
+    {
+      HARDWARE_DEVICE_PATH,
+      HW_VENDOR_DP,
+      {
+        (UINT8) (sizeof (VENDOR_DEVICE_PATH)),
+        (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)
+      }
+    },
+    //
+    // {C153B68D-EBFC-488e-B110-662867745B87}
+    //
+    { 0xc153b68d, 0xebfc, 0x488e, { 0xb1, 0x10, 0x66, 0x28, 0x67, 0x74, 0x5b, 0x87 } }
+  },
+  {
+    END_DEVICE_PATH_TYPE,
+    END_ENTIRE_DEVICE_PATH_SUBTYPE,
+    { 
+      (UINT8) (END_DEVICE_PATH_LENGTH),
+      (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)
+    }
+  }
+};
+
+HII_VENDOR_DEVICE_PATH  mHiiVendorDevicePath2 = {
+  {
+    {
+      HARDWARE_DEVICE_PATH,
+      HW_VENDOR_DP,
+      {
+        (UINT8) (sizeof (VENDOR_DEVICE_PATH)),
+        (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)
+      }
+    },
+    //
+    // {06F37F07-0C48-40e9-8436-0A08A0BB76B0}
+    //
+    { 0x6f37f07, 0xc48, 0x40e9, { 0x84, 0x36, 0xa, 0x8, 0xa0, 0xbb, 0x76, 0xb0 } }
+  },
+  {
+    END_DEVICE_PATH_TYPE,
+    END_ENTIRE_DEVICE_PATH_SUBTYPE,
+    { 
+      (UINT8) (END_DEVICE_PATH_LENGTH),
+      (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)
+    }
+  }
+};
+
 /**
   Encode the password using a simple algorithm.
   
@@ -689,7 +739,7 @@ DriverSampleInit (
   EFI_STATUS                      SavedStatus;
   EFI_HII_PACKAGE_LIST_HEADER     *PackageList;
   EFI_HII_HANDLE                  HiiHandle[2];
-  EFI_HANDLE                      DriverHandle[2];
+  EFI_HANDLE                      DriverHandle[2] = {NULL, NULL};
   DRIVER_SAMPLE_PRIVATE_DATA      *PrivateData;
   EFI_SCREEN_DESCRIPTOR           Screen;
   EFI_HII_DATABASE_PROTOCOL       *HiiDatabase;
@@ -766,23 +816,18 @@ DriverSampleInit (
   }
   PrivateData->HiiConfigRouting = HiiConfigRouting;
 
-  //
-  // Install Config Access protocol
-  //
-  Status = HiiLibCreateHiiDriverHandle (&DriverHandle[0]);
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-  PrivateData->DriverHandle[0] = DriverHandle[0];
-
-  Status = gBS->InstallProtocolInterface (
+  Status = gBS->InstallMultipleProtocolInterfaces (
                   &DriverHandle[0],
+                  &gEfiDevicePathProtocolGuid,
+                  &mHiiVendorDevicePath1,
                   &gEfiHiiConfigAccessProtocolGuid,
-                  EFI_NATIVE_INTERFACE,
-                  &PrivateData->ConfigAccess
+                  &PrivateData->ConfigAccess,
+                  NULL
                   );
   ASSERT_EFI_ERROR (Status);
 
+  PrivateData->DriverHandle[0] = DriverHandle[0];
+
   //
   // Publish our HII data
   //
@@ -811,10 +856,14 @@ DriverSampleInit (
   //
   // Publish another Fromset
   //
-  Status = HiiLibCreateHiiDriverHandle (&DriverHandle[1]);
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
+  Status = gBS->InstallMultipleProtocolInterfaces (
+                  &DriverHandle[1],
+                  &gEfiDevicePathProtocolGuid,
+                  &mHiiVendorDevicePath2,
+                  NULL
+                  );
+  ASSERT_EFI_ERROR (Status);
+
   PrivateData->DriverHandle[1] = DriverHandle[1];
 
   PackageList = HiiLibPreparePackageList (
diff --git a/MdeModulePkg/Universal/DriverSampleDxe/DriverSample.h b/MdeModulePkg/Universal/DriverSampleDxe/DriverSample.h
index d33740826c..cdecddbfe7 100644
--- a/MdeModulePkg/Universal/DriverSampleDxe/DriverSample.h
+++ b/MdeModulePkg/Universal/DriverSampleDxe/DriverSample.h
@@ -42,7 +42,7 @@ Revision History
 #include <Library/IfrSupportLib.h>
 #include <Library/ExtendedIfrSupportLib.h>
 #include <Library/HiiLib.h>
-#include <Library/ExtendedHiiLib.h>
+#include <Library/DevicePathLib.h>
 
 #include "NVDataStruc.h"
 
@@ -97,4 +97,16 @@ typedef struct {
 
 #define DRIVER_SAMPLE_PRIVATE_FROM_THIS(a)  CR (a, DRIVER_SAMPLE_PRIVATE_DATA, ConfigAccess, DRIVER_SAMPLE_PRIVATE_SIGNATURE)
 
+#pragma pack(1)
+
+///
+/// HII specific Vendor Device Path definition.
+///
+typedef struct {
+  VENDOR_DEVICE_PATH             VendorDevicePath;
+  EFI_DEVICE_PATH_PROTOCOL       End;
+} HII_VENDOR_DEVICE_PATH;
+
+#pragma pack()
+
 #endif
diff --git a/MdeModulePkg/Universal/DriverSampleDxe/DriverSampleDxe.inf b/MdeModulePkg/Universal/DriverSampleDxe/DriverSampleDxe.inf
index d1da67da04..bba6ab0abf 100644
--- a/MdeModulePkg/Universal/DriverSampleDxe/DriverSampleDxe.inf
+++ b/MdeModulePkg/Universal/DriverSampleDxe/DriverSampleDxe.inf
@@ -53,7 +53,6 @@
   DebugLib
   HiiLib
   IfrSupportLib
-  ExtendedHiiLib
   ExtendedIfrSupportLib
 
 [Protocols]
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.c b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.c
index feb1118edd..2bb0ba3df1 100644
--- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.c
+++ b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.c
@@ -24,6 +24,31 @@ LIST_ENTRY      mIScsiConfigFormList = {
   &mIScsiConfigFormList
 };
 
+HII_VENDOR_DEVICE_PATH  mIScsiHiiVendorDevicePath = {
+  {
+    {
+      HARDWARE_DEVICE_PATH,
+      HW_VENDOR_DP,
+      {
+        (UINT8) (sizeof (VENDOR_DEVICE_PATH)),
+        (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)
+      }
+    },
+    //
+    // {49D7B73E-143D-4716-977B-C45F1CB038CC}
+    //
+    { 0x49d7b73e, 0x143d, 0x4716, { 0x97, 0x7b, 0xc4, 0x5f, 0x1c, 0xb0, 0x38, 0xcc } }
+  },
+  {
+    END_DEVICE_PATH_TYPE,
+    END_ENTIRE_DEVICE_PATH_SUBTYPE,
+    { 
+      (UINT8) (END_DEVICE_PATH_LENGTH),
+      (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)
+    }
+  }
+};
+
 /**
   Convert the IPv4 address into a dotted string.
 
@@ -908,7 +933,7 @@ IScsiConfigFormInit (
     return Status;
   }
 
-  CallbackInfo = (ISCSI_FORM_CALLBACK_INFO *) AllocatePool (sizeof (ISCSI_FORM_CALLBACK_INFO));
+  CallbackInfo = (ISCSI_FORM_CALLBACK_INFO *) AllocateZeroPool (sizeof (ISCSI_FORM_CALLBACK_INFO));
   if (CallbackInfo == NULL) {
     return EFI_OUT_OF_RESOURCES;
   }
@@ -928,22 +953,15 @@ IScsiConfigFormInit (
   }
 
   //
-  // Create driver handle used by HII database
+  // Install Device Path Protocol and Config Access protocol to driver handle
   //
-  Status = HiiLibCreateHiiDriverHandle (&CallbackInfo->DriverHandle);
-  if (EFI_ERROR (Status)) {
-    FreePool(CallbackInfo);
-    return Status;
-  }
-  
-  //
-  // Install Config Access protocol to driver handle
-  //
-  Status = gBS->InstallProtocolInterface (
+  Status = gBS->InstallMultipleProtocolInterfaces (
                   &CallbackInfo->DriverHandle,
+                  &gEfiDevicePathProtocolGuid,
+                  &mIScsiHiiVendorDevicePath,
                   &gEfiHiiConfigAccessProtocolGuid,
-                  EFI_NATIVE_INTERFACE,
-                  &CallbackInfo->ConfigAccess
+                  &CallbackInfo->ConfigAccess,
+                  NULL
                   );
   ASSERT_EFI_ERROR (Status);
   
@@ -1010,13 +1028,14 @@ IScsiConfigFormUnload (
   //
   // Uninstall EFI_HII_CONFIG_ACCESS_PROTOCOL
   //
-  gBS->UninstallProtocolInterface (
-        mCallbackInfo->DriverHandle,
-        &gEfiHiiConfigAccessProtocolGuid,
-        &mCallbackInfo->ConfigAccess
-        );
-  HiiLibDestroyHiiDriverHandle (mCallbackInfo->DriverHandle);
-
+  gBS->UninstallMultipleProtocolInterfaces (
+         mCallbackInfo->DriverHandle,
+         &gEfiDevicePathProtocolGuid,
+         &mIScsiHiiVendorDevicePath,
+         &gEfiHiiConfigAccessProtocolGuid,
+         &mCallbackInfo->ConfigAccess,
+         NULL
+         );
   gBS->FreePool (mCallbackInfo);
 
   return EFI_SUCCESS;
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.h b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.h
index e89d2d4914..fd6a2c41cf 100644
--- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.h
+++ b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.h
@@ -17,7 +17,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 
 #include <Protocol/HiiConfigRouting.h>
 #include <Library/HiiLib.h>
-#include <Library/ExtendedHiiLib.h>
+#include <Library/DevicePathLib.h>
 #include <Library/IfrSupportLib.h>
 #include <Library/ExtendedIfrSupportLib.h>
 #include <Library/DebugLib.h>
@@ -103,6 +103,18 @@ typedef struct _ISCSI_FORM_CALLBACK_INFO {
   ISCSI_CONFIG_FORM_ENTRY          *Current;
 } ISCSI_FORM_CALLBACK_INFO;
 
+#pragma pack(1)
+
+///
+/// HII specific Vendor Device Path definition.
+///
+typedef struct {
+  VENDOR_DEVICE_PATH             VendorDevicePath;
+  EFI_DEVICE_PATH_PROTOCOL       End;
+} HII_VENDOR_DEVICE_PATH;
+
+#pragma pack()
+
 /**
   Updates the iSCSI configuration form to add/delete an entry for the iSCSI
   device specified by the Controller.
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf
index 8710845abe..29509911e7 100644
--- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf
+++ b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf
@@ -79,7 +79,6 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
   PrintLib
   HiiLib
   IfrSupportLib
-  ExtendedHiiLib
   ExtendedIfrSupportLib
   NetLib
 
diff --git a/MdeModulePkg/Universal/SetupBrowserDxe/Setup.c b/MdeModulePkg/Universal/SetupBrowserDxe/Setup.c
index 1096462306..7e948b3058 100644
--- a/MdeModulePkg/Universal/SetupBrowserDxe/Setup.c
+++ b/MdeModulePkg/Universal/SetupBrowserDxe/Setup.c
@@ -525,7 +525,6 @@ InitializeSetup (
   )
 {
   EFI_STATUS                  Status;
-  EFI_HANDLE                  HiiDriverHandle;
   EFI_HII_PACKAGE_LIST_HEADER *PackageList;
 
   //
@@ -555,15 +554,12 @@ InitializeSetup (
   //
   // Publish our HII data
   //
-  Status = HiiLibCreateHiiDriverHandle (&HiiDriverHandle);
-  ASSERT_EFI_ERROR (Status);
-
   PackageList = HiiLibPreparePackageList (1, &gSetupBrowserGuid, SetupBrowserStrings);
   ASSERT (PackageList != NULL);
   Status = mHiiDatabase->NewPackageList (
                            mHiiDatabase,
                            PackageList,
-                           HiiDriverHandle,
+                           ImageHandle,
                            &gHiiHandle
                            );
   ASSERT_EFI_ERROR (Status);
diff --git a/MdeModulePkg/Universal/SetupBrowserDxe/Setup.h b/MdeModulePkg/Universal/SetupBrowserDxe/Setup.h
index d8e7ca2d2e..ebd9a47d73 100644
--- a/MdeModulePkg/Universal/SetupBrowserDxe/Setup.h
+++ b/MdeModulePkg/Universal/SetupBrowserDxe/Setup.h
@@ -42,7 +42,6 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #include <Library/IfrSupportLib.h>
 #include <Library/ExtendedIfrSupportLib.h>
 #include <Library/HiiLib.h>
-#include <Library/ExtendedHiiLib.h>
 #include <Library/PcdLib.h>
 
 #include "Colors.h"
diff --git a/MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserDxe.inf b/MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserDxe.inf
index b945322920..d531d7b9af 100644
--- a/MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserDxe.inf
+++ b/MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserDxe.inf
@@ -61,7 +61,6 @@
   PrintLib
   IfrSupportLib
   HiiLib
-  ExtendedHiiLib
 
 [Guids]
   gEfiIfrTianoGuid                              ## CONSUMES  ## GUID
diff --git a/Nt32Pkg/Nt32Pkg.dsc b/Nt32Pkg/Nt32Pkg.dsc
index 68fbe44621..59c49db146 100644
--- a/Nt32Pkg/Nt32Pkg.dsc
+++ b/Nt32Pkg/Nt32Pkg.dsc
@@ -65,7 +65,6 @@
   IoLib|MdePkg/Library/BaseIoLibIntrinsic/BaseIoLibIntrinsic.inf
   UefiDecompressLib|IntelFrameworkModulePkg/Library/BaseUefiTianoCustomDecompressLib/BaseUefiTianoCustomDecompressLib.inf
   HiiLib|MdeModulePkg/Library/UefiHiiLib/UefiHiiLib.inf
-  ExtendedHiiLib|MdeModulePkg/Library/ExtendedHiiLib/ExtendedHiiLib.inf
   S3Lib|MdeModulePkg/Library/PeiS3LibNull/PeiS3LibNull.inf
   RecoveryLib|MdeModulePkg/Library/PeiRecoveryLibNull/PeiRecoveryLibNull.inf
   IfrSupportLib|MdeModulePkg/Library/UefiIfrSupportLib/UefiIfrSupportLib.inf
diff --git a/UnixPkg/UnixPkg.dsc b/UnixPkg/UnixPkg.dsc
index 7c45fd0318..e48096b85c 100644
--- a/UnixPkg/UnixPkg.dsc
+++ b/UnixPkg/UnixPkg.dsc
@@ -61,7 +61,6 @@
   IoLib|MdePkg/Library/BaseIoLibIntrinsic/BaseIoLibIntrinsic.inf
   UefiDecompressLib|IntelFrameworkModulePkg/Library/BaseUefiTianoCustomDecompressLib/BaseUefiTianoCustomDecompressLib.inf
   HiiLib|MdeModulePkg/Library/UefiHiiLib/UefiHiiLib.inf
-  ExtendedHiiLib|MdeModulePkg/Library/ExtendedHiiLib/ExtendedHiiLib.inf
   S3Lib|MdeModulePkg/Library/PeiS3LibNull/PeiS3LibNull.inf
   RecoveryLib|MdeModulePkg/Library/PeiRecoveryLibNull/PeiRecoveryLibNull.inf
   IfrSupportLib|MdeModulePkg/Library/UefiIfrSupportLib/UefiIfrSupportLib.inf