2 Main file for Disconnect shell Driver1 function.
4 Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
15 #include "UefiShellDriver1CommandsLib.h"
17 STATIC CONST SHELL_PARAM_ITEM ParamList
[] = {
29 // Stolen from UEFI 2.3 spec (May 2009 version)
31 // Removed gBS local definition
35 // Disconnect All Handles Example
36 // The following example recusively disconnects all drivers from all
37 // controllers in a platform.
40 // EFI_BOOT_SERVICES *gBS;
42 EFI_HANDLE
*HandleBuffer
;
45 // Retrieve the list of all handles from the handle database
47 Status
= gBS
->LocateHandleBuffer (
54 if (!EFI_ERROR (Status
)) {
55 for (HandleIndex
= 0; HandleIndex
< HandleCount
; HandleIndex
++) {
56 Status
= gBS
->DisconnectController (
57 HandleBuffer
[HandleIndex
],
62 gBS
->FreePool(HandleBuffer
);
72 ShellCommandRunDisconnect (
73 IN EFI_HANDLE ImageHandle
,
74 IN EFI_SYSTEM_TABLE
*SystemTable
80 SHELL_STATUS ShellStatus
;
88 ShellStatus
= SHELL_SUCCESS
;
91 // initialize the shell lib (we must be in non-auto-init...)
93 Status
= ShellInitialize();
94 ASSERT_EFI_ERROR(Status
);
96 Status
= CommandInit();
97 ASSERT_EFI_ERROR(Status
);
100 // parse the command line
102 Status
= ShellCommandLineParse (ParamList
, &Package
, &ProblemParam
, TRUE
);
103 if (EFI_ERROR(Status
)) {
104 if (Status
== EFI_VOLUME_CORRUPTED
&& ProblemParam
!= NULL
) {
105 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDriver1HiiHandle
, ProblemParam
);
106 FreePool(ProblemParam
);
107 ShellStatus
= SHELL_INVALID_PARAMETER
;
112 if (ShellCommandLineGetFlag(Package
, L
"-r")){
113 if (ShellCommandLineGetCount(Package
) > 1){
114 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_MANY
), gShellDriver1HiiHandle
);
115 ShellStatus
= SHELL_INVALID_PARAMETER
;
116 } else if (ShellCommandLineGetCount(Package
) < 1) {
117 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_FEW
), gShellDriver1HiiHandle
);
118 ShellStatus
= SHELL_INVALID_PARAMETER
;
120 Status
= DisconnectAll();
123 if (ShellCommandLineGetCount(Package
) > 4){
124 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_MANY
), gShellDriver1HiiHandle
);
125 ShellStatus
= SHELL_INVALID_PARAMETER
;
126 } else if (ShellCommandLineGetCount(Package
) < 2) {
127 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_FEW
), gShellDriver1HiiHandle
);
128 ShellStatus
= SHELL_INVALID_PARAMETER
;
131 // must have between 1 and 3 handles passed in ...
133 Param1
= ShellCommandLineGetRawValue(Package
, 1);
134 Param2
= ShellCommandLineGetRawValue(Package
, 2);
135 Param3
= ShellCommandLineGetRawValue(Package
, 3);
136 Handle1
= Param1
!=NULL
?ConvertHandleIndexToHandle(StrHexToUintn(Param1
)):NULL
;
137 Handle2
= Param2
!=NULL
?ConvertHandleIndexToHandle(StrHexToUintn(Param2
)):NULL
;
138 Handle3
= Param3
!=NULL
?ConvertHandleIndexToHandle(StrHexToUintn(Param3
)):NULL
;
140 if (Param1
!= NULL
&& Handle1
== NULL
) {
141 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_INV_HANDLE
), gShellDriver1HiiHandle
, Param1
);
142 ShellStatus
= SHELL_INVALID_PARAMETER
;
143 } else if (Param2
!= NULL
&& Handle2
== NULL
) {
144 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_INV_HANDLE
), gShellDriver1HiiHandle
, Param2
);
145 ShellStatus
= SHELL_INVALID_PARAMETER
;
146 } else if (Param3
!= NULL
&& Handle3
== NULL
) {
147 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_INV_HANDLE
), gShellDriver1HiiHandle
, Param3
);
148 ShellStatus
= SHELL_INVALID_PARAMETER
;
149 } else if (EFI_ERROR(gBS
->OpenProtocol(Handle1
, &gEfiDevicePathProtocolGuid
, NULL
, gImageHandle
, NULL
, EFI_OPEN_PROTOCOL_TEST_PROTOCOL
))) {
150 ASSERT(Param1
!= NULL
);
151 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_HANDLE_NOT
), gShellDriver1HiiHandle
, StrHexToUintn(Param1
), L
"controller handle");
152 ShellStatus
= SHELL_INVALID_PARAMETER
;
153 } else if (Handle2
!= NULL
&& EFI_ERROR(gBS
->OpenProtocol(Handle2
, &gEfiDriverBindingProtocolGuid
, NULL
, gImageHandle
, NULL
, EFI_OPEN_PROTOCOL_TEST_PROTOCOL
))) {
154 ASSERT(Param2
!= NULL
);
155 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_HANDLE_NOT
), gShellDriver1HiiHandle
, StrHexToUintn(Param2
), L
"driver handle");
156 ShellStatus
= SHELL_INVALID_PARAMETER
;
158 ASSERT(Param1
!= NULL
);
159 ASSERT(Param2
!= NULL
);
160 ASSERT(Param3
!= NULL
);
161 Status
= gBS
->DisconnectController(Handle1
, Handle2
, Handle3
);
162 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_3P_RESULT
), gShellDriver1HiiHandle
, L
"Disconnect", Handle1
, Handle2
, Handle3
, Status
);
167 if (ShellStatus
== SHELL_SUCCESS
) {
168 if (Status
== EFI_SECURITY_VIOLATION
) {
169 ShellStatus
= SHELL_SECURITY_VIOLATION
;
170 } else if (Status
== EFI_INVALID_PARAMETER
) {
171 ShellStatus
= SHELL_INVALID_PARAMETER
;
172 } else if (EFI_ERROR(Status
)) {
173 ShellStatus
= SHELL_NOT_FOUND
;
176 return (ShellStatus
);