]> git.proxmox.com Git - mirror_edk2.git/blob - ShellPkg/Library/UefiShellCEntryLib/UefiShellCEntryLib.c
ShellPkg/Dp: Add null pointer check
[mirror_edk2.git] / ShellPkg / Library / UefiShellCEntryLib / UefiShellCEntryLib.c
1 /** @file
2 Provides application point extension for "C" style main function
3
4 Copyright (c) 2009 - 2016, 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
9
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.
12
13 **/
14
15 #include <Base.h>
16
17 #include <Protocol/SimpleFileSystem.h>
18 #include <Protocol/LoadedImage.h>
19 #include <Protocol/EfiShellInterface.h>
20 #include <Protocol/ShellParameters.h>
21
22 #include <Library/ShellCEntryLib.h>
23 #include <Library/DebugLib.h>
24
25 /**
26 UEFI entry point for an application that will in turn call the
27 ShellAppMain function which has parameters similar to a standard C
28 main function.
29
30 An application that uses UefiShellCEntryLib must have a ShellAppMain
31 function as prototyped in Include/Library/ShellCEntryLib.h.
32
33 Note that the Shell uses POSITIVE integers for error values, while UEFI
34 uses NEGATIVE values. If the application is to be used within a script,
35 it needs to return one of the SHELL_STATUS values defined in Protocol/Shell.h.
36
37 @param ImageHandle The image handle of the UEFI Application.
38 @param SystemTable A pointer to the EFI System Table.
39
40 @retval EFI_SUCCESS The application exited normally.
41 @retval Other An error occurred.
42
43 **/
44 EFI_STATUS
45 EFIAPI
46 ShellCEntryLib (
47 IN EFI_HANDLE ImageHandle,
48 IN EFI_SYSTEM_TABLE *SystemTable
49 )
50 {
51 INTN ReturnFromMain;
52 EFI_SHELL_PARAMETERS_PROTOCOL *EfiShellParametersProtocol;
53 EFI_SHELL_INTERFACE *EfiShellInterface;
54 EFI_STATUS Status;
55
56 ReturnFromMain = -1;
57 EfiShellParametersProtocol = NULL;
58 EfiShellInterface = NULL;
59
60 Status = SystemTable->BootServices->OpenProtocol(ImageHandle,
61 &gEfiShellParametersProtocolGuid,
62 (VOID **)&EfiShellParametersProtocol,
63 ImageHandle,
64 NULL,
65 EFI_OPEN_PROTOCOL_GET_PROTOCOL
66 );
67 if (!EFI_ERROR(Status)) {
68 //
69 // use shell 2.0 interface
70 //
71 ReturnFromMain = ShellAppMain (
72 EfiShellParametersProtocol->Argc,
73 EfiShellParametersProtocol->Argv
74 );
75 } else {
76 //
77 // try to get shell 1.0 interface instead.
78 //
79 Status = SystemTable->BootServices->OpenProtocol(ImageHandle,
80 &gEfiShellInterfaceGuid,
81 (VOID **)&EfiShellInterface,
82 ImageHandle,
83 NULL,
84 EFI_OPEN_PROTOCOL_GET_PROTOCOL
85 );
86 if (!EFI_ERROR(Status)) {
87 //
88 // use shell 1.0 interface
89 //
90 ReturnFromMain = ShellAppMain (
91 EfiShellInterface->Argc,
92 EfiShellInterface->Argv
93 );
94 } else {
95 ASSERT(FALSE);
96 }
97 }
98 return ReturnFromMain;
99 }