]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellDebug1CommandsLib/DmpStore.c
Enable wide string support for CreatePopUp function in UefiLib.
[mirror_edk2.git] / ShellPkg / Library / UefiShellDebug1CommandsLib / DmpStore.c
CommitLineData
5d73d92f 1/** @file\r
2 Main file for DmpStore shell Debug1 function.\r
3\r
ea4fe84f 4 Copyright (c) 2005 - 2012, 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\r
73c82041
ED
17\r
18#define INIT_NAME_BUFFER_SIZE 128\r
19#define INIT_DATA_BUFFER_SIZE 1024\r
20#define INIT_ATTS_BUFFER_SIZE 64\r
21\r
22CONST CHAR16 *\r
23EFIAPI\r
24GetAttrType (\r
25 IN CONST UINT32 Atts,\r
26 IN OUT CHAR16 *RetString\r
27 )\r
28{\r
29 StrCpy(RetString, L"");\r
30\r
31 if (Atts & EFI_VARIABLE_NON_VOLATILE) {\r
32 StrCat(RetString, L"+NV");\r
33 }\r
34 if (Atts & EFI_VARIABLE_RUNTIME_ACCESS) {\r
35 StrCat(RetString, L"+RS+BS");\r
36 } else if (Atts & EFI_VARIABLE_BOOTSERVICE_ACCESS) {\r
37 StrCat(RetString, L"+BS");\r
38 }\r
39 if (Atts & EFI_VARIABLE_HARDWARE_ERROR_RECORD) {\r
40 StrCat(RetString, L"+HR");\r
41 }\r
42 if (Atts & EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS) {\r
43 StrCat(RetString, L"+AW");\r
44 }\r
45 if (Atts & EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS) {\r
46 StrCat(RetString, L"+AT");\r
47 }\r
48\r
49 if (RetString[0] == L'+') {\r
50 return (RetString+1);\r
51 }\r
52 if (RetString[0] == CHAR_NULL) {\r
53 StrCpy(RetString, L"invalid");\r
54 return (RetString);\r
55 }\r
56 return (RetString);\r
57}\r
5d73d92f 58\r
3737ac2b 59/**\r
60 Function to display or delete variables.\r
61\r
62 @param[in] VariableName The variable name of the EFI variable (or NULL).\r
63 @param[in] Guid The GUID of the variable set (or NULL).\r
64 @param[in] Delete TRUE to delete, FALSE otherwise.\r
65\r
66 @retval SHELL_SUCCESS The operation was successful.\r
67 @retval SHELL_OUT_OF_RESOURCES A memorty allocation failed.\r
68 @retval SHELL_ABORTED The abort message was received.\r
69 @retval SHELL_DEVICE_ERROR UEFI Variable Services returned an error.\r
70 @retval SHELL_NOT_FOUND the Name/Guid pair could not be found.\r
71**/\r
5d73d92f 72SHELL_STATUS\r
73EFIAPI\r
74ProcessVariables (\r
75 IN CONST CHAR16 *VariableName OPTIONAL,\r
76 IN CONST EFI_GUID *Guid OPTIONAL,\r
77 IN BOOLEAN Delete\r
78 )\r
79{\r
80 EFI_STATUS Status;\r
5d73d92f 81 CHAR16 *FoundVarName;\r
5d73d92f 82 EFI_GUID FoundVarGuid;\r
83 UINT8 *DataBuffer;\r
84 UINTN DataSize;\r
85 UINT32 Atts;\r
86 SHELL_STATUS ShellStatus;\r
3737ac2b 87 BOOLEAN Found;\r
73c82041
ED
88 UINTN NameBufferSize; // Allocated Name buffer size\r
89 UINTN NameSize;\r
90 CHAR16 *OldName;\r
91 UINTN OldNameBufferSize;\r
92 UINTN DataBufferSize; // Allocated data buffer size\r
93 CHAR16 RetString[INIT_ATTS_BUFFER_SIZE];\r
5d73d92f 94\r
3737ac2b 95 Found = FALSE;\r
5d73d92f 96 ShellStatus = SHELL_SUCCESS;\r
c85c6de7 97 Status = EFI_SUCCESS;\r
5d73d92f 98\r
73c82041
ED
99 NameBufferSize = INIT_NAME_BUFFER_SIZE;\r
100 DataBufferSize = INIT_DATA_BUFFER_SIZE;\r
101 FoundVarName = AllocateZeroPool (NameBufferSize);\r
5d73d92f 102 if (FoundVarName == NULL) {\r
103 return (SHELL_OUT_OF_RESOURCES);\r
73c82041
ED
104 } \r
105 DataBuffer = AllocatePool (DataBufferSize);\r
5d73d92f 106 if (DataBuffer == NULL) {\r
73c82041 107 FreePool (FoundVarName);\r
5d73d92f 108 return (SHELL_OUT_OF_RESOURCES);\r
109 }\r
110\r
111 for (;;){\r
112 if (ShellGetExecutionBreakFlag()) {\r
113 ShellStatus = SHELL_ABORTED;\r
114 break;\r
115 }\r
5d73d92f 116\r
73c82041
ED
117 NameSize = NameBufferSize;\r
118 Status = gRT->GetNextVariableName (&NameSize, FoundVarName, &FoundVarGuid);\r
119 if (Status == EFI_BUFFER_TOO_SMALL) {\r
120 OldName = FoundVarName;\r
121 OldNameBufferSize = NameBufferSize;\r
122 //\r
123 // Expand at least twice to avoid reallocate many times\r
124 //\r
125 NameBufferSize = NameSize > NameBufferSize * 2 ? NameSize : NameBufferSize * 2;\r
126 FoundVarName = AllocateZeroPool (NameBufferSize);\r
127 if (FoundVarName == NULL) {\r
128 Status = EFI_OUT_OF_RESOURCES;\r
129 FreePool (OldName);\r
130 break;\r
131 }\r
132 //\r
133 // Preserve the original content to get correct iteration for GetNextVariableName() call\r
134 //\r
135 CopyMem (FoundVarName, OldName, OldNameBufferSize);\r
136 FreePool (OldName);\r
137 NameSize = NameBufferSize;\r
138 Status = gRT->GetNextVariableName (&NameSize, FoundVarName, &FoundVarGuid);\r
139 }\r
5d73d92f 140 if (Status == EFI_NOT_FOUND) {\r
141 break;\r
142 }\r
143 ASSERT_EFI_ERROR(Status);\r
144\r
5d73d92f 145 //\r
146 // Check if it matches\r
147 //\r
148 if (VariableName != NULL) {\r
149 if (!gUnicodeCollation->MetaiMatch(gUnicodeCollation, FoundVarName, (CHAR16*)VariableName)) {\r
150 continue;\r
151 }\r
152 }\r
153 if (Guid != NULL) {\r
154 if (!CompareGuid(&FoundVarGuid, Guid)) {\r
155 continue;\r
156 }\r
157 }\r
158\r
73c82041
ED
159 DataSize = DataBufferSize;\r
160 Status = gRT->GetVariable (FoundVarName, &FoundVarGuid, &Atts, &DataSize, DataBuffer);\r
161 if (Status == EFI_BUFFER_TOO_SMALL) {\r
162 //\r
163 // Expand at least twice to avoid reallocate many times\r
164 //\r
165 FreePool (DataBuffer);\r
166 DataBufferSize = DataSize > DataBufferSize * 2 ? DataSize : DataBufferSize * 2;\r
167 DataBuffer = AllocatePool (DataBufferSize);\r
168 if (DataBuffer == NULL) {\r
169 Status = EFI_OUT_OF_RESOURCES;\r
170 break;\r
171 }\r
172 DataSize = DataBufferSize;\r
173 Status = gRT->GetVariable (FoundVarName, &FoundVarGuid, &Atts, &DataSize, DataBuffer);\r
174 } \r
175 ASSERT_EFI_ERROR(Status);\r
176\r
5d73d92f 177 //\r
178 // do the print or delete\r
179 //\r
3737ac2b 180 Found = TRUE;\r
5d73d92f 181 if (!Delete) {\r
182 ShellPrintHiiEx(\r
183 -1,\r
184 -1,\r
185 NULL,\r
186 STRING_TOKEN(STR_DMPSTORE_HEADER_LINE),\r
187 gShellDebug1HiiHandle,\r
73c82041 188 GetAttrType(Atts, RetString),\r
5d73d92f 189 &FoundVarGuid,\r
190 FoundVarName,\r
191 DataSize);\r
192 DumpHex(2, 0, DataSize, DataBuffer);\r
193 } else {\r
194 ShellPrintHiiEx(\r
195 -1,\r
196 -1,\r
197 NULL,\r
198 STRING_TOKEN(STR_DMPSTORE_DELETE_LINE),\r
199 gShellDebug1HiiHandle,\r
200 &FoundVarGuid,\r
201 FoundVarName);\r
202 ShellPrintHiiEx(\r
203 -1,\r
204 -1,\r
205 NULL,\r
206 STRING_TOKEN(STR_DMPSTORE_DELETE_DONE),\r
207 gShellDebug1HiiHandle,\r
208 gRT->SetVariable(FoundVarName, &FoundVarGuid, Atts, 0, NULL));\r
9d8fa791 209 FoundVarName[0] = CHAR_NULL;\r
5d73d92f 210 }\r
211 }\r
212\r
213 if (FoundVarName != NULL) {\r
214 FreePool(FoundVarName);\r
215 }\r
216 if (DataBuffer != NULL) {\r
217 FreePool(DataBuffer);\r
218 }\r
3737ac2b 219 if (!Found) {\r
73c82041
ED
220 if (Status == EFI_OUT_OF_RESOURCES) {\r
221 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellDebug1HiiHandle);\r
222 return SHELL_OUT_OF_RESOURCES;\r
223 }\r
224\r
3737ac2b 225 if (VariableName != NULL && Guid == NULL) {\r
226 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_NO_VAR_FOUND_N), gShellDebug1HiiHandle, VariableName);\r
227 } else if (VariableName != NULL && Guid != NULL) {\r
228 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_NO_VAR_FOUND_GN), gShellDebug1HiiHandle, Guid, VariableName);\r
229 } else if (VariableName == NULL && Guid == NULL) {\r
230 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_NO_VAR_FOUND), gShellDebug1HiiHandle);\r
231 } else if (VariableName == NULL && Guid != NULL) {\r
232 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_NO_VAR_FOUND_G), gShellDebug1HiiHandle, Guid);\r
233 } \r
234 return (SHELL_NOT_FOUND);\r
235 }\r
236 return (SHELL_SUCCESS);\r
5d73d92f 237}\r
238\r
239STATIC CONST SHELL_PARAM_ITEM ParamList[] = {\r
240 {L"-d", TypeFlag},\r
241 {L"-l", TypeFlag},\r
242 {L"-s", TypeFlag},\r
243 {L"-all", TypeFlag},\r
244 {L"-guid", TypeValue},\r
245 {NULL, TypeMax}\r
246 };\r
247\r
3737ac2b 248/**\r
249 Function for 'dmpstore' command.\r
250\r
251 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
252 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
253**/\r
5d73d92f 254SHELL_STATUS\r
255EFIAPI\r
256ShellCommandRunDmpStore (\r
257 IN EFI_HANDLE ImageHandle,\r
258 IN EFI_SYSTEM_TABLE *SystemTable\r
259 )\r
260{\r
261 EFI_STATUS Status;\r
262 LIST_ENTRY *Package;\r
263 CHAR16 *ProblemParam;\r
264 SHELL_STATUS ShellStatus;\r
265 CONST CHAR16 *Temp;\r
266 EFI_GUID *Guid;\r
267 EFI_GUID GuidData;\r
268 CONST CHAR16 *VariableName;\r
269\r
270 ShellStatus = SHELL_SUCCESS;\r
271 Package = NULL;\r
272\r
273 Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);\r
274 if (EFI_ERROR(Status)) {\r
275 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
276 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, ProblemParam);\r
277 FreePool(ProblemParam);\r
278 ShellStatus = SHELL_INVALID_PARAMETER;\r
279 } else {\r
280 ASSERT(FALSE);\r
281 }\r
282 } else {\r
3737ac2b 283 if (ShellCommandLineGetCount(Package) > 2) {\r
5d73d92f 284 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle);\r
285 ShellStatus = SHELL_INVALID_PARAMETER;\r
286 } else if (ShellCommandLineGetFlag(Package, L"-all") && ShellCommandLineGetFlag(Package, L"-guid")) {\r
287 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CONFLICT), gShellDebug1HiiHandle, L"-all", L"-guid");\r
288 ShellStatus = SHELL_INVALID_PARAMETER;\r
289 } else if ((ShellCommandLineGetFlag(Package, L"-s") || ShellCommandLineGetFlag(Package, L"-l")) && ShellCommandLineGetFlag(Package, L"-d")) {\r
290 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CONFLICT), gShellDebug1HiiHandle, L"-l or -s", L"-d");\r
291 ShellStatus = SHELL_INVALID_PARAMETER;\r
292 } else {\r
293 if (!ShellCommandLineGetFlag(Package, L"-all")) {\r
294 Temp = ShellCommandLineGetValue(Package, L"-guid");\r
295 if (Temp != NULL) {\r
296 Status = ConvertStringToGuid(Temp, &GuidData);\r
297 if (EFI_ERROR(Status)) {\r
3737ac2b 298 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, Temp);\r
5d73d92f 299 ShellStatus = SHELL_INVALID_PARAMETER;\r
300 }\r
301 Guid = &GuidData;\r
302 } else {\r
303 Guid = &gEfiGlobalVariableGuid;\r
304 }\r
3737ac2b 305 VariableName = ShellCommandLineGetRawValue(Package, 1);\r
5d73d92f 306 } else {\r
307 VariableName = NULL;\r
308 Guid = NULL;\r
309 }\r
310 if (ShellStatus == SHELL_SUCCESS) {\r
311 if (ShellCommandLineGetFlag(Package, L"-s") || ShellCommandLineGetFlag(Package, L"-l")) {\r
ea4fe84f 312 ///@todo fix this after lib ready...\r
3737ac2b 313 ShellPrintEx(-1, -1, L"Not implemeneted yet.\r\n");\r
314 ShellStatus = SHELL_UNSUPPORTED;\r
5d73d92f 315 } else {\r
316 ShellStatus = ProcessVariables (VariableName, Guid, ShellCommandLineGetFlag(Package, L"-d"));\r
317 }\r
318 }\r
319 }\r
320 }\r
321\r
322 if (Package != NULL) {\r
323 ShellCommandLineFreeVarList (Package);\r
324 }\r
325 return ShellStatus;\r
326}\r
327\r