+++ /dev/null
-/** @file\r
- Main file for OpenInfo 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
-EFI_STATUS\r
-EFIAPI\r
-TraverseHandleDatabase (\r
- IN CONST EFI_HANDLE DriverBindingHandle OPTIONAL,\r
- IN CONST EFI_HANDLE ControllerHandle OPTIONAL,\r
- IN UINTN *HandleCount,\r
- OUT EFI_HANDLE **HandleBuffer,\r
- OUT UINTN **HandleType\r
- ){\r
- EFI_STATUS Status;\r
- UINTN HandleIndex;\r
- EFI_GUID **ProtocolGuidArray;\r
- UINTN ArrayCount;\r
- UINTN ProtocolIndex;\r
- EFI_OPEN_PROTOCOL_INFORMATION_ENTRY *OpenInfo;\r
- UINTN OpenInfoCount;\r
- UINTN OpenInfoIndex;\r
- UINTN ChildIndex;\r
-\r
- ASSERT(HandleCount != NULL);\r
- ASSERT(HandleBuffer != NULL);\r
- ASSERT(HandleType != NULL);\r
- ASSERT(DriverBindingHandle != NULL || ControllerHandle != NULL);\r
-\r
- *HandleCount = 0;\r
- *HandleBuffer = NULL;\r
- *HandleType = NULL;\r
-\r
- //\r
- // Retrieve the list of all handles from the handle database\r
- //\r
- Status = gBS->LocateHandleBuffer (\r
- AllHandles,\r
- NULL,\r
- NULL,\r
- HandleCount,\r
- HandleBuffer\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return (Status);\r
- }\r
-\r
- *HandleType = AllocateZeroPool (*HandleCount * sizeof (UINTN));\r
- ASSERT(*HandleType != NULL);\r
-\r
- for (HandleIndex = 0; HandleIndex < *HandleCount; HandleIndex++) {\r
- //\r
- // Retrieve the list of all the protocols on each handle\r
- //\r
- Status = gBS->ProtocolsPerHandle (\r
- (*HandleBuffer)[HandleIndex],\r
- &ProtocolGuidArray,\r
- &ArrayCount\r
- );\r
- if (!EFI_ERROR (Status)) {\r
-\r
- for (ProtocolIndex = 0; ProtocolIndex < ArrayCount; ProtocolIndex++) {\r
-\r
- //\r
- // Set the bit describing what this handle has\r
- //\r
- if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiLoadedImageProtocolGuid) != FALSE) {\r
- (*HandleType)[HandleIndex] |= HANDLE_RELATIONSHIP_IMAGE_HANDLE;\r
- } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDriverBindingProtocolGuid) != FALSE) {\r
- (*HandleType)[HandleIndex] |= HANDLE_RELATIONSHIP_DRIVER_BINDING_HANDLE;\r
- } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDriverConfiguration2ProtocolGuid) != FALSE) {\r
- (*HandleType)[HandleIndex] |= HANDLE_RELATIONSHIP_DRIVER_CONFIGURATION_HANDLE;\r
- } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDriverConfigurationProtocolGuid) != FALSE) {\r
- (*HandleType)[HandleIndex] |= HANDLE_RELATIONSHIP_DRIVER_CONFIGURATION_HANDLE;\r
- } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDriverDiagnostics2ProtocolGuid) != FALSE) {\r
- (*HandleType)[HandleIndex] |= HANDLE_RELATIONSHIP_DRIVER_DIAGNOSTICS_HANDLE;\r
- } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDriverDiagnosticsProtocolGuid) != FALSE) {\r
- (*HandleType)[HandleIndex] |= HANDLE_RELATIONSHIP_DRIVER_DIAGNOSTICS_HANDLE;\r
- } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiComponentName2ProtocolGuid) != FALSE) {\r
- (*HandleType)[HandleIndex] |= HANDLE_RELATIONSHIP_COMPONENT_NAME_HANDLE;\r
- } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiComponentNameProtocolGuid) != FALSE) {\r
- (*HandleType)[HandleIndex] |= HANDLE_RELATIONSHIP_COMPONENT_NAME_HANDLE;\r
- } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDevicePathProtocolGuid) != FALSE) {\r
- (*HandleType)[HandleIndex] |= HANDLE_RELATIONSHIP_DEVICE_HANDLE;\r
- } else {\r
- DEBUG_CODE_BEGIN();\r
- ASSERT((*HandleType)[HandleIndex] == (*HandleType)[HandleIndex]);\r
- DEBUG_CODE_END();\r
- }\r
- //\r
- // Retrieve the list of agents that have opened each protocol\r
- //\r
- Status = gBS->OpenProtocolInformation (\r
- (*HandleBuffer)[HandleIndex],\r
- ProtocolGuidArray[ProtocolIndex],\r
- &OpenInfo,\r
- &OpenInfoCount\r
- );\r
- if (!EFI_ERROR (Status)) {\r
- for (OpenInfoIndex = 0; OpenInfoIndex < OpenInfoCount; OpenInfoIndex++) {\r
- if (DriverBindingHandle != NULL && OpenInfo[OpenInfoIndex].AgentHandle == DriverBindingHandle) {\r
- if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_DRIVER) == EFI_OPEN_PROTOCOL_BY_DRIVER) {\r
- //\r
- // Mark the device handle as being managed by the driver specified by DriverBindingHandle\r
- //\r
- (*HandleType)[HandleIndex] |= (HANDLE_RELATIONSHIP_DEVICE_HANDLE | HANDLE_RELATIONSHIP_CONTROLLER_HANDLE);\r
- }\r
- if (ControllerHandle != NULL && (*HandleBuffer)[HandleIndex] == ControllerHandle) {\r
- if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) == EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) {\r
- for (ChildIndex = 0; ChildIndex < *HandleCount; ChildIndex++) {\r
- if ((*HandleBuffer)[ChildIndex] == OpenInfo[OpenInfoIndex].ControllerHandle) {\r
- (*HandleType)[ChildIndex] |= (HANDLE_RELATIONSHIP_DEVICE_HANDLE | HANDLE_RELATIONSHIP_CHILD_HANDLE);\r
- }\r
- }\r
- }\r
- }\r
- } else if (DriverBindingHandle == NULL && OpenInfo[OpenInfoIndex].ControllerHandle == ControllerHandle) {\r
- if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_DRIVER) == EFI_OPEN_PROTOCOL_BY_DRIVER) {\r
- for (ChildIndex = 0; ChildIndex < *HandleCount; ChildIndex++) {\r
- if ((*HandleBuffer)[ChildIndex] == OpenInfo[OpenInfoIndex].AgentHandle) {\r
- //\r
- // mark the handle who opened this as a device driver\r
- //\r
- (*HandleType)[ChildIndex] |= HANDLE_RELATIONSHIP_DEVICE_DRIVER;\r
- }\r
- }\r
- }\r
- if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) == EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) {\r
- //\r
- // this handle has people opening by child so it must be a parent\r
- //\r
- (*HandleType)[HandleIndex] |= HANDLE_RELATIONSHIP_PARENT_HANDLE;\r
- for (ChildIndex = 0; ChildIndex < *HandleCount; ChildIndex++) {\r
- if ((*HandleBuffer)[ChildIndex] == OpenInfo[OpenInfoIndex].AgentHandle) {\r
- (*HandleType)[ChildIndex] |= HANDLE_RELATIONSHIP_BUS_DRIVER;\r
- }\r
- }\r
- }\r
- }\r
- }\r
-\r
- FreePool (OpenInfo);\r
- }\r
- }\r
-\r
- FreePool (ProtocolGuidArray);\r
- }\r
- }\r
-\r
- if (EFI_ERROR(Status)) {\r
- if (*HandleType != NULL) {\r
- FreePool (*HandleType);\r
- }\r
- if (*HandleBuffer != NULL) {\r
- FreePool (*HandleBuffer);\r
- }\r
-\r
- *HandleCount = 0;\r
- *HandleBuffer = NULL;\r
- *HandleType = NULL;\r
- }\r
-\r
- return Status;\r
-}\r
-\r
-\r
-SHELL_STATUS\r
-EFIAPI\r
-ShellCommandRunOpenInfo (\r
- VOID *RESERVED\r
- ) {\r
- EFI_STATUS Status;\r
- LIST_ENTRY *Package;\r
- CHAR16 *ProblemParam;\r
- SHELL_STATUS ShellStatus;\r
- EFI_HANDLE theHandle;\r
- EFI_HANDLE *HandleList;\r
- UINTN Count;\r
- UINTN *Type;\r
-\r
- ShellStatus = SHELL_SUCCESS;\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
- Status = CommandInit();\r
- ASSERT_EFI_ERROR(Status);\r
-\r
- //\r
- // parse the command line\r
- //\r
- Status = ShellCommandLineParse (EmptyParamList, &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() > 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() == 0) {\r
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDriver1HiiHandle);\r
- ShellStatus = SHELL_INVALID_PARAMETER;\r
- } else {\r
- if (ShellCommandLineGetRawValue(Package, 1) != NULL && CommandLibGetHandleValue(StrHexToUintn(ShellCommandLineGetRawValue(Package, 1))) == NULL){\r
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, ShellCommandLineGetRawValue(Package, 1));\r
- ShellStatus = SHELL_INVALID_PARAMETER;\r
- } else {\r
- theHandle = CommandLibGetHandleValue(StrHexToUintn(ShellCommandLineGetRawValue(Package, 1)));\r
- ASSERT(theHandle != NULL);\r
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_OPENINFO_HEADER_LINE), gShellDriver1HiiHandle, StrHexToUintn(ShellCommandLineGetRawValue(Package, 1)), theHandle);\r
- Status = TraverseHandleDatabase (NULL, theHandle, &Count, &HandleList, &Type);\r
- if (EFI_ERROR(Status) == FALSE && Count > 0) {\r
- } else {\r
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, ShellCommandLineGetRawValue(Package, 1));\r
- ShellStatus = SHELL_NOT_FOUND;\r
- }\r
- }\r
- }\r
- }\r
- return (ShellStatus);\r
-}\r