]> git.proxmox.com Git - mirror_edk2.git/blob - ShellPkg/Library/UefiShellDriver1CommandsLib/OpenInfo.c
939f2560f78d64a30d3774805a4e977dceb99012
[mirror_edk2.git] / ShellPkg / Library / UefiShellDriver1CommandsLib / OpenInfo.c
1 /** @file
2 Main file for OpenInfo shell Driver1 function.
3
4 Copyright (c) 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 }