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