2 Main file for attrib shell level 2 function.
4 (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR>
5 Copyright (c) 2009 - 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
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.
16 #include "UefiShellLevel2CommandsLib.h"
18 // This function was from from the BdsLib implementation in
19 // IntelFrameworkModulePkg\Library\GenericBdsLib\BdsConnect.c
20 // function name: BdsLibConnectAllEfi
22 This function will connect all current system handles recursively. The
23 connection will finish until every handle's child handle created if it have.
25 @retval EFI_SUCCESS All handles and it's child handle have been
27 @retval EFI_STATUS Return the status of gBS->LocateHandleBuffer().
37 EFI_HANDLE
*HandleBuffer
;
40 Status
= gBS
->LocateHandleBuffer (
47 if (EFI_ERROR (Status
)) {
51 for (Index
= 0; Index
< HandleCount
; Index
++) {
52 Status
= gBS
->ConnectController (HandleBuffer
[Index
], NULL
, NULL
, TRUE
);
55 if (HandleBuffer
!= NULL
) {
56 FreePool (HandleBuffer
);
63 function to load a .EFI driver into memory and possible connect the driver.
65 if FileName is NULL then ASSERT.
67 @param[in] FileName FileName of the driver to load
68 @param[in] Connect Whether to connect or not
70 @retval EFI_SUCCESS the driver was loaded and if Connect was
71 true then connect was attempted. Connection may
73 @retval EFI_OUT_OF_RESOURCES there was insufficient memory
77 IN CONST CHAR16
*FileName
,
78 IN CONST BOOLEAN Connect
81 EFI_HANDLE LoadedDriverHandle
;
83 EFI_DEVICE_PATH_PROTOCOL
*FilePath
;
84 EFI_LOADED_IMAGE_PROTOCOL
*LoadedDriverImage
;
86 LoadedDriverImage
= NULL
;
88 LoadedDriverHandle
= NULL
;
91 ASSERT (FileName
!= NULL
);
94 // Fix local copies of the protocol pointers
96 Status
= CommandInit();
97 ASSERT_EFI_ERROR(Status
);
100 // Convert to DEVICE_PATH
102 FilePath
= gEfiShellProtocol
->GetDevicePathFromFilePath(FileName
);
104 if (FilePath
== NULL
) {
106 return (EFI_INVALID_PARAMETER
);
110 // Use LoadImage to get it into memory
112 Status
= gBS
->LoadImage(
118 &LoadedDriverHandle
);
120 if (EFI_ERROR(Status
)) {
121 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_LOAD_NOT_IMAGE
), gShellLevel2HiiHandle
, FileName
, Status
);
124 // Make sure it is a driver image
126 Status
= gBS
->HandleProtocol (LoadedDriverHandle
, &gEfiLoadedImageProtocolGuid
, (VOID
*) &LoadedDriverImage
);
128 ASSERT (LoadedDriverImage
!= NULL
);
130 if ( EFI_ERROR(Status
)
131 || ( LoadedDriverImage
->ImageCodeType
!= EfiBootServicesCode
132 && LoadedDriverImage
->ImageCodeType
!= EfiRuntimeServicesCode
)
134 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_LOAD_NOT_DRIVER
), gShellLevel2HiiHandle
, FileName
);
137 // Exit and unload the non-driver image
139 gBS
->Exit(LoadedDriverHandle
, EFI_INVALID_PARAMETER
, 0, NULL
);
140 Status
= EFI_INVALID_PARAMETER
;
144 if (!EFI_ERROR(Status
)) {
148 Status
= gBS
->StartImage(LoadedDriverHandle
, NULL
, NULL
);
149 if (EFI_ERROR(Status
)) {
150 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_LOAD_ERROR
), gShellLevel2HiiHandle
, FileName
, Status
);
152 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_LOAD_LOADED
), gShellLevel2HiiHandle
, FileName
, LoadedDriverImage
->ImageBase
, Status
);
156 if (!EFI_ERROR(Status
) && Connect
) {
160 Status
= ConnectAllEfi();
164 // clean up memory...
166 if (FilePath
!= NULL
) {
173 STATIC CONST SHELL_PARAM_ITEM LoadParamList
[] = {
179 Function for 'load' command.
181 @param[in] ImageHandle Handle to the Image (NULL if Internal).
182 @param[in] SystemTable Pointer to the System Table (NULL if Internal).
186 ShellCommandRunLoad (
187 IN EFI_HANDLE ImageHandle
,
188 IN EFI_SYSTEM_TABLE
*SystemTable
193 CHAR16
*ProblemParam
;
194 SHELL_STATUS ShellStatus
;
196 EFI_SHELL_FILE_INFO
*ListHead
;
197 EFI_SHELL_FILE_INFO
*Node
;
201 ShellStatus
= SHELL_SUCCESS
;
204 // initialize the shell lib (we must be in non-auto-init...)
206 Status
= ShellInitialize();
207 ASSERT_EFI_ERROR(Status
);
210 // parse the command line
212 Status
= ShellCommandLineParse (LoadParamList
, &Package
, &ProblemParam
, TRUE
);
213 if (EFI_ERROR(Status
)) {
214 if (Status
== EFI_VOLUME_CORRUPTED
&& ProblemParam
!= NULL
) {
215 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellLevel2HiiHandle
, L
"load", ProblemParam
);
216 FreePool(ProblemParam
);
217 ShellStatus
= SHELL_INVALID_PARAMETER
;
225 if (ShellCommandLineGetFlag(Package
, L
"-?")) {
227 } else if (ShellCommandLineGetRawValue(Package
, 1) == NULL
) {
229 // we didnt get a single file to load parameter
231 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_FEW
), gShellLevel2HiiHandle
, L
"load");
232 ShellStatus
= SHELL_INVALID_PARAMETER
;
235 ; ShellCommandLineGetRawValue(Package
, ParamCount
) != NULL
238 Status
= ShellOpenFileMetaArg((CHAR16
*)ShellCommandLineGetRawValue(Package
, ParamCount
), EFI_FILE_MODE_READ
, &ListHead
);
239 if (!EFI_ERROR(Status
)) {
240 for ( Node
= (EFI_SHELL_FILE_INFO
*)GetFirstNode(&ListHead
->Link
)
241 ; !IsNull(&ListHead
->Link
, &Node
->Link
)
242 ; Node
= (EFI_SHELL_FILE_INFO
*)GetNextNode(&ListHead
->Link
, &Node
->Link
)
245 // once we have an error preserve that value, but finish the loop.
247 if (EFI_ERROR(Status
)) {
248 LoadDriver(Node
->FullName
, (BOOLEAN
)(ShellCommandLineGetFlag(Package
, L
"-nc")==FALSE
));
250 Status
= LoadDriver(Node
->FullName
, (BOOLEAN
)(ShellCommandLineGetFlag(Package
, L
"-nc")==FALSE
));
252 } // for loop for multi-open
253 if (EFI_ERROR(Status
)) {
254 ShellCloseFileMetaArg(&ListHead
);
256 Status
= ShellCloseFileMetaArg(&ListHead
);;
262 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_FILE_NF
), gShellLevel2HiiHandle
, L
"load", (CHAR16
*)ShellCommandLineGetRawValue(Package
, ParamCount
));
263 ShellStatus
= SHELL_NOT_FOUND
;
265 } // for loop for params
269 // free the command line package
271 ShellCommandLineFreeVarList (Package
);
274 if (EFI_ERROR(Status
) && ShellStatus
== SHELL_SUCCESS
) {
275 ShellStatus
= SHELL_DEVICE_ERROR
;
278 return (ShellStatus
);