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