]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellInstall1CommandsLib/Bcfg.c
Fix GCC build failure.
[mirror_edk2.git] / ShellPkg / Library / UefiShellInstall1CommandsLib / Bcfg.c
CommitLineData
75aadf59 1/** @file\r
2398d9b1 2 Main file for bcfg shell Install1 function.\r
75aadf59 3\r
e755a4ca 4 Copyright (c) 2010 - 2013, Intel Corporation. All rights reserved.<BR>\r
75aadf59 5 This program and the accompanying materials\r
6 are licensed and made available under the terms and conditions of the BSD License\r
7 which accompanies this distribution. The full text of the license may be found at\r
8 http://opensource.org/licenses/bsd-license.php\r
9\r
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
15#include "UefiShellInstall1CommandsLib.h"\r
16#include <Guid/GlobalVariable.h>\r
17#include <Library/PrintLib.h>\r
18#include <Library/HandleParsingLib.h>\r
19#include <Library/DevicePathLib.h>\r
20\r
21typedef enum {\r
2398d9b1 22 BcfgTargetBootOrder = 0,\r
23 BcfgTargetDriverOrder = 1,\r
24 BcfgTargetMax = 2\r
75aadf59 25} BCFG_OPERATION_TARGET;\r
26\r
27typedef enum {\r
2398d9b1 28 BcfgTypeDump = 0,\r
29 BcfgTypeAdd = 1,\r
30 BcfgTypeAddp = 2,\r
31 BcfgTypeAddh = 3,\r
32 BcfgTypeRm = 4,\r
33 BcfgTypeMv = 5,\r
34 BcfgTypeOpt = 6,\r
35 BcfgTypeMax = 7\r
75aadf59 36} BCFG_OPERATION_TYPE;\r
37\r
38typedef struct {\r
39 BCFG_OPERATION_TARGET Target;\r
40 BCFG_OPERATION_TYPE Type;\r
41 UINT16 Number1;\r
42 UINT16 Number2;\r
43 UINTN HandleIndex;\r
44 CHAR16 *FileName;\r
45 CHAR16 *Description;\r
46 UINT16 *Order;\r
47 CONST CHAR16 *OptData;\r
48} BGFG_OPERATION;\r
49\r
6a34a2e4
RN
50/**\r
51 Get the actual number of entries in EFI_KEY_OPTION.Keys, from 0-3.\r
52\r
53 @param KeyOption Pointer to the EFI_KEY_OPTION structure. \r
54\r
55 @return Actual number of entries in EFI_KEY_OPTION.Keys.\r
56**/\r
57#define KEY_OPTION_INPUT_KEY_COUNT(KeyOption) \\r
58 (((KeyOption)->KeyData & EFI_KEY_OPTION_INPUT_KEY_COUNT_MASK) >> LowBitSet32 (EFI_KEY_OPTION_INPUT_KEY_COUNT_MASK))\r
59\r
e1d996b3 60/**\r
61 Update the optional data for a boot or driver option.\r
62\r
63 If optional data exists it will be changed.\r
64\r
65 @param[in] Index The boot or driver option index update.\r
66 @param[in] DataSize The size in bytes of Data.\r
67 @param[in] Data The buffer for the optioanl data.\r
68 @param[in] Target The target of the operation.\r
69\r
70 @retval EFI_SUCCESS The data was sucessfully updated.\r
71 @retval other A error occured.\r
72**/\r
73EFI_STATUS\r
74EFIAPI\r
75UpdateOptionalData(\r
76 UINT16 Index, \r
77 UINTN DataSize, \r
78 UINT8 *Data,\r
79 IN CONST BCFG_OPERATION_TARGET Target\r
80 )\r
81{\r
82 EFI_STATUS Status;\r
83 CHAR16 VariableName[12];\r
84 UINTN OriginalSize;\r
85 UINT8 *OriginalData;\r
86 UINTN NewSize;\r
87 UINT8 *NewData;\r
88 UINTN OriginalOptionDataSize;\r
89\r
90 UnicodeSPrint(VariableName, sizeof(VariableName), L"%s%04x", Target == BcfgTargetBootOrder?L"Boot":L"Driver", Index);\r
91 \r
92 OriginalSize = 0;\r
93 OriginalData = NULL;\r
94 NewData = NULL;\r
95 NewSize = 0;\r
96\r
97 Status = gRT->GetVariable(\r
98 VariableName,\r
99 (EFI_GUID*)&gEfiGlobalVariableGuid,\r
100 NULL,\r
101 &OriginalSize,\r
102 OriginalData);\r
103 if (Status == EFI_BUFFER_TOO_SMALL) {\r
104 OriginalData = AllocateZeroPool(OriginalSize);\r
105 if (OriginalData == NULL) {\r
106 return (EFI_OUT_OF_RESOURCES);\r
107 }\r
108 Status = gRT->GetVariable(\r
109 VariableName,\r
110 (EFI_GUID*)&gEfiGlobalVariableGuid,\r
111 NULL,\r
112 &OriginalSize,\r
113 OriginalData);\r
114 }\r
115\r
116 if (!EFI_ERROR(Status)) {\r
117 //\r
118 // Allocate new struct and discard old optional data.\r
119 //\r
8d300003 120 ASSERT (OriginalData != NULL);\r
e1d996b3 121 OriginalOptionDataSize = sizeof(UINT32) + sizeof(UINT16) + StrSize(((CHAR16*)(OriginalData + sizeof(UINT32) + sizeof(UINT16))));\r
122 OriginalOptionDataSize += (*(UINT16*)(OriginalData + sizeof(UINT32)));\r
123 OriginalOptionDataSize -= OriginalSize;\r
124 NewSize = OriginalSize - OriginalOptionDataSize + DataSize;\r
125 NewData = AllocateCopyPool(NewSize, OriginalData);\r
126 if (NewData == NULL) {\r
127 Status = EFI_OUT_OF_RESOURCES;\r
128 } else {\r
129 CopyMem(NewData + OriginalSize - OriginalOptionDataSize, Data, DataSize);\r
130 }\r
131 }\r
132\r
133 if (!EFI_ERROR(Status)) {\r
134 //\r
135 // put the data back under the variable\r
136 //\r
137 Status = gRT->SetVariable(\r
138 VariableName, \r
139 (EFI_GUID*)&gEfiGlobalVariableGuid,\r
140 EFI_VARIABLE_NON_VOLATILE|EFI_VARIABLE_BOOTSERVICE_ACCESS|EFI_VARIABLE_RUNTIME_ACCESS,\r
141 NewSize,\r
142 NewData);\r
143 }\r
144\r
145 SHELL_FREE_NON_NULL(OriginalData);\r
146 SHELL_FREE_NON_NULL(NewData);\r
147 return (Status);\r
148}\r
149\r
150/**\r
151 This function will get a CRC for a boot option.\r
152\r
8d300003
ED
153 @param[in, out] Crc The CRC value to return.\r
154 @param[in] BootIndex The boot option index to CRC.\r
e1d996b3 155\r
156 @retval EFI_SUCCESS The CRC was sucessfully returned.\r
157 @retval other A error occured.\r
158**/\r
159EFI_STATUS\r
160EFIAPI\r
161GetBootOptionCrc(\r
162 UINT32 *Crc, \r
163 UINT16 BootIndex\r
164 )\r
165{\r
166 CHAR16 VariableName[12];\r
167 EFI_STATUS Status;\r
168 UINT8 *Buffer;\r
169 UINTN BufferSize;\r
170\r
171 Buffer = NULL;\r
172 BufferSize = 0;\r
173\r
174 //\r
175 // Get the data Buffer\r
176 //\r
177 UnicodeSPrint(VariableName, sizeof(VariableName), L"%Boot%04x", BootIndex);\r
178 Status = gRT->GetVariable(\r
179 VariableName,\r
180 (EFI_GUID*)&gEfiGlobalVariableGuid,\r
181 NULL,\r
182 &BufferSize,\r
183 NULL);\r
184 if (Status == EFI_BUFFER_TOO_SMALL) {\r
185 Buffer = AllocateZeroPool(BufferSize);\r
186 Status = gRT->GetVariable(\r
187 VariableName,\r
188 (EFI_GUID*)&gEfiGlobalVariableGuid,\r
189 NULL,\r
190 &BufferSize,\r
191 Buffer);\r
192 }\r
193\r
194 //\r
195 // Get the CRC computed\r
196 //\r
197 if (!EFI_ERROR(Status)) {\r
198 Status = gBS->CalculateCrc32 (Buffer, BufferSize, Crc);\r
199 }\r
200\r
201 SHELL_FREE_NON_NULL(Buffer);\r
202 return EFI_SUCCESS;\r
203}\r
204\r
6878e7a7 205/**\r
206 This function will populate the device path protocol parameter based on TheHandle.\r
4ff7e37b
ED
207\r
208 @param[in] TheHandle Driver handle.\r
209 @param[in, out] FilePath On a sucessful return the device path to the handle.\r
6878e7a7 210\r
211 @retval EFI_SUCCESS The device path was sucessfully returned.\r
212 @retval other A error from gBS->HandleProtocol.\r
213\r
214 @sa HandleProtocol\r
215**/\r
216EFI_STATUS\r
217EFIAPI\r
218GetDevicePathForDriverHandleInstall1 (\r
219 IN EFI_HANDLE TheHandle,\r
220 IN OUT EFI_DEVICE_PATH_PROTOCOL **FilePath\r
221 )\r
222{\r
223 EFI_STATUS Status;\r
224 EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;\r
225 EFI_DEVICE_PATH_PROTOCOL *ImageDevicePath;\r
226\r
227 Status = gBS->OpenProtocol (\r
228 TheHandle,\r
229 &gEfiLoadedImageProtocolGuid,\r
230 (VOID**)&LoadedImage,\r
231 gImageHandle,\r
232 NULL,\r
233 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
234 );\r
235 if (!EFI_ERROR (Status)) {\r
236 Status = gBS->OpenProtocol (\r
237 LoadedImage->DeviceHandle,\r
238 &gEfiDevicePathProtocolGuid,\r
239 (VOID**)&ImageDevicePath,\r
240 gImageHandle,\r
241 NULL,\r
242 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
243 );\r
244 if (!EFI_ERROR (Status)) {\r
245// *DevPath = DuplicateDevicePath (ImageDevicePath);\r
246// *FilePath = DuplicateDevicePath (LoadedImage->FilePath);\r
247 *FilePath = AppendDevicePath(ImageDevicePath,LoadedImage->FilePath);\r
248 gBS->CloseProtocol(\r
249 LoadedImage->DeviceHandle,\r
250 &gEfiDevicePathProtocolGuid,\r
251 gImageHandle,\r
252 NULL);\r
253 }\r
254 gBS->CloseProtocol(\r
255 TheHandle,\r
256 &gEfiLoadedImageProtocolGuid,\r
257 gImageHandle,\r
258 NULL);\r
259 }\r
260 return (Status);\r
261}\r
262\r
75aadf59 263/**\r
2398d9b1 264 Function to add a option.\r
265\r
266 @param[in] Position The position to add Target at.\r
267 @param[in] File The file to make the target.\r
268 @param[in] Desc The description text.\r
269 @param[in] CurrentOrder The pointer to the current order of items.\r
270 @param[in] OrderCount The number if items in CurrentOrder.\r
271 @param[in] Target The info on the option to add.\r
272 @param[in] UseHandle TRUE to use HandleNumber, FALSE to use File and Desc.\r
273 @param[in] UsePath TRUE to convert to devicepath.\r
274 @param[in] HandleNumber The handle number to add.\r
275\r
276 @retval SHELL_SUCCESS The operation was successful.\r
277 @retval SHELL_INVALID_PARAMETER A parameter was invalid.\r
75aadf59 278**/\r
279SHELL_STATUS\r
280EFIAPI\r
2398d9b1 281BcfgAddInstall1(\r
75aadf59 282 IN UINTN Position,\r
283 IN CONST CHAR16 *File,\r
284 IN CONST CHAR16 *Desc,\r
285 IN CONST UINT16 *CurrentOrder,\r
286 IN CONST UINTN OrderCount,\r
287 IN CONST BCFG_OPERATION_TARGET Target,\r
288 IN CONST BOOLEAN UseHandle,\r
2398d9b1 289 IN CONST BOOLEAN UsePath,\r
75aadf59 290 IN CONST UINTN HandleNumber\r
291 )\r
292{\r
293 EFI_STATUS Status;\r
2398d9b1 294 EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
295 EFI_DEVICE_PATH_PROTOCOL *FilePath;\r
75aadf59 296 CHAR16 *Str;\r
2398d9b1 297 UINT8 *TempByteBuffer;\r
298 UINT8 *TempByteStart;\r
75aadf59 299 EFI_SHELL_FILE_INFO *Arg;\r
300 EFI_SHELL_FILE_INFO *FileList;\r
301 CHAR16 OptionStr[40];\r
302 UINTN DescSize, FilePathSize;\r
303 BOOLEAN Found;\r
304 UINTN TargetLocation;\r
305 UINTN Index;\r
306 EFI_HANDLE *Handles;\r
307 EFI_HANDLE CurHandle;\r
2398d9b1 308 UINTN DriverBindingHandleCount;\r
309 UINTN ParentControllerHandleCount;\r
310 UINTN ChildControllerHandleCount;\r
75aadf59 311 SHELL_STATUS ShellStatus;\r
312 UINT16 *NewOrder;\r
75aadf59 313\r
314 if (!UseHandle) {\r
2398d9b1 315 if (File == NULL || Desc == NULL) {\r
316 return (SHELL_INVALID_PARAMETER);\r
317 }\r
75aadf59 318 } else {\r
2398d9b1 319 if (HandleNumber == 0) {\r
320 return (SHELL_INVALID_PARAMETER);\r
321 }\r
75aadf59 322 }\r
323\r
2398d9b1 324 if (Position > OrderCount) {\r
325 Position = OrderCount;\r
326 }\r
327\r
328 Str = NULL;\r
329 FilePath = NULL;\r
2398d9b1 330 FileList = NULL;\r
331 Handles = NULL;\r
332 ShellStatus = SHELL_SUCCESS;\r
333 TargetLocation = 0xFFFF;\r
75aadf59 334\r
335 if (UseHandle) {\r
6878e7a7 336 CurHandle = ConvertHandleIndexToHandle(HandleNumber);\r
337 if (CurHandle == NULL) {\r
338 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, L"Handle Number");\r
75aadf59 339 ShellStatus = SHELL_INVALID_PARAMETER;\r
340 } else {\r
6878e7a7 341 if (Target == BcfgTargetBootOrder) {\r
342 //\r
343 //Make sure that the handle should point to a real controller\r
344 //\r
345 Status = PARSE_HANDLE_DATABASE_UEFI_DRIVERS (\r
346 CurHandle,\r
347 &DriverBindingHandleCount,\r
348 NULL);\r
349\r
350 Status = PARSE_HANDLE_DATABASE_PARENTS (\r
351 CurHandle,\r
352 &ParentControllerHandleCount,\r
353 NULL);\r
354\r
355 Status = ParseHandleDatabaseForChildControllers (\r
356 CurHandle,\r
357 &ChildControllerHandleCount,\r
358 NULL);\r
359\r
360 if (DriverBindingHandleCount > 0\r
361 || ParentControllerHandleCount > 0\r
362 || ChildControllerHandleCount > 0) {\r
363 FilePath = NULL;\r
364 Status = gBS->HandleProtocol (\r
365 CurHandle,\r
366 &gEfiDevicePathProtocolGuid,\r
367 (VOID**)&FilePath);\r
368 }\r
369 if (EFI_ERROR (Status)) {\r
370 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_HANDLE), gShellInstall1HiiHandle, HandleNumber);\r
371 ShellStatus = SHELL_INVALID_PARAMETER;\r
372 }\r
373 } else {\r
374 //\r
375 //Make sure that the handle should point to driver, not a controller.\r
376 //\r
377 Status = PARSE_HANDLE_DATABASE_UEFI_DRIVERS (\r
378 CurHandle,\r
379 &DriverBindingHandleCount,\r
380 NULL);\r
381\r
382 Status = PARSE_HANDLE_DATABASE_PARENTS (\r
383 CurHandle,\r
384 &ParentControllerHandleCount,\r
385 NULL);\r
386\r
387 Status = ParseHandleDatabaseForChildControllers (\r
388 CurHandle,\r
389 &ChildControllerHandleCount,\r
390 NULL);\r
391\r
2398d9b1 392 Status = gBS->HandleProtocol (\r
393 CurHandle,\r
394 &gEfiDevicePathProtocolGuid,\r
395 (VOID**)&FilePath);\r
6878e7a7 396\r
397 if (DriverBindingHandleCount > 0\r
398 || ParentControllerHandleCount > 0\r
399 || ChildControllerHandleCount > 0\r
400 || !EFI_ERROR(Status) ) {\r
401 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, L"Handle Number");\r
402 ShellStatus = SHELL_INVALID_PARAMETER;\r
403 } else {\r
404 //\r
405 // Get the DevicePath from the loaded image information.\r
406 //\r
407 Status = GetDevicePathForDriverHandleInstall1(CurHandle, &FilePath);\r
408 }\r
75aadf59 409 }\r
410 }\r
411 } else {\r
412 //\r
413 // Get file info\r
414 //\r
2398d9b1 415 ShellOpenFileMetaArg ((CHAR16*)File, EFI_FILE_MODE_READ, &FileList);\r
416\r
417 if (FileList == NULL) {\r
418 //\r
419 // If filename matched nothing fail\r
420 //\r
75aadf59 421 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellInstall1HiiHandle, File);\r
2398d9b1 422 ShellStatus = SHELL_INVALID_PARAMETER;\r
423 } else if (FileList->Link.ForwardLink != FileList->Link.BackLink) {\r
75aadf59 424 //\r
425 // If filename expanded to multiple names, fail\r
426 //\r
427 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_FILE), gShellInstall1HiiHandle, File);\r
428 ShellStatus = SHELL_INVALID_PARAMETER;\r
429 } else {\r
430 Arg = (EFI_SHELL_FILE_INFO*)GetFirstNode(&FileList->Link);\r
431 if (EFI_ERROR(Arg->Status)) {\r
432 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_FILE_OPEN), gShellInstall1HiiHandle, File, Arg->Status);\r
433 ShellStatus = SHELL_INVALID_PARAMETER;\r
434 } else {\r
435 //\r
436 // Build FilePath to the filename\r
437 //\r
438\r
439 //\r
440 // get the device path\r
441 //\r
366f81a0 442 DevicePath = gEfiShellProtocol->GetDevicePathFromFilePath(Arg->FullName);\r
75aadf59 443 if (DevicePath == NULL) {\r
444 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_FILE_DP), gShellInstall1HiiHandle, Arg->FullName);\r
445 ShellStatus = SHELL_UNSUPPORTED;\r
446 } else {\r
6878e7a7 447/*\r
2398d9b1 448 if (UsePath) {\r
449 DevPath = DevicePath;\r
450 while (!IsDevicePathEnd(DevPath)) {\r
451 if ((DevicePathType(DevPath) == MEDIA_DEVICE_PATH) &&\r
452 (DevicePathSubType(DevPath) == MEDIA_HARDDRIVE_DP)) {\r
453\r
454 //\r
455 // If we find it use it instead\r
456 //\r
457 DevicePath = DevPath;\r
458 break;\r
459 }\r
460 DevPath = NextDevicePathNode(DevPath);\r
461 }\r
462 //\r
463 // append the file\r
464 //\r
465 for(StringWalker=Arg->FullName; *StringWalker != CHAR_NULL && *StringWalker != ':'; StringWalker++);\r
466 FileNode = FileDevicePath(NULL, StringWalker+1);\r
467 FilePath = AppendDevicePath(DevicePath, FileNode);\r
468 FreePool(FileNode);\r
75aadf59 469 } else {\r
6878e7a7 470*/\r
2398d9b1 471 FilePath = DuplicateDevicePath(DevicePath);\r
6878e7a7 472/*\r
75aadf59 473 }\r
6878e7a7 474*/\r
75aadf59 475 FreePool(DevicePath);\r
476 }\r
477 }\r
478 }\r
479 }\r
480\r
481\r
482 if (ShellStatus == SHELL_SUCCESS) {\r
483 //\r
484 // Find a free target ,a brute force implementation\r
485 //\r
486 Found = FALSE;\r
487 for (TargetLocation=0; TargetLocation < 0xFFFF; TargetLocation++) {\r
488 Found = TRUE;\r
489 for (Index=0; Index < OrderCount; Index++) {\r
490 if (CurrentOrder[Index] == TargetLocation) {\r
491 Found = FALSE;\r
492 break;\r
493 }\r
494 }\r
495\r
496 if (Found) {\r
497 break;\r
498 }\r
499 }\r
500\r
501 if (TargetLocation == 0xFFFF) {\r
502 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_TARGET_NF), gShellInstall1HiiHandle);\r
503 } else {\r
504 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_TARGET), gShellInstall1HiiHandle, TargetLocation);\r
505 }\r
506 }\r
507\r
508 if (ShellStatus == SHELL_SUCCESS) {\r
509 //\r
510 // Add the option\r
511 //\r
512 DescSize = StrSize(Desc);\r
513 FilePathSize = GetDevicePathSize (FilePath);\r
514\r
2398d9b1 515 TempByteBuffer = AllocateZeroPool(sizeof(UINT32) + sizeof(UINT16) + DescSize + FilePathSize);\r
33c031ee 516 if (TempByteBuffer != NULL) {\r
517 TempByteStart = TempByteBuffer;\r
518 *((UINT32 *) TempByteBuffer) = LOAD_OPTION_ACTIVE; // Attributes\r
519 TempByteBuffer += sizeof (UINT32);\r
75aadf59 520\r
33c031ee 521 *((UINT16 *) TempByteBuffer) = (UINT16)FilePathSize; // FilePathListLength\r
522 TempByteBuffer += sizeof (UINT16);\r
75aadf59 523\r
33c031ee 524 CopyMem (TempByteBuffer, Desc, DescSize);\r
525 TempByteBuffer += DescSize;\r
e3df6949 526 ASSERT (FilePath != NULL);\r
33c031ee 527 CopyMem (TempByteBuffer, FilePath, FilePathSize);\r
75aadf59 528\r
33c031ee 529 UnicodeSPrint (OptionStr, sizeof(OptionStr), L"%s%04x", Target == BcfgTargetBootOrder?L"Boot":L"Driver", TargetLocation);\r
530 Status = gRT->SetVariable (\r
531 OptionStr,\r
532 &gEfiGlobalVariableGuid,\r
533 EFI_VARIABLE_NON_VOLATILE|EFI_VARIABLE_BOOTSERVICE_ACCESS|EFI_VARIABLE_RUNTIME_ACCESS,\r
534 sizeof(UINT32) + sizeof(UINT16) + DescSize + FilePathSize,\r
535 TempByteStart\r
536 );\r
537\r
538 FreePool(TempByteStart);\r
539 } else {\r
540 Status = EFI_OUT_OF_RESOURCES;\r
541 }\r
75aadf59 542\r
2398d9b1 543 if (EFI_ERROR(Status)) {\r
544 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_SET_VAR_FAIL), gShellInstall1HiiHandle, OptionStr, Status);\r
545 } else {\r
546 NewOrder = AllocateZeroPool((OrderCount+1)*sizeof(NewOrder[0]));\r
547 ASSERT(NewOrder != NULL);\r
548 CopyMem(NewOrder, CurrentOrder, (OrderCount)*sizeof(NewOrder[0]));\r
75aadf59 549\r
2398d9b1 550 //\r
551 // Insert target into order list\r
552 //\r
553 for (Index=OrderCount; Index > Position; Index--) {\r
554 NewOrder[Index] = NewOrder[Index-1];\r
555 }\r
75aadf59 556\r
2398d9b1 557 NewOrder[Position] = (UINT16) TargetLocation;\r
558 Status = gRT->SetVariable (\r
559 Target == BcfgTargetBootOrder?L"BootOrder":L"DriverOrder",\r
560 &gEfiGlobalVariableGuid,\r
561 EFI_VARIABLE_NON_VOLATILE|EFI_VARIABLE_BOOTSERVICE_ACCESS|EFI_VARIABLE_RUNTIME_ACCESS,\r
562 (OrderCount+1) * sizeof(UINT16),\r
563 NewOrder\r
564 );\r
75aadf59 565\r
2398d9b1 566 FreePool(NewOrder);\r
75aadf59 567\r
2398d9b1 568 if (EFI_ERROR(Status)) {\r
569 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_WRITE_FAIL), gShellInstall1HiiHandle, Target == BcfgTargetBootOrder?L"BootOrder":L"DriverOrder", Status);\r
570 ShellStatus = SHELL_INVALID_PARAMETER;\r
571 } else {\r
572 Print (L"bcfg: Add %s as %x\n", OptionStr, Position);\r
75aadf59 573 }\r
75aadf59 574 }\r
575 }\r
576\r
577//\r
578//If always Free FilePath, will free devicepath in system when use "addh"\r
579//\r
75aadf59 580 if (FilePath!=NULL && !UseHandle) {\r
581 FreePool (FilePath);\r
582 }\r
583\r
584 if (Str != NULL) {\r
585 FreePool(Str);\r
586 }\r
587\r
588 if (Handles != NULL) {\r
589 FreePool (Handles);\r
590 }\r
591\r
592 if (FileList != NULL) {\r
593 ShellCloseFileMetaArg (&FileList);\r
594 }\r
595\r
596 return (ShellStatus);\r
597}\r
598\r
2398d9b1 599/**\r
600 Funciton to remove an item.\r
601\r
602 @param[in] Target The target item to move.\r
603 @param[in] CurrentOrder The pointer to the current order of items.\r
604 @param[in] OrderCount The number if items in CurrentOrder.\r
605 @param[in] Location The current location of the Target.\r
606\r
607 @retval SHELL_SUCCESS The operation was successful.\r
608 @retval SHELL_INVALID_PARAMETER A parameter was invalid.\r
609**/\r
75aadf59 610SHELL_STATUS\r
611EFIAPI\r
2398d9b1 612BcfgRemoveInstall1(\r
75aadf59 613 IN CONST BCFG_OPERATION_TARGET Target,\r
614 IN CONST UINT16 *CurrentOrder,\r
615 IN CONST UINTN OrderCount,\r
6878e7a7 616 IN CONST UINT16 Location\r
75aadf59 617 )\r
618{\r
619 CHAR16 VariableName[12];\r
620 UINT16 *NewOrder;\r
621 EFI_STATUS Status;\r
2398d9b1 622 UINTN NewCount;\r
75aadf59 623\r
6878e7a7 624 UnicodeSPrint(VariableName, sizeof(VariableName), L"%s%04x", Target == BcfgTargetBootOrder?L"Boot":L"Driver", CurrentOrder[Location]);\r
75aadf59 625 Status = gRT->SetVariable(\r
2398d9b1 626 VariableName,\r
75aadf59 627 (EFI_GUID*)&gEfiGlobalVariableGuid,\r
628 EFI_VARIABLE_NON_VOLATILE|EFI_VARIABLE_BOOTSERVICE_ACCESS|EFI_VARIABLE_RUNTIME_ACCESS,\r
2398d9b1 629 0,\r
630 NULL);\r
75aadf59 631 if (EFI_ERROR(Status)) {\r
2398d9b1 632 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_WRITE_FAIL), gShellInstall1HiiHandle, VariableName, Status);\r
75aadf59 633 return (SHELL_INVALID_PARAMETER);\r
634 }\r
2398d9b1 635 NewOrder = AllocateZeroPool(OrderCount*sizeof(CurrentOrder[0]));\r
33c031ee 636 if (NewOrder != NULL) {\r
637 NewCount = OrderCount;\r
638 CopyMem(NewOrder, CurrentOrder, OrderCount*sizeof(CurrentOrder[0]));\r
6878e7a7 639 CopyMem(NewOrder+Location, NewOrder+Location+1, (OrderCount - Location - 1)*sizeof(CurrentOrder[0]));\r
640 NewCount--;\r
641\r
33c031ee 642 Status = gRT->SetVariable(\r
643 Target == BcfgTargetBootOrder?(CHAR16*)L"BootOrder":(CHAR16*)L"DriverOrder",\r
644 (EFI_GUID*)&gEfiGlobalVariableGuid,\r
645 EFI_VARIABLE_NON_VOLATILE|EFI_VARIABLE_BOOTSERVICE_ACCESS|EFI_VARIABLE_RUNTIME_ACCESS,\r
646 NewCount*sizeof(NewOrder[0]),\r
647 NewOrder);\r
648 FreePool(NewOrder);\r
649 } else {\r
650 Status = EFI_OUT_OF_RESOURCES;\r
2398d9b1 651 }\r
75aadf59 652 if (EFI_ERROR(Status)) {\r
2398d9b1 653 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_WRITE_FAIL), gShellInstall1HiiHandle, Target == BcfgTargetBootOrder?(CHAR16*)L"BootOrder":(CHAR16*)L"DriverOrder", Status);\r
75aadf59 654 return (SHELL_INVALID_PARAMETER);\r
655 }\r
75aadf59 656 return (SHELL_SUCCESS);\r
657}\r
658\r
2398d9b1 659/**\r
660 Funciton to move a item to another location.\r
661\r
662 @param[in] Target The target item to move.\r
663 @param[in] CurrentOrder The pointer to the current order of items.\r
664 @param[in] OrderCount The number if items in CurrentOrder.\r
665 @param[in] OldLocation The current location of the Target.\r
666 @param[in] NewLocation The desired location of the Target.\r
667\r
668 @retval SHELL_SUCCESS The operation was successful.\r
669 @retval SHELL_INVALID_PARAMETER A parameter was invalid.\r
670**/\r
75aadf59 671SHELL_STATUS\r
672EFIAPI\r
2398d9b1 673BcfgMoveInstall1(\r
75aadf59 674 IN CONST BCFG_OPERATION_TARGET Target,\r
675 IN CONST UINT16 *CurrentOrder,\r
676 IN CONST UINTN OrderCount,\r
677 IN CONST UINT16 OldLocation,\r
678 IN CONST UINT16 NewLocation\r
679 )\r
680{\r
681 UINT16 *NewOrder;\r
682 EFI_STATUS Status;\r
683 UINT16 Temp;\r
684\r
2398d9b1 685 NewOrder = AllocateZeroPool(OrderCount*sizeof(CurrentOrder[0]));\r
75aadf59 686 ASSERT(NewOrder != NULL);\r
687\r
688 Temp = CurrentOrder[OldLocation];\r
689 CopyMem(NewOrder, CurrentOrder, OrderCount*sizeof(CurrentOrder[0]));\r
690 CopyMem(NewOrder+OldLocation, NewOrder+OldLocation+1, (OrderCount - OldLocation - 1)*sizeof(CurrentOrder[0]));\r
2398d9b1 691 CopyMem(NewOrder+NewLocation+1, NewOrder+NewLocation, (OrderCount - NewLocation - 1)*sizeof(CurrentOrder[0]));\r
692 NewOrder[NewLocation] = Temp;\r
75aadf59 693\r
694\r
695 Status = gRT->SetVariable(\r
2398d9b1 696 Target == BcfgTargetBootOrder?(CHAR16*)L"BootOrder":(CHAR16*)L"DriverOrder",\r
75aadf59 697 (EFI_GUID*)&gEfiGlobalVariableGuid,\r
698 EFI_VARIABLE_NON_VOLATILE|EFI_VARIABLE_BOOTSERVICE_ACCESS|EFI_VARIABLE_RUNTIME_ACCESS,\r
699 OrderCount*sizeof(CurrentOrder[0]),\r
700 NewOrder);\r
701\r
702 FreePool(NewOrder);\r
703\r
704 if (EFI_ERROR(Status)) {\r
2398d9b1 705 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_WRITE_FAIL), gShellInstall1HiiHandle, Target == BcfgTargetBootOrder?(CHAR16*)L"BootOrder":(CHAR16*)L"DriverOrder", Status);\r
75aadf59 706 return (SHELL_INVALID_PARAMETER);\r
707 }\r
708 return (SHELL_SUCCESS);\r
709}\r
710\r
f2ad804f 711/**\r
712 Function to add optional data to an option.\r
713\r
714 @param[in] OptData The optional data to add.\r
e1d996b3 715 @param[in] CurrentOrder The pointer to the current order of items.\r
716 @param[in] OrderCount The number if items in CurrentOrder.\r
f2ad804f 717 @param[in] Target The target of the operation.\r
718\r
719 @retval SHELL_SUCCESS The operation was succesful.\r
720**/\r
75aadf59 721SHELL_STATUS\r
722EFIAPI\r
2398d9b1 723BcfgAddOptInstall1(\r
724 IN CONST CHAR16 *OptData,\r
e1d996b3 725 IN CONST UINT16 *CurrentOrder,\r
726 IN CONST UINTN OrderCount,\r
2398d9b1 727 IN CONST BCFG_OPERATION_TARGET Target\r
728 )\r
729{\r
e1d996b3 730 EFI_KEY_OPTION NewKeyOption;\r
731 EFI_KEY_OPTION *KeyOptionBuffer;\r
732 SHELL_STATUS ShellStatus;\r
733 EFI_STATUS Status;\r
734 UINT16 OptionIndex;\r
735 UINT16 LoopCounter;\r
736 UINT64 Intermediate;\r
737 CONST CHAR16 *Temp;\r
738 CONST CHAR16 *Walker;\r
739 CHAR16 *FileName;\r
740 CHAR16 *Temp2;\r
741 CHAR16 *Data;\r
742 UINT16 KeyIndex;\r
743 CHAR16 VariableName[12];\r
744\r
745 SHELL_FILE_HANDLE FileHandle;\r
746\r
747 Status = EFI_SUCCESS;\r
748 ShellStatus = SHELL_SUCCESS;\r
749 Walker = OptData;\r
750 FileName = NULL;\r
751 Data = NULL;\r
752 KeyOptionBuffer = NULL;\r
753\r
754 ZeroMem(&NewKeyOption, sizeof(EFI_KEY_OPTION));\r
755\r
756 while(Walker[0] == L' ') {\r
757 Walker++;\r
758 }\r
759\r
760 //\r
761 // Get the index of the variable we are changing.\r
762 //\r
763 Status = ShellConvertStringToUint64(Walker, &Intermediate, FALSE, TRUE);\r
764 if (EFI_ERROR(Status) || (((UINT16)Intermediate) != Intermediate) || StrStr(Walker, L" ") == NULL || ((UINT16)Intermediate) > ((UINT16)OrderCount)) {\r
765 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, L"Option Index");\r
766 ShellStatus = SHELL_INVALID_PARAMETER;\r
767 return (ShellStatus);\r
768 }\r
769 OptionIndex = (UINT16)Intermediate;\r
770\r
771 Temp = StrStr(Walker, L" ");\r
772 if (Temp != NULL) {\r
773 Walker = Temp;\r
774 }\r
775 while(Walker[0] == L' ') {\r
776 Walker++;\r
777 }\r
778\r
779 //\r
780 // determine whether we have file with data, quote delimited information, or a hot-key \r
781 //\r
782 if (Walker[0] == L'\"') {\r
783 //\r
784 // quoted filename or quoted information.\r
785 //\r
786 Temp = StrStr(Walker+1, L"\"");\r
787 if (Temp == NULL || StrLen(Temp) != 1) {\r
788 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, Walker);\r
789 ShellStatus = SHELL_INVALID_PARAMETER;\r
790 } else {\r
791 FileName = StrnCatGrow(&FileName, NULL, Walker+1, 0);\r
8d300003
ED
792 if (FileName == NULL) {\r
793 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellInstall1HiiHandle);\r
794 ShellStatus = SHELL_OUT_OF_RESOURCES;\r
795 return (ShellStatus);\r
796 }\r
e1d996b3 797 Temp2 = StrStr(FileName, L"\"");\r
798 ASSERT(Temp2 != NULL);\r
799 Temp2[0] = CHAR_NULL;\r
800 Temp2++;\r
801 if (StrLen(Temp2)>0) {\r
802 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, Walker);\r
803 ShellStatus = SHELL_INVALID_PARAMETER;\r
804 }\r
805 if (EFI_ERROR(ShellFileExists(Walker))) {\r
806 //\r
807 // Not a file. must be misc information.\r
808 //\r
809 Data = FileName;\r
810 FileName = NULL;\r
811 } else {\r
812 FileName = StrnCatGrow(&FileName, NULL, Walker, 0);\r
813 }\r
814 }\r
815 } else {\r
816 //\r
817 // filename or hot key information.\r
818 //\r
819 if (StrStr(Walker, L" ") == NULL) {\r
820 //\r
821 // filename\r
822 //\r
823 if (EFI_ERROR(ShellFileExists(Walker))) {\r
824 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FIND_FAIL), gShellInstall1HiiHandle, Walker);\r
825 ShellStatus = SHELL_INVALID_PARAMETER;\r
826 } else {\r
827 FileName = StrnCatGrow(&FileName, NULL, Walker, 0);\r
828 }\r
829 } else {\r
830 if (Target != BcfgTargetBootOrder) {\r
831 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_BOOT_ONLY), gShellInstall1HiiHandle);\r
832 ShellStatus = SHELL_INVALID_PARAMETER;\r
833 }\r
834\r
835 if (ShellStatus == SHELL_SUCCESS) {\r
836 //\r
837 // Get hot key information\r
838 //\r
839 Status = ShellConvertStringToUint64(Walker, &Intermediate, FALSE, TRUE);\r
840 if (EFI_ERROR(Status) || (((UINT32)Intermediate) != Intermediate) || StrStr(Walker, L" ") == NULL) {\r
841 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, Walker);\r
842 ShellStatus = SHELL_INVALID_PARAMETER;\r
843 }\r
6a34a2e4 844 NewKeyOption.KeyData = (UINT32)Intermediate;\r
e1d996b3 845 Temp = StrStr(Walker, L" ");\r
846 if (Temp != NULL) {\r
847 Walker = Temp;\r
848 }\r
849 while(Walker[0] == L' ') {\r
850 Walker++;\r
851 }\r
852 }\r
853\r
854 if (ShellStatus == SHELL_SUCCESS) {\r
855 //\r
856 // Now we know how many EFI_INPUT_KEY structs we need to attach to the end of the EFI_KEY_OPTION struct. \r
857 // Re-allocate with the added information.\r
858 //\r
7714cf7d 859 KeyOptionBuffer = AllocateCopyPool(sizeof(EFI_KEY_OPTION) + (sizeof(EFI_INPUT_KEY) * KEY_OPTION_INPUT_KEY_COUNT (&NewKeyOption)), &NewKeyOption);\r
e1d996b3 860 if (KeyOptionBuffer == NULL) {\r
861 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_MEM), gShellInstall1HiiHandle);\r
862 ShellStatus = SHELL_OUT_OF_RESOURCES;\r
863 }\r
864 }\r
6a34a2e4 865 for (LoopCounter = 0 ; ShellStatus == SHELL_SUCCESS && LoopCounter < KEY_OPTION_INPUT_KEY_COUNT (&NewKeyOption); LoopCounter++) {\r
e1d996b3 866 //\r
867 // ScanCode\r
868 //\r
869 Status = ShellConvertStringToUint64(Walker, &Intermediate, FALSE, TRUE);\r
870 if (EFI_ERROR(Status) || (((UINT16)Intermediate) != Intermediate) || StrStr(Walker, L" ") == NULL) {\r
871 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, Walker);\r
872 ShellStatus = SHELL_INVALID_PARAMETER;\r
873 }\r
874 ((EFI_INPUT_KEY*)(((UINT8*)KeyOptionBuffer) + sizeof(EFI_KEY_OPTION)))[LoopCounter].ScanCode = (UINT16)Intermediate;\r
875 Temp = StrStr(Walker, L" ");\r
876 if (Temp != NULL) {\r
877 Walker = Temp;\r
878 }\r
879 while(Walker[0] == L' ') {\r
880 Walker++;\r
881 }\r
882\r
883 //\r
884 // UnicodeChar\r
885 //\r
886 Status = ShellConvertStringToUint64(Walker, &Intermediate, FALSE, TRUE);\r
887 if (EFI_ERROR(Status) || (((UINT16)Intermediate) != Intermediate)) {\r
888 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, Walker);\r
889 ShellStatus = SHELL_INVALID_PARAMETER;\r
890 }\r
891 ((EFI_INPUT_KEY*)(((UINT8*)KeyOptionBuffer) + sizeof(EFI_KEY_OPTION)))[LoopCounter].UnicodeChar = (UINT16)Intermediate;\r
892 Temp = StrStr(Walker, L" ");\r
893 if (Temp != NULL) {\r
894 Walker = Temp;\r
895 }\r
896 while(Walker[0] == L' ') {\r
897 Walker++;\r
898 }\r
899 }\r
900\r
901 if (ShellStatus == SHELL_SUCCESS) {\r
902 //\r
903 // Now do the BootOption / BootOptionCrc\r
904 //\r
905 ASSERT (OptionIndex <= OrderCount);\r
906 KeyOptionBuffer->BootOption = CurrentOrder[OptionIndex];\r
907 Status = GetBootOptionCrc(&(KeyOptionBuffer->BootOptionCrc), KeyOptionBuffer->BootOption);\r
908 if (EFI_ERROR(Status)) {\r
909 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, L"Option Index");\r
910 ShellStatus = SHELL_INVALID_PARAMETER;\r
911 } \r
912 }\r
913\r
914 if (ShellStatus == SHELL_SUCCESS) {\r
915 for (Temp2 = NULL, KeyIndex = 0 ; KeyIndex < 0xFFFF ; KeyIndex++) {\r
916 UnicodeSPrint(VariableName, sizeof(VariableName), L"Key%04x", KeyIndex);\r
917 Status = gRT->GetVariable(\r
918 VariableName,\r
919 (EFI_GUID*)&gEfiGlobalVariableGuid,\r
920 NULL,\r
921 (UINTN*)&Intermediate,\r
922 NULL);\r
923 if (Status == EFI_NOT_FOUND) {\r
924 break;\r
925 }\r
926 }\r
927 Status = gRT->SetVariable(\r
928 VariableName,\r
929 (EFI_GUID*)&gEfiGlobalVariableGuid,\r
930 EFI_VARIABLE_NON_VOLATILE|EFI_VARIABLE_BOOTSERVICE_ACCESS|EFI_VARIABLE_RUNTIME_ACCESS,\r
7714cf7d 931 sizeof(EFI_KEY_OPTION) + (sizeof(EFI_INPUT_KEY) * KEY_OPTION_INPUT_KEY_COUNT (&NewKeyOption)),\r
e1d996b3 932 KeyOptionBuffer);\r
933 if (EFI_ERROR(Status)) {\r
934 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_SET_VAR_FAIL), gShellInstall1HiiHandle, VariableName, Status);\r
935 ShellStatus = SHELL_INVALID_PARAMETER;\r
936 } \r
937 ASSERT(FileName == NULL && Data == NULL);\r
938 }\r
939 }\r
940 }\r
941\r
942 //\r
943 // Shouldn't be possible to have have both. Neither is ok though.\r
944 //\r
945 ASSERT(FileName == NULL || Data == NULL);\r
946\r
479f85bb 947 if (ShellStatus == SHELL_SUCCESS && (FileName != NULL || Data != NULL)) {\r
e1d996b3 948 if (FileName != NULL) {\r
949 //\r
950 // Open the file and populate the data buffer.\r
951 //\r
287b4d32 952 Status = ShellOpenFileByName(\r
e1d996b3 953 FileName,\r
954 &FileHandle,\r
955 EFI_FILE_MODE_READ,\r
956 0);\r
287b4d32 957 if (!EFI_ERROR(Status)) {\r
958 Status = ShellGetFileSize(FileHandle, &Intermediate);\r
e1d996b3 959 }\r
960 Data = AllocateZeroPool((UINTN)Intermediate);\r
961 if (Data == NULL) {\r
962 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_MEM), gShellInstall1HiiHandle);\r
963 ShellStatus = SHELL_OUT_OF_RESOURCES;\r
964 }\r
287b4d32 965 if (!EFI_ERROR(Status)) {\r
966 Status = ShellReadFile(FileHandle, (UINTN *)&Intermediate, Data);\r
e1d996b3 967 }\r
968 } else {\r
969 Intermediate = StrSize(Data);\r
970 }\r
971\r
287b4d32 972 if (!EFI_ERROR(Status) && ShellStatus == SHELL_SUCCESS && Data != NULL) {\r
e1d996b3 973 Status = UpdateOptionalData(CurrentOrder[OptionIndex], (UINTN)Intermediate, (UINT8*)Data, Target);\r
974 if (EFI_ERROR(Status)) {\r
975 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_SET_VAR_FAIL), gShellInstall1HiiHandle, VariableName, Status);\r
976 ShellStatus = SHELL_INVALID_PARAMETER;\r
977 } \r
978 }\r
287b4d32 979 if (EFI_ERROR(Status) && ShellStatus == SHELL_SUCCESS) {\r
980 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_SET_VAR_FAIL), gShellInstall1HiiHandle, VariableName, Status);\r
981 ShellStatus = SHELL_INVALID_PARAMETER;\r
982 } \r
e1d996b3 983 }\r
984\r
985 SHELL_FREE_NON_NULL(Data);\r
986 SHELL_FREE_NON_NULL(KeyOptionBuffer);\r
987 SHELL_FREE_NON_NULL(FileName);\r
988 return ShellStatus;\r
2398d9b1 989}\r
990\r
991/**\r
992 Function to dump the Bcfg information.\r
993\r
994 @param[in] Op The operation.\r
995 @param[in] OrderCount How many to dump.\r
996 @param[in] CurrentOrder The pointer to the current order of items.\r
997 @param[in] VerboseOutput TRUE for extra output. FALSE otherwise.\r
998\r
999 @retval SHELL_SUCCESS The dump was successful.\r
1000 @retval SHELL_INVALID_PARAMETER A parameter was invalid.\r
1001**/\r
1002SHELL_STATUS\r
1003EFIAPI\r
1004BcfgDisplayDumpInstall1(\r
75aadf59 1005 IN CONST CHAR16 *Op,\r
75aadf59 1006 IN CONST UINTN OrderCount,\r
2398d9b1 1007 IN CONST UINT16 *CurrentOrder,\r
75aadf59 1008 IN CONST BOOLEAN VerboseOutput\r
1009 )\r
1010{\r
1011 EFI_STATUS Status;\r
1012 UINT8 *Buffer;\r
1013 UINTN BufferSize;\r
1014 CHAR16 VariableName[12];\r
1015 UINTN LoopVar;\r
1016 UINTN LoopVar2;\r
1017 CHAR16 *DevPathString;\r
1018 VOID *DevPath;\r
1019\r
2398d9b1 1020 if (OrderCount == 0) {\r
1021 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN(STR_BCFG_NONE), gShellInstall1HiiHandle);\r
1022 return (SHELL_SUCCESS);\r
1023 }\r
1024\r
75aadf59 1025 for (LoopVar = 0 ; LoopVar < OrderCount ; LoopVar++) {\r
1026 Buffer = NULL;\r
1027 BufferSize = 0;\r
1028 UnicodeSPrint(VariableName, sizeof(VariableName), L"%s%04x", Op, CurrentOrder[LoopVar]);\r
1029\r
1030 Status = gRT->GetVariable(\r
1031 VariableName,\r
1032 (EFI_GUID*)&gEfiGlobalVariableGuid,\r
1033 NULL,\r
1034 &BufferSize,\r
1035 Buffer);\r
1036 if (Status == EFI_BUFFER_TOO_SMALL) {\r
2398d9b1 1037 Buffer = AllocateZeroPool(BufferSize);\r
75aadf59 1038 Status = gRT->GetVariable(\r
1039 VariableName,\r
1040 (EFI_GUID*)&gEfiGlobalVariableGuid,\r
1041 NULL,\r
1042 &BufferSize,\r
1043 Buffer);\r
1044 }\r
1045\r
1046 if (EFI_ERROR(Status) || Buffer == NULL) {\r
75aadf59 1047 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_READ_FAIL), gShellInstall1HiiHandle, VariableName, Status);\r
1048 return (SHELL_INVALID_PARAMETER);\r
1049 }\r
1050\r
6878e7a7 1051 if ((*(UINT16*)(Buffer+4)) != 0) {\r
1052 DevPath = AllocateZeroPool(*(UINT16*)(Buffer+4));\r
1053 CopyMem(DevPath, Buffer+6+StrSize((CHAR16*)(Buffer+6)), *(UINT16*)(Buffer+4));\r
863986b3 1054 DevPathString = ConvertDevicePathToText(DevPath, TRUE, FALSE);\r
6878e7a7 1055 } else {\r
1056 DevPath = NULL;\r
1057 DevPathString = NULL;\r
1058 }\r
75aadf59 1059 ShellPrintHiiEx(\r
1060 -1,\r
1061 -1,\r
1062 NULL,\r
1063 STRING_TOKEN(STR_BCFG_LOAD_OPTIONS),\r
1064 gShellInstall1HiiHandle,\r
75aadf59 1065 LoopVar,\r
2398d9b1 1066 VariableName,\r
75aadf59 1067 (CHAR16*)(Buffer+6),\r
1068 DevPathString,\r
1069 (StrSize((CHAR16*)(Buffer+6)) + *(UINT16*)(Buffer+4) + 6) <= BufferSize?L'N':L'Y');\r
1070 if (VerboseOutput) {\r
1071 for (LoopVar2 = (StrSize((CHAR16*)(Buffer+6)) + *(UINT16*)(Buffer+4) + 6);LoopVar2<BufferSize;LoopVar2++){\r
2398d9b1 1072 ShellPrintEx(\r
1073 -1,\r
1074 -1,\r
1075 NULL,\r
1076 L"%02x",\r
1077 Buffer[LoopVar2]);\r
75aadf59 1078 }\r
2398d9b1 1079 ShellPrintEx(\r
1080 -1,\r
1081 -1,\r
1082 NULL,\r
1083 L"\r\n");\r
75aadf59 1084 }\r
1085\r
1086 if (Buffer != NULL) {\r
1087 FreePool(Buffer);\r
1088 }\r
1089 if (DevPath != NULL) {\r
1090 FreePool(DevPath);\r
1091 }\r
1092 if (DevPathString != NULL) {\r
1093 FreePool(DevPathString);\r
1094 }\r
1095 }\r
1096 return (SHELL_SUCCESS);\r
1097}\r
1098\r
2398d9b1 1099/**\r
1100 Function to initialize the BCFG operation structure.\r
1101\r
1102 @param[in] Struct The stuct to initialize.\r
1103**/\r
75aadf59 1104VOID\r
1105EFIAPI\r
2398d9b1 1106InitBcfgStructInstall1(\r
75aadf59 1107 IN BGFG_OPERATION *Struct\r
1108 )\r
1109{\r
1110 ASSERT(Struct != NULL);\r
2398d9b1 1111 Struct->Target = BcfgTargetMax;\r
1112 Struct->Type = BcfgTypeMax;\r
75aadf59 1113 Struct->Number1 = 0;\r
1114 Struct->Number2 = 0;\r
1115 Struct->HandleIndex = 0;\r
1116 Struct->FileName = NULL;\r
1117 Struct->Description = NULL;\r
1118 Struct->Order = NULL;\r
1119 Struct->OptData = NULL;\r
1120}\r
1121\r
1122\r
1123STATIC CONST SHELL_PARAM_ITEM ParamList[] = {\r
1124 {L"-v", TypeFlag},\r
1125 {L"-opt", TypeMaxValue},\r
1126 {NULL, TypeMax}\r
1127 };\r
1128\r
1129/**\r
1130 Function for 'bcfg' command.\r
1131\r
1132 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
1133 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
1134**/\r
1135SHELL_STATUS\r
1136EFIAPI\r
1137ShellCommandRunBcfgInstall (\r
1138 IN EFI_HANDLE ImageHandle,\r
1139 IN EFI_SYSTEM_TABLE *SystemTable\r
1140 )\r
1141{\r
1142 EFI_STATUS Status;\r
1143 LIST_ENTRY *Package;\r
1144 CHAR16 *ProblemParam;\r
1145 SHELL_STATUS ShellStatus;\r
1146 UINTN ParamNumber;\r
1147 CONST CHAR16 *CurrentParam;\r
1148 BGFG_OPERATION CurrentOperation;\r
1149 UINTN Length;\r
2398d9b1 1150 UINT64 Intermediate;\r
75aadf59 1151\r
1152 Length = 0;\r
1153 ProblemParam = NULL;\r
1154 Package = NULL;\r
1155 ShellStatus = SHELL_SUCCESS;\r
1156\r
2398d9b1 1157 InitBcfgStructInstall1(&CurrentOperation);\r
75aadf59 1158\r
1159 //\r
1160 // initialize the shell lib (we must be in non-auto-init...)\r
1161 //\r
1162 Status = ShellInitialize();\r
1163 ASSERT_EFI_ERROR(Status);\r
1164\r
1165 Status = CommandInit();\r
1166 ASSERT_EFI_ERROR(Status);\r
1167\r
1168 //\r
1169 // parse the command line\r
1170 //\r
1171 Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);\r
1172 if (EFI_ERROR(Status)) {\r
1173 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
1174 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, ProblemParam);\r
1175 FreePool(ProblemParam);\r
1176 ShellStatus = SHELL_INVALID_PARAMETER;\r
1177 } else {\r
1178 ASSERT(FALSE);\r
1179 }\r
1180 } else {\r
2398d9b1 1181 //\r
1182 // Read in if we are doing -OPT\r
1183 //\r
1184 if (ShellCommandLineGetFlag(Package, L"-opt")) {\r
1185 CurrentOperation.OptData = ShellCommandLineGetValue(Package, L"-opt");\r
1186 if (CurrentOperation.OptData == NULL) {\r
1187 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellInstall1HiiHandle, L"-opt");\r
1188 ShellStatus = SHELL_INVALID_PARAMETER;\r
1189 }\r
1190 CurrentOperation.Type = BcfgTypeOpt;\r
1191 }\r
1192\r
75aadf59 1193 //\r
1194 // small block to read the target of the operation\r
1195 //\r
2398d9b1 1196 if ((ShellCommandLineGetCount(Package) < 3 && CurrentOperation.Type != BcfgTypeOpt) ||\r
1197 (ShellCommandLineGetCount(Package) < 2 && CurrentOperation.Type == BcfgTypeOpt)\r
1198 ){\r
75aadf59 1199 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellInstall1HiiHandle);\r
1200 ShellStatus = SHELL_INVALID_PARAMETER;\r
1201 } else if (gUnicodeCollation->StriColl(gUnicodeCollation, (CHAR16*)ShellCommandLineGetRawValue(Package, 1), L"driver") == 0) {\r
2398d9b1 1202 CurrentOperation.Target = BcfgTargetDriverOrder;\r
75aadf59 1203 } else if (gUnicodeCollation->StriColl(gUnicodeCollation, (CHAR16*)ShellCommandLineGetRawValue(Package, 1), L"boot") == 0) {\r
2398d9b1 1204 CurrentOperation.Target = BcfgTargetBootOrder;\r
75aadf59 1205 } else {\r
1206 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_DRIVER_BOOT), gShellInstall1HiiHandle);\r
1207 ShellStatus = SHELL_INVALID_PARAMETER;\r
1208 }\r
1209\r
75aadf59 1210\r
1211 //\r
1212 // Read in the boot or driver order environment variable (not needed for opt)\r
1213 //\r
e1d996b3 1214 if (ShellStatus == SHELL_SUCCESS && CurrentOperation.Target < BcfgTargetMax) {\r
75aadf59 1215 Length = 0;\r
1216 Status = gRT->GetVariable(\r
2398d9b1 1217 CurrentOperation.Target == BcfgTargetBootOrder?(CHAR16*)L"BootOrder":(CHAR16*)L"DriverOrder",\r
75aadf59 1218 (EFI_GUID*)&gEfiGlobalVariableGuid,\r
1219 NULL,\r
1220 &Length,\r
1221 CurrentOperation.Order);\r
1222 if (Status == EFI_BUFFER_TOO_SMALL) {\r
2398d9b1 1223 CurrentOperation.Order = AllocateZeroPool(Length+(4*sizeof(CurrentOperation.Order[0])));\r
75aadf59 1224 Status = gRT->GetVariable(\r
2398d9b1 1225 CurrentOperation.Target == BcfgTargetBootOrder?(CHAR16*)L"BootOrder":(CHAR16*)L"DriverOrder",\r
75aadf59 1226 (EFI_GUID*)&gEfiGlobalVariableGuid,\r
1227 NULL,\r
1228 &Length,\r
1229 CurrentOperation.Order);\r
1230 }\r
1231 }\r
1232\r
1233 //\r
1234 // large block to read the type of operation and verify parameter types for the info.\r
1235 //\r
2398d9b1 1236 if (ShellStatus == SHELL_SUCCESS && CurrentOperation.Target < BcfgTargetMax) {\r
75aadf59 1237 for (ParamNumber = 2 ; ParamNumber < ShellCommandLineGetCount(Package) && ShellStatus == SHELL_SUCCESS; ParamNumber++) {\r
1238 CurrentParam = ShellCommandLineGetRawValue(Package, ParamNumber);\r
1239 if (gUnicodeCollation->StriColl(gUnicodeCollation, (CHAR16*)CurrentParam, L"dump") == 0) {\r
2398d9b1 1240 CurrentOperation.Type = BcfgTypeDump;\r
75aadf59 1241 } else if (ShellCommandLineGetFlag(Package, L"-v")) {\r
1242 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, L"-v (without dump)");\r
1243 ShellStatus = SHELL_INVALID_PARAMETER;\r
1244 } else if (gUnicodeCollation->StriColl(gUnicodeCollation, (CHAR16*)CurrentParam, L"add") == 0) {\r
1245 if ((ParamNumber + 3) >= ShellCommandLineGetCount(Package)) {\r
1246 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellInstall1HiiHandle);\r
1247 ShellStatus = SHELL_INVALID_PARAMETER;\r
1248 }\r
2398d9b1 1249 CurrentOperation.Type = BcfgTypeAdd;\r
75aadf59 1250 CurrentParam = ShellCommandLineGetRawValue(Package, ++ParamNumber);\r
1251 if (CurrentParam == NULL || !ShellIsHexOrDecimalNumber(CurrentParam, TRUE, FALSE)) {\r
1252 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, CurrentParam);\r
1253 ShellStatus = SHELL_INVALID_PARAMETER;\r
1254 } else {\r
2398d9b1 1255 Status = ShellConvertStringToUint64(CurrentParam, &Intermediate, TRUE, FALSE);\r
1256 CurrentOperation.Number1 = (UINT16)Intermediate;\r
75aadf59 1257 ASSERT(CurrentOperation.FileName == NULL);\r
1258 CurrentOperation.FileName = StrnCatGrow(&CurrentOperation.FileName , NULL, ShellCommandLineGetRawValue(Package, ++ParamNumber), 0);\r
1259 ASSERT(CurrentOperation.Description == NULL);\r
1260 CurrentOperation.Description = StrnCatGrow(&CurrentOperation.Description, NULL, ShellCommandLineGetRawValue(Package, ++ParamNumber), 0);\r
1261 }\r
1262 } else if (gUnicodeCollation->StriColl(gUnicodeCollation, (CHAR16*)CurrentParam, L"addp") == 0) {\r
1263 if ((ParamNumber + 3) >= ShellCommandLineGetCount(Package)) {\r
1264 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellInstall1HiiHandle);\r
1265 ShellStatus = SHELL_INVALID_PARAMETER;\r
2398d9b1 1266 }\r
1267 CurrentOperation.Type = BcfgTypeAddp;\r
1268 CurrentParam = ShellCommandLineGetRawValue(Package, ++ParamNumber);\r
1269 if (CurrentParam == NULL || !ShellIsHexOrDecimalNumber(CurrentParam, TRUE, FALSE)) {\r
1270 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, CurrentParam);\r
1271 ShellStatus = SHELL_INVALID_PARAMETER;\r
75aadf59 1272 } else {\r
2398d9b1 1273 Status = ShellConvertStringToUint64(CurrentParam, &Intermediate, TRUE, FALSE);\r
1274 CurrentOperation.Number1 = (UINT16)Intermediate;\r
1275 ASSERT(CurrentOperation.FileName == NULL);\r
1276 CurrentOperation.FileName = StrnCatGrow(&CurrentOperation.FileName , NULL, ShellCommandLineGetRawValue(Package, ++ParamNumber), 0);\r
1277 ASSERT(CurrentOperation.Description == NULL);\r
1278 CurrentOperation.Description = StrnCatGrow(&CurrentOperation.Description, NULL, ShellCommandLineGetRawValue(Package, ++ParamNumber), 0);\r
75aadf59 1279 }\r
1280 } else if (gUnicodeCollation->StriColl(gUnicodeCollation, (CHAR16*)CurrentParam, L"addh") == 0) {\r
1281 if ((ParamNumber + 3) >= ShellCommandLineGetCount(Package)) {\r
1282 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellInstall1HiiHandle);\r
1283 ShellStatus = SHELL_INVALID_PARAMETER;\r
1284 }\r
2398d9b1 1285 CurrentOperation.Type = BcfgTypeAddh;\r
75aadf59 1286 CurrentParam = ShellCommandLineGetRawValue(Package, ++ParamNumber);\r
1287 if (CurrentParam == NULL || !ShellIsHexOrDecimalNumber(CurrentParam, TRUE, FALSE)) {\r
1288 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, CurrentParam);\r
1289 ShellStatus = SHELL_INVALID_PARAMETER;\r
1290 } else {\r
2398d9b1 1291 Status = ShellConvertStringToUint64(CurrentParam, &Intermediate, TRUE, FALSE);\r
1292 CurrentOperation.Number1 = (UINT16)Intermediate;\r
75aadf59 1293 CurrentParam = ShellCommandLineGetRawValue(Package, ++ParamNumber);\r
1294 if (CurrentParam == NULL || !ShellIsHexOrDecimalNumber(CurrentParam, TRUE, FALSE)) {\r
1295 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, CurrentParam);\r
1296 ShellStatus = SHELL_INVALID_PARAMETER;\r
1297 } else {\r
2398d9b1 1298 Status = ShellConvertStringToUint64(CurrentParam, &Intermediate, TRUE, FALSE);\r
1299 CurrentOperation.HandleIndex = (UINT16)Intermediate;\r
75aadf59 1300 ASSERT(CurrentOperation.Description == NULL);\r
1301 CurrentOperation.Description = StrnCatGrow(&CurrentOperation.Description, NULL, ShellCommandLineGetRawValue(Package, ++ParamNumber), 0);\r
1302 }\r
1303 }\r
1304 } else if (gUnicodeCollation->StriColl(gUnicodeCollation, (CHAR16*)CurrentParam, L"rm") == 0) {\r
1305 if ((ParamNumber + 1) >= ShellCommandLineGetCount(Package)) {\r
1306 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellInstall1HiiHandle);\r
1307 ShellStatus = SHELL_INVALID_PARAMETER;\r
1308 }\r
2398d9b1 1309 CurrentOperation.Type = BcfgTypeRm;\r
75aadf59 1310 CurrentParam = ShellCommandLineGetRawValue(Package, ++ParamNumber);\r
1311 if (CurrentParam == NULL || !ShellIsHexOrDecimalNumber(CurrentParam, TRUE, FALSE)) {\r
1312 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, CurrentParam);\r
1313 ShellStatus = SHELL_INVALID_PARAMETER;\r
1314 } else {\r
2398d9b1 1315 Status = ShellConvertStringToUint64(CurrentParam, &Intermediate, TRUE, FALSE);\r
1316 CurrentOperation.Number1 = (UINT16)Intermediate;\r
75aadf59 1317 if (CurrentOperation.Number1 > (Length / sizeof(CurrentOperation.Order[0]))){\r
2398d9b1 1318 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_NUMB_RANGE), gShellInstall1HiiHandle, Length / sizeof(CurrentOperation.Order[0]));\r
75aadf59 1319 ShellStatus = SHELL_INVALID_PARAMETER;\r
1320 }\r
1321 }\r
1322 } else if (gUnicodeCollation->StriColl(gUnicodeCollation, (CHAR16*)CurrentParam, L"mv") == 0) {\r
1323 if ((ParamNumber + 2) >= ShellCommandLineGetCount(Package)) {\r
1324 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellInstall1HiiHandle);\r
1325 ShellStatus = SHELL_INVALID_PARAMETER;\r
1326 }\r
2398d9b1 1327 CurrentOperation.Type = BcfgTypeMv;\r
75aadf59 1328 CurrentParam = ShellCommandLineGetRawValue(Package, ++ParamNumber);\r
1329 if (CurrentParam == NULL || !ShellIsHexOrDecimalNumber(CurrentParam, TRUE, FALSE)) {\r
1330 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, CurrentParam);\r
1331 ShellStatus = SHELL_INVALID_PARAMETER;\r
1332 } else {\r
2398d9b1 1333 Status = ShellConvertStringToUint64(CurrentParam, &Intermediate, TRUE, FALSE);\r
1334 CurrentOperation.Number1 = (UINT16)Intermediate;\r
75aadf59 1335 if (CurrentOperation.Number1 > (Length / sizeof(CurrentOperation.Order[0]))){\r
2398d9b1 1336 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_NUMB_RANGE), gShellInstall1HiiHandle, Length / sizeof(CurrentOperation.Order[0]));\r
75aadf59 1337 ShellStatus = SHELL_INVALID_PARAMETER;\r
1338 }\r
1339 CurrentParam = ShellCommandLineGetRawValue(Package, ++ParamNumber);\r
1340 if (CurrentParam == NULL || !ShellIsHexOrDecimalNumber(CurrentParam, TRUE, FALSE)) {\r
1341 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, CurrentParam);\r
1342 ShellStatus = SHELL_INVALID_PARAMETER;\r
1343 } else {\r
2398d9b1 1344 Status = ShellConvertStringToUint64(CurrentParam, &Intermediate, TRUE, FALSE);\r
1345 CurrentOperation.Number2 = (UINT16)Intermediate;\r
75aadf59 1346 }\r
1347 if (CurrentOperation.Number2 == CurrentOperation.Number1\r
1348 ||CurrentOperation.Number1 > (Length / sizeof(CurrentOperation.Order[0]))\r
1349 ||CurrentOperation.Number2 > (Length / sizeof(CurrentOperation.Order[0]))\r
1350 ){\r
2398d9b1 1351 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_NUMB_RANGE), gShellInstall1HiiHandle, Length / sizeof(CurrentOperation.Order[0]));\r
75aadf59 1352 ShellStatus = SHELL_INVALID_PARAMETER;\r
1353 }\r
1354 }\r
1355 } else {\r
1356 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, CurrentParam);\r
1357 ShellStatus = SHELL_INVALID_PARAMETER;\r
1358 }\r
1359 }\r
1360 }\r
2398d9b1 1361 if (ShellStatus == SHELL_SUCCESS && CurrentOperation.Target < BcfgTargetMax && CurrentOperation.Type < BcfgTypeMax) {\r
75aadf59 1362 //\r
1363 // we have all the info. Do the work\r
1364 //\r
1365 switch (CurrentOperation.Type) {\r
2398d9b1 1366 case BcfgTypeDump:\r
1367 ShellStatus = BcfgDisplayDumpInstall1(\r
1368 CurrentOperation.Target == BcfgTargetBootOrder?L"Boot":L"Driver",\r
75aadf59 1369 Length / sizeof(CurrentOperation.Order[0]),\r
2398d9b1 1370 CurrentOperation.Order,\r
75aadf59 1371 ShellCommandLineGetFlag(Package, L"-v"));\r
1372 break;\r
2398d9b1 1373 case BcfgTypeMv:\r
1374 ShellStatus = BcfgMoveInstall1(\r
75aadf59 1375 CurrentOperation.Target,\r
1376 CurrentOperation.Order,\r
1377 Length / sizeof(CurrentOperation.Order[0]),\r
1378 CurrentOperation.Number1,\r
1379 CurrentOperation.Number2);\r
1380 break;\r
2398d9b1 1381 case BcfgTypeRm:\r
1382 ShellStatus = BcfgRemoveInstall1(\r
75aadf59 1383 CurrentOperation.Target,\r
1384 CurrentOperation.Order,\r
2398d9b1 1385 Length / sizeof(CurrentOperation.Order[0]),\r
75aadf59 1386 CurrentOperation.Number1);\r
1387 break;\r
2398d9b1 1388 case BcfgTypeAdd:\r
1389 case BcfgTypeAddp:\r
1390 case BcfgTypeAddh:\r
1391 ShellStatus = BcfgAddInstall1(\r
75aadf59 1392 CurrentOperation.Number1,\r
1393 CurrentOperation.FileName,\r
532691c8 1394 CurrentOperation.Description==NULL?L"":CurrentOperation.Description,\r
75aadf59 1395 CurrentOperation.Order,\r
1396 Length / sizeof(CurrentOperation.Order[0]),\r
1397 CurrentOperation.Target,\r
2398d9b1 1398 (BOOLEAN)(CurrentOperation.Type == BcfgTypeAddh),\r
1399 (BOOLEAN)(CurrentOperation.Type == BcfgTypeAddp),\r
75aadf59 1400 CurrentOperation.HandleIndex);\r
1401 break;\r
2398d9b1 1402 case BcfgTypeOpt:\r
1403 ShellStatus = BcfgAddOptInstall1(\r
1404 CurrentOperation.OptData,\r
e1d996b3 1405 CurrentOperation.Order,\r
1406 Length / sizeof(CurrentOperation.Order[0]),\r
2398d9b1 1407 CurrentOperation.Target);\r
75aadf59 1408 break;\r
1409 default:\r
1410 ASSERT(FALSE);\r
1411 }\r
1412 }\r
1413 }\r
1414\r
1415 if (Package != NULL) {\r
1416 ShellCommandLineFreeVarList (Package);\r
1417 }\r
1418 if (CurrentOperation.FileName != NULL) {\r
1419 FreePool(CurrentOperation.FileName);\r
1420 }\r
1421 if (CurrentOperation.Description != NULL) {\r
1422 FreePool(CurrentOperation.Description);\r
1423 }\r
1424 if (CurrentOperation.Order != NULL) {\r
1425 FreePool(CurrentOperation.Order);\r
1426 }\r
1427\r
1428 return (ShellStatus);\r
1429}\r