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