blob: 0d48f9d5d7546e7d14b440b62afd1825b2673202 [file] [log] [blame]
Vishal Bhoj82c80712015-12-15 21:13:33 +05301/** @file
2 Main file for Unload shell Driver1 function.
3
4 (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR>
5 Copyright (c) 2010 - 2014, Intel Corporation. All rights reserved.<BR>
6 This program and the accompanying materials
7 are licensed and made available under the terms and conditions of the BSD License
8 which accompanies this distribution. The full text of the license may be found at
9 http://opensource.org/licenses/bsd-license.php
10
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13
14**/
15
16#include "UefiShellDriver1CommandsLib.h"
17
18/**
19 Function to dump LoadedImage info from TheHandle.
20
21 @param[in] TheHandle The handle to dump info from.
22
23 @retval EFI_SUCCESS The info was dumped.
24 @retval EFI_INVALID_PARAMETER The handle did not have LoadedImage
25**/
26EFI_STATUS
27EFIAPI
28DumpLoadedImageProtocolInfo (
29 IN EFI_HANDLE TheHandle
30 )
31{
32 CHAR16 *TheString;
33
34 TheString = GetProtocolInformationDump(TheHandle, &gEfiLoadedImageProtocolGuid, TRUE);
35
36 ShellPrintEx(-1, -1, L"%s", TheString);
37
38 SHELL_FREE_NON_NULL(TheString);
39
40 return (EFI_SUCCESS);
41}
42
43STATIC CONST SHELL_PARAM_ITEM ParamList[] = {
44 {L"-n", TypeFlag},
45 {L"-v", TypeFlag},
46 {L"-verbose", TypeFlag},
47 {NULL, TypeMax}
48 };
49
50/**
51 Function for 'unload' command.
52
53 @param[in] ImageHandle Handle to the Image (NULL if Internal).
54 @param[in] SystemTable Pointer to the System Table (NULL if Internal).
55**/
56SHELL_STATUS
57EFIAPI
58ShellCommandRunUnload (
59 IN EFI_HANDLE ImageHandle,
60 IN EFI_SYSTEM_TABLE *SystemTable
61 )
62{
63 EFI_STATUS Status;
64 LIST_ENTRY *Package;
65 CHAR16 *ProblemParam;
66 SHELL_STATUS ShellStatus;
67 EFI_HANDLE TheHandle;
68 CONST CHAR16 *Param1;
69 SHELL_PROMPT_RESPONSE *Resp;
70 UINT64 Value;
71
72 ShellStatus = SHELL_SUCCESS;
73 Package = NULL;
74 Resp = NULL;
75 Value = 0;
76 TheHandle = NULL;
77
78 //
79 // initialize the shell lib (we must be in non-auto-init...)
80 //
81 Status = ShellInitialize();
82 ASSERT_EFI_ERROR(Status);
83
84 //
85 // parse the command line
86 //
87 Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);
88 if (EFI_ERROR(Status)) {
89 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {
90 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle,L"unload", ProblemParam);
91 FreePool(ProblemParam);
92 ShellStatus = SHELL_INVALID_PARAMETER;
93 } else {
94 ASSERT(FALSE);
95 }
96 } else {
97 if (ShellCommandLineGetCount(Package) > 2){
98 //
99 // error for too many parameters
100 //
101 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle, L"unload");
102 ShellStatus = SHELL_INVALID_PARAMETER;
103 } else if (ShellCommandLineGetCount(Package) < 2) {
104 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDriver1HiiHandle, L"unload");
105 ShellStatus = SHELL_INVALID_PARAMETER;
106 } else {
107 Param1 = ShellCommandLineGetRawValue(Package, 1);
108 if (Param1 != NULL) {
109 Status = ShellConvertStringToUint64(Param1, &Value, TRUE, FALSE);
110 TheHandle = ConvertHandleIndexToHandle((UINTN)Value);
111 }
112
113 if (EFI_ERROR(Status) || Param1 == NULL || TheHandle == NULL){
114 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"unload", Param1);
115 ShellStatus = SHELL_INVALID_PARAMETER;
116 } else {
117 ASSERT(TheHandle != NULL);
118 if (ShellCommandLineGetFlag(Package, L"-v") || ShellCommandLineGetFlag(Package, L"-verbose")) {
119 DumpLoadedImageProtocolInfo(TheHandle);
120 }
121
122 if (!ShellCommandLineGetFlag(Package, L"-n")) {
123 Status = ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN(STR_UNLOAD_CONF), gShellDriver1HiiHandle, (UINTN)TheHandle);
124 Status = ShellPromptForResponse(ShellPromptResponseTypeYesNo, NULL, (VOID**)&Resp);
125 }
126 if (ShellCommandLineGetFlag(Package, L"-n") || (Resp != NULL && *Resp == ShellPromptResponseYes)) {
127 Status = gBS->UnloadImage(TheHandle);
128 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_HANDLE_RESULT), gShellDriver1HiiHandle, L"Unload", (UINTN)TheHandle, Status);
129 }
130 SHELL_FREE_NON_NULL(Resp);
131 }
132 }
133 }
134 if (ShellStatus == SHELL_SUCCESS) {
135 if (Status == EFI_SECURITY_VIOLATION) {
136 ShellStatus = SHELL_SECURITY_VIOLATION;
137 } else if (Status == EFI_INVALID_PARAMETER) {
138 ShellStatus = SHELL_INVALID_PARAMETER;
139 } else if (EFI_ERROR(Status)) {
140 ShellStatus = SHELL_NOT_FOUND;
141 }
142 }
143
144 if (Package != NULL) {
145 ShellCommandLineFreeVarList(Package);
146 }
147
148 return (ShellStatus);
149}