|
|
/*++
Copyright (c) 1998 Intel Corporation
Module Name:
init.c
Abstract:
Intialize the shell library
Revision History
--*/
#include "shelllib.h"
/*
* */
EFI_STATUS InitializeShellApplication ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ) { EFI_STATUS Status; EFI_HANDLE Handle; UINTN BufferSize;
/*
* Shell app lib is a super set of the default lib. * Initialize the default lib first */
InitializeLib (ImageHandle, SystemTable); ST = SystemTable;
/*
* Connect to the shell interface */
Status = BS->HandleProtocol(ImageHandle, &ShellInterfaceProtocol, (VOID*)&SI); if (EFI_ERROR(Status)) { DEBUG((D_ERROR, "InitShellApp: Application not started from Shell\n")); Print (L"%EInitShellApp: Application not started from Shell%N\n"); BS->Exit (ImageHandle, Status, 0, NULL); }
/*
* Connect to the shell environment */
BufferSize = sizeof(Handle); Status = BS->LocateHandle(ByProtocol, &ShellEnvProtocol, NULL, &BufferSize, &Handle); if (EFI_ERROR(Status)) { DEBUG((D_ERROR, "InitShellApp: Shell environment interfaces not found\n")); Print (L"%EInitShellApp: Shell environment interfaces not found%N\n"); BS->Exit (ImageHandle, Status, 0, NULL); }
Status = BS->HandleProtocol(Handle, &ShellEnvProtocol, (VOID*)&SE); ASSERT (!EFI_ERROR(Status));
/*
* Done with init */
return Status; }
VOID InstallInternalShellCommand ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable, IN SHELLENV_INTERNAL_COMMAND Dispatch, IN CHAR16 *Cmd, IN CHAR16 *CmdFormat, IN CHAR16 *CmdHelpLine, IN VOID *CmdVerboseHelp ) { VOID *Junk; UINTN BufferSize; EFI_HANDLE Handle; EFI_LOADED_IMAGE *ImageInfo; EFI_STATUS Status;
/*
* Initialize lib functions */
InitializeLib (ImageHandle, SystemTable);
/*
* If this app has a ShellInterface, then we are not installing as an * internal command */
Status = BS->HandleProtocol(ImageHandle, &ShellInterfaceProtocol, &Junk); if (!EFI_ERROR(Status)) { return ; }
/*
* Check to make sure we are loaded as a boot service driver. if not * we are not installing as an internal command */
Status = BS->HandleProtocol(ImageHandle, &LoadedImageProtocol, (VOID*)&ImageInfo); if (EFI_ERROR(Status) || ImageInfo->ImageCodeType != EfiBootServicesCode) { return ; }
/*
* OK - we are to install this tool as an internal command. */
BufferSize = sizeof(Handle); Status = BS->LocateHandle(ByProtocol, &ShellEnvProtocol, NULL, &BufferSize, &Handle); if (EFI_ERROR(Status)) { DEBUG((D_INIT|D_ERROR, "InstallInternalCommand: could not find shell environment\n")); BS->Exit (ImageHandle, Status, 0, NULL); }
Status = BS->HandleProtocol(Handle, &ShellEnvProtocol, (VOID*)&SE); ASSERT (!EFI_ERROR(Status));
/*
* Add it to the environment */
Status = SE->AddCmd (Dispatch, Cmd, CmdFormat, CmdHelpLine, CmdVerboseHelp); DEBUG((D_INIT, "InstallInternalCommand: %hs - %r\n", Cmd, Status));
/*
* Since we're only installing not (and not running), and we've done the install * call exit. The nshell app's entry point will be invoked again when it's * run from "execute commandline" */
BS->Exit (ImageHandle, Status, 0, NULL); }
|