151 lines
3.7 KiB
C
151 lines
3.7 KiB
C
|
|
/*++
|
|
|
|
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);
|
|
}
|