VirtualBox

source: vbox/trunk/src/VBox/Devices/EFI/Firmware/ShellPkg/Library/UefiShellDriver1CommandsLib/OpenInfo.c@ 80924

Last change on this file since 80924 was 80721, checked in by vboxsync, 6 years ago

Devices/EFI/FirmwareNew: Start upgrade process to edk2-stable201908 (compiles on Windows and works to some extent), bugref:4643

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

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette