]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/DriverSampleDxe/DriverSample.c
MdeModulePkg/DriverSample: Add sample case for popup protocol
[mirror_edk2.git] / MdeModulePkg / Universal / DriverSampleDxe / DriverSample.c
CommitLineData
93e3992d 1/** @file\r
53cf48e0 2This is an example of how a driver might export data to the HII protocol to be\r
3later utilized by the Setup Protocol\r
4\r
ac72474d 5Copyright (c) 2004 - 2017, Intel Corporation. All rights reserved.<BR>\r
e5eed7d3 6This program and the accompanying materials\r
93e3992d 7are licensed and made available under the terms and conditions of the BSD License\r
8which accompanies this distribution. The full text of the license may be found at\r
9http://opensource.org/licenses/bsd-license.php\r
10\r
11THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13\r
93e3992d 14**/\r
15\r
16\r
17#include "DriverSample.h"\r
18\r
7e3bcccb 19#define DISPLAY_ONLY_MY_ITEM 0x0002\r
93e3992d 20\r
93e3992d 21CHAR16 VariableName[] = L"MyIfrNVData";\r
78c2b9a3 22CHAR16 MyEfiVar[] = L"MyEfiVar";\r
2f3065c0 23EFI_HANDLE DriverHandle[2] = {NULL, NULL};\r
7b2c31ae 24DRIVER_SAMPLE_PRIVATE_DATA *mPrivateData = NULL;\r
211cc6e5 25EFI_EVENT mEvent;\r
2f3065c0
LG
26\r
27HII_VENDOR_DEVICE_PATH mHiiVendorDevicePath0 = {\r
f6f910dd 28 {\r
29 {\r
30 HARDWARE_DEVICE_PATH,\r
31 HW_VENDOR_DP,\r
32 {\r
33 (UINT8) (sizeof (VENDOR_DEVICE_PATH)),\r
34 (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)\r
35 }\r
36 },\r
c8ad2d7a 37 DRIVER_SAMPLE_FORMSET_GUID\r
f6f910dd 38 },\r
39 {\r
40 END_DEVICE_PATH_TYPE,\r
41 END_ENTIRE_DEVICE_PATH_SUBTYPE,\r
a6973cff 42 {\r
f6f910dd 43 (UINT8) (END_DEVICE_PATH_LENGTH),\r
44 (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)\r
45 }\r
46 }\r
47};\r
48\r
2f3065c0 49HII_VENDOR_DEVICE_PATH mHiiVendorDevicePath1 = {\r
f6f910dd 50 {\r
51 {\r
52 HARDWARE_DEVICE_PATH,\r
53 HW_VENDOR_DP,\r
54 {\r
55 (UINT8) (sizeof (VENDOR_DEVICE_PATH)),\r
56 (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)\r
57 }\r
58 },\r
c8ad2d7a 59 DRIVER_SAMPLE_INVENTORY_GUID\r
f6f910dd 60 },\r
61 {\r
62 END_DEVICE_PATH_TYPE,\r
63 END_ENTIRE_DEVICE_PATH_SUBTYPE,\r
a6973cff 64 {\r
f6f910dd 65 (UINT8) (END_DEVICE_PATH_LENGTH),\r
66 (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)\r
67 }\r
68 }\r
69};\r
70\r
622ce645
DB
71/**\r
72 Set value of a data element in an Array by its Index.\r
73\r
74 @param Array The data array.\r
75 @param Type Type of the data in this array.\r
76 @param Index Zero based index for data in this array.\r
77 @param Value The value to be set.\r
78\r
79**/\r
80VOID\r
81SetArrayData (\r
82 IN VOID *Array,\r
83 IN UINT8 Type,\r
84 IN UINTN Index,\r
85 IN UINT64 Value\r
86 )\r
87{\r
88\r
89 ASSERT (Array != NULL);\r
90\r
91 switch (Type) {\r
92 case EFI_IFR_TYPE_NUM_SIZE_8:\r
93 *(((UINT8 *) Array) + Index) = (UINT8) Value;\r
94 break;\r
95\r
96 case EFI_IFR_TYPE_NUM_SIZE_16:\r
97 *(((UINT16 *) Array) + Index) = (UINT16) Value;\r
98 break;\r
99\r
100 case EFI_IFR_TYPE_NUM_SIZE_32:\r
101 *(((UINT32 *) Array) + Index) = (UINT32) Value;\r
102 break;\r
103\r
104 case EFI_IFR_TYPE_NUM_SIZE_64:\r
105 *(((UINT64 *) Array) + Index) = (UINT64) Value;\r
106 break;\r
107\r
108 default:\r
109 break;\r
110 }\r
111}\r
112\r
211cc6e5
ED
113/**\r
114 Notification function for keystrokes.\r
115\r
116 @param[in] KeyData The key that was pressed.\r
117\r
118 @retval EFI_SUCCESS The operation was successful.\r
119**/\r
120EFI_STATUS\r
121EFIAPI\r
122NotificationFunction(\r
123 IN EFI_KEY_DATA *KeyData\r
124 )\r
125{\r
126 gBS->SignalEvent (mEvent);\r
127 \r
128 return EFI_SUCCESS;\r
129}\r
130\r
131/**\r
132 Function to start monitoring for CTRL-C using SimpleTextInputEx. \r
133\r
134 @retval EFI_SUCCESS The feature is enabled.\r
135 @retval EFI_OUT_OF_RESOURCES There is not enough mnemory available.\r
136**/\r
137EFI_STATUS\r
138EFIAPI\r
139InternalStartMonitor(\r
140 VOID\r
141 )\r
142{\r
143 EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *SimpleEx;\r
144 EFI_KEY_DATA KeyData;\r
145 EFI_STATUS Status;\r
146 EFI_HANDLE *Handles;\r
147 UINTN HandleCount;\r
148 UINTN HandleIndex;\r
149 EFI_HANDLE NotifyHandle;\r
150\r
151 Status = gBS->LocateHandleBuffer (\r
152 ByProtocol,\r
153 &gEfiSimpleTextInputExProtocolGuid,\r
154 NULL,\r
155 &HandleCount,\r
156 &Handles\r
157 );\r
158 for (HandleIndex = 0; HandleIndex < HandleCount; HandleIndex++) {\r
159 Status = gBS->HandleProtocol (Handles[HandleIndex], &gEfiSimpleTextInputExProtocolGuid, (VOID **) &SimpleEx);\r
160 ASSERT_EFI_ERROR (Status);\r
161\r
162 KeyData.KeyState.KeyToggleState = 0;\r
163 KeyData.Key.ScanCode = 0;\r
164 KeyData.KeyState.KeyShiftState = EFI_SHIFT_STATE_VALID|EFI_LEFT_CONTROL_PRESSED;\r
165 KeyData.Key.UnicodeChar = L'c';\r
166\r
167 Status = SimpleEx->RegisterKeyNotify(\r
168 SimpleEx,\r
169 &KeyData,\r
170 NotificationFunction,\r
171 &NotifyHandle);\r
172 if (EFI_ERROR (Status)) {\r
173 break;\r
174 }\r
175 \r
176 KeyData.KeyState.KeyShiftState = EFI_SHIFT_STATE_VALID|EFI_RIGHT_CONTROL_PRESSED;\r
177 Status = SimpleEx->RegisterKeyNotify(\r
178 SimpleEx,\r
179 &KeyData,\r
180 NotificationFunction,\r
181 &NotifyHandle);\r
182 if (EFI_ERROR (Status)) {\r
183 break;\r
184 }\r
185 }\r
186\r
187 return EFI_SUCCESS;\r
188}\r
189\r
190/**\r
191 Function to stop monitoring for CTRL-C using SimpleTextInputEx. \r
192\r
193 @retval EFI_SUCCESS The feature is enabled.\r
194 @retval EFI_OUT_OF_RESOURCES There is not enough mnemory available.\r
195**/\r
196EFI_STATUS\r
197EFIAPI\r
198InternalStopMonitor(\r
199 VOID\r
200 )\r
201{\r
202 EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *SimpleEx;\r
203 EFI_STATUS Status;\r
204 EFI_HANDLE *Handles;\r
205 EFI_KEY_DATA KeyData; \r
206 UINTN HandleCount;\r
207 UINTN HandleIndex;\r
208 EFI_HANDLE NotifyHandle;\r
209\r
210 Status = gBS->LocateHandleBuffer (\r
211 ByProtocol,\r
212 &gEfiSimpleTextInputExProtocolGuid,\r
213 NULL,\r
214 &HandleCount,\r
215 &Handles\r
216 );\r
217 for (HandleIndex = 0; HandleIndex < HandleCount; HandleIndex++) {\r
218 Status = gBS->HandleProtocol (Handles[HandleIndex], &gEfiSimpleTextInputExProtocolGuid, (VOID **) &SimpleEx);\r
219 ASSERT_EFI_ERROR (Status);\r
220\r
221 KeyData.KeyState.KeyToggleState = 0;\r
222 KeyData.Key.ScanCode = 0;\r
223 KeyData.KeyState.KeyShiftState = EFI_SHIFT_STATE_VALID|EFI_LEFT_CONTROL_PRESSED;\r
224 KeyData.Key.UnicodeChar = L'c';\r
225\r
226 Status = SimpleEx->RegisterKeyNotify(\r
227 SimpleEx,\r
228 &KeyData,\r
229 NotificationFunction,\r
230 &NotifyHandle);\r
231 if (!EFI_ERROR (Status)) {\r
232 Status = SimpleEx->UnregisterKeyNotify (SimpleEx, NotifyHandle);\r
233 }\r
234\r
235 KeyData.KeyState.KeyShiftState = EFI_SHIFT_STATE_VALID|EFI_RIGHT_CONTROL_PRESSED;\r
236 Status = SimpleEx->RegisterKeyNotify(\r
237 SimpleEx,\r
238 &KeyData,\r
239 NotificationFunction,\r
240 &NotifyHandle);\r
241 if (!EFI_ERROR (Status)) {\r
242 Status = SimpleEx->UnregisterKeyNotify (SimpleEx, NotifyHandle);\r
243 }\r
244 }\r
245 return EFI_SUCCESS;\r
246}\r
247\r
38ebfecb
LG
248/**\r
249 Update names of Name/Value storage to current language.\r
250\r
251 @param PrivateData Points to the driver private data.\r
252\r
253 @retval EFI_SUCCESS All names are successfully updated.\r
254 @retval EFI_NOT_FOUND Failed to get Name from HII database.\r
255\r
256**/\r
257EFI_STATUS\r
258LoadNameValueNames (\r
259 IN DRIVER_SAMPLE_PRIVATE_DATA *PrivateData\r
260 )\r
261{\r
262 UINTN Index;\r
263\r
264 //\r
265 // Get Name/Value name string of current language\r
266 //\r
267 for (Index = 0; Index < NAME_VALUE_NAME_NUMBER; Index++) {\r
268 PrivateData->NameValueName[Index] = HiiGetString (\r
269 PrivateData->HiiHandle[0],\r
270 PrivateData->NameStringId[Index],\r
271 NULL\r
272 );\r
273 if (PrivateData->NameValueName[Index] == NULL) {\r
274 return EFI_NOT_FOUND;\r
275 }\r
276 }\r
277\r
278 return EFI_SUCCESS;\r
279}\r
93e3992d 280\r
ee31d1be
ED
281\r
282/**\r
283 Get the value of <Number> in <BlockConfig> format, i.e. the value of OFFSET\r
284 or WIDTH or VALUE.\r
285 <BlockConfig> ::= 'OFFSET='<Number>&'WIDTH='<Number>&'VALUE'=<Number>\r
286\r
287 This is a internal function.\r
288\r
289 @param StringPtr String in <BlockConfig> format and points to the\r
290 first character of <Number>.\r
291 @param Number The output value. Caller takes the responsibility\r
292 to free memory.\r
293 @param Len Length of the <Number>, in characters.\r
294\r
295 @retval EFI_OUT_OF_RESOURCES Insufficient resources to store neccessary\r
296 structures.\r
297 @retval EFI_SUCCESS Value of <Number> is outputted in Number\r
298 successfully.\r
299\r
300**/\r
301EFI_STATUS\r
302GetValueOfNumber (\r
303 IN EFI_STRING StringPtr,\r
304 OUT UINT8 **Number,\r
305 OUT UINTN *Len\r
306 )\r
307{\r
308 EFI_STRING TmpPtr;\r
309 UINTN Length;\r
310 EFI_STRING Str;\r
311 UINT8 *Buf;\r
312 EFI_STATUS Status;\r
313 UINT8 DigitUint8;\r
314 UINTN Index;\r
315 CHAR16 TemStr[2];\r
316\r
317 if (StringPtr == NULL || *StringPtr == L'\0' || Number == NULL || Len == NULL) {\r
318 return EFI_INVALID_PARAMETER;\r
319 }\r
320\r
321 Buf = NULL;\r
322\r
323 TmpPtr = StringPtr;\r
324 while (*StringPtr != L'\0' && *StringPtr != L'&') {\r
325 StringPtr++;\r
326 }\r
327 *Len = StringPtr - TmpPtr;\r
328 Length = *Len + 1;\r
329\r
330 Str = (EFI_STRING) AllocateZeroPool (Length * sizeof (CHAR16));\r
331 if (Str == NULL) {\r
332 Status = EFI_OUT_OF_RESOURCES;\r
333 goto Exit;\r
334 }\r
335 CopyMem (Str, TmpPtr, *Len * sizeof (CHAR16));\r
336 *(Str + *Len) = L'\0';\r
337\r
338 Length = (Length + 1) / 2;\r
339 Buf = (UINT8 *) AllocateZeroPool (Length);\r
340 if (Buf == NULL) {\r
341 Status = EFI_OUT_OF_RESOURCES;\r
342 goto Exit;\r
343 }\r
344 \r
345 Length = *Len;\r
346 ZeroMem (TemStr, sizeof (TemStr));\r
347 for (Index = 0; Index < Length; Index ++) {\r
348 TemStr[0] = Str[Length - Index - 1];\r
349 DigitUint8 = (UINT8) StrHexToUint64 (TemStr);\r
350 if ((Index & 1) == 0) {\r
351 Buf [Index/2] = DigitUint8;\r
352 } else {\r
353 Buf [Index/2] = (UINT8) ((DigitUint8 << 4) + Buf [Index/2]);\r
354 }\r
355 }\r
356\r
357 *Number = Buf;\r
358 Status = EFI_SUCCESS;\r
359\r
360Exit:\r
361 if (Str != NULL) {\r
362 FreePool (Str);\r
363 }\r
364\r
365 return Status;\r
366}\r
367\r
368/**\r
369 Create altcfg string. \r
370\r
371 @param Result The request result string.\r
372 @param ConfigHdr The request head info. <ConfigHdr> format.\r
373 @param Offset The offset of the parameter int he structure.\r
374 @param Width The width of the parameter.\r
375\r
376\r
377 @retval The string with altcfg info append at the end.\r
378**/\r
379EFI_STRING \r
380CreateAltCfgString (\r
381 IN EFI_STRING Result,\r
382 IN EFI_STRING ConfigHdr,\r
383 IN UINTN Offset,\r
384 IN UINTN Width\r
385 )\r
386{\r
387 EFI_STRING StringPtr;\r
388 EFI_STRING TmpStr;\r
389 UINTN NewLen;\r
390\r
46cc3885 391 NewLen = StrLen (Result);\r
33d41385
ED
392 //\r
393 // String Len = ConfigResp + AltConfig + AltConfig + 1("\0")\r
394 //\r
46cc3885 395 NewLen = (NewLen + ((1 + StrLen (ConfigHdr) + 8 + 4) + (8 + 4 + 7 + 4 + 7 + 4)) * 2 + 1) * sizeof (CHAR16);\r
ee31d1be
ED
396 StringPtr = AllocateZeroPool (NewLen);\r
397 if (StringPtr == NULL) {\r
398 return NULL;\r
399 }\r
400\r
401 TmpStr = StringPtr;\r
402 if (Result != NULL) {\r
5ad66ec6 403 StrCpyS (StringPtr, NewLen / sizeof (CHAR16), Result);\r
ee31d1be
ED
404 StringPtr += StrLen (Result); \r
405 FreePool (Result);\r
406 }\r
407 \r
408 UnicodeSPrint (\r
409 StringPtr, \r
410 (1 + StrLen (ConfigHdr) + 8 + 4 + 1) * sizeof (CHAR16), \r
411 L"&%s&ALTCFG=%04x", \r
412 ConfigHdr, \r
413 EFI_HII_DEFAULT_CLASS_STANDARD\r
414 );\r
415 StringPtr += StrLen (StringPtr);\r
416\r
417 UnicodeSPrint (\r
418 StringPtr, \r
419 (8 + 4 + 7 + 4 + 7 + 4 + 1) * sizeof (CHAR16),\r
420 L"&OFFSET=%04x&WIDTH=%04x&VALUE=%04x", \r
421 Offset, \r
422 Width,\r
423 DEFAULT_CLASS_STANDARD_VALUE\r
424 );\r
425 StringPtr += StrLen (StringPtr); \r
426\r
427 UnicodeSPrint (\r
428 StringPtr, \r
429 (1 + StrLen (ConfigHdr) + 8 + 4 + 1) * sizeof (CHAR16), \r
430 L"&%s&ALTCFG=%04x", \r
431 ConfigHdr, \r
432 EFI_HII_DEFAULT_CLASS_MANUFACTURING\r
433 );\r
434 StringPtr += StrLen (StringPtr);\r
435\r
436 UnicodeSPrint (\r
437 StringPtr, \r
438 (8 + 4 + 7 + 4 + 7 + 4 + 1) * sizeof (CHAR16),\r
439 L"&OFFSET=%04x&WIDTH=%04x&VALUE=%04x", \r
440 Offset, \r
441 Width,\r
442 DEFAULT_CLASS_MANUFACTURING_VALUE\r
443 );\r
444 StringPtr += StrLen (StringPtr); \r
445\r
446 return TmpStr;\r
447}\r
448\r
449/**\r
450 Check whether need to add the altcfg string. if need to add, add the altcfg \r
451 string.\r
452\r
453 @param RequestResult The request result string.\r
454 @param ConfigRequestHdr The request head info. <ConfigHdr> format.\r
455\r
456**/\r
457VOID \r
458AppendAltCfgString (\r
459 IN OUT EFI_STRING *RequestResult,\r
460 IN EFI_STRING ConfigRequestHdr\r
461 )\r
462{\r
463 EFI_STRING StringPtr;\r
ee31d1be
ED
464 UINTN Length;\r
465 UINT8 *TmpBuffer;\r
466 UINTN Offset;\r
467 UINTN Width;\r
468 UINTN BlockSize;\r
469 UINTN ValueOffset;\r
470 UINTN ValueWidth;\r
471 EFI_STATUS Status;\r
472\r
4e1005ec 473 TmpBuffer = NULL;\r
ee31d1be
ED
474 StringPtr = *RequestResult;\r
475 StringPtr = StrStr (StringPtr, L"OFFSET");\r
476 BlockSize = sizeof (DRIVER_SAMPLE_CONFIGURATION);\r
477 ValueOffset = OFFSET_OF (DRIVER_SAMPLE_CONFIGURATION, GetDefaultValueFromAccess);\r
478 ValueWidth = sizeof (((DRIVER_SAMPLE_CONFIGURATION *)0)->GetDefaultValueFromAccess);\r
479\r
480 if (StringPtr == NULL) {\r
481 return;\r
482 }\r
483\r
484 while (*StringPtr != 0 && StrnCmp (StringPtr, L"OFFSET=", StrLen (L"OFFSET=")) == 0) {\r
ee31d1be
ED
485 StringPtr += StrLen (L"OFFSET=");\r
486 //\r
487 // Get Offset\r
488 //\r
489 Status = GetValueOfNumber (StringPtr, &TmpBuffer, &Length);\r
490 if (EFI_ERROR (Status)) {\r
491 return;\r
492 }\r
493 Offset = 0;\r
494 CopyMem (\r
495 &Offset,\r
496 TmpBuffer,\r
497 (((Length + 1) / 2) < sizeof (UINTN)) ? ((Length + 1) / 2) : sizeof (UINTN)\r
498 );\r
499 FreePool (TmpBuffer);\r
500\r
501 StringPtr += Length;\r
502 if (StrnCmp (StringPtr, L"&WIDTH=", StrLen (L"&WIDTH=")) != 0) {\r
503 return;\r
504 }\r
505 StringPtr += StrLen (L"&WIDTH=");\r
506\r
507 //\r
508 // Get Width\r
509 //\r
510 Status = GetValueOfNumber (StringPtr, &TmpBuffer, &Length);\r
511 if (EFI_ERROR (Status)) {\r
512 return;\r
513 }\r
514 Width = 0;\r
515 CopyMem (\r
516 &Width,\r
517 TmpBuffer,\r
518 (((Length + 1) / 2) < sizeof (UINTN)) ? ((Length + 1) / 2) : sizeof (UINTN)\r
519 );\r
520 FreePool (TmpBuffer);\r
521\r
522 StringPtr += Length;\r
523 if (StrnCmp (StringPtr, L"&VALUE=", StrLen (L"&VALUE=")) != 0) {\r
524 return;\r
525 }\r
526 StringPtr += StrLen (L"&VALUE=");\r
527\r
528 //\r
b18e7050 529 // Get Value\r
ee31d1be
ED
530 //\r
531 Status = GetValueOfNumber (StringPtr, &TmpBuffer, &Length);\r
532 if (EFI_ERROR (Status)) {\r
533 return;\r
534 }\r
535 StringPtr += Length;\r
536\r
bfaa3b5b
DB
537 //\r
538 // Skip the character "&" before "OFFSET".\r
539 //\r
540 StringPtr ++;\r
541\r
ee31d1be
ED
542 //\r
543 // Calculate Value and convert it to hex string.\r
544 //\r
545 if (Offset + Width > BlockSize) {\r
546 return;\r
547 }\r
548\r
549 if (Offset <= ValueOffset && Offset + Width >= ValueOffset + ValueWidth) {\r
33d41385
ED
550 *RequestResult = CreateAltCfgString(*RequestResult, ConfigRequestHdr, ValueOffset, ValueWidth);\r
551 return;\r
ee31d1be
ED
552 }\r
553 }\r
554}\r
555\r
93e3992d 556/**\r
557 This function allows a caller to extract the current configuration for one\r
558 or more named elements from the target driver.\r
559\r
560 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
561 @param Request A null-terminated Unicode string in\r
562 <ConfigRequest> format.\r
563 @param Progress On return, points to a character in the Request\r
564 string. Points to the string's null terminator if\r
565 request was successful. Points to the most recent\r
566 '&' before the first failing name/value pair (or\r
567 the beginning of the string if the failure is in\r
568 the first name/value pair) if the request was not\r
569 successful.\r
570 @param Results A null-terminated Unicode string in\r
571 <ConfigAltResp> format which has all values filled\r
572 in for the names in the Request string. String to\r
573 be allocated by the called function.\r
574\r
575 @retval EFI_SUCCESS The Results is filled with the requested values.\r
576 @retval EFI_OUT_OF_RESOURCES Not enough memory to store the results.\r
e35eb8af 577 @retval EFI_INVALID_PARAMETER Request is illegal syntax, or unknown name.\r
93e3992d 578 @retval EFI_NOT_FOUND Routing data doesn't match any storage in this\r
579 driver.\r
580\r
581**/\r
582EFI_STATUS\r
583EFIAPI\r
584ExtractConfig (\r
585 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
586 IN CONST EFI_STRING Request,\r
587 OUT EFI_STRING *Progress,\r
588 OUT EFI_STRING *Results\r
589 )\r
590{\r
591 EFI_STATUS Status;\r
592 UINTN BufferSize;\r
593 DRIVER_SAMPLE_PRIVATE_DATA *PrivateData;\r
594 EFI_HII_CONFIG_ROUTING_PROTOCOL *HiiConfigRouting;\r
84f9a9ec 595 EFI_STRING ConfigRequest;\r
086cd2c8 596 EFI_STRING ConfigRequestHdr;\r
84f9a9ec 597 UINTN Size;\r
38ebfecb
LG
598 EFI_STRING Value;\r
599 UINTN ValueStrLen;\r
600 CHAR16 BackupChar;\r
601 CHAR16 *StrPointer;\r
59aefb7e 602 BOOLEAN AllocatedRequest;\r
38ebfecb 603\r
59aefb7e 604 if (Progress == NULL || Results == NULL) {\r
ae79d2f9
LG
605 return EFI_INVALID_PARAMETER;\r
606 }\r
84f9a9ec
LG
607 //\r
608 // Initialize the local variables.\r
609 //\r
086cd2c8
LG
610 ConfigRequestHdr = NULL;\r
611 ConfigRequest = NULL;\r
612 Size = 0;\r
613 *Progress = Request;\r
59aefb7e 614 AllocatedRequest = FALSE;\r
93e3992d 615\r
616 PrivateData = DRIVER_SAMPLE_PRIVATE_FROM_THIS (This);\r
617 HiiConfigRouting = PrivateData->HiiConfigRouting;\r
618\r
8d00a0f1 619 //\r
84f9a9ec
LG
620 // Get Buffer Storage data from EFI variable.\r
621 // Try to get the current setting from variable.\r
93e3992d 622 //\r
623 BufferSize = sizeof (DRIVER_SAMPLE_CONFIGURATION);\r
04da0b4a
LG
624 Status = gRT->GetVariable (\r
625 VariableName,\r
c8ad2d7a 626 &gDriverSampleFormSetGuid,\r
04da0b4a
LG
627 NULL,\r
628 &BufferSize,\r
629 &PrivateData->Configuration\r
630 );\r
631 if (EFI_ERROR (Status)) {\r
de482998 632 return EFI_NOT_FOUND;\r
04da0b4a 633 }\r
a6973cff 634\r
8d00a0f1 635 if (Request == NULL) {\r
636 //\r
84f9a9ec 637 // Request is set to NULL, construct full request string.\r
7e3bcccb 638 //\r
84f9a9ec 639\r
84f9a9ec 640 //\r
a6973cff 641 // Allocate and fill a buffer large enough to hold the <ConfigHdr> template\r
84f9a9ec
LG
642 // followed by "&OFFSET=0&WIDTH=WWWWWWWWWWWWWWWW" followed by a Null-terminator\r
643 //\r
c8ad2d7a 644 ConfigRequestHdr = HiiConstructConfigHdr (&gDriverSampleFormSetGuid, VariableName, PrivateData->DriverHandle[0]);\r
59aefb7e 645 Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16);\r
84f9a9ec 646 ConfigRequest = AllocateZeroPool (Size);\r
1bd57b6e 647 ASSERT (ConfigRequest != NULL);\r
59aefb7e 648 AllocatedRequest = TRUE;\r
086cd2c8
LG
649 UnicodeSPrint (ConfigRequest, Size, L"%s&OFFSET=0&WIDTH=%016LX", ConfigRequestHdr, (UINT64)BufferSize);\r
650 FreePool (ConfigRequestHdr);\r
ee31d1be 651 ConfigRequestHdr = NULL;\r
84f9a9ec 652 } else {\r
de482998
LG
653 //\r
654 // Check routing data in <ConfigHdr>.\r
655 // Note: if only one Storage is used, then this checking could be skipped.\r
656 //\r
c8ad2d7a 657 if (!HiiIsConfigHdrMatch (Request, &gDriverSampleFormSetGuid, NULL)) {\r
de482998 658 return EFI_NOT_FOUND;\r
84f9a9ec 659 }\r
59aefb7e 660 //\r
78c2b9a3
ED
661 // Check whether request for EFI Varstore. EFI varstore get data\r
662 // through hii database, not support in this path.\r
663 //\r
c8ad2d7a 664 if (HiiIsConfigHdrMatch(Request, &gDriverSampleFormSetGuid, MyEfiVar)) {\r
78c2b9a3
ED
665 return EFI_UNSUPPORTED;\r
666 }\r
667 //\r
59aefb7e
LG
668 // Set Request to the unified request string.\r
669 //\r
de482998 670 ConfigRequest = Request;\r
38ebfecb 671 //\r
59aefb7e 672 // Check whether Request includes Request Element.\r
38ebfecb
LG
673 //\r
674 if (StrStr (Request, L"OFFSET") == NULL) {\r
675 //\r
59aefb7e 676 // Check Request Element does exist in Reques String\r
38ebfecb 677 //\r
59aefb7e
LG
678 StrPointer = StrStr (Request, L"PATH");\r
679 if (StrPointer == NULL) {\r
680 return EFI_INVALID_PARAMETER;\r
681 }\r
682 if (StrStr (StrPointer, L"&") == NULL) {\r
683 Size = (StrLen (Request) + 32 + 1) * sizeof (CHAR16);\r
684 ConfigRequest = AllocateZeroPool (Size);\r
1bd57b6e 685 ASSERT (ConfigRequest != NULL);\r
59aefb7e
LG
686 AllocatedRequest = TRUE;\r
687 UnicodeSPrint (ConfigRequest, Size, L"%s&OFFSET=0&WIDTH=%016LX", Request, (UINT64)BufferSize);\r
38ebfecb 688 }\r
59aefb7e
LG
689 }\r
690 }\r
38ebfecb 691\r
59aefb7e
LG
692 //\r
693 // Check if requesting Name/Value storage\r
694 //\r
695 if (StrStr (ConfigRequest, L"OFFSET") == NULL) {\r
696 //\r
697 // Update Name/Value storage Names\r
698 //\r
699 Status = LoadNameValueNames (PrivateData);\r
700 if (EFI_ERROR (Status)) {\r
701 return Status;\r
702 }\r
38ebfecb 703\r
59aefb7e
LG
704 //\r
705 // Allocate memory for <ConfigResp>, e.g. Name0=0x11, Name1=0x1234, Name2="ABCD"\r
706 // <Request> ::=<ConfigHdr>&Name0&Name1&Name2\r
707 // <ConfigResp>::=<ConfigHdr>&Name0=11&Name1=1234&Name2=0041004200430044\r
708 //\r
709 BufferSize = (StrLen (ConfigRequest) +\r
710 1 + sizeof (PrivateData->Configuration.NameValueVar0) * 2 +\r
711 1 + sizeof (PrivateData->Configuration.NameValueVar1) * 2 +\r
712 1 + sizeof (PrivateData->Configuration.NameValueVar2) * 2 + 1) * sizeof (CHAR16);\r
713 *Results = AllocateZeroPool (BufferSize);\r
714 ASSERT (*Results != NULL);\r
5ad66ec6 715 StrCpyS (*Results, BufferSize / sizeof (CHAR16), ConfigRequest);\r
59aefb7e 716 Value = *Results;\r
38ebfecb 717\r
59aefb7e
LG
718 //\r
719 // Append value of NameValueVar0, type is UINT8\r
720 //\r
721 if ((Value = StrStr (*Results, PrivateData->NameValueName[0])) != NULL) {\r
722 Value += StrLen (PrivateData->NameValueName[0]);\r
723 ValueStrLen = ((sizeof (PrivateData->Configuration.NameValueVar0) * 2) + 1);\r
724 CopyMem (Value + ValueStrLen, Value, StrSize (Value));\r
725\r
726 BackupChar = Value[ValueStrLen];\r
727 *Value++ = L'=';\r
9f4048f7
HW
728 UnicodeValueToStringS (\r
729 Value,\r
730 BufferSize - ((UINTN)Value - (UINTN)*Results),\r
731 PREFIX_ZERO | RADIX_HEX,\r
732 PrivateData->Configuration.NameValueVar0,\r
733 sizeof (PrivateData->Configuration.NameValueVar0) * 2\r
734 );\r
735 Value += StrnLenS (Value, (BufferSize - ((UINTN)Value - (UINTN)*Results)) / sizeof (CHAR16));\r
59aefb7e
LG
736 *Value = BackupChar;\r
737 }\r
738\r
739 //\r
740 // Append value of NameValueVar1, type is UINT16\r
741 //\r
742 if ((Value = StrStr (*Results, PrivateData->NameValueName[1])) != NULL) {\r
743 Value += StrLen (PrivateData->NameValueName[1]);\r
744 ValueStrLen = ((sizeof (PrivateData->Configuration.NameValueVar1) * 2) + 1);\r
745 CopyMem (Value + ValueStrLen, Value, StrSize (Value));\r
746\r
747 BackupChar = Value[ValueStrLen];\r
748 *Value++ = L'=';\r
9f4048f7
HW
749 UnicodeValueToStringS (\r
750 Value,\r
751 BufferSize - ((UINTN)Value - (UINTN)*Results),\r
752 PREFIX_ZERO | RADIX_HEX,\r
753 PrivateData->Configuration.NameValueVar1,\r
754 sizeof (PrivateData->Configuration.NameValueVar1) * 2\r
755 );\r
756 Value += StrnLenS (Value, (BufferSize - ((UINTN)Value - (UINTN)*Results)) / sizeof (CHAR16));\r
59aefb7e
LG
757 *Value = BackupChar;\r
758 }\r
759\r
760 //\r
761 // Append value of NameValueVar2, type is CHAR16 *\r
762 //\r
763 if ((Value = StrStr (*Results, PrivateData->NameValueName[2])) != NULL) {\r
764 Value += StrLen (PrivateData->NameValueName[2]);\r
765 ValueStrLen = StrLen (PrivateData->Configuration.NameValueVar2) * 4 + 1;\r
766 CopyMem (Value + ValueStrLen, Value, StrSize (Value));\r
38ebfecb 767\r
59aefb7e 768 *Value++ = L'=';\r
38ebfecb 769 //\r
59aefb7e 770 // Convert Unicode String to Config String, e.g. "ABCD" => "0041004200430044"\r
38ebfecb 771 //\r
59aefb7e
LG
772 StrPointer = (CHAR16 *) PrivateData->Configuration.NameValueVar2;\r
773 for (; *StrPointer != L'\0'; StrPointer++) {\r
9f4048f7
HW
774 UnicodeValueToStringS (\r
775 Value,\r
776 BufferSize - ((UINTN)Value - (UINTN)*Results),\r
777 PREFIX_ZERO | RADIX_HEX,\r
778 *StrPointer,\r
779 4\r
780 );\r
781 Value += StrnLenS (Value, (BufferSize - ((UINTN)Value - (UINTN)*Results)) / sizeof (CHAR16));\r
38ebfecb 782 }\r
38ebfecb 783 }\r
59aefb7e
LG
784 \r
785 Status = EFI_SUCCESS;\r
786 } else {\r
787 //\r
788 // Convert buffer data to <ConfigResp> by helper function BlockToConfig()\r
789 //\r
790 Status = HiiConfigRouting->BlockToConfig (\r
791 HiiConfigRouting,\r
792 ConfigRequest,\r
793 (UINT8 *) &PrivateData->Configuration,\r
794 BufferSize,\r
795 Results,\r
796 Progress\r
797 );\r
33d41385 798 if (!EFI_ERROR (Status)) {\r
c8ad2d7a 799 ConfigRequestHdr = HiiConstructConfigHdr (&gDriverSampleFormSetGuid, VariableName, PrivateData->DriverHandle[0]);\r
33d41385
ED
800 AppendAltCfgString(Results, ConfigRequestHdr);\r
801 }\r
8d00a0f1 802 }\r
803\r
93e3992d 804 //\r
59aefb7e 805 // Free the allocated config request string.\r
93e3992d 806 //\r
59aefb7e 807 if (AllocatedRequest) {\r
84f9a9ec 808 FreePool (ConfigRequest);\r
59aefb7e 809 }\r
ee31d1be
ED
810\r
811 if (ConfigRequestHdr != NULL) {\r
812 FreePool (ConfigRequestHdr);\r
813 }\r
59aefb7e
LG
814 //\r
815 // Set Progress string to the original request string.\r
816 //\r
817 if (Request == NULL) {\r
1f1cb2f2 818 *Progress = NULL;\r
59aefb7e
LG
819 } else if (StrStr (Request, L"OFFSET") == NULL) {\r
820 *Progress = Request + StrLen (Request);\r
84f9a9ec
LG
821 }\r
822\r
93e3992d 823 return Status;\r
824}\r
825\r
826\r
827/**\r
828 This function processes the results of changes in configuration.\r
829\r
830 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
831 @param Configuration A null-terminated Unicode string in <ConfigResp>\r
832 format.\r
833 @param Progress A pointer to a string filled in with the offset of\r
834 the most recent '&' before the first failing\r
835 name/value pair (or the beginning of the string if\r
836 the failure is in the first name/value pair) or\r
837 the terminating NULL if all was successful.\r
838\r
839 @retval EFI_SUCCESS The Results is processed successfully.\r
840 @retval EFI_INVALID_PARAMETER Configuration is NULL.\r
841 @retval EFI_NOT_FOUND Routing data doesn't match any storage in this\r
842 driver.\r
843\r
844**/\r
845EFI_STATUS\r
846EFIAPI\r
847RouteConfig (\r
848 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
849 IN CONST EFI_STRING Configuration,\r
850 OUT EFI_STRING *Progress\r
851 )\r
852{\r
853 EFI_STATUS Status;\r
854 UINTN BufferSize;\r
855 DRIVER_SAMPLE_PRIVATE_DATA *PrivateData;\r
856 EFI_HII_CONFIG_ROUTING_PROTOCOL *HiiConfigRouting;\r
38ebfecb
LG
857 CHAR16 *Value;\r
858 CHAR16 *StrPtr;\r
859 CHAR16 TemStr[5];\r
860 UINT8 *DataBuffer;\r
861 UINT8 DigitUint8;\r
862 UINTN Index;\r
863 CHAR16 *StrBuffer;\r
93e3992d 864\r
f5e9ff82 865 if (Configuration == NULL || Progress == NULL) {\r
8d00a0f1 866 return EFI_INVALID_PARAMETER;\r
867 }\r
868\r
93e3992d 869 PrivateData = DRIVER_SAMPLE_PRIVATE_FROM_THIS (This);\r
870 HiiConfigRouting = PrivateData->HiiConfigRouting;\r
f5e9ff82 871 *Progress = Configuration;\r
93e3992d 872\r
84f9a9ec 873 //\r
8d00a0f1 874 // Check routing data in <ConfigHdr>.\r
875 // Note: if only one Storage is used, then this checking could be skipped.\r
876 //\r
c8ad2d7a 877 if (!HiiIsConfigHdrMatch (Configuration, &gDriverSampleFormSetGuid, NULL)) {\r
8d00a0f1 878 return EFI_NOT_FOUND;\r
879 }\r
880\r
78c2b9a3
ED
881 //\r
882 // Check whether request for EFI Varstore. EFI varstore get data\r
883 // through hii database, not support in this path.\r
884 //\r
c8ad2d7a 885 if (HiiIsConfigHdrMatch(Configuration, &gDriverSampleFormSetGuid, MyEfiVar)) {\r
78c2b9a3
ED
886 return EFI_UNSUPPORTED;\r
887 }\r
888\r
93e3992d 889 //\r
890 // Get Buffer Storage data from EFI variable\r
891 //\r
892 BufferSize = sizeof (DRIVER_SAMPLE_CONFIGURATION);\r
04da0b4a
LG
893 Status = gRT->GetVariable (\r
894 VariableName,\r
c8ad2d7a 895 &gDriverSampleFormSetGuid,\r
04da0b4a
LG
896 NULL,\r
897 &BufferSize,\r
898 &PrivateData->Configuration\r
899 );\r
900 if (EFI_ERROR (Status)) {\r
901 return Status;\r
902 }\r
93e3992d 903\r
38ebfecb
LG
904 //\r
905 // Check if configuring Name/Value storage\r
906 //\r
907 if (StrStr (Configuration, L"OFFSET") == NULL) {\r
908 //\r
909 // Update Name/Value storage Names\r
910 //\r
911 Status = LoadNameValueNames (PrivateData);\r
912 if (EFI_ERROR (Status)) {\r
913 return Status;\r
914 }\r
915\r
916 //\r
917 // Convert value for NameValueVar0\r
918 //\r
919 if ((Value = StrStr (Configuration, PrivateData->NameValueName[0])) != NULL) {\r
920 //\r
921 // Skip "Name="\r
922 //\r
923 Value += StrLen (PrivateData->NameValueName[0]);\r
924 Value++;\r
925 //\r
926 // Get Value String\r
927 //\r
928 StrPtr = StrStr (Value, L"&");\r
929 if (StrPtr == NULL) {\r
930 StrPtr = Value + StrLen (Value);\r
931 }\r
932 //\r
933 // Convert Value to Buffer data\r
934 //\r
935 DataBuffer = (UINT8 *) &PrivateData->Configuration.NameValueVar0;\r
936 ZeroMem (TemStr, sizeof (TemStr));\r
937 for (Index = 0, StrPtr --; StrPtr >= Value; StrPtr --, Index ++) {\r
938 TemStr[0] = *StrPtr;\r
939 DigitUint8 = (UINT8) StrHexToUint64 (TemStr);\r
940 if ((Index & 1) == 0) {\r
941 DataBuffer [Index/2] = DigitUint8;\r
942 } else {\r
943 DataBuffer [Index/2] = (UINT8) ((UINT8) (DigitUint8 << 4) + DataBuffer [Index/2]);\r
944 }\r
945 }\r
946 }\r
947\r
948 //\r
949 // Convert value for NameValueVar1\r
950 //\r
951 if ((Value = StrStr (Configuration, PrivateData->NameValueName[1])) != NULL) {\r
952 //\r
953 // Skip "Name="\r
954 //\r
955 Value += StrLen (PrivateData->NameValueName[1]);\r
956 Value++;\r
957 //\r
958 // Get Value String\r
959 //\r
960 StrPtr = StrStr (Value, L"&");\r
961 if (StrPtr == NULL) {\r
962 StrPtr = Value + StrLen (Value);\r
963 }\r
964 //\r
965 // Convert Value to Buffer data\r
966 //\r
967 DataBuffer = (UINT8 *) &PrivateData->Configuration.NameValueVar1;\r
968 ZeroMem (TemStr, sizeof (TemStr));\r
969 for (Index = 0, StrPtr --; StrPtr >= Value; StrPtr --, Index ++) {\r
970 TemStr[0] = *StrPtr;\r
971 DigitUint8 = (UINT8) StrHexToUint64 (TemStr);\r
972 if ((Index & 1) == 0) {\r
973 DataBuffer [Index/2] = DigitUint8;\r
974 } else {\r
975 DataBuffer [Index/2] = (UINT8) ((UINT8) (DigitUint8 << 4) + DataBuffer [Index/2]);\r
976 }\r
977 }\r
978 }\r
979\r
980 //\r
981 // Convert value for NameValueVar2\r
982 //\r
983 if ((Value = StrStr (Configuration, PrivateData->NameValueName[2])) != NULL) {\r
984 //\r
985 // Skip "Name="\r
986 //\r
987 Value += StrLen (PrivateData->NameValueName[2]);\r
988 Value++;\r
989 //\r
990 // Get Value String\r
991 //\r
992 StrPtr = StrStr (Value, L"&");\r
993 if (StrPtr == NULL) {\r
994 StrPtr = Value + StrLen (Value);\r
995 }\r
996 //\r
997 // Convert Config String to Unicode String, e.g "0041004200430044" => "ABCD"\r
998 //\r
999 StrBuffer = (CHAR16 *) PrivateData->Configuration.NameValueVar2;\r
1000 ZeroMem (TemStr, sizeof (TemStr));\r
1001 while (Value < StrPtr) {\r
5ad66ec6 1002 StrnCpyS (TemStr, sizeof (TemStr) / sizeof (CHAR16), Value, 4);\r
38ebfecb
LG
1003 *(StrBuffer++) = (CHAR16) StrHexToUint64 (TemStr);\r
1004 Value += 4;\r
1005 }\r
1006 *StrBuffer = L'\0';\r
1007 }\r
1008\r
1009 //\r
1010 // Store Buffer Storage back to EFI variable\r
1011 //\r
1012 Status = gRT->SetVariable(\r
1013 VariableName,\r
c8ad2d7a 1014 &gDriverSampleFormSetGuid,\r
38ebfecb
LG
1015 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
1016 sizeof (DRIVER_SAMPLE_CONFIGURATION),\r
1017 &PrivateData->Configuration\r
1018 );\r
1019\r
1020 return Status;\r
1021 }\r
1022\r
93e3992d 1023 //\r
1024 // Convert <ConfigResp> to buffer data by helper function ConfigToBlock()\r
1025 //\r
1026 BufferSize = sizeof (DRIVER_SAMPLE_CONFIGURATION);\r
1027 Status = HiiConfigRouting->ConfigToBlock (\r
1028 HiiConfigRouting,\r
1029 Configuration,\r
1030 (UINT8 *) &PrivateData->Configuration,\r
1031 &BufferSize,\r
1032 Progress\r
1033 );\r
1034 if (EFI_ERROR (Status)) {\r
1035 return Status;\r
1036 }\r
1037\r
1038 //\r
1039 // Store Buffer Storage back to EFI variable\r
1040 //\r
1041 Status = gRT->SetVariable(\r
1042 VariableName,\r
c8ad2d7a 1043 &gDriverSampleFormSetGuid,\r
93e3992d 1044 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
1045 sizeof (DRIVER_SAMPLE_CONFIGURATION),\r
1046 &PrivateData->Configuration\r
1047 );\r
1048\r
1049 return Status;\r
1050}\r
1051\r
1052\r
1053/**\r
1054 This function processes the results of changes in configuration.\r
1055\r
1056 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
1057 @param Action Specifies the type of action taken by the browser.\r
1058 @param QuestionId A unique value which is sent to the original\r
1059 exporting driver so that it can identify the type\r
1060 of data to expect.\r
1061 @param Type The type of value for the question.\r
1062 @param Value A pointer to the data being sent to the original\r
1063 exporting driver.\r
1064 @param ActionRequest On return, points to the action requested by the\r
1065 callback function.\r
1066\r
1067 @retval EFI_SUCCESS The callback successfully handled the action.\r
1068 @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold the\r
1069 variable and its data.\r
1070 @retval EFI_DEVICE_ERROR The variable could not be saved.\r
1071 @retval EFI_UNSUPPORTED The specified Action is not supported by the\r
1072 callback.\r
1073\r
1074**/\r
1075EFI_STATUS\r
1076EFIAPI\r
1077DriverCallback (\r
1078 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
1079 IN EFI_BROWSER_ACTION Action,\r
1080 IN EFI_QUESTION_ID QuestionId,\r
1081 IN UINT8 Type,\r
1082 IN EFI_IFR_TYPE_VALUE *Value,\r
1083 OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest\r
1084 )\r
1085{\r
1086 DRIVER_SAMPLE_PRIVATE_DATA *PrivateData;\r
1087 EFI_STATUS Status;\r
7e3bcccb
LG
1088 VOID *StartOpCodeHandle;\r
1089 VOID *OptionsOpCodeHandle;\r
1090 EFI_IFR_GUID_LABEL *StartLabel;\r
1091 VOID *EndOpCodeHandle;\r
1092 EFI_IFR_GUID_LABEL *EndLabel;\r
a6973cff 1093 EFI_INPUT_KEY Key;\r
1094 DRIVER_SAMPLE_CONFIGURATION *Configuration;\r
78c2b9a3 1095 MY_EFI_VARSTORE_DATA *EfiData;\r
211cc6e5 1096 EFI_FORM_ID FormId;\r
34326197
ED
1097 EFI_STRING Progress;\r
1098 EFI_STRING Results;\r
1099 UINT32 ProgressErr;\r
1100 CHAR16 *TmpStr;\r
622ce645
DB
1101 UINTN Index;\r
1102 UINT64 BufferValue;\r
dfc55275
DB
1103 EFI_HII_POPUP_SELECTION UserSelection;\r
1104\r
1105 UserSelection = 0xFF;\r
622ce645 1106\r
4a22b9bc
ED
1107 if (((Value == NULL) && (Action != EFI_BROWSER_ACTION_FORM_OPEN) && (Action != EFI_BROWSER_ACTION_FORM_CLOSE))||\r
1108 (ActionRequest == NULL)) {\r
1109 return EFI_INVALID_PARAMETER;\r
1110 }\r
a6973cff 1111\r
a6973cff 1112\r
211cc6e5 1113 FormId = 0;\r
34326197 1114 ProgressErr = 0;\r
4a22b9bc 1115 Status = EFI_SUCCESS;\r
622ce645 1116 BufferValue = 3;\r
4a22b9bc
ED
1117 PrivateData = DRIVER_SAMPLE_PRIVATE_FROM_THIS (This);\r
1118\r
1119 switch (Action) {\r
1120 case EFI_BROWSER_ACTION_FORM_OPEN:\r
1121 {\r
1122 if (QuestionId == 0x1234) {\r
1123 //\r
1124 // Sample CallBack for UEFI FORM_OPEN action:\r
1125 // Add Save action into Form 3 when Form 1 is opened.\r
1126 // This will be done only in FORM_OPEN CallBack of question with ID 0x1234 from Form 1.\r
1127 //\r
1128 PrivateData = DRIVER_SAMPLE_PRIVATE_FROM_THIS (This);\r
1129\r
1130 //\r
1131 // Initialize the container for dynamic opcodes\r
1132 //\r
1133 StartOpCodeHandle = HiiAllocateOpCodeHandle ();\r
1134 ASSERT (StartOpCodeHandle != NULL);\r
1135\r
1136 //\r
1137 // Create Hii Extend Label OpCode as the start opcode\r
1138 //\r
1139 StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (StartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
1140 StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
1141 StartLabel->Number = LABEL_UPDATE2;\r
1142\r
1143 HiiCreateActionOpCode (\r
1144 StartOpCodeHandle, // Container for dynamic created opcodes\r
1145 0x1238, // Question ID\r
1146 STRING_TOKEN(STR_SAVE_TEXT), // Prompt text\r
1147 STRING_TOKEN(STR_SAVE_TEXT), // Help text\r
1148 EFI_IFR_FLAG_CALLBACK, // Question flag\r
1149 0 // Action String ID\r
1150 );\r
1151\r
1152 HiiUpdateForm (\r
1153 PrivateData->HiiHandle[0], // HII handle\r
c8ad2d7a 1154 &gDriverSampleFormSetGuid, // Formset GUID\r
4a22b9bc
ED
1155 0x3, // Form ID\r
1156 StartOpCodeHandle, // Label for where to insert opcodes\r
1157 NULL // Insert data\r
1158 );\r
1159\r
1160 HiiFreeOpCodeHandle (StartOpCodeHandle);\r
1161 }\r
211cc6e5
ED
1162\r
1163 if (QuestionId == 0x1247) {\r
1164 Status = InternalStartMonitor ();\r
1165 ASSERT_EFI_ERROR (Status);\r
1166 }\r
4a22b9bc
ED
1167 }\r
1168 break;\r
1169\r
1170 case EFI_BROWSER_ACTION_FORM_CLOSE:\r
1171 {\r
1172 if (QuestionId == 0x5678) {\r
1173 //\r
1174 // Sample CallBack for UEFI FORM_CLOSE action:\r
1175 // Show up a pop-up to specify Form 3 will be closed when exit Form 3.\r
1176 //\r
1177 do {\r
1178 CreatePopUp (\r
1179 EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
1180 &Key,\r
1181 L"",\r
1182 L"You are going to leave third Form!",\r
1183 L"Press ESC or ENTER to continue ...",\r
1184 L"",\r
1185 NULL\r
1186 );\r
1187 } while ((Key.ScanCode != SCAN_ESC) && (Key.UnicodeChar != CHAR_CARRIAGE_RETURN));\r
1188 }\r
211cc6e5
ED
1189\r
1190 if (QuestionId == 0x1247) {\r
1191 Status = InternalStopMonitor ();\r
1192 ASSERT_EFI_ERROR (Status);\r
1193 }\r
4a22b9bc
ED
1194 }\r
1195 break;\r
1196 \r
1197 case EFI_BROWSER_ACTION_RETRIEVE:\r
1198 {\r
40ffc3b9
DB
1199 switch (QuestionId ) {\r
1200 case 0x1248:\r
1201 if (Type != EFI_IFR_TYPE_REF) {\r
1202 return EFI_INVALID_PARAMETER;\r
1203 }\r
1204 Value->ref.FormId = 0x3;\r
1205 break;\r
1206\r
1207 case 0x5678:\r
1208 case 0x1247:\r
1209 //\r
1210 // We will reach here once the Question is refreshed\r
1211 //\r
1212\r
1213 //\r
1214 // Initialize the container for dynamic opcodes\r
1215 //\r
1216 StartOpCodeHandle = HiiAllocateOpCodeHandle ();\r
1217 ASSERT (StartOpCodeHandle != NULL);\r
1218\r
1219 //\r
1220 // Create Hii Extend Label OpCode as the start opcode\r
1221 //\r
1222 StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (StartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
1223 StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
1224 if (QuestionId == 0x5678) {\r
1225 StartLabel->Number = LABEL_UPDATE2;\r
1226 FormId = 0x03;\r
1227 PrivateData->Configuration.DynamicRefresh++;\r
1228 } else if (QuestionId == 0x1247 ) {\r
1229 StartLabel->Number = LABEL_UPDATE3;\r
1230 FormId = 0x06;\r
1231 PrivateData->Configuration.RefreshGuidCount++;\r
1232 }\r
1233\r
1234 HiiCreateActionOpCode (\r
1235 StartOpCodeHandle, // Container for dynamic created opcodes\r
1236 0x1237, // Question ID\r
1237 STRING_TOKEN(STR_EXIT_TEXT), // Prompt text\r
1238 STRING_TOKEN(STR_EXIT_TEXT), // Help text\r
1239 EFI_IFR_FLAG_CALLBACK, // Question flag\r
1240 0 // Action String ID\r
1241 );\r
1242 \r
1243 HiiUpdateForm (\r
1244 PrivateData->HiiHandle[0], // HII handle\r
1245 &gDriverSampleFormSetGuid, // Formset GUID\r
1246 FormId, // Form ID\r
1247 StartOpCodeHandle, // Label for where to insert opcodes\r
1248 NULL // Insert data\r
1249 );\r
1250\r
1251 HiiFreeOpCodeHandle (StartOpCodeHandle);\r
1252\r
1253 //\r
1254 // Refresh the Question value\r
1255 //\r
1256 Status = gRT->SetVariable(\r
1257 VariableName,\r
1258 &gDriverSampleFormSetGuid,\r
1259 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
1260 sizeof (DRIVER_SAMPLE_CONFIGURATION),\r
1261 &PrivateData->Configuration\r
1262 );\r
1263\r
1264 if (QuestionId == 0x5678) {\r
1265 //\r
1266 // Update uncommitted data of Browser\r
1267 //\r
1268 EfiData = AllocateZeroPool (sizeof (MY_EFI_VARSTORE_DATA));\r
1269 ASSERT (EfiData != NULL);\r
1270 if (HiiGetBrowserData (&gDriverSampleFormSetGuid, MyEfiVar, sizeof (MY_EFI_VARSTORE_DATA), (UINT8 *) EfiData)) {\r
1271 EfiData->Field8 = 111;\r
1272 HiiSetBrowserData (\r
1273 &gDriverSampleFormSetGuid,\r
1274 MyEfiVar,\r
1275 sizeof (MY_EFI_VARSTORE_DATA),\r
1276 (UINT8 *) EfiData,\r
1277 NULL\r
1278 );\r
78c2b9a3 1279 }\r
40ffc3b9 1280 FreePool (EfiData);\r
78c2b9a3 1281 }\r
40ffc3b9 1282 break;\r
4a22b9bc
ED
1283 }\r
1284 }\r
1285 break;\r
1286\r
ee31d1be
ED
1287 case EFI_BROWSER_ACTION_DEFAULT_STANDARD:\r
1288 {\r
1289 switch (QuestionId) {\r
1290 case 0x1240:\r
1291 Value->u8 = DEFAULT_CLASS_STANDARD_VALUE;\r
1292 break;\r
1293\r
622ce645
DB
1294 case 0x1252:\r
1295 for (Index = 0; Index < 3; Index ++) {\r
1296 SetArrayData (Value, EFI_IFR_TYPE_NUM_SIZE_8, Index, BufferValue--);\r
1297 }\r
1298 break;\r
1299\r
ee31d1be
ED
1300 default:\r
1301 Status = EFI_UNSUPPORTED;\r
1302 break;\r
1303 }\r
1304 }\r
1305 break;\r
1306\r
1307 case EFI_BROWSER_ACTION_DEFAULT_MANUFACTURING:\r
1308 {\r
1309 switch (QuestionId) {\r
1310 case 0x1240:\r
1311 Value->u8 = DEFAULT_CLASS_MANUFACTURING_VALUE;\r
1312 break;\r
1313\r
1314 default:\r
1315 Status = EFI_UNSUPPORTED; \r
1316 break;\r
1317 }\r
1318 }\r
1319 break;\r
1320\r
4a22b9bc
ED
1321 case EFI_BROWSER_ACTION_CHANGING:\r
1322 {\r
1323 switch (QuestionId) {\r
78c2b9a3
ED
1324 case 0x1249:\r
1325 {\r
1326 if (Type != EFI_IFR_TYPE_REF) {\r
1327 return EFI_INVALID_PARAMETER;\r
1328 }\r
1329\r
1330 Value->ref.FormId = 0x1234;\r
1331 }\r
1332 break;\r
4a22b9bc 1333 case 0x1234:\r
5adb8db7
LG
1334 //\r
1335 // Initialize the container for dynamic opcodes\r
1336 //\r
1337 StartOpCodeHandle = HiiAllocateOpCodeHandle ();\r
1338 ASSERT (StartOpCodeHandle != NULL);\r
a6973cff 1339\r
4a22b9bc
ED
1340 EndOpCodeHandle = HiiAllocateOpCodeHandle ();\r
1341 ASSERT (EndOpCodeHandle != NULL);\r
1342\r
5adb8db7
LG
1343 //\r
1344 // Create Hii Extend Label OpCode as the start opcode\r
1345 //\r
1346 StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (StartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
1347 StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
4a22b9bc
ED
1348 StartLabel->Number = LABEL_UPDATE1;\r
1349\r
1350 //\r
1351 // Create Hii Extend Label OpCode as the end opcode\r
1352 //\r
1353 EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (EndOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
1354 EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
1355 EndLabel->Number = LABEL_END;\r
5adb8db7
LG
1356\r
1357 HiiCreateActionOpCode (\r
1358 StartOpCodeHandle, // Container for dynamic created opcodes\r
4a22b9bc
ED
1359 0x1237, // Question ID\r
1360 STRING_TOKEN(STR_EXIT_TEXT), // Prompt text\r
1361 STRING_TOKEN(STR_EXIT_TEXT), // Help text\r
5adb8db7
LG
1362 EFI_IFR_FLAG_CALLBACK, // Question flag\r
1363 0 // Action String ID\r
a6973cff 1364 );\r
1365\r
4a22b9bc
ED
1366 //\r
1367 // Create Option OpCode\r
1368 //\r
1369 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
1370 ASSERT (OptionsOpCodeHandle != NULL);\r
1371\r
1372 HiiCreateOneOfOptionOpCode (\r
1373 OptionsOpCodeHandle,\r
1374 STRING_TOKEN (STR_BOOT_OPTION1),\r
1375 0,\r
1376 EFI_IFR_NUMERIC_SIZE_1,\r
1377 1\r
5adb8db7
LG
1378 );\r
1379\r
4a22b9bc
ED
1380 HiiCreateOneOfOptionOpCode (\r
1381 OptionsOpCodeHandle,\r
1382 STRING_TOKEN (STR_BOOT_OPTION2),\r
1383 0,\r
1384 EFI_IFR_NUMERIC_SIZE_1,\r
1385 2\r
1386 );\r
1387\r
1388 //\r
1389 // Prepare initial value for the dynamic created oneof Question\r
1390 //\r
1391 PrivateData->Configuration.DynamicOneof = 2;\r
1392 Status = gRT->SetVariable(\r
1393 VariableName,\r
c8ad2d7a 1394 &gDriverSampleFormSetGuid,\r
4a22b9bc
ED
1395 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
1396 sizeof (DRIVER_SAMPLE_CONFIGURATION),\r
1397 &PrivateData->Configuration\r
1398 );\r
a6973cff 1399\r
5adb8db7 1400 //\r
4a22b9bc 1401 // Set initial vlaue of dynamic created oneof Question in Form Browser\r
5adb8db7 1402 //\r
4a22b9bc
ED
1403 Configuration = AllocateZeroPool (sizeof (DRIVER_SAMPLE_CONFIGURATION));\r
1404 ASSERT (Configuration != NULL);\r
c8ad2d7a 1405 if (HiiGetBrowserData (&gDriverSampleFormSetGuid, VariableName, sizeof (DRIVER_SAMPLE_CONFIGURATION), (UINT8 *) Configuration)) {\r
4a22b9bc
ED
1406 Configuration->DynamicOneof = 2;\r
1407\r
1408 //\r
1409 // Update uncommitted data of Browser\r
1410 //\r
1411 HiiSetBrowserData (\r
c8ad2d7a 1412 &gDriverSampleFormSetGuid,\r
4a22b9bc
ED
1413 VariableName,\r
1414 sizeof (DRIVER_SAMPLE_CONFIGURATION),\r
1415 (UINT8 *) Configuration,\r
5adb8db7
LG
1416 NULL\r
1417 );\r
4a22b9bc
ED
1418 }\r
1419 FreePool (Configuration);\r
1420\r
1421 HiiCreateOneOfOpCode (\r
1422 StartOpCodeHandle, // Container for dynamic created opcodes\r
1423 0x8001, // Question ID (or call it "key")\r
1424 CONFIGURATION_VARSTORE_ID, // VarStore ID\r
1425 (UINT16) DYNAMIC_ONE_OF_VAR_OFFSET, // Offset in Buffer Storage\r
1426 STRING_TOKEN (STR_ONE_OF_PROMPT), // Question prompt text\r
1427 STRING_TOKEN (STR_ONE_OF_HELP), // Question help text\r
1428 EFI_IFR_FLAG_CALLBACK, // Question flag\r
1429 EFI_IFR_NUMERIC_SIZE_1, // Data type of Question Value\r
1430 OptionsOpCodeHandle, // Option Opcode list\r
1431 NULL // Default Opcode is NULl\r
1432 );\r
7e3bcccb 1433\r
4a22b9bc
ED
1434 HiiCreateOrderedListOpCode (\r
1435 StartOpCodeHandle, // Container for dynamic created opcodes\r
1436 0x8002, // Question ID\r
1437 CONFIGURATION_VARSTORE_ID, // VarStore ID\r
1438 (UINT16) DYNAMIC_ORDERED_LIST_VAR_OFFSET, // Offset in Buffer Storage\r
1439 STRING_TOKEN (STR_BOOT_OPTIONS), // Question prompt text\r
1440 STRING_TOKEN (STR_BOOT_OPTIONS), // Question help text\r
1441 EFI_IFR_FLAG_RESET_REQUIRED, // Question flag\r
1442 0, // Ordered list flag, e.g. EFI_IFR_UNIQUE_SET\r
1443 EFI_IFR_NUMERIC_SIZE_1, // Data type of Question value\r
1444 5, // Maximum container\r
1445 OptionsOpCodeHandle, // Option Opcode list\r
1446 NULL // Default Opcode is NULl\r
1447 );\r
7e3bcccb 1448\r
4a22b9bc
ED
1449 HiiCreateTextOpCode (\r
1450 StartOpCodeHandle,\r
1451 STRING_TOKEN(STR_TEXT_SAMPLE_HELP),\r
1452 STRING_TOKEN(STR_TEXT_SAMPLE_HELP),\r
1453 STRING_TOKEN(STR_TEXT_SAMPLE_STRING)\r
7e3bcccb
LG
1454 );\r
1455\r
4a22b9bc
ED
1456 HiiCreateDateOpCode (\r
1457 StartOpCodeHandle,\r
1458 0x8004,\r
1459 0x0,\r
1460 0x0,\r
1461 STRING_TOKEN(STR_DATE_SAMPLE_HELP),\r
1462 STRING_TOKEN(STR_DATE_SAMPLE_HELP),\r
1463 0,\r
1464 QF_DATE_STORAGE_TIME,\r
1465 NULL\r
1466 );\r
7e3bcccb 1467\r
4a22b9bc
ED
1468 HiiCreateTimeOpCode (\r
1469 StartOpCodeHandle,\r
1470 0x8005,\r
1471 0x0,\r
1472 0x0,\r
1473 STRING_TOKEN(STR_TIME_SAMPLE_HELP),\r
1474 STRING_TOKEN(STR_TIME_SAMPLE_HELP),\r
1475 0,\r
1476 QF_TIME_STORAGE_TIME,\r
1477 NULL\r
1478 );\r
7e3bcccb 1479\r
4a22b9bc
ED
1480 HiiCreateGotoOpCode (\r
1481 StartOpCodeHandle, // Container for dynamic created opcodes\r
1482 1, // Target Form ID\r
1483 STRING_TOKEN (STR_GOTO_FORM1), // Prompt text\r
1484 STRING_TOKEN (STR_GOTO_HELP), // Help text\r
1485 0, // Question flag\r
1486 0x8003 // Question ID\r
1487 );\r
a6973cff 1488\r
4a22b9bc
ED
1489 HiiUpdateForm (\r
1490 PrivateData->HiiHandle[0], // HII handle\r
c8ad2d7a 1491 &gDriverSampleFormSetGuid, // Formset GUID\r
4a22b9bc
ED
1492 0x1234, // Form ID\r
1493 StartOpCodeHandle, // Label for where to insert opcodes\r
1494 EndOpCodeHandle // Replace data\r
a6973cff 1495 );\r
7e3bcccb 1496\r
4a22b9bc
ED
1497 HiiFreeOpCodeHandle (StartOpCodeHandle);\r
1498 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
1499 HiiFreeOpCodeHandle (EndOpCodeHandle);\r
1500 break;\r
7e3bcccb 1501\r
93e3992d 1502 default:\r
1503 break;\r
1504 }\r
4a22b9bc
ED
1505 }\r
1506 break;\r
93e3992d 1507\r
3a4e7a3e
ED
1508 case EFI_BROWSER_ACTION_CHANGED:\r
1509 switch (QuestionId) {\r
1510 case 0x1237:\r
1511 //\r
1512 // User press "Exit now", request Browser to exit\r
1513 //\r
1514 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;\r
1515 break;\r
1516 \r
1517 case 0x1238:\r
1518 //\r
1519 // User press "Save now", request Browser to save the uncommitted data.\r
1520 //\r
1521 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_SUBMIT;\r
1522 break;\r
1523 \r
1524 case 0x1241:\r
1525 case 0x1246:\r
1526 //\r
1527 // User press "Submit current form and Exit now", request Browser to submit current form and exit\r
1528 //\r
1529 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_SUBMIT_EXIT;\r
1530 break;\r
1531 \r
1532 case 0x1242:\r
1533 //\r
1534 // User press "Discard current form now", request Browser to discard the uncommitted data.\r
1535 //\r
1536 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_DISCARD;\r
1537 break;\r
1538 \r
1539 case 0x1243:\r
1540 //\r
1541 // User press "Submit current form now", request Browser to save the uncommitted data.\r
1542 //\r
1543 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_APPLY;\r
1544 break;\r
1545 \r
1546 case 0x1244:\r
1547 case 0x1245:\r
1548 //\r
1549 // User press "Discard current form and Exit now", request Browser to discard the uncommitted data and exit.\r
1550 //\r
1551 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_DISCARD_EXIT;\r
1552 break;\r
34326197
ED
1553\r
1554 case 0x1231:\r
1555 //\r
1556 // 1. Check to see whether system support keyword.\r
1557 //\r
1558 Status = PrivateData->HiiKeywordHandler->GetData (PrivateData->HiiKeywordHandler,\r
1559 L"NAMESPACE=x-UEFI-ns",\r
1560 L"KEYWORD=iSCSIBootEnable",\r
1561 &Progress,\r
1562 &ProgressErr,\r
1563 &Results\r
1564 );\r
1565 if (EFI_ERROR (Status)) {\r
1566 do {\r
1567 CreatePopUp (\r
1568 EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
1569 &Key,\r
1570 L"",\r
1571 L"This system not support this keyword!",\r
1572 L"Press ENTER to continue ...",\r
1573 L"",\r
1574 NULL\r
1575 );\r
1576 } while (Key.UnicodeChar != CHAR_CARRIAGE_RETURN);\r
1577\r
1578 Status = EFI_SUCCESS;\r
1579 break;\r
1580 }\r
1581\r
1582 //\r
1583 // 2. If system support this keyword, just try to change value.\r
1584 //\r
3a4e7a3e 1585 \r
34326197
ED
1586 //\r
1587 // Change value from '0' to '1' or from '1' to '0'\r
1588 //\r
1589 TmpStr = StrStr (Results, L"&VALUE=");\r
1590 ASSERT (TmpStr != NULL);\r
1591 TmpStr += StrLen (L"&VALUE=");\r
1592 TmpStr++;\r
1593 if (*TmpStr == L'0') {\r
1594 *TmpStr = L'1';\r
1595 } else {\r
1596 *TmpStr = L'0';\r
1597 }\r
1598\r
1599 //\r
1600 // 3. Call the keyword handler protocol to change the value.\r
1601 //\r
1602 Status = PrivateData->HiiKeywordHandler->SetData (PrivateData->HiiKeywordHandler,\r
1603 Results,\r
1604 &Progress,\r
1605 &ProgressErr\r
1606 );\r
1607 if (EFI_ERROR (Status)) {\r
1608 do {\r
1609 CreatePopUp (\r
1610 EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
1611 &Key,\r
1612 L"",\r
1613 L"Set keyword to the system failed!",\r
1614 L"Press ENTER to continue ...",\r
1615 L"",\r
1616 NULL\r
1617 );\r
1618 } while (Key.UnicodeChar != CHAR_CARRIAGE_RETURN);\r
1619\r
1620 Status = EFI_SUCCESS;\r
1621 break;\r
1622 }\r
1623 break;\r
1624\r
dfc55275
DB
1625 case 0x1330:\r
1626 Status = mPrivateData->HiiPopup->CreatePopup (\r
1627 mPrivateData->HiiPopup,\r
1628 EfiHiiPopupStyleInfo,\r
1629 EfiHiiPopupTypeYesNo,\r
1630 mPrivateData->HiiHandle[0],\r
1631 STRING_TOKEN (STR_POPUP_STRING),\r
1632 &UserSelection\r
1633 );\r
1634 if (!EFI_ERROR (Status)) {\r
1635 if (UserSelection == EfiHiiPopupSelectionYes) {\r
1636 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;\r
1637 }\r
1638 }\r
1639 break;\r
1640\r
3a4e7a3e
ED
1641 default:\r
1642 break;\r
1643 }\r
1644 break;\r
1645\r
003f3c00
DB
1646 case EFI_BROWSER_ACTION_SUBMITTED:\r
1647 {\r
1648 if (QuestionId == 0x1250) {\r
1649 //\r
1650 // Sample CallBack for EFI_BROWSER_ACTION_SUBMITTED action:\r
1651 // Show up a pop-up to show SUBMITTED callback has been triggered.\r
1652 //\r
1653 do {\r
1654 CreatePopUp (\r
1655 EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
1656 &Key,\r
1657 L"",\r
1658 L"EfiVarstore value has been submitted!",\r
1659 L"Press ESC or ENTER to continue ...",\r
1660 L"",\r
1661 NULL\r
1662 );\r
1663 } while ((Key.ScanCode != SCAN_ESC) && (Key.UnicodeChar != CHAR_CARRIAGE_RETURN));\r
1664 }\r
1665 }\r
1666 break;\r
1667\r
93e3992d 1668 default:\r
4a22b9bc 1669 Status = EFI_UNSUPPORTED;\r
93e3992d 1670 break;\r
1671 }\r
1672\r
1673 return Status;\r
1674}\r
1675\r
7064c0a5 1676/**\r
1677 Main entry for this driver.\r
a6973cff 1678\r
7064c0a5 1679 @param ImageHandle Image handle this driver.\r
1680 @param SystemTable Pointer to SystemTable.\r
1681\r
1682 @retval EFI_SUCESS This function always complete successfully.\r
1683\r
1684**/\r
93e3992d 1685EFI_STATUS\r
1686EFIAPI\r
1687DriverSampleInit (\r
1688 IN EFI_HANDLE ImageHandle,\r
1689 IN EFI_SYSTEM_TABLE *SystemTable\r
1690 )\r
1691{\r
1692 EFI_STATUS Status;\r
93e3992d 1693 EFI_HII_HANDLE HiiHandle[2];\r
93e3992d 1694 EFI_SCREEN_DESCRIPTOR Screen;\r
1695 EFI_HII_DATABASE_PROTOCOL *HiiDatabase;\r
1696 EFI_HII_STRING_PROTOCOL *HiiString;\r
1697 EFI_FORM_BROWSER2_PROTOCOL *FormBrowser2;\r
1698 EFI_HII_CONFIG_ROUTING_PROTOCOL *HiiConfigRouting;\r
34326197 1699 EFI_CONFIG_KEYWORD_HANDLER_PROTOCOL *HiiKeywordHandler;\r
dfc55275 1700 EFI_HII_POPUP_PROTOCOL *PopupHandler;\r
93e3992d 1701 CHAR16 *NewString;\r
1702 UINTN BufferSize;\r
1703 DRIVER_SAMPLE_CONFIGURATION *Configuration;\r
84f9a9ec 1704 BOOLEAN ActionFlag;\r
a6973cff 1705 EFI_STRING ConfigRequestHdr;\r
82e8c138 1706 EFI_STRING NameRequestHdr;\r
78c2b9a3 1707 MY_EFI_VARSTORE_DATA *VarStoreConfig;\r
2b826e21 1708 EFI_INPUT_KEY HotKey;\r
2fa0e11d 1709 EDKII_FORM_BROWSER_EXTENSION_PROTOCOL *FormBrowserEx;\r
a6973cff 1710\r
93e3992d 1711 //\r
84f9a9ec 1712 // Initialize the local variables.\r
93e3992d 1713 //\r
84f9a9ec 1714 ConfigRequestHdr = NULL;\r
33efdf51
ED
1715 NewString = NULL;\r
1716\r
93e3992d 1717 //\r
1718 // Initialize screen dimensions for SendForm().\r
1719 // Remove 3 characters from top and bottom\r
1720 //\r
1721 ZeroMem (&Screen, sizeof (EFI_SCREEN_DESCRIPTOR));\r
1722 gST->ConOut->QueryMode (gST->ConOut, gST->ConOut->Mode->Mode, &Screen.RightColumn, &Screen.BottomRow);\r
1723\r
1724 Screen.TopRow = 3;\r
1725 Screen.BottomRow = Screen.BottomRow - 3;\r
1726\r
1727 //\r
1728 // Initialize driver private data\r
1729 //\r
7b2c31ae
LG
1730 mPrivateData = AllocateZeroPool (sizeof (DRIVER_SAMPLE_PRIVATE_DATA));\r
1731 if (mPrivateData == NULL) {\r
93e3992d 1732 return EFI_OUT_OF_RESOURCES;\r
1733 }\r
1734\r
7b2c31ae 1735 mPrivateData->Signature = DRIVER_SAMPLE_PRIVATE_SIGNATURE;\r
93e3992d 1736\r
7b2c31ae
LG
1737 mPrivateData->ConfigAccess.ExtractConfig = ExtractConfig;\r
1738 mPrivateData->ConfigAccess.RouteConfig = RouteConfig;\r
1739 mPrivateData->ConfigAccess.Callback = DriverCallback;\r
93e3992d 1740\r
1741 //\r
1742 // Locate Hii Database protocol\r
1743 //\r
1744 Status = gBS->LocateProtocol (&gEfiHiiDatabaseProtocolGuid, NULL, (VOID **) &HiiDatabase);\r
1745 if (EFI_ERROR (Status)) {\r
1746 return Status;\r
1747 }\r
7b2c31ae 1748 mPrivateData->HiiDatabase = HiiDatabase;\r
93e3992d 1749\r
1750 //\r
1751 // Locate HiiString protocol\r
1752 //\r
1753 Status = gBS->LocateProtocol (&gEfiHiiStringProtocolGuid, NULL, (VOID **) &HiiString);\r
1754 if (EFI_ERROR (Status)) {\r
1755 return Status;\r
1756 }\r
7b2c31ae 1757 mPrivateData->HiiString = HiiString;\r
93e3992d 1758\r
1759 //\r
1760 // Locate Formbrowser2 protocol\r
1761 //\r
1762 Status = gBS->LocateProtocol (&gEfiFormBrowser2ProtocolGuid, NULL, (VOID **) &FormBrowser2);\r
1763 if (EFI_ERROR (Status)) {\r
1764 return Status;\r
1765 }\r
7b2c31ae 1766 mPrivateData->FormBrowser2 = FormBrowser2;\r
93e3992d 1767\r
1768 //\r
1769 // Locate ConfigRouting protocol\r
1770 //\r
1771 Status = gBS->LocateProtocol (&gEfiHiiConfigRoutingProtocolGuid, NULL, (VOID **) &HiiConfigRouting);\r
1772 if (EFI_ERROR (Status)) {\r
1773 return Status;\r
1774 }\r
7b2c31ae 1775 mPrivateData->HiiConfigRouting = HiiConfigRouting;\r
93e3992d 1776\r
34326197
ED
1777 //\r
1778 // Locate keyword handler protocol\r
1779 //\r
1780 Status = gBS->LocateProtocol (&gEfiConfigKeywordHandlerProtocolGuid, NULL, (VOID **) &HiiKeywordHandler);\r
1781 if (EFI_ERROR (Status)) {\r
1782 return Status;\r
1783 }\r
7b2c31ae 1784 mPrivateData->HiiKeywordHandler = HiiKeywordHandler;\r
34326197 1785\r
dfc55275
DB
1786 //\r
1787 // Locate HiiPopup protocol\r
1788 //\r
1789 Status = gBS->LocateProtocol (&gEfiHiiPopupProtocolGuid, NULL, (VOID **) &PopupHandler);\r
1790 if (EFI_ERROR (Status)) {\r
1791 return Status;\r
1792 }\r
1793 mPrivateData->HiiPopup = PopupHandler;\r
1794\r
f6f910dd 1795 Status = gBS->InstallMultipleProtocolInterfaces (\r
93e3992d 1796 &DriverHandle[0],\r
f6f910dd 1797 &gEfiDevicePathProtocolGuid,\r
2f3065c0 1798 &mHiiVendorDevicePath0,\r
93e3992d 1799 &gEfiHiiConfigAccessProtocolGuid,\r
7b2c31ae 1800 &mPrivateData->ConfigAccess,\r
f6f910dd 1801 NULL\r
93e3992d 1802 );\r
1803 ASSERT_EFI_ERROR (Status);\r
1804\r
7b2c31ae 1805 mPrivateData->DriverHandle[0] = DriverHandle[0];\r
f6f910dd 1806\r
93e3992d 1807 //\r
1808 // Publish our HII data\r
1809 //\r
cb7d01c0 1810 HiiHandle[0] = HiiAddPackages (\r
c8ad2d7a 1811 &gDriverSampleFormSetGuid,\r
cb7d01c0 1812 DriverHandle[0],\r
1813 DriverSampleStrings,\r
1814 VfrBin,\r
1815 NULL\r
1816 );\r
1817 if (HiiHandle[0] == NULL) {\r
93e3992d 1818 return EFI_OUT_OF_RESOURCES;\r
1819 }\r
1820\r
7b2c31ae 1821 mPrivateData->HiiHandle[0] = HiiHandle[0];\r
93e3992d 1822\r
1823 //\r
1824 // Publish another Fromset\r
1825 //\r
f6f910dd 1826 Status = gBS->InstallMultipleProtocolInterfaces (\r
1827 &DriverHandle[1],\r
1828 &gEfiDevicePathProtocolGuid,\r
2f3065c0 1829 &mHiiVendorDevicePath1,\r
34326197 1830 &gEfiHiiConfigAccessProtocolGuid,\r
7b2c31ae 1831 &mPrivateData->ConfigAccess,\r
f6f910dd 1832 NULL\r
1833 );\r
1834 ASSERT_EFI_ERROR (Status);\r
1835\r
7b2c31ae 1836 mPrivateData->DriverHandle[1] = DriverHandle[1];\r
93e3992d 1837\r
cb7d01c0 1838 HiiHandle[1] = HiiAddPackages (\r
c8ad2d7a 1839 &gDriverSampleInventoryGuid,\r
cb7d01c0 1840 DriverHandle[1],\r
1841 DriverSampleStrings,\r
1842 InventoryBin,\r
1843 NULL\r
1844 );\r
1845 if (HiiHandle[1] == NULL) {\r
38ebfecb 1846 DriverSampleUnload (ImageHandle);\r
93e3992d 1847 return EFI_OUT_OF_RESOURCES;\r
1848 }\r
1849\r
7b2c31ae 1850 mPrivateData->HiiHandle[1] = HiiHandle[1];\r
93e3992d 1851\r
b204f2b5
ED
1852 //\r
1853 // Update the device path string.\r
1854 //\r
863986b3 1855 NewString = ConvertDevicePathToText((EFI_DEVICE_PATH_PROTOCOL*)&mHiiVendorDevicePath0, FALSE, FALSE);\r
33efdf51 1856 if (HiiSetString (HiiHandle[0], STRING_TOKEN (STR_DEVICE_PATH), NewString, NULL) == 0) {\r
b204f2b5
ED
1857 DriverSampleUnload (ImageHandle);\r
1858 return EFI_OUT_OF_RESOURCES;\r
1859 }\r
33efdf51
ED
1860 if (NewString != NULL) {\r
1861 FreePool (NewString);\r
1862 }\r
1863\r
93e3992d 1864 //\r
1865 // Very simple example of how one would update a string that is already\r
1866 // in the HII database\r
1867 //\r
1868 NewString = L"700 Mhz";\r
1869\r
cb7d01c0 1870 if (HiiSetString (HiiHandle[0], STRING_TOKEN (STR_CPU_STRING2), NewString, NULL) == 0) {\r
38ebfecb 1871 DriverSampleUnload (ImageHandle);\r
cb7d01c0 1872 return EFI_OUT_OF_RESOURCES;\r
93e3992d 1873 }\r
1874\r
38ebfecb
LG
1875 HiiSetString (HiiHandle[0], 0, NewString, NULL);\r
1876\r
1877 //\r
1878 // Initialize Name/Value name String ID\r
1879 //\r
7b2c31ae
LG
1880 mPrivateData->NameStringId[0] = STR_NAME_VALUE_VAR_NAME0;\r
1881 mPrivateData->NameStringId[1] = STR_NAME_VALUE_VAR_NAME1;\r
1882 mPrivateData->NameStringId[2] = STR_NAME_VALUE_VAR_NAME2;\r
38ebfecb 1883\r
93e3992d 1884 //\r
1885 // Initialize configuration data\r
1886 //\r
7b2c31ae 1887 Configuration = &mPrivateData->Configuration;\r
93e3992d 1888 ZeroMem (Configuration, sizeof (DRIVER_SAMPLE_CONFIGURATION));\r
1889\r
1890 //\r
1891 // Try to read NV config EFI variable first\r
1892 //\r
c8ad2d7a 1893 ConfigRequestHdr = HiiConstructConfigHdr (&gDriverSampleFormSetGuid, VariableName, DriverHandle[0]);\r
84f9a9ec
LG
1894 ASSERT (ConfigRequestHdr != NULL);\r
1895\r
82e8c138
ED
1896 NameRequestHdr = HiiConstructConfigHdr (&gDriverSampleFormSetGuid, NULL, DriverHandle[0]);\r
1897 ASSERT (NameRequestHdr != NULL);\r
1898\r
93e3992d 1899 BufferSize = sizeof (DRIVER_SAMPLE_CONFIGURATION);\r
c8ad2d7a 1900 Status = gRT->GetVariable (VariableName, &gDriverSampleFormSetGuid, NULL, &BufferSize, Configuration);\r
84f9a9ec 1901 if (EFI_ERROR (Status)) {\r
04da0b4a
LG
1902 //\r
1903 // Store zero data Buffer Storage to EFI variable\r
1904 //\r
1905 Status = gRT->SetVariable(\r
1906 VariableName,\r
c8ad2d7a 1907 &gDriverSampleFormSetGuid,\r
04da0b4a
LG
1908 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
1909 sizeof (DRIVER_SAMPLE_CONFIGURATION),\r
1910 Configuration\r
1911 );\r
2c775600
ED
1912 if (EFI_ERROR (Status)) {\r
1913 DriverSampleUnload (ImageHandle);\r
1914 return Status;\r
1915 }\r
93e3992d 1916 //\r
1917 // EFI variable for NV config doesn't exit, we should build this variable\r
1918 // based on default values stored in IFR\r
1919 //\r
82e8c138 1920 ActionFlag = HiiSetToDefaults (NameRequestHdr, EFI_HII_DEFAULT_CLASS_STANDARD);\r
2c775600
ED
1921 if (!ActionFlag) {\r
1922 DriverSampleUnload (ImageHandle);\r
1923 return EFI_INVALID_PARAMETER;\r
1924 }\r
82e8c138 1925\r
84f9a9ec 1926 ActionFlag = HiiSetToDefaults (ConfigRequestHdr, EFI_HII_DEFAULT_CLASS_STANDARD);\r
2c775600
ED
1927 if (!ActionFlag) {\r
1928 DriverSampleUnload (ImageHandle);\r
1929 return EFI_INVALID_PARAMETER;\r
1930 }\r
84f9a9ec
LG
1931 } else {\r
1932 //\r
1933 // EFI variable does exist and Validate Current Setting\r
1934 //\r
82e8c138 1935 ActionFlag = HiiValidateSettings (NameRequestHdr);\r
2c775600
ED
1936 if (!ActionFlag) {\r
1937 DriverSampleUnload (ImageHandle);\r
1938 return EFI_INVALID_PARAMETER;\r
1939 }\r
82e8c138 1940\r
84f9a9ec 1941 ActionFlag = HiiValidateSettings (ConfigRequestHdr);\r
2c775600
ED
1942 if (!ActionFlag) {\r
1943 DriverSampleUnload (ImageHandle);\r
1944 return EFI_INVALID_PARAMETER;\r
1945 }\r
93e3992d 1946 }\r
78c2b9a3 1947 FreePool (ConfigRequestHdr);\r
a6973cff 1948\r
78c2b9a3
ED
1949 //\r
1950 // Initialize efi varstore configuration data\r
1951 //\r
7b2c31ae 1952 VarStoreConfig = &mPrivateData->VarStoreConfig;\r
78c2b9a3
ED
1953 ZeroMem (VarStoreConfig, sizeof (MY_EFI_VARSTORE_DATA));\r
1954\r
c8ad2d7a 1955 ConfigRequestHdr = HiiConstructConfigHdr (&gDriverSampleFormSetGuid, MyEfiVar, DriverHandle[0]);\r
78c2b9a3
ED
1956 ASSERT (ConfigRequestHdr != NULL);\r
1957\r
1958 BufferSize = sizeof (MY_EFI_VARSTORE_DATA);\r
c8ad2d7a 1959 Status = gRT->GetVariable (MyEfiVar, &gDriverSampleFormSetGuid, NULL, &BufferSize, VarStoreConfig);\r
78c2b9a3
ED
1960 if (EFI_ERROR (Status)) {\r
1961 //\r
1962 // Store zero data to EFI variable Storage.\r
1963 //\r
1964 Status = gRT->SetVariable(\r
1965 MyEfiVar,\r
c8ad2d7a 1966 &gDriverSampleFormSetGuid,\r
78c2b9a3
ED
1967 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
1968 sizeof (MY_EFI_VARSTORE_DATA),\r
1969 VarStoreConfig\r
1970 );\r
2c775600
ED
1971 if (EFI_ERROR (Status)) {\r
1972 DriverSampleUnload (ImageHandle);\r
1973 return Status;\r
1974 }\r
78c2b9a3
ED
1975 //\r
1976 // EFI variable for NV config doesn't exit, we should build this variable\r
1977 // based on default values stored in IFR\r
1978 //\r
1979 ActionFlag = HiiSetToDefaults (ConfigRequestHdr, EFI_HII_DEFAULT_CLASS_STANDARD);\r
2c775600
ED
1980 if (!ActionFlag) {\r
1981 DriverSampleUnload (ImageHandle);\r
1982 return EFI_INVALID_PARAMETER;\r
1983 }\r
78c2b9a3
ED
1984 } else {\r
1985 //\r
1986 // EFI variable does exist and Validate Current Setting\r
1987 //\r
1988 ActionFlag = HiiValidateSettings (ConfigRequestHdr);\r
2c775600
ED
1989 if (!ActionFlag) {\r
1990 DriverSampleUnload (ImageHandle);\r
1991 return EFI_INVALID_PARAMETER;\r
1992 }\r
78c2b9a3 1993 }\r
84f9a9ec
LG
1994 FreePool (ConfigRequestHdr);\r
1995\r
211cc6e5
ED
1996 Status = gBS->CreateEventEx (\r
1997 EVT_NOTIFY_SIGNAL, \r
1998 TPL_NOTIFY,\r
ac72474d 1999 EfiEventEmptyFunction,\r
211cc6e5 2000 NULL,\r
c8ad2d7a 2001 &gEfiIfrRefreshIdOpGuid,\r
211cc6e5
ED
2002 &mEvent\r
2003 );\r
2004 ASSERT_EFI_ERROR (Status);\r
2b826e21
LG
2005\r
2006 //\r
2007 // Example of how to use BrowserEx protocol to register HotKey.\r
2008 // \r
2fa0e11d 2009 Status = gBS->LocateProtocol (&gEdkiiFormBrowserExProtocolGuid, NULL, (VOID **) &FormBrowserEx);\r
2b826e21
LG
2010 if (!EFI_ERROR (Status)) {\r
2011 //\r
2012 // First unregister the default hot key F9 and F10.\r
2013 //\r
2014 HotKey.UnicodeChar = CHAR_NULL;\r
2015 HotKey.ScanCode = SCAN_F9;\r
2016 FormBrowserEx->RegisterHotKey (&HotKey, 0, 0, NULL);\r
2017 HotKey.ScanCode = SCAN_F10;\r
2018 FormBrowserEx->RegisterHotKey (&HotKey, 0, 0, NULL);\r
2019 \r
2020 //\r
2021 // Register the default HotKey F9 and F10 again.\r
2022 //\r
2023 HotKey.ScanCode = SCAN_F10;\r
7b2c31ae 2024 NewString = HiiGetString (mPrivateData->HiiHandle[0], STRING_TOKEN (FUNCTION_TEN_STRING), NULL);\r
2b826e21
LG
2025 ASSERT (NewString != NULL);\r
2026 FormBrowserEx->RegisterHotKey (&HotKey, BROWSER_ACTION_SUBMIT, 0, NewString);\r
2027 HotKey.ScanCode = SCAN_F9;\r
7b2c31ae 2028 NewString = HiiGetString (mPrivateData->HiiHandle[0], STRING_TOKEN (FUNCTION_NINE_STRING), NULL);\r
2b826e21
LG
2029 ASSERT (NewString != NULL);\r
2030 FormBrowserEx->RegisterHotKey (&HotKey, BROWSER_ACTION_DEFAULT, EFI_HII_DEFAULT_CLASS_STANDARD, NewString);\r
2031 }\r
2032\r
93e3992d 2033 //\r
a6973cff 2034 // In default, this driver is built into Flash device image,\r
7e3bcccb 2035 // the following code doesn't run.\r
93e3992d 2036 //\r
7e3bcccb 2037\r
2f3065c0 2038 //\r
7e3bcccb 2039 // Example of how to display only the item we sent to HII\r
a6973cff 2040 // When this driver is not built into Flash device image,\r
7e3bcccb 2041 // it need to call SendForm to show front page by itself.\r
2f3065c0 2042 //\r
7e3bcccb
LG
2043 if (DISPLAY_ONLY_MY_ITEM <= 1) {\r
2044 //\r
2045 // Have the browser pull out our copy of the data, and only display our data\r
2046 //\r
2047 Status = FormBrowser2->SendForm (\r
2048 FormBrowser2,\r
2049 &(HiiHandle[DISPLAY_ONLY_MY_ITEM]),\r
2050 1,\r
2051 NULL,\r
2052 0,\r
2053 NULL,\r
2054 NULL\r
2055 );\r
a6973cff 2056\r
14d59fa1 2057 HiiRemovePackages (HiiHandle[0]);\r
a6973cff 2058\r
14d59fa1 2059 HiiRemovePackages (HiiHandle[1]);\r
2f3065c0
LG
2060 }\r
2061\r
84f9a9ec 2062 return EFI_SUCCESS;\r
2f3065c0
LG
2063}\r
2064\r
2065/**\r
2066 Unloads the application and its installed protocol.\r
2067\r
2068 @param[in] ImageHandle Handle that identifies the image to be unloaded.\r
2069\r
2070 @retval EFI_SUCCESS The image has been unloaded.\r
2071**/\r
2072EFI_STATUS\r
2073EFIAPI\r
2074DriverSampleUnload (\r
2075 IN EFI_HANDLE ImageHandle\r
2076 )\r
2077{\r
38ebfecb 2078 UINTN Index;\r
f0c855b2 2079\r
7b2c31ae 2080 ASSERT (mPrivateData != NULL);\r
f0c855b2 2081\r
2f3065c0
LG
2082 if (DriverHandle[0] != NULL) {\r
2083 gBS->UninstallMultipleProtocolInterfaces (\r
2084 DriverHandle[0],\r
2085 &gEfiDevicePathProtocolGuid,\r
2086 &mHiiVendorDevicePath0,\r
2087 &gEfiHiiConfigAccessProtocolGuid,\r
7b2c31ae 2088 &mPrivateData->ConfigAccess,\r
2f3065c0
LG
2089 NULL\r
2090 );\r
ccee6099 2091 DriverHandle[0] = NULL;\r
2f3065c0
LG
2092 }\r
2093\r
2094 if (DriverHandle[1] != NULL) {\r
2095 gBS->UninstallMultipleProtocolInterfaces (\r
2096 DriverHandle[1],\r
2097 &gEfiDevicePathProtocolGuid,\r
2098 &mHiiVendorDevicePath1,\r
41c244b6
DB
2099 &gEfiHiiConfigAccessProtocolGuid,\r
2100 &mPrivateData->ConfigAccess,\r
2f3065c0
LG
2101 NULL\r
2102 );\r
ccee6099 2103 DriverHandle[1] = NULL;\r
2f3065c0
LG
2104 }\r
2105\r
7b2c31ae
LG
2106 if (mPrivateData->HiiHandle[0] != NULL) {\r
2107 HiiRemovePackages (mPrivateData->HiiHandle[0]);\r
14d59fa1
LG
2108 }\r
2109\r
7b2c31ae
LG
2110 if (mPrivateData->HiiHandle[1] != NULL) {\r
2111 HiiRemovePackages (mPrivateData->HiiHandle[1]);\r
14d59fa1
LG
2112 }\r
2113\r
f0c855b2 2114 for (Index = 0; Index < NAME_VALUE_NAME_NUMBER; Index++) {\r
7b2c31ae
LG
2115 if (mPrivateData->NameValueName[Index] != NULL) {\r
2116 FreePool (mPrivateData->NameValueName[Index]);\r
38ebfecb 2117 }\r
93e3992d 2118 }\r
7b2c31ae
LG
2119 FreePool (mPrivateData);\r
2120 mPrivateData = NULL;\r
93e3992d 2121\r
211cc6e5
ED
2122 gBS->CloseEvent (mEvent);\r
2123\r
93e3992d 2124 return EFI_SUCCESS;\r
2125}\r