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