]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellInstall1CommandsLib/Bcfg.c
Update all the code to consume the ConvertDevicePathToText, ConvertDevicePathNodeToTe...
[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
526 CopyMem (TempByteBuffer, FilePath, FilePathSize);\r
75aadf59 527\r
33c031ee 528 UnicodeSPrint (OptionStr, sizeof(OptionStr), L"%s%04x", Target == BcfgTargetBootOrder?L"Boot":L"Driver", TargetLocation);\r
529 Status = gRT->SetVariable (\r
530 OptionStr,\r
531 &gEfiGlobalVariableGuid,\r
532 EFI_VARIABLE_NON_VOLATILE|EFI_VARIABLE_BOOTSERVICE_ACCESS|EFI_VARIABLE_RUNTIME_ACCESS,\r
533 sizeof(UINT32) + sizeof(UINT16) + DescSize + FilePathSize,\r
534 TempByteStart\r
535 );\r
536\r
537 FreePool(TempByteStart);\r
538 } else {\r
539 Status = EFI_OUT_OF_RESOURCES;\r
540 }\r
75aadf59 541\r
2398d9b1 542 if (EFI_ERROR(Status)) {\r
543 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_SET_VAR_FAIL), gShellInstall1HiiHandle, OptionStr, Status);\r
544 } else {\r
545 NewOrder = AllocateZeroPool((OrderCount+1)*sizeof(NewOrder[0]));\r
546 ASSERT(NewOrder != NULL);\r
547 CopyMem(NewOrder, CurrentOrder, (OrderCount)*sizeof(NewOrder[0]));\r
75aadf59 548\r
2398d9b1 549 //\r
550 // Insert target into order list\r
551 //\r
552 for (Index=OrderCount; Index > Position; Index--) {\r
553 NewOrder[Index] = NewOrder[Index-1];\r
554 }\r
75aadf59 555\r
2398d9b1 556 NewOrder[Position] = (UINT16) TargetLocation;\r
557 Status = gRT->SetVariable (\r
558 Target == BcfgTargetBootOrder?L"BootOrder":L"DriverOrder",\r
559 &gEfiGlobalVariableGuid,\r
560 EFI_VARIABLE_NON_VOLATILE|EFI_VARIABLE_BOOTSERVICE_ACCESS|EFI_VARIABLE_RUNTIME_ACCESS,\r
561 (OrderCount+1) * sizeof(UINT16),\r
562 NewOrder\r
563 );\r
75aadf59 564\r
2398d9b1 565 FreePool(NewOrder);\r
75aadf59 566\r
2398d9b1 567 if (EFI_ERROR(Status)) {\r
568 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_WRITE_FAIL), gShellInstall1HiiHandle, Target == BcfgTargetBootOrder?L"BootOrder":L"DriverOrder", Status);\r
569 ShellStatus = SHELL_INVALID_PARAMETER;\r
570 } else {\r
571 Print (L"bcfg: Add %s as %x\n", OptionStr, Position);\r
75aadf59 572 }\r
75aadf59 573 }\r
574 }\r
575\r
576//\r
577//If always Free FilePath, will free devicepath in system when use "addh"\r
578//\r
75aadf59 579 if (FilePath!=NULL && !UseHandle) {\r
580 FreePool (FilePath);\r
581 }\r
582\r
583 if (Str != NULL) {\r
584 FreePool(Str);\r
585 }\r
586\r
587 if (Handles != NULL) {\r
588 FreePool (Handles);\r
589 }\r
590\r
591 if (FileList != NULL) {\r
592 ShellCloseFileMetaArg (&FileList);\r
593 }\r
594\r
595 return (ShellStatus);\r
596}\r
597\r
2398d9b1 598/**\r
599 Funciton to remove an item.\r
600\r
601 @param[in] Target The target item to move.\r
602 @param[in] CurrentOrder The pointer to the current order of items.\r
603 @param[in] OrderCount The number if items in CurrentOrder.\r
604 @param[in] Location The current location of the Target.\r
605\r
606 @retval SHELL_SUCCESS The operation was successful.\r
607 @retval SHELL_INVALID_PARAMETER A parameter was invalid.\r
608**/\r
75aadf59 609SHELL_STATUS\r
610EFIAPI\r
2398d9b1 611BcfgRemoveInstall1(\r
75aadf59 612 IN CONST BCFG_OPERATION_TARGET Target,\r
613 IN CONST UINT16 *CurrentOrder,\r
614 IN CONST UINTN OrderCount,\r
6878e7a7 615 IN CONST UINT16 Location\r
75aadf59 616 )\r
617{\r
618 CHAR16 VariableName[12];\r
619 UINT16 *NewOrder;\r
620 EFI_STATUS Status;\r
2398d9b1 621 UINTN NewCount;\r
75aadf59 622\r
6878e7a7 623 UnicodeSPrint(VariableName, sizeof(VariableName), L"%s%04x", Target == BcfgTargetBootOrder?L"Boot":L"Driver", CurrentOrder[Location]);\r
75aadf59 624 Status = gRT->SetVariable(\r
2398d9b1 625 VariableName,\r
75aadf59 626 (EFI_GUID*)&gEfiGlobalVariableGuid,\r
627 EFI_VARIABLE_NON_VOLATILE|EFI_VARIABLE_BOOTSERVICE_ACCESS|EFI_VARIABLE_RUNTIME_ACCESS,\r
2398d9b1 628 0,\r
629 NULL);\r
75aadf59 630 if (EFI_ERROR(Status)) {\r
2398d9b1 631 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_WRITE_FAIL), gShellInstall1HiiHandle, VariableName, Status);\r
75aadf59 632 return (SHELL_INVALID_PARAMETER);\r
633 }\r
2398d9b1 634 NewOrder = AllocateZeroPool(OrderCount*sizeof(CurrentOrder[0]));\r
33c031ee 635 if (NewOrder != NULL) {\r
636 NewCount = OrderCount;\r
637 CopyMem(NewOrder, CurrentOrder, OrderCount*sizeof(CurrentOrder[0]));\r
6878e7a7 638 CopyMem(NewOrder+Location, NewOrder+Location+1, (OrderCount - Location - 1)*sizeof(CurrentOrder[0]));\r
639 NewCount--;\r
640\r
33c031ee 641 Status = gRT->SetVariable(\r
642 Target == BcfgTargetBootOrder?(CHAR16*)L"BootOrder":(CHAR16*)L"DriverOrder",\r
643 (EFI_GUID*)&gEfiGlobalVariableGuid,\r
644 EFI_VARIABLE_NON_VOLATILE|EFI_VARIABLE_BOOTSERVICE_ACCESS|EFI_VARIABLE_RUNTIME_ACCESS,\r
645 NewCount*sizeof(NewOrder[0]),\r
646 NewOrder);\r
647 FreePool(NewOrder);\r
648 } else {\r
649 Status = EFI_OUT_OF_RESOURCES;\r
2398d9b1 650 }\r
75aadf59 651 if (EFI_ERROR(Status)) {\r
2398d9b1 652 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_WRITE_FAIL), gShellInstall1HiiHandle, Target == BcfgTargetBootOrder?(CHAR16*)L"BootOrder":(CHAR16*)L"DriverOrder", Status);\r
75aadf59 653 return (SHELL_INVALID_PARAMETER);\r
654 }\r
75aadf59 655 return (SHELL_SUCCESS);\r
656}\r
657\r
2398d9b1 658/**\r
659 Funciton to move a item to another location.\r
660\r
661 @param[in] Target The target item to move.\r
662 @param[in] CurrentOrder The pointer to the current order of items.\r
663 @param[in] OrderCount The number if items in CurrentOrder.\r
664 @param[in] OldLocation The current location of the Target.\r
665 @param[in] NewLocation The desired location of the Target.\r
666\r
667 @retval SHELL_SUCCESS The operation was successful.\r
668 @retval SHELL_INVALID_PARAMETER A parameter was invalid.\r
669**/\r
75aadf59 670SHELL_STATUS\r
671EFIAPI\r
2398d9b1 672BcfgMoveInstall1(\r
75aadf59 673 IN CONST BCFG_OPERATION_TARGET Target,\r
674 IN CONST UINT16 *CurrentOrder,\r
675 IN CONST UINTN OrderCount,\r
676 IN CONST UINT16 OldLocation,\r
677 IN CONST UINT16 NewLocation\r
678 )\r
679{\r
680 UINT16 *NewOrder;\r
681 EFI_STATUS Status;\r
682 UINT16 Temp;\r
683\r
2398d9b1 684 NewOrder = AllocateZeroPool(OrderCount*sizeof(CurrentOrder[0]));\r
75aadf59 685 ASSERT(NewOrder != NULL);\r
686\r
687 Temp = CurrentOrder[OldLocation];\r
688 CopyMem(NewOrder, CurrentOrder, OrderCount*sizeof(CurrentOrder[0]));\r
689 CopyMem(NewOrder+OldLocation, NewOrder+OldLocation+1, (OrderCount - OldLocation - 1)*sizeof(CurrentOrder[0]));\r
2398d9b1 690 CopyMem(NewOrder+NewLocation+1, NewOrder+NewLocation, (OrderCount - NewLocation - 1)*sizeof(CurrentOrder[0]));\r
691 NewOrder[NewLocation] = Temp;\r
75aadf59 692\r
693\r
694 Status = gRT->SetVariable(\r
2398d9b1 695 Target == BcfgTargetBootOrder?(CHAR16*)L"BootOrder":(CHAR16*)L"DriverOrder",\r
75aadf59 696 (EFI_GUID*)&gEfiGlobalVariableGuid,\r
697 EFI_VARIABLE_NON_VOLATILE|EFI_VARIABLE_BOOTSERVICE_ACCESS|EFI_VARIABLE_RUNTIME_ACCESS,\r
698 OrderCount*sizeof(CurrentOrder[0]),\r
699 NewOrder);\r
700\r
701 FreePool(NewOrder);\r
702\r
703 if (EFI_ERROR(Status)) {\r
2398d9b1 704 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_WRITE_FAIL), gShellInstall1HiiHandle, Target == BcfgTargetBootOrder?(CHAR16*)L"BootOrder":(CHAR16*)L"DriverOrder", Status);\r
75aadf59 705 return (SHELL_INVALID_PARAMETER);\r
706 }\r
707 return (SHELL_SUCCESS);\r
708}\r
709\r
f2ad804f 710/**\r
711 Function to add optional data to an option.\r
712\r
713 @param[in] OptData The optional data to add.\r
e1d996b3 714 @param[in] CurrentOrder The pointer to the current order of items.\r
715 @param[in] OrderCount The number if items in CurrentOrder.\r
f2ad804f 716 @param[in] Target The target of the operation.\r
717\r
718 @retval SHELL_SUCCESS The operation was succesful.\r
719**/\r
75aadf59 720SHELL_STATUS\r
721EFIAPI\r
2398d9b1 722BcfgAddOptInstall1(\r
723 IN CONST CHAR16 *OptData,\r
e1d996b3 724 IN CONST UINT16 *CurrentOrder,\r
725 IN CONST UINTN OrderCount,\r
2398d9b1 726 IN CONST BCFG_OPERATION_TARGET Target\r
727 )\r
728{\r
e1d996b3 729 EFI_KEY_OPTION NewKeyOption;\r
730 EFI_KEY_OPTION *KeyOptionBuffer;\r
731 SHELL_STATUS ShellStatus;\r
732 EFI_STATUS Status;\r
733 UINT16 OptionIndex;\r
734 UINT16 LoopCounter;\r
735 UINT64 Intermediate;\r
736 CONST CHAR16 *Temp;\r
737 CONST CHAR16 *Walker;\r
738 CHAR16 *FileName;\r
739 CHAR16 *Temp2;\r
740 CHAR16 *Data;\r
741 UINT16 KeyIndex;\r
742 CHAR16 VariableName[12];\r
743\r
744 SHELL_FILE_HANDLE FileHandle;\r
745\r
746 Status = EFI_SUCCESS;\r
747 ShellStatus = SHELL_SUCCESS;\r
748 Walker = OptData;\r
749 FileName = NULL;\r
750 Data = NULL;\r
751 KeyOptionBuffer = NULL;\r
752\r
753 ZeroMem(&NewKeyOption, sizeof(EFI_KEY_OPTION));\r
754\r
755 while(Walker[0] == L' ') {\r
756 Walker++;\r
757 }\r
758\r
759 //\r
760 // Get the index of the variable we are changing.\r
761 //\r
762 Status = ShellConvertStringToUint64(Walker, &Intermediate, FALSE, TRUE);\r
763 if (EFI_ERROR(Status) || (((UINT16)Intermediate) != Intermediate) || StrStr(Walker, L" ") == NULL || ((UINT16)Intermediate) > ((UINT16)OrderCount)) {\r
764 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, L"Option Index");\r
765 ShellStatus = SHELL_INVALID_PARAMETER;\r
766 return (ShellStatus);\r
767 }\r
768 OptionIndex = (UINT16)Intermediate;\r
769\r
770 Temp = StrStr(Walker, L" ");\r
771 if (Temp != NULL) {\r
772 Walker = Temp;\r
773 }\r
774 while(Walker[0] == L' ') {\r
775 Walker++;\r
776 }\r
777\r
778 //\r
779 // determine whether we have file with data, quote delimited information, or a hot-key \r
780 //\r
781 if (Walker[0] == L'\"') {\r
782 //\r
783 // quoted filename or quoted information.\r
784 //\r
785 Temp = StrStr(Walker+1, L"\"");\r
786 if (Temp == NULL || StrLen(Temp) != 1) {\r
787 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, Walker);\r
788 ShellStatus = SHELL_INVALID_PARAMETER;\r
789 } else {\r
790 FileName = StrnCatGrow(&FileName, NULL, Walker+1, 0);\r
8d300003
ED
791 if (FileName == NULL) {\r
792 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellInstall1HiiHandle);\r
793 ShellStatus = SHELL_OUT_OF_RESOURCES;\r
794 return (ShellStatus);\r
795 }\r
e1d996b3 796 Temp2 = StrStr(FileName, L"\"");\r
797 ASSERT(Temp2 != NULL);\r
798 Temp2[0] = CHAR_NULL;\r
799 Temp2++;\r
800 if (StrLen(Temp2)>0) {\r
801 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, Walker);\r
802 ShellStatus = SHELL_INVALID_PARAMETER;\r
803 }\r
804 if (EFI_ERROR(ShellFileExists(Walker))) {\r
805 //\r
806 // Not a file. must be misc information.\r
807 //\r
808 Data = FileName;\r
809 FileName = NULL;\r
810 } else {\r
811 FileName = StrnCatGrow(&FileName, NULL, Walker, 0);\r
812 }\r
813 }\r
814 } else {\r
815 //\r
816 // filename or hot key information.\r
817 //\r
818 if (StrStr(Walker, L" ") == NULL) {\r
819 //\r
820 // filename\r
821 //\r
822 if (EFI_ERROR(ShellFileExists(Walker))) {\r
823 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FIND_FAIL), gShellInstall1HiiHandle, Walker);\r
824 ShellStatus = SHELL_INVALID_PARAMETER;\r
825 } else {\r
826 FileName = StrnCatGrow(&FileName, NULL, Walker, 0);\r
827 }\r
828 } else {\r
829 if (Target != BcfgTargetBootOrder) {\r
830 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_BOOT_ONLY), gShellInstall1HiiHandle);\r
831 ShellStatus = SHELL_INVALID_PARAMETER;\r
832 }\r
833\r
834 if (ShellStatus == SHELL_SUCCESS) {\r
835 //\r
836 // Get hot key information\r
837 //\r
838 Status = ShellConvertStringToUint64(Walker, &Intermediate, FALSE, TRUE);\r
839 if (EFI_ERROR(Status) || (((UINT32)Intermediate) != Intermediate) || StrStr(Walker, L" ") == NULL) {\r
840 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, Walker);\r
841 ShellStatus = SHELL_INVALID_PARAMETER;\r
842 }\r
6a34a2e4 843 NewKeyOption.KeyData = (UINT32)Intermediate;\r
e1d996b3 844 Temp = StrStr(Walker, L" ");\r
845 if (Temp != NULL) {\r
846 Walker = Temp;\r
847 }\r
848 while(Walker[0] == L' ') {\r
849 Walker++;\r
850 }\r
851 }\r
852\r
853 if (ShellStatus == SHELL_SUCCESS) {\r
854 //\r
855 // Now we know how many EFI_INPUT_KEY structs we need to attach to the end of the EFI_KEY_OPTION struct. \r
856 // Re-allocate with the added information.\r
857 //\r
7714cf7d 858 KeyOptionBuffer = AllocateCopyPool(sizeof(EFI_KEY_OPTION) + (sizeof(EFI_INPUT_KEY) * KEY_OPTION_INPUT_KEY_COUNT (&NewKeyOption)), &NewKeyOption);\r
e1d996b3 859 if (KeyOptionBuffer == NULL) {\r
860 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_MEM), gShellInstall1HiiHandle);\r
861 ShellStatus = SHELL_OUT_OF_RESOURCES;\r
862 }\r
863 }\r
6a34a2e4 864 for (LoopCounter = 0 ; ShellStatus == SHELL_SUCCESS && LoopCounter < KEY_OPTION_INPUT_KEY_COUNT (&NewKeyOption); LoopCounter++) {\r
e1d996b3 865 //\r
866 // ScanCode\r
867 //\r
868 Status = ShellConvertStringToUint64(Walker, &Intermediate, FALSE, TRUE);\r
869 if (EFI_ERROR(Status) || (((UINT16)Intermediate) != Intermediate) || StrStr(Walker, L" ") == NULL) {\r
870 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, Walker);\r
871 ShellStatus = SHELL_INVALID_PARAMETER;\r
872 }\r
873 ((EFI_INPUT_KEY*)(((UINT8*)KeyOptionBuffer) + sizeof(EFI_KEY_OPTION)))[LoopCounter].ScanCode = (UINT16)Intermediate;\r
874 Temp = StrStr(Walker, L" ");\r
875 if (Temp != NULL) {\r
876 Walker = Temp;\r
877 }\r
878 while(Walker[0] == L' ') {\r
879 Walker++;\r
880 }\r
881\r
882 //\r
883 // UnicodeChar\r
884 //\r
885 Status = ShellConvertStringToUint64(Walker, &Intermediate, FALSE, TRUE);\r
886 if (EFI_ERROR(Status) || (((UINT16)Intermediate) != Intermediate)) {\r
887 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, Walker);\r
888 ShellStatus = SHELL_INVALID_PARAMETER;\r
889 }\r
890 ((EFI_INPUT_KEY*)(((UINT8*)KeyOptionBuffer) + sizeof(EFI_KEY_OPTION)))[LoopCounter].UnicodeChar = (UINT16)Intermediate;\r
891 Temp = StrStr(Walker, L" ");\r
892 if (Temp != NULL) {\r
893 Walker = Temp;\r
894 }\r
895 while(Walker[0] == L' ') {\r
896 Walker++;\r
897 }\r
898 }\r
899\r
900 if (ShellStatus == SHELL_SUCCESS) {\r
901 //\r
902 // Now do the BootOption / BootOptionCrc\r
903 //\r
904 ASSERT (OptionIndex <= OrderCount);\r
905 KeyOptionBuffer->BootOption = CurrentOrder[OptionIndex];\r
906 Status = GetBootOptionCrc(&(KeyOptionBuffer->BootOptionCrc), KeyOptionBuffer->BootOption);\r
907 if (EFI_ERROR(Status)) {\r
908 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, L"Option Index");\r
909 ShellStatus = SHELL_INVALID_PARAMETER;\r
910 } \r
911 }\r
912\r
913 if (ShellStatus == SHELL_SUCCESS) {\r
914 for (Temp2 = NULL, KeyIndex = 0 ; KeyIndex < 0xFFFF ; KeyIndex++) {\r
915 UnicodeSPrint(VariableName, sizeof(VariableName), L"Key%04x", KeyIndex);\r
916 Status = gRT->GetVariable(\r
917 VariableName,\r
918 (EFI_GUID*)&gEfiGlobalVariableGuid,\r
919 NULL,\r
920 (UINTN*)&Intermediate,\r
921 NULL);\r
922 if (Status == EFI_NOT_FOUND) {\r
923 break;\r
924 }\r
925 }\r
926 Status = gRT->SetVariable(\r
927 VariableName,\r
928 (EFI_GUID*)&gEfiGlobalVariableGuid,\r
929 EFI_VARIABLE_NON_VOLATILE|EFI_VARIABLE_BOOTSERVICE_ACCESS|EFI_VARIABLE_RUNTIME_ACCESS,\r
7714cf7d 930 sizeof(EFI_KEY_OPTION) + (sizeof(EFI_INPUT_KEY) * KEY_OPTION_INPUT_KEY_COUNT (&NewKeyOption)),\r
e1d996b3 931 KeyOptionBuffer);\r
932 if (EFI_ERROR(Status)) {\r
933 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_SET_VAR_FAIL), gShellInstall1HiiHandle, VariableName, Status);\r
934 ShellStatus = SHELL_INVALID_PARAMETER;\r
935 } \r
936 ASSERT(FileName == NULL && Data == NULL);\r
937 }\r
938 }\r
939 }\r
940\r
941 //\r
942 // Shouldn't be possible to have have both. Neither is ok though.\r
943 //\r
944 ASSERT(FileName == NULL || Data == NULL);\r
945\r
479f85bb 946 if (ShellStatus == SHELL_SUCCESS && (FileName != NULL || Data != NULL)) {\r
e1d996b3 947 if (FileName != NULL) {\r
948 //\r
949 // Open the file and populate the data buffer.\r
950 //\r
287b4d32 951 Status = ShellOpenFileByName(\r
e1d996b3 952 FileName,\r
953 &FileHandle,\r
954 EFI_FILE_MODE_READ,\r
955 0);\r
287b4d32 956 if (!EFI_ERROR(Status)) {\r
957 Status = ShellGetFileSize(FileHandle, &Intermediate);\r
e1d996b3 958 }\r
959 Data = AllocateZeroPool((UINTN)Intermediate);\r
960 if (Data == NULL) {\r
961 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_MEM), gShellInstall1HiiHandle);\r
962 ShellStatus = SHELL_OUT_OF_RESOURCES;\r
963 }\r
287b4d32 964 if (!EFI_ERROR(Status)) {\r
965 Status = ShellReadFile(FileHandle, (UINTN *)&Intermediate, Data);\r
e1d996b3 966 }\r
967 } else {\r
968 Intermediate = StrSize(Data);\r
969 }\r
970\r
287b4d32 971 if (!EFI_ERROR(Status) && ShellStatus == SHELL_SUCCESS && Data != NULL) {\r
e1d996b3 972 Status = UpdateOptionalData(CurrentOrder[OptionIndex], (UINTN)Intermediate, (UINT8*)Data, Target);\r
973 if (EFI_ERROR(Status)) {\r
974 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_SET_VAR_FAIL), gShellInstall1HiiHandle, VariableName, Status);\r
975 ShellStatus = SHELL_INVALID_PARAMETER;\r
976 } \r
977 }\r
287b4d32 978 if (EFI_ERROR(Status) && ShellStatus == SHELL_SUCCESS) {\r
979 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_SET_VAR_FAIL), gShellInstall1HiiHandle, VariableName, Status);\r
980 ShellStatus = SHELL_INVALID_PARAMETER;\r
981 } \r
e1d996b3 982 }\r
983\r
984 SHELL_FREE_NON_NULL(Data);\r
985 SHELL_FREE_NON_NULL(KeyOptionBuffer);\r
986 SHELL_FREE_NON_NULL(FileName);\r
987 return ShellStatus;\r
2398d9b1 988}\r
989\r
990/**\r
991 Function to dump the Bcfg information.\r
992\r
993 @param[in] Op The operation.\r
994 @param[in] OrderCount How many to dump.\r
995 @param[in] CurrentOrder The pointer to the current order of items.\r
996 @param[in] VerboseOutput TRUE for extra output. FALSE otherwise.\r
997\r
998 @retval SHELL_SUCCESS The dump was successful.\r
999 @retval SHELL_INVALID_PARAMETER A parameter was invalid.\r
1000**/\r
1001SHELL_STATUS\r
1002EFIAPI\r
1003BcfgDisplayDumpInstall1(\r
75aadf59 1004 IN CONST CHAR16 *Op,\r
75aadf59 1005 IN CONST UINTN OrderCount,\r
2398d9b1 1006 IN CONST UINT16 *CurrentOrder,\r
75aadf59 1007 IN CONST BOOLEAN VerboseOutput\r
1008 )\r
1009{\r
1010 EFI_STATUS Status;\r
1011 UINT8 *Buffer;\r
1012 UINTN BufferSize;\r
1013 CHAR16 VariableName[12];\r
1014 UINTN LoopVar;\r
1015 UINTN LoopVar2;\r
1016 CHAR16 *DevPathString;\r
1017 VOID *DevPath;\r
1018\r
2398d9b1 1019 if (OrderCount == 0) {\r
1020 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN(STR_BCFG_NONE), gShellInstall1HiiHandle);\r
1021 return (SHELL_SUCCESS);\r
1022 }\r
1023\r
75aadf59 1024 for (LoopVar = 0 ; LoopVar < OrderCount ; LoopVar++) {\r
1025 Buffer = NULL;\r
1026 BufferSize = 0;\r
1027 UnicodeSPrint(VariableName, sizeof(VariableName), L"%s%04x", Op, CurrentOrder[LoopVar]);\r
1028\r
1029 Status = gRT->GetVariable(\r
1030 VariableName,\r
1031 (EFI_GUID*)&gEfiGlobalVariableGuid,\r
1032 NULL,\r
1033 &BufferSize,\r
1034 Buffer);\r
1035 if (Status == EFI_BUFFER_TOO_SMALL) {\r
2398d9b1 1036 Buffer = AllocateZeroPool(BufferSize);\r
75aadf59 1037 Status = gRT->GetVariable(\r
1038 VariableName,\r
1039 (EFI_GUID*)&gEfiGlobalVariableGuid,\r
1040 NULL,\r
1041 &BufferSize,\r
1042 Buffer);\r
1043 }\r
1044\r
1045 if (EFI_ERROR(Status) || Buffer == NULL) {\r
75aadf59 1046 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_READ_FAIL), gShellInstall1HiiHandle, VariableName, Status);\r
1047 return (SHELL_INVALID_PARAMETER);\r
1048 }\r
1049\r
6878e7a7 1050 if ((*(UINT16*)(Buffer+4)) != 0) {\r
1051 DevPath = AllocateZeroPool(*(UINT16*)(Buffer+4));\r
1052 CopyMem(DevPath, Buffer+6+StrSize((CHAR16*)(Buffer+6)), *(UINT16*)(Buffer+4));\r
863986b3 1053 DevPathString = ConvertDevicePathToText(DevPath, TRUE, FALSE);\r
6878e7a7 1054 } else {\r
1055 DevPath = NULL;\r
1056 DevPathString = NULL;\r
1057 }\r
75aadf59 1058 ShellPrintHiiEx(\r
1059 -1,\r
1060 -1,\r
1061 NULL,\r
1062 STRING_TOKEN(STR_BCFG_LOAD_OPTIONS),\r
1063 gShellInstall1HiiHandle,\r
75aadf59 1064 LoopVar,\r
2398d9b1 1065 VariableName,\r
75aadf59 1066 (CHAR16*)(Buffer+6),\r
1067 DevPathString,\r
1068 (StrSize((CHAR16*)(Buffer+6)) + *(UINT16*)(Buffer+4) + 6) <= BufferSize?L'N':L'Y');\r
1069 if (VerboseOutput) {\r
1070 for (LoopVar2 = (StrSize((CHAR16*)(Buffer+6)) + *(UINT16*)(Buffer+4) + 6);LoopVar2<BufferSize;LoopVar2++){\r
2398d9b1 1071 ShellPrintEx(\r
1072 -1,\r
1073 -1,\r
1074 NULL,\r
1075 L"%02x",\r
1076 Buffer[LoopVar2]);\r
75aadf59 1077 }\r
2398d9b1 1078 ShellPrintEx(\r
1079 -1,\r
1080 -1,\r
1081 NULL,\r
1082 L"\r\n");\r
75aadf59 1083 }\r
1084\r
1085 if (Buffer != NULL) {\r
1086 FreePool(Buffer);\r
1087 }\r
1088 if (DevPath != NULL) {\r
1089 FreePool(DevPath);\r
1090 }\r
1091 if (DevPathString != NULL) {\r
1092 FreePool(DevPathString);\r
1093 }\r
1094 }\r
1095 return (SHELL_SUCCESS);\r
1096}\r
1097\r
2398d9b1 1098/**\r
1099 Function to initialize the BCFG operation structure.\r
1100\r
1101 @param[in] Struct The stuct to initialize.\r
1102**/\r
75aadf59 1103VOID\r
1104EFIAPI\r
2398d9b1 1105InitBcfgStructInstall1(\r
75aadf59 1106 IN BGFG_OPERATION *Struct\r
1107 )\r
1108{\r
1109 ASSERT(Struct != NULL);\r
2398d9b1 1110 Struct->Target = BcfgTargetMax;\r
1111 Struct->Type = BcfgTypeMax;\r
75aadf59 1112 Struct->Number1 = 0;\r
1113 Struct->Number2 = 0;\r
1114 Struct->HandleIndex = 0;\r
1115 Struct->FileName = NULL;\r
1116 Struct->Description = NULL;\r
1117 Struct->Order = NULL;\r
1118 Struct->OptData = NULL;\r
1119}\r
1120\r
1121\r
1122STATIC CONST SHELL_PARAM_ITEM ParamList[] = {\r
1123 {L"-v", TypeFlag},\r
1124 {L"-opt", TypeMaxValue},\r
1125 {NULL, TypeMax}\r
1126 };\r
1127\r
1128/**\r
1129 Function for 'bcfg' command.\r
1130\r
1131 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
1132 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
1133**/\r
1134SHELL_STATUS\r
1135EFIAPI\r
1136ShellCommandRunBcfgInstall (\r
1137 IN EFI_HANDLE ImageHandle,\r
1138 IN EFI_SYSTEM_TABLE *SystemTable\r
1139 )\r
1140{\r
1141 EFI_STATUS Status;\r
1142 LIST_ENTRY *Package;\r
1143 CHAR16 *ProblemParam;\r
1144 SHELL_STATUS ShellStatus;\r
1145 UINTN ParamNumber;\r
1146 CONST CHAR16 *CurrentParam;\r
1147 BGFG_OPERATION CurrentOperation;\r
1148 UINTN Length;\r
2398d9b1 1149 UINT64 Intermediate;\r
75aadf59 1150\r
1151 Length = 0;\r
1152 ProblemParam = NULL;\r
1153 Package = NULL;\r
1154 ShellStatus = SHELL_SUCCESS;\r
1155\r
2398d9b1 1156 InitBcfgStructInstall1(&CurrentOperation);\r
75aadf59 1157\r
1158 //\r
1159 // initialize the shell lib (we must be in non-auto-init...)\r
1160 //\r
1161 Status = ShellInitialize();\r
1162 ASSERT_EFI_ERROR(Status);\r
1163\r
1164 Status = CommandInit();\r
1165 ASSERT_EFI_ERROR(Status);\r
1166\r
1167 //\r
1168 // parse the command line\r
1169 //\r
1170 Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);\r
1171 if (EFI_ERROR(Status)) {\r
1172 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
1173 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, ProblemParam);\r
1174 FreePool(ProblemParam);\r
1175 ShellStatus = SHELL_INVALID_PARAMETER;\r
1176 } else {\r
1177 ASSERT(FALSE);\r
1178 }\r
1179 } else {\r
2398d9b1 1180 //\r
1181 // Read in if we are doing -OPT\r
1182 //\r
1183 if (ShellCommandLineGetFlag(Package, L"-opt")) {\r
1184 CurrentOperation.OptData = ShellCommandLineGetValue(Package, L"-opt");\r
1185 if (CurrentOperation.OptData == NULL) {\r
1186 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellInstall1HiiHandle, L"-opt");\r
1187 ShellStatus = SHELL_INVALID_PARAMETER;\r
1188 }\r
1189 CurrentOperation.Type = BcfgTypeOpt;\r
1190 }\r
1191\r
75aadf59 1192 //\r
1193 // small block to read the target of the operation\r
1194 //\r
2398d9b1 1195 if ((ShellCommandLineGetCount(Package) < 3 && CurrentOperation.Type != BcfgTypeOpt) ||\r
1196 (ShellCommandLineGetCount(Package) < 2 && CurrentOperation.Type == BcfgTypeOpt)\r
1197 ){\r
75aadf59 1198 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellInstall1HiiHandle);\r
1199 ShellStatus = SHELL_INVALID_PARAMETER;\r
1200 } else if (gUnicodeCollation->StriColl(gUnicodeCollation, (CHAR16*)ShellCommandLineGetRawValue(Package, 1), L"driver") == 0) {\r
2398d9b1 1201 CurrentOperation.Target = BcfgTargetDriverOrder;\r
75aadf59 1202 } else if (gUnicodeCollation->StriColl(gUnicodeCollation, (CHAR16*)ShellCommandLineGetRawValue(Package, 1), L"boot") == 0) {\r
2398d9b1 1203 CurrentOperation.Target = BcfgTargetBootOrder;\r
75aadf59 1204 } else {\r
1205 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_DRIVER_BOOT), gShellInstall1HiiHandle);\r
1206 ShellStatus = SHELL_INVALID_PARAMETER;\r
1207 }\r
1208\r
75aadf59 1209\r
1210 //\r
1211 // Read in the boot or driver order environment variable (not needed for opt)\r
1212 //\r
e1d996b3 1213 if (ShellStatus == SHELL_SUCCESS && CurrentOperation.Target < BcfgTargetMax) {\r
75aadf59 1214 Length = 0;\r
1215 Status = gRT->GetVariable(\r
2398d9b1 1216 CurrentOperation.Target == BcfgTargetBootOrder?(CHAR16*)L"BootOrder":(CHAR16*)L"DriverOrder",\r
75aadf59 1217 (EFI_GUID*)&gEfiGlobalVariableGuid,\r
1218 NULL,\r
1219 &Length,\r
1220 CurrentOperation.Order);\r
1221 if (Status == EFI_BUFFER_TOO_SMALL) {\r
2398d9b1 1222 CurrentOperation.Order = AllocateZeroPool(Length+(4*sizeof(CurrentOperation.Order[0])));\r
75aadf59 1223 Status = gRT->GetVariable(\r
2398d9b1 1224 CurrentOperation.Target == BcfgTargetBootOrder?(CHAR16*)L"BootOrder":(CHAR16*)L"DriverOrder",\r
75aadf59 1225 (EFI_GUID*)&gEfiGlobalVariableGuid,\r
1226 NULL,\r
1227 &Length,\r
1228 CurrentOperation.Order);\r
1229 }\r
1230 }\r
1231\r
1232 //\r
1233 // large block to read the type of operation and verify parameter types for the info.\r
1234 //\r
2398d9b1 1235 if (ShellStatus == SHELL_SUCCESS && CurrentOperation.Target < BcfgTargetMax) {\r
75aadf59 1236 for (ParamNumber = 2 ; ParamNumber < ShellCommandLineGetCount(Package) && ShellStatus == SHELL_SUCCESS; ParamNumber++) {\r
1237 CurrentParam = ShellCommandLineGetRawValue(Package, ParamNumber);\r
1238 if (gUnicodeCollation->StriColl(gUnicodeCollation, (CHAR16*)CurrentParam, L"dump") == 0) {\r
2398d9b1 1239 CurrentOperation.Type = BcfgTypeDump;\r
75aadf59 1240 } else if (ShellCommandLineGetFlag(Package, L"-v")) {\r
1241 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, L"-v (without dump)");\r
1242 ShellStatus = SHELL_INVALID_PARAMETER;\r
1243 } else if (gUnicodeCollation->StriColl(gUnicodeCollation, (CHAR16*)CurrentParam, L"add") == 0) {\r
1244 if ((ParamNumber + 3) >= ShellCommandLineGetCount(Package)) {\r
1245 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellInstall1HiiHandle);\r
1246 ShellStatus = SHELL_INVALID_PARAMETER;\r
1247 }\r
2398d9b1 1248 CurrentOperation.Type = BcfgTypeAdd;\r
75aadf59 1249 CurrentParam = ShellCommandLineGetRawValue(Package, ++ParamNumber);\r
1250 if (CurrentParam == NULL || !ShellIsHexOrDecimalNumber(CurrentParam, TRUE, FALSE)) {\r
1251 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, CurrentParam);\r
1252 ShellStatus = SHELL_INVALID_PARAMETER;\r
1253 } else {\r
2398d9b1 1254 Status = ShellConvertStringToUint64(CurrentParam, &Intermediate, TRUE, FALSE);\r
1255 CurrentOperation.Number1 = (UINT16)Intermediate;\r
75aadf59 1256 ASSERT(CurrentOperation.FileName == NULL);\r
1257 CurrentOperation.FileName = StrnCatGrow(&CurrentOperation.FileName , NULL, ShellCommandLineGetRawValue(Package, ++ParamNumber), 0);\r
1258 ASSERT(CurrentOperation.Description == NULL);\r
1259 CurrentOperation.Description = StrnCatGrow(&CurrentOperation.Description, NULL, ShellCommandLineGetRawValue(Package, ++ParamNumber), 0);\r
1260 }\r
1261 } else if (gUnicodeCollation->StriColl(gUnicodeCollation, (CHAR16*)CurrentParam, L"addp") == 0) {\r
1262 if ((ParamNumber + 3) >= ShellCommandLineGetCount(Package)) {\r
1263 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellInstall1HiiHandle);\r
1264 ShellStatus = SHELL_INVALID_PARAMETER;\r
2398d9b1 1265 }\r
1266 CurrentOperation.Type = BcfgTypeAddp;\r
1267 CurrentParam = ShellCommandLineGetRawValue(Package, ++ParamNumber);\r
1268 if (CurrentParam == NULL || !ShellIsHexOrDecimalNumber(CurrentParam, TRUE, FALSE)) {\r
1269 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, CurrentParam);\r
1270 ShellStatus = SHELL_INVALID_PARAMETER;\r
75aadf59 1271 } else {\r
2398d9b1 1272 Status = ShellConvertStringToUint64(CurrentParam, &Intermediate, TRUE, FALSE);\r
1273 CurrentOperation.Number1 = (UINT16)Intermediate;\r
1274 ASSERT(CurrentOperation.FileName == NULL);\r
1275 CurrentOperation.FileName = StrnCatGrow(&CurrentOperation.FileName , NULL, ShellCommandLineGetRawValue(Package, ++ParamNumber), 0);\r
1276 ASSERT(CurrentOperation.Description == NULL);\r
1277 CurrentOperation.Description = StrnCatGrow(&CurrentOperation.Description, NULL, ShellCommandLineGetRawValue(Package, ++ParamNumber), 0);\r
75aadf59 1278 }\r
1279 } else if (gUnicodeCollation->StriColl(gUnicodeCollation, (CHAR16*)CurrentParam, L"addh") == 0) {\r
1280 if ((ParamNumber + 3) >= ShellCommandLineGetCount(Package)) {\r
1281 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellInstall1HiiHandle);\r
1282 ShellStatus = SHELL_INVALID_PARAMETER;\r
1283 }\r
2398d9b1 1284 CurrentOperation.Type = BcfgTypeAddh;\r
75aadf59 1285 CurrentParam = ShellCommandLineGetRawValue(Package, ++ParamNumber);\r
1286 if (CurrentParam == NULL || !ShellIsHexOrDecimalNumber(CurrentParam, TRUE, FALSE)) {\r
1287 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, CurrentParam);\r
1288 ShellStatus = SHELL_INVALID_PARAMETER;\r
1289 } else {\r
2398d9b1 1290 Status = ShellConvertStringToUint64(CurrentParam, &Intermediate, TRUE, FALSE);\r
1291 CurrentOperation.Number1 = (UINT16)Intermediate;\r
75aadf59 1292 CurrentParam = ShellCommandLineGetRawValue(Package, ++ParamNumber);\r
1293 if (CurrentParam == NULL || !ShellIsHexOrDecimalNumber(CurrentParam, TRUE, FALSE)) {\r
1294 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, CurrentParam);\r
1295 ShellStatus = SHELL_INVALID_PARAMETER;\r
1296 } else {\r
2398d9b1 1297 Status = ShellConvertStringToUint64(CurrentParam, &Intermediate, TRUE, FALSE);\r
1298 CurrentOperation.HandleIndex = (UINT16)Intermediate;\r
75aadf59 1299 ASSERT(CurrentOperation.Description == NULL);\r
1300 CurrentOperation.Description = StrnCatGrow(&CurrentOperation.Description, NULL, ShellCommandLineGetRawValue(Package, ++ParamNumber), 0);\r
1301 }\r
1302 }\r
1303 } else if (gUnicodeCollation->StriColl(gUnicodeCollation, (CHAR16*)CurrentParam, L"rm") == 0) {\r
1304 if ((ParamNumber + 1) >= ShellCommandLineGetCount(Package)) {\r
1305 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellInstall1HiiHandle);\r
1306 ShellStatus = SHELL_INVALID_PARAMETER;\r
1307 }\r
2398d9b1 1308 CurrentOperation.Type = BcfgTypeRm;\r
75aadf59 1309 CurrentParam = ShellCommandLineGetRawValue(Package, ++ParamNumber);\r
1310 if (CurrentParam == NULL || !ShellIsHexOrDecimalNumber(CurrentParam, TRUE, FALSE)) {\r
1311 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, CurrentParam);\r
1312 ShellStatus = SHELL_INVALID_PARAMETER;\r
1313 } else {\r
2398d9b1 1314 Status = ShellConvertStringToUint64(CurrentParam, &Intermediate, TRUE, FALSE);\r
1315 CurrentOperation.Number1 = (UINT16)Intermediate;\r
75aadf59 1316 if (CurrentOperation.Number1 > (Length / sizeof(CurrentOperation.Order[0]))){\r
2398d9b1 1317 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_NUMB_RANGE), gShellInstall1HiiHandle, Length / sizeof(CurrentOperation.Order[0]));\r
75aadf59 1318 ShellStatus = SHELL_INVALID_PARAMETER;\r
1319 }\r
1320 }\r
1321 } else if (gUnicodeCollation->StriColl(gUnicodeCollation, (CHAR16*)CurrentParam, L"mv") == 0) {\r
1322 if ((ParamNumber + 2) >= ShellCommandLineGetCount(Package)) {\r
1323 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellInstall1HiiHandle);\r
1324 ShellStatus = SHELL_INVALID_PARAMETER;\r
1325 }\r
2398d9b1 1326 CurrentOperation.Type = BcfgTypeMv;\r
75aadf59 1327 CurrentParam = ShellCommandLineGetRawValue(Package, ++ParamNumber);\r
1328 if (CurrentParam == NULL || !ShellIsHexOrDecimalNumber(CurrentParam, TRUE, FALSE)) {\r
1329 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, CurrentParam);\r
1330 ShellStatus = SHELL_INVALID_PARAMETER;\r
1331 } else {\r
2398d9b1 1332 Status = ShellConvertStringToUint64(CurrentParam, &Intermediate, TRUE, FALSE);\r
1333 CurrentOperation.Number1 = (UINT16)Intermediate;\r
75aadf59 1334 if (CurrentOperation.Number1 > (Length / sizeof(CurrentOperation.Order[0]))){\r
2398d9b1 1335 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_NUMB_RANGE), gShellInstall1HiiHandle, Length / sizeof(CurrentOperation.Order[0]));\r
75aadf59 1336 ShellStatus = SHELL_INVALID_PARAMETER;\r
1337 }\r
1338 CurrentParam = ShellCommandLineGetRawValue(Package, ++ParamNumber);\r
1339 if (CurrentParam == NULL || !ShellIsHexOrDecimalNumber(CurrentParam, TRUE, FALSE)) {\r
1340 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, CurrentParam);\r
1341 ShellStatus = SHELL_INVALID_PARAMETER;\r
1342 } else {\r
2398d9b1 1343 Status = ShellConvertStringToUint64(CurrentParam, &Intermediate, TRUE, FALSE);\r
1344 CurrentOperation.Number2 = (UINT16)Intermediate;\r
75aadf59 1345 }\r
1346 if (CurrentOperation.Number2 == CurrentOperation.Number1\r
1347 ||CurrentOperation.Number1 > (Length / sizeof(CurrentOperation.Order[0]))\r
1348 ||CurrentOperation.Number2 > (Length / sizeof(CurrentOperation.Order[0]))\r
1349 ){\r
2398d9b1 1350 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_NUMB_RANGE), gShellInstall1HiiHandle, Length / sizeof(CurrentOperation.Order[0]));\r
75aadf59 1351 ShellStatus = SHELL_INVALID_PARAMETER;\r
1352 }\r
1353 }\r
1354 } else {\r
1355 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, CurrentParam);\r
1356 ShellStatus = SHELL_INVALID_PARAMETER;\r
1357 }\r
1358 }\r
1359 }\r
2398d9b1 1360 if (ShellStatus == SHELL_SUCCESS && CurrentOperation.Target < BcfgTargetMax && CurrentOperation.Type < BcfgTypeMax) {\r
75aadf59 1361 //\r
1362 // we have all the info. Do the work\r
1363 //\r
1364 switch (CurrentOperation.Type) {\r
2398d9b1 1365 case BcfgTypeDump:\r
1366 ShellStatus = BcfgDisplayDumpInstall1(\r
1367 CurrentOperation.Target == BcfgTargetBootOrder?L"Boot":L"Driver",\r
75aadf59 1368 Length / sizeof(CurrentOperation.Order[0]),\r
2398d9b1 1369 CurrentOperation.Order,\r
75aadf59 1370 ShellCommandLineGetFlag(Package, L"-v"));\r
1371 break;\r
2398d9b1 1372 case BcfgTypeMv:\r
1373 ShellStatus = BcfgMoveInstall1(\r
75aadf59 1374 CurrentOperation.Target,\r
1375 CurrentOperation.Order,\r
1376 Length / sizeof(CurrentOperation.Order[0]),\r
1377 CurrentOperation.Number1,\r
1378 CurrentOperation.Number2);\r
1379 break;\r
2398d9b1 1380 case BcfgTypeRm:\r
1381 ShellStatus = BcfgRemoveInstall1(\r
75aadf59 1382 CurrentOperation.Target,\r
1383 CurrentOperation.Order,\r
2398d9b1 1384 Length / sizeof(CurrentOperation.Order[0]),\r
75aadf59 1385 CurrentOperation.Number1);\r
1386 break;\r
2398d9b1 1387 case BcfgTypeAdd:\r
1388 case BcfgTypeAddp:\r
1389 case BcfgTypeAddh:\r
1390 ShellStatus = BcfgAddInstall1(\r
75aadf59 1391 CurrentOperation.Number1,\r
1392 CurrentOperation.FileName,\r
532691c8 1393 CurrentOperation.Description==NULL?L"":CurrentOperation.Description,\r
75aadf59 1394 CurrentOperation.Order,\r
1395 Length / sizeof(CurrentOperation.Order[0]),\r
1396 CurrentOperation.Target,\r
2398d9b1 1397 (BOOLEAN)(CurrentOperation.Type == BcfgTypeAddh),\r
1398 (BOOLEAN)(CurrentOperation.Type == BcfgTypeAddp),\r
75aadf59 1399 CurrentOperation.HandleIndex);\r
1400 break;\r
2398d9b1 1401 case BcfgTypeOpt:\r
1402 ShellStatus = BcfgAddOptInstall1(\r
1403 CurrentOperation.OptData,\r
e1d996b3 1404 CurrentOperation.Order,\r
1405 Length / sizeof(CurrentOperation.Order[0]),\r
2398d9b1 1406 CurrentOperation.Target);\r
75aadf59 1407 break;\r
1408 default:\r
1409 ASSERT(FALSE);\r
1410 }\r
1411 }\r
1412 }\r
1413\r
1414 if (Package != NULL) {\r
1415 ShellCommandLineFreeVarList (Package);\r
1416 }\r
1417 if (CurrentOperation.FileName != NULL) {\r
1418 FreePool(CurrentOperation.FileName);\r
1419 }\r
1420 if (CurrentOperation.Description != NULL) {\r
1421 FreePool(CurrentOperation.Description);\r
1422 }\r
1423 if (CurrentOperation.Order != NULL) {\r
1424 FreePool(CurrentOperation.Order);\r
1425 }\r
1426\r
1427 return (ShellStatus);\r
1428}\r