+#include <Library/HandleParsingLib.h>\r
+\r
+#include <Protocol/EfiShellDynamicCommand.h>\r
+\r
+/**\r
+ Attempt to print help from a dynamically added command.\r
+\r
+ @param[in] CommandToGetHelpOn The unicode name of the command that help is\r
+ requested on.\r
+ @param[in] SectionToGetHelpOn Pointer to the section specifier(s).\r
+ @param[in] PrintCommandText Print the command followed by the help content\r
+ or just help.\r
+\r
+ @retval EFI_SUCCESS The help was displayed\r
+ @retval EFI_NOT_FOUND The command name could not be found\r
+ @retval EFI_DEVICE_ERROR The help data format was incorrect.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+PrintDynamicCommandHelp(\r
+ IN CHAR16 *CommandToGetHelpOn,\r
+ IN CHAR16 *SectionToGetHelpOn,\r
+ IN BOOLEAN PrintCommandText\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ BOOLEAN Found;\r
+ EFI_HANDLE *CommandHandleList;\r
+ EFI_HANDLE *NextCommand;\r
+ EFI_SHELL_DYNAMIC_COMMAND_PROTOCOL *DynamicCommand;\r
+\r
+ Status = EFI_NOT_FOUND;\r
+ Found = FALSE;\r
+ CommandHandleList = NULL;\r
+\r
+ CommandHandleList = GetHandleListByProtocol(&gEfiShellDynamicCommandProtocolGuid);\r
+\r
+ if (CommandHandleList == NULL) {\r
+ //\r
+ // not found or out of resources\r
+ //\r
+ return Status;\r
+ }\r
+\r
+ for (NextCommand = CommandHandleList; *NextCommand != NULL; NextCommand++) {\r
+ Status = gBS->HandleProtocol(\r
+ *NextCommand,\r
+ &gEfiShellDynamicCommandProtocolGuid,\r
+ (VOID **)&DynamicCommand\r
+ );\r
+\r
+ if (EFI_ERROR(Status)) {\r
+ continue;\r
+ }\r
+\r
+ //\r
+ // Check execution break flag when printing multiple command help information.\r
+ //\r
+ if (ShellGetExecutionBreakFlag ()) {\r
+ break;\r
+ }\r
+\r
+ if ((gUnicodeCollation->MetaiMatch (gUnicodeCollation, (CHAR16 *)DynamicCommand->CommandName, CommandToGetHelpOn)) ||\r
+ (gEfiShellProtocol->GetAlias (CommandToGetHelpOn, NULL) != NULL && (gUnicodeCollation->MetaiMatch (gUnicodeCollation, (CHAR16 *)DynamicCommand->CommandName, (CHAR16*)(gEfiShellProtocol->GetAlias(CommandToGetHelpOn, NULL)))))) {\r
+ // Print as Shell Help if in ManPage format.\r
+ Status = ShellPrintHelp (DynamicCommand->CommandName, SectionToGetHelpOn,\r
+ PrintCommandText);\r
+ if (Status == EFI_DEVICE_ERROR) {\r
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_HELP_INV),\r
+ gShellLevel3HiiHandle, DynamicCommand->CommandName);\r
+ } else if (EFI_ERROR(Status)) {\r
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_HELP_NF),\r
+ gShellLevel3HiiHandle, DynamicCommand->CommandName);\r
+ } else {\r
+ Found = TRUE;\r
+ }\r
+ }\r
+ }\r
+\r
+ return (Found ? EFI_SUCCESS : Status);\r
+\r
+}\r