]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellDriver1CommandsLib/Disconnect.c
Update return value.
[mirror_edk2.git] / ShellPkg / Library / UefiShellDriver1CommandsLib / Disconnect.c
CommitLineData
4ba49616 1/** @file\r
2 Main file for Disconnect shell Driver1 function.\r
3\r
4 Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>\r
5 This program and the accompanying materials\r
6 are licensed and made available under the terms and conditions of the BSD License\r
7 which accompanies this distribution. The full text of the license may be found at\r
8 http://opensource.org/licenses/bsd-license.php\r
9\r
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
15#include "UefiShellDriver1CommandsLib.h"\r
16\r
17STATIC CONST SHELL_PARAM_ITEM ParamList[] = {\r
18 {L"-r", TypeFlag},\r
19 {NULL, TypeMax}\r
20 };\r
21\r
22EFI_STATUS\r
23EFIAPI\r
24DisconnectAll(\r
25 VOID\r
26 )\r
27{\r
28 //\r
29 // Stolen from UEFI 2.3 spec (May 2009 version)\r
30 // Pages 171/172\r
31 // Removed gBS local definition\r
32 //\r
33\r
34 //\r
35 // Disconnect All Handles Example\r
36 // The following example recusively disconnects all drivers from all\r
37 // controllers in a platform.\r
38 //\r
39 EFI_STATUS Status;\r
40// EFI_BOOT_SERVICES *gBS;\r
41 UINTN HandleCount;\r
42 EFI_HANDLE *HandleBuffer;\r
43 UINTN HandleIndex;\r
44 //\r
45 // Retrieve the list of all handles from the handle database\r
46 //\r
47 Status = gBS->LocateHandleBuffer (\r
48 AllHandles,\r
49 NULL,\r
50 NULL,\r
51 &HandleCount,\r
52 &HandleBuffer\r
53 );\r
54 if (!EFI_ERROR (Status)) {\r
55 for (HandleIndex = 0; HandleIndex < HandleCount; HandleIndex++) {\r
56 Status = gBS->DisconnectController (\r
57 HandleBuffer[HandleIndex],\r
58 NULL,\r
59 NULL\r
60 );\r
61 }\r
62 gBS->FreePool(HandleBuffer);\r
63 //\r
64 // end of stealing\r
65 //\r
66 }\r
67 return (EFI_SUCCESS);\r
68}\r
69\r
70SHELL_STATUS\r
71EFIAPI\r
72ShellCommandRunDisconnect (\r
73 IN EFI_HANDLE ImageHandle,\r
74 IN EFI_SYSTEM_TABLE *SystemTable\r
75 )\r
76{\r
77 EFI_STATUS Status;\r
78 LIST_ENTRY *Package;\r
79 CHAR16 *ProblemParam;\r
80 SHELL_STATUS ShellStatus;\r
81 CONST CHAR16 *Param1;\r
82 CONST CHAR16 *Param2;\r
83 CONST CHAR16 *Param3;\r
84 EFI_HANDLE Handle1;\r
85 EFI_HANDLE Handle2;\r
86 EFI_HANDLE Handle3;\r
87\r
88 ShellStatus = SHELL_SUCCESS;\r
89\r
90 //\r
91 // initialize the shell lib (we must be in non-auto-init...)\r
92 //\r
93 Status = ShellInitialize();\r
94 ASSERT_EFI_ERROR(Status);\r
95\r
96 Status = CommandInit();\r
97 ASSERT_EFI_ERROR(Status);\r
98\r
99 //\r
100 // parse the command line\r
101 //\r
102 Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);\r
103 if (EFI_ERROR(Status)) {\r
104 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
105 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, ProblemParam);\r
106 FreePool(ProblemParam);\r
107 ShellStatus = SHELL_INVALID_PARAMETER;\r
108 } else {\r
109 ASSERT(FALSE);\r
110 }\r
111 } else {\r
112 if (ShellCommandLineGetFlag(Package, L"-r")){\r
113 if (ShellCommandLineGetCount(Package) > 1){\r
114 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle);\r
115 ShellStatus = SHELL_INVALID_PARAMETER;\r
116 } else if (ShellCommandLineGetCount(Package) < 1) {\r
117 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDriver1HiiHandle);\r
118 ShellStatus = SHELL_INVALID_PARAMETER;\r
119 } else {\r
120 Status = DisconnectAll();\r
121 }\r
122 } else {\r
123 if (ShellCommandLineGetCount(Package) > 4){\r
124 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle);\r
125 ShellStatus = SHELL_INVALID_PARAMETER;\r
126 } else if (ShellCommandLineGetCount(Package) < 2) {\r
127 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDriver1HiiHandle);\r
128 ShellStatus = SHELL_INVALID_PARAMETER;\r
129 } else {\r
130 //\r
131 // must have between 1 and 3 handles passed in ...\r
132 //\r
133 Param1 = ShellCommandLineGetRawValue(Package, 1);\r
134 Param2 = ShellCommandLineGetRawValue(Package, 2);\r
135 Param3 = ShellCommandLineGetRawValue(Package, 3);\r
136 Handle1 = Param1!=NULL?ConvertHandleIndexToHandle(StrHexToUintn(Param1)):NULL;\r
137 Handle2 = Param2!=NULL?ConvertHandleIndexToHandle(StrHexToUintn(Param2)):NULL;\r
138 Handle3 = Param3!=NULL?ConvertHandleIndexToHandle(StrHexToUintn(Param3)):NULL;\r
139\r
140 if (Param1 != NULL && Handle1 == NULL) {\r
141 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, Param1);\r
142 ShellStatus = SHELL_INVALID_PARAMETER;\r
143 } else if (Param2 != NULL && Handle2 == NULL) {\r
144 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, Param2);\r
145 ShellStatus = SHELL_INVALID_PARAMETER;\r
146 } else if (Param3 != NULL && Handle3 == NULL) {\r
147 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, Param3);\r
148 ShellStatus = SHELL_INVALID_PARAMETER;\r
149 } else if (EFI_ERROR(gBS->OpenProtocol(Handle1, &gEfiDevicePathProtocolGuid, NULL, gImageHandle, NULL, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) {\r
150 ASSERT(Param1 != NULL);\r
151 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_HANDLE_NOT), gShellDriver1HiiHandle, StrHexToUintn(Param1), L"controller handle");\r
152 ShellStatus = SHELL_INVALID_PARAMETER;\r
153 } else if (Handle2 != NULL && EFI_ERROR(gBS->OpenProtocol(Handle2, &gEfiDriverBindingProtocolGuid, NULL, gImageHandle, NULL, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) {\r
154 ASSERT(Param2 != NULL);\r
155 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_HANDLE_NOT), gShellDriver1HiiHandle, StrHexToUintn(Param2), L"driver handle");\r
156 ShellStatus = SHELL_INVALID_PARAMETER;\r
157 } else {\r
158 ASSERT(Param1 != NULL);\r
159 ASSERT(Param2 != NULL);\r
160 ASSERT(Param3 != NULL);\r
161 Status = gBS->DisconnectController(Handle1, Handle2, Handle3);\r
162 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_3P_RESULT), gShellDriver1HiiHandle, L"Disconnect", Handle1, Handle2, Handle3, Status);\r
163 }\r
164 }\r
165 }\r
166 }\r
167 if (ShellStatus == SHELL_SUCCESS) {\r
168 if (Status == EFI_SECURITY_VIOLATION) {\r
169 ShellStatus = SHELL_SECURITY_VIOLATION;\r
170 } else if (Status == EFI_INVALID_PARAMETER) {\r
171 ShellStatus = SHELL_INVALID_PARAMETER;\r
172 } else if (EFI_ERROR(Status)) {\r
173 ShellStatus = SHELL_NOT_FOUND;\r
174 }\r
175 }\r
176 return (ShellStatus);\r
177}\r