1 /** @file
2   Library functions that abstract driver model protocols
3   installation.
4 
5   Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>
6   This program and the accompanying materials are
7   licensed and made available under the terms and conditions of the BSD License
8   which accompanies this distribution.  The full text of the license may be found at
9   http://opensource.org/licenses/bsd-license.php.
10 
11   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13 
14 **/
15 
16 
17 #include "UefiLibInternal.h"
18 
19 /**
20   Installs and completes the initialization of a Driver Binding Protocol instance.
21 
22   Installs the Driver Binding Protocol specified by DriverBinding onto the handle
23   specified by DriverBindingHandle. If DriverBindingHandle is NULL, then DriverBinding
24   is installed onto a newly created handle. DriverBindingHandle is typically the same
25   as the driver's ImageHandle, but it can be different if the driver produces multiple
26   Driver Binding Protocols.
27   If DriverBinding is NULL, then ASSERT().
28   If DriverBinding can not be installed onto a handle, then ASSERT().
29 
30   @param  ImageHandle          The image handle of the driver.
31   @param  SystemTable          The EFI System Table that was passed to the driver's entry point.
32   @param  DriverBinding        A Driver Binding Protocol instance that this driver is producing.
33   @param  DriverBindingHandle  The handle that DriverBinding is to be installed onto.  If this
34                                parameter is NULL, then a new handle is created.
35 
36   @retval EFI_SUCCESS           The protocol installation successfully completed.
37   @retval EFI_OUT_OF_RESOURCES  There was not enough system resources to install the protocol.
38   @retval Others                Status from gBS->InstallMultipleProtocolInterfaces().
39 
40 **/
41 EFI_STATUS
42 EFIAPI
EfiLibInstallDriverBinding(IN CONST EFI_HANDLE ImageHandle,IN CONST EFI_SYSTEM_TABLE * SystemTable,IN EFI_DRIVER_BINDING_PROTOCOL * DriverBinding,IN EFI_HANDLE DriverBindingHandle)43 EfiLibInstallDriverBinding (
44   IN CONST EFI_HANDLE             ImageHandle,
45   IN CONST EFI_SYSTEM_TABLE       *SystemTable,
46   IN EFI_DRIVER_BINDING_PROTOCOL  *DriverBinding,
47   IN EFI_HANDLE                   DriverBindingHandle
48   )
49 {
50   EFI_STATUS  Status;
51 
52   ASSERT (DriverBinding != NULL);
53 
54   //
55   // Update the ImageHandle and DriverBindingHandle fields of the Driver Binding Protocol
56   //
57   DriverBinding->ImageHandle         = ImageHandle;
58   DriverBinding->DriverBindingHandle = DriverBindingHandle;
59 
60   Status = gBS->InstallMultipleProtocolInterfaces (
61                   &DriverBinding->DriverBindingHandle,
62                   &gEfiDriverBindingProtocolGuid, DriverBinding,
63                   NULL
64                   );
65   //
66   // ASSERT if the call to InstallMultipleProtocolInterfaces() failed
67   //
68   ASSERT_EFI_ERROR (Status);
69 
70   return Status;
71 }
72 
73 
74 /**
75   Installs and completes the initialization of a Driver Binding Protocol instance and
76   optionally installs the Component Name, Driver Configuration and Driver Diagnostics Protocols.
77 
78   Initializes a driver by installing the Driver Binding Protocol together with the
79   optional Component Name, optional Driver Configure and optional Driver Diagnostic
80   Protocols onto the driver's DriverBindingHandle. If DriverBindingHandle is NULL,
81   then the protocols are  installed onto a newly created handle. DriverBindingHandle
82   is typically the same as the driver's ImageHandle, but it can be different if the
83   driver produces multiple Driver Binding Protocols.
84   If DriverBinding is NULL, then ASSERT().
85   If the installation fails, then ASSERT().
86 
87   @param  ImageHandle          The image handle of the driver.
88   @param  SystemTable          The EFI System Table that was passed to the driver's entry point.
89   @param  DriverBinding        A Driver Binding Protocol instance that this driver is producing.
90   @param  DriverBindingHandle  The handle that DriverBinding is to be installed onto.  If this
91                                parameter is NULL, then a new handle is created.
92   @param  ComponentName        A Component Name Protocol instance that this driver is producing.
93   @param  DriverConfiguration  A Driver Configuration Protocol instance that this driver is producing.
94   @param  DriverDiagnostics    A Driver Diagnostics Protocol instance that this driver is producing.
95 
96   @retval EFI_SUCCESS           The protocol installation successfully completed.
97   @retval EFI_OUT_OF_RESOURCES  There was not enough memory in pool to install all the protocols.
98 
99 **/
100 EFI_STATUS
101 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)102 EfiLibInstallAllDriverProtocols (
103   IN CONST EFI_HANDLE                         ImageHandle,
104   IN CONST EFI_SYSTEM_TABLE                   *SystemTable,
105   IN EFI_DRIVER_BINDING_PROTOCOL              *DriverBinding,
106   IN EFI_HANDLE                               DriverBindingHandle,
107   IN CONST EFI_COMPONENT_NAME_PROTOCOL        *ComponentName,       OPTIONAL
108   IN CONST EFI_DRIVER_CONFIGURATION_PROTOCOL  *DriverConfiguration, OPTIONAL
109   IN CONST EFI_DRIVER_DIAGNOSTICS_PROTOCOL    *DriverDiagnostics    OPTIONAL
110   )
111 {
112   EFI_STATUS  Status;
113 
114   ASSERT (DriverBinding != NULL);
115 
116   //
117   // Update the ImageHandle and DriverBindingHandle fields of the Driver Binding Protocol
118   //
119   DriverBinding->ImageHandle         = ImageHandle;
120   DriverBinding->DriverBindingHandle = DriverBindingHandle;
121 
122   if (DriverDiagnostics == NULL || FeaturePcdGet(PcdDriverDiagnosticsDisable)) {
123     if (DriverConfiguration == NULL) {
124       if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
125         Status = gBS->InstallMultipleProtocolInterfaces (
126                         &DriverBinding->DriverBindingHandle,
127                         &gEfiDriverBindingProtocolGuid, DriverBinding,
128                         NULL
129                         );
130       } else {
131         Status = gBS->InstallMultipleProtocolInterfaces (
132                         &DriverBinding->DriverBindingHandle,
133                         &gEfiDriverBindingProtocolGuid, DriverBinding,
134                         &gEfiComponentNameProtocolGuid, ComponentName,
135                         NULL
136                         );
137       }
138     } else {
139       if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
140         Status = gBS->InstallMultipleProtocolInterfaces (
141                         &DriverBinding->DriverBindingHandle,
142                         &gEfiDriverBindingProtocolGuid,       DriverBinding,
143                         &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
144                         NULL
145                         );
146       } else {
147         Status = gBS->InstallMultipleProtocolInterfaces (
148                         &DriverBinding->DriverBindingHandle,
149                         &gEfiDriverBindingProtocolGuid,       DriverBinding,
150                         &gEfiComponentNameProtocolGuid,       ComponentName,
151                         &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
152                         NULL
153                         );
154       }
155     }
156   } else {
157     if (DriverConfiguration == NULL) {
158       if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
159         Status = gBS->InstallMultipleProtocolInterfaces (
160                         &DriverBinding->DriverBindingHandle,
161                         &gEfiDriverBindingProtocolGuid,     DriverBinding,
162                         &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
163                         NULL
164                         );
165       } else {
166         Status = gBS->InstallMultipleProtocolInterfaces (
167                         &DriverBinding->DriverBindingHandle,
168                         &gEfiDriverBindingProtocolGuid,     DriverBinding,
169                         &gEfiComponentNameProtocolGuid,     ComponentName,
170                         &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
171                         NULL
172                         );
173       }
174     } else {
175       if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
176        Status = gBS->InstallMultipleProtocolInterfaces (
177                         &DriverBinding->DriverBindingHandle,
178                         &gEfiDriverBindingProtocolGuid,       DriverBinding,
179                         &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
180                         &gEfiDriverDiagnosticsProtocolGuid,   DriverDiagnostics,
181                         NULL
182                         );
183       } else {
184         Status = gBS->InstallMultipleProtocolInterfaces (
185                         &DriverBinding->DriverBindingHandle,
186                         &gEfiDriverBindingProtocolGuid,       DriverBinding,
187                         &gEfiComponentNameProtocolGuid,       ComponentName,
188                         &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
189                         &gEfiDriverDiagnosticsProtocolGuid,   DriverDiagnostics,
190                         NULL
191                         );
192       }
193     }
194   }
195 
196   //
197   // ASSERT if the call to InstallMultipleProtocolInterfaces() failed
198   //
199   ASSERT_EFI_ERROR (Status);
200 
201   return Status;
202 }
203 
204 
205 
206 /**
207   Installs Driver Binding Protocol with optional Component Name and Component Name 2 Protocols.
208 
209   Initializes a driver by installing the Driver Binding Protocol together with the
210   optional Component Name and optional Component Name 2 protocols onto the driver's
211   DriverBindingHandle.  If DriverBindingHandle is NULL, then the protocols are installed
212   onto a newly created handle.  DriverBindingHandle is typically the same as the driver's
213   ImageHandle, but it can be different if the driver produces multiple Driver Binding Protocols.
214   If DriverBinding is NULL, then ASSERT().
215   If the installation fails, then ASSERT().
216 
217   @param  ImageHandle          The image handle of the driver.
218   @param  SystemTable          The EFI System Table that was passed to the driver's entry point.
219   @param  DriverBinding        A Driver Binding Protocol instance that this driver is producing.
220   @param  DriverBindingHandle  The handle that DriverBinding is to be installed onto.  If this
221                                parameter is NULL, then a new handle is created.
222   @param  ComponentName        A Component Name Protocol instance that this driver is producing.
223   @param  ComponentName2       A Component Name 2 Protocol instance that this driver is producing.
224 
225   @retval EFI_SUCCESS           The protocol installation successfully completed.
226   @retval EFI_OUT_OF_RESOURCES  There was not enough memory in pool to install all the protocols.
227 
228 **/
229 EFI_STATUS
230 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)231 EfiLibInstallDriverBindingComponentName2 (
232   IN CONST EFI_HANDLE                         ImageHandle,
233   IN CONST EFI_SYSTEM_TABLE                   *SystemTable,
234   IN EFI_DRIVER_BINDING_PROTOCOL              *DriverBinding,
235   IN EFI_HANDLE                               DriverBindingHandle,
236   IN CONST EFI_COMPONENT_NAME_PROTOCOL        *ComponentName,       OPTIONAL
237   IN CONST EFI_COMPONENT_NAME2_PROTOCOL       *ComponentName2       OPTIONAL
238   )
239 {
240   EFI_STATUS  Status;
241 
242   ASSERT (DriverBinding != NULL);
243 
244   //
245   // Update the ImageHandle and DriverBindingHandle fields of the Driver Binding Protocol
246   //
247   DriverBinding->ImageHandle         = ImageHandle;
248   DriverBinding->DriverBindingHandle = DriverBindingHandle;
249 
250   if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
251     if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
252       Status = gBS->InstallMultipleProtocolInterfaces (
253                       &DriverBinding->DriverBindingHandle,
254                       &gEfiDriverBindingProtocolGuid, DriverBinding,
255                       NULL
256                       );
257       } else {
258       Status = gBS->InstallMultipleProtocolInterfaces (
259                       &DriverBinding->DriverBindingHandle,
260                       &gEfiDriverBindingProtocolGuid, DriverBinding,
261                       &gEfiComponentName2ProtocolGuid, ComponentName2,
262                       NULL
263                       );
264      }
265   } else {
266      if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
267        Status = gBS->InstallMultipleProtocolInterfaces (
268                        &DriverBinding->DriverBindingHandle,
269                        &gEfiDriverBindingProtocolGuid, DriverBinding,
270                        &gEfiComponentNameProtocolGuid, ComponentName,
271                        NULL
272                        );
273      } else {
274        Status = gBS->InstallMultipleProtocolInterfaces (
275                        &DriverBinding->DriverBindingHandle,
276                        &gEfiDriverBindingProtocolGuid, DriverBinding,
277                        &gEfiComponentNameProtocolGuid, ComponentName,
278                        &gEfiComponentName2ProtocolGuid, ComponentName2,
279                        NULL
280                        );
281     }
282   }
283 
284   //
285   // ASSERT if the call to InstallMultipleProtocolInterfaces() failed
286   //
287   ASSERT_EFI_ERROR (Status);
288 
289   return Status;
290 }
291 
292 
293 
294 /**
295   Installs Driver Binding Protocol with optional Component Name, Component Name 2, Driver
296   Configuration, Driver Configuration 2, Driver Diagnostics, and Driver Diagnostics 2 Protocols.
297 
298   Initializes a driver by installing the Driver Binding Protocol together with the optional
299   Component Name, optional Component Name 2, optional Driver Configuration, optional Driver Configuration 2,
300   optional Driver Diagnostic, and optional Driver Diagnostic 2 Protocols onto the driver's DriverBindingHandle.
301   DriverBindingHandle is typically the same as the driver's ImageHandle, but it can be different if the driver
302   produces multiple Driver Binding Protocols.
303   If DriverBinding is NULL, then ASSERT().
304   If the installation fails, then ASSERT().
305 
306 
307   @param  ImageHandle           The image handle of the driver.
308   @param  SystemTable           The EFI System Table that was passed to the driver's entry point.
309   @param  DriverBinding         A Driver Binding Protocol instance that this driver is producing.
310   @param  DriverBindingHandle   The handle that DriverBinding is to be installed onto.  If this
311                                 parameter is NULL, then a new handle is created.
312   @param  ComponentName         A Component Name Protocol instance that this driver is producing.
313   @param  ComponentName2        A Component Name 2 Protocol instance that this driver is producing.
314   @param  DriverConfiguration   A Driver Configuration Protocol instance that this driver is producing.
315   @param  DriverConfiguration2  A Driver Configuration Protocol 2 instance that this driver is producing.
316   @param  DriverDiagnostics     A Driver Diagnostics Protocol instance that this driver is producing.
317   @param  DriverDiagnostics2    A Driver Diagnostics Protocol 2 instance that this driver is producing.
318 
319   @retval EFI_SUCCESS           The protocol installation successfully completed.
320   @retval EFI_OUT_OF_RESOURCES  There was not enough memory in pool to install all the protocols.
321 
322 **/
323 EFI_STATUS
324 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)325 EfiLibInstallAllDriverProtocols2 (
326   IN CONST EFI_HANDLE                         ImageHandle,
327   IN CONST EFI_SYSTEM_TABLE                   *SystemTable,
328   IN EFI_DRIVER_BINDING_PROTOCOL              *DriverBinding,
329   IN EFI_HANDLE                               DriverBindingHandle,
330   IN CONST EFI_COMPONENT_NAME_PROTOCOL        *ComponentName,        OPTIONAL
331   IN CONST EFI_COMPONENT_NAME2_PROTOCOL       *ComponentName2,       OPTIONAL
332   IN CONST EFI_DRIVER_CONFIGURATION_PROTOCOL  *DriverConfiguration,  OPTIONAL
333   IN CONST EFI_DRIVER_CONFIGURATION2_PROTOCOL *DriverConfiguration2, OPTIONAL
334   IN CONST EFI_DRIVER_DIAGNOSTICS_PROTOCOL    *DriverDiagnostics,    OPTIONAL
335   IN CONST EFI_DRIVER_DIAGNOSTICS2_PROTOCOL   *DriverDiagnostics2    OPTIONAL
336   )
337 {
338   EFI_STATUS  Status;
339 
340   ASSERT (DriverBinding != NULL);
341 
342   //
343   // Update the ImageHandle and DriverBindingHandle fields of the Driver Binding Protocol
344   //
345   DriverBinding->ImageHandle         = ImageHandle;
346   DriverBinding->DriverBindingHandle = DriverBindingHandle;
347 
348   if (DriverConfiguration2 == NULL) {
349     if (DriverConfiguration == NULL) {
350       if (DriverDiagnostics == NULL || FeaturePcdGet(PcdDriverDiagnosticsDisable)) {
351         if (DriverDiagnostics2 == NULL || FeaturePcdGet(PcdDriverDiagnostics2Disable)) {
352           if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
353             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
354               Status = gBS->InstallMultipleProtocolInterfaces (
355                               &DriverBinding->DriverBindingHandle,
356                               &gEfiDriverBindingProtocolGuid, DriverBinding,
357                               NULL
358                               );
359             } else {
360               Status = gBS->InstallMultipleProtocolInterfaces (
361                               &DriverBinding->DriverBindingHandle,
362                               &gEfiDriverBindingProtocolGuid, DriverBinding,
363                               &gEfiComponentName2ProtocolGuid, ComponentName2,
364                               NULL
365                               );
366             }
367           } else {
368             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
369               Status = gBS->InstallMultipleProtocolInterfaces (
370                               &DriverBinding->DriverBindingHandle,
371                               &gEfiDriverBindingProtocolGuid, DriverBinding,
372                               &gEfiComponentNameProtocolGuid, ComponentName,
373                               NULL
374                               );
375             } else {
376               Status = gBS->InstallMultipleProtocolInterfaces (
377                               &DriverBinding->DriverBindingHandle,
378                               &gEfiDriverBindingProtocolGuid, DriverBinding,
379                               &gEfiComponentNameProtocolGuid, ComponentName,
380                               &gEfiComponentName2ProtocolGuid, ComponentName2,
381                               NULL
382                               );
383             }
384           }
385         } else {
386           if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
387             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
388               Status = gBS->InstallMultipleProtocolInterfaces (
389                               &DriverBinding->DriverBindingHandle,
390                               &gEfiDriverBindingProtocolGuid, DriverBinding,
391                               &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
392                               NULL
393                               );
394             } else {
395               Status = gBS->InstallMultipleProtocolInterfaces (
396                               &DriverBinding->DriverBindingHandle,
397                               &gEfiDriverBindingProtocolGuid, DriverBinding,
398                               &gEfiComponentName2ProtocolGuid, ComponentName2,
399                               &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
400                               NULL
401                               );
402             }
403           } else {
404             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
405               Status = gBS->InstallMultipleProtocolInterfaces (
406                               &DriverBinding->DriverBindingHandle,
407                               &gEfiDriverBindingProtocolGuid, DriverBinding,
408                               &gEfiComponentNameProtocolGuid, ComponentName,
409                               &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
410                               NULL
411                               );
412             } else {
413               Status = gBS->InstallMultipleProtocolInterfaces (
414                               &DriverBinding->DriverBindingHandle,
415                               &gEfiDriverBindingProtocolGuid, DriverBinding,
416                               &gEfiComponentNameProtocolGuid, ComponentName,
417                               &gEfiComponentName2ProtocolGuid, ComponentName2,
418                               &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
419                               NULL
420                               );
421             }
422           }
423         }
424       } else {
425         if (DriverDiagnostics2 == NULL || FeaturePcdGet(PcdDriverDiagnostics2Disable)) {
426           if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
427             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
428               Status = gBS->InstallMultipleProtocolInterfaces (
429                               &DriverBinding->DriverBindingHandle,
430                               &gEfiDriverBindingProtocolGuid, DriverBinding,
431                               &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
432                               NULL
433                               );
434             } else {
435               Status = gBS->InstallMultipleProtocolInterfaces (
436                               &DriverBinding->DriverBindingHandle,
437                               &gEfiDriverBindingProtocolGuid, DriverBinding,
438                               &gEfiComponentName2ProtocolGuid, ComponentName2,
439                               &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
440                               NULL
441                               );
442             }
443           } else {
444             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
445               Status = gBS->InstallMultipleProtocolInterfaces (
446                               &DriverBinding->DriverBindingHandle,
447                               &gEfiDriverBindingProtocolGuid, DriverBinding,
448                               &gEfiComponentNameProtocolGuid, ComponentName,
449                               &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
450                               NULL
451                               );
452             } else {
453               Status = gBS->InstallMultipleProtocolInterfaces (
454                               &DriverBinding->DriverBindingHandle,
455                               &gEfiDriverBindingProtocolGuid, DriverBinding,
456                               &gEfiComponentNameProtocolGuid, ComponentName,
457                               &gEfiComponentName2ProtocolGuid, ComponentName2,
458                               &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
459                               NULL
460                               );
461             }
462           }
463         } else {
464           if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
465             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
466               Status = gBS->InstallMultipleProtocolInterfaces (
467                               &DriverBinding->DriverBindingHandle,
468                               &gEfiDriverBindingProtocolGuid, DriverBinding,
469                               &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
470                               &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
471                               NULL
472                               );
473             } else {
474               Status = gBS->InstallMultipleProtocolInterfaces (
475                               &DriverBinding->DriverBindingHandle,
476                               &gEfiDriverBindingProtocolGuid, DriverBinding,
477                               &gEfiComponentName2ProtocolGuid, ComponentName2,
478                               &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
479                               &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
480                               NULL
481                               );
482             }
483           } else {
484             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
485               Status = gBS->InstallMultipleProtocolInterfaces (
486                               &DriverBinding->DriverBindingHandle,
487                               &gEfiDriverBindingProtocolGuid, DriverBinding,
488                               &gEfiComponentNameProtocolGuid, ComponentName,
489                               &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
490                               &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
491                               NULL
492                               );
493             } else {
494               Status = gBS->InstallMultipleProtocolInterfaces (
495                               &DriverBinding->DriverBindingHandle,
496                               &gEfiDriverBindingProtocolGuid, DriverBinding,
497                               &gEfiComponentNameProtocolGuid, ComponentName,
498                               &gEfiComponentName2ProtocolGuid, ComponentName2,
499                               &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
500                               &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
501                               NULL
502                               );
503             }
504           }
505         }
506       }
507     } else {
508       if (DriverDiagnostics == NULL || FeaturePcdGet(PcdDriverDiagnosticsDisable)) {
509         if (DriverDiagnostics2 == NULL || FeaturePcdGet(PcdDriverDiagnostics2Disable)) {
510           if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
511             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
512               Status = gBS->InstallMultipleProtocolInterfaces (
513                               &DriverBinding->DriverBindingHandle,
514                               &gEfiDriverBindingProtocolGuid, DriverBinding,
515                               &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
516                               NULL
517                               );
518             } else {
519               Status = gBS->InstallMultipleProtocolInterfaces (
520                               &DriverBinding->DriverBindingHandle,
521                               &gEfiDriverBindingProtocolGuid, DriverBinding,
522                               &gEfiComponentName2ProtocolGuid, ComponentName2,
523                               &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
524                               NULL
525                               );
526             }
527           } else {
528             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
529               Status = gBS->InstallMultipleProtocolInterfaces (
530                               &DriverBinding->DriverBindingHandle,
531                               &gEfiDriverBindingProtocolGuid, DriverBinding,
532                               &gEfiComponentNameProtocolGuid, ComponentName,
533                               &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
534                               NULL
535                               );
536             } else {
537               Status = gBS->InstallMultipleProtocolInterfaces (
538                               &DriverBinding->DriverBindingHandle,
539                               &gEfiDriverBindingProtocolGuid, DriverBinding,
540                               &gEfiComponentNameProtocolGuid, ComponentName,
541                               &gEfiComponentName2ProtocolGuid, ComponentName2,
542                               &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
543                               NULL
544                               );
545             }
546           }
547         } else {
548           if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
549             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
550               Status = gBS->InstallMultipleProtocolInterfaces (
551                               &DriverBinding->DriverBindingHandle,
552                               &gEfiDriverBindingProtocolGuid, DriverBinding,
553                               &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
554                               &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
555                               NULL
556                               );
557             } else {
558               Status = gBS->InstallMultipleProtocolInterfaces (
559                               &DriverBinding->DriverBindingHandle,
560                               &gEfiDriverBindingProtocolGuid, DriverBinding,
561                               &gEfiComponentName2ProtocolGuid, ComponentName2,
562                               &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
563                               &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
564                               NULL
565                               );
566             }
567           } else {
568             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
569               Status = gBS->InstallMultipleProtocolInterfaces (
570                               &DriverBinding->DriverBindingHandle,
571                               &gEfiDriverBindingProtocolGuid, DriverBinding,
572                               &gEfiComponentNameProtocolGuid, ComponentName,
573                               &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
574                               &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
575                               NULL
576                               );
577             } else {
578               Status = gBS->InstallMultipleProtocolInterfaces (
579                               &DriverBinding->DriverBindingHandle,
580                               &gEfiDriverBindingProtocolGuid, DriverBinding,
581                               &gEfiComponentNameProtocolGuid, ComponentName,
582                               &gEfiComponentName2ProtocolGuid, ComponentName2,
583                               &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
584                               &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
585                               NULL
586                               );
587             }
588           }
589         }
590       } else {
591         if (DriverDiagnostics2 == NULL || FeaturePcdGet(PcdDriverDiagnostics2Disable)) {
592           if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
593             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
594               Status = gBS->InstallMultipleProtocolInterfaces (
595                               &DriverBinding->DriverBindingHandle,
596                               &gEfiDriverBindingProtocolGuid, DriverBinding,
597                               &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
598                               &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
599                               NULL
600                               );
601             } else {
602               Status = gBS->InstallMultipleProtocolInterfaces (
603                               &DriverBinding->DriverBindingHandle,
604                               &gEfiDriverBindingProtocolGuid, DriverBinding,
605                               &gEfiComponentName2ProtocolGuid, ComponentName2,
606                               &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
607                               &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
608                               NULL
609                               );
610             }
611           } else {
612             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
613               Status = gBS->InstallMultipleProtocolInterfaces (
614                               &DriverBinding->DriverBindingHandle,
615                               &gEfiDriverBindingProtocolGuid, DriverBinding,
616                               &gEfiComponentNameProtocolGuid, ComponentName,
617                               &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
618                               &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
619                               NULL
620                               );
621             } else {
622               Status = gBS->InstallMultipleProtocolInterfaces (
623                               &DriverBinding->DriverBindingHandle,
624                               &gEfiDriverBindingProtocolGuid, DriverBinding,
625                               &gEfiComponentNameProtocolGuid, ComponentName,
626                               &gEfiComponentName2ProtocolGuid, ComponentName2,
627                               &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
628                               &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
629                               NULL
630                               );
631             }
632           }
633         } else {
634           if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
635             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
636               Status = gBS->InstallMultipleProtocolInterfaces (
637                               &DriverBinding->DriverBindingHandle,
638                               &gEfiDriverBindingProtocolGuid, DriverBinding,
639                               &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
640                               &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
641                               &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
642                               NULL
643                               );
644             } else {
645               Status = gBS->InstallMultipleProtocolInterfaces (
646                               &DriverBinding->DriverBindingHandle,
647                               &gEfiDriverBindingProtocolGuid, DriverBinding,
648                               &gEfiComponentName2ProtocolGuid, ComponentName2,
649                               &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
650                               &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
651                               &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
652                               NULL
653                               );
654             }
655           } else {
656             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
657               Status = gBS->InstallMultipleProtocolInterfaces (
658                               &DriverBinding->DriverBindingHandle,
659                               &gEfiDriverBindingProtocolGuid, DriverBinding,
660                               &gEfiComponentNameProtocolGuid, ComponentName,
661                               &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
662                               &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
663                               &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
664                               NULL
665                               );
666             } else {
667               Status = gBS->InstallMultipleProtocolInterfaces (
668                               &DriverBinding->DriverBindingHandle,
669                               &gEfiDriverBindingProtocolGuid, DriverBinding,
670                               &gEfiComponentNameProtocolGuid, ComponentName,
671                               &gEfiComponentName2ProtocolGuid, ComponentName2,
672                               &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
673                               &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
674                               &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
675                               NULL
676                               );
677             }
678           }
679         }
680       }
681     }
682   } else {
683     if (DriverConfiguration == NULL) {
684       if (DriverDiagnostics == NULL || FeaturePcdGet(PcdDriverDiagnosticsDisable)) {
685         if (DriverDiagnostics2 == NULL || FeaturePcdGet(PcdDriverDiagnostics2Disable)) {
686           if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
687             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
688               Status = gBS->InstallMultipleProtocolInterfaces (
689                               &DriverBinding->DriverBindingHandle,
690                               &gEfiDriverBindingProtocolGuid, DriverBinding,
691                               &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
692                               NULL
693                               );
694             } else {
695               Status = gBS->InstallMultipleProtocolInterfaces (
696                               &DriverBinding->DriverBindingHandle,
697                               &gEfiDriverBindingProtocolGuid, DriverBinding,
698                               &gEfiComponentName2ProtocolGuid, ComponentName2,
699                               &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
700                               NULL
701                               );
702             }
703           } else {
704             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
705               Status = gBS->InstallMultipleProtocolInterfaces (
706                               &DriverBinding->DriverBindingHandle,
707                               &gEfiDriverBindingProtocolGuid, DriverBinding,
708                               &gEfiComponentNameProtocolGuid, ComponentName,
709                               &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
710                               NULL
711                               );
712             } else {
713               Status = gBS->InstallMultipleProtocolInterfaces (
714                               &DriverBinding->DriverBindingHandle,
715                               &gEfiDriverBindingProtocolGuid, DriverBinding,
716                               &gEfiComponentNameProtocolGuid, ComponentName,
717                               &gEfiComponentName2ProtocolGuid, ComponentName2,
718                               &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
719                               NULL
720                               );
721             }
722           }
723         } else {
724           if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
725             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
726               Status = gBS->InstallMultipleProtocolInterfaces (
727                               &DriverBinding->DriverBindingHandle,
728                               &gEfiDriverBindingProtocolGuid, DriverBinding,
729                               &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
730                               &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
731                               NULL
732                               );
733             } else {
734               Status = gBS->InstallMultipleProtocolInterfaces (
735                               &DriverBinding->DriverBindingHandle,
736                               &gEfiDriverBindingProtocolGuid, DriverBinding,
737                               &gEfiComponentName2ProtocolGuid, ComponentName2,
738                               &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
739                               &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
740                               NULL
741                               );
742             }
743           } else {
744             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
745               Status = gBS->InstallMultipleProtocolInterfaces (
746                               &DriverBinding->DriverBindingHandle,
747                               &gEfiDriverBindingProtocolGuid, DriverBinding,
748                               &gEfiComponentNameProtocolGuid, ComponentName,
749                               &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
750                               &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
751                               NULL
752                               );
753             } else {
754               Status = gBS->InstallMultipleProtocolInterfaces (
755                               &DriverBinding->DriverBindingHandle,
756                               &gEfiDriverBindingProtocolGuid, DriverBinding,
757                               &gEfiComponentNameProtocolGuid, ComponentName,
758                               &gEfiComponentName2ProtocolGuid, ComponentName2,
759                               &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
760                               &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
761                               NULL
762                               );
763             }
764           }
765         }
766       } else {
767         if (DriverDiagnostics2 == NULL || FeaturePcdGet(PcdDriverDiagnostics2Disable)) {
768           if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
769             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
770               Status = gBS->InstallMultipleProtocolInterfaces (
771                               &DriverBinding->DriverBindingHandle,
772                               &gEfiDriverBindingProtocolGuid, DriverBinding,
773                               &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
774                               &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
775                               NULL
776                               );
777             } else {
778               Status = gBS->InstallMultipleProtocolInterfaces (
779                               &DriverBinding->DriverBindingHandle,
780                               &gEfiDriverBindingProtocolGuid, DriverBinding,
781                               &gEfiComponentName2ProtocolGuid, ComponentName2,
782                               &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
783                               &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
784                               NULL
785                               );
786             }
787           } else {
788             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
789               Status = gBS->InstallMultipleProtocolInterfaces (
790                               &DriverBinding->DriverBindingHandle,
791                               &gEfiDriverBindingProtocolGuid, DriverBinding,
792                               &gEfiComponentNameProtocolGuid, ComponentName,
793                               &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
794                               &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
795                               NULL
796                               );
797             } else {
798               Status = gBS->InstallMultipleProtocolInterfaces (
799                               &DriverBinding->DriverBindingHandle,
800                               &gEfiDriverBindingProtocolGuid, DriverBinding,
801                               &gEfiComponentNameProtocolGuid, ComponentName,
802                               &gEfiComponentName2ProtocolGuid, ComponentName2,
803                               &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
804                               &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
805                               NULL
806                               );
807             }
808           }
809         } else {
810           if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
811             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
812               Status = gBS->InstallMultipleProtocolInterfaces (
813                               &DriverBinding->DriverBindingHandle,
814                               &gEfiDriverBindingProtocolGuid, DriverBinding,
815                               &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
816                               &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
817                               &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
818                               NULL
819                               );
820             } else {
821               Status = gBS->InstallMultipleProtocolInterfaces (
822                               &DriverBinding->DriverBindingHandle,
823                               &gEfiDriverBindingProtocolGuid, DriverBinding,
824                               &gEfiComponentName2ProtocolGuid, ComponentName2,
825                               &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
826                               &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
827                               &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
828                               NULL
829                               );
830             }
831           } else {
832             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
833               Status = gBS->InstallMultipleProtocolInterfaces (
834                               &DriverBinding->DriverBindingHandle,
835                               &gEfiDriverBindingProtocolGuid, DriverBinding,
836                               &gEfiComponentNameProtocolGuid, ComponentName,
837                               &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
838                               &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
839                               &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
840                               NULL
841                               );
842             } else {
843               Status = gBS->InstallMultipleProtocolInterfaces (
844                               &DriverBinding->DriverBindingHandle,
845                               &gEfiDriverBindingProtocolGuid, DriverBinding,
846                               &gEfiComponentNameProtocolGuid, ComponentName,
847                               &gEfiComponentName2ProtocolGuid, ComponentName2,
848                               &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
849                               &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
850                               &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
851                               NULL
852                               );
853             }
854           }
855         }
856       }
857     } else {
858       if (DriverDiagnostics == NULL || FeaturePcdGet(PcdDriverDiagnosticsDisable)) {
859         if (DriverDiagnostics2 == NULL || FeaturePcdGet(PcdDriverDiagnostics2Disable)) {
860           if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
861             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
862               Status = gBS->InstallMultipleProtocolInterfaces (
863                               &DriverBinding->DriverBindingHandle,
864                               &gEfiDriverBindingProtocolGuid, DriverBinding,
865                               &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
866                               &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
867                               NULL
868                               );
869             } else {
870               Status = gBS->InstallMultipleProtocolInterfaces (
871                               &DriverBinding->DriverBindingHandle,
872                               &gEfiDriverBindingProtocolGuid, DriverBinding,
873                               &gEfiComponentName2ProtocolGuid, ComponentName2,
874                               &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
875                               &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
876                               NULL
877                               );
878             }
879           } else {
880             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
881               Status = gBS->InstallMultipleProtocolInterfaces (
882                               &DriverBinding->DriverBindingHandle,
883                               &gEfiDriverBindingProtocolGuid, DriverBinding,
884                               &gEfiComponentNameProtocolGuid, ComponentName,
885                               &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
886                               &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
887                               NULL
888                               );
889             } else {
890               Status = gBS->InstallMultipleProtocolInterfaces (
891                               &DriverBinding->DriverBindingHandle,
892                               &gEfiDriverBindingProtocolGuid, DriverBinding,
893                               &gEfiComponentNameProtocolGuid, ComponentName,
894                               &gEfiComponentName2ProtocolGuid, ComponentName2,
895                               &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
896                               &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
897                               NULL
898                               );
899             }
900           }
901         } else {
902           if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
903             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
904               Status = gBS->InstallMultipleProtocolInterfaces (
905                               &DriverBinding->DriverBindingHandle,
906                               &gEfiDriverBindingProtocolGuid, DriverBinding,
907                               &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
908                               &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
909                               &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
910                               NULL
911                               );
912             } else {
913               Status = gBS->InstallMultipleProtocolInterfaces (
914                               &DriverBinding->DriverBindingHandle,
915                               &gEfiDriverBindingProtocolGuid, DriverBinding,
916                               &gEfiComponentName2ProtocolGuid, ComponentName2,
917                               &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
918                               &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
919                               &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
920                               NULL
921                               );
922             }
923           } else {
924             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
925               Status = gBS->InstallMultipleProtocolInterfaces (
926                               &DriverBinding->DriverBindingHandle,
927                               &gEfiDriverBindingProtocolGuid, DriverBinding,
928                               &gEfiComponentNameProtocolGuid, ComponentName,
929                               &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
930                               &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
931                               &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
932                               NULL
933                               );
934             } else {
935               Status = gBS->InstallMultipleProtocolInterfaces (
936                               &DriverBinding->DriverBindingHandle,
937                               &gEfiDriverBindingProtocolGuid, DriverBinding,
938                               &gEfiComponentNameProtocolGuid, ComponentName,
939                               &gEfiComponentName2ProtocolGuid, ComponentName2,
940                               &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
941                               &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
942                               &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
943                               NULL
944                               );
945             }
946           }
947         }
948       } else {
949         if (DriverDiagnostics2 == NULL || FeaturePcdGet(PcdDriverDiagnostics2Disable)) {
950           if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
951             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
952               Status = gBS->InstallMultipleProtocolInterfaces (
953                               &DriverBinding->DriverBindingHandle,
954                               &gEfiDriverBindingProtocolGuid, DriverBinding,
955                               &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
956                               &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
957                               &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
958                               NULL
959                               );
960             } else {
961               Status = gBS->InstallMultipleProtocolInterfaces (
962                               &DriverBinding->DriverBindingHandle,
963                               &gEfiDriverBindingProtocolGuid, DriverBinding,
964                               &gEfiComponentName2ProtocolGuid, ComponentName2,
965                               &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
966                               &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
967                               &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
968                               NULL
969                               );
970             }
971           } else {
972             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
973               Status = gBS->InstallMultipleProtocolInterfaces (
974                               &DriverBinding->DriverBindingHandle,
975                               &gEfiDriverBindingProtocolGuid, DriverBinding,
976                               &gEfiComponentNameProtocolGuid, ComponentName,
977                               &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
978                               &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
979                               &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
980                               NULL
981                               );
982             } else {
983               Status = gBS->InstallMultipleProtocolInterfaces (
984                               &DriverBinding->DriverBindingHandle,
985                               &gEfiDriverBindingProtocolGuid, DriverBinding,
986                               &gEfiComponentNameProtocolGuid, ComponentName,
987                               &gEfiComponentName2ProtocolGuid, ComponentName2,
988                               &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
989                               &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
990                               &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
991                               NULL
992                               );
993             }
994           }
995         } else {
996           if (ComponentName == NULL || FeaturePcdGet(PcdComponentNameDisable)) {
997             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
998               Status = gBS->InstallMultipleProtocolInterfaces (
999                               &DriverBinding->DriverBindingHandle,
1000                               &gEfiDriverBindingProtocolGuid, DriverBinding,
1001                               &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
1002                               &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
1003                               &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
1004                               &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
1005                               NULL
1006                               );
1007             } else {
1008               Status = gBS->InstallMultipleProtocolInterfaces (
1009                               &DriverBinding->DriverBindingHandle,
1010                               &gEfiDriverBindingProtocolGuid, DriverBinding,
1011                               &gEfiComponentName2ProtocolGuid, ComponentName2,
1012                               &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
1013                               &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
1014                               &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
1015                               &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
1016                               NULL
1017                               );
1018             }
1019           } else {
1020             if (ComponentName2 == NULL || FeaturePcdGet(PcdComponentName2Disable)) {
1021               Status = gBS->InstallMultipleProtocolInterfaces (
1022                               &DriverBinding->DriverBindingHandle,
1023                               &gEfiDriverBindingProtocolGuid, DriverBinding,
1024                               &gEfiComponentNameProtocolGuid, ComponentName,
1025                               &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
1026                               &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
1027                               &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
1028                               &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
1029                               NULL
1030                               );
1031             } else {
1032               Status = gBS->InstallMultipleProtocolInterfaces (
1033                               &DriverBinding->DriverBindingHandle,
1034                               &gEfiDriverBindingProtocolGuid, DriverBinding,
1035                               &gEfiComponentNameProtocolGuid, ComponentName,
1036                               &gEfiComponentName2ProtocolGuid, ComponentName2,
1037                               &gEfiDriverConfigurationProtocolGuid, DriverConfiguration,
1038                               &gEfiDriverConfiguration2ProtocolGuid, DriverConfiguration2,
1039                               &gEfiDriverDiagnosticsProtocolGuid, DriverDiagnostics,
1040                               &gEfiDriverDiagnostics2ProtocolGuid, DriverDiagnostics2,
1041                               NULL
1042                               );
1043             }
1044           }
1045         }
1046       }
1047     }
1048   }
1049 
1050   //
1051   // ASSERT if the call to InstallMultipleProtocolInterfaces() failed
1052   //
1053   ASSERT_EFI_ERROR (Status);
1054 
1055   return Status;
1056 }
1057