1 /*++
2 
3 Copyright (c) 2004 - 2013, Intel Corporation. All rights reserved.<BR>
4 This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution.  The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
8 
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
11 
12 
13 Module Name:
14 
15   UefiDriverModelLib.c
16 
17 Abstract:
18 
19   UEFI Driver Model Library.
20 
21 --*/
22 
23 #include "EdkIIGlueUefi.h"
24 
25 
26 /**
27   The constructor function installs the standard EFI Driver Model Protocols.
28 
29   @param[in] ImageHandle The firmware allocated handle for the EFI image.
30   @param[in] SystemTable A pointer to the EFI System Table.
31 
32   @retval EFI_SUCCESS The constructor always return EFI_SUCCESS.
33 
34 **/
35 EFI_STATUS
36 EFIAPI
UefiDriverModelLibConstructor(IN EFI_HANDLE ImageHandle,IN EFI_SYSTEM_TABLE * SystemTable)37 UefiDriverModelLibConstructor (
38   IN EFI_HANDLE        ImageHandle,
39   IN EFI_SYSTEM_TABLE  *SystemTable
40   )
41 {
42   EFI_STATUS                   Status = EFI_UNSUPPORTED;
43   EFI_DRIVER_BINDING_PROTOCOL  *DriverBinding;
44 
45   //
46   // The Driver Binding Protocol must never be NULL
47   //
48   DriverBinding = (EFI_DRIVER_BINDING_PROTOCOL *) _gDriverModelProtocolList[0].DriverBinding;
49   ASSERT(DriverBinding != NULL);
50 
51   //
52   // Update the ImageHandle and DriverBindingHandle fields of the Driver Binding Protocol
53   // Install the first Driver Bindng Protocol onto ImageHandle
54   //
55   DriverBinding->ImageHandle         = ImageHandle;
56   DriverBinding->DriverBindingHandle = ImageHandle;
57 
58   //
59   // See if onle one Driver Binding Protocol is advertised by the driver
60   // EdkIIGlueLib: _gDriverModelProtocolListEntries is always 1
61   //
62 
63 
64   //
65   // Check for all 8 possible combinations of the ComponentName, DriverConfiguration, and DriverDiagnostics Protocol
66   // These are all checks against const pointers, so the optimizing compiler will only select one of the
67   // calls to InstallMultipleProtocolInterfaces()
68   //
69   if ((_gEdkIIGlueDriverModelProtocolSelection == 1) || (_gEdkIIGlueDriverModelProtocolSelection == 3)) {
70     if (_gDriverModelProtocolList[0].DriverDiagnostics == NULL) {
71       if (_gDriverModelProtocolList[0].DriverConfiguration == NULL) {
72         if (_gDriverModelProtocolList[0].ComponentName == NULL) {
73           Status = gBS->InstallMultipleProtocolInterfaces (
74                           &DriverBinding->DriverBindingHandle,
75                           &gEfiDriverBindingProtocolGuid, DriverBinding,
76                           NULL
77                           );
78         } else {
79           Status = gBS->InstallMultipleProtocolInterfaces (
80                           &DriverBinding->DriverBindingHandle,
81                           &gEfiDriverBindingProtocolGuid, DriverBinding,
82                           &gEfiComponentNameProtocolGuid, (EFI_COMPONENT_NAME_PROTOCOL *)_gDriverModelProtocolList[0].ComponentName,
83                           NULL
84                           );
85         }
86       } else {
87         if (_gDriverModelProtocolList[0].ComponentName == NULL) {
88           Status = gBS->InstallMultipleProtocolInterfaces (
89                           &DriverBinding->DriverBindingHandle,
90                           &gEfiDriverBindingProtocolGuid,       DriverBinding,
91                           &gEfiDriverConfigurationProtocolGuid, (EFI_DRIVER_CONFIGURATION_PROTOCOL *)_gDriverModelProtocolList[0].DriverConfiguration,
92                           NULL
93                           );
94         } else {
95           Status = gBS->InstallMultipleProtocolInterfaces (
96                           &DriverBinding->DriverBindingHandle,
97                           &gEfiDriverBindingProtocolGuid,       DriverBinding,
98                           &gEfiComponentNameProtocolGuid,       (EFI_COMPONENT_NAME_PROTOCOL *)_gDriverModelProtocolList[0].ComponentName,
99                           &gEfiDriverConfigurationProtocolGuid, (EFI_DRIVER_CONFIGURATION_PROTOCOL *)_gDriverModelProtocolList[0].DriverConfiguration,
100                           NULL
101                           );
102         }
103       }
104     } else {
105       if (_gDriverModelProtocolList[0].DriverConfiguration == NULL) {
106         if (_gDriverModelProtocolList[0].ComponentName == NULL) {
107           Status = gBS->InstallMultipleProtocolInterfaces (
108                           &DriverBinding->DriverBindingHandle,
109                           &gEfiDriverBindingProtocolGuid,     DriverBinding,
110                           &gEfiDriverDiagnosticsProtocolGuid, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL *)_gDriverModelProtocolList[0].DriverDiagnostics,
111                           NULL
112                           );
113         } else {
114           Status = gBS->InstallMultipleProtocolInterfaces (
115                           &DriverBinding->DriverBindingHandle,
116                           &gEfiDriverBindingProtocolGuid,     DriverBinding,
117                           &gEfiComponentNameProtocolGuid,     (EFI_COMPONENT_NAME_PROTOCOL *)_gDriverModelProtocolList[0].ComponentName,
118                           &gEfiDriverDiagnosticsProtocolGuid, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL *)_gDriverModelProtocolList[0].DriverDiagnostics,
119                           NULL
120                           );
121         }
122       } else {
123         if (_gDriverModelProtocolList[0].ComponentName == NULL) {
124           Status = gBS->InstallMultipleProtocolInterfaces (
125                           &DriverBinding->DriverBindingHandle,
126                           &gEfiDriverBindingProtocolGuid,       DriverBinding,
127                           &gEfiDriverConfigurationProtocolGuid, (EFI_DRIVER_CONFIGURATION_PROTOCOL *)_gDriverModelProtocolList[0].DriverConfiguration,
128                           &gEfiDriverDiagnosticsProtocolGuid,   (EFI_DRIVER_DIAGNOSTICS_PROTOCOL *)_gDriverModelProtocolList[0].DriverDiagnostics,
129                           NULL
130                           );
131         } else {
132           Status = gBS->InstallMultipleProtocolInterfaces (
133                           &DriverBinding->DriverBindingHandle,
134                           &gEfiDriverBindingProtocolGuid,       DriverBinding,
135                           &gEfiComponentNameProtocolGuid,       (EFI_COMPONENT_NAME_PROTOCOL *)_gDriverModelProtocolList[0].ComponentName,
136                           &gEfiDriverConfigurationProtocolGuid, (EFI_DRIVER_CONFIGURATION_PROTOCOL *)_gDriverModelProtocolList[0].DriverConfiguration,
137                           &gEfiDriverDiagnosticsProtocolGuid,   (EFI_DRIVER_DIAGNOSTICS_PROTOCOL *)_gDriverModelProtocolList[0].DriverDiagnostics,
138                           NULL
139                           );
140         }
141       }
142     }
143   } // selection == 1 or 3
144 
145   if ((_gEdkIIGlueDriverModelProtocolSelection == 2) || (_gEdkIIGlueDriverModelProtocolSelection == 3)) {
146     if (_gDriverModelProtocolList[0].DriverDiagnostics2== NULL) {
147       if (_gDriverModelProtocolList[0].DriverConfiguration2== NULL) {
148         if (_gDriverModelProtocolList[0].ComponentName2== NULL) {
149           Status = gBS->InstallMultipleProtocolInterfaces (
150                           &DriverBinding->DriverBindingHandle,
151                           &gEfiDriverBindingProtocolGuid, DriverBinding,
152                           NULL
153                           );
154         } else {
155           Status = gBS->InstallMultipleProtocolInterfaces (
156                           &DriverBinding->DriverBindingHandle,
157                           &gEfiDriverBindingProtocolGuid,  DriverBinding,
158                           &gEfiComponentName2ProtocolGuid, (EFI_COMPONENT_NAME2_PROTOCOL *)_gDriverModelProtocolList[0].ComponentName2,
159                           NULL
160                           );
161         }
162       } else {
163         if (_gDriverModelProtocolList[0].ComponentName2 == NULL) {
164           Status = gBS->InstallMultipleProtocolInterfaces (
165                           &DriverBinding->DriverBindingHandle,
166                           &gEfiDriverBindingProtocolGuid,        DriverBinding,
167                           &gEfiDriverConfiguration2ProtocolGuid, (EFI_DRIVER_CONFIGURATION2_PROTOCOL *)_gDriverModelProtocolList[0].DriverConfiguration2,
168                           NULL
169                           );
170         } else {
171           Status = gBS->InstallMultipleProtocolInterfaces (
172                           &DriverBinding->DriverBindingHandle,
173                           &gEfiDriverBindingProtocolGuid,        DriverBinding,
174                           &gEfiComponentName2ProtocolGuid,       (EFI_COMPONENT_NAME2_PROTOCOL *)_gDriverModelProtocolList[0].ComponentName2,
175                           &gEfiDriverConfiguration2ProtocolGuid, (EFI_DRIVER_CONFIGURATION2_PROTOCOL *)_gDriverModelProtocolList[0].DriverConfiguration2,
176                           NULL
177                           );
178         }
179       }
180     } else {
181       if (_gDriverModelProtocolList[0].DriverConfiguration2 == NULL) {
182         if (_gDriverModelProtocolList[0].ComponentName2 == NULL) {
183           Status = gBS->InstallMultipleProtocolInterfaces (
184                           &DriverBinding->DriverBindingHandle,
185                           &gEfiDriverBindingProtocolGuid,      DriverBinding,
186                           &gEfiDriverDiagnostics2ProtocolGuid, (EFI_DRIVER_DIAGNOSTICS2_PROTOCOL *)_gDriverModelProtocolList[0].DriverDiagnostics2,
187                           NULL
188                           );
189         } else {
190           Status = gBS->InstallMultipleProtocolInterfaces (
191                           &DriverBinding->DriverBindingHandle,
192                           &gEfiDriverBindingProtocolGuid,      DriverBinding,
193                           &gEfiComponentName2ProtocolGuid,     (EFI_COMPONENT_NAME2_PROTOCOL *)_gDriverModelProtocolList[0].ComponentName2,
194                           &gEfiDriverDiagnostics2ProtocolGuid, (EFI_DRIVER_DIAGNOSTICS2_PROTOCOL *)_gDriverModelProtocolList[0].DriverDiagnostics2,
195                           NULL
196                           );
197         }
198       } else {
199         if (_gDriverModelProtocolList[0].ComponentName2 == NULL) {
200           Status = gBS->InstallMultipleProtocolInterfaces (
201                           &DriverBinding->DriverBindingHandle,
202                           &gEfiDriverBindingProtocolGuid,        DriverBinding,
203                           &gEfiDriverConfiguration2ProtocolGuid, (EFI_DRIVER_CONFIGURATION2_PROTOCOL *)_gDriverModelProtocolList[0].DriverConfiguration2,
204                           &gEfiDriverDiagnostics2ProtocolGuid,   (EFI_DRIVER_DIAGNOSTICS2_PROTOCOL *)_gDriverModelProtocolList[0].DriverDiagnostics2,
205                           NULL
206                           );
207         } else {
208           Status = gBS->InstallMultipleProtocolInterfaces (
209                           &DriverBinding->DriverBindingHandle,
210                           &gEfiDriverBindingProtocolGuid,        DriverBinding,
211                           &gEfiComponentName2ProtocolGuid,       (EFI_COMPONENT_NAME2_PROTOCOL *)_gDriverModelProtocolList[0].ComponentName2,
212                           &gEfiDriverConfiguration2ProtocolGuid, (EFI_DRIVER_CONFIGURATION2_PROTOCOL *)_gDriverModelProtocolList[0].DriverConfiguration2,
213                           &gEfiDriverDiagnostics2ProtocolGuid,   (EFI_DRIVER_DIAGNOSTICS2_PROTOCOL *)_gDriverModelProtocolList[0].DriverDiagnostics2,
214                           NULL
215                           );
216         }
217       }
218     }
219   } // selection == 2 or 3
220 
221   //
222   // ASSERT if the call to InstallMultipleProtocolInterfaces() failed
223   //
224   ASSERT_EFI_ERROR (Status);
225   return Status;
226 }
227 
228 /**
229   The destructor function uninstalls the standard EFI Driver Model Protocols.
230 
231   @param[in] ImageHandle The firmware allocated handle for the EFI image.
232   @param[in] SystemTable A pointer to the EFI System Table.
233 
234   @retval EFI_SUCCESS The destructor always return EFI_SUCCESS.
235 
236 **/
237 EFI_STATUS
238 EFIAPI
UefiDriverModelLibDestructor(IN EFI_HANDLE ImageHandle,IN EFI_SYSTEM_TABLE * SystemTable)239 UefiDriverModelLibDestructor (
240   IN EFI_HANDLE        ImageHandle,
241   IN EFI_SYSTEM_TABLE  *SystemTable
242   )
243 {
244   EFI_STATUS  Status = EFI_UNSUPPORTED;
245   EFI_HANDLE  DriverBindingHandle;
246 
247   //
248   // See if onle one Driver Binding Protocol is advertised by the driver
249   // EdkIIGlueLib: _gDriverModelProtocolListEntries is always 1
250   //
251 
252   //
253   // The Driver Binding Protocol must never be NULL
254   //
255   ASSERT(_gDriverModelProtocolList[0].DriverBinding != NULL);
256 
257   //
258   // Retrieve the DriverBindingHandle from the Driver Binding Protocol
259   //
260   DriverBindingHandle = _gDriverModelProtocolList[0].DriverBinding->DriverBindingHandle;
261 
262   //
263   // Check for all 8 possible combinations of the ComponentName, DriverConfiguration, and DriverDiagnostics Protocol
264   // These are all checks against const pointers, so the optimizing compiler will only select one of the
265   // calls to InstallMultipleProtocolInterfaces()
266   //
267   if ((_gEdkIIGlueDriverModelProtocolSelection == 1) || (_gEdkIIGlueDriverModelProtocolSelection == 3)) {
268     if (_gDriverModelProtocolList[0].DriverDiagnostics == NULL) {
269       if (_gDriverModelProtocolList[0].DriverConfiguration == NULL) {
270         if (_gDriverModelProtocolList[0].ComponentName == NULL) {
271           Status = gBS->UninstallMultipleProtocolInterfaces (
272                           DriverBindingHandle,
273                           &gEfiDriverBindingProtocolGuid, (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,
274                           NULL
275                           );
276         } else {
277           Status = gBS->UninstallMultipleProtocolInterfaces (
278                           &DriverBindingHandle,
279                           &gEfiDriverBindingProtocolGuid, (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,
280                           &gEfiComponentNameProtocolGuid, (EFI_COMPONENT_NAME_PROTOCOL *)_gDriverModelProtocolList[0].ComponentName,
281                           NULL
282                           );
283         }
284       } else {
285         if (_gDriverModelProtocolList[0].ComponentName == NULL) {
286           Status = gBS->UninstallMultipleProtocolInterfaces (
287                           &DriverBindingHandle,
288                           &gEfiDriverBindingProtocolGuid,       (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,
289                           &gEfiDriverConfigurationProtocolGuid, (EFI_DRIVER_CONFIGURATION_PROTOCOL *)_gDriverModelProtocolList[0].DriverConfiguration,
290                           NULL
291                           );
292         } else {
293           Status = gBS->UninstallMultipleProtocolInterfaces (
294                           &DriverBindingHandle,
295                           &gEfiDriverBindingProtocolGuid,       (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,
296                           &gEfiComponentNameProtocolGuid,       (EFI_COMPONENT_NAME_PROTOCOL *)_gDriverModelProtocolList[0].ComponentName,
297                           &gEfiDriverConfigurationProtocolGuid, (EFI_DRIVER_CONFIGURATION_PROTOCOL *)_gDriverModelProtocolList[0].DriverConfiguration,
298                           NULL
299                           );
300         }
301       }
302     } else {
303       if (_gDriverModelProtocolList[0].DriverConfiguration == NULL) {
304         if (_gDriverModelProtocolList[0].ComponentName == NULL) {
305           Status = gBS->UninstallMultipleProtocolInterfaces (
306                           &DriverBindingHandle,
307                           &gEfiDriverBindingProtocolGuid,     (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,
308                           &gEfiDriverDiagnosticsProtocolGuid, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL *)_gDriverModelProtocolList[0].DriverDiagnostics,
309                           NULL
310                           );
311         } else {
312           Status = gBS->UninstallMultipleProtocolInterfaces (
313                           &DriverBindingHandle,
314                           &gEfiDriverBindingProtocolGuid,     (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,
315                           &gEfiComponentNameProtocolGuid,     (EFI_COMPONENT_NAME_PROTOCOL *)_gDriverModelProtocolList[0].ComponentName,
316                           &gEfiDriverDiagnosticsProtocolGuid, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL *)_gDriverModelProtocolList[0].DriverDiagnostics,
317                           NULL
318                           );
319         }
320       } else {
321         if (_gDriverModelProtocolList[0].ComponentName == NULL) {
322           Status = gBS->UninstallMultipleProtocolInterfaces (
323                           &DriverBindingHandle,
324                           &gEfiDriverBindingProtocolGuid,       (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,
325                           &gEfiDriverConfigurationProtocolGuid, (EFI_DRIVER_CONFIGURATION_PROTOCOL *)_gDriverModelProtocolList[0].DriverConfiguration,
326                           &gEfiDriverDiagnosticsProtocolGuid,   (EFI_DRIVER_DIAGNOSTICS_PROTOCOL *)_gDriverModelProtocolList[0].DriverDiagnostics,
327                           NULL
328                           );
329         } else {
330           Status = gBS->UninstallMultipleProtocolInterfaces (
331                           &DriverBindingHandle,
332                           &gEfiDriverBindingProtocolGuid,       (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,
333                           &gEfiComponentNameProtocolGuid,       (EFI_COMPONENT_NAME_PROTOCOL *)_gDriverModelProtocolList[0].ComponentName,
334                           &gEfiDriverConfigurationProtocolGuid, (EFI_DRIVER_CONFIGURATION_PROTOCOL *)_gDriverModelProtocolList[0].DriverConfiguration,
335                           &gEfiDriverDiagnosticsProtocolGuid,   (EFI_DRIVER_DIAGNOSTICS_PROTOCOL *)_gDriverModelProtocolList[0].DriverDiagnostics,
336                           NULL
337                           );
338         }
339       }
340     }
341   } // selection == 1 or 3
342 
343   if ((_gEdkIIGlueDriverModelProtocolSelection == 2) || (_gEdkIIGlueDriverModelProtocolSelection == 3)) {
344     if (_gDriverModelProtocolList[0].DriverDiagnostics2 == NULL) {
345       if (_gDriverModelProtocolList[0].DriverConfiguration2 == NULL) {
346         if (_gDriverModelProtocolList[0].ComponentName2 == NULL) {
347           Status = gBS->UninstallMultipleProtocolInterfaces (
348                           DriverBindingHandle,
349                           &gEfiDriverBindingProtocolGuid, (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,
350                           NULL
351                           );
352         } else {
353           Status = gBS->UninstallMultipleProtocolInterfaces (
354                           &DriverBindingHandle,
355                           &gEfiDriverBindingProtocolGuid, (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,
356                           &gEfiComponentName2ProtocolGuid, (EFI_COMPONENT_NAME2_PROTOCOL *)_gDriverModelProtocolList[0].ComponentName2,
357                           NULL
358                           );
359         }
360       } else {
361         if (_gDriverModelProtocolList[0].ComponentName2 == NULL) {
362           Status = gBS->UninstallMultipleProtocolInterfaces (
363                           &DriverBindingHandle,
364                           &gEfiDriverBindingProtocolGuid,        (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,
365                           &gEfiDriverConfiguration2ProtocolGuid, (EFI_DRIVER_CONFIGURATION2_PROTOCOL *)_gDriverModelProtocolList[0].DriverConfiguration2,
366                           NULL
367                           );
368         } else {
369           Status = gBS->UninstallMultipleProtocolInterfaces (
370                           &DriverBindingHandle,
371                           &gEfiDriverBindingProtocolGuid,        (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,
372                           &gEfiComponentName2ProtocolGuid,       (EFI_COMPONENT_NAME2_PROTOCOL *)_gDriverModelProtocolList[0].ComponentName2,
373                           &gEfiDriverConfiguration2ProtocolGuid, (EFI_DRIVER_CONFIGURATION2_PROTOCOL *)_gDriverModelProtocolList[0].DriverConfiguration2,
374                           NULL
375                           );
376         }
377       }
378     } else {
379       if (_gDriverModelProtocolList[0].DriverConfiguration2 == NULL) {
380         if (_gDriverModelProtocolList[0].ComponentName2 == NULL) {
381           Status = gBS->UninstallMultipleProtocolInterfaces (
382                           &DriverBindingHandle,
383                           &gEfiDriverBindingProtocolGuid,      (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,
384                           &gEfiDriverDiagnostics2ProtocolGuid, (EFI_DRIVER_DIAGNOSTICS2_PROTOCOL *)_gDriverModelProtocolList[0].DriverDiagnostics2,
385                           NULL
386                           );
387         } else {
388           Status = gBS->UninstallMultipleProtocolInterfaces (
389                           &DriverBindingHandle,
390                           &gEfiDriverBindingProtocolGuid,      (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,
391                           &gEfiComponentName2ProtocolGuid,     (EFI_COMPONENT_NAME2_PROTOCOL *)_gDriverModelProtocolList[0].ComponentName2,
392                           &gEfiDriverDiagnostics2ProtocolGuid, (EFI_DRIVER_DIAGNOSTICS2_PROTOCOL *)_gDriverModelProtocolList[0].DriverDiagnostics2,
393                           NULL
394                           );
395         }
396       } else {
397         if (_gDriverModelProtocolList[0].ComponentName2 == NULL) {
398           Status = gBS->UninstallMultipleProtocolInterfaces (
399                           &DriverBindingHandle,
400                           &gEfiDriverBindingProtocolGuid,        (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,
401                           &gEfiDriverConfiguration2ProtocolGuid, (EFI_DRIVER_CONFIGURATION2_PROTOCOL *)_gDriverModelProtocolList[0].DriverConfiguration2,
402                           &gEfiDriverDiagnostics2ProtocolGuid,   (EFI_DRIVER_DIAGNOSTICS2_PROTOCOL *)_gDriverModelProtocolList[0].DriverDiagnostics2,
403                           NULL
404                           );
405         } else {
406           Status = gBS->UninstallMultipleProtocolInterfaces (
407                           &DriverBindingHandle,
408                           &gEfiDriverBindingProtocolGuid,        (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,
409                           &gEfiComponentName2ProtocolGuid,       (EFI_COMPONENT_NAME2_PROTOCOL *)_gDriverModelProtocolList[0].ComponentName2,
410                           &gEfiDriverConfiguration2ProtocolGuid, (EFI_DRIVER_CONFIGURATION2_PROTOCOL *)_gDriverModelProtocolList[0].DriverConfiguration2,
411                           &gEfiDriverDiagnostics2ProtocolGuid,   (EFI_DRIVER_DIAGNOSTICS2_PROTOCOL *)_gDriverModelProtocolList[0].DriverDiagnostics2,
412                           NULL
413                           );
414         }
415       }
416     }
417   } // selection == 2 or 3
418 
419   //
420   // ASSERT if the call to UninstallMultipleProtocolInterfaces() failed
421   //
422   ASSERT_EFI_ERROR (Status);
423 
424   return EFI_SUCCESS;
425 }
426