]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellDebug1CommandsLib/Bcfg.c
add more user input verification to connect and vol commands.
[mirror_edk2.git] / ShellPkg / Library / UefiShellDebug1CommandsLib / Bcfg.c
CommitLineData
5d73d92f 1/** @file\r
3737ac2b 2 Main file for bcfg shell Debug1 function.\r
5d73d92f 3\r
3737ac2b 4 Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>\r
5d73d92f 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 "UefiShellDebug1CommandsLib.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
3737ac2b 22 BcfgTargetBootOrder = 0,\r
23 BcfgTargetDriverOrder = 1,\r
24 BcfgTargetMax = 2\r
5d73d92f 25} BCFG_OPERATION_TARGET;\r
26\r
27typedef enum {\r
3737ac2b 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
5d73d92f 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
3737ac2b 50/**\r
51 Function to add a option.\r
52\r
53 @param[in] Position The position to add Target at.\r
54 @param[in] File The file to make the target.\r
55 @param[in] Desc The description text.\r
56 @param[in] CurrentOrder The pointer to the current order of items.\r
57 @param[in] OrderCount The number if items in CurrentOrder.\r
58 @param[in] Target The info on the option to add.\r
59 @param[in] UseHandle TRUE to use HandleNumber, FALSE to use File and Desc.\r
60 @param[in] UsePath TRUE to convert to devicepath.\r
61 @param[in] HandleNumber The handle number to add.\r
62\r
63 @retval SHELL_SUCCESS The operation was successful.\r
64 @retval SHELL_INVALID_PARAMETER A parameter was invalid.\r
65**/\r
5d73d92f 66SHELL_STATUS\r
67EFIAPI\r
3737ac2b 68BcfgAddDebug1(\r
5d73d92f 69 IN UINTN Position,\r
70 IN CONST CHAR16 *File,\r
71 IN CONST CHAR16 *Desc,\r
72 IN CONST UINT16 *CurrentOrder,\r
73 IN CONST UINTN OrderCount,\r
74 IN CONST BCFG_OPERATION_TARGET Target,\r
75 IN CONST BOOLEAN UseHandle,\r
76 IN CONST BOOLEAN UsePath,\r
77 IN CONST UINTN HandleNumber\r
78 )\r
79{\r
80 EFI_STATUS Status;\r
3737ac2b 81 EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
82 EFI_DEVICE_PATH_PROTOCOL *FilePath;\r
83 EFI_DEVICE_PATH_PROTOCOL *FileNode;\r
84 EFI_DEVICE_PATH_PROTOCOL *DevPath;\r
5d73d92f 85 CHAR16 *Str;\r
3737ac2b 86 CONST CHAR16 *StringWalker;\r
87 UINT8 *TempByteBuffer;\r
88 UINT8 *TempByteStart;\r
5d73d92f 89 EFI_SHELL_FILE_INFO *Arg;\r
90 EFI_SHELL_FILE_INFO *FileList;\r
91 CHAR16 OptionStr[40];\r
92 UINTN DescSize, FilePathSize;\r
93 BOOLEAN Found;\r
94 UINTN TargetLocation;\r
95 UINTN Index;\r
96 EFI_HANDLE *Handles;\r
97 EFI_HANDLE CurHandle;\r
98 UINTN DriverBindingHandleCount;\r
99 UINTN ParentControllerHandleCount;\r
100 UINTN ChildControllerHandleCount;\r
101 SHELL_STATUS ShellStatus;\r
102 UINT16 *NewOrder;\r
3737ac2b 103 UINT64 Intermediate;\r
5d73d92f 104\r
105 if (!UseHandle) {\r
3737ac2b 106 if (File == NULL || Desc == NULL) {\r
107 return (SHELL_INVALID_PARAMETER);\r
108 }\r
5d73d92f 109 } else {\r
3737ac2b 110 if (HandleNumber == 0) {\r
111 return (SHELL_INVALID_PARAMETER);\r
112 }\r
5d73d92f 113 }\r
114\r
3737ac2b 115 if (Position > OrderCount) {\r
116 Position = OrderCount;\r
117 }\r
5d73d92f 118\r
119 Str = NULL;\r
120 FilePath = NULL;\r
121 FileNode = NULL;\r
122 FileList = NULL;\r
123 Handles = NULL;\r
124 ShellStatus = SHELL_SUCCESS;\r
125 TargetLocation = 0xFFFF;\r
126\r
5d73d92f 127 if (UseHandle) {\r
3737ac2b 128 Status = ShellConvertStringToUint64(File, &Intermediate, TRUE, FALSE);\r
129 CurHandle = ConvertHandleIndexToHandle((UINTN)Intermediate);\r
130 if (CurHandle == NULL || EFI_ERROR(Status)) {\r
5d73d92f 131 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, File);\r
132 ShellStatus = SHELL_INVALID_PARAMETER;\r
133 } else {\r
134 //\r
135 //Make sure that the handle should point to a real controller\r
136 //\r
137 Status = PARSE_HANDLE_DATABASE_UEFI_DRIVERS (\r
138 CurHandle,\r
139 &DriverBindingHandleCount,\r
140 NULL);\r
141\r
142 Status = PARSE_HANDLE_DATABASE_PARENTS (\r
143 CurHandle,\r
144 &ParentControllerHandleCount,\r
145 NULL);\r
146\r
147 Status = ParseHandleDatabaseForChildControllers (\r
148 CurHandle,\r
149 &ChildControllerHandleCount,\r
150 NULL);\r
151\r
152 if (DriverBindingHandleCount > 0\r
153 || ParentControllerHandleCount > 0\r
154 || ChildControllerHandleCount > 0) {\r
155 FilePath = NULL;\r
156 Status = gBS->HandleProtocol (\r
157 CurHandle,\r
158 &gEfiDevicePathProtocolGuid,\r
159 (VOID**)&FilePath);\r
160 }\r
161 if (EFI_ERROR (Status)) {\r
3737ac2b 162 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_HANDLE), gShellDebug1HiiHandle, Intermediate);\r
5d73d92f 163 ShellStatus = SHELL_INVALID_PARAMETER;\r
164 }\r
165 }\r
166 } else {\r
167 //\r
168 // Get file info\r
169 //\r
170 ShellOpenFileMetaArg ((CHAR16*)File, EFI_FILE_MODE_READ, &FileList);\r
171\r
3737ac2b 172 if (FileList == NULL) {\r
173 //\r
174 // If filename matched nothing fail\r
175 //\r
176 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellDebug1HiiHandle, File);\r
177 ShellStatus = SHELL_INVALID_PARAMETER;\r
178 } else if (FileList->Link.ForwardLink != FileList->Link.BackLink) {\r
179 //\r
180 // If filename expanded to multiple names, fail\r
181 //\r
5d73d92f 182 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_FILE), gShellDebug1HiiHandle, File);\r
183 ShellStatus = SHELL_INVALID_PARAMETER;\r
184 } else {\r
185 Arg = (EFI_SHELL_FILE_INFO*)GetFirstNode(&FileList->Link);\r
186 if (EFI_ERROR(Arg->Status)) {\r
187 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_FILE_OPEN), gShellDebug1HiiHandle, File, Arg->Status);\r
188 ShellStatus = SHELL_INVALID_PARAMETER;\r
189 } else {\r
190 //\r
191 // Build FilePath to the filename\r
192 //\r
193\r
194 //\r
195 // get the device path\r
196 //\r
197 DevicePath = mEfiShellProtocol->GetDevicePathFromFilePath(Arg->FullName);\r
3737ac2b 198 if (DevicePath == NULL) {\r
5d73d92f 199 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_FILE_DP), gShellDebug1HiiHandle, Arg->FullName);\r
200 ShellStatus = SHELL_UNSUPPORTED;\r
201 } else {\r
202 if (UsePath) {\r
203 DevPath = DevicePath;\r
204 while (!IsDevicePathEnd(DevPath)) {\r
205 if ((DevicePathType(DevPath) == MEDIA_DEVICE_PATH) &&\r
206 (DevicePathSubType(DevPath) == MEDIA_HARDDRIVE_DP)) {\r
207\r
208 //\r
209 // If we find it use it instead\r
210 //\r
211 DevicePath = DevPath;\r
212 break;\r
213 }\r
214 DevPath = NextDevicePathNode(DevPath);\r
215 }\r
216 //\r
217 // append the file\r
218 //\r
3737ac2b 219 for(StringWalker=Arg->FullName; *StringWalker != CHAR_NULL && *StringWalker != ':'; StringWalker++);\r
220 FileNode = FileDevicePath(NULL, StringWalker+1);\r
5d73d92f 221 FilePath = AppendDevicePath(DevicePath, FileNode);\r
222 FreePool(FileNode);\r
223 } else {\r
224 FilePath = DuplicateDevicePath(DevicePath);\r
225 }\r
226\r
227 FreePool(DevicePath);\r
228 }\r
229 }\r
230 }\r
231 }\r
232\r
233\r
234 if (ShellStatus == SHELL_SUCCESS) {\r
235 //\r
236 // Find a free target ,a brute force implementation\r
237 //\r
238 Found = FALSE;\r
3737ac2b 239 for (TargetLocation=0; TargetLocation < 0xFFFF; TargetLocation++) {\r
5d73d92f 240 Found = TRUE;\r
241 for (Index=0; Index < OrderCount; Index++) {\r
242 if (CurrentOrder[Index] == TargetLocation) {\r
243 Found = FALSE;\r
244 break;\r
245 }\r
246 }\r
247\r
248 if (Found) {\r
249 break;\r
250 }\r
251 }\r
252\r
253 if (TargetLocation == 0xFFFF) {\r
254 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_TARGET_NF), gShellDebug1HiiHandle);\r
255 } else {\r
256 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_TARGET), gShellDebug1HiiHandle, TargetLocation);\r
257 }\r
258 }\r
259\r
260 if (ShellStatus == SHELL_SUCCESS) {\r
261 //\r
262 // Add the option\r
263 //\r
264 DescSize = StrSize(Desc);\r
265 FilePathSize = GetDevicePathSize (FilePath);\r
266\r
3737ac2b 267 TempByteBuffer = AllocateZeroPool(sizeof(UINT32) + sizeof(UINT16) + DescSize + FilePathSize);\r
268 TempByteStart = TempByteBuffer;\r
269 *((UINT32 *) TempByteBuffer) = LOAD_OPTION_ACTIVE; // Attributes\r
270 TempByteBuffer += sizeof (UINT32);\r
5d73d92f 271\r
3737ac2b 272 *((UINT16 *) TempByteBuffer) = (UINT16)FilePathSize; // FilePathListLength\r
273 TempByteBuffer += sizeof (UINT16);\r
5d73d92f 274\r
3737ac2b 275 CopyMem (TempByteBuffer, Desc, DescSize);\r
276 TempByteBuffer += DescSize;\r
277 CopyMem (TempByteBuffer, FilePath, FilePathSize);\r
5d73d92f 278\r
3737ac2b 279 UnicodeSPrint (OptionStr, sizeof(OptionStr), L"%s%04x", Target == BcfgTargetBootOrder?L"Boot":L"Driver", TargetLocation);\r
5d73d92f 280 Status = gRT->SetVariable (\r
281 OptionStr,\r
282 &gEfiGlobalVariableGuid,\r
283 EFI_VARIABLE_NON_VOLATILE|EFI_VARIABLE_BOOTSERVICE_ACCESS|EFI_VARIABLE_RUNTIME_ACCESS,\r
284 sizeof(UINT32) + sizeof(UINT16) + DescSize + FilePathSize,\r
3737ac2b 285 TempByteStart\r
5d73d92f 286 );\r
287\r
3737ac2b 288 FreePool(TempByteStart);\r
5d73d92f 289\r
290 if (EFI_ERROR(Status)) {\r
291 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_SET_VAR_FAIL), gShellDebug1HiiHandle, OptionStr, Status);\r
292 } else {\r
3737ac2b 293 NewOrder = AllocateZeroPool((OrderCount+1)*sizeof(NewOrder[0]));\r
5d73d92f 294 ASSERT(NewOrder != NULL);\r
295 CopyMem(NewOrder, CurrentOrder, (OrderCount)*sizeof(NewOrder[0]));\r
296\r
297 //\r
298 // Insert target into order list\r
299 //\r
300 for (Index=OrderCount; Index > Position; Index--) {\r
301 NewOrder[Index] = NewOrder[Index-1];\r
302 }\r
303\r
304 NewOrder[Position] = (UINT16) TargetLocation;\r
305 Status = gRT->SetVariable (\r
3737ac2b 306 Target == BcfgTargetBootOrder?L"BootOrder":L"DriverOrder",\r
5d73d92f 307 &gEfiGlobalVariableGuid,\r
308 EFI_VARIABLE_NON_VOLATILE|EFI_VARIABLE_BOOTSERVICE_ACCESS|EFI_VARIABLE_RUNTIME_ACCESS,\r
309 (OrderCount+1) * sizeof(UINT16),\r
310 NewOrder\r
311 );\r
312\r
313 FreePool(NewOrder);\r
314\r
315 if (EFI_ERROR(Status)) {\r
3737ac2b 316 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_WRITE_FAIL), gShellDebug1HiiHandle, Target == BcfgTargetBootOrder?L"BootOrder":L"DriverOrder", Status);\r
5d73d92f 317 ShellStatus = SHELL_INVALID_PARAMETER;\r
318 } else {\r
319 Print (L"bcfg: Add %s as %x\n", OptionStr, Position);\r
320 }\r
321 }\r
322 }\r
323 if (FileNode != NULL) {\r
324 FreePool (FileNode);\r
325 }\r
326\r
327//\r
328//If always Free FilePath, will free devicepath in system when use "addh"\r
329//\r
330\r
331 if (FilePath!=NULL && !UseHandle) {\r
332 FreePool (FilePath);\r
333 }\r
334\r
335 if (Str != NULL) {\r
336 FreePool(Str);\r
337 }\r
338\r
339 if (Handles != NULL) {\r
340 FreePool (Handles);\r
341 }\r
342\r
343 if (FileList != NULL) {\r
344 ShellCloseFileMetaArg (&FileList);\r
345 }\r
346\r
347 return (ShellStatus);\r
348}\r
349\r
3737ac2b 350/**\r
351 Funciton to remove an item.\r
352\r
353 @param[in] Target The target item to move.\r
354 @param[in] CurrentOrder The pointer to the current order of items.\r
355 @param[in] OrderCount The number if items in CurrentOrder.\r
356 @param[in] Location The current location of the Target.\r
357\r
358 @retval SHELL_SUCCESS The operation was successful.\r
359 @retval SHELL_INVALID_PARAMETER A parameter was invalid.\r
360**/\r
5d73d92f 361SHELL_STATUS\r
362EFIAPI\r
3737ac2b 363BcfgRemoveDebug1(\r
5d73d92f 364 IN CONST BCFG_OPERATION_TARGET Target,\r
365 IN CONST UINT16 *CurrentOrder,\r
366 IN CONST UINTN OrderCount,\r
367 IN CONST UINT16 Location\r
368 )\r
369{\r
370 CHAR16 VariableName[12];\r
371 UINT16 *NewOrder;\r
372 EFI_STATUS Status;\r
373 UINTN LoopVar;\r
374 UINTN NewCount;\r
375\r
3737ac2b 376 UnicodeSPrint(VariableName, sizeof(VariableName), L"%s%04x", Target == BcfgTargetBootOrder?L"Boot":L"Driver", Location);\r
5d73d92f 377 Status = gRT->SetVariable(\r
378 VariableName,\r
379 (EFI_GUID*)&gEfiGlobalVariableGuid,\r
380 EFI_VARIABLE_NON_VOLATILE|EFI_VARIABLE_BOOTSERVICE_ACCESS|EFI_VARIABLE_RUNTIME_ACCESS,\r
381 0,\r
382 NULL);\r
383 if (EFI_ERROR(Status)) {\r
384 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_WRITE_FAIL), gShellDebug1HiiHandle, VariableName, Status);\r
385 return (SHELL_INVALID_PARAMETER);\r
386 }\r
3737ac2b 387 NewOrder = AllocateZeroPool(OrderCount*sizeof(CurrentOrder[0]));\r
5d73d92f 388 NewCount = OrderCount;\r
389 CopyMem(NewOrder, CurrentOrder, OrderCount*sizeof(CurrentOrder[0]));\r
390 for (LoopVar = 0 ; LoopVar < OrderCount ; LoopVar++){\r
391 if (NewOrder[LoopVar] == Location) {\r
392 CopyMem(NewOrder+LoopVar, NewOrder+LoopVar+1, (OrderCount - LoopVar - 1)*sizeof(CurrentOrder[0]));\r
393 NewCount--;\r
394 }\r
395 }\r
396 Status = gRT->SetVariable(\r
3737ac2b 397 Target == BcfgTargetBootOrder?(CHAR16*)L"BootOrder":(CHAR16*)L"DriverOrder",\r
5d73d92f 398 (EFI_GUID*)&gEfiGlobalVariableGuid,\r
399 EFI_VARIABLE_NON_VOLATILE|EFI_VARIABLE_BOOTSERVICE_ACCESS|EFI_VARIABLE_RUNTIME_ACCESS,\r
400 NewCount*sizeof(NewOrder[0]),\r
401 NewOrder);\r
402 FreePool(NewOrder);\r
403\r
404 if (EFI_ERROR(Status)) {\r
3737ac2b 405 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_WRITE_FAIL), gShellDebug1HiiHandle, Target == BcfgTargetBootOrder?(CHAR16*)L"BootOrder":(CHAR16*)L"DriverOrder", Status);\r
5d73d92f 406 return (SHELL_INVALID_PARAMETER);\r
407 }\r
408 return (SHELL_SUCCESS);\r
409}\r
410\r
3737ac2b 411/**\r
412 Funciton to move a item to another location.\r
413\r
414 @param[in] Target The target item to move.\r
415 @param[in] CurrentOrder The pointer to the current order of items.\r
416 @param[in] OrderCount The number if items in CurrentOrder.\r
417 @param[in] OldLocation The current location of the Target.\r
418 @param[in] NewLocation The desired location of the Target.\r
419\r
420 @retval SHELL_SUCCESS The operation was successful.\r
421 @retval SHELL_INVALID_PARAMETER A parameter was invalid.\r
422**/\r
5d73d92f 423SHELL_STATUS\r
424EFIAPI\r
3737ac2b 425BcfgMoveDebug1(\r
5d73d92f 426 IN CONST BCFG_OPERATION_TARGET Target,\r
427 IN CONST UINT16 *CurrentOrder,\r
428 IN CONST UINTN OrderCount,\r
429 IN CONST UINT16 OldLocation,\r
430 IN CONST UINT16 NewLocation\r
431 )\r
432{\r
433 UINT16 *NewOrder;\r
434 EFI_STATUS Status;\r
435 UINT16 Temp;\r
436\r
3737ac2b 437 NewOrder = AllocateZeroPool(OrderCount*sizeof(CurrentOrder[0]));\r
5d73d92f 438 ASSERT(NewOrder != NULL);\r
439\r
440 Temp = CurrentOrder[OldLocation];\r
441 CopyMem(NewOrder, CurrentOrder, OrderCount*sizeof(CurrentOrder[0]));\r
442 CopyMem(NewOrder+OldLocation, NewOrder+OldLocation+1, (OrderCount - OldLocation - 1)*sizeof(CurrentOrder[0]));\r
443 CopyMem(NewOrder+NewLocation+1, NewOrder+NewLocation, (OrderCount - NewLocation - 1)*sizeof(CurrentOrder[0]));\r
444 NewOrder[NewLocation] = Temp;\r
445\r
446\r
447 Status = gRT->SetVariable(\r
3737ac2b 448 Target == BcfgTargetBootOrder?(CHAR16*)L"BootOrder":(CHAR16*)L"DriverOrder",\r
5d73d92f 449 (EFI_GUID*)&gEfiGlobalVariableGuid,\r
450 EFI_VARIABLE_NON_VOLATILE|EFI_VARIABLE_BOOTSERVICE_ACCESS|EFI_VARIABLE_RUNTIME_ACCESS,\r
451 OrderCount*sizeof(CurrentOrder[0]),\r
452 NewOrder);\r
453\r
454 FreePool(NewOrder);\r
455\r
456 if (EFI_ERROR(Status)) {\r
3737ac2b 457 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_WRITE_FAIL), gShellDebug1HiiHandle, Target == BcfgTargetBootOrder?(CHAR16*)L"BootOrder":(CHAR16*)L"DriverOrder", Status);\r
5d73d92f 458 return (SHELL_INVALID_PARAMETER);\r
459 }\r
460 return (SHELL_SUCCESS);\r
461}\r
462\r
463SHELL_STATUS\r
464EFIAPI\r
3737ac2b 465BcfgAddOptDebug1(\r
466 IN CONST CHAR16 *OptData,\r
467 IN CONST BCFG_OPERATION_TARGET Target\r
468 )\r
469{\r
470 ASSERT(OptData != NULL);\r
471 return SHELL_SUCCESS;\r
472}\r
473\r
474/**\r
475 Function to dump the Bcfg information.\r
476\r
477 @param[in] Op The operation.\r
478 @param[in] OrderCount How many to dump.\r
479 @param[in] CurrentOrder The pointer to the current order of items.\r
480 @param[in] VerboseOutput TRUE for extra output. FALSE otherwise.\r
481\r
482 @retval SHELL_SUCCESS The dump was successful.\r
483 @retval SHELL_INVALID_PARAMETER A parameter was invalid.\r
484**/\r
485SHELL_STATUS\r
486EFIAPI\r
487BcfgDisplayDumpDebug1(\r
5d73d92f 488 IN CONST CHAR16 *Op,\r
3737ac2b 489 IN CONST UINTN OrderCount,\r
490 IN CONST UINT16 *CurrentOrder,\r
5d73d92f 491 IN CONST BOOLEAN VerboseOutput\r
492 )\r
493{\r
494 EFI_STATUS Status;\r
495 UINT8 *Buffer;\r
496 UINTN BufferSize;\r
497 CHAR16 VariableName[12];\r
498 UINTN LoopVar;\r
499 UINTN LoopVar2;\r
500 CHAR16 *DevPathString;\r
501 VOID *DevPath;\r
502\r
3737ac2b 503 if (OrderCount == 0) {\r
504 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN(STR_BCFG_NONE), gShellDebug1HiiHandle);\r
505 return (SHELL_SUCCESS);\r
506 }\r
507\r
5d73d92f 508 for (LoopVar = 0 ; LoopVar < OrderCount ; LoopVar++) {\r
509 Buffer = NULL;\r
510 BufferSize = 0;\r
3737ac2b 511 UnicodeSPrint(VariableName, sizeof(VariableName), L"%s%04x", Op, CurrentOrder[LoopVar]);\r
5d73d92f 512\r
513 Status = gRT->GetVariable(\r
514 VariableName,\r
515 (EFI_GUID*)&gEfiGlobalVariableGuid,\r
516 NULL,\r
517 &BufferSize,\r
518 Buffer);\r
519 if (Status == EFI_BUFFER_TOO_SMALL) {\r
3737ac2b 520 Buffer = AllocateZeroPool(BufferSize);\r
5d73d92f 521 Status = gRT->GetVariable(\r
522 VariableName,\r
523 (EFI_GUID*)&gEfiGlobalVariableGuid,\r
524 NULL,\r
525 &BufferSize,\r
526 Buffer);\r
527 }\r
528\r
529 if (EFI_ERROR(Status) || Buffer == NULL) {\r
530 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_READ_FAIL), gShellDebug1HiiHandle, VariableName, Status);\r
531 return (SHELL_INVALID_PARAMETER);\r
532 }\r
533\r
3737ac2b 534 DevPath = AllocateZeroPool(*(UINT16*)(Buffer+4));\r
5d73d92f 535 CopyMem(DevPath, Buffer+6+StrSize((CHAR16*)(Buffer+6)), *(UINT16*)(Buffer+4));\r
536 DevPathString = gDevPathToText->ConvertDevicePathToText(DevPath, TRUE, FALSE);\r
537 ShellPrintHiiEx(\r
538 -1,\r
539 -1,\r
540 NULL,\r
541 STRING_TOKEN(STR_BCFG_LOAD_OPTIONS),\r
542 gShellDebug1HiiHandle,\r
3737ac2b 543 LoopVar,\r
5d73d92f 544 VariableName,\r
545 (CHAR16*)(Buffer+6),\r
546 DevPathString,\r
547 (StrSize((CHAR16*)(Buffer+6)) + *(UINT16*)(Buffer+4) + 6) <= BufferSize?L'N':L'Y');\r
548 if (VerboseOutput) {\r
549 for (LoopVar2 = (StrSize((CHAR16*)(Buffer+6)) + *(UINT16*)(Buffer+4) + 6);LoopVar2<BufferSize;LoopVar2++){\r
550 ShellPrintEx(\r
551 -1,\r
552 -1,\r
553 NULL,\r
554 L"%02x",\r
555 Buffer[LoopVar2]);\r
556 }\r
557 ShellPrintEx(\r
558 -1,\r
559 -1,\r
560 NULL,\r
561 L"\r\n");\r
562 }\r
563\r
564 if (Buffer != NULL) {\r
565 FreePool(Buffer);\r
566 }\r
567 if (DevPath != NULL) {\r
568 FreePool(DevPath);\r
569 }\r
570 if (DevPathString != NULL) {\r
571 FreePool(DevPathString);\r
572 }\r
573 }\r
574 return (SHELL_SUCCESS);\r
575}\r
576\r
3737ac2b 577/**\r
578 Function to initialize the BCFG operation structure.\r
579\r
580 @param[in] Struct The stuct to initialize.\r
581**/\r
5d73d92f 582VOID\r
583EFIAPI\r
3737ac2b 584InitBcfgStructDebug1(\r
5d73d92f 585 IN BGFG_OPERATION *Struct\r
586 )\r
587{\r
588 ASSERT(Struct != NULL);\r
3737ac2b 589 Struct->Target = BcfgTargetMax;\r
590 Struct->Type = BcfgTypeMax;\r
5d73d92f 591 Struct->Number1 = 0;\r
592 Struct->Number2 = 0;\r
593 Struct->HandleIndex = 0;\r
594 Struct->FileName = NULL;\r
595 Struct->Description = NULL;\r
596 Struct->Order = NULL;\r
597 Struct->OptData = NULL;\r
598}\r
599\r
600\r
601STATIC CONST SHELL_PARAM_ITEM ParamList[] = {\r
602 {L"-v", TypeFlag},\r
603 {L"-opt", TypeMaxValue},\r
604 {NULL, TypeMax}\r
605 };\r
606\r
607/**\r
608 Function for 'bcfg' command.\r
609\r
610 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
611 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
612**/\r
613SHELL_STATUS\r
614EFIAPI\r
615ShellCommandRunBcfg (\r
616 IN EFI_HANDLE ImageHandle,\r
617 IN EFI_SYSTEM_TABLE *SystemTable\r
618 )\r
619{\r
620 EFI_STATUS Status;\r
621 LIST_ENTRY *Package;\r
622 CHAR16 *ProblemParam;\r
623 SHELL_STATUS ShellStatus;\r
624 UINTN ParamNumber;\r
625 CONST CHAR16 *CurrentParam;\r
626 BGFG_OPERATION CurrentOperation;\r
627 UINTN Length;\r
3737ac2b 628 UINT64 Intermediate;\r
5d73d92f 629\r
630 Length = 0;\r
631 ProblemParam = NULL;\r
632 Package = NULL;\r
633 ShellStatus = SHELL_SUCCESS;\r
634\r
3737ac2b 635 InitBcfgStructDebug1(&CurrentOperation);\r
5d73d92f 636\r
637 //\r
638 // initialize the shell lib (we must be in non-auto-init...)\r
639 //\r
640 Status = ShellInitialize();\r
641 ASSERT_EFI_ERROR(Status);\r
642\r
643 Status = CommandInit();\r
644 ASSERT_EFI_ERROR(Status);\r
645\r
646 //\r
647 // parse the command line\r
648 //\r
649 Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);\r
650 if (EFI_ERROR(Status)) {\r
651 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
652 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, ProblemParam);\r
653 FreePool(ProblemParam);\r
654 ShellStatus = SHELL_INVALID_PARAMETER;\r
655 } else {\r
656 ASSERT(FALSE);\r
657 }\r
658 } else {\r
3737ac2b 659 //\r
660 // Read in if we are doing -OPT\r
661 //\r
662 if (ShellCommandLineGetFlag(Package, L"-opt")) {\r
663 CurrentOperation.OptData = ShellCommandLineGetValue(Package, L"-opt");\r
664 if (CurrentOperation.OptData == NULL) {\r
665 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellDebug1HiiHandle, L"-opt");\r
666 ShellStatus = SHELL_INVALID_PARAMETER;\r
667 }\r
668 CurrentOperation.Type = BcfgTypeOpt;\r
669 }\r
670\r
5d73d92f 671 //\r
672 // small block to read the target of the operation\r
673 //\r
3737ac2b 674 if ((ShellCommandLineGetCount(Package) < 3 && CurrentOperation.Type != BcfgTypeOpt) ||\r
675 (ShellCommandLineGetCount(Package) < 2 && CurrentOperation.Type == BcfgTypeOpt)\r
676 ){\r
5d73d92f 677 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle);\r
678 ShellStatus = SHELL_INVALID_PARAMETER;\r
679 } else if (gUnicodeCollation->StriColl(gUnicodeCollation, (CHAR16*)ShellCommandLineGetRawValue(Package, 1), L"driver") == 0) {\r
3737ac2b 680 CurrentOperation.Target = BcfgTargetDriverOrder;\r
5d73d92f 681 } else if (gUnicodeCollation->StriColl(gUnicodeCollation, (CHAR16*)ShellCommandLineGetRawValue(Package, 1), L"boot") == 0) {\r
3737ac2b 682 CurrentOperation.Target = BcfgTargetBootOrder;\r
5d73d92f 683 } else {\r
684 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_DRIVER_BOOT), gShellDebug1HiiHandle);\r
685 ShellStatus = SHELL_INVALID_PARAMETER;\r
686 }\r
687\r
5d73d92f 688\r
689 //\r
690 // Read in the boot or driver order environment variable (not needed for opt)\r
691 //\r
3737ac2b 692 if (ShellStatus == SHELL_SUCCESS && CurrentOperation.Target < BcfgTargetMax && CurrentOperation.Type != BcfgTypeOpt) {\r
5d73d92f 693 Length = 0;\r
694 Status = gRT->GetVariable(\r
3737ac2b 695 CurrentOperation.Target == BcfgTargetBootOrder?(CHAR16*)L"BootOrder":(CHAR16*)L"DriverOrder",\r
5d73d92f 696 (EFI_GUID*)&gEfiGlobalVariableGuid,\r
697 NULL,\r
698 &Length,\r
699 CurrentOperation.Order);\r
700 if (Status == EFI_BUFFER_TOO_SMALL) {\r
3737ac2b 701 CurrentOperation.Order = AllocateZeroPool(Length+(4*sizeof(CurrentOperation.Order[0])));\r
5d73d92f 702 Status = gRT->GetVariable(\r
3737ac2b 703 CurrentOperation.Target == BcfgTargetBootOrder?(CHAR16*)L"BootOrder":(CHAR16*)L"DriverOrder",\r
5d73d92f 704 (EFI_GUID*)&gEfiGlobalVariableGuid,\r
705 NULL,\r
706 &Length,\r
707 CurrentOperation.Order);\r
708 }\r
709 }\r
710\r
711 //\r
712 // large block to read the type of operation and verify parameter types for the info.\r
713 //\r
3737ac2b 714 if (ShellStatus == SHELL_SUCCESS && CurrentOperation.Target < BcfgTargetMax) {\r
5d73d92f 715 for (ParamNumber = 2 ; ParamNumber < ShellCommandLineGetCount(Package) && ShellStatus == SHELL_SUCCESS; ParamNumber++) {\r
716 CurrentParam = ShellCommandLineGetRawValue(Package, ParamNumber);\r
717 if (gUnicodeCollation->StriColl(gUnicodeCollation, (CHAR16*)CurrentParam, L"dump") == 0) {\r
3737ac2b 718 CurrentOperation.Type = BcfgTypeDump;\r
5d73d92f 719 } else if (ShellCommandLineGetFlag(Package, L"-v")) {\r
720 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"-v (without dump)");\r
721 ShellStatus = SHELL_INVALID_PARAMETER;\r
722 } else if (gUnicodeCollation->StriColl(gUnicodeCollation, (CHAR16*)CurrentParam, L"add") == 0) {\r
723 if ((ParamNumber + 3) >= ShellCommandLineGetCount(Package)) {\r
724 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle);\r
725 ShellStatus = SHELL_INVALID_PARAMETER;\r
726 }\r
3737ac2b 727 CurrentOperation.Type = BcfgTypeAdd;\r
5d73d92f 728 CurrentParam = ShellCommandLineGetRawValue(Package, ++ParamNumber);\r
729 if (CurrentParam == NULL || !ShellIsHexOrDecimalNumber(CurrentParam, TRUE, FALSE)) {\r
730 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, CurrentParam);\r
731 ShellStatus = SHELL_INVALID_PARAMETER;\r
732 } else {\r
3737ac2b 733 Status = ShellConvertStringToUint64(CurrentParam, &Intermediate, TRUE, FALSE);\r
734 CurrentOperation.Number1 = (UINT16)Intermediate;\r
5d73d92f 735 ASSERT(CurrentOperation.FileName == NULL);\r
736 CurrentOperation.FileName = StrnCatGrow(&CurrentOperation.FileName , NULL, ShellCommandLineGetRawValue(Package, ++ParamNumber), 0);\r
737 ASSERT(CurrentOperation.Description == NULL);\r
738 CurrentOperation.Description = StrnCatGrow(&CurrentOperation.Description, NULL, ShellCommandLineGetRawValue(Package, ++ParamNumber), 0);\r
739 }\r
740 } else if (gUnicodeCollation->StriColl(gUnicodeCollation, (CHAR16*)CurrentParam, L"addp") == 0) {\r
741 if ((ParamNumber + 3) >= ShellCommandLineGetCount(Package)) {\r
742 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle);\r
743 ShellStatus = SHELL_INVALID_PARAMETER;\r
744 }\r
3737ac2b 745 CurrentOperation.Type = BcfgTypeAddp;\r
5d73d92f 746 CurrentParam = ShellCommandLineGetRawValue(Package, ++ParamNumber);\r
747 if (CurrentParam == NULL || !ShellIsHexOrDecimalNumber(CurrentParam, TRUE, FALSE)) {\r
748 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, CurrentParam);\r
749 ShellStatus = SHELL_INVALID_PARAMETER;\r
750 } else {\r
3737ac2b 751 Status = ShellConvertStringToUint64(CurrentParam, &Intermediate, TRUE, FALSE);\r
752 CurrentOperation.Number1 = (UINT16)Intermediate;\r
5d73d92f 753 ASSERT(CurrentOperation.FileName == NULL);\r
754 CurrentOperation.FileName = StrnCatGrow(&CurrentOperation.FileName , NULL, ShellCommandLineGetRawValue(Package, ++ParamNumber), 0);\r
755 ASSERT(CurrentOperation.Description == NULL);\r
756 CurrentOperation.Description = StrnCatGrow(&CurrentOperation.Description, NULL, ShellCommandLineGetRawValue(Package, ++ParamNumber), 0);\r
757 }\r
758 } else if (gUnicodeCollation->StriColl(gUnicodeCollation, (CHAR16*)CurrentParam, L"addh") == 0) {\r
759 if ((ParamNumber + 3) >= ShellCommandLineGetCount(Package)) {\r
760 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle);\r
761 ShellStatus = SHELL_INVALID_PARAMETER;\r
762 }\r
3737ac2b 763 CurrentOperation.Type = BcfgTypeAddh;\r
5d73d92f 764 CurrentParam = ShellCommandLineGetRawValue(Package, ++ParamNumber);\r
765 if (CurrentParam == NULL || !ShellIsHexOrDecimalNumber(CurrentParam, TRUE, FALSE)) {\r
766 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, CurrentParam);\r
767 ShellStatus = SHELL_INVALID_PARAMETER;\r
768 } else {\r
3737ac2b 769 Status = ShellConvertStringToUint64(CurrentParam, &Intermediate, TRUE, FALSE);\r
770 CurrentOperation.Number1 = (UINT16)Intermediate;\r
5d73d92f 771 CurrentParam = ShellCommandLineGetRawValue(Package, ++ParamNumber);\r
772 if (CurrentParam == NULL || !ShellIsHexOrDecimalNumber(CurrentParam, TRUE, FALSE)) {\r
773 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, CurrentParam);\r
774 ShellStatus = SHELL_INVALID_PARAMETER;\r
775 } else {\r
3737ac2b 776 Status = ShellConvertStringToUint64(CurrentParam, &Intermediate, TRUE, FALSE);\r
777 CurrentOperation.HandleIndex = (UINT16)Intermediate;\r
5d73d92f 778 ASSERT(CurrentOperation.Description == NULL);\r
779 CurrentOperation.Description = StrnCatGrow(&CurrentOperation.Description, NULL, ShellCommandLineGetRawValue(Package, ++ParamNumber), 0);\r
780 }\r
781 }\r
782 } else if (gUnicodeCollation->StriColl(gUnicodeCollation, (CHAR16*)CurrentParam, L"rm") == 0) {\r
783 if ((ParamNumber + 1) >= ShellCommandLineGetCount(Package)) {\r
784 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle);\r
785 ShellStatus = SHELL_INVALID_PARAMETER;\r
786 }\r
3737ac2b 787 CurrentOperation.Type = BcfgTypeRm;\r
5d73d92f 788 CurrentParam = ShellCommandLineGetRawValue(Package, ++ParamNumber);\r
789 if (CurrentParam == NULL || !ShellIsHexOrDecimalNumber(CurrentParam, TRUE, FALSE)) {\r
790 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, CurrentParam);\r
791 ShellStatus = SHELL_INVALID_PARAMETER;\r
792 } else {\r
3737ac2b 793 Status = ShellConvertStringToUint64(CurrentParam, &Intermediate, TRUE, FALSE);\r
794 CurrentOperation.Number1 = (UINT16)Intermediate;\r
5d73d92f 795 if (CurrentOperation.Number1 > (Length / sizeof(CurrentOperation.Order[0]))){\r
796 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_NUMB_RANGE), gShellDebug1HiiHandle, Length / sizeof(CurrentOperation.Order[0]));\r
797 ShellStatus = SHELL_INVALID_PARAMETER;\r
798 }\r
799 }\r
800 } else if (gUnicodeCollation->StriColl(gUnicodeCollation, (CHAR16*)CurrentParam, L"mv") == 0) {\r
801 if ((ParamNumber + 2) >= ShellCommandLineGetCount(Package)) {\r
802 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle);\r
803 ShellStatus = SHELL_INVALID_PARAMETER;\r
804 }\r
3737ac2b 805 CurrentOperation.Type = BcfgTypeMv;\r
5d73d92f 806 CurrentParam = ShellCommandLineGetRawValue(Package, ++ParamNumber);\r
807 if (CurrentParam == NULL || !ShellIsHexOrDecimalNumber(CurrentParam, TRUE, FALSE)) {\r
808 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, CurrentParam);\r
809 ShellStatus = SHELL_INVALID_PARAMETER;\r
810 } else {\r
3737ac2b 811 Status = ShellConvertStringToUint64(CurrentParam, &Intermediate, TRUE, FALSE);\r
812 CurrentOperation.Number1 = (UINT16)Intermediate;\r
5d73d92f 813 if (CurrentOperation.Number1 > (Length / sizeof(CurrentOperation.Order[0]))){\r
814 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_NUMB_RANGE), gShellDebug1HiiHandle, Length / sizeof(CurrentOperation.Order[0]));\r
815 ShellStatus = SHELL_INVALID_PARAMETER;\r
816 }\r
817 CurrentParam = ShellCommandLineGetRawValue(Package, ++ParamNumber);\r
818 if (CurrentParam == NULL || !ShellIsHexOrDecimalNumber(CurrentParam, TRUE, FALSE)) {\r
819 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, CurrentParam);\r
820 ShellStatus = SHELL_INVALID_PARAMETER;\r
821 } else {\r
3737ac2b 822 Status = ShellConvertStringToUint64(CurrentParam, &Intermediate, TRUE, FALSE);\r
823 CurrentOperation.Number2 = (UINT16)Intermediate;\r
5d73d92f 824 }\r
825 if (CurrentOperation.Number2 == CurrentOperation.Number1\r
826 ||CurrentOperation.Number1 > (Length / sizeof(CurrentOperation.Order[0]))\r
827 ||CurrentOperation.Number2 > (Length / sizeof(CurrentOperation.Order[0]))\r
828 ){\r
829 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_NUMB_RANGE), gShellDebug1HiiHandle, Length / sizeof(CurrentOperation.Order[0]));\r
830 ShellStatus = SHELL_INVALID_PARAMETER;\r
831 }\r
832 }\r
833 } else {\r
834 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, CurrentParam);\r
835 ShellStatus = SHELL_INVALID_PARAMETER;\r
836 }\r
837 }\r
838 }\r
3737ac2b 839 if (ShellStatus == SHELL_SUCCESS && CurrentOperation.Target < BcfgTargetMax && CurrentOperation.Type < BcfgTypeMax) {\r
5d73d92f 840 //\r
841 // we have all the info. Do the work\r
842 //\r
843 switch (CurrentOperation.Type) {\r
3737ac2b 844 case BcfgTypeDump:\r
845 ShellStatus = BcfgDisplayDumpDebug1(\r
846 CurrentOperation.Target == BcfgTargetBootOrder?L"Boot":L"Driver",\r
5d73d92f 847 Length / sizeof(CurrentOperation.Order[0]),\r
3737ac2b 848 CurrentOperation.Order,\r
5d73d92f 849 ShellCommandLineGetFlag(Package, L"-v"));\r
850 break;\r
3737ac2b 851 case BcfgTypeMv:\r
852 ShellStatus = BcfgMoveDebug1(\r
5d73d92f 853 CurrentOperation.Target,\r
854 CurrentOperation.Order,\r
855 Length / sizeof(CurrentOperation.Order[0]),\r
856 CurrentOperation.Number1,\r
857 CurrentOperation.Number2);\r
858 break;\r
3737ac2b 859 case BcfgTypeRm:\r
860 ShellStatus = BcfgRemoveDebug1(\r
5d73d92f 861 CurrentOperation.Target,\r
862 CurrentOperation.Order,\r
863 Length / sizeof(CurrentOperation.Order[0]),\r
864 CurrentOperation.Number1);\r
865 break;\r
3737ac2b 866 case BcfgTypeAdd:\r
867 case BcfgTypeAddp:\r
868 case BcfgTypeAddh:\r
869 ShellStatus = BcfgAddDebug1(\r
5d73d92f 870 CurrentOperation.Number1,\r
871 CurrentOperation.FileName,\r
872 CurrentOperation.Description,\r
873 CurrentOperation.Order,\r
3737ac2b 874 Length / sizeof(CurrentOperation.Order[0]),\r
5d73d92f 875 CurrentOperation.Target,\r
3737ac2b 876 (BOOLEAN)(CurrentOperation.Type == BcfgTypeAddh),\r
877 (BOOLEAN)(CurrentOperation.Type == BcfgTypeAddp),\r
5d73d92f 878 CurrentOperation.HandleIndex);\r
879 break;\r
3737ac2b 880 case BcfgTypeOpt:\r
881 ShellStatus = BcfgAddOptDebug1(\r
882 CurrentOperation.OptData,\r
883 CurrentOperation.Target);\r
884 break;\r
5d73d92f 885 default:\r
886 ASSERT(FALSE);\r
887 }\r
888 }\r
889 }\r
890\r
891 if (Package != NULL) {\r
892 ShellCommandLineFreeVarList (Package);\r
893 }\r
894 if (CurrentOperation.FileName != NULL) {\r
895 FreePool(CurrentOperation.FileName);\r
896 }\r
897 if (CurrentOperation.Description != NULL) {\r
898 FreePool(CurrentOperation.Description);\r
899 }\r
900 if (CurrentOperation.Order != NULL) {\r
901 FreePool(CurrentOperation.Order);\r
902 }\r
903\r
904 return (ShellStatus);\r
905}\r