]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/DriverSampleDxe/DriverSample.c
Doxygen fix.
[mirror_edk2.git] / MdeModulePkg / Universal / DriverSampleDxe / DriverSample.c
CommitLineData
93e3992d 1/** @file\r
8d00a0f1 2Copyright (c) 2004 - 2008, Intel Corporation\r
93e3992d 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
8d00a0f1 262 //\r
93e3992d 263 //\r
264 // Get Buffer Storage data from EFI variable\r
265 //\r
266 BufferSize = sizeof (DRIVER_SAMPLE_CONFIGURATION);\r
267 Status = gRT->GetVariable (\r
268 VariableName,\r
269 &mFormSetGuid,\r
270 NULL,\r
271 &BufferSize,\r
272 &PrivateData->Configuration\r
273 );\r
274 if (EFI_ERROR (Status)) {\r
275 return Status;\r
276 }\r
277\r
8d00a0f1 278 if (Request == NULL) {\r
279 //\r
280 // Request is set to NULL, return all configurable elements together with ALTCFG\r
281 //\r
282 Status = ConstructConfigAltResp (\r
283 NULL,\r
284 NULL,\r
285 Results,\r
286 &mFormSetGuid,\r
287 VariableName,\r
288 PrivateData->DriverHandle[0],\r
289 &PrivateData->Configuration,\r
290 BufferSize,\r
291 VfrMyIfrNVDataBlockName,\r
292 2,\r
293 STRING_TOKEN (STR_STANDARD_DEFAULT_PROMPT),\r
294 VfrMyIfrNVDataDefault0000,\r
295 STRING_TOKEN (STR_MANUFACTURE_DEFAULT_PROMPT),\r
296 VfrMyIfrNVDataDefault0001\r
297 );\r
298\r
299 return Status;\r
300 }\r
301\r
302 //\r
303 // Check routing data in <ConfigHdr>.\r
304 // Note: if only one Storage is used, then this checking could be skipped.\r
305 //\r
306 if (!IsConfigHdrMatch (Request, &mFormSetGuid, VariableName)) {\r
307 *Progress = Request;\r
308 return EFI_NOT_FOUND;\r
309 }\r
310\r
93e3992d 311 //\r
312 // Convert buffer data to <ConfigResp> by helper function BlockToConfig()\r
313 //\r
314 Status = HiiConfigRouting->BlockToConfig (\r
315 HiiConfigRouting,\r
316 Request,\r
317 (UINT8 *) &PrivateData->Configuration,\r
318 BufferSize,\r
319 Results,\r
320 Progress\r
321 );\r
322 return Status;\r
323}\r
324\r
325\r
326/**\r
327 This function processes the results of changes in configuration.\r
328\r
329 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
330 @param Configuration A null-terminated Unicode string in <ConfigResp>\r
331 format.\r
332 @param Progress A pointer to a string filled in with the offset of\r
333 the most recent '&' before the first failing\r
334 name/value pair (or the beginning of the string if\r
335 the failure is in the first name/value pair) or\r
336 the terminating NULL if all was successful.\r
337\r
338 @retval EFI_SUCCESS The Results is processed successfully.\r
339 @retval EFI_INVALID_PARAMETER Configuration is NULL.\r
340 @retval EFI_NOT_FOUND Routing data doesn't match any storage in this\r
341 driver.\r
342\r
343**/\r
344EFI_STATUS\r
345EFIAPI\r
346RouteConfig (\r
347 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
348 IN CONST EFI_STRING Configuration,\r
349 OUT EFI_STRING *Progress\r
350 )\r
351{\r
352 EFI_STATUS Status;\r
353 UINTN BufferSize;\r
354 DRIVER_SAMPLE_PRIVATE_DATA *PrivateData;\r
355 EFI_HII_CONFIG_ROUTING_PROTOCOL *HiiConfigRouting;\r
356\r
8d00a0f1 357 if (Configuration == NULL) {\r
358 return EFI_INVALID_PARAMETER;\r
359 }\r
360\r
93e3992d 361 PrivateData = DRIVER_SAMPLE_PRIVATE_FROM_THIS (This);\r
362 HiiConfigRouting = PrivateData->HiiConfigRouting;\r
363\r
8d00a0f1 364 // Check routing data in <ConfigHdr>.\r
365 // Note: if only one Storage is used, then this checking could be skipped.\r
366 //\r
367 if (!IsConfigHdrMatch (Configuration, &mFormSetGuid, VariableName)) {\r
368 *Progress = Configuration;\r
369 return EFI_NOT_FOUND;\r
370 }\r
371\r
93e3992d 372 //\r
373 // Get Buffer Storage data from EFI variable\r
374 //\r
375 BufferSize = sizeof (DRIVER_SAMPLE_CONFIGURATION);\r
376 Status = gRT->GetVariable (\r
377 VariableName,\r
378 &mFormSetGuid,\r
379 NULL,\r
380 &BufferSize,\r
381 &PrivateData->Configuration\r
382 );\r
383 if (EFI_ERROR (Status)) {\r
384 return Status;\r
385 }\r
386\r
387 //\r
388 // Convert <ConfigResp> to buffer data by helper function ConfigToBlock()\r
389 //\r
390 BufferSize = sizeof (DRIVER_SAMPLE_CONFIGURATION);\r
391 Status = HiiConfigRouting->ConfigToBlock (\r
392 HiiConfigRouting,\r
393 Configuration,\r
394 (UINT8 *) &PrivateData->Configuration,\r
395 &BufferSize,\r
396 Progress\r
397 );\r
398 if (EFI_ERROR (Status)) {\r
399 return Status;\r
400 }\r
401\r
402 //\r
403 // Store Buffer Storage back to EFI variable\r
404 //\r
405 Status = gRT->SetVariable(\r
406 VariableName,\r
407 &mFormSetGuid,\r
408 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
409 sizeof (DRIVER_SAMPLE_CONFIGURATION),\r
410 &PrivateData->Configuration\r
411 );\r
412\r
413 return Status;\r
414}\r
415\r
416\r
417/**\r
418 This function processes the results of changes in configuration.\r
419\r
420 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
421 @param Action Specifies the type of action taken by the browser.\r
422 @param QuestionId A unique value which is sent to the original\r
423 exporting driver so that it can identify the type\r
424 of data to expect.\r
425 @param Type The type of value for the question.\r
426 @param Value A pointer to the data being sent to the original\r
427 exporting driver.\r
428 @param ActionRequest On return, points to the action requested by the\r
429 callback function.\r
430\r
431 @retval EFI_SUCCESS The callback successfully handled the action.\r
432 @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold the\r
433 variable and its data.\r
434 @retval EFI_DEVICE_ERROR The variable could not be saved.\r
435 @retval EFI_UNSUPPORTED The specified Action is not supported by the\r
436 callback.\r
437\r
438**/\r
439EFI_STATUS\r
440EFIAPI\r
441DriverCallback (\r
442 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
443 IN EFI_BROWSER_ACTION Action,\r
444 IN EFI_QUESTION_ID QuestionId,\r
445 IN UINT8 Type,\r
446 IN EFI_IFR_TYPE_VALUE *Value,\r
447 OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest\r
448 )\r
449{\r
450 DRIVER_SAMPLE_PRIVATE_DATA *PrivateData;\r
451 EFI_STATUS Status;\r
452 EFI_HII_UPDATE_DATA UpdateData;\r
453 IFR_OPTION *IfrOptionList;\r
8d00a0f1 454 UINT8 MyVar;\r
93e3992d 455\r
456 if ((Value == NULL) || (ActionRequest == NULL)) {\r
457 return EFI_INVALID_PARAMETER;\r
458 }\r
459\r
460 Status = EFI_SUCCESS;\r
461 PrivateData = DRIVER_SAMPLE_PRIVATE_FROM_THIS (This);\r
462\r
463 switch (QuestionId) {\r
464 case 0x1234:\r
465 //\r
8d00a0f1 466 // Initialize the container for dynamic opcodes\r
93e3992d 467 //\r
8d00a0f1 468 IfrLibInitUpdateData (&UpdateData, 0x1000);\r
93e3992d 469\r
470 IfrOptionList = AllocatePool (2 * sizeof (IFR_OPTION));\r
471 ASSERT (IfrOptionList != NULL);\r
472\r
473 IfrOptionList[0].Flags = 0;\r
474 IfrOptionList[0].StringToken = STRING_TOKEN (STR_BOOT_OPTION1);\r
475 IfrOptionList[0].Value.u8 = 1;\r
476 IfrOptionList[1].Flags = EFI_IFR_OPTION_DEFAULT;\r
477 IfrOptionList[1].StringToken = STRING_TOKEN (STR_BOOT_OPTION2);\r
478 IfrOptionList[1].Value.u8 = 2;\r
479\r
8d00a0f1 480 CreateActionOpCode (\r
481 0x1237, // Question ID\r
482 STRING_TOKEN(STR_EXIT_TEXT), // Prompt text\r
483 STRING_TOKEN(STR_EXIT_TEXT), // Help text\r
484 EFI_IFR_FLAG_CALLBACK, // Question flag\r
485 0, // Action String ID\r
486 &UpdateData // Container for dynamic created opcodes\r
487 );\r
488 \r
489 //\r
490 // Prepare initial value for the dynamic created oneof Question\r
491 //\r
492 PrivateData->Configuration.DynamicOneof = 2;\r
493 Status = gRT->SetVariable(\r
494 VariableName,\r
495 &mFormSetGuid,\r
496 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
497 sizeof (DRIVER_SAMPLE_CONFIGURATION),\r
498 &PrivateData->Configuration\r
499 );\r
500 CreateOneOfOpCode (\r
501 0x8001, // Question ID (or call it "key")\r
502 CONFIGURATION_VARSTORE_ID, // VarStore ID\r
503 DYNAMIC_ONE_OF_VAR_OFFSET, // Offset in Buffer Storage\r
504 STRING_TOKEN (STR_ONE_OF_PROMPT), // Question prompt text\r
505 STRING_TOKEN (STR_ONE_OF_HELP), // Question help text\r
506 EFI_IFR_FLAG_CALLBACK, // Question flag\r
507 EFI_IFR_NUMERIC_SIZE_1, // Data type of Question Value\r
508 IfrOptionList, // Option list\r
509 2, // Number of options in Option list\r
510 &UpdateData // Container for dynamic created opcodes\r
511 );\r
512 \r
513 CreateOrderedListOpCode (\r
514 0x8002, // Question ID\r
515 CONFIGURATION_VARSTORE_ID, // VarStore ID\r
516 DYNAMIC_ORDERED_LIST_VAR_OFFSET, // Offset in Buffer Storage\r
517 STRING_TOKEN (STR_BOOT_OPTIONS), // Question prompt text\r
518 STRING_TOKEN (STR_BOOT_OPTIONS), // Question help text\r
519 EFI_IFR_FLAG_RESET_REQUIRED, // Question flag\r
520 0, // Ordered list flag, e.g. EFI_IFR_UNIQUE_SET\r
521 EFI_IFR_NUMERIC_SIZE_1, // Data type of Question value\r
522 5, // Maximum container\r
523 IfrOptionList, // Option list\r
524 2, // Number of options in Option list\r
525 &UpdateData // Container for dynamic created opcodes\r
526 );\r
527 \r
528 CreateGotoOpCode (\r
529 1, // Target Form ID\r
530 STRING_TOKEN (STR_GOTO_FORM1), // Prompt text\r
531 STRING_TOKEN (STR_GOTO_HELP), // Help text\r
532 0, // Question flag\r
533 0x8003, // Question ID\r
534 &UpdateData // Container for dynamic created opcodes\r
535 );\r
536 \r
537 Status = IfrLibUpdateForm (\r
538 PrivateData->HiiHandle[0], // HII handle\r
539 &mFormSetGuid, // Formset GUID\r
540 0x1234, // Form ID\r
541 0x1234, // Label for where to insert opcodes\r
542 TRUE, // Append or replace\r
543 &UpdateData // Dynamic created opcodes\r
544 );\r
545 gBS->FreePool (IfrOptionList);\r
546 IfrLibFreeUpdateData (&UpdateData);\r
547 break;\r
548 \r
549 case 0x5678:\r
550 //\r
551 // We will reach here once the Question is refreshed\r
552 //\r
553 IfrLibInitUpdateData (&UpdateData, 0x1000);\r
554 \r
555 IfrOptionList = AllocatePool (2 * sizeof (IFR_OPTION));\r
556 ASSERT (IfrOptionList != NULL);\r
557 \r
558 CreateActionOpCode (\r
559 0x1237, // Question ID\r
560 STRING_TOKEN(STR_EXIT_TEXT), // Prompt text\r
561 STRING_TOKEN(STR_EXIT_TEXT), // Help text\r
562 EFI_IFR_FLAG_CALLBACK, // Question flag\r
563 0, // Action String ID\r
564 &UpdateData // Container for dynamic created opcodes\r
565 );\r
566 \r
567 Status = IfrLibUpdateForm (\r
568 PrivateData->HiiHandle[0], // HII handle\r
569 &mFormSetGuid, // Formset GUID\r
570 3, // Form ID\r
571 0x2234, // Label for where to insert opcodes\r
572 TRUE, // Append or replace\r
573 &UpdateData // Dynamic created opcodes\r
574 );\r
575 IfrLibFreeUpdateData (&UpdateData);\r
576 \r
577 //\r
578 // Refresh the Question value\r
579 //\r
580 PrivateData->Configuration.DynamicRefresh++;\r
581 Status = gRT->SetVariable(\r
582 VariableName,\r
583 &mFormSetGuid,\r
584 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
585 sizeof (DRIVER_SAMPLE_CONFIGURATION),\r
586 &PrivateData->Configuration\r
587 );\r
588 \r
589 //\r
590 // Change an EFI Variable storage (MyEfiVar) asynchronous, this will cause\r
591 // the first statement in Form 3 be suppressed\r
592 //\r
593 MyVar = 111;\r
594 Status = gRT->SetVariable(\r
595 L"MyVar",\r
596 &mFormSetGuid,\r
597 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
598 1,\r
599 &MyVar\r
600 );\r
93e3992d 601 break;\r
602\r
603 case 0x1237:\r
604 //\r
605 // User press "Exit now", request Browser to exit\r
606 //\r
607 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;\r
608 break;\r
609\r
610 case 0x1238:\r
611 //\r
612 // User press "Save now", request Browser to save the uncommitted data.\r
613 //\r
614 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_SUBMIT;\r
615 break;\r
616\r
617 case 0x2000:\r
618 //\r
619 // When try to set a new password, user will be chanlleged with old password.\r
620 // The Callback is responsible for validating old password input by user,\r
621 // If Callback return EFI_SUCCESS, it indicates validation pass.\r
622 //\r
623 switch (PrivateData->PasswordState) {\r
624 case BROWSER_STATE_VALIDATE_PASSWORD:\r
625 Status = ValidatePassword (PrivateData, Value->string);\r
626 if (Status == EFI_SUCCESS) {\r
627 PrivateData->PasswordState = BROWSER_STATE_SET_PASSWORD;\r
628 }\r
629 break;\r
630\r
631 case BROWSER_STATE_SET_PASSWORD:\r
632 Status = SetPassword (PrivateData, Value->string);\r
633 PrivateData->PasswordState = BROWSER_STATE_VALIDATE_PASSWORD;\r
634 break;\r
635\r
636 default:\r
637 break;\r
638 }\r
639\r
640 break;\r
641\r
642 default:\r
643 break;\r
644 }\r
645\r
646 return Status;\r
647}\r
648\r
649EFI_STATUS\r
650EFIAPI\r
651DriverSampleInit (\r
652 IN EFI_HANDLE ImageHandle,\r
653 IN EFI_SYSTEM_TABLE *SystemTable\r
654 )\r
655{\r
656 EFI_STATUS Status;\r
657 EFI_STATUS SavedStatus;\r
658 EFI_HII_PACKAGE_LIST_HEADER *PackageList;\r
659 EFI_HII_HANDLE HiiHandle[2];\r
660 EFI_HANDLE DriverHandle[2];\r
661 DRIVER_SAMPLE_PRIVATE_DATA *PrivateData;\r
662 EFI_SCREEN_DESCRIPTOR Screen;\r
663 EFI_HII_DATABASE_PROTOCOL *HiiDatabase;\r
664 EFI_HII_STRING_PROTOCOL *HiiString;\r
665 EFI_FORM_BROWSER2_PROTOCOL *FormBrowser2;\r
666 EFI_HII_CONFIG_ROUTING_PROTOCOL *HiiConfigRouting;\r
667 CHAR16 *NewString;\r
668 UINTN BufferSize;\r
669 DRIVER_SAMPLE_CONFIGURATION *Configuration;\r
670 BOOLEAN ExtractIfrDefault;\r
671\r
672 //\r
673 // Initialize the library and our protocol.\r
674 //\r
93e3992d 675\r
676 //\r
677 // Initialize screen dimensions for SendForm().\r
678 // Remove 3 characters from top and bottom\r
679 //\r
680 ZeroMem (&Screen, sizeof (EFI_SCREEN_DESCRIPTOR));\r
681 gST->ConOut->QueryMode (gST->ConOut, gST->ConOut->Mode->Mode, &Screen.RightColumn, &Screen.BottomRow);\r
682\r
683 Screen.TopRow = 3;\r
684 Screen.BottomRow = Screen.BottomRow - 3;\r
685\r
686 //\r
687 // Initialize driver private data\r
688 //\r
689 PrivateData = AllocatePool (sizeof (DRIVER_SAMPLE_PRIVATE_DATA));\r
690 if (PrivateData == NULL) {\r
691 return EFI_OUT_OF_RESOURCES;\r
692 }\r
693\r
694 PrivateData->Signature = DRIVER_SAMPLE_PRIVATE_SIGNATURE;\r
695\r
696 PrivateData->ConfigAccess.ExtractConfig = ExtractConfig;\r
697 PrivateData->ConfigAccess.RouteConfig = RouteConfig;\r
698 PrivateData->ConfigAccess.Callback = DriverCallback;\r
699 PrivateData->PasswordState = BROWSER_STATE_VALIDATE_PASSWORD;\r
700\r
701 //\r
702 // Locate Hii Database protocol\r
703 //\r
704 Status = gBS->LocateProtocol (&gEfiHiiDatabaseProtocolGuid, NULL, (VOID **) &HiiDatabase);\r
705 if (EFI_ERROR (Status)) {\r
706 return Status;\r
707 }\r
708 PrivateData->HiiDatabase = HiiDatabase;\r
709\r
710 //\r
711 // Locate HiiString protocol\r
712 //\r
713 Status = gBS->LocateProtocol (&gEfiHiiStringProtocolGuid, NULL, (VOID **) &HiiString);\r
714 if (EFI_ERROR (Status)) {\r
715 return Status;\r
716 }\r
717 PrivateData->HiiString = HiiString;\r
718\r
719 //\r
720 // Locate Formbrowser2 protocol\r
721 //\r
722 Status = gBS->LocateProtocol (&gEfiFormBrowser2ProtocolGuid, NULL, (VOID **) &FormBrowser2);\r
723 if (EFI_ERROR (Status)) {\r
724 return Status;\r
725 }\r
726 PrivateData->FormBrowser2 = FormBrowser2;\r
727\r
728 //\r
729 // Locate ConfigRouting protocol\r
730 //\r
731 Status = gBS->LocateProtocol (&gEfiHiiConfigRoutingProtocolGuid, NULL, (VOID **) &HiiConfigRouting);\r
732 if (EFI_ERROR (Status)) {\r
733 return Status;\r
734 }\r
735 PrivateData->HiiConfigRouting = HiiConfigRouting;\r
736\r
737 //\r
738 // Install Config Access protocol\r
739 //\r
740 Status = HiiLibCreateHiiDriverHandle (&DriverHandle[0]);\r
741 if (EFI_ERROR (Status)) {\r
742 return Status;\r
743 }\r
744 PrivateData->DriverHandle[0] = DriverHandle[0];\r
745\r
746 Status = gBS->InstallProtocolInterface (\r
747 &DriverHandle[0],\r
748 &gEfiHiiConfigAccessProtocolGuid,\r
749 EFI_NATIVE_INTERFACE,\r
750 &PrivateData->ConfigAccess\r
751 );\r
752 ASSERT_EFI_ERROR (Status);\r
753\r
754 //\r
755 // Publish our HII data\r
756 //\r
9226efe5 757 PackageList = HiiLibPreparePackageList (\r
93e3992d 758 2,\r
759 &mFormSetGuid,\r
760 DriverSampleStrings,\r
761 VfrBin\r
762 );\r
763 if (PackageList == NULL) {\r
764 return EFI_OUT_OF_RESOURCES;\r
765 }\r
766\r
767 Status = HiiDatabase->NewPackageList (\r
768 HiiDatabase,\r
769 PackageList,\r
770 DriverHandle[0],\r
771 &HiiHandle[0]\r
772 );\r
773 gBS->FreePool (PackageList);\r
774 if (EFI_ERROR (Status)) {\r
775 return Status;\r
776 }\r
777 PrivateData->HiiHandle[0] = HiiHandle[0];\r
778\r
779 //\r
780 // Publish another Fromset\r
781 //\r
782 Status = HiiLibCreateHiiDriverHandle (&DriverHandle[1]);\r
783 if (EFI_ERROR (Status)) {\r
784 return Status;\r
785 }\r
786 PrivateData->DriverHandle[1] = DriverHandle[1];\r
787\r
9226efe5 788 PackageList = HiiLibPreparePackageList (\r
93e3992d 789 2,\r
790 &mInventoryGuid,\r
791 DriverSampleStrings,\r
792 InventoryBin\r
793 );\r
794 if (PackageList == NULL) {\r
795 return EFI_OUT_OF_RESOURCES;\r
796 }\r
797\r
798 Status = HiiDatabase->NewPackageList (\r
799 HiiDatabase,\r
800 PackageList,\r
801 DriverHandle[1],\r
802 &HiiHandle[1]\r
803 );\r
804 gBS->FreePool (PackageList);\r
805 if (EFI_ERROR (Status)) {\r
806 return Status;\r
807 }\r
808 PrivateData->HiiHandle[1] = HiiHandle[1];\r
809\r
810 //\r
811 // Very simple example of how one would update a string that is already\r
812 // in the HII database\r
813 //\r
814 NewString = L"700 Mhz";\r
815\r
9226efe5 816 Status = HiiLibSetString (HiiHandle[0], STRING_TOKEN (STR_CPU_STRING2), NewString);\r
93e3992d 817 if (EFI_ERROR (Status)) {\r
818 return Status;\r
819 }\r
820\r
821 //\r
822 // Initialize configuration data\r
823 //\r
824 Configuration = &PrivateData->Configuration;\r
825 ZeroMem (Configuration, sizeof (DRIVER_SAMPLE_CONFIGURATION));\r
826\r
827 //\r
828 // Try to read NV config EFI variable first\r
829 //\r
830 ExtractIfrDefault = TRUE;\r
831 BufferSize = sizeof (DRIVER_SAMPLE_CONFIGURATION);\r
832 Status = gRT->GetVariable (VariableName, &mFormSetGuid, NULL, &BufferSize, Configuration);\r
833 if (!EFI_ERROR (Status) && (BufferSize == sizeof (DRIVER_SAMPLE_CONFIGURATION))) {\r
834 ExtractIfrDefault = FALSE;\r
835 }\r
836\r
837 if (ExtractIfrDefault) {\r
838 //\r
839 // EFI variable for NV config doesn't exit, we should build this variable\r
840 // based on default values stored in IFR\r
841 //\r
842 BufferSize = sizeof (DRIVER_SAMPLE_CONFIGURATION);\r
9226efe5 843 Status = IfrLibExtractDefault (Configuration, &BufferSize, 1, VfrMyIfrNVDataDefault0000);\r
93e3992d 844\r
845 if (!EFI_ERROR (Status)) {\r
846 gRT->SetVariable(\r
847 VariableName,\r
848 &mFormSetGuid,\r
849 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
850 sizeof (DRIVER_SAMPLE_CONFIGURATION),\r
851 Configuration\r
852 );\r
853 }\r
854 }\r
855\r
856 //\r
857 // Example of how to display only the item we sent to HII\r
858 //\r
859 if (DISPLAY_ONLY_MY_ITEM == 0x0001) {\r
860 //\r
861 // Have the browser pull out our copy of the data, and only display our data\r
862 //\r
863 // Status = FormConfig->SendForm (FormConfig, TRUE, HiiHandle, NULL, NULL, NULL, &Screen, NULL);\r
864 //\r
865 Status = FormBrowser2->SendForm (\r
866 FormBrowser2,\r
867 HiiHandle,\r
868 1,\r
869 NULL,\r
870 0,\r
871 NULL,\r
872 NULL\r
873 );\r
874 SavedStatus = Status;\r
875\r
876 Status = HiiDatabase->RemovePackageList (HiiDatabase, HiiHandle[0]);\r
877 if (EFI_ERROR (Status)) {\r
878 return Status;\r
879 }\r
880\r
881 Status = HiiDatabase->RemovePackageList (HiiDatabase, HiiHandle[1]);\r
882 if (EFI_ERROR (Status)) {\r
883 return Status;\r
884 }\r
885\r
886 return SavedStatus;\r
887 } else {\r
888 //\r
889 // Have the browser pull out all the data in the HII Database and display it.\r
890 //\r
891 // Status = FormConfig->SendForm (FormConfig, TRUE, 0, NULL, NULL, NULL, NULL, NULL);\r
892 //\r
893 }\r
894\r
895 return EFI_SUCCESS;\r
896}\r