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