]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdePkg/Library/UefiLib/UefiDriverModel.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / MdePkg / Library / UefiLib / UefiDriverModel.c
index 582ad6acdd4c4b4a4a2d9aa828e02d89be676a0d..fdcf4f9c4fd27f2569790485dea4d9bd39b168da 100644 (file)
@@ -1,56 +1,60 @@
 /** @file\r
   Library functions that abstract driver model protocols\r
-  installation.\r
+  installation and uninstallation.\r
 \r
-  Copyright (c) 2006 - 2007, Intel Corporation<BR> All rights\r
-  reserved. This program and the accompanying materials are\r
-  licensed and made available under the terms and conditions of the BSD License\r
-  which accompanies this distribution.  The full text of the license may be found at\r
-  http://opensource.org/licenses/bsd-license.php\r
-  \r
-  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+  Copyright (c) 2019, NVIDIA Corporation. All rights reserved.\r
+  Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>\r
+  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
-**/ \r
+**/\r
 \r
-//\r
-// Include common header file for this module.\r
-//\r
-#include "CommonHeader.h"\r
+#include "UefiLibInternal.h"\r
 \r
 /**\r
-  Intialize a driver by installing the Driver Binding Protocol onto the\r
-  driver's DriverBindingHandle.  This is typically the same as the driver's\r
-  ImageHandle, but it can be different if the driver produces multiple\r
-  DriverBinding Protocols.  This function also initializes the EFI Driver\r
-  Library that initializes the global variables gST, gBS, gRT.\r
-\r
-  @param  ImageHandle          The image handle of the driver\r
-  @param  SystemTable          The EFI System Table that was passed to the driver's entry point\r
-  @param  DriverBinding        A Driver Binding Protocol instance that this driver is producing\r
-  @param  DriverBindingHandle  The handle that DriverBinding is to be installe onto.  If this\r
+  Installs and completes the initialization of a Driver Binding Protocol instance.\r
+\r
+  Installs the Driver Binding Protocol specified by DriverBinding onto the handle\r
+  specified by DriverBindingHandle. If DriverBindingHandle is NULL, then DriverBinding\r
+  is installed onto a newly created handle. DriverBindingHandle is typically the same\r
+  as the driver's ImageHandle, but it can be different if the driver produces multiple\r
+  Driver Binding Protocols.\r
+  If DriverBinding is NULL, then ASSERT().\r
+  If DriverBinding can not be installed onto a handle, then ASSERT().\r
+\r
+  @param  ImageHandle          The image handle of the driver.\r
+  @param  SystemTable          The EFI System Table that was passed to the driver's entry point.\r
+  @param  DriverBinding        A Driver Binding Protocol instance that this driver is producing.\r
+  @param  DriverBindingHandle  The handle that DriverBinding is to be installed onto.  If this\r
                                parameter is NULL, then a new handle is created.\r
 \r
-  @retval EFI_SUCCESS          DriverBinding is installed onto DriverBindingHandle\r
-  @retval Other                Status from gBS->InstallProtocolInterface()\r
+  @retval EFI_SUCCESS           The protocol installation successfully completed.\r
+  @retval EFI_OUT_OF_RESOURCES  There was not enough system resources to install the protocol.\r
+  @retval Others                Status from gBS->InstallMultipleProtocolInterfaces().\r
 \r
 **/\r
 EFI_STATUS\r
 EFIAPI\r
 EfiLibInstallDriverBinding (\r
-  IN const EFI_HANDLE             ImageHandle,\r
-  IN const EFI_SYSTEM_TABLE       *SystemTable,\r
+  IN CONST EFI_HANDLE             ImageHandle,\r
+  IN CONST EFI_SYSTEM_TABLE       *SystemTable,\r
   IN EFI_DRIVER_BINDING_PROTOCOL  *DriverBinding,\r
   IN EFI_HANDLE                   DriverBindingHandle\r
   )\r
 {\r
   EFI_STATUS  Status;\r
 \r
-  ASSERT (NULL != DriverBinding);\r
+  ASSERT (DriverBinding != NULL);\r
+\r
+  //\r
+  // Update the ImageHandle and DriverBindingHandle fields of the Driver Binding Protocol\r
+  //\r
+  DriverBinding->ImageHandle         = ImageHandle;\r
+  DriverBinding->DriverBindingHandle = DriverBindingHandle;\r
 \r
   Status = gBS->InstallMultipleProtocolInterfaces (\r
-                  &DriverBindingHandle,\r
-                  &gEfiDriverBindingProtocolGuid, DriverBinding,\r
+                  &DriverBinding->DriverBindingHandle,\r
+                  &gEfiDriverBindingProtocolGuid,\r
+                  DriverBinding,\r
                   NULL\r
                   );\r
   //\r
@@ -58,119 +62,181 @@ EfiLibInstallDriverBinding (
   //\r
   ASSERT_EFI_ERROR (Status);\r
 \r
+  return Status;\r
+}\r
+\r
+/**\r
+  Uninstalls a Driver Binding Protocol instance.\r
+\r
+  If DriverBinding is NULL, then ASSERT().\r
+  If DriverBinding can not be uninstalled, then ASSERT().\r
+\r
+  @param  DriverBinding        A Driver Binding Protocol instance that this driver produced.\r
+\r
+  @retval EFI_SUCCESS           The protocol uninstallation successfully completed.\r
+  @retval Others                Status from gBS->UninstallMultipleProtocolInterfaces().\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+EfiLibUninstallDriverBinding (\r
+  IN EFI_DRIVER_BINDING_PROTOCOL  *DriverBinding\r
+  )\r
+{\r
+  EFI_STATUS  Status;\r
+\r
+  ASSERT (DriverBinding != NULL);\r
+\r
+  Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                  DriverBinding->DriverBindingHandle,\r
+                  &gEfiDriverBindingProtocolGuid,\r
+                  DriverBinding,\r
+                  NULL\r
+                  );\r
   //\r
-  // Update the ImageHandle and DriverBindingHandle fields of the Driver Binding Protocol\r
+  // ASSERT if the call to UninstallMultipleProtocolInterfaces() failed\r
   //\r
-  DriverBinding->ImageHandle         = ImageHandle;\r
-  DriverBinding->DriverBindingHandle = DriverBindingHandle;\r
+  ASSERT_EFI_ERROR (Status);\r
 \r
   return Status;\r
 }\r
 \r
 /**\r
-  Intialize a driver by installing the Driver Binding Protocol onto the\r
-  driver's DriverBindingHandle.  This is typically the same as the driver's\r
-  ImageHandle, but it can be different if the driver produces multiple\r
-  DriverBinding Protocols.  This function also initializes the EFI Driver\r
-  Library that initializes the global variables gST, gBS, gRT.\r
-\r
-  @ImageHandle                 The image handle of the driver\r
-  @SystemTable                 The EFI System Table that was passed to the driver's entry point\r
-  @DriverBinding               A Driver Binding Protocol instance that this driver is producing\r
-  @DriverBindingHandle         The handle that DriverBinding is to be installe onto.  If this\r
+  Installs and completes the initialization of a Driver Binding Protocol instance and\r
+  optionally installs the Component Name, Driver Configuration and Driver Diagnostics Protocols.\r
+\r
+  Initializes a driver by installing the Driver Binding Protocol together with the\r
+  optional Component Name, optional Driver Configure and optional Driver Diagnostic\r
+  Protocols onto the driver's DriverBindingHandle. If DriverBindingHandle is NULL,\r
+  then the protocols are  installed onto a newly created handle. DriverBindingHandle\r
+  is typically the same as the driver's ImageHandle, but it can be different if the\r
+  driver produces multiple Driver Binding Protocols.\r
+  If DriverBinding is NULL, then ASSERT().\r
+  If the installation fails, then ASSERT().\r
+\r
+  @param  ImageHandle          The image handle of the driver.\r
+  @param  SystemTable          The EFI System Table that was passed to the driver's entry point.\r
+  @param  DriverBinding        A Driver Binding Protocol instance that this driver is producing.\r
+  @param  DriverBindingHandle  The handle that DriverBinding is to be installed onto.  If this\r
                                parameter is NULL, then a new handle is created.\r
-  @ComponentName               A Component Name Protocol instance that this driver is producing\r
-  @DriverConfiguration         A Driver Configuration Protocol instance that this driver is producing\r
-  @DriverDiagnostics           A Driver Diagnostics Protocol instance that this driver is producing\r
+  @param  ComponentName        A Component Name Protocol instance that this driver is producing.\r
+  @param  DriverConfiguration  A Driver Configuration Protocol instance that this driver is producing.\r
+  @param  DriverDiagnostics    A Driver Diagnostics Protocol instance that this driver is producing.\r
 \r
-  @retval EFI_SUCCESS          DriverBinding is installed onto DriverBindingHandle\r
-  @retval Other                Status from gBS->InstallProtocolInterface()\r
+  @retval EFI_SUCCESS           The protocol installation successfully completed.\r
+  @retval EFI_OUT_OF_RESOURCES  There was not enough memory in pool to install all the protocols.\r
 \r
 **/\r
 EFI_STATUS\r
 EFIAPI\r
 EfiLibInstallAllDriverProtocols (\r
-  IN const EFI_HANDLE                         ImageHandle,\r
-  IN const EFI_SYSTEM_TABLE                   *SystemTable,\r
+  IN CONST EFI_HANDLE                         ImageHandle,\r
+  IN CONST EFI_SYSTEM_TABLE                   *SystemTable,\r
   IN EFI_DRIVER_BINDING_PROTOCOL              *DriverBinding,\r
   IN EFI_HANDLE                               DriverBindingHandle,\r
-  IN const EFI_COMPONENT_NAME_PROTOCOL        *ComponentName,       OPTIONAL\r
-  IN const EFI_DRIVER_CONFIGURATION_PROTOCOL  *DriverConfiguration, OPTIONAL\r
-  IN const EFI_DRIVER_DIAGNOSTICS_PROTOCOL    *DriverDiagnostics    OPTIONAL\r
+  IN CONST EFI_COMPONENT_NAME_PROTOCOL        *ComponentName        OPTIONAL,\r
+  IN CONST EFI_DRIVER_CONFIGURATION_PROTOCOL  *DriverConfiguration  OPTIONAL,\r
+  IN CONST EFI_DRIVER_DIAGNOSTICS_PROTOCOL    *DriverDiagnostics    OPTIONAL\r
   )\r
 {\r
   EFI_STATUS  Status;\r
 \r
-  ASSERT (NULL != DriverBinding);\r
+  ASSERT (DriverBinding != NULL);\r
 \r
-  if (DriverDiagnostics == NULL || FeaturePcdGet(PcdDriverDiagnosticsDisable)) {\r
+  //\r
+  // Update the ImageHandle and DriverBindingHandle fields of the Driver Binding Protocol\r
+  //\r
+  DriverBinding->ImageHandle         = ImageHandle;\r
+  DriverBinding->DriverBindingHandle = DriverBindingHandle;\r
+\r
+  if ((DriverDiagnostics == NULL) || FeaturePcdGet (PcdDriverDiagnosticsDisable)) {\r
     if (DriverConfiguration == NULL) {\r
-      if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {\r
+      if ((ComponentName == NULL) || FeaturePcdGet (PcdComponentNameDisable)) {\r
         Status = gBS->InstallMultipleProtocolInterfaces (\r
-                        &DriverBindingHandle,\r
-                        &gEfiDriverBindingProtocolGuid, DriverBinding,\r
+                        &DriverBinding->DriverBindingHandle,\r
+                        &gEfiDriverBindingProtocolGuid,\r
+                        DriverBinding,\r
                         NULL\r
                         );\r
       } else {\r
         Status = gBS->InstallMultipleProtocolInterfaces (\r
-                        &DriverBindingHandle,\r
-                        &gEfiDriverBindingProtocolGuid, DriverBinding,\r
-                        &gEfiComponentNameProtocolGuid, ComponentName,\r
+                        &DriverBinding->DriverBindingHandle,\r
+                        &gEfiDriverBindingProtocolGuid,\r
+                        DriverBinding,\r
+                        &gEfiComponentNameProtocolGuid,\r
+                        ComponentName,\r
                         NULL\r
                         );\r
       }\r
     } else {\r
-      if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {\r
+      if ((ComponentName == NULL) || FeaturePcdGet (PcdComponentNameDisable)) {\r
         Status = gBS->InstallMultipleProtocolInterfaces (\r
-                        &DriverBindingHandle,\r
-                        &gEfiDriverBindingProtocolGuid,       DriverBinding,\r
-                        &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
+                        &DriverBinding->DriverBindingHandle,\r
+                        &gEfiDriverBindingProtocolGuid,\r
+                        DriverBinding,\r
+                        &gEfiDriverConfigurationProtocolGuid,\r
+                        DriverConfiguration,\r
                         NULL\r
                         );\r
       } else {\r
         Status = gBS->InstallMultipleProtocolInterfaces (\r
-                        &DriverBindingHandle,\r
-                        &gEfiDriverBindingProtocolGuid,       DriverBinding,\r
-                        &gEfiComponentNameProtocolGuid,       ComponentName,\r
-                        &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
+                        &DriverBinding->DriverBindingHandle,\r
+                        &gEfiDriverBindingProtocolGuid,\r
+                        DriverBinding,\r
+                        &gEfiComponentNameProtocolGuid,\r
+                        ComponentName,\r
+                        &gEfiDriverConfigurationProtocolGuid,\r
+                        DriverConfiguration,\r
                         NULL\r
                         );\r
       }\r
     }\r
   } else {\r
     if (DriverConfiguration == NULL) {\r
-      if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {\r
+      if ((ComponentName == NULL) || FeaturePcdGet (PcdComponentNameDisable)) {\r
         Status = gBS->InstallMultipleProtocolInterfaces (\r
-                        &DriverBindingHandle,\r
-                        &gEfiDriverBindingProtocolGuid,     DriverBinding,\r
-                        &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,\r
+                        &DriverBinding->DriverBindingHandle,\r
+                        &gEfiDriverBindingProtocolGuid,\r
+                        DriverBinding,\r
+                        &gEfiDriverDiagnosticsProtocolGuid,\r
+                        DriverDiagnostics,\r
                         NULL\r
                         );\r
       } else {\r
         Status = gBS->InstallMultipleProtocolInterfaces (\r
-                        &DriverBindingHandle,\r
-                        &gEfiDriverBindingProtocolGuid,     DriverBinding,\r
-                        &gEfiComponentNameProtocolGuid,     ComponentName,\r
-                        &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,\r
+                        &DriverBinding->DriverBindingHandle,\r
+                        &gEfiDriverBindingProtocolGuid,\r
+                        DriverBinding,\r
+                        &gEfiComponentNameProtocolGuid,\r
+                        ComponentName,\r
+                        &gEfiDriverDiagnosticsProtocolGuid,\r
+                        DriverDiagnostics,\r
                         NULL\r
                         );\r
       }\r
     } else {\r
-      if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {\r
-       Status = gBS->InstallMultipleProtocolInterfaces (\r
-                        &DriverBindingHandle,\r
-                        &gEfiDriverBindingProtocolGuid,       DriverBinding,\r
-                        &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
-                        &gEfiDriverDiagnosticsProtocolGuid,   DriverDiagnostics,\r
+      if ((ComponentName == NULL) || FeaturePcdGet (PcdComponentNameDisable)) {\r
+        Status = gBS->InstallMultipleProtocolInterfaces (\r
+                        &DriverBinding->DriverBindingHandle,\r
+                        &gEfiDriverBindingProtocolGuid,\r
+                        DriverBinding,\r
+                        &gEfiDriverConfigurationProtocolGuid,\r
+                        DriverConfiguration,\r
+                        &gEfiDriverDiagnosticsProtocolGuid,\r
+                        DriverDiagnostics,\r
                         NULL\r
                         );\r
       } else {\r
         Status = gBS->InstallMultipleProtocolInterfaces (\r
-                        &DriverBindingHandle,\r
-                        &gEfiDriverBindingProtocolGuid,       DriverBinding,\r
-                        &gEfiComponentNameProtocolGuid,       ComponentName,\r
-                        &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
-                        &gEfiDriverDiagnosticsProtocolGuid,   DriverDiagnostics,\r
+                        &DriverBinding->DriverBindingHandle,\r
+                        &gEfiDriverBindingProtocolGuid,\r
+                        DriverBinding,\r
+                        &gEfiComponentNameProtocolGuid,\r
+                        ComponentName,\r
+                        &gEfiDriverConfigurationProtocolGuid,\r
+                        DriverConfiguration,\r
+                        &gEfiDriverDiagnosticsProtocolGuid,\r
+                        DriverDiagnostics,\r
                         NULL\r
                         );\r
       }\r
@@ -182,382 +248,1316 @@ EfiLibInstallAllDriverProtocols (
   //\r
   ASSERT_EFI_ERROR (Status);\r
 \r
+  return Status;\r
+}\r
+\r
+/**\r
+  Uninstalls a Driver Binding Protocol instance and optionally uninstalls the\r
+  Component Name, Driver Configuration and Driver Diagnostics Protocols.\r
+\r
+  If DriverBinding is NULL, then ASSERT().\r
+  If the uninstallation fails, then ASSERT().\r
+\r
+  @param  DriverBinding        A Driver Binding Protocol instance that this driver produced.\r
+  @param  ComponentName        A Component Name Protocol instance that this driver produced.\r
+  @param  DriverConfiguration  A Driver Configuration Protocol instance that this driver produced.\r
+  @param  DriverDiagnostics    A Driver Diagnostics Protocol instance that this driver produced.\r
+\r
+  @retval EFI_SUCCESS           The protocol uninstallation successfully completed.\r
+  @retval Others                Status from gBS->UninstallMultipleProtocolInterfaces().\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+EfiLibUninstallAllDriverProtocols (\r
+  IN EFI_DRIVER_BINDING_PROTOCOL              *DriverBinding,\r
+  IN CONST EFI_COMPONENT_NAME_PROTOCOL        *ComponentName        OPTIONAL,\r
+  IN CONST EFI_DRIVER_CONFIGURATION_PROTOCOL  *DriverConfiguration  OPTIONAL,\r
+  IN CONST EFI_DRIVER_DIAGNOSTICS_PROTOCOL    *DriverDiagnostics    OPTIONAL\r
+  )\r
+{\r
+  EFI_STATUS  Status;\r
+\r
+  ASSERT (DriverBinding != NULL);\r
+\r
+  if ((DriverDiagnostics == NULL) || FeaturePcdGet (PcdDriverDiagnosticsDisable)) {\r
+    if (DriverConfiguration == NULL) {\r
+      if ((ComponentName == NULL) || FeaturePcdGet (PcdComponentNameDisable)) {\r
+        Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                        DriverBinding->DriverBindingHandle,\r
+                        &gEfiDriverBindingProtocolGuid,\r
+                        DriverBinding,\r
+                        NULL\r
+                        );\r
+      } else {\r
+        Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                        DriverBinding->DriverBindingHandle,\r
+                        &gEfiDriverBindingProtocolGuid,\r
+                        DriverBinding,\r
+                        &gEfiComponentNameProtocolGuid,\r
+                        ComponentName,\r
+                        NULL\r
+                        );\r
+      }\r
+    } else {\r
+      if ((ComponentName == NULL) || FeaturePcdGet (PcdComponentNameDisable)) {\r
+        Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                        DriverBinding->DriverBindingHandle,\r
+                        &gEfiDriverBindingProtocolGuid,\r
+                        DriverBinding,\r
+                        &gEfiDriverConfigurationProtocolGuid,\r
+                        DriverConfiguration,\r
+                        NULL\r
+                        );\r
+      } else {\r
+        Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                        DriverBinding->DriverBindingHandle,\r
+                        &gEfiDriverBindingProtocolGuid,\r
+                        DriverBinding,\r
+                        &gEfiComponentNameProtocolGuid,\r
+                        ComponentName,\r
+                        &gEfiDriverConfigurationProtocolGuid,\r
+                        DriverConfiguration,\r
+                        NULL\r
+                        );\r
+      }\r
+    }\r
+  } else {\r
+    if (DriverConfiguration == NULL) {\r
+      if ((ComponentName == NULL) || FeaturePcdGet (PcdComponentNameDisable)) {\r
+        Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                        DriverBinding->DriverBindingHandle,\r
+                        &gEfiDriverBindingProtocolGuid,\r
+                        DriverBinding,\r
+                        &gEfiDriverDiagnosticsProtocolGuid,\r
+                        DriverDiagnostics,\r
+                        NULL\r
+                        );\r
+      } else {\r
+        Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                        DriverBinding->DriverBindingHandle,\r
+                        &gEfiDriverBindingProtocolGuid,\r
+                        DriverBinding,\r
+                        &gEfiComponentNameProtocolGuid,\r
+                        ComponentName,\r
+                        &gEfiDriverDiagnosticsProtocolGuid,\r
+                        DriverDiagnostics,\r
+                        NULL\r
+                        );\r
+      }\r
+    } else {\r
+      if ((ComponentName == NULL) || FeaturePcdGet (PcdComponentNameDisable)) {\r
+        Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                        DriverBinding->DriverBindingHandle,\r
+                        &gEfiDriverBindingProtocolGuid,\r
+                        DriverBinding,\r
+                        &gEfiDriverConfigurationProtocolGuid,\r
+                        DriverConfiguration,\r
+                        &gEfiDriverDiagnosticsProtocolGuid,\r
+                        DriverDiagnostics,\r
+                        NULL\r
+                        );\r
+      } else {\r
+        Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                        DriverBinding->DriverBindingHandle,\r
+                        &gEfiDriverBindingProtocolGuid,\r
+                        DriverBinding,\r
+                        &gEfiComponentNameProtocolGuid,\r
+                        ComponentName,\r
+                        &gEfiDriverConfigurationProtocolGuid,\r
+                        DriverConfiguration,\r
+                        &gEfiDriverDiagnosticsProtocolGuid,\r
+                        DriverDiagnostics,\r
+                        NULL\r
+                        );\r
+      }\r
+    }\r
+  }\r
+\r
+  //\r
+  // ASSERT if the call to UninstallMultipleProtocolInterfaces() failed\r
+  //\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  return Status;\r
+}\r
+\r
+/**\r
+  Installs Driver Binding Protocol with optional Component Name and Component Name 2 Protocols.\r
+\r
+  Initializes a driver by installing the Driver Binding Protocol together with the\r
+  optional Component Name and optional Component Name 2 protocols onto the driver's\r
+  DriverBindingHandle.  If DriverBindingHandle is NULL, then the protocols are installed\r
+  onto a newly created handle.  DriverBindingHandle is typically the same as the driver's\r
+  ImageHandle, but it can be different if the driver produces multiple Driver Binding Protocols.\r
+  If DriverBinding is NULL, then ASSERT().\r
+  If the installation fails, then ASSERT().\r
+\r
+  @param  ImageHandle          The image handle of the driver.\r
+  @param  SystemTable          The EFI System Table that was passed to the driver's entry point.\r
+  @param  DriverBinding        A Driver Binding Protocol instance that this driver is producing.\r
+  @param  DriverBindingHandle  The handle that DriverBinding is to be installed onto.  If this\r
+                               parameter is NULL, then a new handle is created.\r
+  @param  ComponentName        A Component Name Protocol instance that this driver is producing.\r
+  @param  ComponentName2       A Component Name 2 Protocol instance that this driver is producing.\r
+\r
+  @retval EFI_SUCCESS           The protocol installation successfully completed.\r
+  @retval EFI_OUT_OF_RESOURCES  There was not enough memory in pool to install all the protocols.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+EfiLibInstallDriverBindingComponentName2 (\r
+  IN CONST EFI_HANDLE                    ImageHandle,\r
+  IN CONST EFI_SYSTEM_TABLE              *SystemTable,\r
+  IN EFI_DRIVER_BINDING_PROTOCOL         *DriverBinding,\r
+  IN EFI_HANDLE                          DriverBindingHandle,\r
+  IN CONST EFI_COMPONENT_NAME_PROTOCOL   *ComponentName        OPTIONAL,\r
+  IN CONST EFI_COMPONENT_NAME2_PROTOCOL  *ComponentName2       OPTIONAL\r
+  )\r
+{\r
+  EFI_STATUS  Status;\r
+\r
+  ASSERT (DriverBinding != NULL);\r
+\r
   //\r
   // Update the ImageHandle and DriverBindingHandle fields of the Driver Binding Protocol\r
   //\r
   DriverBinding->ImageHandle         = ImageHandle;\r
   DriverBinding->DriverBindingHandle = DriverBindingHandle;\r
 \r
+  if ((ComponentName == NULL) || FeaturePcdGet (PcdComponentNameDisable)) {\r
+    if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+      Status = gBS->InstallMultipleProtocolInterfaces (\r
+                      &DriverBinding->DriverBindingHandle,\r
+                      &gEfiDriverBindingProtocolGuid,\r
+                      DriverBinding,\r
+                      NULL\r
+                      );\r
+    } else {\r
+      Status = gBS->InstallMultipleProtocolInterfaces (\r
+                      &DriverBinding->DriverBindingHandle,\r
+                      &gEfiDriverBindingProtocolGuid,\r
+                      DriverBinding,\r
+                      &gEfiComponentName2ProtocolGuid,\r
+                      ComponentName2,\r
+                      NULL\r
+                      );\r
+    }\r
+  } else {\r
+    if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+      Status = gBS->InstallMultipleProtocolInterfaces (\r
+                      &DriverBinding->DriverBindingHandle,\r
+                      &gEfiDriverBindingProtocolGuid,\r
+                      DriverBinding,\r
+                      &gEfiComponentNameProtocolGuid,\r
+                      ComponentName,\r
+                      NULL\r
+                      );\r
+    } else {\r
+      Status = gBS->InstallMultipleProtocolInterfaces (\r
+                      &DriverBinding->DriverBindingHandle,\r
+                      &gEfiDriverBindingProtocolGuid,\r
+                      DriverBinding,\r
+                      &gEfiComponentNameProtocolGuid,\r
+                      ComponentName,\r
+                      &gEfiComponentName2ProtocolGuid,\r
+                      ComponentName2,\r
+                      NULL\r
+                      );\r
+    }\r
+  }\r
+\r
+  //\r
+  // ASSERT if the call to InstallMultipleProtocolInterfaces() failed\r
+  //\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
   return Status;\r
 }\r
 \r
+/**\r
+  Uninstalls Driver Binding Protocol with optional Component Name and Component Name 2 Protocols.\r
+\r
+  If DriverBinding is NULL, then ASSERT().\r
+  If the uninstallation fails, then ASSERT().\r
+\r
+  @param  DriverBinding        A Driver Binding Protocol instance that this driver produced.\r
+  @param  ComponentName        A Component Name Protocol instance that this driver produced.\r
+  @param  ComponentName2       A Component Name 2 Protocol instance that this driver produced.\r
+\r
+  @retval EFI_SUCCESS           The protocol installation successfully completed.\r
+  @retval Others                Status from gBS->UninstallMultipleProtocolInterfaces().\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+EfiLibUninstallDriverBindingComponentName2 (\r
+  IN EFI_DRIVER_BINDING_PROTOCOL         *DriverBinding,\r
+  IN CONST EFI_COMPONENT_NAME_PROTOCOL   *ComponentName        OPTIONAL,\r
+  IN CONST EFI_COMPONENT_NAME2_PROTOCOL  *ComponentName2       OPTIONAL\r
+  )\r
+{\r
+  EFI_STATUS  Status;\r
+\r
+  ASSERT (DriverBinding != NULL);\r
+\r
+  if ((ComponentName == NULL) || FeaturePcdGet (PcdComponentNameDisable)) {\r
+    if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+      Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                      DriverBinding->DriverBindingHandle,\r
+                      &gEfiDriverBindingProtocolGuid,\r
+                      DriverBinding,\r
+                      NULL\r
+                      );\r
+    } else {\r
+      Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                      DriverBinding->DriverBindingHandle,\r
+                      &gEfiDriverBindingProtocolGuid,\r
+                      DriverBinding,\r
+                      &gEfiComponentName2ProtocolGuid,\r
+                      ComponentName2,\r
+                      NULL\r
+                      );\r
+    }\r
+  } else {\r
+    if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+      Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                      DriverBinding->DriverBindingHandle,\r
+                      &gEfiDriverBindingProtocolGuid,\r
+                      DriverBinding,\r
+                      &gEfiComponentNameProtocolGuid,\r
+                      ComponentName,\r
+                      NULL\r
+                      );\r
+    } else {\r
+      Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                      DriverBinding->DriverBindingHandle,\r
+                      &gEfiDriverBindingProtocolGuid,\r
+                      DriverBinding,\r
+                      &gEfiComponentNameProtocolGuid,\r
+                      ComponentName,\r
+                      &gEfiComponentName2ProtocolGuid,\r
+                      ComponentName2,\r
+                      NULL\r
+                      );\r
+    }\r
+  }\r
+\r
+  //\r
+  // ASSERT if the call to UninstallMultipleProtocolInterfaces() failed\r
+  //\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  return Status;\r
+}\r
 \r
 /**\r
-  Intialize a driver by installing the Driver Binding Protocol onto the\r
-  driver's DriverBindingHandle.  This is typically the same as the driver's\r
-  ImageHandle, but it can be different if the driver produces multiple\r
-  DriverBinding Protocols.  This function also initializes the EFI Driver\r
-  Library that initializes the global variables gST, gBS, gRT.\r
-\r
-  @ImageHandle                 The image handle of the driver\r
-  @SystemTable                 The EFI System Table that was passed to the driver's entry point\r
-  @DriverBinding               A Driver Binding Protocol instance that this driver is producing\r
-  @DriverBindingHandle         The handle that DriverBinding is to be installe onto.  If this\r
-                               parameter is NULL, then a new handle is created.\r
-  @ComponentName               A Component Name Protocol instance that this driver is producing\r
-  @DriverConfiguration         A Driver Configuration Protocol instance that this driver is producing\r
-  @DriverDiagnostics           A Driver Diagnostics Protocol instance that this driver is producing\r
+  Installs Driver Binding Protocol with optional Component Name, Component Name 2, Driver\r
+  Configuration, Driver Configuration 2, Driver Diagnostics, and Driver Diagnostics 2 Protocols.\r
+\r
+  Initializes a driver by installing the Driver Binding Protocol together with the optional\r
+  Component Name, optional Component Name 2, optional Driver Configuration, optional Driver Configuration 2,\r
+  optional Driver Diagnostic, and optional Driver Diagnostic 2 Protocols onto the driver's DriverBindingHandle.\r
+  DriverBindingHandle is typically the same as the driver's ImageHandle, but it can be different if the driver\r
+  produces multiple Driver Binding Protocols.\r
+  If DriverBinding is NULL, then ASSERT().\r
+  If the installation fails, then ASSERT().\r
 \r
-  @retval EFI_SUCCESS          DriverBinding is installed onto DriverBindingHandle\r
-  @retval Other                Status from gBS->InstallProtocolInterface()\r
+\r
+  @param  ImageHandle           The image handle of the driver.\r
+  @param  SystemTable           The EFI System Table that was passed to the driver's entry point.\r
+  @param  DriverBinding         A Driver Binding Protocol instance that this driver is producing.\r
+  @param  DriverBindingHandle   The handle that DriverBinding is to be installed onto.  If this\r
+                                parameter is NULL, then a new handle is created.\r
+  @param  ComponentName         A Component Name Protocol instance that this driver is producing.\r
+  @param  ComponentName2        A Component Name 2 Protocol instance that this driver is producing.\r
+  @param  DriverConfiguration   A Driver Configuration Protocol instance that this driver is producing.\r
+  @param  DriverConfiguration2  A Driver Configuration Protocol 2 instance that this driver is producing.\r
+  @param  DriverDiagnostics     A Driver Diagnostics Protocol instance that this driver is producing.\r
+  @param  DriverDiagnostics2    A Driver Diagnostics Protocol 2 instance that this driver is producing.\r
+\r
+  @retval EFI_SUCCESS           The protocol installation successfully completed.\r
+  @retval EFI_OUT_OF_RESOURCES  There was not enough memory in pool to install all the protocols.\r
 \r
 **/\r
 EFI_STATUS\r
 EFIAPI\r
 EfiLibInstallAllDriverProtocols2 (\r
-  IN const EFI_HANDLE                         ImageHandle,\r
-  IN const EFI_SYSTEM_TABLE                   *SystemTable,\r
-  IN EFI_DRIVER_BINDING_PROTOCOL              *DriverBinding,\r
-  IN EFI_HANDLE                               DriverBindingHandle,\r
-  IN const EFI_COMPONENT_NAME_PROTOCOL        *ComponentName,       OPTIONAL\r
-  IN const EFI_COMPONENT_NAME2_PROTOCOL       *ComponentName2,      OPTIONAL\r
-  IN const EFI_DRIVER_CONFIGURATION_PROTOCOL  *DriverConfiguration, OPTIONAL\r
-  IN const EFI_DRIVER_DIAGNOSTICS_PROTOCOL    *DriverDiagnostics,   OPTIONAL\r
-  IN const EFI_DRIVER_DIAGNOSTICS2_PROTOCOL   *DriverDiagnostics2   OPTIONAL\r
+  IN CONST EFI_HANDLE                          ImageHandle,\r
+  IN CONST EFI_SYSTEM_TABLE                    *SystemTable,\r
+  IN EFI_DRIVER_BINDING_PROTOCOL               *DriverBinding,\r
+  IN EFI_HANDLE                                DriverBindingHandle,\r
+  IN CONST EFI_COMPONENT_NAME_PROTOCOL         *ComponentName         OPTIONAL,\r
+  IN CONST EFI_COMPONENT_NAME2_PROTOCOL        *ComponentName2        OPTIONAL,\r
+  IN CONST EFI_DRIVER_CONFIGURATION_PROTOCOL   *DriverConfiguration   OPTIONAL,\r
+  IN CONST EFI_DRIVER_CONFIGURATION2_PROTOCOL  *DriverConfiguration2  OPTIONAL,\r
+  IN CONST EFI_DRIVER_DIAGNOSTICS_PROTOCOL     *DriverDiagnostics     OPTIONAL,\r
+  IN CONST EFI_DRIVER_DIAGNOSTICS2_PROTOCOL    *DriverDiagnostics2    OPTIONAL\r
   )\r
 {\r
   EFI_STATUS  Status;\r
 \r
-  ASSERT (NULL != DriverBinding);\r
-\r
-  if (DriverConfiguration == NULL) {\r
-    if (DriverDiagnostics == NULL || FeaturePcdGet(PcdDriverDiagnosticsDisable)) {\r
-      if (DriverDiagnostics2 == NULL || FeaturePcdGet(PcdDriverDiagnostics2Disable)) {\r
-        if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {\r
-          if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
-            Status = gBS->InstallMultipleProtocolInterfaces (\r
-                            &DriverBindingHandle,\r
-                            &gEfiDriverBindingProtocolGuid, DriverBinding,\r
-                            NULL\r
-                            );\r
-          } else {\r
-            Status = gBS->InstallMultipleProtocolInterfaces (\r
-                            &DriverBindingHandle,\r
-                            &gEfiDriverBindingProtocolGuid, DriverBinding,\r
-                            &gEfiComponentName2ProtocolGuid, ComponentName2,\r
-                            NULL\r
-                            );\r
+  ASSERT (DriverBinding != NULL);\r
+\r
+  //\r
+  // Update the ImageHandle and DriverBindingHandle fields of the Driver Binding Protocol\r
+  //\r
+  DriverBinding->ImageHandle         = ImageHandle;\r
+  DriverBinding->DriverBindingHandle = DriverBindingHandle;\r
+\r
+  if (DriverConfiguration2 == NULL) {\r
+    if (DriverConfiguration == NULL) {\r
+      if ((DriverDiagnostics == NULL) || FeaturePcdGet (PcdDriverDiagnosticsDisable)) {\r
+        if ((DriverDiagnostics2 == NULL) || FeaturePcdGet (PcdDriverDiagnostics2Disable)) {\r
+          if ((ComponentName == NULL) || FeaturePcdGet (PcdComponentNameDisable)) {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              NULL\r
+                              );\r
+            }\r
+          } else {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              NULL\r
+                              );\r
+            }\r
           }\r
         } else {\r
-          if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
-            Status = gBS->InstallMultipleProtocolInterfaces (\r
-                            &DriverBindingHandle,\r
-                            &gEfiDriverBindingProtocolGuid, DriverBinding,\r
-                            &gEfiComponentNameProtocolGuid, ComponentName,\r
-                            NULL\r
-                            );\r
-          } else {\r
-            Status = gBS->InstallMultipleProtocolInterfaces (\r
-                            &DriverBindingHandle,\r
-                            &gEfiDriverBindingProtocolGuid, DriverBinding,\r
-                            &gEfiComponentNameProtocolGuid, ComponentName,\r
-                            &gEfiComponentName2ProtocolGuid, ComponentName2,\r
-                            NULL\r
-                            );\r
+          if ((ComponentName == NULL) || FeaturePcdGet (PcdComponentNameDisable)) {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            }\r
+          } else {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            }\r
           }\r
         }\r
       } else {\r
-        if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {\r
-          if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
-            Status = gBS->InstallMultipleProtocolInterfaces (\r
-                            &DriverBindingHandle,\r
-                            &gEfiDriverBindingProtocolGuid, DriverBinding,\r
-                            &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,\r
-                            NULL\r
-                            );\r
-          } else {\r
-            Status = gBS->InstallMultipleProtocolInterfaces (\r
-                            &DriverBindingHandle,\r
-                            &gEfiDriverBindingProtocolGuid, DriverBinding,\r
-                            &gEfiComponentName2ProtocolGuid, ComponentName2,\r
-                            &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,\r
-                            NULL\r
-                            );\r
+        if ((DriverDiagnostics2 == NULL) || FeaturePcdGet (PcdDriverDiagnostics2Disable)) {\r
+          if ((ComponentName == NULL) || FeaturePcdGet (PcdComponentNameDisable)) {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              NULL\r
+                              );\r
+            }\r
+          } else {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              NULL\r
+                              );\r
+            }\r
           }\r
         } else {\r
-          if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
-            Status = gBS->InstallMultipleProtocolInterfaces (\r
-                            &DriverBindingHandle,\r
-                            &gEfiDriverBindingProtocolGuid, DriverBinding,\r
-                            &gEfiComponentNameProtocolGuid, ComponentName,\r
-                            &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,\r
-                            NULL\r
-                            );\r
-          } else {\r
-            Status = gBS->InstallMultipleProtocolInterfaces (\r
-                            &DriverBindingHandle,\r
-                            &gEfiDriverBindingProtocolGuid, DriverBinding,\r
-                            &gEfiComponentNameProtocolGuid, ComponentName,\r
-                            &gEfiComponentName2ProtocolGuid, ComponentName2,\r
-                            &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,\r
-                            NULL\r
-                            );\r
+          if ((ComponentName == NULL) || FeaturePcdGet (PcdComponentNameDisable)) {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            }\r
+          } else {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            }\r
           }\r
         }\r
       }\r
     } else {\r
-      if (DriverDiagnostics2 == NULL || FeaturePcdGet(PcdDriverDiagnostics2Disable)) {\r
-        if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {\r
-          if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
-            Status = gBS->InstallMultipleProtocolInterfaces (\r
-                            &DriverBindingHandle,\r
-                            &gEfiDriverBindingProtocolGuid, DriverBinding,\r
-                            &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,\r
-                            NULL\r
-                            );\r
-          } else {\r
-            Status = gBS->InstallMultipleProtocolInterfaces (\r
-                            &DriverBindingHandle,\r
-                            &gEfiDriverBindingProtocolGuid, DriverBinding,\r
-                            &gEfiComponentName2ProtocolGuid, ComponentName2,\r
-                            &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,\r
-                            NULL\r
-                            );\r
+      if ((DriverDiagnostics == NULL) || FeaturePcdGet (PcdDriverDiagnosticsDisable)) {\r
+        if ((DriverDiagnostics2 == NULL) || FeaturePcdGet (PcdDriverDiagnostics2Disable)) {\r
+          if ((ComponentName == NULL) || FeaturePcdGet (PcdComponentNameDisable)) {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              NULL\r
+                              );\r
+            }\r
+          } else {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              NULL\r
+                              );\r
+            }\r
           }\r
         } else {\r
-          if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
-            Status = gBS->InstallMultipleProtocolInterfaces (\r
-                            &DriverBindingHandle,\r
-                            &gEfiDriverBindingProtocolGuid, DriverBinding,\r
-                            &gEfiComponentNameProtocolGuid, ComponentName,\r
-                            &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,\r
-                            NULL\r
-                            );\r
-          } else {\r
-            Status = gBS->InstallMultipleProtocolInterfaces (\r
-                            &DriverBindingHandle,\r
-                            &gEfiDriverBindingProtocolGuid, DriverBinding,\r
-                            &gEfiComponentNameProtocolGuid, ComponentName,\r
-                            &gEfiComponentName2ProtocolGuid, ComponentName2,\r
-                            &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,\r
-                            NULL\r
-                            );\r
+          if ((ComponentName == NULL) || FeaturePcdGet (PcdComponentNameDisable)) {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            }\r
+          } else {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            }\r
           }\r
         }\r
       } else {\r
-        if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {\r
-          if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
-            Status = gBS->InstallMultipleProtocolInterfaces (\r
-                            &DriverBindingHandle,\r
-                            &gEfiDriverBindingProtocolGuid, DriverBinding,\r
-                            &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,\r
-                            &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,\r
-                            NULL\r
-                            );\r
-          } else {\r
-            Status = gBS->InstallMultipleProtocolInterfaces (\r
-                            &DriverBindingHandle,\r
-                            &gEfiDriverBindingProtocolGuid, DriverBinding,\r
-                            &gEfiComponentName2ProtocolGuid, ComponentName2,\r
-                            &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,\r
-                            &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,\r
-                            NULL\r
-                            );\r
+        if ((DriverDiagnostics2 == NULL) || FeaturePcdGet (PcdDriverDiagnostics2Disable)) {\r
+          if ((ComponentName == NULL) || FeaturePcdGet (PcdComponentNameDisable)) {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              NULL\r
+                              );\r
+            }\r
+          } else {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              NULL\r
+                              );\r
+            }\r
           }\r
         } else {\r
-          if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
-            Status = gBS->InstallMultipleProtocolInterfaces (\r
-                            &DriverBindingHandle,\r
-                            &gEfiDriverBindingProtocolGuid, DriverBinding,\r
-                            &gEfiComponentNameProtocolGuid, ComponentName,\r
-                            &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,\r
-                            &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,\r
-                            NULL\r
-                            );\r
-          } else {\r
-            Status = gBS->InstallMultipleProtocolInterfaces (\r
-                            &DriverBindingHandle,\r
-                            &gEfiDriverBindingProtocolGuid, DriverBinding,\r
-                            &gEfiComponentNameProtocolGuid, ComponentName,\r
-                            &gEfiComponentName2ProtocolGuid, ComponentName2,\r
-                            &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,\r
-                            &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,\r
-                            NULL\r
-                            );\r
+          if ((ComponentName == NULL) || FeaturePcdGet (PcdComponentNameDisable)) {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            }\r
+          } else {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            }\r
           }\r
         }\r
       }\r
     }\r
   } else {\r
-    if (DriverDiagnostics == NULL || FeaturePcdGet(PcdDriverDiagnosticsDisable)) {\r
-      if (DriverDiagnostics2 == NULL || FeaturePcdGet(PcdDriverDiagnostics2Disable)) {\r
-        if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {\r
-          if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
-            Status = gBS->InstallMultipleProtocolInterfaces (\r
-                            &DriverBindingHandle,\r
-                            &gEfiDriverBindingProtocolGuid, DriverBinding,\r
-                            &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
-                            NULL\r
-                            );\r
-          } else {\r
-            Status = gBS->InstallMultipleProtocolInterfaces (\r
-                            &DriverBindingHandle,\r
-                            &gEfiDriverBindingProtocolGuid, DriverBinding,\r
-                            &gEfiComponentName2ProtocolGuid, ComponentName2,\r
-                            &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
-                            NULL\r
-                            );\r
+    if (DriverConfiguration == NULL) {\r
+      if ((DriverDiagnostics == NULL) || FeaturePcdGet (PcdDriverDiagnosticsDisable)) {\r
+        if ((DriverDiagnostics2 == NULL) || FeaturePcdGet (PcdDriverDiagnostics2Disable)) {\r
+          if ((ComponentName == NULL) || FeaturePcdGet (PcdComponentNameDisable)) {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              NULL\r
+                              );\r
+            }\r
+          } else {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              NULL\r
+                              );\r
+            }\r
           }\r
         } else {\r
-          if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
-            Status = gBS->InstallMultipleProtocolInterfaces (\r
-                            &DriverBindingHandle,\r
-                            &gEfiDriverBindingProtocolGuid, DriverBinding,\r
-                            &gEfiComponentNameProtocolGuid, ComponentName,\r
-                            &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
-                            NULL\r
-                            );\r
-          } else {\r
-            Status = gBS->InstallMultipleProtocolInterfaces (\r
-                            &DriverBindingHandle,\r
-                            &gEfiDriverBindingProtocolGuid, DriverBinding,\r
-                            &gEfiComponentNameProtocolGuid, ComponentName,\r
-                            &gEfiComponentName2ProtocolGuid, ComponentName2,\r
-                            &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
-                            NULL\r
-                            );\r
+          if ((ComponentName == NULL) || FeaturePcdGet (PcdComponentNameDisable)) {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            }\r
+          } else {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            }\r
           }\r
         }\r
       } else {\r
-        if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {\r
-          if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
-            Status = gBS->InstallMultipleProtocolInterfaces (\r
-                            &DriverBindingHandle,\r
-                            &gEfiDriverBindingProtocolGuid, DriverBinding,\r
-                            &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
-                            &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,\r
-                            NULL\r
-                            );\r
-          } else {\r
-            Status = gBS->InstallMultipleProtocolInterfaces (\r
-                            &DriverBindingHandle,\r
-                            &gEfiDriverBindingProtocolGuid, DriverBinding,\r
-                            &gEfiComponentName2ProtocolGuid, ComponentName2,\r
-                            &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
-                            &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,\r
-                            NULL\r
-                            );\r
+        if ((DriverDiagnostics2 == NULL) || FeaturePcdGet (PcdDriverDiagnostics2Disable)) {\r
+          if ((ComponentName == NULL) || FeaturePcdGet (PcdComponentNameDisable)) {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              NULL\r
+                              );\r
+            }\r
+          } else {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              NULL\r
+                              );\r
+            }\r
           }\r
         } else {\r
-          if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
-            Status = gBS->InstallMultipleProtocolInterfaces (\r
-                            &DriverBindingHandle,\r
-                            &gEfiDriverBindingProtocolGuid, DriverBinding,\r
-                            &gEfiComponentNameProtocolGuid, ComponentName,\r
-                            &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
-                            &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,\r
-                            NULL\r
-                            );\r
-          } else {\r
-            Status = gBS->InstallMultipleProtocolInterfaces (\r
-                            &DriverBindingHandle,\r
-                            &gEfiDriverBindingProtocolGuid, DriverBinding,\r
-                            &gEfiComponentNameProtocolGuid, ComponentName,\r
-                            &gEfiComponentName2ProtocolGuid, ComponentName2,\r
-                            &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
-                            &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,\r
-                            NULL\r
-                            );\r
+          if ((ComponentName == NULL) || FeaturePcdGet (PcdComponentNameDisable)) {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            }\r
+          } else {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            }\r
           }\r
         }\r
       }\r
     } else {\r
-      if (DriverDiagnostics2 == NULL || FeaturePcdGet(PcdDriverDiagnostics2Disable)) {\r
-        if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {\r
-          if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
-            Status = gBS->InstallMultipleProtocolInterfaces (\r
-                            &DriverBindingHandle,\r
-                            &gEfiDriverBindingProtocolGuid, DriverBinding,\r
-                            &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
-                            &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,\r
-                            NULL\r
-                            );\r
-          } else {\r
-            Status = gBS->InstallMultipleProtocolInterfaces (\r
-                            &DriverBindingHandle,\r
-                            &gEfiDriverBindingProtocolGuid, DriverBinding,\r
-                            &gEfiComponentName2ProtocolGuid, ComponentName2,\r
-                            &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
-                            &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,\r
-                            NULL\r
-                            );\r
+      if ((DriverDiagnostics == NULL) || FeaturePcdGet (PcdDriverDiagnosticsDisable)) {\r
+        if ((DriverDiagnostics2 == NULL) || FeaturePcdGet (PcdDriverDiagnostics2Disable)) {\r
+          if ((ComponentName == NULL) || FeaturePcdGet (PcdComponentNameDisable)) {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              NULL\r
+                              );\r
+            }\r
+          } else {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              NULL\r
+                              );\r
+            }\r
           }\r
         } else {\r
-          if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
-            Status = gBS->InstallMultipleProtocolInterfaces (\r
-                            &DriverBindingHandle,\r
-                            &gEfiDriverBindingProtocolGuid, DriverBinding,\r
-                            &gEfiComponentNameProtocolGuid, ComponentName,\r
-                            &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
-                            &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,\r
-                            NULL\r
-                            );\r
-          } else {\r
-            Status = gBS->InstallMultipleProtocolInterfaces (\r
-                            &DriverBindingHandle,\r
-                            &gEfiDriverBindingProtocolGuid, DriverBinding,\r
-                            &gEfiComponentNameProtocolGuid, ComponentName,\r
-                            &gEfiComponentName2ProtocolGuid, ComponentName2,\r
-                            &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
-                            &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,\r
-                            NULL\r
-                            );\r
+          if ((ComponentName == NULL) || FeaturePcdGet (PcdComponentNameDisable)) {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            }\r
+          } else {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            }\r
           }\r
         }\r
       } else {\r
-        if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {\r
-          if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
-            Status = gBS->InstallMultipleProtocolInterfaces (\r
-                            &DriverBindingHandle,\r
-                            &gEfiDriverBindingProtocolGuid, DriverBinding,\r
-                            &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
-                            &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,\r
-                            &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,\r
-                            NULL\r
-                            );\r
-          } else {\r
-            Status = gBS->InstallMultipleProtocolInterfaces (\r
-                            &DriverBindingHandle,\r
-                            &gEfiDriverBindingProtocolGuid, DriverBinding,\r
-                            &gEfiComponentName2ProtocolGuid, ComponentName2,\r
-                            &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
-                            &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,\r
-                            &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,\r
-                            NULL\r
-                            );\r
+        if ((DriverDiagnostics2 == NULL) || FeaturePcdGet (PcdDriverDiagnostics2Disable)) {\r
+          if ((ComponentName == NULL) || FeaturePcdGet (PcdComponentNameDisable)) {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              NULL\r
+                              );\r
+            }\r
+          } else {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              NULL\r
+                              );\r
+            }\r
           }\r
         } else {\r
-          if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
-            Status = gBS->InstallMultipleProtocolInterfaces (\r
-                            &DriverBindingHandle,\r
-                            &gEfiDriverBindingProtocolGuid, DriverBinding,\r
-                            &gEfiComponentNameProtocolGuid, ComponentName,\r
-                            &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
-                            &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,\r
-                            &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,\r
-                            NULL\r
-                            );\r
-          } else {\r
-            Status = gBS->InstallMultipleProtocolInterfaces (\r
-                            &DriverBindingHandle,\r
-                            &gEfiDriverBindingProtocolGuid, DriverBinding,\r
-                            &gEfiComponentNameProtocolGuid, ComponentName,\r
-                            &gEfiComponentName2ProtocolGuid, ComponentName2,\r
-                            &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
-                            &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,\r
-                            &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,\r
-                            NULL\r
-                            );\r
+          if ((ComponentName == NULL) || FeaturePcdGet (PcdComponentNameDisable)) {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            }\r
+          } else {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->InstallMultipleProtocolInterfaces (\r
+                              &DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            }\r
           }\r
         }\r
       }\r
@@ -569,13 +1569,1007 @@ EfiLibInstallAllDriverProtocols2 (
   //\r
   ASSERT_EFI_ERROR (Status);\r
 \r
+  return Status;\r
+}\r
+\r
+/**\r
+  Uninstalls Driver Binding Protocol with optional Component Name, Component Name 2, Driver\r
+  Configuration, Driver Configuration 2, Driver Diagnostics, and Driver Diagnostics 2 Protocols.\r
+\r
+  If DriverBinding is NULL, then ASSERT().\r
+  If the installation fails, then ASSERT().\r
+\r
+\r
+  @param  DriverBinding         A Driver Binding Protocol instance that this driver produced.\r
+  @param  ComponentName         A Component Name Protocol instance that this driver produced.\r
+  @param  ComponentName2        A Component Name 2 Protocol instance that this driver produced.\r
+  @param  DriverConfiguration   A Driver Configuration Protocol instance that this driver produced.\r
+  @param  DriverConfiguration2  A Driver Configuration Protocol 2 instance that this driver produced.\r
+  @param  DriverDiagnostics     A Driver Diagnostics Protocol instance that this driver produced.\r
+  @param  DriverDiagnostics2    A Driver Diagnostics Protocol 2 instance that this driver produced.\r
+\r
+  @retval EFI_SUCCESS           The protocol uninstallation successfully completed.\r
+  @retval Others                Status from gBS->UninstallMultipleProtocolInterfaces().\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+EfiLibUninstallAllDriverProtocols2 (\r
+  IN EFI_DRIVER_BINDING_PROTOCOL               *DriverBinding,\r
+  IN CONST EFI_COMPONENT_NAME_PROTOCOL         *ComponentName         OPTIONAL,\r
+  IN CONST EFI_COMPONENT_NAME2_PROTOCOL        *ComponentName2        OPTIONAL,\r
+  IN CONST EFI_DRIVER_CONFIGURATION_PROTOCOL   *DriverConfiguration   OPTIONAL,\r
+  IN CONST EFI_DRIVER_CONFIGURATION2_PROTOCOL  *DriverConfiguration2  OPTIONAL,\r
+  IN CONST EFI_DRIVER_DIAGNOSTICS_PROTOCOL     *DriverDiagnostics     OPTIONAL,\r
+  IN CONST EFI_DRIVER_DIAGNOSTICS2_PROTOCOL    *DriverDiagnostics2    OPTIONAL\r
+  )\r
+{\r
+  EFI_STATUS  Status;\r
+\r
+  ASSERT (DriverBinding != NULL);\r
+\r
+  if (DriverConfiguration2 == NULL) {\r
+    if (DriverConfiguration == NULL) {\r
+      if ((DriverDiagnostics == NULL) || FeaturePcdGet (PcdDriverDiagnosticsDisable)) {\r
+        if ((DriverDiagnostics2 == NULL) || FeaturePcdGet (PcdDriverDiagnostics2Disable)) {\r
+          if ((ComponentName == NULL) || FeaturePcdGet (PcdComponentNameDisable)) {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              NULL\r
+                              );\r
+            }\r
+          } else {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              NULL\r
+                              );\r
+            }\r
+          }\r
+        } else {\r
+          if ((ComponentName == NULL) || FeaturePcdGet (PcdComponentNameDisable)) {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            }\r
+          } else {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            }\r
+          }\r
+        }\r
+      } else {\r
+        if ((DriverDiagnostics2 == NULL) || FeaturePcdGet (PcdDriverDiagnostics2Disable)) {\r
+          if ((ComponentName == NULL) || FeaturePcdGet (PcdComponentNameDisable)) {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              NULL\r
+                              );\r
+            }\r
+          } else {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              NULL\r
+                              );\r
+            }\r
+          }\r
+        } else {\r
+          if ((ComponentName == NULL) || FeaturePcdGet (PcdComponentNameDisable)) {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            }\r
+          } else {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            }\r
+          }\r
+        }\r
+      }\r
+    } else {\r
+      if ((DriverDiagnostics == NULL) || FeaturePcdGet (PcdDriverDiagnosticsDisable)) {\r
+        if ((DriverDiagnostics2 == NULL) || FeaturePcdGet (PcdDriverDiagnostics2Disable)) {\r
+          if ((ComponentName == NULL) || FeaturePcdGet (PcdComponentNameDisable)) {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              NULL\r
+                              );\r
+            }\r
+          } else {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              NULL\r
+                              );\r
+            }\r
+          }\r
+        } else {\r
+          if ((ComponentName == NULL) || FeaturePcdGet (PcdComponentNameDisable)) {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            }\r
+          } else {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            }\r
+          }\r
+        }\r
+      } else {\r
+        if ((DriverDiagnostics2 == NULL) || FeaturePcdGet (PcdDriverDiagnostics2Disable)) {\r
+          if ((ComponentName == NULL) || FeaturePcdGet (PcdComponentNameDisable)) {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              NULL\r
+                              );\r
+            }\r
+          } else {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              NULL\r
+                              );\r
+            }\r
+          }\r
+        } else {\r
+          if ((ComponentName == NULL) || FeaturePcdGet (PcdComponentNameDisable)) {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            }\r
+          } else {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            }\r
+          }\r
+        }\r
+      }\r
+    }\r
+  } else {\r
+    if (DriverConfiguration == NULL) {\r
+      if ((DriverDiagnostics == NULL) || FeaturePcdGet (PcdDriverDiagnosticsDisable)) {\r
+        if ((DriverDiagnostics2 == NULL) || FeaturePcdGet (PcdDriverDiagnostics2Disable)) {\r
+          if ((ComponentName == NULL) || FeaturePcdGet (PcdComponentNameDisable)) {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              NULL\r
+                              );\r
+            }\r
+          } else {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              NULL\r
+                              );\r
+            }\r
+          }\r
+        } else {\r
+          if ((ComponentName == NULL) || FeaturePcdGet (PcdComponentNameDisable)) {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            }\r
+          } else {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            }\r
+          }\r
+        }\r
+      } else {\r
+        if ((DriverDiagnostics2 == NULL) || FeaturePcdGet (PcdDriverDiagnostics2Disable)) {\r
+          if ((ComponentName == NULL) || FeaturePcdGet (PcdComponentNameDisable)) {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              NULL\r
+                              );\r
+            }\r
+          } else {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              NULL\r
+                              );\r
+            }\r
+          }\r
+        } else {\r
+          if ((ComponentName == NULL) || FeaturePcdGet (PcdComponentNameDisable)) {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            }\r
+          } else {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            }\r
+          }\r
+        }\r
+      }\r
+    } else {\r
+      if ((DriverDiagnostics == NULL) || FeaturePcdGet (PcdDriverDiagnosticsDisable)) {\r
+        if ((DriverDiagnostics2 == NULL) || FeaturePcdGet (PcdDriverDiagnostics2Disable)) {\r
+          if ((ComponentName == NULL) || FeaturePcdGet (PcdComponentNameDisable)) {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              NULL\r
+                              );\r
+            }\r
+          } else {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              NULL\r
+                              );\r
+            }\r
+          }\r
+        } else {\r
+          if ((ComponentName == NULL) || FeaturePcdGet (PcdComponentNameDisable)) {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            }\r
+          } else {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            }\r
+          }\r
+        }\r
+      } else {\r
+        if ((DriverDiagnostics2 == NULL) || FeaturePcdGet (PcdDriverDiagnostics2Disable)) {\r
+          if ((ComponentName == NULL) || FeaturePcdGet (PcdComponentNameDisable)) {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              NULL\r
+                              );\r
+            }\r
+          } else {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              NULL\r
+                              );\r
+            }\r
+          }\r
+        } else {\r
+          if ((ComponentName == NULL) || FeaturePcdGet (PcdComponentNameDisable)) {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            }\r
+          } else {\r
+            if ((ComponentName2 == NULL) || FeaturePcdGet (PcdComponentName2Disable)) {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid,\r
+                              DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid,\r
+                              ComponentName,\r
+                              &gEfiComponentName2ProtocolGuid,\r
+                              ComponentName2,\r
+                              &gEfiDriverConfigurationProtocolGuid,\r
+                              DriverConfiguration,\r
+                              &gEfiDriverConfiguration2ProtocolGuid,\r
+                              DriverConfiguration2,\r
+                              &gEfiDriverDiagnosticsProtocolGuid,\r
+                              DriverDiagnostics,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid,\r
+                              DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            }\r
+          }\r
+        }\r
+      }\r
+    }\r
+  }\r
+\r
   //\r
-  // Update the ImageHandle and DriverBindingHandle fields of the Driver Binding Protocol\r
+  // ASSERT if the call to UninstallMultipleProtocolInterfaces() failed\r
   //\r
-  DriverBinding->ImageHandle         = ImageHandle;\r
-  DriverBinding->DriverBindingHandle = DriverBindingHandle;\r
+  ASSERT_EFI_ERROR (Status);\r
 \r
   return Status;\r
 }\r
-\r
-\r