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