Home | History | Annotate | Download | only in UefiShellDriver1CommandsLib
      1 /** @file
      2   Main file for OpenInfo shell Driver1 function.
      3 
      4   (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR>
      5   Copyright (c) 2010 - 2011, 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 STATIC CONST CHAR16 StringHandProt[]  = L"HandProt ";
     19 STATIC CONST CHAR16 StringGetProt[]   = L"GetProt  ";
     20 STATIC CONST CHAR16 StringTestProt[]  = L"TestProt ";
     21 STATIC CONST CHAR16 StringChild[]     = L"Child    ";
     22 STATIC CONST CHAR16 StringDriver[]    = L"Driver   ";
     23 STATIC CONST CHAR16 StringExclusive[] = L"Exclusive";
     24 STATIC CONST CHAR16 StringDriverEx[]  = L"DriverEx ";
     25 STATIC CONST CHAR16 StringUnknown[]   = L"Unknown  ";
     26 
     27 /**
     28   Open the database and print out all the info about TheHandle.
     29 
     30   @param[in] TheHandle      The handle to print info on.
     31 
     32   @retval EFI_SUCCESS           The operation was successful.
     33   @retval EFI_INVALID_PARAMETER TheHandle was NULL.
     34 **/
     35 EFI_STATUS
     36 EFIAPI
     37 TraverseHandleDatabase (
     38   IN CONST EFI_HANDLE TheHandle
     39   )
     40 {
     41   EFI_STATUS                          Status;
     42   EFI_GUID                            **ProtocolGuidArray;
     43   UINTN                               ArrayCount;
     44   UINTN                               ProtocolIndex;
     45   EFI_OPEN_PROTOCOL_INFORMATION_ENTRY *OpenInfo;
     46   UINTN                               OpenInfoCount;
     47   UINTN                               OpenInfoIndex;
     48   CONST CHAR16                        *OpenTypeString;
     49   CHAR16                              *TempString;
     50   UINTN                               HandleIndex;
     51   CONST CHAR16                        *Name;
     52   UINTN                               ControllerIndex;
     53 
     54   if (TheHandle == NULL) {
     55     return (EFI_INVALID_PARAMETER);
     56   }
     57 
     58   //
     59   // Retrieve the list of all the protocols on the handle
     60   //
     61   Status = gBS->ProtocolsPerHandle (
     62                 TheHandle,
     63                 &ProtocolGuidArray,
     64                 &ArrayCount
     65                );
     66   ASSERT_EFI_ERROR(Status);
     67   if (!EFI_ERROR (Status)) {
     68 
     69     for (ProtocolIndex = 0; ProtocolIndex < ArrayCount; ProtocolIndex++) {
     70       //
     71       // print out the human readable name for this one.
     72       //
     73       TempString = GetStringNameFromGuid(ProtocolGuidArray[ProtocolIndex], NULL);
     74       if (TempString == NULL) {
     75         continue;
     76       }
     77       ShellPrintEx(-1, -1, L"%H%s%N\r\n", TempString);
     78       FreePool(TempString);
     79 
     80       //
     81       // Retrieve the list of agents that have opened each protocol
     82       //
     83       Status = gBS->OpenProtocolInformation (
     84                     TheHandle,
     85                     ProtocolGuidArray[ProtocolIndex],
     86                     &OpenInfo,
     87                     &OpenInfoCount
     88                    );
     89       ASSERT_EFI_ERROR(Status);
     90       if (!EFI_ERROR (Status)) {
     91         for (OpenInfoIndex = 0; OpenInfoIndex < OpenInfoCount; OpenInfoIndex++) {
     92           switch (OpenInfo[OpenInfoIndex].Attributes) {
     93             case EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL:  OpenTypeString = StringHandProt;  break;
     94             case EFI_OPEN_PROTOCOL_GET_PROTOCOL:        OpenTypeString = StringGetProt;   break;
     95             case EFI_OPEN_PROTOCOL_TEST_PROTOCOL:       OpenTypeString = StringTestProt;  break;
     96             case EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER: OpenTypeString = StringChild;     break;
     97             case EFI_OPEN_PROTOCOL_BY_DRIVER:           OpenTypeString = StringDriver;    break;
     98             case EFI_OPEN_PROTOCOL_EXCLUSIVE:           OpenTypeString = StringExclusive; break;
     99             case EFI_OPEN_PROTOCOL_BY_DRIVER|EFI_OPEN_PROTOCOL_EXCLUSIVE:
    100                                                         OpenTypeString = StringDriverEx;  break;
    101             default:                                    OpenTypeString = StringUnknown;   break;
    102           }
    103           HandleIndex     = ConvertHandleToHandleIndex(OpenInfo[OpenInfoIndex].AgentHandle);
    104           Name            = GetStringNameFromHandle(OpenInfo[OpenInfoIndex].AgentHandle, NULL);
    105           ControllerIndex = ConvertHandleToHandleIndex(OpenInfo[OpenInfoIndex].ControllerHandle);
    106           if (ControllerIndex != 0) {
    107             ShellPrintHiiEx(
    108               -1,
    109               -1,
    110               NULL,
    111               STRING_TOKEN(STR_OPENINFO_LINE),
    112               gShellDriver1HiiHandle,
    113               HandleIndex,
    114               ControllerIndex,
    115               OpenInfo[OpenInfoIndex].OpenCount,
    116               OpenTypeString,
    117               Name
    118              );
    119           } else {
    120             ShellPrintHiiEx(
    121               -1,
    122               -1,
    123               NULL,
    124               STRING_TOKEN(STR_OPENINFO_MIN_LINE),
    125               gShellDriver1HiiHandle,
    126               HandleIndex,
    127               OpenInfo[OpenInfoIndex].OpenCount,
    128               OpenTypeString,
    129               Name
    130              );
    131           }
    132         }
    133         FreePool (OpenInfo);
    134       }
    135     }
    136     FreePool (ProtocolGuidArray);
    137   }
    138 
    139   return Status;
    140 }
    141 
    142 /**
    143   Function for 'openinfo' command.
    144 
    145   @param[in] ImageHandle  Handle to the Image (NULL if Internal).
    146   @param[in] SystemTable  Pointer to the System Table (NULL if Internal).
    147 **/
    148 SHELL_STATUS
    149 EFIAPI
    150 ShellCommandRunOpenInfo (
    151   IN EFI_HANDLE        ImageHandle,
    152   IN EFI_SYSTEM_TABLE  *SystemTable
    153   )
    154 {
    155   EFI_STATUS          Status;
    156   LIST_ENTRY          *Package;
    157   CHAR16              *ProblemParam;
    158   SHELL_STATUS        ShellStatus;
    159   EFI_HANDLE          TheHandle;
    160   CONST CHAR16        *Param1;
    161   UINT64              Intermediate;
    162 
    163   ShellStatus         = SHELL_SUCCESS;
    164 
    165   //
    166   // initialize the shell lib (we must be in non-auto-init...)
    167   //
    168   Status = ShellInitialize();
    169   ASSERT_EFI_ERROR(Status);
    170 
    171   Status = CommandInit();
    172   ASSERT_EFI_ERROR(Status);
    173 
    174   //
    175   // parse the command line
    176   //
    177   Status = ShellCommandLineParse (EmptyParamList, &Package, &ProblemParam, TRUE);
    178   if (EFI_ERROR(Status)) {
    179     if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {
    180       ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, L"openinfo", ProblemParam);
    181       FreePool(ProblemParam);
    182       ShellStatus = SHELL_INVALID_PARAMETER;
    183     } else {
    184       ASSERT(FALSE);
    185     }
    186   } else {
    187     if (ShellCommandLineGetCount(Package) > 2){
    188       //
    189       // error for too many parameters
    190       //
    191       ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle, L"openinfo");
    192       ShellStatus = SHELL_INVALID_PARAMETER;
    193     } else if (ShellCommandLineGetCount(Package) == 0) {
    194       ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDriver1HiiHandle, L"openinfo");
    195       ShellStatus = SHELL_INVALID_PARAMETER;
    196     } else {
    197       Param1 = ShellCommandLineGetRawValue(Package, 1);
    198       Status = ShellConvertStringToUint64(Param1, &Intermediate, TRUE, FALSE);
    199       if (EFI_ERROR(Status) || Param1 == NULL || ConvertHandleIndexToHandle((UINTN)Intermediate) == NULL){
    200         ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"openinfo", Param1);
    201         ShellStatus = SHELL_INVALID_PARAMETER;
    202       } else {
    203         TheHandle = ConvertHandleIndexToHandle((UINTN)Intermediate);
    204         ASSERT(TheHandle != NULL);
    205         ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_OPENINFO_HEADER_LINE), gShellDriver1HiiHandle, (UINTN)Intermediate, TheHandle);
    206 
    207         Status = TraverseHandleDatabase (TheHandle);
    208         if (!EFI_ERROR(Status)) {
    209         } else {
    210           ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"openinfo", Param1);
    211           ShellStatus = SHELL_NOT_FOUND;
    212         }
    213       }
    214     }
    215   }
    216   return (ShellStatus);
    217 }
    218