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