]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellDriver1CommandsLib/Unload.c
ShellPkg: Move a function into shared location
[mirror_edk2.git] / ShellPkg / Library / UefiShellDriver1CommandsLib / Unload.c
CommitLineData
4ba49616 1/** @file\r
2 Main file for Unload shell Driver1 function.\r
3\r
863986b3 4 Copyright (c) 2010 - 2013, Intel Corporation. All rights reserved.<BR>\r
4ba49616 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
4ba49616 17/**\r
18 Function to dump LoadedImage info from TheHandle.\r
19\r
20 @param[in] TheHandle The handle to dump info from.\r
21\r
22 @retval EFI_SUCCESS The info was dumped.\r
23 @retval EFI_INVALID_PARAMETER The handle did not have LoadedImage\r
24**/\r
25EFI_STATUS\r
26EFIAPI\r
27DumpLoadedImageProtocolInfo (\r
28 IN EFI_HANDLE TheHandle\r
29 )\r
30{\r
31 EFI_LOADED_IMAGE_PROTOCOL *Image;\r
32 EFI_STATUS Status;\r
4ba49616 33 CHAR16 *DevicePathText;\r
34 CHAR16 *CodeTypeText;\r
35 CHAR16 *DataTypeText;\r
36 CHAR8 *PdbPointer;\r
37\r
38 Image = NULL;\r
39\r
40 Status = gBS->OpenProtocol(TheHandle, &gEfiLoadedImageProtocolGuid, (VOID**)&Image, gImageHandle, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL);\r
41 if (EFI_ERROR(Status)) {\r
42 return (EFI_INVALID_PARAMETER);\r
43 }\r
863986b3
RN
44 DevicePathText = ConvertDevicePathToText(Image->FilePath, TRUE, TRUE);\r
45 CodeTypeText = ConvertMemoryType(Image->ImageCodeType);\r
46 DataTypeText = ConvertMemoryType(Image->ImageDataType);\r
47 PdbPointer = (CHAR8*)PeCoffLoaderGetPdbPointer(Image->ImageBase);\r
4ba49616 48 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_UNLOAD_VERBOSE), gShellDriver1HiiHandle,\r
49 ConvertHandleToHandleIndex(TheHandle),\r
50 TheHandle,\r
51 Image,\r
52 Image->ParentHandle,\r
53 Image->SystemTable,\r
54 Image->DeviceHandle,\r
55 DevicePathText,\r
56 PdbPointer,\r
57 Image->ImageBase,\r
58 Image->ImageSize,\r
59 CodeTypeText,\r
60 DataTypeText\r
61 );\r
62\r
63 SHELL_FREE_NON_NULL(DevicePathText);\r
64 SHELL_FREE_NON_NULL(CodeTypeText);\r
65 SHELL_FREE_NON_NULL(DataTypeText);\r
66\r
67 return (EFI_SUCCESS);\r
68}\r
69\r
70STATIC CONST SHELL_PARAM_ITEM ParamList[] = {\r
71 {L"-n", TypeFlag},\r
72 {L"-v", TypeFlag},\r
73 {L"-verbose", TypeFlag},\r
74 {NULL, TypeMax}\r
75 };\r
76\r
77/**\r
78 Function for 'unload' command.\r
79\r
80 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
81 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
82**/\r
83SHELL_STATUS\r
84EFIAPI\r
85ShellCommandRunUnload (\r
86 IN EFI_HANDLE ImageHandle,\r
87 IN EFI_SYSTEM_TABLE *SystemTable\r
88 )\r
89{\r
90 EFI_STATUS Status;\r
91 LIST_ENTRY *Package;\r
92 CHAR16 *ProblemParam;\r
93 SHELL_STATUS ShellStatus;\r
94 EFI_HANDLE TheHandle;\r
95 CONST CHAR16 *Param1;\r
96 SHELL_PROMPT_RESPONSE *Resp;\r
361a8267 97 UINT64 Value;\r
4ba49616 98\r
99 ShellStatus = SHELL_SUCCESS;\r
100 Package = NULL;\r
101 Resp = NULL;\r
361a8267 102 Value = 0;\r
103 TheHandle = NULL;\r
4ba49616 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 //\r
112 // parse the command line\r
113 //\r
114 Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);\r
115 if (EFI_ERROR(Status)) {\r
116 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
117 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, ProblemParam);\r
118 FreePool(ProblemParam);\r
119 ShellStatus = SHELL_INVALID_PARAMETER;\r
120 } else {\r
121 ASSERT(FALSE);\r
122 }\r
123 } else {\r
124 if (ShellCommandLineGetCount(Package) > 2){\r
125 //\r
126 // error for too many parameters\r
127 //\r
128 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle);\r
129 ShellStatus = SHELL_INVALID_PARAMETER;\r
130 } else if (ShellCommandLineGetCount(Package) < 2) {\r
131 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDriver1HiiHandle);\r
132 ShellStatus = SHELL_INVALID_PARAMETER;\r
133 } else {\r
361a8267 134 Param1 = ShellCommandLineGetRawValue(Package, 1);\r
135 if (Param1 != NULL) {\r
136 Status = ShellConvertStringToUint64(Param1, &Value, TRUE, FALSE);\r
137 TheHandle = ConvertHandleIndexToHandle((UINTN)Value);\r
138 }\r
139\r
140 if (EFI_ERROR(Status) || Param1 == NULL || TheHandle == NULL){\r
4ba49616 141 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, Param1);\r
142 ShellStatus = SHELL_INVALID_PARAMETER;\r
143 } else {\r
4ba49616 144 ASSERT(TheHandle != NULL);\r
145 if (ShellCommandLineGetFlag(Package, L"-v") || ShellCommandLineGetFlag(Package, L"-verbose")) {\r
146 DumpLoadedImageProtocolInfo(TheHandle);\r
147 }\r
148 \r
149 if (!ShellCommandLineGetFlag(Package, L"-n")) {\r
361a8267 150 Status = ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN(STR_UNLOAD_CONF), gShellDriver1HiiHandle, (UINTN)TheHandle);\r
4ba49616 151 Status = ShellPromptForResponse(ShellPromptResponseTypeYesNo, NULL, (VOID**)&Resp);\r
152 }\r
153 if (ShellCommandLineGetFlag(Package, L"-n") || (Resp != NULL && *Resp == ShellPromptResponseYes)) {\r
154 Status = gBS->UnloadImage(TheHandle);\r
361a8267 155 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_HANDLE_RESULT), gShellDriver1HiiHandle, L"Unload", (UINTN)TheHandle, Status);\r
4ba49616 156 }\r
157 SHELL_FREE_NON_NULL(Resp);\r
158 }\r
159 }\r
160 }\r
161 if (ShellStatus == SHELL_SUCCESS) {\r
162 if (Status == EFI_SECURITY_VIOLATION) {\r
163 ShellStatus = SHELL_SECURITY_VIOLATION;\r
164 } else if (Status == EFI_INVALID_PARAMETER) {\r
165 ShellStatus = SHELL_INVALID_PARAMETER;\r
166 } else if (EFI_ERROR(Status)) {\r
167 ShellStatus = SHELL_NOT_FOUND;\r
168 }\r
169 }\r
170\r
171 if (Package != NULL) {\r
172 ShellCommandLineFreeVarList(Package);\r
173 }\r
174\r
175 return (ShellStatus);\r
176}\r