]> git.proxmox.com Git - mirror_edk2.git/commitdiff
MdePkg/UefiLib: Abstract driver model protocol uninstallation
authorAshish Singhal <ashishsingha@nvidia.com>
Wed, 9 Jan 2019 20:58:34 +0000 (04:58 +0800)
committerLiming Gao <liming.gao@intel.com>
Thu, 10 Jan 2019 15:37:15 +0000 (23:37 +0800)
Provided functions in UEFILib that abstract driver model protocol
uninstallation. This helps drivers to install and uninstall protocols
using a library to keep things seemless.

REF: https://bugzilla.tianocore.org/show_bug.cgi?id=1429

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ashish Singhal <ashishsingha@nvidia.com>
Reviewed-by: Liming Gao <liming.gao@intel.com>
MdePkg/Include/Library/UefiLib.h
MdePkg/Library/UefiLib/UefiDriverModel.c

index 468bffc3cb6660ef9a4f52fc2a54aed671142352..08222d488bee72690fca07bfe08d3eb6d37a7bb3 100644 (file)
@@ -12,6 +12,7 @@
   of size reduction when compiler optimization is disabled. If MDEPKG_NDEBUG is\r
   defined, then debug and assert related macros wrapped by it are the NULL implementations.\r
 \r
+Copyright (c) 2019, NVIDIA Corporation. All rights reserved.\r
 Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>\r
 This program and the accompanying materials are licensed and made available under\r
 the terms and conditions of the BSD License that accompanies this distribution.\r
@@ -1283,6 +1284,7 @@ AsciiPrintXY (
   ...\r
   );\r
 \r
+\r
 /**\r
   Installs and completes the initialization of a Driver Binding Protocol instance.\r
 \r
@@ -1315,6 +1317,25 @@ EfiLibInstallDriverBinding (
   );\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
+\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
@@ -1354,6 +1375,31 @@ EfiLibInstallAllDriverProtocols (
   );\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
 \r
 /**\r
   Installs Driver Binding Protocol with optional Component Name and Component Name 2 Protocols.\r
@@ -1390,6 +1436,29 @@ EfiLibInstallDriverBindingComponentName2 (
   );\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
+\r
 /**\r
   Installs Driver Binding Protocol with optional Component Name, Component Name 2, Driver\r
   Configuration, Driver Configuration 2, Driver Diagnostics, and Driver Diagnostics 2 Protocols.\r
@@ -1434,6 +1503,40 @@ EfiLibInstallAllDriverProtocols2 (
   IN CONST EFI_DRIVER_DIAGNOSTICS2_PROTOCOL   *DriverDiagnostics2    OPTIONAL\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
+\r
 /**\r
   Appends a formatted Unicode string to a Null-terminated Unicode string\r
 \r
index 69581aeae83b96975b5edadaef6456d06def3768..262d8bcbb0538a98627b27f906ea37af5d3adb1e 100644 (file)
@@ -1,7 +1,8 @@
 /** @file\r
   Library functions that abstract driver model protocols\r
-  installation.\r
+  installation and uninstallation.\r
 \r
+  Copyright (c) 2019, NVIDIA Corporation. All rights reserved.\r
   Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>\r
   This program and the accompanying materials are\r
   licensed and made available under the terms and conditions of the BSD License\r
@@ -71,6 +72,44 @@ EfiLibInstallDriverBinding (
 }\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
+  // ASSERT if the call to UninstallMultipleProtocolInterfaces() failed\r
+  //\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
@@ -203,6 +242,119 @@ EfiLibInstallAllDriverProtocols (
 \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
+  // ASSERT if the call to UninstallMultipleProtocolInterfaces() failed\r
+  //\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  return Status;\r
+}\r
+\r
+\r
+\r
 /**\r
   Installs Driver Binding Protocol with optional Component Name and Component Name 2 Protocols.\r
 \r
@@ -291,6 +443,76 @@ EfiLibInstallDriverBindingComponentName2 (
 \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
+  // ASSERT if the call to UninstallMultipleProtocolInterfaces() failed\r
+  //\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  return Status;\r
+}\r
+\r
+\r
+\r
 /**\r
   Installs Driver Binding Protocol with optional Component Name, Component Name 2, Driver\r
   Configuration, Driver Configuration 2, Driver Diagnostics, and Driver Diagnostics 2 Protocols.\r
@@ -1054,3 +1276,751 @@ EfiLibInstallAllDriverProtocols2 (
 \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