/** @file
  Library functions that abstract driver model protocols
  installation and uninstallation.

  Copyright (c) 2019, NVIDIA Corporation. All rights reserved.
  Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
  SPDX-License-Identifier: BSD-2-Clause-Patent

**/


#include "UefiLibInternal.h"

/**
  Installs and completes the initialization of a Driver Binding Protocol instance.

  Installs the Driver Binding Protocol specified by DriverBinding onto the handle
  specified by DriverBindingHandle. If DriverBindingHandle is NULL, then DriverBinding
  is installed onto a newly created handle. DriverBindingHandle is typically the same
  as the driver's ImageHandle, but it can be different if the driver produces multiple
  Driver Binding Protocols.
  If DriverBinding is NULL, then ASSERT().
  If DriverBinding can not be installed onto a handle, then ASSERT().

  @param  ImageHandle          The image handle of the driver.
  @param  SystemTable          The EFI System Table that was passed to the driver's entry point.
  @param  DriverBinding        A Driver Binding Protocol instance that this driver is producing.
  @param  DriverBindingHandle  The handle that DriverBinding is to be installed onto.  If this
                               parameter is NULL, then a new handle is created.

  @retval EFI_SUCCESS           The protocol installation successfully completed.
  @retval EFI_OUT_OF_RESOURCES  There was not enough system resources to install the protocol.
  @retval Others                Status from gBS->InstallMultipleProtocolInterfaces().

**/
EFI_STATUS
EFIAPI
EfiLibInstallDriverBinding (
  IN CONST EFI_HANDLE             ImageHandle,
  IN CONST EFI_SYSTEM_TABLE       *SystemTable,
  IN EFI_DRIVER_BINDING_PROTOCOL  *DriverBinding,
  IN EFI_HANDLE                   DriverBindingHandle
  )
{
  EFI_STATUS  Status;

  ASSERT (DriverBinding != NULL);

  //
  // Update the ImageHandle and DriverBindingHandle fields of the Driver Binding Protocol
  //
  DriverBinding->ImageHandle         = ImageHandle;
  DriverBinding->DriverBindingHandle = DriverBindingHandle;

  Status = gBS->InstallMultipleProtocolInterfaces (
                  &DriverBinding->DriverBindingHandle,
                  &gEfiDriverBindingProtocolGuid, DriverBinding,
                  NULL
                  );
  //
  // ASSERT if the call to InstallMultipleProtocolInterfaces() failed
  //
  ASSERT_EFI_ERROR (Status);

  return Status;
}



/**
  Uninstalls a Driver Binding Protocol instance.

  If DriverBinding is NULL, then ASSERT().
  If DriverBinding can not be uninstalled, then ASSERT().

  @param  DriverBinding        A Driver Binding Protocol instance that this driver produced.

  @retval EFI_SUCCESS           The protocol uninstallation successfully completed.
  @retval Others                Status from gBS->UninstallMultipleProtocolInterfaces().

**/
EFI_STATUS
EFIAPI
EfiLibUninstallDriverBinding (
  IN EFI_DRIVER_BINDING_PROTOCOL  *DriverBinding
  )
{
  EFI_STATUS  Status;

  ASSERT (DriverBinding != NULL);

  Status = gBS->UninstallMultipleProtocolInterfaces (
                  DriverBinding->DriverBindingHandle,
                  &gEfiDriverBindingProtocolGuid, DriverBinding,
                  NULL
                  );
  //
  // ASSERT if the call to UninstallMultipleProtocolInterfaces() failed
  //
  ASSERT_EFI_ERROR (Status);

  return Status;
}



/**
  Installs and completes the initialization of a Driver Binding Protocol instance and
  optionally installs the Component Name, Driver Configuration and Driver Diagnostics Protocols.

  Initializes a driver by installing the Driver Binding Protocol together with the
  optional Component Name, optional Driver Configure and optional Driver Diagnostic
  Protocols onto the driver's DriverBindingHandle. If DriverBindingHandle is NULL,
  then the protocols are  installed onto a newly created handle. DriverBindingHandle
  is typically the same as the driver's ImageHandle, but it can be different if the
  driver produces multiple Driver Binding Protocols.
  If DriverBinding is NULL, then ASSERT().
  If the installation fails, then ASSERT().

  @param  ImageHandle          The image handle of the driver.
  @param  SystemTable          The EFI System Table that was passed to the driver's entry point.
  @param  DriverBinding        A Driver Binding Protocol instance that this driver is producing.
  @param  DriverBindingHandle  The handle that DriverBinding is to be installed onto.  If this
                               parameter is NULL, then a new handle is created.
  @param  ComponentName        A Component Name Protocol instance that this driver is producing.
  @param  DriverConfiguration  A Driver Configuration Protocol instance that this driver is producing.
  @param  DriverDiagnostics    A Driver Diagnostics Protocol instance that this driver is producing.

  @retval EFI_SUCCESS           The protocol installation successfully completed.
  @retval EFI_OUT_OF_RESOURCES  There was not enough memory in pool to install all the protocols.

**/
EFI_STATUS
EFIAPI
EfiLibInstallAllDriverProtocols (
  IN CONST EFI_HANDLE                         ImageHandle,
  IN CONST EFI_SYSTEM_TABLE                   *SystemTable,
  IN EFI_DRIVER_BINDING_PROTOCOL              *DriverBinding,
  IN EFI_HANDLE                               DriverBindingHandle,
  IN CONST EFI_COMPONENT_NAME_PROTOCOL        *ComponentName,       OPTIONAL
  IN CONST EFI_DRIVER_CONFIGURATION_PROTOCOL  *DriverConfiguration, OPTIONAL
  IN CONST EFI_DRIVER_DIAGNOSTICS_PROTOCOL    *DriverDiagnostics    OPTIONAL
  )
{
  EFI_STATUS  Status;

  ASSERT (DriverBinding != NULL);

  //
  // Update the ImageHandle and DriverBindingHandle fields of the Driver Binding Protocol
  //
  DriverBinding->ImageHandle         = ImageHandle;
  DriverBinding->DriverBindingHandle = DriverBindingHandle;

  if (DriverDiagnostics == NULL || FeaturePcdGet(PcdDriverDiagnosticsDisable)) {
    if (DriverConfiguration == NULL) {
      if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
        Status = gBS->InstallMultipleProtocolInterfaces (
                        &DriverBinding->DriverBindingHandle,
                        &gEfiDriverBindingProtocolGuid, DriverBinding,
                        NULL
                        );
      } else {
        Status = gBS->InstallMultipleProtocolInterfaces (
                        &DriverBinding->DriverBindingHandle,
                        &gEfiDriverBindingProtocolGuid, DriverBinding,
                        &gEfiComponentNameProtocolGuid, ComponentName,
                        NULL
                        );
      }
    } else {
      if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
        Status = gBS->InstallMultipleProtocolInterfaces (
                        &DriverBinding->DriverBindingHandle,
                        &gEfiDriverBindingProtocolGuid,       DriverBinding,
                        &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                        NULL
                        );
      } else {
        Status = gBS->InstallMultipleProtocolInterfaces (
                        &DriverBinding->DriverBindingHandle,
                        &gEfiDriverBindingProtocolGuid,       DriverBinding,
                        &gEfiComponentNameProtocolGuid,       ComponentName,
                        &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                        NULL
                        );
      }
    }
  } else {
    if (DriverConfiguration == NULL) {
      if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
        Status = gBS->InstallMultipleProtocolInterfaces (
                        &DriverBinding->DriverBindingHandle,
                        &gEfiDriverBindingProtocolGuid,     DriverBinding,
                        &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                        NULL
                        );
      } else {
        Status = gBS->InstallMultipleProtocolInterfaces (
                        &DriverBinding->DriverBindingHandle,
                        &gEfiDriverBindingProtocolGuid,     DriverBinding,
                        &gEfiComponentNameProtocolGuid,     ComponentName,
                        &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                        NULL
                        );
      }
    } else {
      if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
       Status = gBS->InstallMultipleProtocolInterfaces (
                        &DriverBinding->DriverBindingHandle,
                        &gEfiDriverBindingProtocolGuid,       DriverBinding,
                        &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                        &gEfiDriverDiagnosticsProtocolGuid,   DriverDiagnostics,
                        NULL
                        );
      } else {
        Status = gBS->InstallMultipleProtocolInterfaces (
                        &DriverBinding->DriverBindingHandle,
                        &gEfiDriverBindingProtocolGuid,       DriverBinding,
                        &gEfiComponentNameProtocolGuid,       ComponentName,
                        &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                        &gEfiDriverDiagnosticsProtocolGuid,   DriverDiagnostics,
                        NULL
                        );
      }
    }
  }

  //
  // ASSERT if the call to InstallMultipleProtocolInterfaces() failed
  //
  ASSERT_EFI_ERROR (Status);

  return Status;
}



/**
  Uninstalls a Driver Binding Protocol instance and optionally uninstalls the
  Component Name, Driver Configuration and Driver Diagnostics Protocols.

  If DriverBinding is NULL, then ASSERT().
  If the uninstallation fails, then ASSERT().

  @param  DriverBinding        A Driver Binding Protocol instance that this driver produced.
  @param  ComponentName        A Component Name Protocol instance that this driver produced.
  @param  DriverConfiguration  A Driver Configuration Protocol instance that this driver produced.
  @param  DriverDiagnostics    A Driver Diagnostics Protocol instance that this driver produced.

  @retval EFI_SUCCESS           The protocol uninstallation successfully completed.
  @retval Others                Status from gBS->UninstallMultipleProtocolInterfaces().

**/
EFI_STATUS
EFIAPI
EfiLibUninstallAllDriverProtocols (
  IN EFI_DRIVER_BINDING_PROTOCOL              *DriverBinding,
  IN CONST EFI_COMPONENT_NAME_PROTOCOL        *ComponentName,       OPTIONAL
  IN CONST EFI_DRIVER_CONFIGURATION_PROTOCOL  *DriverConfiguration, OPTIONAL
  IN CONST EFI_DRIVER_DIAGNOSTICS_PROTOCOL    *DriverDiagnostics    OPTIONAL
  )
{
  EFI_STATUS  Status;

  ASSERT (DriverBinding != NULL);

  if (DriverDiagnostics == NULL || FeaturePcdGet(PcdDriverDiagnosticsDisable)) {
    if (DriverConfiguration == NULL) {
      if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
        Status = gBS->UninstallMultipleProtocolInterfaces (
                        DriverBinding->DriverBindingHandle,
                        &gEfiDriverBindingProtocolGuid, DriverBinding,
                        NULL
                        );
      } else {
        Status = gBS->UninstallMultipleProtocolInterfaces (
                        DriverBinding->DriverBindingHandle,
                        &gEfiDriverBindingProtocolGuid, DriverBinding,
                        &gEfiComponentNameProtocolGuid, ComponentName,
                        NULL
                        );
      }
    } else {
      if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
        Status = gBS->UninstallMultipleProtocolInterfaces (
                        DriverBinding->DriverBindingHandle,
                        &gEfiDriverBindingProtocolGuid,       DriverBinding,
                        &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                        NULL
                        );
      } else {
        Status = gBS->UninstallMultipleProtocolInterfaces (
                        DriverBinding->DriverBindingHandle,
                        &gEfiDriverBindingProtocolGuid,       DriverBinding,
                        &gEfiComponentNameProtocolGuid,       ComponentName,
                        &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                        NULL
                        );
      }
    }
  } else {
    if (DriverConfiguration == NULL) {
      if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
        Status = gBS->UninstallMultipleProtocolInterfaces (
                        DriverBinding->DriverBindingHandle,
                        &gEfiDriverBindingProtocolGuid,     DriverBinding,
                        &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                        NULL
                        );
      } else {
        Status = gBS->UninstallMultipleProtocolInterfaces (
                        DriverBinding->DriverBindingHandle,
                        &gEfiDriverBindingProtocolGuid,     DriverBinding,
                        &gEfiComponentNameProtocolGuid,     ComponentName,
                        &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                        NULL
                        );
      }
    } else {
      if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
       Status = gBS->UninstallMultipleProtocolInterfaces (
                        DriverBinding->DriverBindingHandle,
                        &gEfiDriverBindingProtocolGuid,       DriverBinding,
                        &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                        &gEfiDriverDiagnosticsProtocolGuid,   DriverDiagnostics,
                        NULL
                        );
      } else {
        Status = gBS->UninstallMultipleProtocolInterfaces (
                        DriverBinding->DriverBindingHandle,
                        &gEfiDriverBindingProtocolGuid,       DriverBinding,
                        &gEfiComponentNameProtocolGuid,       ComponentName,
                        &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                        &gEfiDriverDiagnosticsProtocolGuid,   DriverDiagnostics,
                        NULL
                        );
      }
    }
  }

  //
  // ASSERT if the call to UninstallMultipleProtocolInterfaces() failed
  //
  ASSERT_EFI_ERROR (Status);

  return Status;
}



/**
  Installs Driver Binding Protocol with optional Component Name and Component Name 2 Protocols.

  Initializes a driver by installing the Driver Binding Protocol together with the
  optional Component Name and optional Component Name 2 protocols onto the driver's
  DriverBindingHandle.  If DriverBindingHandle is NULL, then the protocols are installed
  onto a newly created handle.  DriverBindingHandle is typically the same as the driver's
  ImageHandle, but it can be different if the driver produces multiple Driver Binding Protocols.
  If DriverBinding is NULL, then ASSERT().
  If the installation fails, then ASSERT().

  @param  ImageHandle          The image handle of the driver.
  @param  SystemTable          The EFI System Table that was passed to the driver's entry point.
  @param  DriverBinding        A Driver Binding Protocol instance that this driver is producing.
  @param  DriverBindingHandle  The handle that DriverBinding is to be installed onto.  If this
                               parameter is NULL, then a new handle is created.
  @param  ComponentName        A Component Name Protocol instance that this driver is producing.
  @param  ComponentName2       A Component Name 2 Protocol instance that this driver is producing.

  @retval EFI_SUCCESS           The protocol installation successfully completed.
  @retval EFI_OUT_OF_RESOURCES  There was not enough memory in pool to install all the protocols.

**/
EFI_STATUS
EFIAPI
EfiLibInstallDriverBindingComponentName2 (
  IN CONST EFI_HANDLE                         ImageHandle,
  IN CONST EFI_SYSTEM_TABLE                   *SystemTable,
  IN EFI_DRIVER_BINDING_PROTOCOL              *DriverBinding,
  IN EFI_HANDLE                               DriverBindingHandle,
  IN CONST EFI_COMPONENT_NAME_PROTOCOL        *ComponentName,       OPTIONAL
  IN CONST EFI_COMPONENT_NAME2_PROTOCOL       *ComponentName2       OPTIONAL
  )
{
  EFI_STATUS  Status;

  ASSERT (DriverBinding != NULL);

  //
  // Update the ImageHandle and DriverBindingHandle fields of the Driver Binding Protocol
  //
  DriverBinding->ImageHandle         = ImageHandle;
  DriverBinding->DriverBindingHandle = DriverBindingHandle;

  if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
    if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
      Status = gBS->InstallMultipleProtocolInterfaces (
                      &DriverBinding->DriverBindingHandle,
                      &gEfiDriverBindingProtocolGuid, DriverBinding,
                      NULL
                      );
      } else {
      Status = gBS->InstallMultipleProtocolInterfaces (
                      &DriverBinding->DriverBindingHandle,
                      &gEfiDriverBindingProtocolGuid, DriverBinding,
                      &gEfiComponentName2ProtocolGuid, ComponentName2,
                      NULL
                      );
     }
  } else {
     if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
       Status = gBS->InstallMultipleProtocolInterfaces (
                       &DriverBinding->DriverBindingHandle,
                       &gEfiDriverBindingProtocolGuid, DriverBinding,
                       &gEfiComponentNameProtocolGuid, ComponentName,
                       NULL
                       );
     } else {
       Status = gBS->InstallMultipleProtocolInterfaces (
                       &DriverBinding->DriverBindingHandle,
                       &gEfiDriverBindingProtocolGuid, DriverBinding,
                       &gEfiComponentNameProtocolGuid, ComponentName,
                       &gEfiComponentName2ProtocolGuid, ComponentName2,
                       NULL
                       );
    }
  }

  //
  // ASSERT if the call to InstallMultipleProtocolInterfaces() failed
  //
  ASSERT_EFI_ERROR (Status);

  return Status;
}



/**
  Uninstalls Driver Binding Protocol with optional Component Name and Component Name 2 Protocols.

  If DriverBinding is NULL, then ASSERT().
  If the uninstallation fails, then ASSERT().

  @param  DriverBinding        A Driver Binding Protocol instance that this driver produced.
  @param  ComponentName        A Component Name Protocol instance that this driver produced.
  @param  ComponentName2       A Component Name 2 Protocol instance that this driver produced.

  @retval EFI_SUCCESS           The protocol installation successfully completed.
  @retval Others                Status from gBS->UninstallMultipleProtocolInterfaces().

**/
EFI_STATUS
EFIAPI
EfiLibUninstallDriverBindingComponentName2 (
  IN EFI_DRIVER_BINDING_PROTOCOL              *DriverBinding,
  IN CONST EFI_COMPONENT_NAME_PROTOCOL        *ComponentName,       OPTIONAL
  IN CONST EFI_COMPONENT_NAME2_PROTOCOL       *ComponentName2       OPTIONAL
  )
{
  EFI_STATUS  Status;

  ASSERT (DriverBinding != NULL);

  if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
    if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
      Status = gBS->UninstallMultipleProtocolInterfaces (
                      DriverBinding->DriverBindingHandle,
                      &gEfiDriverBindingProtocolGuid, DriverBinding,
                      NULL
                      );
      } else {
      Status = gBS->UninstallMultipleProtocolInterfaces (
                      DriverBinding->DriverBindingHandle,
                      &gEfiDriverBindingProtocolGuid, DriverBinding,
                      &gEfiComponentName2ProtocolGuid, ComponentName2,
                      NULL
                      );
     }
  } else {
     if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
       Status = gBS->UninstallMultipleProtocolInterfaces (
                       DriverBinding->DriverBindingHandle,
                       &gEfiDriverBindingProtocolGuid, DriverBinding,
                       &gEfiComponentNameProtocolGuid, ComponentName,
                       NULL
                       );
     } else {
       Status = gBS->UninstallMultipleProtocolInterfaces (
                       DriverBinding->DriverBindingHandle,
                       &gEfiDriverBindingProtocolGuid, DriverBinding,
                       &gEfiComponentNameProtocolGuid, ComponentName,
                       &gEfiComponentName2ProtocolGuid, ComponentName2,
                       NULL
                       );
    }
  }

  //
  // ASSERT if the call to UninstallMultipleProtocolInterfaces() failed
  //
  ASSERT_EFI_ERROR (Status);

  return Status;
}



/**
  Installs Driver Binding Protocol with optional Component Name, Component Name 2, Driver
  Configuration, Driver Configuration 2, Driver Diagnostics, and Driver Diagnostics 2 Protocols.

  Initializes a driver by installing the Driver Binding Protocol together with the optional
  Component Name, optional Component Name 2, optional Driver Configuration, optional Driver Configuration 2,
  optional Driver Diagnostic, and optional Driver Diagnostic 2 Protocols onto the driver's DriverBindingHandle.
  DriverBindingHandle is typically the same as the driver's ImageHandle, but it can be different if the driver
  produces multiple Driver Binding Protocols.
  If DriverBinding is NULL, then ASSERT().
  If the installation fails, then ASSERT().


  @param  ImageHandle           The image handle of the driver.
  @param  SystemTable           The EFI System Table that was passed to the driver's entry point.
  @param  DriverBinding         A Driver Binding Protocol instance that this driver is producing.
  @param  DriverBindingHandle   The handle that DriverBinding is to be installed onto.  If this
                                parameter is NULL, then a new handle is created.
  @param  ComponentName         A Component Name Protocol instance that this driver is producing.
  @param  ComponentName2        A Component Name 2 Protocol instance that this driver is producing.
  @param  DriverConfiguration   A Driver Configuration Protocol instance that this driver is producing.
  @param  DriverConfiguration2  A Driver Configuration Protocol 2 instance that this driver is producing.
  @param  DriverDiagnostics     A Driver Diagnostics Protocol instance that this driver is producing.
  @param  DriverDiagnostics2    A Driver Diagnostics Protocol 2 instance that this driver is producing.

  @retval EFI_SUCCESS           The protocol installation successfully completed.
  @retval EFI_OUT_OF_RESOURCES  There was not enough memory in pool to install all the protocols.

**/
EFI_STATUS
EFIAPI
EfiLibInstallAllDriverProtocols2 (
  IN CONST EFI_HANDLE                         ImageHandle,
  IN CONST EFI_SYSTEM_TABLE                   *SystemTable,
  IN EFI_DRIVER_BINDING_PROTOCOL              *DriverBinding,
  IN EFI_HANDLE                               DriverBindingHandle,
  IN CONST EFI_COMPONENT_NAME_PROTOCOL        *ComponentName,        OPTIONAL
  IN CONST EFI_COMPONENT_NAME2_PROTOCOL       *ComponentName2,       OPTIONAL
  IN CONST EFI_DRIVER_CONFIGURATION_PROTOCOL  *DriverConfiguration,  OPTIONAL
  IN CONST EFI_DRIVER_CONFIGURATION2_PROTOCOL *DriverConfiguration2, OPTIONAL
  IN CONST EFI_DRIVER_DIAGNOSTICS_PROTOCOL    *DriverDiagnostics,    OPTIONAL
  IN CONST EFI_DRIVER_DIAGNOSTICS2_PROTOCOL   *DriverDiagnostics2    OPTIONAL
  )
{
  EFI_STATUS  Status;

  ASSERT (DriverBinding != NULL);

  //
  // Update the ImageHandle and DriverBindingHandle fields of the Driver Binding Protocol
  //
  DriverBinding->ImageHandle         = ImageHandle;
  DriverBinding->DriverBindingHandle = DriverBindingHandle;

  if (DriverConfiguration2 == NULL) {
    if (DriverConfiguration == NULL) {
      if (DriverDiagnostics == NULL || FeaturePcdGet(PcdDriverDiagnosticsDisable)) {
        if (DriverDiagnostics2 == NULL || FeaturePcdGet(PcdDriverDiagnostics2Disable)) {
          if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              NULL
                              );
            } else {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              NULL
                              );
            }
          } else {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              NULL
                              );
            } else {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              NULL
                              );
            }
          }
        } else {
          if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              NULL
                              );
            } else {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              NULL
                              );
            }
          } else {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              NULL
                              );
            } else {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              NULL
                              );
            }
          }
        }
      } else {
        if (DriverDiagnostics2 == NULL || FeaturePcdGet(PcdDriverDiagnostics2Disable)) {
          if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              NULL
                              );
            } else {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              NULL
                              );
            }
          } else {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              NULL
                              );
            } else {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              NULL
                              );
            }
          }
        } else {
          if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              NULL
                              );
            } else {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              NULL
                              );
            }
          } else {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              NULL
                              );
            } else {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              NULL
                              );
            }
          }
        }
      }
    } else {
      if (DriverDiagnostics == NULL || FeaturePcdGet(PcdDriverDiagnosticsDisable)) {
        if (DriverDiagnostics2 == NULL || FeaturePcdGet(PcdDriverDiagnostics2Disable)) {
          if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              NULL
                              );
            } else {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              NULL
                              );
            }
          } else {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              NULL
                              );
            } else {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              NULL
                              );
            }
          }
        } else {
          if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              NULL
                              );
            } else {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              NULL
                              );
            }
          } else {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              NULL
                              );
            } else {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              NULL
                              );
            }
          }
        }
      } else {
        if (DriverDiagnostics2 == NULL || FeaturePcdGet(PcdDriverDiagnostics2Disable)) {
          if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              NULL
                              );
            } else {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              NULL
                              );
            }
          } else {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              NULL
                              );
            } else {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              NULL
                              );
            }
          }
        } else {
          if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              NULL
                              );
            } else {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              NULL
                              );
            }
          } else {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              NULL
                              );
            } else {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              NULL
                              );
            }
          }
        }
      }
    }
  } else {
    if (DriverConfiguration == NULL) {
      if (DriverDiagnostics == NULL || FeaturePcdGet(PcdDriverDiagnosticsDisable)) {
        if (DriverDiagnostics2 == NULL || FeaturePcdGet(PcdDriverDiagnostics2Disable)) {
          if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              NULL
                              );
            } else {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              NULL
                              );
            }
          } else {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              NULL
                              );
            } else {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              NULL
                              );
            }
          }
        } else {
          if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              NULL
                              );
            } else {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              NULL
                              );
            }
          } else {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              NULL
                              );
            } else {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              NULL
                              );
            }
          }
        }
      } else {
        if (DriverDiagnostics2 == NULL || FeaturePcdGet(PcdDriverDiagnostics2Disable)) {
          if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              NULL
                              );
            } else {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              NULL
                              );
            }
          } else {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              NULL
                              );
            } else {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              NULL
                              );
            }
          }
        } else {
          if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              NULL
                              );
            } else {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              NULL
                              );
            }
          } else {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              NULL
                              );
            } else {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              NULL
                              );
            }
          }
        }
      }
    } else {
      if (DriverDiagnostics == NULL || FeaturePcdGet(PcdDriverDiagnosticsDisable)) {
        if (DriverDiagnostics2 == NULL || FeaturePcdGet(PcdDriverDiagnostics2Disable)) {
          if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              NULL
                              );
            } else {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              NULL
                              );
            }
          } else {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              NULL
                              );
            } else {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              NULL
                              );
            }
          }
        } else {
          if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              NULL
                              );
            } else {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              NULL
                              );
            }
          } else {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              NULL
                              );
            } else {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              NULL
                              );
            }
          }
        }
      } else {
        if (DriverDiagnostics2 == NULL || FeaturePcdGet(PcdDriverDiagnostics2Disable)) {
          if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              NULL
                              );
            } else {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              NULL
                              );
            }
          } else {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              NULL
                              );
            } else {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              NULL
                              );
            }
          }
        } else {
          if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              NULL
                              );
            } else {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              NULL
                              );
            }
          } else {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              NULL
                              );
            } else {
              Status = gBS->InstallMultipleProtocolInterfaces (
                              &DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              NULL
                              );
            }
          }
        }
      }
    }
  }

  //
  // ASSERT if the call to InstallMultipleProtocolInterfaces() failed
  //
  ASSERT_EFI_ERROR (Status);

  return Status;
}



/**
  Uninstalls Driver Binding Protocol with optional Component Name, Component Name 2, Driver
  Configuration, Driver Configuration 2, Driver Diagnostics, and Driver Diagnostics 2 Protocols.

  If DriverBinding is NULL, then ASSERT().
  If the installation fails, then ASSERT().


  @param  DriverBinding         A Driver Binding Protocol instance that this driver produced.
  @param  ComponentName         A Component Name Protocol instance that this driver produced.
  @param  ComponentName2        A Component Name 2 Protocol instance that this driver produced.
  @param  DriverConfiguration   A Driver Configuration Protocol instance that this driver produced.
  @param  DriverConfiguration2  A Driver Configuration Protocol 2 instance that this driver produced.
  @param  DriverDiagnostics     A Driver Diagnostics Protocol instance that this driver produced.
  @param  DriverDiagnostics2    A Driver Diagnostics Protocol 2 instance that this driver produced.

  @retval EFI_SUCCESS           The protocol uninstallation successfully completed.
  @retval Others                Status from gBS->UninstallMultipleProtocolInterfaces().

**/
EFI_STATUS
EFIAPI
EfiLibUninstallAllDriverProtocols2 (
  IN EFI_DRIVER_BINDING_PROTOCOL              *DriverBinding,
  IN CONST EFI_COMPONENT_NAME_PROTOCOL        *ComponentName,        OPTIONAL
  IN CONST EFI_COMPONENT_NAME2_PROTOCOL       *ComponentName2,       OPTIONAL
  IN CONST EFI_DRIVER_CONFIGURATION_PROTOCOL  *DriverConfiguration,  OPTIONAL
  IN CONST EFI_DRIVER_CONFIGURATION2_PROTOCOL *DriverConfiguration2, OPTIONAL
  IN CONST EFI_DRIVER_DIAGNOSTICS_PROTOCOL    *DriverDiagnostics,    OPTIONAL
  IN CONST EFI_DRIVER_DIAGNOSTICS2_PROTOCOL   *DriverDiagnostics2    OPTIONAL
  )
{
  EFI_STATUS  Status;

  ASSERT (DriverBinding != NULL);

  if (DriverConfiguration2 == NULL) {
    if (DriverConfiguration == NULL) {
      if (DriverDiagnostics == NULL || FeaturePcdGet(PcdDriverDiagnosticsDisable)) {
        if (DriverDiagnostics2 == NULL || FeaturePcdGet(PcdDriverDiagnostics2Disable)) {
          if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              NULL
                              );
            } else {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              NULL
                              );
            }
          } else {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              NULL
                              );
            } else {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              NULL
                              );
            }
          }
        } else {
          if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              NULL
                              );
            } else {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              NULL
                              );
            }
          } else {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              NULL
                              );
            } else {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              NULL
                              );
            }
          }
        }
      } else {
        if (DriverDiagnostics2 == NULL || FeaturePcdGet(PcdDriverDiagnostics2Disable)) {
          if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              NULL
                              );
            } else {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              NULL
                              );
            }
          } else {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              NULL
                              );
            } else {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              NULL
                              );
            }
          }
        } else {
          if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              NULL
                              );
            } else {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              NULL
                              );
            }
          } else {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              NULL
                              );
            } else {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              NULL
                              );
            }
          }
        }
      }
    } else {
      if (DriverDiagnostics == NULL || FeaturePcdGet(PcdDriverDiagnosticsDisable)) {
        if (DriverDiagnostics2 == NULL || FeaturePcdGet(PcdDriverDiagnostics2Disable)) {
          if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              NULL
                              );
            } else {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              NULL
                              );
            }
          } else {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              NULL
                              );
            } else {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              NULL
                              );
            }
          }
        } else {
          if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              NULL
                              );
            } else {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              NULL
                              );
            }
          } else {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              NULL
                              );
            } else {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              NULL
                              );
            }
          }
        }
      } else {
        if (DriverDiagnostics2 == NULL || FeaturePcdGet(PcdDriverDiagnostics2Disable)) {
          if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              NULL
                              );
            } else {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              NULL
                              );
            }
          } else {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              NULL
                              );
            } else {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              NULL
                              );
            }
          }
        } else {
          if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              NULL
                              );
            } else {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              NULL
                              );
            }
          } else {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              NULL
                              );
            } else {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              NULL
                              );
            }
          }
        }
      }
    }
  } else {
    if (DriverConfiguration == NULL) {
      if (DriverDiagnostics == NULL || FeaturePcdGet(PcdDriverDiagnosticsDisable)) {
        if (DriverDiagnostics2 == NULL || FeaturePcdGet(PcdDriverDiagnostics2Disable)) {
          if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              NULL
                              );
            } else {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              NULL
                              );
            }
          } else {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              NULL
                              );
            } else {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              NULL
                              );
            }
          }
        } else {
          if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              NULL
                              );
            } else {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              NULL
                              );
            }
          } else {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              NULL
                              );
            } else {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              NULL
                              );
            }
          }
        }
      } else {
        if (DriverDiagnostics2 == NULL || FeaturePcdGet(PcdDriverDiagnostics2Disable)) {
          if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              NULL
                              );
            } else {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              NULL
                              );
            }
          } else {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              NULL
                              );
            } else {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              NULL
                              );
            }
          }
        } else {
          if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              NULL
                              );
            } else {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              NULL
                              );
            }
          } else {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              NULL
                              );
            } else {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              NULL
                              );
            }
          }
        }
      }
    } else {
      if (DriverDiagnostics == NULL || FeaturePcdGet(PcdDriverDiagnosticsDisable)) {
        if (DriverDiagnostics2 == NULL || FeaturePcdGet(PcdDriverDiagnostics2Disable)) {
          if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              NULL
                              );
            } else {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              NULL
                              );
            }
          } else {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              NULL
                              );
            } else {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              NULL
                              );
            }
          }
        } else {
          if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              NULL
                              );
            } else {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              NULL
                              );
            }
          } else {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              NULL
                              );
            } else {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              NULL
                              );
            }
          }
        }
      } else {
        if (DriverDiagnostics2 == NULL || FeaturePcdGet(PcdDriverDiagnostics2Disable)) {
          if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              NULL
                              );
            } else {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              NULL
                              );
            }
          } else {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              NULL
                              );
            } else {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              NULL
                              );
            }
          }
        } else {
          if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              NULL
                              );
            } else {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              NULL
                              );
            }
          } else {
            if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              NULL
                              );
            } else {
              Status = gBS->UninstallMultipleProtocolInterfaces (
                              DriverBinding->DriverBindingHandle,
                              &gEfiDriverBindingProtocolGuid, DriverBinding,
                              &gEfiComponentNameProtocolGuid, ComponentName,
                              &gEfiComponentName2ProtocolGuid, ComponentName2,
                              &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
                              &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
                              &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
                              &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
                              NULL
                              );
            }
          }
        }
      }
    }
  }

  //
  // ASSERT if the call to UninstallMultipleProtocolInterfaces() failed
  //
  ASSERT_EFI_ERROR (Status);

  return Status;
}
