]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdePkg/Library/UefiLib/UefiDriverModel.c
MdePkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / MdePkg / Library / UefiLib / UefiDriverModel.c
index 7d07dacb971ee69e44a440e8c6b18731e29855a9..2f8bf8d2b857debb499a2d3a5f66aacd4f82c866 100644 (file)
@@ -1,30 +1,25 @@
 /** @file\r
   Library functions that abstract driver model protocols\r
-  installation.\r
+  installation and uninstallation.\r
 \r
-  Copyright (c) 2006 - 2008, 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 "UefiLibInternal.h"\r
 \r
 /**\r
   Installs and completes the initialization of a Driver Binding Protocol instance.\r
-  \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
+  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
@@ -33,7 +28,7 @@
   @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           The protocol installation is completed successfully.\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
@@ -51,8 +46,14 @@ EfiLibInstallDriverBinding (
 \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
+                  &DriverBinding->DriverBindingHandle,\r
                   &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                   NULL\r
                   );\r
@@ -61,16 +62,48 @@ EfiLibInstallDriverBinding (
   //\r
   ASSERT_EFI_ERROR (Status);\r
 \r
+  return Status;\r
+}\r
+\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, 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
+\r
 /**\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
@@ -80,10 +113,10 @@ EfiLibInstallDriverBinding (
   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
+  driver produces multiple Driver Binding Protocols.\r
+  If DriverBinding is NULL, then ASSERT().\r
   If the installation fails, then ASSERT().\r
-  \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
@@ -93,7 +126,7 @@ EfiLibInstallDriverBinding (
   @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           The protocol installation is completed successfully.\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
@@ -113,17 +146,23 @@ EfiLibInstallAllDriverProtocols (
 \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 (DriverDiagnostics == NULL || FeaturePcdGet(PcdDriverDiagnosticsDisable)) {\r
     if (DriverConfiguration == NULL) {\r
       if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {\r
         Status = gBS->InstallMultipleProtocolInterfaces (\r
-                        &DriverBindingHandle,\r
+                        &DriverBinding->DriverBindingHandle,\r
                         &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                         NULL\r
                         );\r
       } else {\r
         Status = gBS->InstallMultipleProtocolInterfaces (\r
-                        &DriverBindingHandle,\r
+                        &DriverBinding->DriverBindingHandle,\r
                         &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                         &gEfiComponentNameProtocolGuid, ComponentName,\r
                         NULL\r
@@ -132,14 +171,14 @@ EfiLibInstallAllDriverProtocols (
     } else {\r
       if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {\r
         Status = gBS->InstallMultipleProtocolInterfaces (\r
-                        &DriverBindingHandle,\r
+                        &DriverBinding->DriverBindingHandle,\r
                         &gEfiDriverBindingProtocolGuid,       DriverBinding,\r
                         &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
                         NULL\r
                         );\r
       } else {\r
         Status = gBS->InstallMultipleProtocolInterfaces (\r
-                        &DriverBindingHandle,\r
+                        &DriverBinding->DriverBindingHandle,\r
                         &gEfiDriverBindingProtocolGuid,       DriverBinding,\r
                         &gEfiComponentNameProtocolGuid,       ComponentName,\r
                         &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
@@ -151,14 +190,14 @@ EfiLibInstallAllDriverProtocols (
     if (DriverConfiguration == NULL) {\r
       if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {\r
         Status = gBS->InstallMultipleProtocolInterfaces (\r
-                        &DriverBindingHandle,\r
+                        &DriverBinding->DriverBindingHandle,\r
                         &gEfiDriverBindingProtocolGuid,     DriverBinding,\r
                         &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,\r
                         NULL\r
                         );\r
       } else {\r
         Status = gBS->InstallMultipleProtocolInterfaces (\r
-                        &DriverBindingHandle,\r
+                        &DriverBinding->DriverBindingHandle,\r
                         &gEfiDriverBindingProtocolGuid,     DriverBinding,\r
                         &gEfiComponentNameProtocolGuid,     ComponentName,\r
                         &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,\r
@@ -168,7 +207,7 @@ EfiLibInstallAllDriverProtocols (
     } else {\r
       if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {\r
        Status = gBS->InstallMultipleProtocolInterfaces (\r
-                        &DriverBindingHandle,\r
+                        &DriverBinding->DriverBindingHandle,\r
                         &gEfiDriverBindingProtocolGuid,       DriverBinding,\r
                         &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
                         &gEfiDriverDiagnosticsProtocolGuid,   DriverDiagnostics,\r
@@ -176,7 +215,7 @@ EfiLibInstallAllDriverProtocols (
                         );\r
       } else {\r
         Status = gBS->InstallMultipleProtocolInterfaces (\r
-                        &DriverBindingHandle,\r
+                        &DriverBinding->DriverBindingHandle,\r
                         &gEfiDriverBindingProtocolGuid,       DriverBinding,\r
                         &gEfiComponentNameProtocolGuid,       ComponentName,\r
                         &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
@@ -192,11 +231,118 @@ EfiLibInstallAllDriverProtocols (
   //\r
   ASSERT_EFI_ERROR (Status);\r
 \r
+  return Status;\r
+}\r
+\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, DriverBinding,\r
+                        NULL\r
+                        );\r
+      } else {\r
+        Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                        DriverBinding->DriverBindingHandle,\r
+                        &gEfiDriverBindingProtocolGuid, DriverBinding,\r
+                        &gEfiComponentNameProtocolGuid, ComponentName,\r
+                        NULL\r
+                        );\r
+      }\r
+    } else {\r
+      if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {\r
+        Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                        DriverBinding->DriverBindingHandle,\r
+                        &gEfiDriverBindingProtocolGuid,       DriverBinding,\r
+                        &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
+                        NULL\r
+                        );\r
+      } else {\r
+        Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                        DriverBinding->DriverBindingHandle,\r
+                        &gEfiDriverBindingProtocolGuid,       DriverBinding,\r
+                        &gEfiComponentNameProtocolGuid,       ComponentName,\r
+                        &gEfiDriverConfigurationProtocolGuid, 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,     DriverBinding,\r
+                        &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,\r
+                        NULL\r
+                        );\r
+      } else {\r
+        Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                        DriverBinding->DriverBindingHandle,\r
+                        &gEfiDriverBindingProtocolGuid,     DriverBinding,\r
+                        &gEfiComponentNameProtocolGuid,     ComponentName,\r
+                        &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,\r
+                        NULL\r
+                        );\r
+      }\r
+    } else {\r
+      if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {\r
+       Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                        DriverBinding->DriverBindingHandle,\r
+                        &gEfiDriverBindingProtocolGuid,       DriverBinding,\r
+                        &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
+                        &gEfiDriverDiagnosticsProtocolGuid,   DriverDiagnostics,\r
+                        NULL\r
+                        );\r
+      } else {\r
+        Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                        DriverBinding->DriverBindingHandle,\r
+                        &gEfiDriverBindingProtocolGuid,       DriverBinding,\r
+                        &gEfiComponentNameProtocolGuid,       ComponentName,\r
+                        &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
+                        &gEfiDriverDiagnosticsProtocolGuid,   DriverDiagnostics,\r
+                        NULL\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
@@ -210,8 +356,8 @@ EfiLibInstallAllDriverProtocols (
   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
+  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
@@ -222,7 +368,7 @@ EfiLibInstallAllDriverProtocols (
   @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 is completed successfully.\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
@@ -241,16 +387,22 @@ EfiLibInstallDriverBindingComponentName2 (
 \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
-                      &DriverBindingHandle,\r
+                      &DriverBinding->DriverBindingHandle,\r
                       &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                       NULL\r
                       );\r
       } else {\r
       Status = gBS->InstallMultipleProtocolInterfaces (\r
-                      &DriverBindingHandle,\r
+                      &DriverBinding->DriverBindingHandle,\r
                       &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                       &gEfiComponentName2ProtocolGuid, ComponentName2,\r
                       NULL\r
@@ -259,14 +411,14 @@ EfiLibInstallDriverBindingComponentName2 (
   } else {\r
      if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
        Status = gBS->InstallMultipleProtocolInterfaces (\r
-                       &DriverBindingHandle,\r
+                       &DriverBinding->DriverBindingHandle,\r
                        &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                        &gEfiComponentNameProtocolGuid, ComponentName,\r
                        NULL\r
                        );\r
      } else {\r
        Status = gBS->InstallMultipleProtocolInterfaces (\r
-                       &DriverBindingHandle,\r
+                       &DriverBinding->DriverBindingHandle,\r
                        &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                        &gEfiComponentNameProtocolGuid, ComponentName,\r
                        &gEfiComponentName2ProtocolGuid, ComponentName2,\r
@@ -274,16 +426,81 @@ EfiLibInstallDriverBindingComponentName2 (
                        );\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
+\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, DriverBinding,\r
+                      NULL\r
+                      );\r
+      } else {\r
+      Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                      DriverBinding->DriverBindingHandle,\r
+                      &gEfiDriverBindingProtocolGuid, DriverBinding,\r
+                      &gEfiComponentName2ProtocolGuid, ComponentName2,\r
+                      NULL\r
+                      );\r
+     }\r
+  } else {\r
+     if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
+       Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                       DriverBinding->DriverBindingHandle,\r
+                       &gEfiDriverBindingProtocolGuid, DriverBinding,\r
+                       &gEfiComponentNameProtocolGuid, ComponentName,\r
+                       NULL\r
+                       );\r
+     } else {\r
+       Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                       DriverBinding->DriverBindingHandle,\r
+                       &gEfiDriverBindingProtocolGuid, DriverBinding,\r
+                       &gEfiComponentNameProtocolGuid, ComponentName,\r
+                       &gEfiComponentName2ProtocolGuid, ComponentName2,\r
+                       NULL\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
@@ -298,15 +515,15 @@ EfiLibInstallDriverBindingComponentName2 (
   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
+  produces multiple Driver Binding Protocols.\r
+  If DriverBinding is NULL, then ASSERT().\r
   If the installation fails, then ASSERT().\r
 \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
+  @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
@@ -315,7 +532,7 @@ EfiLibInstallDriverBindingComponentName2 (
   @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 is completed successfully.\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
@@ -336,7 +553,13 @@ EfiLibInstallAllDriverProtocols2 (
 {\r
   EFI_STATUS  Status;\r
 \r
-  ASSERT (DriverBinding != NULL); \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
@@ -345,13 +568,13 @@ EfiLibInstallAllDriverProtocols2 (
           if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {\r
             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               NULL\r
                               );\r
             } else {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               &gEfiComponentName2ProtocolGuid, ComponentName2,\r
                               NULL\r
@@ -360,14 +583,14 @@ EfiLibInstallAllDriverProtocols2 (
           } else {\r
             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               &gEfiComponentNameProtocolGuid, ComponentName,\r
                               NULL\r
                               );\r
             } else {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               &gEfiComponentNameProtocolGuid, ComponentName,\r
                               &gEfiComponentName2ProtocolGuid, ComponentName2,\r
@@ -379,14 +602,14 @@ EfiLibInstallAllDriverProtocols2 (
           if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {\r
             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,\r
                               NULL\r
                               );\r
             } else {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               &gEfiComponentName2ProtocolGuid, ComponentName2,\r
                               &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,\r
@@ -396,7 +619,7 @@ EfiLibInstallAllDriverProtocols2 (
           } else {\r
             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               &gEfiComponentNameProtocolGuid, ComponentName,\r
                               &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,\r
@@ -404,7 +627,7 @@ EfiLibInstallAllDriverProtocols2 (
                               );\r
             } else {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               &gEfiComponentNameProtocolGuid, ComponentName,\r
                               &gEfiComponentName2ProtocolGuid, ComponentName2,\r
@@ -419,14 +642,14 @@ EfiLibInstallAllDriverProtocols2 (
           if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {\r
             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,\r
                               NULL\r
                               );\r
             } else {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               &gEfiComponentName2ProtocolGuid, ComponentName2,\r
                               &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,\r
@@ -436,7 +659,7 @@ EfiLibInstallAllDriverProtocols2 (
           } else {\r
             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               &gEfiComponentNameProtocolGuid, ComponentName,\r
                               &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,\r
@@ -444,7 +667,7 @@ EfiLibInstallAllDriverProtocols2 (
                               );\r
             } else {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               &gEfiComponentNameProtocolGuid, ComponentName,\r
                               &gEfiComponentName2ProtocolGuid, ComponentName2,\r
@@ -457,7 +680,7 @@ EfiLibInstallAllDriverProtocols2 (
           if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {\r
             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,\r
                               &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,\r
@@ -465,7 +688,7 @@ EfiLibInstallAllDriverProtocols2 (
                               );\r
             } else {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               &gEfiComponentName2ProtocolGuid, ComponentName2,\r
                               &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,\r
@@ -476,7 +699,7 @@ EfiLibInstallAllDriverProtocols2 (
           } else {\r
             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               &gEfiComponentNameProtocolGuid, ComponentName,\r
                               &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,\r
@@ -485,7 +708,7 @@ EfiLibInstallAllDriverProtocols2 (
                               );\r
             } else {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               &gEfiComponentNameProtocolGuid, ComponentName,\r
                               &gEfiComponentName2ProtocolGuid, ComponentName2,\r
@@ -503,14 +726,14 @@ EfiLibInstallAllDriverProtocols2 (
           if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {\r
             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
                               NULL\r
                               );\r
             } else {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               &gEfiComponentName2ProtocolGuid, ComponentName2,\r
                               &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
@@ -520,7 +743,7 @@ EfiLibInstallAllDriverProtocols2 (
           } else {\r
             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               &gEfiComponentNameProtocolGuid, ComponentName,\r
                               &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
@@ -528,7 +751,7 @@ EfiLibInstallAllDriverProtocols2 (
                               );\r
             } else {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               &gEfiComponentNameProtocolGuid, ComponentName,\r
                               &gEfiComponentName2ProtocolGuid, ComponentName2,\r
@@ -541,7 +764,7 @@ EfiLibInstallAllDriverProtocols2 (
           if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {\r
             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
                               &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,\r
@@ -549,7 +772,7 @@ EfiLibInstallAllDriverProtocols2 (
                               );\r
             } else {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               &gEfiComponentName2ProtocolGuid, ComponentName2,\r
                               &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
@@ -560,7 +783,7 @@ EfiLibInstallAllDriverProtocols2 (
           } else {\r
             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               &gEfiComponentNameProtocolGuid, ComponentName,\r
                               &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
@@ -569,7 +792,7 @@ EfiLibInstallAllDriverProtocols2 (
                               );\r
             } else {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               &gEfiComponentNameProtocolGuid, ComponentName,\r
                               &gEfiComponentName2ProtocolGuid, ComponentName2,\r
@@ -585,7 +808,7 @@ EfiLibInstallAllDriverProtocols2 (
           if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {\r
             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
                               &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,\r
@@ -593,7 +816,7 @@ EfiLibInstallAllDriverProtocols2 (
                               );\r
             } else {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               &gEfiComponentName2ProtocolGuid, ComponentName2,\r
                               &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
@@ -604,7 +827,7 @@ EfiLibInstallAllDriverProtocols2 (
           } else {\r
             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               &gEfiComponentNameProtocolGuid, ComponentName,\r
                               &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
@@ -613,7 +836,7 @@ EfiLibInstallAllDriverProtocols2 (
                               );\r
             } else {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               &gEfiComponentNameProtocolGuid, ComponentName,\r
                               &gEfiComponentName2ProtocolGuid, ComponentName2,\r
@@ -627,7 +850,7 @@ EfiLibInstallAllDriverProtocols2 (
           if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {\r
             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
                               &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,\r
@@ -636,7 +859,7 @@ EfiLibInstallAllDriverProtocols2 (
                               );\r
             } else {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               &gEfiComponentName2ProtocolGuid, ComponentName2,\r
                               &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
@@ -648,7 +871,7 @@ EfiLibInstallAllDriverProtocols2 (
           } else {\r
             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               &gEfiComponentNameProtocolGuid, ComponentName,\r
                               &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
@@ -658,7 +881,7 @@ EfiLibInstallAllDriverProtocols2 (
                               );\r
             } else {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               &gEfiComponentNameProtocolGuid, ComponentName,\r
                               &gEfiComponentName2ProtocolGuid, ComponentName2,\r
@@ -679,14 +902,14 @@ EfiLibInstallAllDriverProtocols2 (
           if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {\r
             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,\r
                               NULL\r
                               );\r
             } else {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               &gEfiComponentName2ProtocolGuid, ComponentName2,\r
                               &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,\r
@@ -696,7 +919,7 @@ EfiLibInstallAllDriverProtocols2 (
           } else {\r
             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               &gEfiComponentNameProtocolGuid, ComponentName,\r
                               &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,\r
@@ -704,7 +927,7 @@ EfiLibInstallAllDriverProtocols2 (
                               );\r
             } else {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               &gEfiComponentNameProtocolGuid, ComponentName,\r
                               &gEfiComponentName2ProtocolGuid, ComponentName2,\r
@@ -717,7 +940,7 @@ EfiLibInstallAllDriverProtocols2 (
           if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {\r
             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,\r
                               &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,\r
@@ -725,7 +948,7 @@ EfiLibInstallAllDriverProtocols2 (
                               );\r
             } else {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               &gEfiComponentName2ProtocolGuid, ComponentName2,\r
                               &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,\r
@@ -736,7 +959,7 @@ EfiLibInstallAllDriverProtocols2 (
           } else {\r
             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               &gEfiComponentNameProtocolGuid, ComponentName,\r
                               &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,\r
@@ -745,7 +968,7 @@ EfiLibInstallAllDriverProtocols2 (
                               );\r
             } else {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               &gEfiComponentNameProtocolGuid, ComponentName,\r
                               &gEfiComponentName2ProtocolGuid, ComponentName2,\r
@@ -761,7 +984,7 @@ EfiLibInstallAllDriverProtocols2 (
           if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {\r
             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,\r
                               &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,\r
@@ -769,7 +992,7 @@ EfiLibInstallAllDriverProtocols2 (
                               );\r
             } else {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               &gEfiComponentName2ProtocolGuid, ComponentName2,\r
                               &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,\r
@@ -780,7 +1003,7 @@ EfiLibInstallAllDriverProtocols2 (
           } else {\r
             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               &gEfiComponentNameProtocolGuid, ComponentName,\r
                               &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,\r
@@ -789,7 +1012,7 @@ EfiLibInstallAllDriverProtocols2 (
                               );\r
             } else {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               &gEfiComponentNameProtocolGuid, ComponentName,\r
                               &gEfiComponentName2ProtocolGuid, ComponentName2,\r
@@ -803,7 +1026,7 @@ EfiLibInstallAllDriverProtocols2 (
           if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {\r
             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,\r
                               &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,\r
@@ -812,7 +1035,7 @@ EfiLibInstallAllDriverProtocols2 (
                               );\r
             } else {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               &gEfiComponentName2ProtocolGuid, ComponentName2,\r
                               &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,\r
@@ -824,7 +1047,7 @@ EfiLibInstallAllDriverProtocols2 (
           } else {\r
             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               &gEfiComponentNameProtocolGuid, ComponentName,\r
                               &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,\r
@@ -834,7 +1057,7 @@ EfiLibInstallAllDriverProtocols2 (
                               );\r
             } else {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               &gEfiComponentNameProtocolGuid, ComponentName,\r
                               &gEfiComponentName2ProtocolGuid, ComponentName2,\r
@@ -853,7 +1076,7 @@ EfiLibInstallAllDriverProtocols2 (
           if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {\r
             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
                               &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,\r
@@ -861,7 +1084,7 @@ EfiLibInstallAllDriverProtocols2 (
                               );\r
             } else {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               &gEfiComponentName2ProtocolGuid, ComponentName2,\r
                               &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
@@ -872,7 +1095,7 @@ EfiLibInstallAllDriverProtocols2 (
           } else {\r
             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               &gEfiComponentNameProtocolGuid, ComponentName,\r
                               &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
@@ -881,7 +1104,7 @@ EfiLibInstallAllDriverProtocols2 (
                               );\r
             } else {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               &gEfiComponentNameProtocolGuid, ComponentName,\r
                               &gEfiComponentName2ProtocolGuid, ComponentName2,\r
@@ -895,7 +1118,7 @@ EfiLibInstallAllDriverProtocols2 (
           if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {\r
             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
                               &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,\r
@@ -904,7 +1127,7 @@ EfiLibInstallAllDriverProtocols2 (
                               );\r
             } else {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               &gEfiComponentName2ProtocolGuid, ComponentName2,\r
                               &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
@@ -916,7 +1139,7 @@ EfiLibInstallAllDriverProtocols2 (
           } else {\r
             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               &gEfiComponentNameProtocolGuid, ComponentName,\r
                               &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
@@ -926,7 +1149,7 @@ EfiLibInstallAllDriverProtocols2 (
                               );\r
             } else {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               &gEfiComponentNameProtocolGuid, ComponentName,\r
                               &gEfiComponentName2ProtocolGuid, ComponentName2,\r
@@ -943,7 +1166,7 @@ EfiLibInstallAllDriverProtocols2 (
           if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {\r
             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
                               &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,\r
@@ -952,7 +1175,7 @@ EfiLibInstallAllDriverProtocols2 (
                               );\r
             } else {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               &gEfiComponentName2ProtocolGuid, ComponentName2,\r
                               &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
@@ -964,7 +1187,7 @@ EfiLibInstallAllDriverProtocols2 (
           } else {\r
             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               &gEfiComponentNameProtocolGuid, ComponentName,\r
                               &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
@@ -974,7 +1197,7 @@ EfiLibInstallAllDriverProtocols2 (
                               );\r
             } else {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               &gEfiComponentNameProtocolGuid, ComponentName,\r
                               &gEfiComponentName2ProtocolGuid, ComponentName2,\r
@@ -989,7 +1212,7 @@ EfiLibInstallAllDriverProtocols2 (
           if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {\r
             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
                               &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,\r
@@ -999,7 +1222,7 @@ EfiLibInstallAllDriverProtocols2 (
                               );\r
             } else {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               &gEfiComponentName2ProtocolGuid, ComponentName2,\r
                               &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
@@ -1012,7 +1235,7 @@ EfiLibInstallAllDriverProtocols2 (
           } else {\r
             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               &gEfiComponentNameProtocolGuid, ComponentName,\r
                               &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
@@ -1023,7 +1246,7 @@ EfiLibInstallAllDriverProtocols2 (
                               );\r
             } else {\r
               Status = gBS->InstallMultipleProtocolInterfaces (\r
-                              &DriverBindingHandle,\r
+                              &DriverBinding->DriverBindingHandle,\r
                               &gEfiDriverBindingProtocolGuid, DriverBinding,\r
                               &gEfiComponentNameProtocolGuid, ComponentName,\r
                               &gEfiComponentName2ProtocolGuid, ComponentName2,\r
@@ -1040,19 +1263,758 @@ EfiLibInstallAllDriverProtocols2 (
     }\r
   }\r
 \r
-\r
   //\r
   // ASSERT if the call to InstallMultipleProtocolInterfaces() failed\r
   //\r
   ASSERT_EFI_ERROR (Status);\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
   return Status;\r
 }\r
 \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, DriverBinding,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid, DriverBinding,\r
+                              &gEfiComponentName2ProtocolGuid, ComponentName2,\r
+                              NULL\r
+                              );\r
+            }\r
+          } else {\r
+            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid, DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid, ComponentName,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid, DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid, ComponentName,\r
+                              &gEfiComponentName2ProtocolGuid, 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, DriverBinding,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid, DriverBinding,\r
+                              &gEfiComponentName2ProtocolGuid, ComponentName2,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            }\r
+          } else {\r
+            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid, DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid, ComponentName,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid, DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid, ComponentName,\r
+                              &gEfiComponentName2ProtocolGuid, ComponentName2,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid, 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, DriverBinding,\r
+                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid, DriverBinding,\r
+                              &gEfiComponentName2ProtocolGuid, ComponentName2,\r
+                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,\r
+                              NULL\r
+                              );\r
+            }\r
+          } else {\r
+            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid, DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid, ComponentName,\r
+                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid, DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid, ComponentName,\r
+                              &gEfiComponentName2ProtocolGuid, ComponentName2,\r
+                              &gEfiDriverDiagnosticsProtocolGuid, 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, DriverBinding,\r
+                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid, DriverBinding,\r
+                              &gEfiComponentName2ProtocolGuid, ComponentName2,\r
+                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            }\r
+          } else {\r
+            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid, DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid, ComponentName,\r
+                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid, DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid, ComponentName,\r
+                              &gEfiComponentName2ProtocolGuid, ComponentName2,\r
+                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid, 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, DriverBinding,\r
+                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid, DriverBinding,\r
+                              &gEfiComponentName2ProtocolGuid, ComponentName2,\r
+                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
+                              NULL\r
+                              );\r
+            }\r
+          } else {\r
+            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid, DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid, ComponentName,\r
+                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid, DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid, ComponentName,\r
+                              &gEfiComponentName2ProtocolGuid, ComponentName2,\r
+                              &gEfiDriverConfigurationProtocolGuid, 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, DriverBinding,\r
+                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid, DriverBinding,\r
+                              &gEfiComponentName2ProtocolGuid, ComponentName2,\r
+                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            }\r
+          } else {\r
+            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid, DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid, ComponentName,\r
+                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid, DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid, ComponentName,\r
+                              &gEfiComponentName2ProtocolGuid, ComponentName2,\r
+                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid, 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, DriverBinding,\r
+                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
+                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid, DriverBinding,\r
+                              &gEfiComponentName2ProtocolGuid, ComponentName2,\r
+                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
+                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,\r
+                              NULL\r
+                              );\r
+            }\r
+          } else {\r
+            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid, DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid, ComponentName,\r
+                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
+                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid, DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid, ComponentName,\r
+                              &gEfiComponentName2ProtocolGuid, ComponentName2,\r
+                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
+                              &gEfiDriverDiagnosticsProtocolGuid, 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, DriverBinding,\r
+                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
+                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid, DriverBinding,\r
+                              &gEfiComponentName2ProtocolGuid, ComponentName2,\r
+                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
+                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            }\r
+          } else {\r
+            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid, DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid, ComponentName,\r
+                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
+                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid, DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid, ComponentName,\r
+                              &gEfiComponentName2ProtocolGuid, ComponentName2,\r
+                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
+                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid, 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, DriverBinding,\r
+                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid, DriverBinding,\r
+                              &gEfiComponentName2ProtocolGuid, ComponentName2,\r
+                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,\r
+                              NULL\r
+                              );\r
+            }\r
+          } else {\r
+            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid, DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid, ComponentName,\r
+                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid, DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid, ComponentName,\r
+                              &gEfiComponentName2ProtocolGuid, ComponentName2,\r
+                              &gEfiDriverConfiguration2ProtocolGuid, 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, DriverBinding,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,\r
+                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid, DriverBinding,\r
+                              &gEfiComponentName2ProtocolGuid, ComponentName2,\r
+                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            }\r
+          } else {\r
+            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid, DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid, ComponentName,\r
+                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid, DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid, ComponentName,\r
+                              &gEfiComponentName2ProtocolGuid, ComponentName2,\r
+                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid, 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, DriverBinding,\r
+                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,\r
+                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid, DriverBinding,\r
+                              &gEfiComponentName2ProtocolGuid, ComponentName2,\r
+                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,\r
+                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,\r
+                              NULL\r
+                              );\r
+            }\r
+          } else {\r
+            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid, DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid, ComponentName,\r
+                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,\r
+                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid, DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid, ComponentName,\r
+                              &gEfiComponentName2ProtocolGuid, ComponentName2,\r
+                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,\r
+                              &gEfiDriverDiagnosticsProtocolGuid, 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, DriverBinding,\r
+                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,\r
+                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid, DriverBinding,\r
+                              &gEfiComponentName2ProtocolGuid, ComponentName2,\r
+                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,\r
+                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            }\r
+          } else {\r
+            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid, DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid, ComponentName,\r
+                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,\r
+                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid, DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid, ComponentName,\r
+                              &gEfiComponentName2ProtocolGuid, ComponentName2,\r
+                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,\r
+                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid, 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, DriverBinding,\r
+                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
+                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid, DriverBinding,\r
+                              &gEfiComponentName2ProtocolGuid, ComponentName2,\r
+                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
+                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,\r
+                              NULL\r
+                              );\r
+            }\r
+          } else {\r
+            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid, DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid, ComponentName,\r
+                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
+                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid, DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid, ComponentName,\r
+                              &gEfiComponentName2ProtocolGuid, ComponentName2,\r
+                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
+                              &gEfiDriverConfiguration2ProtocolGuid, 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, DriverBinding,\r
+                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
+                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid, DriverBinding,\r
+                              &gEfiComponentName2ProtocolGuid, ComponentName2,\r
+                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
+                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            }\r
+          } else {\r
+            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid, DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid, ComponentName,\r
+                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
+                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid, DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid, ComponentName,\r
+                              &gEfiComponentName2ProtocolGuid, ComponentName2,\r
+                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
+                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid, 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, DriverBinding,\r
+                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
+                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,\r
+                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid, DriverBinding,\r
+                              &gEfiComponentName2ProtocolGuid, ComponentName2,\r
+                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
+                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,\r
+                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,\r
+                              NULL\r
+                              );\r
+            }\r
+          } else {\r
+            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid, DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid, ComponentName,\r
+                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
+                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,\r
+                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid, DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid, ComponentName,\r
+                              &gEfiComponentName2ProtocolGuid, ComponentName2,\r
+                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
+                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,\r
+                              &gEfiDriverDiagnosticsProtocolGuid, 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, DriverBinding,\r
+                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
+                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,\r
+                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid, DriverBinding,\r
+                              &gEfiComponentName2ProtocolGuid, ComponentName2,\r
+                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
+                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,\r
+                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            }\r
+          } else {\r
+            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid, DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid, ComponentName,\r
+                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
+                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,\r
+                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            } else {\r
+              Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                              DriverBinding->DriverBindingHandle,\r
+                              &gEfiDriverBindingProtocolGuid, DriverBinding,\r
+                              &gEfiComponentNameProtocolGuid, ComponentName,\r
+                              &gEfiComponentName2ProtocolGuid, ComponentName2,\r
+                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,\r
+                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,\r
+                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,\r
+                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,\r
+                              NULL\r
+                              );\r
+            }\r
+          }\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