• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
TraverseHandleDatabase(IN CONST EFI_HANDLE TheHandle)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
ShellCommandRunOpenInfo(IN EFI_HANDLE ImageHandle,IN EFI_SYSTEM_TABLE * SystemTable)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