2 Main file for DmpStore shell Debug1 function.
4 Copyright (c) 2005 - 2014, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
15 #include "UefiShellDebug1CommandsLib.h"
34 #define DMP_STORE_VARIABLE_SIGNATURE SIGNATURE_32 ('_', 'd', 's', 's')
37 Base on the input attribute value to return the attribute string.
39 @param[in] Atts The input attribute value
41 @retval The attribute string info.
55 if ((Atts
& EFI_VARIABLE_NON_VOLATILE
) != 0) {
56 StrnCatGrow (&RetString
, &BufLen
, L
"+NV", 0);
58 if ((Atts
& EFI_VARIABLE_RUNTIME_ACCESS
) != 0) {
59 StrnCatGrow (&RetString
, &BufLen
, L
"+RS+BS", 0);
60 } else if ((Atts
& EFI_VARIABLE_BOOTSERVICE_ACCESS
) != 0) {
61 StrnCatGrow (&RetString
, &BufLen
, L
"+BS", 0);
63 if ((Atts
& EFI_VARIABLE_HARDWARE_ERROR_RECORD
) != 0) {
64 StrnCatGrow (&RetString
, &BufLen
, L
"+HR", 0);
66 if ((Atts
& EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS
) != 0) {
67 StrnCatGrow (&RetString
, &BufLen
, L
"+AW", 0);
69 if ((Atts
& EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS
) != 0) {
70 StrnCatGrow (&RetString
, &BufLen
, L
"+AT", 0);
73 if (RetString
== NULL
) {
74 RetString
= StrnCatGrow(&RetString
, &BufLen
, L
"Invalid", 0);
77 if ((RetString
!= NULL
) && (RetString
[0] == L
'+')) {
78 CopyMem(RetString
, RetString
+ 1, StrSize(RetString
+ 1));
85 Load the variable data from file and set to variable data base.
87 @param[in] FileHandle The file to be read.
88 @param[in] Name The name of the variables to be loaded.
89 @param[in] Guid The guid of the variables to be loaded.
90 @param[out] Found TRUE when at least one variable was loaded and set.
92 @retval EFI_VOLUME_CORRUPTED The file is in bad format.
93 @retval EFI_OUT_OF_RESOURCES There is not enough memory to perform the operation.
94 @retval EFI_SUCCESS Successfully load and set the variables.
97 LoadVariablesFromFile (
98 IN SHELL_FILE_HANDLE FileHandle
,
99 IN CONST CHAR16
*Name
,
100 IN CONST EFI_GUID
*Guid
,
112 DMP_STORE_VARIABLE
*Variable
;
118 Status
= ShellGetFileSize (FileHandle
, &FileSize
);
119 if (EFI_ERROR (Status
)) {
123 InitializeListHead (&List
);
126 while (Position
< FileSize
) {
130 BufferSize
= sizeof (NameSize
);
131 Status
= ShellReadFile (FileHandle
, &BufferSize
, &NameSize
);
132 if (EFI_ERROR (Status
) || (BufferSize
!= sizeof (NameSize
))) {
133 Status
= EFI_VOLUME_CORRUPTED
;
140 BufferSize
= sizeof (DataSize
);
141 Status
= ShellReadFile (FileHandle
, &BufferSize
, &DataSize
);
142 if (EFI_ERROR (Status
) || (BufferSize
!= sizeof (DataSize
))) {
143 Status
= EFI_VOLUME_CORRUPTED
;
148 // Name, Guid, Attributes, Data, Crc32
150 RemainingSize
= NameSize
+ sizeof (EFI_GUID
) + sizeof (UINT32
) + DataSize
+ sizeof (Crc32
);
151 BufferSize
= sizeof (NameSize
) + sizeof (DataSize
) + RemainingSize
;
152 Buffer
= AllocatePool (BufferSize
);
153 if (Buffer
== NULL
) {
154 Status
= EFI_OUT_OF_RESOURCES
;
157 BufferSize
= RemainingSize
;
158 Status
= ShellReadFile (FileHandle
, &BufferSize
, (UINT32
*) Buffer
+ 2);
159 if (EFI_ERROR (Status
) || (BufferSize
!= RemainingSize
)) {
160 Status
= EFI_VOLUME_CORRUPTED
;
168 * (UINT32
*) Buffer
= NameSize
;
169 * ((UINT32
*) Buffer
+ 1) = DataSize
;
170 BufferSize
= RemainingSize
+ sizeof (NameSize
) + sizeof (DataSize
) - sizeof (Crc32
);
171 gBS
->CalculateCrc32 (
176 if (Crc32
!= * (UINT32
*) (Buffer
+ BufferSize
)) {
178 Status
= EFI_VOLUME_CORRUPTED
;
182 Position
+= BufferSize
+ sizeof (Crc32
);
184 Variable
= AllocateZeroPool (sizeof (*Variable
) + NameSize
+ DataSize
);
185 if (Variable
== NULL
) {
187 Status
= EFI_OUT_OF_RESOURCES
;
190 Variable
->Signature
= DMP_STORE_VARIABLE_SIGNATURE
;
191 Variable
->Name
= (CHAR16
*) (Variable
+ 1);
192 Variable
->DataSize
= DataSize
;
193 Variable
->Data
= (UINT8
*) Variable
->Name
+ NameSize
;
194 CopyMem (Variable
->Name
, Buffer
+ sizeof (NameSize
) + sizeof (DataSize
), NameSize
);
195 CopyMem (&Variable
->Guid
, Buffer
+ sizeof (NameSize
) + sizeof (DataSize
) + NameSize
, sizeof (EFI_GUID
));
196 CopyMem (&Variable
->Attributes
, Buffer
+ sizeof (NameSize
) + sizeof (DataSize
) + NameSize
+ sizeof (EFI_GUID
), sizeof (UINT32
));
197 CopyMem (Variable
->Data
, Buffer
+ sizeof (NameSize
) + sizeof (DataSize
) + NameSize
+ sizeof (EFI_GUID
) + sizeof (UINT32
), DataSize
);
199 InsertTailList (&List
, &Variable
->Link
);
203 if ((Position
!= FileSize
) || EFI_ERROR (Status
)) {
204 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_DMPSTORE_LOAD_BAD_FILE
), gShellDebug1HiiHandle
);
205 Status
= EFI_VOLUME_CORRUPTED
;
208 for ( Link
= GetFirstNode (&List
)
209 ; !IsNull (&List
, Link
) && !EFI_ERROR (Status
)
210 ; Link
= GetNextNode (&List
, Link
)
212 Variable
= CR (Link
, DMP_STORE_VARIABLE
, Link
, DMP_STORE_VARIABLE_SIGNATURE
);
214 if (((Name
== NULL
) || gUnicodeCollation
->MetaiMatch (gUnicodeCollation
, Variable
->Name
, (CHAR16
*) Name
)) &&
215 ((Guid
== NULL
) || CompareGuid (&Variable
->Guid
, Guid
))
217 Attributes
= GetAttrType (Variable
->Attributes
);
219 -1, -1, NULL
, STRING_TOKEN(STR_DMPSTORE_HEADER_LINE
), gShellDebug1HiiHandle
,
220 Attributes
, &Variable
->Guid
, Variable
->Name
, Variable
->DataSize
222 SHELL_FREE_NON_NULL(Attributes
);
225 Status
= gRT
->SetVariable (
228 Variable
->Attributes
,
232 if (EFI_ERROR (Status
)) {
233 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_DMPSTORE_LOAD_GEN_FAIL
), gShellDebug1HiiHandle
, Variable
->Name
, Status
);
235 // continue set variable upon failure
237 Status
= EFI_SUCCESS
;
242 for (Link
= GetFirstNode (&List
); !IsNull (&List
, Link
); ) {
243 Variable
= CR (Link
, DMP_STORE_VARIABLE
, Link
, DMP_STORE_VARIABLE_SIGNATURE
);
244 Link
= RemoveEntryList (&Variable
->Link
);
252 Append one variable to file.
254 @param[in] FileHandle The file to be appended.
255 @param[in] Name The variable name.
256 @param[in] Guid The variable GUID.
257 @param[in] Attributes The variable attributes.
258 @param[in] DataSize The variable data size.
259 @param[in] Data The variable data.
261 @retval EFI_OUT_OF_RESOURCES There is not enough memory to perform the operation.
262 @retval EFI_SUCCESS The variable is appended to file successfully.
263 @retval others Failed to append the variable to file.
266 AppendSingleVariableToFile (
267 IN SHELL_FILE_HANDLE FileHandle
,
268 IN CONST CHAR16
*Name
,
269 IN CONST EFI_GUID
*Guid
,
270 IN UINT32 Attributes
,
281 NameSize
= (UINT32
) StrSize (Name
);
282 BufferSize
= sizeof (NameSize
) + sizeof (DataSize
)
284 + sizeof (Attributes
)
285 + NameSize
+ DataSize
288 Buffer
= AllocatePool (BufferSize
);
289 if (Buffer
== NULL
) {
290 return EFI_OUT_OF_RESOURCES
;
295 // NameSize and DataSize
297 * (UINT32
*) Ptr
= NameSize
;
298 Ptr
+= sizeof (NameSize
);
299 *(UINT32
*) Ptr
= DataSize
;
300 Ptr
+= sizeof (DataSize
);
305 CopyMem (Ptr
, Name
, NameSize
);
311 CopyMem (Ptr
, Guid
, sizeof (*Guid
));
312 Ptr
+= sizeof (*Guid
);
317 * (UINT32
*) Ptr
= Attributes
;
318 Ptr
+= sizeof (Attributes
);
323 CopyMem (Ptr
, Data
, DataSize
);
329 gBS
->CalculateCrc32 (Buffer
, (UINTN
) (Ptr
- Buffer
), (UINT32
*) Ptr
);
331 Status
= ShellWriteFile (FileHandle
, &BufferSize
, Buffer
);
334 if (!EFI_ERROR (Status
) &&
335 (BufferSize
!= sizeof (NameSize
) + sizeof (DataSize
) + sizeof (*Guid
) + sizeof (Attributes
) + NameSize
+ DataSize
)
337 Status
= EFI_DEVICE_ERROR
;
344 Recursive function to display or delete variables.
346 This function will call itself to create a stack-based list of allt he variables to process,
347 then fromt he last to the first, they will do either printing or deleting.
349 This is necessary since once a delete happens GetNextVariableName() will work.
351 @param[in] Name The variable name of the EFI variable (or NULL).
352 @param[in] Guid The GUID of the variable set (or NULL).
353 @param[in] Type The operation type.
354 @param[in] FileHandle The file to operate on (or NULL).
355 @param[in] PrevName The previous variable name from GetNextVariableName. L"" to start.
356 @param[in] FoundVarGuid The previous GUID from GetNextVariableName. ignored at start.
357 @param[in] FoundOne If a VariableName or Guid was specified and one was printed or
358 deleted, then set this to TRUE, otherwise ignored.
360 @retval SHELL_SUCCESS The operation was successful.
361 @retval SHELL_OUT_OF_RESOURCES A memorty allocation failed.
362 @retval SHELL_ABORTED The abort message was received.
363 @retval SHELL_DEVICE_ERROR UEFI Variable Services returned an error.
364 @retval SHELL_NOT_FOUND the Name/Guid pair could not be found.
368 CascadeProcessVariables (
369 IN CONST CHAR16
*Name OPTIONAL
,
370 IN CONST EFI_GUID
*Guid OPTIONAL
,
371 IN DMP_STORE_TYPE Type
,
372 IN EFI_FILE_PROTOCOL
*FileHandle OPTIONAL
,
373 IN CONST CHAR16
* CONST PrevName
,
374 IN EFI_GUID FoundVarGuid
,
379 CHAR16
*FoundVarName
;
383 SHELL_STATUS ShellStatus
;
387 if (ShellGetExecutionBreakFlag()) {
388 return (SHELL_ABORTED
);
394 if (PrevName
!=NULL
) {
395 StrnCatGrow(&FoundVarName
, &NameSize
, PrevName
, 0);
397 FoundVarName
= AllocateZeroPool(sizeof(CHAR16
));
400 Status
= gRT
->GetNextVariableName (&NameSize
, FoundVarName
, &FoundVarGuid
);
401 if (Status
== EFI_BUFFER_TOO_SMALL
) {
402 SHELL_FREE_NON_NULL(FoundVarName
);
403 FoundVarName
= AllocateZeroPool (NameSize
);
404 if (FoundVarName
!= NULL
) {
405 if (PrevName
!= NULL
) {
406 StrCpy(FoundVarName
, PrevName
);
409 Status
= gRT
->GetNextVariableName (&NameSize
, FoundVarName
, &FoundVarGuid
);
411 Status
= EFI_OUT_OF_RESOURCES
;
418 if (Status
== EFI_NOT_FOUND
) {
419 SHELL_FREE_NON_NULL(FoundVarName
);
420 return (SHELL_SUCCESS
);
421 } else if (EFI_ERROR(Status
)) {
422 SHELL_FREE_NON_NULL(FoundVarName
);
423 return (SHELL_DEVICE_ERROR
);
427 // Recurse to the next iteration. We know "our" variable's name.
429 ShellStatus
= CascadeProcessVariables(Name
, Guid
, Type
, FileHandle
, FoundVarName
, FoundVarGuid
, FoundOne
);
432 // No matter what happened we process our own variable
433 // Only continue if Guid and VariableName are each either NULL or a match
436 || gUnicodeCollation
->MetaiMatch(gUnicodeCollation
, FoundVarName
, (CHAR16
*) Name
) )
438 || CompareGuid(&FoundVarGuid
, Guid
) )
443 // do the print or delete
446 Status
= gRT
->GetVariable (FoundVarName
, &FoundVarGuid
, &Atts
, &DataSize
, DataBuffer
);
447 if (Status
== EFI_BUFFER_TOO_SMALL
) {
448 SHELL_FREE_NON_NULL (DataBuffer
);
449 DataBuffer
= AllocatePool (DataSize
);
450 if (DataBuffer
== NULL
) {
451 Status
= EFI_OUT_OF_RESOURCES
;
453 Status
= gRT
->GetVariable (FoundVarName
, &FoundVarGuid
, &Atts
, &DataSize
, DataBuffer
);
456 if ((Type
== DmpStoreDisplay
) || (Type
== DmpStoreSave
)) {
458 // Last error check then print this variable out.
460 if (!EFI_ERROR(Status
) && DataBuffer
!= NULL
) {
461 RetString
= GetAttrType(Atts
);
466 STRING_TOKEN(STR_DMPSTORE_HEADER_LINE
),
467 gShellDebug1HiiHandle
,
472 if (Type
== DmpStoreDisplay
) {
473 DumpHex(2, 0, DataSize
, DataBuffer
);
475 Status
= AppendSingleVariableToFile (
484 SHELL_FREE_NON_NULL(RetString
);
486 } else if (Type
== DmpStoreDelete
) {
488 // We only need name to delete it...
494 STRING_TOKEN(STR_DMPSTORE_DELETE_LINE
),
495 gShellDebug1HiiHandle
,
498 gRT
->SetVariable (FoundVarName
, &FoundVarGuid
, Atts
, 0, NULL
)
501 SHELL_FREE_NON_NULL(DataBuffer
);
504 SHELL_FREE_NON_NULL(FoundVarName
);
506 if (Status
== EFI_DEVICE_ERROR
) {
507 ShellStatus
= SHELL_DEVICE_ERROR
;
508 } else if (Status
== EFI_SECURITY_VIOLATION
) {
509 ShellStatus
= SHELL_SECURITY_VIOLATION
;
510 } else if (EFI_ERROR(Status
)) {
511 ShellStatus
= SHELL_NOT_READY
;
514 return (ShellStatus
);
518 Function to display or delete variables. This will set up and call into the recursive function.
520 @param[in] Name The variable name of the EFI variable (or NULL).
521 @param[in] Guid The GUID of the variable set (or NULL).
522 @param[in] Type The operation type.
523 @param[in] FileHandle The file to save or load variables.
525 @retval SHELL_SUCCESS The operation was successful.
526 @retval SHELL_OUT_OF_RESOURCES A memorty allocation failed.
527 @retval SHELL_ABORTED The abort message was received.
528 @retval SHELL_DEVICE_ERROR UEFI Variable Services returned an error.
529 @retval SHELL_NOT_FOUND the Name/Guid pair could not be found.
534 IN CONST CHAR16
*Name OPTIONAL
,
535 IN CONST EFI_GUID
*Guid OPTIONAL
,
536 IN DMP_STORE_TYPE Type
,
537 IN SHELL_FILE_HANDLE FileHandle OPTIONAL
540 SHELL_STATUS ShellStatus
;
542 EFI_GUID FoundVarGuid
;
545 ShellStatus
= SHELL_SUCCESS
;
546 ZeroMem (&FoundVarGuid
, sizeof(EFI_GUID
));
548 if (Type
== DmpStoreLoad
) {
549 ShellStatus
= LoadVariablesFromFile (FileHandle
, Name
, Guid
, &Found
);
551 ShellStatus
= CascadeProcessVariables(Name
, Guid
, Type
, FileHandle
, NULL
, FoundVarGuid
, &Found
);
555 if (ShellStatus
== SHELL_OUT_OF_RESOURCES
) {
556 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_OUT_MEM
), gShellDebug1HiiHandle
);
557 return (ShellStatus
);
558 } else if (Name
!= NULL
&& Guid
== NULL
) {
559 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_DMPSTORE_NO_VAR_FOUND_N
), gShellDebug1HiiHandle
, Name
);
560 } else if (Name
!= NULL
&& Guid
!= NULL
) {
561 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_DMPSTORE_NO_VAR_FOUND_GN
), gShellDebug1HiiHandle
, Guid
, Name
);
562 } else if (Name
== NULL
&& Guid
== NULL
) {
563 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_DMPSTORE_NO_VAR_FOUND
), gShellDebug1HiiHandle
);
564 } else if (Name
== NULL
&& Guid
!= NULL
) {
565 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_DMPSTORE_NO_VAR_FOUND_G
), gShellDebug1HiiHandle
, Guid
);
567 return (SHELL_NOT_FOUND
);
569 return (ShellStatus
);
572 STATIC CONST SHELL_PARAM_ITEM ParamList
[] = {
577 {L
"-guid", TypeValue
},
582 Function for 'dmpstore' command.
584 @param[in] ImageHandle Handle to the Image (NULL if Internal).
585 @param[in] SystemTable Pointer to the System Table (NULL if Internal).
589 ShellCommandRunDmpStore (
590 IN EFI_HANDLE ImageHandle
,
591 IN EFI_SYSTEM_TABLE
*SystemTable
596 CHAR16
*ProblemParam
;
597 SHELL_STATUS ShellStatus
;
598 CONST CHAR16
*GuidStr
;
604 SHELL_FILE_HANDLE FileHandle
;
605 EFI_FILE_INFO
*FileInfo
;
607 ShellStatus
= SHELL_SUCCESS
;
611 Type
= DmpStoreDisplay
;
613 Status
= ShellCommandLineParse (ParamList
, &Package
, &ProblemParam
, TRUE
);
614 if (EFI_ERROR(Status
)) {
615 if (Status
== EFI_VOLUME_CORRUPTED
&& ProblemParam
!= NULL
) {
616 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDebug1HiiHandle
, ProblemParam
);
617 FreePool(ProblemParam
);
618 ShellStatus
= SHELL_INVALID_PARAMETER
;
623 if (ShellCommandLineGetCount(Package
) > 2) {
624 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_MANY
), gShellDebug1HiiHandle
);
625 ShellStatus
= SHELL_INVALID_PARAMETER
;
626 } else if (ShellCommandLineGetFlag(Package
, L
"-all") && ShellCommandLineGetFlag(Package
, L
"-guid")) {
627 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_CONFLICT
), gShellDebug1HiiHandle
, L
"-all", L
"-guid");
628 ShellStatus
= SHELL_INVALID_PARAMETER
;
629 } else if (ShellCommandLineGetFlag(Package
, L
"-s") && ShellCommandLineGetFlag(Package
, L
"-l")) {
630 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_CONFLICT
), gShellDebug1HiiHandle
, L
"-l", L
"-s");
631 ShellStatus
= SHELL_INVALID_PARAMETER
;
632 } else if ((ShellCommandLineGetFlag(Package
, L
"-s") || ShellCommandLineGetFlag(Package
, L
"-l")) && ShellCommandLineGetFlag(Package
, L
"-d")) {
633 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_CONFLICT
), gShellDebug1HiiHandle
, L
"-l or -s", L
"-d");
634 ShellStatus
= SHELL_INVALID_PARAMETER
;
636 if (!ShellCommandLineGetFlag(Package
, L
"-all")) {
637 GuidStr
= ShellCommandLineGetValue(Package
, L
"-guid");
638 if (GuidStr
!= NULL
) {
639 Status
= ConvertStringToGuid(GuidStr
, &GuidData
);
640 if (EFI_ERROR(Status
)) {
641 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDebug1HiiHandle
, GuidStr
);
642 ShellStatus
= SHELL_INVALID_PARAMETER
;
646 Guid
= &gEfiGlobalVariableGuid
;
648 Name
= ShellCommandLineGetRawValue(Package
, 1);
653 if (ShellStatus
== SHELL_SUCCESS
) {
654 if (ShellCommandLineGetFlag(Package
, L
"-s")) {
656 File
= ShellCommandLineGetValue(Package
, L
"-s");
658 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_NO_VALUE
), gShellDebug1HiiHandle
, L
"-s");
659 ShellStatus
= SHELL_INVALID_PARAMETER
;
661 Status
= ShellOpenFileByName (File
, &FileHandle
, EFI_FILE_MODE_WRITE
| EFI_FILE_MODE_READ
, 0);
662 if (!EFI_ERROR (Status
)) {
664 // Delete existing file, but do not delete existing directory
666 FileInfo
= ShellGetFileInfo (FileHandle
);
667 if (FileInfo
== NULL
) {
668 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL
), gShellDebug1HiiHandle
, File
);
669 Status
= EFI_DEVICE_ERROR
;
671 if ((FileInfo
->Attribute
& EFI_FILE_DIRECTORY
) == EFI_FILE_DIRECTORY
) {
672 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_GEN_FILE_IS_DIRECTORY
), gShellDebug1HiiHandle
, File
);
673 Status
= EFI_INVALID_PARAMETER
;
675 Status
= ShellDeleteFile (&FileHandle
);
676 if (EFI_ERROR (Status
)) {
677 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_GEN_FILE_DELETE_FAIL
), gShellDebug1HiiHandle
, File
);
682 } else if (Status
== EFI_NOT_FOUND
) {
684 // Good when file doesn't exist
686 Status
= EFI_SUCCESS
;
689 // Otherwise it's bad.
691 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL
), gShellDebug1HiiHandle
, File
);
694 if (!EFI_ERROR (Status
)) {
695 Status
= ShellOpenFileByName (File
, &FileHandle
, EFI_FILE_MODE_CREATE
| EFI_FILE_MODE_WRITE
| EFI_FILE_MODE_READ
, 0);
696 if (EFI_ERROR (Status
)) {
697 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL
), gShellDebug1HiiHandle
, File
);
701 if (EFI_ERROR (Status
)) {
702 ShellStatus
= SHELL_INVALID_PARAMETER
;
705 } else if (ShellCommandLineGetFlag(Package
, L
"-l")) {
707 File
= ShellCommandLineGetValue(Package
, L
"-l");
709 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_NO_VALUE
), gShellDebug1HiiHandle
, L
"-l");
710 ShellStatus
= SHELL_INVALID_PARAMETER
;
712 Status
= ShellOpenFileByName (File
, &FileHandle
, EFI_FILE_MODE_READ
, 0);
713 if (EFI_ERROR (Status
)) {
714 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL
), gShellDebug1HiiHandle
, File
);
715 ShellStatus
= SHELL_INVALID_PARAMETER
;
717 FileInfo
= ShellGetFileInfo (FileHandle
);
718 if (FileInfo
== NULL
) {
719 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL
), gShellDebug1HiiHandle
, File
);
720 ShellStatus
= SHELL_DEVICE_ERROR
;
722 if ((FileInfo
->Attribute
& EFI_FILE_DIRECTORY
) == EFI_FILE_DIRECTORY
) {
723 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_GEN_FILE_IS_DIRECTORY
), gShellDebug1HiiHandle
, File
);
724 ShellStatus
= SHELL_INVALID_PARAMETER
;
730 } else if (ShellCommandLineGetFlag(Package
, L
"-d")) {
731 Type
= DmpStoreDelete
;
735 if (ShellStatus
== SHELL_SUCCESS
) {
736 if (Type
== DmpStoreSave
) {
737 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_DMPSTORE_SAVE
), gShellDebug1HiiHandle
, File
);
738 } else if (Type
== DmpStoreLoad
) {
739 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_DMPSTORE_LOAD
), gShellDebug1HiiHandle
, File
);
741 ShellStatus
= ProcessVariables (Name
, Guid
, Type
, FileHandle
);
742 if ((Type
== DmpStoreLoad
) || (Type
== DmpStoreSave
)) {
743 ShellCloseFile (&FileHandle
);
749 if (Package
!= NULL
) {
750 ShellCommandLineFreeVarList (Package
);