]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/DriverSampleDxe/DriverSample.c
Sync in bug fix from EDK I:
[mirror_edk2.git] / MdeModulePkg / Universal / DriverSampleDxe / DriverSample.c
CommitLineData
93e3992d 1/** @file\r
2Copyright (c) 2004 - 2007, Intel Corporation\r
3All rights reserved. This program and the accompanying materials\r
4are licensed and made available under the terms and conditions of the BSD License\r
5which accompanies this distribution. The full text of the license may be found at\r
6http://opensource.org/licenses/bsd-license.php\r
7\r
8THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
9WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
10\r
11Module Name:\r
12 DriverSample.c\r
13\r
14Abstract:\r
15\r
16 This is an example of how a driver might export data to the HII protocol to be\r
17 later utilized by the Setup Protocol\r
18\r
19\r
20**/\r
21\r
22\r
23#include "DriverSample.h"\r
24\r
25#define DISPLAY_ONLY_MY_ITEM 0x0002\r
26\r
27EFI_GUID mFormSetGuid = FORMSET_GUID;\r
28EFI_GUID mInventoryGuid = INVENTORY_GUID;\r
29\r
30CHAR16 VariableName[] = L"MyIfrNVData";\r
31\r
32VOID\r
33EncodePassword (\r
34 IN CHAR16 *Password,\r
35 IN UINT8 MaxSize\r
36 )\r
37{\r
38 UINTN Index;\r
39 UINTN Loop;\r
40 CHAR16 *Buffer;\r
41 CHAR16 *Key;\r
42\r
43 Key = L"MAR10648567";\r
44 Buffer = AllocateZeroPool (MaxSize);\r
45 ASSERT (Buffer != NULL);\r
46\r
47 for (Index = 0; Key[Index] != 0; Index++) {\r
48 for (Loop = 0; Loop < (UINT8) (MaxSize / 2); Loop++) {\r
49 Buffer[Loop] = (CHAR16) (Password[Loop] ^ Key[Index]);\r
50 }\r
51 }\r
52\r
53 CopyMem (Password, Buffer, MaxSize);\r
54\r
55 gBS->FreePool (Buffer);\r
56 return ;\r
57}\r
58\r
59EFI_STATUS\r
60ValidatePassword (\r
61 DRIVER_SAMPLE_PRIVATE_DATA *PrivateData,\r
62 EFI_STRING_ID StringId\r
63 )\r
64{\r
65 EFI_STATUS Status;\r
66 UINTN Index;\r
67 UINTN BufferSize;\r
68 CHAR16 *Password;\r
69 CHAR16 *EncodedPassword;\r
70 BOOLEAN OldPassword;\r
71\r
72 //\r
73 // Get encoded password first\r
74 //\r
75 BufferSize = sizeof (DRIVER_SAMPLE_CONFIGURATION);\r
76 Status = gRT->GetVariable (\r
77 VariableName,\r
78 &mFormSetGuid,\r
79 NULL,\r
80 &BufferSize,\r
81 &PrivateData->Configuration\r
82 );\r
83 if (EFI_ERROR (Status)) {\r
84 //\r
85 // Old password not exist, prompt for new password\r
86 //\r
87 return EFI_SUCCESS;\r
88 }\r
89\r
90 OldPassword = FALSE;\r
91 //\r
92 // Check whether we have any old password set\r
93 //\r
94 for (Index = 0; Index < 20; Index++) {\r
95 if (PrivateData->Configuration.WhatIsThePassword2[Index] != 0) {\r
96 OldPassword = TRUE;\r
97 break;\r
98 }\r
99 }\r
100 if (!OldPassword) {\r
101 //\r
102 // Old password not exist, return EFI_SUCCESS to prompt for new password\r
103 //\r
104 return EFI_SUCCESS;\r
105 }\r
106\r
107 //\r
108 // Get user input password\r
109 //\r
110 BufferSize = 21 * sizeof (CHAR16);\r
111 Password = AllocateZeroPool (BufferSize);\r
112 ASSERT (Password != NULL);\r
113\r
9226efe5 114 Status = HiiLibGetString (PrivateData->HiiHandle[0], StringId, Password, &BufferSize);\r
93e3992d 115 if (EFI_ERROR (Status)) {\r
116 gBS->FreePool (Password);\r
117 return Status;\r
118 }\r
119\r
120 //\r
121 // Validate old password\r
122 //\r
123 EncodedPassword = AllocateCopyPool (21 * sizeof (CHAR16), Password);\r
124 ASSERT (EncodedPassword != NULL);\r
125 EncodePassword (EncodedPassword, 20 * sizeof (CHAR16));\r
126 if (CompareMem (EncodedPassword, PrivateData->Configuration.WhatIsThePassword2, 20 * sizeof (CHAR16)) != 0) {\r
127 //\r
128 // Old password mismatch, return EFI_NOT_READY to prompt for error message\r
129 //\r
130 Status = EFI_NOT_READY;\r
131 } else {\r
132 Status = EFI_SUCCESS;\r
133 }\r
134\r
135 gBS->FreePool (Password);\r
136 gBS->FreePool (EncodedPassword);\r
137\r
138 return Status;\r
139}\r
140\r
141EFI_STATUS\r
142SetPassword (\r
143 DRIVER_SAMPLE_PRIVATE_DATA *PrivateData,\r
144 EFI_STRING_ID StringId\r
145 )\r
146{\r
147 EFI_STATUS Status;\r
148 UINTN BufferSize;\r
149 CHAR16 *Password;\r
150 DRIVER_SAMPLE_CONFIGURATION *Configuration;\r
151\r
152 //\r
153 // Get Buffer Storage data from EFI variable\r
154 //\r
155 BufferSize = sizeof (DRIVER_SAMPLE_CONFIGURATION);\r
156 Status = gRT->GetVariable (\r
157 VariableName,\r
158 &mFormSetGuid,\r
159 NULL,\r
160 &BufferSize,\r
161 &PrivateData->Configuration\r
162 );\r
163 if (EFI_ERROR (Status)) {\r
164 return Status;\r
165 }\r
166\r
167 //\r
168 // Get user input password\r
169 //\r
170 Password = &PrivateData->Configuration.WhatIsThePassword2[0];\r
171 ZeroMem (Password, 20 * sizeof (CHAR16));\r
9226efe5 172 Status = HiiLibGetString (PrivateData->HiiHandle[0], StringId, Password, &BufferSize);\r
93e3992d 173 if (EFI_ERROR (Status)) {\r
174 return Status;\r
175 }\r
176\r
177 //\r
178 // Retrive uncommitted data from Browser\r
179 //\r
180 BufferSize = sizeof (DRIVER_SAMPLE_CONFIGURATION);\r
181 Configuration = AllocateZeroPool (sizeof (DRIVER_SAMPLE_PRIVATE_DATA));\r
182 ASSERT (Configuration != NULL);\r
183 Status = GetBrowserData (&mFormSetGuid, VariableName, &BufferSize, (UINT8 *) Configuration);\r
184 if (!EFI_ERROR (Status)) {\r
185 //\r
186 // Update password's clear text in the screen\r
187 //\r
188 CopyMem (Configuration->PasswordClearText, Password, 20 * sizeof (CHAR16));\r
189\r
190 //\r
191 // Update uncommitted data of Browser\r
192 //\r
193 BufferSize = sizeof (DRIVER_SAMPLE_CONFIGURATION);\r
194 Status = SetBrowserData (\r
195 &mFormSetGuid,\r
196 VariableName,\r
197 BufferSize,\r
198 (UINT8 *) Configuration,\r
199 NULL\r
200 );\r
201 }\r
202 gBS->FreePool (Configuration);\r
203\r
204 //\r
205 // Set password\r
206 //\r
207 EncodePassword (Password, 20 * sizeof (CHAR16));\r
208 Status = gRT->SetVariable(\r
209 VariableName,\r
210 &mFormSetGuid,\r
211 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
212 sizeof (DRIVER_SAMPLE_CONFIGURATION),\r
213 &PrivateData->Configuration\r
214 );\r
215 return Status;\r
216}\r
217\r
218\r
219/**\r
220 This function allows a caller to extract the current configuration for one\r
221 or more named elements from the target driver.\r
222\r
223 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
224 @param Request A null-terminated Unicode string in\r
225 <ConfigRequest> format.\r
226 @param Progress On return, points to a character in the Request\r
227 string. Points to the string's null terminator if\r
228 request was successful. Points to the most recent\r
229 '&' before the first failing name/value pair (or\r
230 the beginning of the string if the failure is in\r
231 the first name/value pair) if the request was not\r
232 successful.\r
233 @param Results A null-terminated Unicode string in\r
234 <ConfigAltResp> format which has all values filled\r
235 in for the names in the Request string. String to\r
236 be allocated by the called function.\r
237\r
238 @retval EFI_SUCCESS The Results is filled with the requested values.\r
239 @retval EFI_OUT_OF_RESOURCES Not enough memory to store the results.\r
240 @retval EFI_INVALID_PARAMETER Request is NULL, illegal syntax, or unknown name.\r
241 @retval EFI_NOT_FOUND Routing data doesn't match any storage in this\r
242 driver.\r
243\r
244**/\r
245EFI_STATUS\r
246EFIAPI\r
247ExtractConfig (\r
248 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
249 IN CONST EFI_STRING Request,\r
250 OUT EFI_STRING *Progress,\r
251 OUT EFI_STRING *Results\r
252 )\r
253{\r
254 EFI_STATUS Status;\r
255 UINTN BufferSize;\r
256 DRIVER_SAMPLE_PRIVATE_DATA *PrivateData;\r
257 EFI_HII_CONFIG_ROUTING_PROTOCOL *HiiConfigRouting;\r
258\r
259 PrivateData = DRIVER_SAMPLE_PRIVATE_FROM_THIS (This);\r
260 HiiConfigRouting = PrivateData->HiiConfigRouting;\r
261\r
262 //\r
263 // Get Buffer Storage data from EFI variable\r
264 //\r
265 BufferSize = sizeof (DRIVER_SAMPLE_CONFIGURATION);\r
266 Status = gRT->GetVariable (\r
267 VariableName,\r
268 &mFormSetGuid,\r
269 NULL,\r
270 &BufferSize,\r
271 &PrivateData->Configuration\r
272 );\r
273 if (EFI_ERROR (Status)) {\r
274 return Status;\r
275 }\r
276\r
277 //\r
278 // Convert buffer data to <ConfigResp> by helper function BlockToConfig()\r
279 //\r
280 Status = HiiConfigRouting->BlockToConfig (\r
281 HiiConfigRouting,\r
282 Request,\r
283 (UINT8 *) &PrivateData->Configuration,\r
284 BufferSize,\r
285 Results,\r
286 Progress\r
287 );\r
288 return Status;\r
289}\r
290\r
291\r
292/**\r
293 This function processes the results of changes in configuration.\r
294\r
295 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
296 @param Configuration A null-terminated Unicode string in <ConfigResp>\r
297 format.\r
298 @param Progress A pointer to a string filled in with the offset of\r
299 the most recent '&' before the first failing\r
300 name/value pair (or the beginning of the string if\r
301 the failure is in the first name/value pair) or\r
302 the terminating NULL if all was successful.\r
303\r
304 @retval EFI_SUCCESS The Results is processed successfully.\r
305 @retval EFI_INVALID_PARAMETER Configuration is NULL.\r
306 @retval EFI_NOT_FOUND Routing data doesn't match any storage in this\r
307 driver.\r
308\r
309**/\r
310EFI_STATUS\r
311EFIAPI\r
312RouteConfig (\r
313 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
314 IN CONST EFI_STRING Configuration,\r
315 OUT EFI_STRING *Progress\r
316 )\r
317{\r
318 EFI_STATUS Status;\r
319 UINTN BufferSize;\r
320 DRIVER_SAMPLE_PRIVATE_DATA *PrivateData;\r
321 EFI_HII_CONFIG_ROUTING_PROTOCOL *HiiConfigRouting;\r
322\r
323 PrivateData = DRIVER_SAMPLE_PRIVATE_FROM_THIS (This);\r
324 HiiConfigRouting = PrivateData->HiiConfigRouting;\r
325\r
326 //\r
327 // Get Buffer Storage data from EFI variable\r
328 //\r
329 BufferSize = sizeof (DRIVER_SAMPLE_CONFIGURATION);\r
330 Status = gRT->GetVariable (\r
331 VariableName,\r
332 &mFormSetGuid,\r
333 NULL,\r
334 &BufferSize,\r
335 &PrivateData->Configuration\r
336 );\r
337 if (EFI_ERROR (Status)) {\r
338 return Status;\r
339 }\r
340\r
341 //\r
342 // Convert <ConfigResp> to buffer data by helper function ConfigToBlock()\r
343 //\r
344 BufferSize = sizeof (DRIVER_SAMPLE_CONFIGURATION);\r
345 Status = HiiConfigRouting->ConfigToBlock (\r
346 HiiConfigRouting,\r
347 Configuration,\r
348 (UINT8 *) &PrivateData->Configuration,\r
349 &BufferSize,\r
350 Progress\r
351 );\r
352 if (EFI_ERROR (Status)) {\r
353 return Status;\r
354 }\r
355\r
356 //\r
357 // Store Buffer Storage back to EFI variable\r
358 //\r
359 Status = gRT->SetVariable(\r
360 VariableName,\r
361 &mFormSetGuid,\r
362 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
363 sizeof (DRIVER_SAMPLE_CONFIGURATION),\r
364 &PrivateData->Configuration\r
365 );\r
366\r
367 return Status;\r
368}\r
369\r
370\r
371/**\r
372 This function processes the results of changes in configuration.\r
373\r
374 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
375 @param Action Specifies the type of action taken by the browser.\r
376 @param QuestionId A unique value which is sent to the original\r
377 exporting driver so that it can identify the type\r
378 of data to expect.\r
379 @param Type The type of value for the question.\r
380 @param Value A pointer to the data being sent to the original\r
381 exporting driver.\r
382 @param ActionRequest On return, points to the action requested by the\r
383 callback function.\r
384\r
385 @retval EFI_SUCCESS The callback successfully handled the action.\r
386 @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold the\r
387 variable and its data.\r
388 @retval EFI_DEVICE_ERROR The variable could not be saved.\r
389 @retval EFI_UNSUPPORTED The specified Action is not supported by the\r
390 callback.\r
391\r
392**/\r
393EFI_STATUS\r
394EFIAPI\r
395DriverCallback (\r
396 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
397 IN EFI_BROWSER_ACTION Action,\r
398 IN EFI_QUESTION_ID QuestionId,\r
399 IN UINT8 Type,\r
400 IN EFI_IFR_TYPE_VALUE *Value,\r
401 OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest\r
402 )\r
403{\r
404 DRIVER_SAMPLE_PRIVATE_DATA *PrivateData;\r
405 EFI_STATUS Status;\r
406 EFI_HII_UPDATE_DATA UpdateData;\r
407 IFR_OPTION *IfrOptionList;\r
408\r
409 if ((Value == NULL) || (ActionRequest == NULL)) {\r
410 return EFI_INVALID_PARAMETER;\r
411 }\r
412\r
413 Status = EFI_SUCCESS;\r
414 PrivateData = DRIVER_SAMPLE_PRIVATE_FROM_THIS (This);\r
415\r
416 switch (QuestionId) {\r
417 case 0x1234:\r
418 //\r
419 // Create dynamic page for this interactive goto\r
420 //\r
421 UpdateData.BufferSize = 0x1000;\r
422 UpdateData.Offset = 0;\r
423 UpdateData.Data = AllocatePool (0x1000);\r
424 ASSERT (UpdateData.Data != NULL);\r
425\r
426 IfrOptionList = AllocatePool (2 * sizeof (IFR_OPTION));\r
427 ASSERT (IfrOptionList != NULL);\r
428\r
429 IfrOptionList[0].Flags = 0;\r
430 IfrOptionList[0].StringToken = STRING_TOKEN (STR_BOOT_OPTION1);\r
431 IfrOptionList[0].Value.u8 = 1;\r
432 IfrOptionList[1].Flags = EFI_IFR_OPTION_DEFAULT;\r
433 IfrOptionList[1].StringToken = STRING_TOKEN (STR_BOOT_OPTION2);\r
434 IfrOptionList[1].Value.u8 = 2;\r
435\r
436 CreateActionOpCode (\r
437 0x1237,\r
438 STRING_TOKEN(STR_EXIT_TEXT),\r
439 STRING_TOKEN(STR_EXIT_TEXT),\r
440 EFI_IFR_FLAG_CALLBACK,\r
441 0,\r
442 &UpdateData\r
443 );\r
444\r
445 CreateOneOfOpCode (\r
446 0x8001,\r
447 0,\r
448 0,\r
449 STRING_TOKEN (STR_ONE_OF_PROMPT),\r
450 STRING_TOKEN (STR_ONE_OF_HELP),\r
451 EFI_IFR_FLAG_CALLBACK,\r
452 EFI_IFR_NUMERIC_SIZE_1,\r
453 IfrOptionList,\r
454 2,\r
455 &UpdateData\r
456 );\r
457\r
458 CreateOrderedListOpCode (\r
459 0x8002,\r
460 0,\r
461 0,\r
462 STRING_TOKEN (STR_BOOT_OPTIONS),\r
463 STRING_TOKEN (STR_BOOT_OPTIONS),\r
464 EFI_IFR_FLAG_RESET_REQUIRED,\r
465 0,\r
466 EFI_IFR_NUMERIC_SIZE_1,\r
467 10,\r
468 IfrOptionList,\r
469 2,\r
470 &UpdateData\r
471 );\r
472\r
473 CreateGotoOpCode (\r
474 1,\r
475 STRING_TOKEN (STR_GOTO_FORM1),\r
476 STRING_TOKEN (STR_GOTO_HELP),\r
477 0,\r
478 0x8003,\r
479 &UpdateData\r
480 );\r
481\r
482 Status = IfrLibUpdateForm (\r
483 PrivateData->HiiHandle[0],\r
484 &mFormSetGuid,\r
485 0x1234,\r
486 0x1234,\r
487 TRUE,\r
488 &UpdateData\r
489 );\r
490 gBS->FreePool (IfrOptionList);\r
491 gBS->FreePool (UpdateData.Data);\r
492 break;\r
493\r
494 case 0x1237:\r
495 //\r
496 // User press "Exit now", request Browser to exit\r
497 //\r
498 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;\r
499 break;\r
500\r
501 case 0x1238:\r
502 //\r
503 // User press "Save now", request Browser to save the uncommitted data.\r
504 //\r
505 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_SUBMIT;\r
506 break;\r
507\r
508 case 0x2000:\r
509 //\r
510 // When try to set a new password, user will be chanlleged with old password.\r
511 // The Callback is responsible for validating old password input by user,\r
512 // If Callback return EFI_SUCCESS, it indicates validation pass.\r
513 //\r
514 switch (PrivateData->PasswordState) {\r
515 case BROWSER_STATE_VALIDATE_PASSWORD:\r
516 Status = ValidatePassword (PrivateData, Value->string);\r
517 if (Status == EFI_SUCCESS) {\r
518 PrivateData->PasswordState = BROWSER_STATE_SET_PASSWORD;\r
519 }\r
520 break;\r
521\r
522 case BROWSER_STATE_SET_PASSWORD:\r
523 Status = SetPassword (PrivateData, Value->string);\r
524 PrivateData->PasswordState = BROWSER_STATE_VALIDATE_PASSWORD;\r
525 break;\r
526\r
527 default:\r
528 break;\r
529 }\r
530\r
531 break;\r
532\r
533 default:\r
534 break;\r
535 }\r
536\r
537 return Status;\r
538}\r
539\r
540EFI_STATUS\r
541EFIAPI\r
542DriverSampleInit (\r
543 IN EFI_HANDLE ImageHandle,\r
544 IN EFI_SYSTEM_TABLE *SystemTable\r
545 )\r
546{\r
547 EFI_STATUS Status;\r
548 EFI_STATUS SavedStatus;\r
549 EFI_HII_PACKAGE_LIST_HEADER *PackageList;\r
550 EFI_HII_HANDLE HiiHandle[2];\r
551 EFI_HANDLE DriverHandle[2];\r
552 DRIVER_SAMPLE_PRIVATE_DATA *PrivateData;\r
553 EFI_SCREEN_DESCRIPTOR Screen;\r
554 EFI_HII_DATABASE_PROTOCOL *HiiDatabase;\r
555 EFI_HII_STRING_PROTOCOL *HiiString;\r
556 EFI_FORM_BROWSER2_PROTOCOL *FormBrowser2;\r
557 EFI_HII_CONFIG_ROUTING_PROTOCOL *HiiConfigRouting;\r
558 CHAR16 *NewString;\r
559 UINTN BufferSize;\r
560 DRIVER_SAMPLE_CONFIGURATION *Configuration;\r
561 BOOLEAN ExtractIfrDefault;\r
562\r
563 //\r
564 // Initialize the library and our protocol.\r
565 //\r
93e3992d 566\r
567 //\r
568 // Initialize screen dimensions for SendForm().\r
569 // Remove 3 characters from top and bottom\r
570 //\r
571 ZeroMem (&Screen, sizeof (EFI_SCREEN_DESCRIPTOR));\r
572 gST->ConOut->QueryMode (gST->ConOut, gST->ConOut->Mode->Mode, &Screen.RightColumn, &Screen.BottomRow);\r
573\r
574 Screen.TopRow = 3;\r
575 Screen.BottomRow = Screen.BottomRow - 3;\r
576\r
577 //\r
578 // Initialize driver private data\r
579 //\r
580 PrivateData = AllocatePool (sizeof (DRIVER_SAMPLE_PRIVATE_DATA));\r
581 if (PrivateData == NULL) {\r
582 return EFI_OUT_OF_RESOURCES;\r
583 }\r
584\r
585 PrivateData->Signature = DRIVER_SAMPLE_PRIVATE_SIGNATURE;\r
586\r
587 PrivateData->ConfigAccess.ExtractConfig = ExtractConfig;\r
588 PrivateData->ConfigAccess.RouteConfig = RouteConfig;\r
589 PrivateData->ConfigAccess.Callback = DriverCallback;\r
590 PrivateData->PasswordState = BROWSER_STATE_VALIDATE_PASSWORD;\r
591\r
592 //\r
593 // Locate Hii Database protocol\r
594 //\r
595 Status = gBS->LocateProtocol (&gEfiHiiDatabaseProtocolGuid, NULL, (VOID **) &HiiDatabase);\r
596 if (EFI_ERROR (Status)) {\r
597 return Status;\r
598 }\r
599 PrivateData->HiiDatabase = HiiDatabase;\r
600\r
601 //\r
602 // Locate HiiString protocol\r
603 //\r
604 Status = gBS->LocateProtocol (&gEfiHiiStringProtocolGuid, NULL, (VOID **) &HiiString);\r
605 if (EFI_ERROR (Status)) {\r
606 return Status;\r
607 }\r
608 PrivateData->HiiString = HiiString;\r
609\r
610 //\r
611 // Locate Formbrowser2 protocol\r
612 //\r
613 Status = gBS->LocateProtocol (&gEfiFormBrowser2ProtocolGuid, NULL, (VOID **) &FormBrowser2);\r
614 if (EFI_ERROR (Status)) {\r
615 return Status;\r
616 }\r
617 PrivateData->FormBrowser2 = FormBrowser2;\r
618\r
619 //\r
620 // Locate ConfigRouting protocol\r
621 //\r
622 Status = gBS->LocateProtocol (&gEfiHiiConfigRoutingProtocolGuid, NULL, (VOID **) &HiiConfigRouting);\r
623 if (EFI_ERROR (Status)) {\r
624 return Status;\r
625 }\r
626 PrivateData->HiiConfigRouting = HiiConfigRouting;\r
627\r
628 //\r
629 // Install Config Access protocol\r
630 //\r
631 Status = HiiLibCreateHiiDriverHandle (&DriverHandle[0]);\r
632 if (EFI_ERROR (Status)) {\r
633 return Status;\r
634 }\r
635 PrivateData->DriverHandle[0] = DriverHandle[0];\r
636\r
637 Status = gBS->InstallProtocolInterface (\r
638 &DriverHandle[0],\r
639 &gEfiHiiConfigAccessProtocolGuid,\r
640 EFI_NATIVE_INTERFACE,\r
641 &PrivateData->ConfigAccess\r
642 );\r
643 ASSERT_EFI_ERROR (Status);\r
644\r
645 //\r
646 // Publish our HII data\r
647 //\r
9226efe5 648 PackageList = HiiLibPreparePackageList (\r
93e3992d 649 2,\r
650 &mFormSetGuid,\r
651 DriverSampleStrings,\r
652 VfrBin\r
653 );\r
654 if (PackageList == NULL) {\r
655 return EFI_OUT_OF_RESOURCES;\r
656 }\r
657\r
658 Status = HiiDatabase->NewPackageList (\r
659 HiiDatabase,\r
660 PackageList,\r
661 DriverHandle[0],\r
662 &HiiHandle[0]\r
663 );\r
664 gBS->FreePool (PackageList);\r
665 if (EFI_ERROR (Status)) {\r
666 return Status;\r
667 }\r
668 PrivateData->HiiHandle[0] = HiiHandle[0];\r
669\r
670 //\r
671 // Publish another Fromset\r
672 //\r
673 Status = HiiLibCreateHiiDriverHandle (&DriverHandle[1]);\r
674 if (EFI_ERROR (Status)) {\r
675 return Status;\r
676 }\r
677 PrivateData->DriverHandle[1] = DriverHandle[1];\r
678\r
9226efe5 679 PackageList = HiiLibPreparePackageList (\r
93e3992d 680 2,\r
681 &mInventoryGuid,\r
682 DriverSampleStrings,\r
683 InventoryBin\r
684 );\r
685 if (PackageList == NULL) {\r
686 return EFI_OUT_OF_RESOURCES;\r
687 }\r
688\r
689 Status = HiiDatabase->NewPackageList (\r
690 HiiDatabase,\r
691 PackageList,\r
692 DriverHandle[1],\r
693 &HiiHandle[1]\r
694 );\r
695 gBS->FreePool (PackageList);\r
696 if (EFI_ERROR (Status)) {\r
697 return Status;\r
698 }\r
699 PrivateData->HiiHandle[1] = HiiHandle[1];\r
700\r
701 //\r
702 // Very simple example of how one would update a string that is already\r
703 // in the HII database\r
704 //\r
705 NewString = L"700 Mhz";\r
706\r
9226efe5 707 Status = HiiLibSetString (HiiHandle[0], STRING_TOKEN (STR_CPU_STRING2), NewString);\r
93e3992d 708 if (EFI_ERROR (Status)) {\r
709 return Status;\r
710 }\r
711\r
712 //\r
713 // Initialize configuration data\r
714 //\r
715 Configuration = &PrivateData->Configuration;\r
716 ZeroMem (Configuration, sizeof (DRIVER_SAMPLE_CONFIGURATION));\r
717\r
718 //\r
719 // Try to read NV config EFI variable first\r
720 //\r
721 ExtractIfrDefault = TRUE;\r
722 BufferSize = sizeof (DRIVER_SAMPLE_CONFIGURATION);\r
723 Status = gRT->GetVariable (VariableName, &mFormSetGuid, NULL, &BufferSize, Configuration);\r
724 if (!EFI_ERROR (Status) && (BufferSize == sizeof (DRIVER_SAMPLE_CONFIGURATION))) {\r
725 ExtractIfrDefault = FALSE;\r
726 }\r
727\r
728 if (ExtractIfrDefault) {\r
729 //\r
730 // EFI variable for NV config doesn't exit, we should build this variable\r
731 // based on default values stored in IFR\r
732 //\r
733 BufferSize = sizeof (DRIVER_SAMPLE_CONFIGURATION);\r
9226efe5 734 Status = IfrLibExtractDefault (Configuration, &BufferSize, 1, VfrMyIfrNVDataDefault0000);\r
93e3992d 735\r
736 if (!EFI_ERROR (Status)) {\r
737 gRT->SetVariable(\r
738 VariableName,\r
739 &mFormSetGuid,\r
740 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
741 sizeof (DRIVER_SAMPLE_CONFIGURATION),\r
742 Configuration\r
743 );\r
744 }\r
745 }\r
746\r
747 //\r
748 // Example of how to display only the item we sent to HII\r
749 //\r
750 if (DISPLAY_ONLY_MY_ITEM == 0x0001) {\r
751 //\r
752 // Have the browser pull out our copy of the data, and only display our data\r
753 //\r
754 // Status = FormConfig->SendForm (FormConfig, TRUE, HiiHandle, NULL, NULL, NULL, &Screen, NULL);\r
755 //\r
756 Status = FormBrowser2->SendForm (\r
757 FormBrowser2,\r
758 HiiHandle,\r
759 1,\r
760 NULL,\r
761 0,\r
762 NULL,\r
763 NULL\r
764 );\r
765 SavedStatus = Status;\r
766\r
767 Status = HiiDatabase->RemovePackageList (HiiDatabase, HiiHandle[0]);\r
768 if (EFI_ERROR (Status)) {\r
769 return Status;\r
770 }\r
771\r
772 Status = HiiDatabase->RemovePackageList (HiiDatabase, HiiHandle[1]);\r
773 if (EFI_ERROR (Status)) {\r
774 return Status;\r
775 }\r
776\r
777 return SavedStatus;\r
778 } else {\r
779 //\r
780 // Have the browser pull out all the data in the HII Database and display it.\r
781 //\r
782 // Status = FormConfig->SendForm (FormConfig, TRUE, 0, NULL, NULL, NULL, NULL, NULL);\r
783 //\r
784 }\r
785\r
786 return EFI_SUCCESS;\r
787}\r