]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/DriverSampleDxe/DriverSample.c
Update function comment.
[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
7064c0a5 32/**\r
33 Encode the password using a simple algorithm.\r
34 \r
35 @param Password The string to be encoded.\r
36 @param MaxSize The size of the string.\r
37 \r
38**/\r
93e3992d 39VOID\r
40EncodePassword (\r
41 IN CHAR16 *Password,\r
42 IN UINT8 MaxSize\r
43 )\r
44{\r
45 UINTN Index;\r
46 UINTN Loop;\r
47 CHAR16 *Buffer;\r
48 CHAR16 *Key;\r
49\r
50 Key = L"MAR10648567";\r
51 Buffer = AllocateZeroPool (MaxSize);\r
52 ASSERT (Buffer != NULL);\r
53\r
54 for (Index = 0; Key[Index] != 0; Index++) {\r
55 for (Loop = 0; Loop < (UINT8) (MaxSize / 2); Loop++) {\r
56 Buffer[Loop] = (CHAR16) (Password[Loop] ^ Key[Index]);\r
57 }\r
58 }\r
59\r
60 CopyMem (Password, Buffer, MaxSize);\r
61\r
62 gBS->FreePool (Buffer);\r
63 return ;\r
64}\r
65\r
7064c0a5 66/**\r
67 Validate the user's password.\r
68 \r
69 @param PrivateData This driver's private context data.\r
70 @param StringId The user's input.\r
71 \r
72 @retval EFI_SUCCESS The user's input matches the password.\r
73 @retval EFI_NOT_READY The user's input does not match the password.\r
74**/\r
93e3992d 75EFI_STATUS\r
76ValidatePassword (\r
7064c0a5 77 IN DRIVER_SAMPLE_PRIVATE_DATA *PrivateData,\r
78 IN EFI_STRING_ID StringId\r
93e3992d 79 )\r
80{\r
81 EFI_STATUS Status;\r
82 UINTN Index;\r
83 UINTN BufferSize;\r
84 CHAR16 *Password;\r
85 CHAR16 *EncodedPassword;\r
86 BOOLEAN OldPassword;\r
87\r
88 //\r
89 // Get encoded password first\r
90 //\r
91 BufferSize = sizeof (DRIVER_SAMPLE_CONFIGURATION);\r
92 Status = gRT->GetVariable (\r
93 VariableName,\r
94 &mFormSetGuid,\r
95 NULL,\r
96 &BufferSize,\r
97 &PrivateData->Configuration\r
98 );\r
99 if (EFI_ERROR (Status)) {\r
100 //\r
101 // Old password not exist, prompt for new password\r
102 //\r
103 return EFI_SUCCESS;\r
104 }\r
105\r
106 OldPassword = FALSE;\r
107 //\r
108 // Check whether we have any old password set\r
109 //\r
110 for (Index = 0; Index < 20; Index++) {\r
111 if (PrivateData->Configuration.WhatIsThePassword2[Index] != 0) {\r
112 OldPassword = TRUE;\r
113 break;\r
114 }\r
115 }\r
116 if (!OldPassword) {\r
117 //\r
118 // Old password not exist, return EFI_SUCCESS to prompt for new password\r
119 //\r
120 return EFI_SUCCESS;\r
121 }\r
122\r
123 //\r
124 // Get user input password\r
125 //\r
126 BufferSize = 21 * sizeof (CHAR16);\r
127 Password = AllocateZeroPool (BufferSize);\r
128 ASSERT (Password != NULL);\r
129\r
9226efe5 130 Status = HiiLibGetString (PrivateData->HiiHandle[0], StringId, Password, &BufferSize);\r
93e3992d 131 if (EFI_ERROR (Status)) {\r
132 gBS->FreePool (Password);\r
133 return Status;\r
134 }\r
135\r
136 //\r
137 // Validate old password\r
138 //\r
139 EncodedPassword = AllocateCopyPool (21 * sizeof (CHAR16), Password);\r
140 ASSERT (EncodedPassword != NULL);\r
141 EncodePassword (EncodedPassword, 20 * sizeof (CHAR16));\r
142 if (CompareMem (EncodedPassword, PrivateData->Configuration.WhatIsThePassword2, 20 * sizeof (CHAR16)) != 0) {\r
143 //\r
144 // Old password mismatch, return EFI_NOT_READY to prompt for error message\r
145 //\r
146 Status = EFI_NOT_READY;\r
147 } else {\r
148 Status = EFI_SUCCESS;\r
149 }\r
150\r
151 gBS->FreePool (Password);\r
152 gBS->FreePool (EncodedPassword);\r
153\r
154 return Status;\r
155}\r
156\r
7064c0a5 157/**\r
158 Encode the password using a simple algorithm.\r
159 \r
160 @param PrivateData This driver's private context data.\r
161 @param StringId The password from User.\r
162 \r
163 @retval EFI_SUCESS The operation is successful.\r
164 @return Other value if gRT->SetVariable () fails.\r
165 \r
166**/\r
93e3992d 167EFI_STATUS\r
168SetPassword (\r
7064c0a5 169 IN DRIVER_SAMPLE_PRIVATE_DATA *PrivateData,\r
170 IN EFI_STRING_ID StringId\r
93e3992d 171 )\r
172{\r
173 EFI_STATUS Status;\r
174 UINTN BufferSize;\r
175 CHAR16 *Password;\r
176 DRIVER_SAMPLE_CONFIGURATION *Configuration;\r
177\r
178 //\r
179 // Get Buffer Storage data from EFI variable\r
180 //\r
181 BufferSize = sizeof (DRIVER_SAMPLE_CONFIGURATION);\r
182 Status = gRT->GetVariable (\r
183 VariableName,\r
184 &mFormSetGuid,\r
185 NULL,\r
186 &BufferSize,\r
187 &PrivateData->Configuration\r
188 );\r
189 if (EFI_ERROR (Status)) {\r
190 return Status;\r
191 }\r
192\r
193 //\r
194 // Get user input password\r
195 //\r
196 Password = &PrivateData->Configuration.WhatIsThePassword2[0];\r
197 ZeroMem (Password, 20 * sizeof (CHAR16));\r
9226efe5 198 Status = HiiLibGetString (PrivateData->HiiHandle[0], StringId, Password, &BufferSize);\r
93e3992d 199 if (EFI_ERROR (Status)) {\r
200 return Status;\r
201 }\r
202\r
203 //\r
204 // Retrive uncommitted data from Browser\r
205 //\r
206 BufferSize = sizeof (DRIVER_SAMPLE_CONFIGURATION);\r
207 Configuration = AllocateZeroPool (sizeof (DRIVER_SAMPLE_PRIVATE_DATA));\r
208 ASSERT (Configuration != NULL);\r
209 Status = GetBrowserData (&mFormSetGuid, VariableName, &BufferSize, (UINT8 *) Configuration);\r
210 if (!EFI_ERROR (Status)) {\r
211 //\r
212 // Update password's clear text in the screen\r
213 //\r
214 CopyMem (Configuration->PasswordClearText, Password, 20 * sizeof (CHAR16));\r
215\r
216 //\r
217 // Update uncommitted data of Browser\r
218 //\r
219 BufferSize = sizeof (DRIVER_SAMPLE_CONFIGURATION);\r
220 Status = SetBrowserData (\r
221 &mFormSetGuid,\r
222 VariableName,\r
223 BufferSize,\r
224 (UINT8 *) Configuration,\r
225 NULL\r
226 );\r
227 }\r
228 gBS->FreePool (Configuration);\r
229\r
230 //\r
231 // Set password\r
232 //\r
233 EncodePassword (Password, 20 * sizeof (CHAR16));\r
234 Status = gRT->SetVariable(\r
235 VariableName,\r
236 &mFormSetGuid,\r
237 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
238 sizeof (DRIVER_SAMPLE_CONFIGURATION),\r
239 &PrivateData->Configuration\r
240 );\r
241 return Status;\r
242}\r
243\r
244\r
245/**\r
246 This function allows a caller to extract the current configuration for one\r
247 or more named elements from the target driver.\r
248\r
249 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
250 @param Request A null-terminated Unicode string in\r
251 <ConfigRequest> format.\r
252 @param Progress On return, points to a character in the Request\r
253 string. Points to the string's null terminator if\r
254 request was successful. Points to the most recent\r
255 '&' before the first failing name/value pair (or\r
256 the beginning of the string if the failure is in\r
257 the first name/value pair) if the request was not\r
258 successful.\r
259 @param Results A null-terminated Unicode string in\r
260 <ConfigAltResp> format which has all values filled\r
261 in for the names in the Request string. String to\r
262 be allocated by the called function.\r
263\r
264 @retval EFI_SUCCESS The Results is filled with the requested values.\r
265 @retval EFI_OUT_OF_RESOURCES Not enough memory to store the results.\r
266 @retval EFI_INVALID_PARAMETER Request is NULL, illegal syntax, or unknown name.\r
267 @retval EFI_NOT_FOUND Routing data doesn't match any storage in this\r
268 driver.\r
269\r
270**/\r
271EFI_STATUS\r
272EFIAPI\r
273ExtractConfig (\r
274 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
275 IN CONST EFI_STRING Request,\r
276 OUT EFI_STRING *Progress,\r
277 OUT EFI_STRING *Results\r
278 )\r
279{\r
280 EFI_STATUS Status;\r
281 UINTN BufferSize;\r
282 DRIVER_SAMPLE_PRIVATE_DATA *PrivateData;\r
283 EFI_HII_CONFIG_ROUTING_PROTOCOL *HiiConfigRouting;\r
284\r
285 PrivateData = DRIVER_SAMPLE_PRIVATE_FROM_THIS (This);\r
286 HiiConfigRouting = PrivateData->HiiConfigRouting;\r
287\r
8d00a0f1 288 //\r
93e3992d 289 //\r
290 // Get Buffer Storage data from EFI variable\r
291 //\r
292 BufferSize = sizeof (DRIVER_SAMPLE_CONFIGURATION);\r
293 Status = gRT->GetVariable (\r
294 VariableName,\r
295 &mFormSetGuid,\r
296 NULL,\r
297 &BufferSize,\r
298 &PrivateData->Configuration\r
299 );\r
300 if (EFI_ERROR (Status)) {\r
301 return Status;\r
302 }\r
303\r
8d00a0f1 304 if (Request == NULL) {\r
305 //\r
306 // Request is set to NULL, return all configurable elements together with ALTCFG\r
307 //\r
308 Status = ConstructConfigAltResp (\r
309 NULL,\r
310 NULL,\r
311 Results,\r
312 &mFormSetGuid,\r
313 VariableName,\r
314 PrivateData->DriverHandle[0],\r
315 &PrivateData->Configuration,\r
316 BufferSize,\r
317 VfrMyIfrNVDataBlockName,\r
318 2,\r
319 STRING_TOKEN (STR_STANDARD_DEFAULT_PROMPT),\r
320 VfrMyIfrNVDataDefault0000,\r
321 STRING_TOKEN (STR_MANUFACTURE_DEFAULT_PROMPT),\r
322 VfrMyIfrNVDataDefault0001\r
323 );\r
324\r
325 return Status;\r
326 }\r
327\r
328 //\r
329 // Check routing data in <ConfigHdr>.\r
330 // Note: if only one Storage is used, then this checking could be skipped.\r
331 //\r
332 if (!IsConfigHdrMatch (Request, &mFormSetGuid, VariableName)) {\r
333 *Progress = Request;\r
334 return EFI_NOT_FOUND;\r
335 }\r
336\r
93e3992d 337 //\r
338 // Convert buffer data to <ConfigResp> by helper function BlockToConfig()\r
339 //\r
340 Status = HiiConfigRouting->BlockToConfig (\r
341 HiiConfigRouting,\r
342 Request,\r
343 (UINT8 *) &PrivateData->Configuration,\r
344 BufferSize,\r
345 Results,\r
346 Progress\r
347 );\r
348 return Status;\r
349}\r
350\r
351\r
352/**\r
353 This function processes the results of changes in configuration.\r
354\r
355 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
356 @param Configuration A null-terminated Unicode string in <ConfigResp>\r
357 format.\r
358 @param Progress A pointer to a string filled in with the offset of\r
359 the most recent '&' before the first failing\r
360 name/value pair (or the beginning of the string if\r
361 the failure is in the first name/value pair) or\r
362 the terminating NULL if all was successful.\r
363\r
364 @retval EFI_SUCCESS The Results is processed successfully.\r
365 @retval EFI_INVALID_PARAMETER Configuration is NULL.\r
366 @retval EFI_NOT_FOUND Routing data doesn't match any storage in this\r
367 driver.\r
368\r
369**/\r
370EFI_STATUS\r
371EFIAPI\r
372RouteConfig (\r
373 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
374 IN CONST EFI_STRING Configuration,\r
375 OUT EFI_STRING *Progress\r
376 )\r
377{\r
378 EFI_STATUS Status;\r
379 UINTN BufferSize;\r
380 DRIVER_SAMPLE_PRIVATE_DATA *PrivateData;\r
381 EFI_HII_CONFIG_ROUTING_PROTOCOL *HiiConfigRouting;\r
382\r
8d00a0f1 383 if (Configuration == NULL) {\r
384 return EFI_INVALID_PARAMETER;\r
385 }\r
386\r
93e3992d 387 PrivateData = DRIVER_SAMPLE_PRIVATE_FROM_THIS (This);\r
388 HiiConfigRouting = PrivateData->HiiConfigRouting;\r
389\r
8d00a0f1 390 // Check routing data in <ConfigHdr>.\r
391 // Note: if only one Storage is used, then this checking could be skipped.\r
392 //\r
393 if (!IsConfigHdrMatch (Configuration, &mFormSetGuid, VariableName)) {\r
394 *Progress = Configuration;\r
395 return EFI_NOT_FOUND;\r
396 }\r
397\r
93e3992d 398 //\r
399 // Get Buffer Storage data from EFI variable\r
400 //\r
401 BufferSize = sizeof (DRIVER_SAMPLE_CONFIGURATION);\r
402 Status = gRT->GetVariable (\r
403 VariableName,\r
404 &mFormSetGuid,\r
405 NULL,\r
406 &BufferSize,\r
407 &PrivateData->Configuration\r
408 );\r
409 if (EFI_ERROR (Status)) {\r
410 return Status;\r
411 }\r
412\r
413 //\r
414 // Convert <ConfigResp> to buffer data by helper function ConfigToBlock()\r
415 //\r
416 BufferSize = sizeof (DRIVER_SAMPLE_CONFIGURATION);\r
417 Status = HiiConfigRouting->ConfigToBlock (\r
418 HiiConfigRouting,\r
419 Configuration,\r
420 (UINT8 *) &PrivateData->Configuration,\r
421 &BufferSize,\r
422 Progress\r
423 );\r
424 if (EFI_ERROR (Status)) {\r
425 return Status;\r
426 }\r
427\r
428 //\r
429 // Store Buffer Storage back to EFI variable\r
430 //\r
431 Status = gRT->SetVariable(\r
432 VariableName,\r
433 &mFormSetGuid,\r
434 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
435 sizeof (DRIVER_SAMPLE_CONFIGURATION),\r
436 &PrivateData->Configuration\r
437 );\r
438\r
439 return Status;\r
440}\r
441\r
442\r
443/**\r
444 This function processes the results of changes in configuration.\r
445\r
446 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
447 @param Action Specifies the type of action taken by the browser.\r
448 @param QuestionId A unique value which is sent to the original\r
449 exporting driver so that it can identify the type\r
450 of data to expect.\r
451 @param Type The type of value for the question.\r
452 @param Value A pointer to the data being sent to the original\r
453 exporting driver.\r
454 @param ActionRequest On return, points to the action requested by the\r
455 callback function.\r
456\r
457 @retval EFI_SUCCESS The callback successfully handled the action.\r
458 @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold the\r
459 variable and its data.\r
460 @retval EFI_DEVICE_ERROR The variable could not be saved.\r
461 @retval EFI_UNSUPPORTED The specified Action is not supported by the\r
462 callback.\r
463\r
464**/\r
465EFI_STATUS\r
466EFIAPI\r
467DriverCallback (\r
468 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
469 IN EFI_BROWSER_ACTION Action,\r
470 IN EFI_QUESTION_ID QuestionId,\r
471 IN UINT8 Type,\r
472 IN EFI_IFR_TYPE_VALUE *Value,\r
473 OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest\r
474 )\r
475{\r
476 DRIVER_SAMPLE_PRIVATE_DATA *PrivateData;\r
477 EFI_STATUS Status;\r
478 EFI_HII_UPDATE_DATA UpdateData;\r
479 IFR_OPTION *IfrOptionList;\r
8d00a0f1 480 UINT8 MyVar;\r
93e3992d 481\r
482 if ((Value == NULL) || (ActionRequest == NULL)) {\r
483 return EFI_INVALID_PARAMETER;\r
484 }\r
485\r
486 Status = EFI_SUCCESS;\r
487 PrivateData = DRIVER_SAMPLE_PRIVATE_FROM_THIS (This);\r
488\r
489 switch (QuestionId) {\r
490 case 0x1234:\r
491 //\r
8d00a0f1 492 // Initialize the container for dynamic opcodes\r
93e3992d 493 //\r
8d00a0f1 494 IfrLibInitUpdateData (&UpdateData, 0x1000);\r
93e3992d 495\r
496 IfrOptionList = AllocatePool (2 * sizeof (IFR_OPTION));\r
497 ASSERT (IfrOptionList != NULL);\r
498\r
499 IfrOptionList[0].Flags = 0;\r
500 IfrOptionList[0].StringToken = STRING_TOKEN (STR_BOOT_OPTION1);\r
501 IfrOptionList[0].Value.u8 = 1;\r
502 IfrOptionList[1].Flags = EFI_IFR_OPTION_DEFAULT;\r
503 IfrOptionList[1].StringToken = STRING_TOKEN (STR_BOOT_OPTION2);\r
504 IfrOptionList[1].Value.u8 = 2;\r
505\r
8d00a0f1 506 CreateActionOpCode (\r
507 0x1237, // Question ID\r
508 STRING_TOKEN(STR_EXIT_TEXT), // Prompt text\r
509 STRING_TOKEN(STR_EXIT_TEXT), // Help text\r
510 EFI_IFR_FLAG_CALLBACK, // Question flag\r
511 0, // Action String ID\r
512 &UpdateData // Container for dynamic created opcodes\r
513 );\r
514 \r
515 //\r
516 // Prepare initial value for the dynamic created oneof Question\r
517 //\r
518 PrivateData->Configuration.DynamicOneof = 2;\r
519 Status = gRT->SetVariable(\r
520 VariableName,\r
521 &mFormSetGuid,\r
522 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
523 sizeof (DRIVER_SAMPLE_CONFIGURATION),\r
524 &PrivateData->Configuration\r
525 );\r
526 CreateOneOfOpCode (\r
527 0x8001, // Question ID (or call it "key")\r
528 CONFIGURATION_VARSTORE_ID, // VarStore ID\r
529 DYNAMIC_ONE_OF_VAR_OFFSET, // Offset in Buffer Storage\r
530 STRING_TOKEN (STR_ONE_OF_PROMPT), // Question prompt text\r
531 STRING_TOKEN (STR_ONE_OF_HELP), // Question help text\r
532 EFI_IFR_FLAG_CALLBACK, // Question flag\r
533 EFI_IFR_NUMERIC_SIZE_1, // Data type of Question Value\r
534 IfrOptionList, // Option list\r
535 2, // Number of options in Option list\r
536 &UpdateData // Container for dynamic created opcodes\r
537 );\r
538 \r
539 CreateOrderedListOpCode (\r
540 0x8002, // Question ID\r
541 CONFIGURATION_VARSTORE_ID, // VarStore ID\r
542 DYNAMIC_ORDERED_LIST_VAR_OFFSET, // Offset in Buffer Storage\r
543 STRING_TOKEN (STR_BOOT_OPTIONS), // Question prompt text\r
544 STRING_TOKEN (STR_BOOT_OPTIONS), // Question help text\r
545 EFI_IFR_FLAG_RESET_REQUIRED, // Question flag\r
546 0, // Ordered list flag, e.g. EFI_IFR_UNIQUE_SET\r
547 EFI_IFR_NUMERIC_SIZE_1, // Data type of Question value\r
548 5, // Maximum container\r
549 IfrOptionList, // Option list\r
550 2, // Number of options in Option list\r
551 &UpdateData // Container for dynamic created opcodes\r
552 );\r
553 \r
554 CreateGotoOpCode (\r
555 1, // Target Form ID\r
556 STRING_TOKEN (STR_GOTO_FORM1), // Prompt text\r
557 STRING_TOKEN (STR_GOTO_HELP), // Help text\r
558 0, // Question flag\r
559 0x8003, // Question ID\r
560 &UpdateData // Container for dynamic created opcodes\r
561 );\r
562 \r
563 Status = IfrLibUpdateForm (\r
564 PrivateData->HiiHandle[0], // HII handle\r
565 &mFormSetGuid, // Formset GUID\r
566 0x1234, // Form ID\r
567 0x1234, // Label for where to insert opcodes\r
568 TRUE, // Append or replace\r
569 &UpdateData // Dynamic created opcodes\r
570 );\r
571 gBS->FreePool (IfrOptionList);\r
572 IfrLibFreeUpdateData (&UpdateData);\r
573 break;\r
574 \r
575 case 0x5678:\r
576 //\r
577 // We will reach here once the Question is refreshed\r
578 //\r
579 IfrLibInitUpdateData (&UpdateData, 0x1000);\r
580 \r
581 IfrOptionList = AllocatePool (2 * sizeof (IFR_OPTION));\r
582 ASSERT (IfrOptionList != NULL);\r
583 \r
584 CreateActionOpCode (\r
585 0x1237, // Question ID\r
586 STRING_TOKEN(STR_EXIT_TEXT), // Prompt text\r
587 STRING_TOKEN(STR_EXIT_TEXT), // Help text\r
588 EFI_IFR_FLAG_CALLBACK, // Question flag\r
589 0, // Action String ID\r
590 &UpdateData // Container for dynamic created opcodes\r
591 );\r
592 \r
593 Status = IfrLibUpdateForm (\r
594 PrivateData->HiiHandle[0], // HII handle\r
595 &mFormSetGuid, // Formset GUID\r
596 3, // Form ID\r
597 0x2234, // Label for where to insert opcodes\r
598 TRUE, // Append or replace\r
599 &UpdateData // Dynamic created opcodes\r
600 );\r
601 IfrLibFreeUpdateData (&UpdateData);\r
602 \r
603 //\r
604 // Refresh the Question value\r
605 //\r
606 PrivateData->Configuration.DynamicRefresh++;\r
607 Status = gRT->SetVariable(\r
608 VariableName,\r
609 &mFormSetGuid,\r
610 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
611 sizeof (DRIVER_SAMPLE_CONFIGURATION),\r
612 &PrivateData->Configuration\r
613 );\r
614 \r
615 //\r
616 // Change an EFI Variable storage (MyEfiVar) asynchronous, this will cause\r
617 // the first statement in Form 3 be suppressed\r
618 //\r
619 MyVar = 111;\r
620 Status = gRT->SetVariable(\r
621 L"MyVar",\r
622 &mFormSetGuid,\r
623 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
624 1,\r
625 &MyVar\r
626 );\r
93e3992d 627 break;\r
628\r
629 case 0x1237:\r
630 //\r
631 // User press "Exit now", request Browser to exit\r
632 //\r
633 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;\r
634 break;\r
635\r
636 case 0x1238:\r
637 //\r
638 // User press "Save now", request Browser to save the uncommitted data.\r
639 //\r
640 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_SUBMIT;\r
641 break;\r
642\r
643 case 0x2000:\r
644 //\r
645 // When try to set a new password, user will be chanlleged with old password.\r
646 // The Callback is responsible for validating old password input by user,\r
647 // If Callback return EFI_SUCCESS, it indicates validation pass.\r
648 //\r
649 switch (PrivateData->PasswordState) {\r
650 case BROWSER_STATE_VALIDATE_PASSWORD:\r
651 Status = ValidatePassword (PrivateData, Value->string);\r
652 if (Status == EFI_SUCCESS) {\r
653 PrivateData->PasswordState = BROWSER_STATE_SET_PASSWORD;\r
654 }\r
655 break;\r
656\r
657 case BROWSER_STATE_SET_PASSWORD:\r
658 Status = SetPassword (PrivateData, Value->string);\r
659 PrivateData->PasswordState = BROWSER_STATE_VALIDATE_PASSWORD;\r
660 break;\r
661\r
662 default:\r
663 break;\r
664 }\r
665\r
666 break;\r
667\r
668 default:\r
669 break;\r
670 }\r
671\r
672 return Status;\r
673}\r
674\r
7064c0a5 675/**\r
676 Main entry for this driver.\r
677 \r
678 @param ImageHandle Image handle this driver.\r
679 @param SystemTable Pointer to SystemTable.\r
680\r
681 @retval EFI_SUCESS This function always complete successfully.\r
682\r
683**/\r
93e3992d 684EFI_STATUS\r
685EFIAPI\r
686DriverSampleInit (\r
687 IN EFI_HANDLE ImageHandle,\r
688 IN EFI_SYSTEM_TABLE *SystemTable\r
689 )\r
690{\r
691 EFI_STATUS Status;\r
692 EFI_STATUS SavedStatus;\r
693 EFI_HII_PACKAGE_LIST_HEADER *PackageList;\r
694 EFI_HII_HANDLE HiiHandle[2];\r
695 EFI_HANDLE DriverHandle[2];\r
696 DRIVER_SAMPLE_PRIVATE_DATA *PrivateData;\r
697 EFI_SCREEN_DESCRIPTOR Screen;\r
698 EFI_HII_DATABASE_PROTOCOL *HiiDatabase;\r
699 EFI_HII_STRING_PROTOCOL *HiiString;\r
700 EFI_FORM_BROWSER2_PROTOCOL *FormBrowser2;\r
701 EFI_HII_CONFIG_ROUTING_PROTOCOL *HiiConfigRouting;\r
702 CHAR16 *NewString;\r
703 UINTN BufferSize;\r
704 DRIVER_SAMPLE_CONFIGURATION *Configuration;\r
705 BOOLEAN ExtractIfrDefault;\r
706\r
707 //\r
708 // Initialize the library and our protocol.\r
709 //\r
93e3992d 710\r
711 //\r
712 // Initialize screen dimensions for SendForm().\r
713 // Remove 3 characters from top and bottom\r
714 //\r
715 ZeroMem (&Screen, sizeof (EFI_SCREEN_DESCRIPTOR));\r
716 gST->ConOut->QueryMode (gST->ConOut, gST->ConOut->Mode->Mode, &Screen.RightColumn, &Screen.BottomRow);\r
717\r
718 Screen.TopRow = 3;\r
719 Screen.BottomRow = Screen.BottomRow - 3;\r
720\r
721 //\r
722 // Initialize driver private data\r
723 //\r
724 PrivateData = AllocatePool (sizeof (DRIVER_SAMPLE_PRIVATE_DATA));\r
725 if (PrivateData == NULL) {\r
726 return EFI_OUT_OF_RESOURCES;\r
727 }\r
728\r
729 PrivateData->Signature = DRIVER_SAMPLE_PRIVATE_SIGNATURE;\r
730\r
731 PrivateData->ConfigAccess.ExtractConfig = ExtractConfig;\r
732 PrivateData->ConfigAccess.RouteConfig = RouteConfig;\r
733 PrivateData->ConfigAccess.Callback = DriverCallback;\r
734 PrivateData->PasswordState = BROWSER_STATE_VALIDATE_PASSWORD;\r
735\r
736 //\r
737 // Locate Hii Database protocol\r
738 //\r
739 Status = gBS->LocateProtocol (&gEfiHiiDatabaseProtocolGuid, NULL, (VOID **) &HiiDatabase);\r
740 if (EFI_ERROR (Status)) {\r
741 return Status;\r
742 }\r
743 PrivateData->HiiDatabase = HiiDatabase;\r
744\r
745 //\r
746 // Locate HiiString protocol\r
747 //\r
748 Status = gBS->LocateProtocol (&gEfiHiiStringProtocolGuid, NULL, (VOID **) &HiiString);\r
749 if (EFI_ERROR (Status)) {\r
750 return Status;\r
751 }\r
752 PrivateData->HiiString = HiiString;\r
753\r
754 //\r
755 // Locate Formbrowser2 protocol\r
756 //\r
757 Status = gBS->LocateProtocol (&gEfiFormBrowser2ProtocolGuid, NULL, (VOID **) &FormBrowser2);\r
758 if (EFI_ERROR (Status)) {\r
759 return Status;\r
760 }\r
761 PrivateData->FormBrowser2 = FormBrowser2;\r
762\r
763 //\r
764 // Locate ConfigRouting protocol\r
765 //\r
766 Status = gBS->LocateProtocol (&gEfiHiiConfigRoutingProtocolGuid, NULL, (VOID **) &HiiConfigRouting);\r
767 if (EFI_ERROR (Status)) {\r
768 return Status;\r
769 }\r
770 PrivateData->HiiConfigRouting = HiiConfigRouting;\r
771\r
772 //\r
773 // Install Config Access protocol\r
774 //\r
775 Status = HiiLibCreateHiiDriverHandle (&DriverHandle[0]);\r
776 if (EFI_ERROR (Status)) {\r
777 return Status;\r
778 }\r
779 PrivateData->DriverHandle[0] = DriverHandle[0];\r
780\r
781 Status = gBS->InstallProtocolInterface (\r
782 &DriverHandle[0],\r
783 &gEfiHiiConfigAccessProtocolGuid,\r
784 EFI_NATIVE_INTERFACE,\r
785 &PrivateData->ConfigAccess\r
786 );\r
787 ASSERT_EFI_ERROR (Status);\r
788\r
789 //\r
790 // Publish our HII data\r
791 //\r
9226efe5 792 PackageList = HiiLibPreparePackageList (\r
93e3992d 793 2,\r
794 &mFormSetGuid,\r
795 DriverSampleStrings,\r
796 VfrBin\r
797 );\r
798 if (PackageList == NULL) {\r
799 return EFI_OUT_OF_RESOURCES;\r
800 }\r
801\r
802 Status = HiiDatabase->NewPackageList (\r
803 HiiDatabase,\r
804 PackageList,\r
805 DriverHandle[0],\r
806 &HiiHandle[0]\r
807 );\r
808 gBS->FreePool (PackageList);\r
809 if (EFI_ERROR (Status)) {\r
810 return Status;\r
811 }\r
812 PrivateData->HiiHandle[0] = HiiHandle[0];\r
813\r
814 //\r
815 // Publish another Fromset\r
816 //\r
817 Status = HiiLibCreateHiiDriverHandle (&DriverHandle[1]);\r
818 if (EFI_ERROR (Status)) {\r
819 return Status;\r
820 }\r
821 PrivateData->DriverHandle[1] = DriverHandle[1];\r
822\r
9226efe5 823 PackageList = HiiLibPreparePackageList (\r
93e3992d 824 2,\r
825 &mInventoryGuid,\r
826 DriverSampleStrings,\r
827 InventoryBin\r
828 );\r
829 if (PackageList == NULL) {\r
830 return EFI_OUT_OF_RESOURCES;\r
831 }\r
832\r
833 Status = HiiDatabase->NewPackageList (\r
834 HiiDatabase,\r
835 PackageList,\r
836 DriverHandle[1],\r
837 &HiiHandle[1]\r
838 );\r
839 gBS->FreePool (PackageList);\r
840 if (EFI_ERROR (Status)) {\r
841 return Status;\r
842 }\r
843 PrivateData->HiiHandle[1] = HiiHandle[1];\r
844\r
845 //\r
846 // Very simple example of how one would update a string that is already\r
847 // in the HII database\r
848 //\r
849 NewString = L"700 Mhz";\r
850\r
9226efe5 851 Status = HiiLibSetString (HiiHandle[0], STRING_TOKEN (STR_CPU_STRING2), NewString);\r
93e3992d 852 if (EFI_ERROR (Status)) {\r
853 return Status;\r
854 }\r
855\r
856 //\r
857 // Initialize configuration data\r
858 //\r
859 Configuration = &PrivateData->Configuration;\r
860 ZeroMem (Configuration, sizeof (DRIVER_SAMPLE_CONFIGURATION));\r
861\r
862 //\r
863 // Try to read NV config EFI variable first\r
864 //\r
865 ExtractIfrDefault = TRUE;\r
866 BufferSize = sizeof (DRIVER_SAMPLE_CONFIGURATION);\r
867 Status = gRT->GetVariable (VariableName, &mFormSetGuid, NULL, &BufferSize, Configuration);\r
868 if (!EFI_ERROR (Status) && (BufferSize == sizeof (DRIVER_SAMPLE_CONFIGURATION))) {\r
869 ExtractIfrDefault = FALSE;\r
870 }\r
871\r
872 if (ExtractIfrDefault) {\r
873 //\r
874 // EFI variable for NV config doesn't exit, we should build this variable\r
875 // based on default values stored in IFR\r
876 //\r
877 BufferSize = sizeof (DRIVER_SAMPLE_CONFIGURATION);\r
9226efe5 878 Status = IfrLibExtractDefault (Configuration, &BufferSize, 1, VfrMyIfrNVDataDefault0000);\r
93e3992d 879\r
880 if (!EFI_ERROR (Status)) {\r
881 gRT->SetVariable(\r
882 VariableName,\r
883 &mFormSetGuid,\r
884 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
885 sizeof (DRIVER_SAMPLE_CONFIGURATION),\r
886 Configuration\r
887 );\r
888 }\r
889 }\r
890\r
891 //\r
892 // Example of how to display only the item we sent to HII\r
893 //\r
894 if (DISPLAY_ONLY_MY_ITEM == 0x0001) {\r
895 //\r
896 // Have the browser pull out our copy of the data, and only display our data\r
897 //\r
898 // Status = FormConfig->SendForm (FormConfig, TRUE, HiiHandle, NULL, NULL, NULL, &Screen, NULL);\r
899 //\r
900 Status = FormBrowser2->SendForm (\r
901 FormBrowser2,\r
902 HiiHandle,\r
903 1,\r
904 NULL,\r
905 0,\r
906 NULL,\r
907 NULL\r
908 );\r
909 SavedStatus = Status;\r
910\r
911 Status = HiiDatabase->RemovePackageList (HiiDatabase, HiiHandle[0]);\r
912 if (EFI_ERROR (Status)) {\r
913 return Status;\r
914 }\r
915\r
916 Status = HiiDatabase->RemovePackageList (HiiDatabase, HiiHandle[1]);\r
917 if (EFI_ERROR (Status)) {\r
918 return Status;\r
919 }\r
920\r
921 return SavedStatus;\r
922 } else {\r
923 //\r
924 // Have the browser pull out all the data in the HII Database and display it.\r
925 //\r
926 // Status = FormConfig->SendForm (FormConfig, TRUE, 0, NULL, NULL, NULL, NULL, NULL);\r
927 //\r
928 }\r
929\r
930 return EFI_SUCCESS;\r
931}\r