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