]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ShellPkg/Library/UefiShellDriver1CommandsLib/Unload.c
Adding Driver1 profile commands to the UEFI Shell 2.0.
[mirror_edk2.git] / ShellPkg / Library / UefiShellDriver1CommandsLib / Unload.c
diff --git a/ShellPkg/Library/UefiShellDriver1CommandsLib/Unload.c b/ShellPkg/Library/UefiShellDriver1CommandsLib/Unload.c
new file mode 100644 (file)
index 0000000..239ac4a
--- /dev/null
@@ -0,0 +1,220 @@
+/** @file\r
+  Main file for Unload shell Driver1 function.\r
+\r
+  Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>\r
+  This program and the accompanying materials\r
+  are licensed and made available under the terms and conditions of the BSD License\r
+  which accompanies this distribution.  The full text of the license may be found at\r
+  http://opensource.org/licenses/bsd-license.php\r
+\r
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include "UefiShellDriver1CommandsLib.h"\r
+\r
+/**\r
+  Function to translate the EFI_MEMORY_TYPE into a string.\r
+\r
+  @param[in] Memory     The memory type.\r
+\r
+  @retval               A string representation of the type allocated from BS Pool.\r
+**/\r
+CHAR16*\r
+EFIAPI\r
+ConvertMemoryType (\r
+  IN CONST EFI_MEMORY_TYPE Memory\r
+  )\r
+{\r
+  CHAR16 *RetVal;\r
+  RetVal = NULL;\r
+\r
+  switch (Memory) {\r
+  case EfiReservedMemoryType:       StrnCatGrow(&RetVal, NULL, L"EfiReservedMemoryType", 0);        break;\r
+  case EfiLoaderCode:               StrnCatGrow(&RetVal, NULL, L"EfiLoaderCode", 0);                break;\r
+  case EfiLoaderData:               StrnCatGrow(&RetVal, NULL, L"EfiLoaderData", 0);                break;\r
+  case EfiBootServicesCode:         StrnCatGrow(&RetVal, NULL, L"EfiBootServicesCode", 0);          break;\r
+  case EfiBootServicesData:         StrnCatGrow(&RetVal, NULL, L"EfiBootServicesData", 0);          break;\r
+  case EfiRuntimeServicesCode:      StrnCatGrow(&RetVal, NULL, L"EfiRuntimeServicesCode", 0);       break;\r
+  case EfiRuntimeServicesData:      StrnCatGrow(&RetVal, NULL, L"EfiRuntimeServicesData", 0);       break;\r
+  case EfiConventionalMemory:       StrnCatGrow(&RetVal, NULL, L"EfiConventionalMemory", 0);        break;\r
+  case EfiUnusableMemory:           StrnCatGrow(&RetVal, NULL, L"EfiUnusableMemory", 0);            break;\r
+  case EfiACPIReclaimMemory:        StrnCatGrow(&RetVal, NULL, L"EfiACPIReclaimMemory", 0);         break;\r
+  case EfiACPIMemoryNVS:            StrnCatGrow(&RetVal, NULL, L"EfiACPIMemoryNVS", 0);             break;\r
+  case EfiMemoryMappedIO:           StrnCatGrow(&RetVal, NULL, L"EfiMemoryMappedIO", 0);            break;\r
+  case EfiMemoryMappedIOPortSpace:  StrnCatGrow(&RetVal, NULL, L"EfiMemoryMappedIOPortSpace", 0);   break;\r
+  case EfiPalCode:                  StrnCatGrow(&RetVal, NULL, L"EfiPalCode", 0);                   break;\r
+  case EfiMaxMemoryType:            StrnCatGrow(&RetVal, NULL, L"EfiMaxMemoryType", 0);             break;\r
+  default: ASSERT(FALSE);\r
+  }\r
+  return (RetVal);\r
+}\r
+\r
+/**\r
+  Function to dump LoadedImage info from TheHandle.\r
+\r
+  @param[in] TheHandle              The handle to dump info from.\r
+\r
+  @retval EFI_SUCCESS               The info was dumped.\r
+  @retval EFI_INVALID_PARAMETER     The handle did not have LoadedImage\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+DumpLoadedImageProtocolInfo (\r
+  IN EFI_HANDLE   TheHandle\r
+  )\r
+{\r
+  EFI_LOADED_IMAGE_PROTOCOL         *Image;\r
+  EFI_STATUS                        Status;\r
+  EFI_DEVICE_PATH_TO_TEXT_PROTOCOL  *DevicePathToText;\r
+  CHAR16                            *DevicePathText;\r
+  CHAR16                            *CodeTypeText;\r
+  CHAR16                            *DataTypeText;\r
+  CHAR8                             *PdbPointer;\r
+\r
+  Image = NULL;\r
+\r
+  Status = gBS->OpenProtocol(TheHandle, &gEfiLoadedImageProtocolGuid, (VOID**)&Image, gImageHandle, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL);\r
+  if (EFI_ERROR(Status)) {\r
+    return (EFI_INVALID_PARAMETER);\r
+  }\r
+\r
+  Status = gBS->LocateProtocol(\r
+    &gEfiDevicePathToTextProtocolGuid,\r
+    NULL,\r
+    (VOID**)&DevicePathToText);\r
+  //\r
+  // we now have the device path to text protocol\r
+  //\r
+  if (!EFI_ERROR(Status)) {\r
+    DevicePathText = DevicePathToText->ConvertDevicePathToText(Image->FilePath, TRUE, TRUE);\r
+  } else {\r
+    DevicePathText = NULL;\r
+  }\r
+\r
+  CodeTypeText = ConvertMemoryType(Image->ImageCodeType);\r
+  DataTypeText = ConvertMemoryType(Image->ImageDataType);\r
+  PdbPointer = (CHAR8*)PeCoffLoaderGetPdbPointer(Image->ImageBase);\r
+  ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_UNLOAD_VERBOSE), gShellDriver1HiiHandle,\r
+    ConvertHandleToHandleIndex(TheHandle),\r
+    TheHandle,\r
+    Image,\r
+    Image->ParentHandle,\r
+    Image->SystemTable,\r
+    Image->DeviceHandle,\r
+    DevicePathText,\r
+    PdbPointer,\r
+    Image->ImageBase,\r
+    Image->ImageSize,\r
+    CodeTypeText,\r
+    DataTypeText\r
+    );\r
+\r
+  SHELL_FREE_NON_NULL(DevicePathText);\r
+  SHELL_FREE_NON_NULL(CodeTypeText);\r
+  SHELL_FREE_NON_NULL(DataTypeText);\r
+\r
+  return (EFI_SUCCESS);\r
+}\r
+\r
+STATIC CONST SHELL_PARAM_ITEM ParamList[] = {\r
+  {L"-n", TypeFlag},\r
+  {L"-v", TypeFlag},\r
+  {L"-verbose", TypeFlag},\r
+  {NULL, TypeMax}\r
+  };\r
+\r
+/**\r
+  Function for 'unload' command.\r
+\r
+  @param[in] ImageHandle  Handle to the Image (NULL if Internal).\r
+  @param[in] SystemTable  Pointer to the System Table (NULL if Internal).\r
+**/\r
+SHELL_STATUS\r
+EFIAPI\r
+ShellCommandRunUnload (\r
+  IN EFI_HANDLE        ImageHandle,\r
+  IN EFI_SYSTEM_TABLE  *SystemTable\r
+  )\r
+{\r
+  EFI_STATUS            Status;\r
+  LIST_ENTRY            *Package;\r
+  CHAR16                *ProblemParam;\r
+  SHELL_STATUS          ShellStatus;\r
+  EFI_HANDLE            TheHandle;\r
+  CONST CHAR16          *Param1;\r
+  SHELL_PROMPT_RESPONSE *Resp;\r
+\r
+  ShellStatus         = SHELL_SUCCESS;\r
+  Package             = NULL;\r
+  Resp                = NULL;\r
+\r
+  //\r
+  // initialize the shell lib (we must be in non-auto-init...)\r
+  //\r
+  Status = ShellInitialize();\r
+  ASSERT_EFI_ERROR(Status);\r
+\r
+  //\r
+  // parse the command line\r
+  //\r
+  Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);\r
+  if (EFI_ERROR(Status)) {\r
+    if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
+      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, ProblemParam);\r
+      FreePool(ProblemParam);\r
+      ShellStatus = SHELL_INVALID_PARAMETER;\r
+    } else {\r
+      ASSERT(FALSE);\r
+    }\r
+  } else {\r
+    if (ShellCommandLineGetCount(Package) > 2){\r
+      //\r
+      // error for too many parameters\r
+      //\r
+      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle);\r
+      ShellStatus = SHELL_INVALID_PARAMETER;\r
+    } else if (ShellCommandLineGetCount(Package) < 2) {\r
+      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDriver1HiiHandle);\r
+      ShellStatus = SHELL_INVALID_PARAMETER;\r
+    } else {\r
+      Param1 = ShellCommandLineGetRawValue(Package, 1);\r
+      if (Param1 == NULL || ConvertHandleIndexToHandle(StrHexToUintn(Param1)) == NULL){\r
+        ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, Param1);\r
+        ShellStatus = SHELL_INVALID_PARAMETER;\r
+      } else {\r
+        TheHandle = ConvertHandleIndexToHandle(StrHexToUintn(Param1));\r
+        ASSERT(TheHandle != NULL);\r
+        if (ShellCommandLineGetFlag(Package, L"-v") || ShellCommandLineGetFlag(Package, L"-verbose")) {\r
+          DumpLoadedImageProtocolInfo(TheHandle);\r
+        }\r
+        \r
+        if (!ShellCommandLineGetFlag(Package, L"-n")) {\r
+          Status = ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN(STR_UNLOAD_CONF), gShellDriver1HiiHandle, StrHexToUintn(Param1));\r
+          Status = ShellPromptForResponse(ShellPromptResponseTypeYesNo, NULL, (VOID**)&Resp);\r
+        }\r
+        if (ShellCommandLineGetFlag(Package, L"-n") || (Resp != NULL && *Resp == ShellPromptResponseYes)) {\r
+          Status = gBS->UnloadImage(TheHandle);\r
+          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_HANDLE_RESULT), gShellDriver1HiiHandle, L"Unload", StrHexToUintn(Param1), Status);\r
+        }\r
+        SHELL_FREE_NON_NULL(Resp);\r
+      }\r
+    }\r
+  }\r
+  if (ShellStatus == SHELL_SUCCESS) {\r
+    if (Status == EFI_SECURITY_VIOLATION) {\r
+      ShellStatus = SHELL_SECURITY_VIOLATION;\r
+    } else if (Status == EFI_INVALID_PARAMETER) {\r
+      ShellStatus = SHELL_INVALID_PARAMETER;\r
+    } else if (EFI_ERROR(Status)) {\r
+      ShellStatus = SHELL_NOT_FOUND;\r
+    }\r
+  }\r
+\r
+  if (Package != NULL) {\r
+    ShellCommandLineFreeVarList(Package);\r
+  }\r
+\r
+  return (ShellStatus);\r
+}\r