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