Changeset 99404 in vbox for trunk/src/VBox/Devices/EFI/FirmwareNew/ShellPkg/Library/UefiShellLevel2CommandsLib/Load.c
- Timestamp:
- Apr 14, 2023 3:17:44 PM (2 years ago)
- svn:sync-xref-src-repo-rev:
- 156854
- Location:
- trunk/src/VBox/Devices/EFI/FirmwareNew
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/EFI/FirmwareNew
-
Property svn:mergeinfo
changed from (toggle deleted branches)
to (toggle deleted branches)/vendor/edk2/current 103735-103757,103769-103776,129194-145445 /vendor/edk2/current 103735-103757,103769-103776,129194-156846
-
Property svn:mergeinfo
changed from (toggle deleted branches)
-
trunk/src/VBox/Devices/EFI/FirmwareNew/ShellPkg/Library/UefiShellLevel2CommandsLib/Load.c
r85718 r99404 13 13 // IntelFrameworkModulePkg\Library\GenericBdsLib\BdsConnect.c 14 14 // function name: BdsLibConnectAllEfi 15 15 16 /** 16 17 This function will connect all current system handles recursively. The … … 38 39 &HandleCount, 39 40 &HandleBuffer 40 );41 ); 41 42 if (EFI_ERROR (Status)) { 42 43 return Status; … … 68 69 **/ 69 70 EFI_STATUS 70 LoadDriver (71 LoadDriver ( 71 72 IN CONST CHAR16 *FileName, 72 73 IN CONST BOOLEAN Connect 73 74 ) 74 75 { 75 EFI_HANDLE 76 EFI_STATUS 77 EFI_DEVICE_PATH_PROTOCOL 78 EFI_LOADED_IMAGE_PROTOCOL 79 80 LoadedDriverImage 81 FilePath 82 LoadedDriverHandle 83 Status 76 EFI_HANDLE LoadedDriverHandle; 77 EFI_STATUS Status; 78 EFI_DEVICE_PATH_PROTOCOL *FilePath; 79 EFI_LOADED_IMAGE_PROTOCOL *LoadedDriverImage; 80 81 LoadedDriverImage = NULL; 82 FilePath = NULL; 83 LoadedDriverHandle = NULL; 84 Status = EFI_SUCCESS; 84 85 85 86 ASSERT (FileName != NULL); … … 88 89 // Fix local copies of the protocol pointers 89 90 // 90 Status = CommandInit ();91 ASSERT_EFI_ERROR (Status);91 Status = CommandInit (); 92 ASSERT_EFI_ERROR (Status); 92 93 93 94 // 94 95 // Convert to DEVICE_PATH 95 96 // 96 FilePath = gEfiShellProtocol->GetDevicePathFromFilePath (FileName);97 FilePath = gEfiShellProtocol->GetDevicePathFromFilePath (FileName); 97 98 98 99 if (FilePath == NULL) { 99 ASSERT (FALSE);100 ASSERT (FALSE); 100 101 return (EFI_INVALID_PARAMETER); 101 102 } … … 104 105 // Use LoadImage to get it into memory 105 106 // 106 Status = gBS->LoadImage( 107 FALSE, 108 gImageHandle, 109 FilePath, 110 NULL, 111 0, 112 &LoadedDriverHandle); 113 114 if (EFI_ERROR(Status)) { 107 Status = gBS->LoadImage ( 108 FALSE, 109 gImageHandle, 110 FilePath, 111 NULL, 112 0, 113 &LoadedDriverHandle 114 ); 115 116 if (EFI_ERROR (Status)) { 115 117 // 116 118 // With EFI_SECURITY_VIOLATION retval, the Image was loaded and an ImageHandle was created … … 122 124 gBS->UnloadImage (LoadedDriverHandle); 123 125 } 124 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_LOAD_NOT_IMAGE), gShellLevel2HiiHandle, FileName, Status); 126 127 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_LOAD_NOT_IMAGE), gShellLevel2HiiHandle, FileName, Status); 125 128 } else { 126 129 // 127 130 // Make sure it is a driver image 128 131 // 129 Status = gBS->HandleProtocol (LoadedDriverHandle, &gEfiLoadedImageProtocolGuid, (VOID *) 132 Status = gBS->HandleProtocol (LoadedDriverHandle, &gEfiLoadedImageProtocolGuid, (VOID *)&LoadedDriverImage); 130 133 131 134 ASSERT (LoadedDriverImage != NULL); 132 135 133 if ( EFI_ERROR(Status) 134 || ( LoadedDriverImage->ImageCodeType != EfiBootServicesCode 135 && LoadedDriverImage->ImageCodeType != EfiRuntimeServicesCode) 136 ){ 137 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_LOAD_NOT_DRIVER), gShellLevel2HiiHandle, FileName); 136 if ( EFI_ERROR (Status) 137 || ( (LoadedDriverImage->ImageCodeType != EfiBootServicesCode) 138 && (LoadedDriverImage->ImageCodeType != EfiRuntimeServicesCode)) 139 ) 140 { 141 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_LOAD_NOT_DRIVER), gShellLevel2HiiHandle, FileName); 138 142 139 143 // 140 144 // Exit and unload the non-driver image 141 145 // 142 gBS->Exit (LoadedDriverHandle, EFI_INVALID_PARAMETER, 0, NULL);146 gBS->Exit (LoadedDriverHandle, EFI_INVALID_PARAMETER, 0, NULL); 143 147 Status = EFI_INVALID_PARAMETER; 144 148 } 145 149 } 146 150 147 if (!EFI_ERROR (Status)) {151 if (!EFI_ERROR (Status)) { 148 152 // 149 153 // Start the image 150 154 // 151 Status = gBS->StartImage (LoadedDriverHandle, NULL, NULL);152 if (EFI_ERROR (Status)) {153 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_LOAD_ERROR), gShellLevel2HiiHandle, FileName, Status);155 Status = gBS->StartImage (LoadedDriverHandle, NULL, NULL); 156 if (EFI_ERROR (Status)) { 157 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_LOAD_ERROR), gShellLevel2HiiHandle, FileName, Status); 154 158 } else { 155 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_LOAD_LOADED), gShellLevel2HiiHandle, FileName, LoadedDriverImage->ImageBase, Status);156 } 157 } 158 159 if (!EFI_ERROR (Status) && Connect) {159 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_LOAD_LOADED), gShellLevel2HiiHandle, FileName, LoadedDriverImage->ImageBase, Status); 160 } 161 } 162 163 if (!EFI_ERROR (Status) && Connect) { 160 164 // 161 165 // Connect it... 162 166 // 163 Status = ConnectAllEfi ();167 Status = ConnectAllEfi (); 164 168 } 165 169 … … 168 172 // 169 173 if (FilePath != NULL) { 170 FreePool (FilePath);174 FreePool (FilePath); 171 175 } 172 176 … … 174 178 } 175 179 176 STATIC CONST SHELL_PARAM_ITEM LoadParamList[] = {177 { L"-nc", TypeFlag},178 { NULL, TypeMax}179 180 STATIC CONST SHELL_PARAM_ITEM LoadParamList[] = { 181 { L"-nc", TypeFlag }, 182 { NULL, TypeMax } 183 }; 180 184 181 185 /** … … 192 196 ) 193 197 { 194 EFI_STATUS Status;195 LIST_ENTRY *Package;196 CHAR16 *ProblemParam;197 SHELL_STATUS ShellStatus;198 UINTN ParamCount;199 EFI_SHELL_FILE_INFO *ListHead;200 EFI_SHELL_FILE_INFO *Node;201 202 ListHead 203 ProblemParam 204 ShellStatus 198 EFI_STATUS Status; 199 LIST_ENTRY *Package; 200 CHAR16 *ProblemParam; 201 SHELL_STATUS ShellStatus; 202 UINTN ParamCount; 203 EFI_SHELL_FILE_INFO *ListHead; 204 EFI_SHELL_FILE_INFO *Node; 205 206 ListHead = NULL; 207 ProblemParam = NULL; 208 ShellStatus = SHELL_SUCCESS; 205 209 206 210 // 207 211 // initialize the shell lib (we must be in non-auto-init...) 208 212 // 209 Status = ShellInitialize ();210 ASSERT_EFI_ERROR (Status);213 Status = ShellInitialize (); 214 ASSERT_EFI_ERROR (Status); 211 215 212 216 // … … 214 218 // 215 219 Status = ShellCommandLineParse (LoadParamList, &Package, &ProblemParam, TRUE); 216 if (EFI_ERROR (Status)) {217 if ( Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {218 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"load", ProblemParam);219 FreePool (ProblemParam);220 if (EFI_ERROR (Status)) { 221 if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { 222 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"load", ProblemParam); 223 FreePool (ProblemParam); 220 224 ShellStatus = SHELL_INVALID_PARAMETER; 221 225 } else { 222 ASSERT (FALSE);226 ASSERT (FALSE); 223 227 } 224 228 } else { … … 226 230 // check for "-?" 227 231 // 228 if (ShellCommandLineGetFlag (Package, L"-?")) {229 ASSERT (FALSE);230 } else if (ShellCommandLineGetRawValue (Package, 1) == NULL) {232 if (ShellCommandLineGetFlag (Package, L"-?")) { 233 ASSERT (FALSE); 234 } else if (ShellCommandLineGetRawValue (Package, 1) == NULL) { 231 235 // 232 236 // we didnt get a single file to load parameter 233 237 // 234 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle, L"load");238 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle, L"load"); 235 239 ShellStatus = SHELL_INVALID_PARAMETER; 236 240 } else { 237 241 for ( ParamCount = 1 238 ; ShellCommandLineGetRawValue(Package, ParamCount) != NULL 239 ; ParamCount++ 240 ){ 241 Status = ShellOpenFileMetaArg((CHAR16*)ShellCommandLineGetRawValue(Package, ParamCount), EFI_FILE_MODE_READ, &ListHead); 242 if (!EFI_ERROR(Status)) { 243 for ( Node = (EFI_SHELL_FILE_INFO *)GetFirstNode(&ListHead->Link) 244 ; !IsNull(&ListHead->Link, &Node->Link) 245 ; Node = (EFI_SHELL_FILE_INFO *)GetNextNode(&ListHead->Link, &Node->Link) 246 ){ 242 ; ShellCommandLineGetRawValue (Package, ParamCount) != NULL 243 ; ParamCount++ 244 ) 245 { 246 Status = ShellOpenFileMetaArg ((CHAR16 *)ShellCommandLineGetRawValue (Package, ParamCount), EFI_FILE_MODE_READ, &ListHead); 247 if (!EFI_ERROR (Status)) { 248 for ( Node = (EFI_SHELL_FILE_INFO *)GetFirstNode (&ListHead->Link) 249 ; !IsNull (&ListHead->Link, &Node->Link) 250 ; Node = (EFI_SHELL_FILE_INFO *)GetNextNode (&ListHead->Link, &Node->Link) 251 ) 252 { 247 253 // 248 254 // once we have an error preserve that value, but finish the loop. 249 255 // 250 if (EFI_ERROR (Status)) {251 LoadDriver (Node->FullName, (BOOLEAN)(ShellCommandLineGetFlag(Package, L"-nc")==FALSE));256 if (EFI_ERROR (Status)) { 257 LoadDriver (Node->FullName, (BOOLEAN)(ShellCommandLineGetFlag (Package, L"-nc") == FALSE)); 252 258 } else { 253 Status = LoadDriver (Node->FullName, (BOOLEAN)(ShellCommandLineGetFlag(Package, L"-nc")==FALSE));259 Status = LoadDriver (Node->FullName, (BOOLEAN)(ShellCommandLineGetFlag (Package, L"-nc") == FALSE)); 254 260 } 255 261 } // for loop for multi-open 256 if (EFI_ERROR(Status)) { 257 ShellCloseFileMetaArg(&ListHead); 262 263 if (EFI_ERROR (Status)) { 264 ShellCloseFileMetaArg (&ListHead); 258 265 } else { 259 Status = ShellCloseFileMetaArg (&ListHead);;266 Status = ShellCloseFileMetaArg (&ListHead); 260 267 } 261 268 } else { … … 263 270 // no files found. 264 271 // 265 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_NF), gShellLevel2HiiHandle, L"load", (CHAR16*)ShellCommandLineGetRawValue(Package, ParamCount));272 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_NF), gShellLevel2HiiHandle, L"load", (CHAR16 *)ShellCommandLineGetRawValue (Package, ParamCount)); 266 273 ShellStatus = SHELL_NOT_FOUND; 267 274 } … … 275 282 } 276 283 277 if (EFI_ERROR (Status) && ShellStatus == SHELL_SUCCESS) {284 if (EFI_ERROR (Status) && (ShellStatus == SHELL_SUCCESS)) { 278 285 ShellStatus = SHELL_DEVICE_ERROR; 279 286 }
Note:
See TracChangeset
for help on using the changeset viewer.