2 Main file for OpenInfo shell Driver1 function.
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
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.
15 #include "UefiShellDriver1CommandsLib.h"
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 ";
27 Open the database and print out all the info about TheHandle.
29 @param[in] TheHandle The handle to print info on.
31 @retval EFI_SUCCESS The operation was successful.
32 @retval EFI_INVALID_PARAMETER TheHandle was NULL.
36 TraverseHandleDatabase (
37 IN CONST EFI_HANDLE TheHandle
41 EFI_GUID
**ProtocolGuidArray
;
44 EFI_OPEN_PROTOCOL_INFORMATION_ENTRY
*OpenInfo
;
47 CONST CHAR16
*OpenTypeString
;
52 if (TheHandle
== NULL
) {
53 return (EFI_INVALID_PARAMETER
);
57 // Retrieve the list of all the protocols on the handle
59 Status
= gBS
->ProtocolsPerHandle (
64 ASSERT_EFI_ERROR(Status
);
65 if (!EFI_ERROR (Status
)) {
67 for (ProtocolIndex
= 0; ProtocolIndex
< ArrayCount
; ProtocolIndex
++) {
69 // print out the human readable name for this one.
71 TempString
= GetStringNameFromGuid(ProtocolGuidArray
[ProtocolIndex
], NULL
);
72 if (TempString
== NULL
) {
75 ShellPrintEx(-1, -1, L
"%H%s%N\r\n", TempString
);
79 // Retrieve the list of agents that have opened each protocol
81 Status
= gBS
->OpenProtocolInformation (
83 ProtocolGuidArray
[ProtocolIndex
],
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;
101 HandleIndex
= ConvertHandleToHandleIndex(OpenInfo
[OpenInfoIndex
].AgentHandle
);
102 Name
= GetStringNameFromHandle(OpenInfo
[OpenInfoIndex
].AgentHandle
, "en");
103 if (OpenInfo
[OpenInfoIndex
].ControllerHandle
!=NULL
) {
108 STRING_TOKEN(STR_OPENINFO_LINE
),
109 gShellDriver1HiiHandle
,
111 ConvertHandleToHandleIndex(OpenInfo
[OpenInfoIndex
].ControllerHandle
),
112 OpenInfo
[OpenInfoIndex
].OpenCount
,
121 STRING_TOKEN(STR_OPENINFO_MIN_LINE
),
122 gShellDriver1HiiHandle
,
124 OpenInfo
[OpenInfoIndex
].OpenCount
,
133 FreePool (ProtocolGuidArray
);
140 Function for 'openinfo' command.
142 @param[in] ImageHandle Handle to the Image (NULL if Internal).
143 @param[in] SystemTable Pointer to the System Table (NULL if Internal).
147 ShellCommandRunOpenInfo (
148 IN EFI_HANDLE ImageHandle
,
149 IN EFI_SYSTEM_TABLE
*SystemTable
154 CHAR16
*ProblemParam
;
155 SHELL_STATUS ShellStatus
;
156 EFI_HANDLE TheHandle
;
157 CONST CHAR16
*Param1
;
160 ShellStatus
= SHELL_SUCCESS
;
163 // initialize the shell lib (we must be in non-auto-init...)
165 Status
= ShellInitialize();
166 ASSERT_EFI_ERROR(Status
);
168 Status
= CommandInit();
169 ASSERT_EFI_ERROR(Status
);
172 // parse the command line
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
;
184 if (ShellCommandLineGetCount(Package
) > 2){
186 // error for too many parameters
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
;
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
;
200 TheHandle
= ConvertHandleIndexToHandle((UINTN
)Intermediate
);
201 ASSERT(TheHandle
!= NULL
);
202 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_OPENINFO_HEADER_LINE
), gShellDriver1HiiHandle
, (UINTN
)Intermediate
, TheHandle
);
204 Status
= TraverseHandleDatabase (TheHandle
);
205 if (!EFI_ERROR(Status
)) {
207 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_INV_HANDLE
), gShellDriver1HiiHandle
, Param1
);
208 ShellStatus
= SHELL_NOT_FOUND
;
213 return (ShellStatus
);