]> git.proxmox.com Git - mirror_edk2.git/blob - ShellPkg/Library/UefiShellDriver1CommandsLib/Disconnect.c
Adding Driver1 profile commands to the UEFI Shell 2.0.
[mirror_edk2.git] / ShellPkg / Library / UefiShellDriver1CommandsLib / Disconnect.c
1 /** @file
2 Main file for Disconnect shell Driver1 function.
3
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
9
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.
12
13 **/
14
15 #include "UefiShellDriver1CommandsLib.h"
16
17 STATIC CONST SHELL_PARAM_ITEM ParamList[] = {
18 {L"-r", TypeFlag},
19 {NULL, TypeMax}
20 };
21
22 EFI_STATUS
23 EFIAPI
24 DisconnectAll(
25 VOID
26 )
27 {
28 //
29 // Stolen from UEFI 2.3 spec (May 2009 version)
30 // Pages 171/172
31 // Removed gBS local definition
32 //
33
34 //
35 // Disconnect All Handles Example
36 // The following example recusively disconnects all drivers from all
37 // controllers in a platform.
38 //
39 EFI_STATUS Status;
40 // EFI_BOOT_SERVICES *gBS;
41 UINTN HandleCount;
42 EFI_HANDLE *HandleBuffer;
43 UINTN HandleIndex;
44 //
45 // Retrieve the list of all handles from the handle database
46 //
47 Status = gBS->LocateHandleBuffer (
48 AllHandles,
49 NULL,
50 NULL,
51 &HandleCount,
52 &HandleBuffer
53 );
54 if (!EFI_ERROR (Status)) {
55 for (HandleIndex = 0; HandleIndex < HandleCount; HandleIndex++) {
56 Status = gBS->DisconnectController (
57 HandleBuffer[HandleIndex],
58 NULL,
59 NULL
60 );
61 }
62 gBS->FreePool(HandleBuffer);
63 //
64 // end of stealing
65 //
66 }
67 return (EFI_SUCCESS);
68 }
69
70 SHELL_STATUS
71 EFIAPI
72 ShellCommandRunDisconnect (
73 IN EFI_HANDLE ImageHandle,
74 IN EFI_SYSTEM_TABLE *SystemTable
75 )
76 {
77 EFI_STATUS Status;
78 LIST_ENTRY *Package;
79 CHAR16 *ProblemParam;
80 SHELL_STATUS ShellStatus;
81 CONST CHAR16 *Param1;
82 CONST CHAR16 *Param2;
83 CONST CHAR16 *Param3;
84 EFI_HANDLE Handle1;
85 EFI_HANDLE Handle2;
86 EFI_HANDLE Handle3;
87
88 ShellStatus = SHELL_SUCCESS;
89
90 //
91 // initialize the shell lib (we must be in non-auto-init...)
92 //
93 Status = ShellInitialize();
94 ASSERT_EFI_ERROR(Status);
95
96 Status = CommandInit();
97 ASSERT_EFI_ERROR(Status);
98
99 //
100 // parse the command line
101 //
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;
108 } else {
109 ASSERT(FALSE);
110 }
111 } else {
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;
119 } else {
120 Status = DisconnectAll();
121 }
122 } else {
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;
129 } else {
130 //
131 // must have between 1 and 3 handles passed in ...
132 //
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;
139
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;
157 } else {
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);
163 }
164 }
165 }
166 }
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;
174 }
175 }
176 return (ShellStatus);
177 }