2 This is an example of how a driver might export data to the HII protocol to be
3 later utilized by the Setup Protocol
5 Copyright (c) 2004 - 2009, Intel Corporation
6 All rights reserved. This program and the accompanying materials
7 are licensed and made available under the terms and conditions of the BSD License
8 which accompanies this distribution. The full text of the license may be found at
9 http://opensource.org/licenses/bsd-license.php
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
17 #include "DriverSample.h"
19 #define DISPLAY_ONLY_MY_ITEM 0x0002
21 EFI_GUID mFormSetGuid
= FORMSET_GUID
;
22 EFI_GUID mInventoryGuid
= INVENTORY_GUID
;
24 CHAR16 VariableName
[] = L
"MyIfrNVData";
25 EFI_HANDLE DriverHandle
[2] = {NULL
, NULL
};
26 DRIVER_SAMPLE_PRIVATE_DATA
*PrivateData
= NULL
;
28 HII_VENDOR_DEVICE_PATH mHiiVendorDevicePath0
= {
34 (UINT8
) (sizeof (VENDOR_DEVICE_PATH
)),
35 (UINT8
) ((sizeof (VENDOR_DEVICE_PATH
)) >> 8)
39 // {C153B68D-EBFC-488e-B110-662867745B87}
41 { 0xc153b68d, 0xebfc, 0x488e, { 0xb1, 0x10, 0x66, 0x28, 0x67, 0x74, 0x5b, 0x87 } }
45 END_ENTIRE_DEVICE_PATH_SUBTYPE
,
47 (UINT8
) (END_DEVICE_PATH_LENGTH
),
48 (UINT8
) ((END_DEVICE_PATH_LENGTH
) >> 8)
53 HII_VENDOR_DEVICE_PATH mHiiVendorDevicePath1
= {
59 (UINT8
) (sizeof (VENDOR_DEVICE_PATH
)),
60 (UINT8
) ((sizeof (VENDOR_DEVICE_PATH
)) >> 8)
64 // {06F37F07-0C48-40e9-8436-0A08A0BB76B0}
66 { 0x6f37f07, 0xc48, 0x40e9, { 0x84, 0x36, 0xa, 0x8, 0xa0, 0xbb, 0x76, 0xb0 } }
70 END_ENTIRE_DEVICE_PATH_SUBTYPE
,
72 (UINT8
) (END_DEVICE_PATH_LENGTH
),
73 (UINT8
) ((END_DEVICE_PATH_LENGTH
) >> 8)
79 Encode the password using a simple algorithm.
81 @param Password The string to be encoded.
82 @param MaxSize The size of the string.
97 Buffer
= AllocateZeroPool (MaxSize
);
98 ASSERT (Buffer
!= NULL
);
100 for (Index
= 0; Key
[Index
] != 0; Index
++) {
101 for (Loop
= 0; Loop
< (UINT8
) (MaxSize
/ 2); Loop
++) {
102 Buffer
[Loop
] = (CHAR16
) (Password
[Loop
] ^ Key
[Index
]);
106 CopyMem (Password
, Buffer
, MaxSize
);
113 Validate the user's password.
115 @param PrivateData This driver's private context data.
116 @param StringId The user's input.
118 @retval EFI_SUCCESS The user's input matches the password.
119 @retval EFI_NOT_READY The user's input does not match the password.
123 IN DRIVER_SAMPLE_PRIVATE_DATA
*PrivateData
,
124 IN EFI_STRING_ID StringId
130 UINTN PasswordMaxSize
;
132 CHAR16
*EncodedPassword
;
136 // Get encoded password first
138 BufferSize
= sizeof (DRIVER_SAMPLE_CONFIGURATION
);
139 Status
= gRT
->GetVariable (
144 &PrivateData
->Configuration
146 if (EFI_ERROR (Status
)) {
148 // Old password not exist, prompt for new password
154 PasswordMaxSize
= sizeof (PrivateData
->Configuration
.WhatIsThePassword2
);
156 // Check whether we have any old password set
158 for (Index
= 0; Index
< PasswordMaxSize
/ sizeof (UINT16
); Index
++) {
159 if (PrivateData
->Configuration
.WhatIsThePassword2
[Index
] != 0) {
166 // Old password not exist, return EFI_SUCCESS to prompt for new password
172 // Get user input password
174 Password
= HiiGetString (PrivateData
->HiiHandle
[0], StringId
, NULL
);
175 if (Password
== NULL
) {
176 return EFI_NOT_READY
;
178 if (StrSize (Password
) > PasswordMaxSize
) {
180 return EFI_NOT_READY
;
184 // Validate old password
186 EncodedPassword
= AllocateZeroPool (PasswordMaxSize
);
187 ASSERT (EncodedPassword
!= NULL
);
188 StrnCpy (EncodedPassword
, Password
, StrLen (Password
));
189 EncodePassword (EncodedPassword
, StrLen (EncodedPassword
) * sizeof (CHAR16
));
190 if (CompareMem (EncodedPassword
, PrivateData
->Configuration
.WhatIsThePassword2
, StrLen (EncodedPassword
) * sizeof (CHAR16
)) != 0) {
192 // Old password mismatch, return EFI_NOT_READY to prompt for error message
194 Status
= EFI_NOT_READY
;
196 Status
= EFI_SUCCESS
;
200 FreePool (EncodedPassword
);
206 Encode the password using a simple algorithm.
208 @param PrivateData This driver's private context data.
209 @param StringId The password from User.
211 @retval EFI_SUCESS The operation is successful.
212 @return Other value if gRT->SetVariable () fails.
217 IN DRIVER_SAMPLE_PRIVATE_DATA
*PrivateData
,
218 IN EFI_STRING_ID StringId
223 CHAR16
*TempPassword
;
225 DRIVER_SAMPLE_CONFIGURATION
*Configuration
;
229 // Get Buffer Storage data from EFI variable
231 BufferSize
= sizeof (DRIVER_SAMPLE_CONFIGURATION
);
232 Status
= gRT
->GetVariable (
237 &PrivateData
->Configuration
239 if (EFI_ERROR (Status
)) {
244 // Get user input password
246 Password
= &PrivateData
->Configuration
.WhatIsThePassword2
[0];
247 PasswordSize
= sizeof (PrivateData
->Configuration
.WhatIsThePassword2
);
248 ZeroMem (Password
, PasswordSize
);
250 TempPassword
= HiiGetString (PrivateData
->HiiHandle
[0], StringId
, NULL
);
251 if (TempPassword
== NULL
) {
252 return EFI_NOT_READY
;
254 if (StrSize (TempPassword
) > PasswordSize
) {
255 FreePool (TempPassword
);
256 return EFI_NOT_READY
;
258 StrnCpy (Password
, TempPassword
, StrLen (TempPassword
));
259 FreePool (TempPassword
);
262 // Retrive uncommitted data from Browser
264 Configuration
= AllocateZeroPool (sizeof (DRIVER_SAMPLE_CONFIGURATION
));
265 ASSERT (Configuration
!= NULL
);
266 if (HiiGetBrowserData (&mFormSetGuid
, VariableName
, sizeof (DRIVER_SAMPLE_CONFIGURATION
), (UINT8
*) Configuration
)) {
268 // Update password's clear text in the screen
270 CopyMem (Configuration
->PasswordClearText
, Password
, StrSize (Password
));
273 // Update uncommitted data of Browser
278 sizeof (DRIVER_SAMPLE_CONFIGURATION
),
279 (UINT8
*) Configuration
,
285 // Free Configuration Buffer
287 FreePool (Configuration
);
293 EncodePassword (Password
, StrLen (Password
) * 2);
294 Status
= gRT
->SetVariable(
297 EFI_VARIABLE_NON_VOLATILE
| EFI_VARIABLE_BOOTSERVICE_ACCESS
,
298 sizeof (DRIVER_SAMPLE_CONFIGURATION
),
299 &PrivateData
->Configuration
306 This function allows a caller to extract the current configuration for one
307 or more named elements from the target driver.
309 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
310 @param Request A null-terminated Unicode string in
311 <ConfigRequest> format.
312 @param Progress On return, points to a character in the Request
313 string. Points to the string's null terminator if
314 request was successful. Points to the most recent
315 '&' before the first failing name/value pair (or
316 the beginning of the string if the failure is in
317 the first name/value pair) if the request was not
319 @param Results A null-terminated Unicode string in
320 <ConfigAltResp> format which has all values filled
321 in for the names in the Request string. String to
322 be allocated by the called function.
324 @retval EFI_SUCCESS The Results is filled with the requested values.
325 @retval EFI_OUT_OF_RESOURCES Not enough memory to store the results.
326 @retval EFI_INVALID_PARAMETER Request is NULL, illegal syntax, or unknown name.
327 @retval EFI_NOT_FOUND Routing data doesn't match any storage in this
334 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL
*This
,
335 IN CONST EFI_STRING Request
,
336 OUT EFI_STRING
*Progress
,
337 OUT EFI_STRING
*Results
342 DRIVER_SAMPLE_PRIVATE_DATA
*PrivateData
;
343 EFI_HII_CONFIG_ROUTING_PROTOCOL
*HiiConfigRouting
;
344 EFI_STRING ConfigRequest
;
345 EFI_STRING ConfigRequestHdr
;
348 if (Progress
== NULL
|| Results
== NULL
|| Request
== NULL
) {
349 return EFI_INVALID_PARAMETER
;
352 // Initialize the local variables.
354 ConfigRequestHdr
= NULL
;
355 ConfigRequest
= NULL
;
359 PrivateData
= DRIVER_SAMPLE_PRIVATE_FROM_THIS (This
);
360 HiiConfigRouting
= PrivateData
->HiiConfigRouting
;
363 // Get Buffer Storage data from EFI variable.
364 // Try to get the current setting from variable.
366 BufferSize
= sizeof (DRIVER_SAMPLE_CONFIGURATION
);
367 Status
= gRT
->GetVariable (
372 &PrivateData
->Configuration
374 if (EFI_ERROR (Status
)) {
375 return EFI_NOT_FOUND
;
378 if (Request
== NULL
) {
380 // Request is set to NULL, construct full request string.
384 // Allocate and fill a buffer large enough to hold the <ConfigHdr> template
385 // followed by "&OFFSET=0&WIDTH=WWWWWWWWWWWWWWWW" followed by a Null-terminator
387 ConfigRequestHdr
= HiiConstructConfigHdr (&mFormSetGuid
, VariableName
, PrivateData
->DriverHandle
[0]);
388 Size
= (StrLen (ConfigRequest
) + 32 + 1) * sizeof (CHAR16
);
389 ConfigRequest
= AllocateZeroPool (Size
);
390 UnicodeSPrint (ConfigRequest
, Size
, L
"%s&OFFSET=0&WIDTH=%016LX", ConfigRequestHdr
, (UINT64
)BufferSize
);
391 FreePool (ConfigRequestHdr
);
394 // Check routing data in <ConfigHdr>.
395 // Note: if only one Storage is used, then this checking could be skipped.
397 if (!HiiIsConfigHdrMatch (Request
, &mFormSetGuid
, VariableName
)) {
398 return EFI_NOT_FOUND
;
400 ConfigRequest
= Request
;
404 // Convert buffer data to <ConfigResp> by helper function BlockToConfig()
406 Status
= HiiConfigRouting
->BlockToConfig (
409 (UINT8
*) &PrivateData
->Configuration
,
415 if (Request
== NULL
) {
416 FreePool (ConfigRequest
);
425 This function processes the results of changes in configuration.
427 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
428 @param Configuration A null-terminated Unicode string in <ConfigResp>
430 @param Progress A pointer to a string filled in with the offset of
431 the most recent '&' before the first failing
432 name/value pair (or the beginning of the string if
433 the failure is in the first name/value pair) or
434 the terminating NULL if all was successful.
436 @retval EFI_SUCCESS The Results is processed successfully.
437 @retval EFI_INVALID_PARAMETER Configuration is NULL.
438 @retval EFI_NOT_FOUND Routing data doesn't match any storage in this
445 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL
*This
,
446 IN CONST EFI_STRING Configuration
,
447 OUT EFI_STRING
*Progress
452 DRIVER_SAMPLE_PRIVATE_DATA
*PrivateData
;
453 EFI_HII_CONFIG_ROUTING_PROTOCOL
*HiiConfigRouting
;
455 if (Configuration
== NULL
|| Progress
== NULL
) {
456 return EFI_INVALID_PARAMETER
;
459 PrivateData
= DRIVER_SAMPLE_PRIVATE_FROM_THIS (This
);
460 HiiConfigRouting
= PrivateData
->HiiConfigRouting
;
461 *Progress
= Configuration
;
464 // Check routing data in <ConfigHdr>.
465 // Note: if only one Storage is used, then this checking could be skipped.
467 if (!HiiIsConfigHdrMatch (Configuration
, &mFormSetGuid
, VariableName
)) {
468 return EFI_NOT_FOUND
;
472 // Get Buffer Storage data from EFI variable
474 BufferSize
= sizeof (DRIVER_SAMPLE_CONFIGURATION
);
475 Status
= gRT
->GetVariable (
480 &PrivateData
->Configuration
482 if (EFI_ERROR (Status
)) {
487 // Convert <ConfigResp> to buffer data by helper function ConfigToBlock()
489 BufferSize
= sizeof (DRIVER_SAMPLE_CONFIGURATION
);
490 Status
= HiiConfigRouting
->ConfigToBlock (
493 (UINT8
*) &PrivateData
->Configuration
,
497 if (EFI_ERROR (Status
)) {
502 // Store Buffer Storage back to EFI variable
504 Status
= gRT
->SetVariable(
507 EFI_VARIABLE_NON_VOLATILE
| EFI_VARIABLE_BOOTSERVICE_ACCESS
,
508 sizeof (DRIVER_SAMPLE_CONFIGURATION
),
509 &PrivateData
->Configuration
517 This function processes the results of changes in configuration.
519 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
520 @param Action Specifies the type of action taken by the browser.
521 @param QuestionId A unique value which is sent to the original
522 exporting driver so that it can identify the type
524 @param Type The type of value for the question.
525 @param Value A pointer to the data being sent to the original
527 @param ActionRequest On return, points to the action requested by the
530 @retval EFI_SUCCESS The callback successfully handled the action.
531 @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold the
532 variable and its data.
533 @retval EFI_DEVICE_ERROR The variable could not be saved.
534 @retval EFI_UNSUPPORTED The specified Action is not supported by the
541 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL
*This
,
542 IN EFI_BROWSER_ACTION Action
,
543 IN EFI_QUESTION_ID QuestionId
,
545 IN EFI_IFR_TYPE_VALUE
*Value
,
546 OUT EFI_BROWSER_ACTION_REQUEST
*ActionRequest
549 DRIVER_SAMPLE_PRIVATE_DATA
*PrivateData
;
552 VOID
*StartOpCodeHandle
;
553 VOID
*OptionsOpCodeHandle
;
554 EFI_IFR_GUID_LABEL
*StartLabel
;
555 VOID
*EndOpCodeHandle
;
556 EFI_IFR_GUID_LABEL
*EndLabel
;
558 DRIVER_SAMPLE_CONFIGURATION
*Configuration
;
561 if (Action
== EFI_BROWSER_ACTION_FORM_OPEN
) {
563 // On FORM_OPEN event, update the form on-the-fly
565 PrivateData
= DRIVER_SAMPLE_PRIVATE_FROM_THIS (This
);
568 // Initialize the container for dynamic opcodes
570 StartOpCodeHandle
= HiiAllocateOpCodeHandle ();
571 ASSERT (StartOpCodeHandle
!= NULL
);
574 // Create Hii Extend Label OpCode as the start opcode
576 StartLabel
= (EFI_IFR_GUID_LABEL
*) HiiCreateGuidOpCode (StartOpCodeHandle
, &gEfiIfrTianoGuid
, NULL
, sizeof (EFI_IFR_GUID_LABEL
));
577 StartLabel
->ExtendOpCode
= EFI_IFR_EXTEND_OP_LABEL
;
578 StartLabel
->Number
= LABEL_UPDATE2
;
580 HiiCreateActionOpCode (
581 StartOpCodeHandle
, // Container for dynamic created opcodes
582 0x1238, // Question ID
583 STRING_TOKEN(STR_SAVE_TEXT
), // Prompt text
584 STRING_TOKEN(STR_SAVE_TEXT
), // Help text
585 EFI_IFR_FLAG_CALLBACK
, // Question flag
586 0 // Action String ID
590 PrivateData
->HiiHandle
[0], // HII handle
591 &mFormSetGuid
, // Formset GUID
593 StartOpCodeHandle
, // Label for where to insert opcodes
597 HiiFreeOpCodeHandle (StartOpCodeHandle
);
601 if (Action
== EFI_BROWSER_ACTION_FORM_CLOSE
) {
603 // On FORM_CLOSE event, show up a pop-up
607 EFI_LIGHTGRAY
| EFI_BACKGROUND_BLUE
,
610 L
"You are going to leave the Form!",
611 L
"Press ESC or ENTER to continue ...",
615 } while ((Key
.ScanCode
!= SCAN_ESC
) && (Key
.UnicodeChar
!= CHAR_CARRIAGE_RETURN
));
620 if ((Value
== NULL
) || (ActionRequest
== NULL
)) {
621 return EFI_INVALID_PARAMETER
;
624 if ((Type
== EFI_IFR_TYPE_STRING
) && (Value
->string
== 0)) {
625 return EFI_INVALID_PARAMETER
;
628 Status
= EFI_SUCCESS
;
629 PrivateData
= DRIVER_SAMPLE_PRIVATE_FROM_THIS (This
);
631 switch (QuestionId
) {
634 // Initialize the container for dynamic opcodes
636 StartOpCodeHandle
= HiiAllocateOpCodeHandle ();
637 ASSERT (StartOpCodeHandle
!= NULL
);
639 EndOpCodeHandle
= HiiAllocateOpCodeHandle ();
640 ASSERT (EndOpCodeHandle
!= NULL
);
643 // Create Hii Extend Label OpCode as the start opcode
645 StartLabel
= (EFI_IFR_GUID_LABEL
*) HiiCreateGuidOpCode (StartOpCodeHandle
, &gEfiIfrTianoGuid
, NULL
, sizeof (EFI_IFR_GUID_LABEL
));
646 StartLabel
->ExtendOpCode
= EFI_IFR_EXTEND_OP_LABEL
;
647 StartLabel
->Number
= LABEL_UPDATE1
;
650 // Create Hii Extend Label OpCode as the end opcode
652 EndLabel
= (EFI_IFR_GUID_LABEL
*) HiiCreateGuidOpCode (EndOpCodeHandle
, &gEfiIfrTianoGuid
, NULL
, sizeof (EFI_IFR_GUID_LABEL
));
653 EndLabel
->ExtendOpCode
= EFI_IFR_EXTEND_OP_LABEL
;
654 EndLabel
->Number
= LABEL_END
;
656 HiiCreateActionOpCode (
657 StartOpCodeHandle
, // Container for dynamic created opcodes
658 0x1237, // Question ID
659 STRING_TOKEN(STR_EXIT_TEXT
), // Prompt text
660 STRING_TOKEN(STR_EXIT_TEXT
), // Help text
661 EFI_IFR_FLAG_CALLBACK
, // Question flag
662 0 // Action String ID
666 // Create Option OpCode
668 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
669 ASSERT (OptionsOpCodeHandle
!= NULL
);
671 HiiCreateOneOfOptionOpCode (
673 STRING_TOKEN (STR_BOOT_OPTION1
),
675 EFI_IFR_NUMERIC_SIZE_1
,
679 HiiCreateOneOfOptionOpCode (
681 STRING_TOKEN (STR_BOOT_OPTION2
),
683 EFI_IFR_NUMERIC_SIZE_1
,
688 // Prepare initial value for the dynamic created oneof Question
690 PrivateData
->Configuration
.DynamicOneof
= 2;
691 Status
= gRT
->SetVariable(
694 EFI_VARIABLE_NON_VOLATILE
| EFI_VARIABLE_BOOTSERVICE_ACCESS
,
695 sizeof (DRIVER_SAMPLE_CONFIGURATION
),
696 &PrivateData
->Configuration
700 // Set initial vlaue of dynamic created oneof Question in Form Browser
702 Configuration
= AllocateZeroPool (sizeof (DRIVER_SAMPLE_CONFIGURATION
));
703 ASSERT (Configuration
!= NULL
);
704 if (HiiGetBrowserData (&mFormSetGuid
, VariableName
, sizeof (DRIVER_SAMPLE_CONFIGURATION
), (UINT8
*) Configuration
)) {
705 Configuration
->DynamicOneof
= 2;
708 // Update uncommitted data of Browser
713 sizeof (DRIVER_SAMPLE_CONFIGURATION
),
714 (UINT8
*) Configuration
,
718 FreePool (Configuration
);
720 HiiCreateOneOfOpCode (
721 StartOpCodeHandle
, // Container for dynamic created opcodes
722 0x8001, // Question ID (or call it "key")
723 CONFIGURATION_VARSTORE_ID
, // VarStore ID
724 (UINT16
) DYNAMIC_ONE_OF_VAR_OFFSET
, // Offset in Buffer Storage
725 STRING_TOKEN (STR_ONE_OF_PROMPT
), // Question prompt text
726 STRING_TOKEN (STR_ONE_OF_HELP
), // Question help text
727 EFI_IFR_FLAG_CALLBACK
, // Question flag
728 EFI_IFR_NUMERIC_SIZE_1
, // Data type of Question Value
729 OptionsOpCodeHandle
, // Option Opcode list
730 NULL
// Default Opcode is NULl
733 HiiCreateOrderedListOpCode (
734 StartOpCodeHandle
, // Container for dynamic created opcodes
735 0x8002, // Question ID
736 CONFIGURATION_VARSTORE_ID
, // VarStore ID
737 (UINT16
) DYNAMIC_ORDERED_LIST_VAR_OFFSET
, // Offset in Buffer Storage
738 STRING_TOKEN (STR_BOOT_OPTIONS
), // Question prompt text
739 STRING_TOKEN (STR_BOOT_OPTIONS
), // Question help text
740 EFI_IFR_FLAG_RESET_REQUIRED
, // Question flag
741 0, // Ordered list flag, e.g. EFI_IFR_UNIQUE_SET
742 EFI_IFR_NUMERIC_SIZE_1
, // Data type of Question value
743 5, // Maximum container
744 OptionsOpCodeHandle
, // Option Opcode list
745 NULL
// Default Opcode is NULl
748 HiiCreateGotoOpCode (
749 StartOpCodeHandle
, // Container for dynamic created opcodes
751 STRING_TOKEN (STR_GOTO_FORM1
), // Prompt text
752 STRING_TOKEN (STR_GOTO_HELP
), // Help text
754 0x8003 // Question ID
758 PrivateData
->HiiHandle
[0], // HII handle
759 &mFormSetGuid
, // Formset GUID
761 StartOpCodeHandle
, // Label for where to insert opcodes
762 EndOpCodeHandle
// Replace data
765 HiiFreeOpCodeHandle (StartOpCodeHandle
);
766 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
767 HiiFreeOpCodeHandle (EndOpCodeHandle
);
772 // We will reach here once the Question is refreshed
776 // Initialize the container for dynamic opcodes
778 StartOpCodeHandle
= HiiAllocateOpCodeHandle ();
779 ASSERT (StartOpCodeHandle
!= NULL
);
782 // Create Hii Extend Label OpCode as the start opcode
784 StartLabel
= (EFI_IFR_GUID_LABEL
*) HiiCreateGuidOpCode (StartOpCodeHandle
, &gEfiIfrTianoGuid
, NULL
, sizeof (EFI_IFR_GUID_LABEL
));
785 StartLabel
->ExtendOpCode
= EFI_IFR_EXTEND_OP_LABEL
;
786 StartLabel
->Number
= LABEL_UPDATE2
;
788 HiiCreateActionOpCode (
789 StartOpCodeHandle
, // Container for dynamic created opcodes
790 0x1237, // Question ID
791 STRING_TOKEN(STR_EXIT_TEXT
), // Prompt text
792 STRING_TOKEN(STR_EXIT_TEXT
), // Help text
793 EFI_IFR_FLAG_CALLBACK
, // Question flag
794 0 // Action String ID
798 PrivateData
->HiiHandle
[0], // HII handle
799 &mFormSetGuid
, // Formset GUID
801 StartOpCodeHandle
, // Label for where to insert opcodes
805 HiiFreeOpCodeHandle (StartOpCodeHandle
);
808 // Refresh the Question value
810 PrivateData
->Configuration
.DynamicRefresh
++;
811 Status
= gRT
->SetVariable(
814 EFI_VARIABLE_NON_VOLATILE
| EFI_VARIABLE_BOOTSERVICE_ACCESS
,
815 sizeof (DRIVER_SAMPLE_CONFIGURATION
),
816 &PrivateData
->Configuration
820 // Change an EFI Variable storage (MyEfiVar) asynchronous, this will cause
821 // the first statement in Form 3 be suppressed
825 Status
= gRT
->SetVariable(
828 EFI_VARIABLE_NON_VOLATILE
| EFI_VARIABLE_BOOTSERVICE_ACCESS
,
836 // User press "Exit now", request Browser to exit
838 *ActionRequest
= EFI_BROWSER_ACTION_REQUEST_EXIT
;
843 // User press "Save now", request Browser to save the uncommitted data.
845 *ActionRequest
= EFI_BROWSER_ACTION_REQUEST_SUBMIT
;
850 // When try to set a new password, user will be chanlleged with old password.
851 // The Callback is responsible for validating old password input by user,
852 // If Callback return EFI_SUCCESS, it indicates validation pass.
854 switch (PrivateData
->PasswordState
) {
855 case BROWSER_STATE_VALIDATE_PASSWORD
:
856 Status
= ValidatePassword (PrivateData
, Value
->string
);
857 if (Status
== EFI_SUCCESS
) {
858 PrivateData
->PasswordState
= BROWSER_STATE_SET_PASSWORD
;
862 case BROWSER_STATE_SET_PASSWORD
:
863 Status
= SetPassword (PrivateData
, Value
->string
);
864 PrivateData
->PasswordState
= BROWSER_STATE_VALIDATE_PASSWORD
;
875 // EfiVarstore question takes sample action (print value as debug information)
876 // after read/write question.
879 Status
= gRT
->GetVariable(
886 ASSERT_EFI_ERROR (Status
);
887 DEBUG ((DEBUG_INFO
, "EfiVarstore question: Tall value is %d with value width %d\n", MyVar
, MyVarSize
));
896 Main entry for this driver.
898 @param ImageHandle Image handle this driver.
899 @param SystemTable Pointer to SystemTable.
901 @retval EFI_SUCESS This function always complete successfully.
907 IN EFI_HANDLE ImageHandle
,
908 IN EFI_SYSTEM_TABLE
*SystemTable
912 EFI_HII_HANDLE HiiHandle
[2];
913 EFI_SCREEN_DESCRIPTOR Screen
;
914 EFI_HII_DATABASE_PROTOCOL
*HiiDatabase
;
915 EFI_HII_STRING_PROTOCOL
*HiiString
;
916 EFI_FORM_BROWSER2_PROTOCOL
*FormBrowser2
;
917 EFI_HII_CONFIG_ROUTING_PROTOCOL
*HiiConfigRouting
;
920 DRIVER_SAMPLE_CONFIGURATION
*Configuration
;
922 EFI_STRING ConfigRequestHdr
;
925 // Initialize the local variables.
927 ConfigRequestHdr
= NULL
;
929 // Initialize screen dimensions for SendForm().
930 // Remove 3 characters from top and bottom
932 ZeroMem (&Screen
, sizeof (EFI_SCREEN_DESCRIPTOR
));
933 gST
->ConOut
->QueryMode (gST
->ConOut
, gST
->ConOut
->Mode
->Mode
, &Screen
.RightColumn
, &Screen
.BottomRow
);
936 Screen
.BottomRow
= Screen
.BottomRow
- 3;
939 // Initialize driver private data
941 PrivateData
= AllocateZeroPool (sizeof (DRIVER_SAMPLE_PRIVATE_DATA
));
942 if (PrivateData
== NULL
) {
943 return EFI_OUT_OF_RESOURCES
;
946 PrivateData
->Signature
= DRIVER_SAMPLE_PRIVATE_SIGNATURE
;
948 PrivateData
->ConfigAccess
.ExtractConfig
= ExtractConfig
;
949 PrivateData
->ConfigAccess
.RouteConfig
= RouteConfig
;
950 PrivateData
->ConfigAccess
.Callback
= DriverCallback
;
951 PrivateData
->PasswordState
= BROWSER_STATE_VALIDATE_PASSWORD
;
954 // Locate Hii Database protocol
956 Status
= gBS
->LocateProtocol (&gEfiHiiDatabaseProtocolGuid
, NULL
, (VOID
**) &HiiDatabase
);
957 if (EFI_ERROR (Status
)) {
960 PrivateData
->HiiDatabase
= HiiDatabase
;
963 // Locate HiiString protocol
965 Status
= gBS
->LocateProtocol (&gEfiHiiStringProtocolGuid
, NULL
, (VOID
**) &HiiString
);
966 if (EFI_ERROR (Status
)) {
969 PrivateData
->HiiString
= HiiString
;
972 // Locate Formbrowser2 protocol
974 Status
= gBS
->LocateProtocol (&gEfiFormBrowser2ProtocolGuid
, NULL
, (VOID
**) &FormBrowser2
);
975 if (EFI_ERROR (Status
)) {
978 PrivateData
->FormBrowser2
= FormBrowser2
;
981 // Locate ConfigRouting protocol
983 Status
= gBS
->LocateProtocol (&gEfiHiiConfigRoutingProtocolGuid
, NULL
, (VOID
**) &HiiConfigRouting
);
984 if (EFI_ERROR (Status
)) {
987 PrivateData
->HiiConfigRouting
= HiiConfigRouting
;
989 Status
= gBS
->InstallMultipleProtocolInterfaces (
991 &gEfiDevicePathProtocolGuid
,
992 &mHiiVendorDevicePath0
,
993 &gEfiHiiConfigAccessProtocolGuid
,
994 &PrivateData
->ConfigAccess
,
997 ASSERT_EFI_ERROR (Status
);
999 PrivateData
->DriverHandle
[0] = DriverHandle
[0];
1002 // Publish our HII data
1004 HiiHandle
[0] = HiiAddPackages (
1007 DriverSampleStrings
,
1011 if (HiiHandle
[0] == NULL
) {
1012 return EFI_OUT_OF_RESOURCES
;
1015 PrivateData
->HiiHandle
[0] = HiiHandle
[0];
1018 // Publish another Fromset
1020 Status
= gBS
->InstallMultipleProtocolInterfaces (
1022 &gEfiDevicePathProtocolGuid
,
1023 &mHiiVendorDevicePath1
,
1026 ASSERT_EFI_ERROR (Status
);
1028 PrivateData
->DriverHandle
[1] = DriverHandle
[1];
1030 HiiHandle
[1] = HiiAddPackages (
1033 DriverSampleStrings
,
1037 if (HiiHandle
[1] == NULL
) {
1038 return EFI_OUT_OF_RESOURCES
;
1041 PrivateData
->HiiHandle
[1] = HiiHandle
[1];
1044 // Very simple example of how one would update a string that is already
1045 // in the HII database
1047 NewString
= L
"700 Mhz";
1049 if (HiiSetString (HiiHandle
[0], STRING_TOKEN (STR_CPU_STRING2
), NewString
, NULL
) == 0) {
1050 return EFI_OUT_OF_RESOURCES
;
1054 // Initialize configuration data
1056 Configuration
= &PrivateData
->Configuration
;
1057 ZeroMem (Configuration
, sizeof (DRIVER_SAMPLE_CONFIGURATION
));
1060 // Try to read NV config EFI variable first
1062 ConfigRequestHdr
= HiiConstructConfigHdr (&mFormSetGuid
, VariableName
, DriverHandle
[0]);
1063 ASSERT (ConfigRequestHdr
!= NULL
);
1065 BufferSize
= sizeof (DRIVER_SAMPLE_CONFIGURATION
);
1066 Status
= gRT
->GetVariable (VariableName
, &mFormSetGuid
, NULL
, &BufferSize
, Configuration
);
1067 if (EFI_ERROR (Status
)) {
1069 // Store zero data Buffer Storage to EFI variable
1071 Status
= gRT
->SetVariable(
1074 EFI_VARIABLE_NON_VOLATILE
| EFI_VARIABLE_BOOTSERVICE_ACCESS
,
1075 sizeof (DRIVER_SAMPLE_CONFIGURATION
),
1078 ASSERT (Status
== EFI_SUCCESS
);
1080 // EFI variable for NV config doesn't exit, we should build this variable
1081 // based on default values stored in IFR
1083 ActionFlag
= HiiSetToDefaults (ConfigRequestHdr
, EFI_HII_DEFAULT_CLASS_STANDARD
);
1084 ASSERT (ActionFlag
);
1087 // EFI variable does exist and Validate Current Setting
1089 ActionFlag
= HiiValidateSettings (ConfigRequestHdr
);
1090 ASSERT (ActionFlag
);
1093 FreePool (ConfigRequestHdr
);
1097 // In default, this driver is built into Flash device image,
1098 // the following code doesn't run.
1102 // Example of how to display only the item we sent to HII
1103 // When this driver is not built into Flash device image,
1104 // it need to call SendForm to show front page by itself.
1106 if (DISPLAY_ONLY_MY_ITEM
<= 1) {
1108 // Have the browser pull out our copy of the data, and only display our data
1110 Status
= FormBrowser2
->SendForm (
1112 &(HiiHandle
[DISPLAY_ONLY_MY_ITEM
]),
1120 HiiRemovePackages (HiiHandle
[0]);
1122 HiiRemovePackages (HiiHandle
[1]);
1129 Unloads the application and its installed protocol.
1131 @param[in] ImageHandle Handle that identifies the image to be unloaded.
1133 @retval EFI_SUCCESS The image has been unloaded.
1137 DriverSampleUnload (
1138 IN EFI_HANDLE ImageHandle
1141 if (DriverHandle
[0] != NULL
) {
1142 gBS
->UninstallMultipleProtocolInterfaces (
1144 &gEfiDevicePathProtocolGuid
,
1145 &mHiiVendorDevicePath0
,
1146 &gEfiHiiConfigAccessProtocolGuid
,
1147 &PrivateData
->ConfigAccess
,
1150 DriverHandle
[0] = NULL
;
1153 if (DriverHandle
[1] != NULL
) {
1154 gBS
->UninstallMultipleProtocolInterfaces (
1156 &gEfiDevicePathProtocolGuid
,
1157 &mHiiVendorDevicePath1
,
1160 DriverHandle
[1] = NULL
;
1163 if (PrivateData
->HiiHandle
[0] != NULL
) {
1164 HiiRemovePackages (PrivateData
->HiiHandle
[0]);
1167 if (PrivateData
->HiiHandle
[1] != NULL
) {
1168 HiiRemovePackages (PrivateData
->HiiHandle
[1]);
1171 if (PrivateData
!= NULL
) {
1172 FreePool (PrivateData
);