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 - 2008, 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";
26 // <ConfigHdr> Template
28 CONST CHAR16 mDriverSampleConfigHdr
[] = L
"GUID=00000000000000000000000000000000&NAME=0000&PATH=00";
30 EFI_HANDLE DriverHandle
[2] = {NULL
, NULL
};
31 DRIVER_SAMPLE_PRIVATE_DATA
*PrivateData
= NULL
;
33 HII_VENDOR_DEVICE_PATH mHiiVendorDevicePath0
= {
39 (UINT8
) (sizeof (VENDOR_DEVICE_PATH
)),
40 (UINT8
) ((sizeof (VENDOR_DEVICE_PATH
)) >> 8)
44 // {C153B68D-EBFC-488e-B110-662867745B87}
46 { 0xc153b68d, 0xebfc, 0x488e, { 0xb1, 0x10, 0x66, 0x28, 0x67, 0x74, 0x5b, 0x87 } }
50 END_ENTIRE_DEVICE_PATH_SUBTYPE
,
52 (UINT8
) (END_DEVICE_PATH_LENGTH
),
53 (UINT8
) ((END_DEVICE_PATH_LENGTH
) >> 8)
58 HII_VENDOR_DEVICE_PATH mHiiVendorDevicePath1
= {
64 (UINT8
) (sizeof (VENDOR_DEVICE_PATH
)),
65 (UINT8
) ((sizeof (VENDOR_DEVICE_PATH
)) >> 8)
69 // {06F37F07-0C48-40e9-8436-0A08A0BB76B0}
71 { 0x6f37f07, 0xc48, 0x40e9, { 0x84, 0x36, 0xa, 0x8, 0xa0, 0xbb, 0x76, 0xb0 } }
75 END_ENTIRE_DEVICE_PATH_SUBTYPE
,
77 (UINT8
) (END_DEVICE_PATH_LENGTH
),
78 (UINT8
) ((END_DEVICE_PATH_LENGTH
) >> 8)
84 Encode the password using a simple algorithm.
86 @param Password The string to be encoded.
87 @param MaxSize The size of the string.
101 Key
= L
"MAR10648567";
102 Buffer
= AllocateZeroPool (MaxSize
);
103 ASSERT (Buffer
!= NULL
);
105 for (Index
= 0; Key
[Index
] != 0; Index
++) {
106 for (Loop
= 0; Loop
< (UINT8
) (MaxSize
/ 2); Loop
++) {
107 Buffer
[Loop
] = (CHAR16
) (Password
[Loop
] ^ Key
[Index
]);
111 CopyMem (Password
, Buffer
, MaxSize
);
118 Validate the user's password.
120 @param PrivateData This driver's private context data.
121 @param StringId The user's input.
123 @retval EFI_SUCCESS The user's input matches the password.
124 @retval EFI_NOT_READY The user's input does not match the password.
128 IN DRIVER_SAMPLE_PRIVATE_DATA
*PrivateData
,
129 IN EFI_STRING_ID StringId
135 UINTN PasswordMaxSize
;
137 CHAR16
*EncodedPassword
;
141 // Get encoded password first
143 BufferSize
= sizeof (DRIVER_SAMPLE_CONFIGURATION
);
144 Status
= gRT
->GetVariable (
149 &PrivateData
->Configuration
151 if (EFI_ERROR (Status
)) {
153 // Old password not exist, prompt for new password
159 PasswordMaxSize
= sizeof (PrivateData
->Configuration
.WhatIsThePassword2
);
161 // Check whether we have any old password set
163 for (Index
= 0; Index
< PasswordMaxSize
/ sizeof (UINT16
); Index
++) {
164 if (PrivateData
->Configuration
.WhatIsThePassword2
[Index
] != 0) {
171 // Old password not exist, return EFI_SUCCESS to prompt for new password
177 // Get user input password
179 Password
= HiiGetString (PrivateData
->HiiHandle
[0], StringId
, NULL
);
180 if (Password
== NULL
) {
181 return EFI_NOT_READY
;
183 if (StrSize (Password
) > PasswordMaxSize
) {
185 return EFI_NOT_READY
;
189 // Validate old password
191 EncodedPassword
= AllocateZeroPool (PasswordMaxSize
);
192 ASSERT (EncodedPassword
!= NULL
);
193 StrnCpy (EncodedPassword
, Password
, StrLen (Password
));
194 EncodePassword (EncodedPassword
, StrLen (EncodedPassword
) * sizeof (CHAR16
));
195 if (CompareMem (EncodedPassword
, PrivateData
->Configuration
.WhatIsThePassword2
, StrLen (EncodedPassword
) * sizeof (CHAR16
)) != 0) {
197 // Old password mismatch, return EFI_NOT_READY to prompt for error message
199 Status
= EFI_NOT_READY
;
201 Status
= EFI_SUCCESS
;
205 FreePool (EncodedPassword
);
211 Encode the password using a simple algorithm.
213 @param PrivateData This driver's private context data.
214 @param StringId The password from User.
216 @retval EFI_SUCESS The operation is successful.
217 @return Other value if gRT->SetVariable () fails.
222 IN DRIVER_SAMPLE_PRIVATE_DATA
*PrivateData
,
223 IN EFI_STRING_ID StringId
228 CHAR16
*TempPassword
;
230 DRIVER_SAMPLE_CONFIGURATION
*Configuration
;
234 // Get Buffer Storage data from EFI variable
236 BufferSize
= sizeof (DRIVER_SAMPLE_CONFIGURATION
);
237 Status
= gRT
->GetVariable (
242 &PrivateData
->Configuration
244 if (EFI_ERROR (Status
)) {
249 // Get user input password
251 Password
= &PrivateData
->Configuration
.WhatIsThePassword2
[0];
252 PasswordSize
= sizeof (PrivateData
->Configuration
.WhatIsThePassword2
);
253 ZeroMem (Password
, PasswordSize
);
255 TempPassword
= HiiGetString (PrivateData
->HiiHandle
[0], StringId
, NULL
);
256 if (TempPassword
== NULL
) {
257 return EFI_NOT_READY
;
259 if (StrSize (TempPassword
) > PasswordSize
) {
260 FreePool (TempPassword
);
261 return EFI_NOT_READY
;
263 StrnCpy (Password
, TempPassword
, StrLen (TempPassword
));
264 FreePool (TempPassword
);
267 // Retrive uncommitted data from Browser
269 Configuration
= AllocateZeroPool (sizeof (DRIVER_SAMPLE_CONFIGURATION
));
270 ASSERT (Configuration
!= NULL
);
271 if (HiiGetBrowserData (&mFormSetGuid
, VariableName
, sizeof (DRIVER_SAMPLE_CONFIGURATION
), (UINT8
*) Configuration
)) {
273 // Update password's clear text in the screen
275 CopyMem (Configuration
->PasswordClearText
, Password
, StrSize (Password
));
278 // Update uncommitted data of Browser
283 sizeof (DRIVER_SAMPLE_CONFIGURATION
),
284 (UINT8
*) Configuration
,
290 // Free Configuration Buffer
292 FreePool (Configuration
);
298 EncodePassword (Password
, StrLen (Password
) * 2);
299 Status
= gRT
->SetVariable(
302 EFI_VARIABLE_NON_VOLATILE
| EFI_VARIABLE_BOOTSERVICE_ACCESS
,
303 sizeof (DRIVER_SAMPLE_CONFIGURATION
),
304 &PrivateData
->Configuration
311 This function allows a caller to extract the current configuration for one
312 or more named elements from the target driver.
314 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
315 @param Request A null-terminated Unicode string in
316 <ConfigRequest> format.
317 @param Progress On return, points to a character in the Request
318 string. Points to the string's null terminator if
319 request was successful. Points to the most recent
320 '&' before the first failing name/value pair (or
321 the beginning of the string if the failure is in
322 the first name/value pair) if the request was not
324 @param Results A null-terminated Unicode string in
325 <ConfigAltResp> format which has all values filled
326 in for the names in the Request string. String to
327 be allocated by the called function.
329 @retval EFI_SUCCESS The Results is filled with the requested values.
330 @retval EFI_OUT_OF_RESOURCES Not enough memory to store the results.
331 @retval EFI_INVALID_PARAMETER Request is NULL, illegal syntax, or unknown name.
332 @retval EFI_NOT_FOUND Routing data doesn't match any storage in this
339 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL
*This
,
340 IN CONST EFI_STRING Request
,
341 OUT EFI_STRING
*Progress
,
342 OUT EFI_STRING
*Results
347 DRIVER_SAMPLE_PRIVATE_DATA
*PrivateData
;
348 EFI_HII_CONFIG_ROUTING_PROTOCOL
*HiiConfigRouting
;
349 EFI_STRING ConfigRequest
;
352 if (Progress
== NULL
|| Results
== NULL
) {
353 return EFI_INVALID_PARAMETER
;
356 // Initialize the local variables.
358 ConfigRequest
= NULL
;
362 PrivateData
= DRIVER_SAMPLE_PRIVATE_FROM_THIS (This
);
363 HiiConfigRouting
= PrivateData
->HiiConfigRouting
;
366 // Get Buffer Storage data from EFI variable.
367 // Try to get the current setting from variable.
369 BufferSize
= sizeof (DRIVER_SAMPLE_CONFIGURATION
);
370 Status
= gRT
->GetVariable (
375 &PrivateData
->Configuration
377 if (EFI_ERROR (Status
)) {
378 return EFI_NOT_FOUND
;
381 if (Request
== NULL
) {
383 // Request is set to NULL, construct full request string.
387 // Allocate and fill a buffer large enough to hold the <ConfigHdr> template
388 // followed by "&OFFSET=0&WIDTH=WWWWWWWWWWWWWWWW" followed by a Null-terminator
390 Size
= (StrLen (mDriverSampleConfigHdr
) + 32 + 1) * sizeof (CHAR16
);
391 ConfigRequest
= AllocateZeroPool (Size
);
392 UnicodeSPrint (ConfigRequest
, Size
, L
"%s&OFFSET=0&WIDTH=%016LX", mDriverSampleConfigHdr
, (UINT64
)BufferSize
);
395 // Check routing data in <ConfigHdr>.
396 // Note: if only one Storage is used, then this checking could be skipped.
398 if (!HiiIsConfigHdrMatch (Request
, &mFormSetGuid
, VariableName
)) {
399 return EFI_NOT_FOUND
;
401 ConfigRequest
= Request
;
405 // Convert buffer data to <ConfigResp> by helper function BlockToConfig()
407 Status
= HiiConfigRouting
->BlockToConfig (
410 (UINT8
*) &PrivateData
->Configuration
,
416 if (Request
== NULL
) {
417 FreePool (ConfigRequest
);
426 This function processes the results of changes in configuration.
428 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
429 @param Configuration A null-terminated Unicode string in <ConfigResp>
431 @param Progress A pointer to a string filled in with the offset of
432 the most recent '&' before the first failing
433 name/value pair (or the beginning of the string if
434 the failure is in the first name/value pair) or
435 the terminating NULL if all was successful.
437 @retval EFI_SUCCESS The Results is processed successfully.
438 @retval EFI_INVALID_PARAMETER Configuration is NULL.
439 @retval EFI_NOT_FOUND Routing data doesn't match any storage in this
446 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL
*This
,
447 IN CONST EFI_STRING Configuration
,
448 OUT EFI_STRING
*Progress
453 DRIVER_SAMPLE_PRIVATE_DATA
*PrivateData
;
454 EFI_HII_CONFIG_ROUTING_PROTOCOL
*HiiConfigRouting
;
456 if (Configuration
== NULL
) {
457 return EFI_INVALID_PARAMETER
;
460 PrivateData
= DRIVER_SAMPLE_PRIVATE_FROM_THIS (This
);
461 HiiConfigRouting
= PrivateData
->HiiConfigRouting
;
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 *Progress
= Configuration
;
469 return EFI_NOT_FOUND
;
473 // Get Buffer Storage data from EFI variable
475 BufferSize
= sizeof (DRIVER_SAMPLE_CONFIGURATION
);
476 Status
= gRT
->GetVariable (
481 &PrivateData
->Configuration
483 if (EFI_ERROR (Status
)) {
488 // Convert <ConfigResp> to buffer data by helper function ConfigToBlock()
490 BufferSize
= sizeof (DRIVER_SAMPLE_CONFIGURATION
);
491 Status
= HiiConfigRouting
->ConfigToBlock (
494 (UINT8
*) &PrivateData
->Configuration
,
498 if (EFI_ERROR (Status
)) {
503 // Store Buffer Storage back to EFI variable
505 Status
= gRT
->SetVariable(
508 EFI_VARIABLE_NON_VOLATILE
| EFI_VARIABLE_BOOTSERVICE_ACCESS
,
509 sizeof (DRIVER_SAMPLE_CONFIGURATION
),
510 &PrivateData
->Configuration
518 This function processes the results of changes in configuration.
520 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
521 @param Action Specifies the type of action taken by the browser.
522 @param QuestionId A unique value which is sent to the original
523 exporting driver so that it can identify the type
525 @param Type The type of value for the question.
526 @param Value A pointer to the data being sent to the original
528 @param ActionRequest On return, points to the action requested by the
531 @retval EFI_SUCCESS The callback successfully handled the action.
532 @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold the
533 variable and its data.
534 @retval EFI_DEVICE_ERROR The variable could not be saved.
535 @retval EFI_UNSUPPORTED The specified Action is not supported by the
542 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL
*This
,
543 IN EFI_BROWSER_ACTION Action
,
544 IN EFI_QUESTION_ID QuestionId
,
546 IN EFI_IFR_TYPE_VALUE
*Value
,
547 OUT EFI_BROWSER_ACTION_REQUEST
*ActionRequest
550 DRIVER_SAMPLE_PRIVATE_DATA
*PrivateData
;
553 VOID
*StartOpCodeHandle
;
554 VOID
*OptionsOpCodeHandle
;
555 EFI_IFR_GUID_LABEL
*StartLabel
;
556 VOID
*EndOpCodeHandle
;
557 EFI_IFR_GUID_LABEL
*EndLabel
;
559 if ((Value
== NULL
) || (ActionRequest
== NULL
)) {
560 return EFI_INVALID_PARAMETER
;
563 if ((Type
== EFI_IFR_TYPE_STRING
) && (Value
->string
== 0)) {
564 return EFI_INVALID_PARAMETER
;
568 Status
= EFI_SUCCESS
;
569 PrivateData
= DRIVER_SAMPLE_PRIVATE_FROM_THIS (This
);
571 switch (QuestionId
) {
574 // Initialize the container for dynamic opcodes
576 StartOpCodeHandle
= HiiAllocateOpCodeHandle ();
577 ASSERT (StartOpCodeHandle
!= NULL
);
579 EndOpCodeHandle
= HiiAllocateOpCodeHandle ();
580 ASSERT (EndOpCodeHandle
!= NULL
);
583 // Create Hii Extend Label OpCode as the start opcode
585 StartLabel
= (EFI_IFR_GUID_LABEL
*) HiiCreateGuidOpCode (StartOpCodeHandle
, &gEfiIfrTianoGuid
, NULL
, sizeof (EFI_IFR_GUID_LABEL
));
586 StartLabel
->ExtendOpCode
= EFI_IFR_EXTEND_OP_LABEL
;
587 StartLabel
->Number
= LABEL_UPDATE1
;
590 // Create Hii Extend Label OpCode as the end opcode
592 EndLabel
= (EFI_IFR_GUID_LABEL
*) HiiCreateGuidOpCode (EndOpCodeHandle
, &gEfiIfrTianoGuid
, NULL
, sizeof (EFI_IFR_GUID_LABEL
));
593 EndLabel
->ExtendOpCode
= EFI_IFR_EXTEND_OP_LABEL
;
594 EndLabel
->Number
= LABEL_END
;
596 HiiCreateActionOpCode (
597 StartOpCodeHandle
, // Container for dynamic created opcodes
598 0x1237, // Question ID
599 STRING_TOKEN(STR_EXIT_TEXT
), // Prompt text
600 STRING_TOKEN(STR_EXIT_TEXT
), // Help text
601 EFI_IFR_FLAG_CALLBACK
, // Question flag
602 0 // Action String ID
606 // Create Option OpCode
608 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
609 ASSERT (OptionsOpCodeHandle
!= NULL
);
611 HiiCreateOneOfOptionOpCode (
613 STRING_TOKEN (STR_BOOT_OPTION1
),
615 EFI_IFR_NUMERIC_SIZE_1
,
619 HiiCreateOneOfOptionOpCode (
621 STRING_TOKEN (STR_BOOT_OPTION2
),
623 EFI_IFR_NUMERIC_SIZE_1
,
628 // Prepare initial value for the dynamic created oneof Question
630 PrivateData
->Configuration
.DynamicOneof
= 2;
631 Status
= gRT
->SetVariable(
634 EFI_VARIABLE_NON_VOLATILE
| EFI_VARIABLE_BOOTSERVICE_ACCESS
,
635 sizeof (DRIVER_SAMPLE_CONFIGURATION
),
636 &PrivateData
->Configuration
639 HiiCreateOneOfOpCode (
640 StartOpCodeHandle
, // Container for dynamic created opcodes
641 0x8001, // Question ID (or call it "key")
642 CONFIGURATION_VARSTORE_ID
, // VarStore ID
643 (UINT16
) DYNAMIC_ONE_OF_VAR_OFFSET
, // Offset in Buffer Storage
644 STRING_TOKEN (STR_ONE_OF_PROMPT
), // Question prompt text
645 STRING_TOKEN (STR_ONE_OF_HELP
), // Question help text
646 EFI_IFR_FLAG_CALLBACK
, // Question flag
647 EFI_IFR_NUMERIC_SIZE_1
, // Data type of Question Value
648 OptionsOpCodeHandle
, // Option Opcode list
649 NULL
// Default Opcode is NULl
652 HiiCreateOrderedListOpCode (
653 StartOpCodeHandle
, // Container for dynamic created opcodes
654 0x8002, // Question ID
655 CONFIGURATION_VARSTORE_ID
, // VarStore ID
656 (UINT16
) DYNAMIC_ORDERED_LIST_VAR_OFFSET
, // Offset in Buffer Storage
657 STRING_TOKEN (STR_BOOT_OPTIONS
), // Question prompt text
658 STRING_TOKEN (STR_BOOT_OPTIONS
), // Question help text
659 EFI_IFR_FLAG_RESET_REQUIRED
, // Question flag
660 0, // Ordered list flag, e.g. EFI_IFR_UNIQUE_SET
661 EFI_IFR_NUMERIC_SIZE_1
, // Data type of Question value
662 5, // Maximum container
663 OptionsOpCodeHandle
, // Option Opcode list
664 NULL
// Default Opcode is NULl
667 HiiCreateGotoOpCode (
668 StartOpCodeHandle
, // Container for dynamic created opcodes
670 STRING_TOKEN (STR_GOTO_FORM1
), // Prompt text
671 STRING_TOKEN (STR_GOTO_HELP
), // Help text
673 0x8003 // Question ID
677 PrivateData
->HiiHandle
[0], // HII handle
678 &mFormSetGuid
, // Formset GUID
680 StartOpCodeHandle
, // Label for where to insert opcodes
681 EndOpCodeHandle
// Replace data
684 HiiFreeOpCodeHandle (StartOpCodeHandle
);
685 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
690 // We will reach here once the Question is refreshed
694 // Initialize the container for dynamic opcodes
696 StartOpCodeHandle
= HiiAllocateOpCodeHandle ();
697 ASSERT (StartOpCodeHandle
!= NULL
);
700 // Create Hii Extend Label OpCode as the start opcode
702 StartLabel
= (EFI_IFR_GUID_LABEL
*) HiiCreateGuidOpCode (StartOpCodeHandle
, &gEfiIfrTianoGuid
, NULL
, sizeof (EFI_IFR_GUID_LABEL
));
703 StartLabel
->ExtendOpCode
= EFI_IFR_EXTEND_OP_LABEL
;
704 StartLabel
->Number
= LABEL_UPDATE2
;
706 HiiCreateActionOpCode (
707 StartOpCodeHandle
, // Container for dynamic created opcodes
708 0x1237, // Question ID
709 STRING_TOKEN(STR_EXIT_TEXT
), // Prompt text
710 STRING_TOKEN(STR_EXIT_TEXT
), // Help text
711 EFI_IFR_FLAG_CALLBACK
, // Question flag
712 0 // Action String ID
716 PrivateData
->HiiHandle
[0], // HII handle
717 &mFormSetGuid
, // Formset GUID
719 StartOpCodeHandle
, // Label for where to insert opcodes
723 HiiFreeOpCodeHandle (StartOpCodeHandle
);
726 // Refresh the Question value
728 PrivateData
->Configuration
.DynamicRefresh
++;
729 Status
= gRT
->SetVariable(
732 EFI_VARIABLE_NON_VOLATILE
| EFI_VARIABLE_BOOTSERVICE_ACCESS
,
733 sizeof (DRIVER_SAMPLE_CONFIGURATION
),
734 &PrivateData
->Configuration
738 // Change an EFI Variable storage (MyEfiVar) asynchronous, this will cause
739 // the first statement in Form 3 be suppressed
742 Status
= gRT
->SetVariable(
745 EFI_VARIABLE_NON_VOLATILE
| EFI_VARIABLE_BOOTSERVICE_ACCESS
,
753 // User press "Exit now", request Browser to exit
755 *ActionRequest
= EFI_BROWSER_ACTION_REQUEST_EXIT
;
760 // User press "Save now", request Browser to save the uncommitted data.
762 *ActionRequest
= EFI_BROWSER_ACTION_REQUEST_SUBMIT
;
767 // When try to set a new password, user will be chanlleged with old password.
768 // The Callback is responsible for validating old password input by user,
769 // If Callback return EFI_SUCCESS, it indicates validation pass.
771 switch (PrivateData
->PasswordState
) {
772 case BROWSER_STATE_VALIDATE_PASSWORD
:
773 Status
= ValidatePassword (PrivateData
, Value
->string
);
774 if (Status
== EFI_SUCCESS
) {
775 PrivateData
->PasswordState
= BROWSER_STATE_SET_PASSWORD
;
779 case BROWSER_STATE_SET_PASSWORD
:
780 Status
= SetPassword (PrivateData
, Value
->string
);
781 PrivateData
->PasswordState
= BROWSER_STATE_VALIDATE_PASSWORD
;
798 Main entry for this driver.
800 @param ImageHandle Image handle this driver.
801 @param SystemTable Pointer to SystemTable.
803 @retval EFI_SUCESS This function always complete successfully.
809 IN EFI_HANDLE ImageHandle
,
810 IN EFI_SYSTEM_TABLE
*SystemTable
814 EFI_HII_HANDLE HiiHandle
[2];
815 EFI_SCREEN_DESCRIPTOR Screen
;
816 EFI_HII_DATABASE_PROTOCOL
*HiiDatabase
;
817 EFI_HII_STRING_PROTOCOL
*HiiString
;
818 EFI_FORM_BROWSER2_PROTOCOL
*FormBrowser2
;
819 EFI_HII_CONFIG_ROUTING_PROTOCOL
*HiiConfigRouting
;
822 DRIVER_SAMPLE_CONFIGURATION
*Configuration
;
824 EFI_STRING ConfigRequestHdr
;
827 // Initialize the local variables.
829 ConfigRequestHdr
= NULL
;
831 // Initialize screen dimensions for SendForm().
832 // Remove 3 characters from top and bottom
834 ZeroMem (&Screen
, sizeof (EFI_SCREEN_DESCRIPTOR
));
835 gST
->ConOut
->QueryMode (gST
->ConOut
, gST
->ConOut
->Mode
->Mode
, &Screen
.RightColumn
, &Screen
.BottomRow
);
838 Screen
.BottomRow
= Screen
.BottomRow
- 3;
841 // Initialize driver private data
843 PrivateData
= AllocatePool (sizeof (DRIVER_SAMPLE_PRIVATE_DATA
));
844 if (PrivateData
== NULL
) {
845 return EFI_OUT_OF_RESOURCES
;
848 PrivateData
->Signature
= DRIVER_SAMPLE_PRIVATE_SIGNATURE
;
850 PrivateData
->ConfigAccess
.ExtractConfig
= ExtractConfig
;
851 PrivateData
->ConfigAccess
.RouteConfig
= RouteConfig
;
852 PrivateData
->ConfigAccess
.Callback
= DriverCallback
;
853 PrivateData
->PasswordState
= BROWSER_STATE_VALIDATE_PASSWORD
;
856 // Locate Hii Database protocol
858 Status
= gBS
->LocateProtocol (&gEfiHiiDatabaseProtocolGuid
, NULL
, (VOID
**) &HiiDatabase
);
859 if (EFI_ERROR (Status
)) {
862 PrivateData
->HiiDatabase
= HiiDatabase
;
865 // Locate HiiString protocol
867 Status
= gBS
->LocateProtocol (&gEfiHiiStringProtocolGuid
, NULL
, (VOID
**) &HiiString
);
868 if (EFI_ERROR (Status
)) {
871 PrivateData
->HiiString
= HiiString
;
874 // Locate Formbrowser2 protocol
876 Status
= gBS
->LocateProtocol (&gEfiFormBrowser2ProtocolGuid
, NULL
, (VOID
**) &FormBrowser2
);
877 if (EFI_ERROR (Status
)) {
880 PrivateData
->FormBrowser2
= FormBrowser2
;
883 // Locate ConfigRouting protocol
885 Status
= gBS
->LocateProtocol (&gEfiHiiConfigRoutingProtocolGuid
, NULL
, (VOID
**) &HiiConfigRouting
);
886 if (EFI_ERROR (Status
)) {
889 PrivateData
->HiiConfigRouting
= HiiConfigRouting
;
891 Status
= gBS
->InstallMultipleProtocolInterfaces (
893 &gEfiDevicePathProtocolGuid
,
894 &mHiiVendorDevicePath0
,
895 &gEfiHiiConfigAccessProtocolGuid
,
896 &PrivateData
->ConfigAccess
,
899 ASSERT_EFI_ERROR (Status
);
901 PrivateData
->DriverHandle
[0] = DriverHandle
[0];
904 // Publish our HII data
906 HiiHandle
[0] = HiiAddPackages (
913 if (HiiHandle
[0] == NULL
) {
914 return EFI_OUT_OF_RESOURCES
;
917 PrivateData
->HiiHandle
[0] = HiiHandle
[0];
920 // Publish another Fromset
922 Status
= gBS
->InstallMultipleProtocolInterfaces (
924 &gEfiDevicePathProtocolGuid
,
925 &mHiiVendorDevicePath1
,
928 ASSERT_EFI_ERROR (Status
);
930 PrivateData
->DriverHandle
[1] = DriverHandle
[1];
932 HiiHandle
[1] = HiiAddPackages (
939 if (HiiHandle
[1] == NULL
) {
940 return EFI_OUT_OF_RESOURCES
;
943 PrivateData
->HiiHandle
[1] = HiiHandle
[1];
946 // Very simple example of how one would update a string that is already
947 // in the HII database
949 NewString
= L
"700 Mhz";
951 if (HiiSetString (HiiHandle
[0], STRING_TOKEN (STR_CPU_STRING2
), NewString
, NULL
) == 0) {
952 return EFI_OUT_OF_RESOURCES
;
956 // Initialize configuration data
958 Configuration
= &PrivateData
->Configuration
;
959 ZeroMem (Configuration
, sizeof (DRIVER_SAMPLE_CONFIGURATION
));
962 // Try to read NV config EFI variable first
964 ConfigRequestHdr
= HiiConstructConfigHdr (&mFormSetGuid
, VariableName
, DriverHandle
[0]);
965 ASSERT (ConfigRequestHdr
!= NULL
);
967 BufferSize
= sizeof (DRIVER_SAMPLE_CONFIGURATION
);
968 Status
= gRT
->GetVariable (VariableName
, &mFormSetGuid
, NULL
, &BufferSize
, Configuration
);
969 if (EFI_ERROR (Status
)) {
971 // Store zero data Buffer Storage to EFI variable
973 Status
= gRT
->SetVariable(
976 EFI_VARIABLE_NON_VOLATILE
| EFI_VARIABLE_BOOTSERVICE_ACCESS
,
977 sizeof (DRIVER_SAMPLE_CONFIGURATION
),
980 ASSERT (Status
== EFI_SUCCESS
);
982 // EFI variable for NV config doesn't exit, we should build this variable
983 // based on default values stored in IFR
985 ActionFlag
= HiiSetToDefaults (ConfigRequestHdr
, EFI_HII_DEFAULT_CLASS_STANDARD
);
989 // EFI variable does exist and Validate Current Setting
991 ActionFlag
= HiiValidateSettings (ConfigRequestHdr
);
995 FreePool (ConfigRequestHdr
);
999 // In default, this driver is built into Flash device image,
1000 // the following code doesn't run.
1004 // Example of how to display only the item we sent to HII
1005 // When this driver is not built into Flash device image,
1006 // it need to call SendForm to show front page by itself.
1008 if (DISPLAY_ONLY_MY_ITEM
<= 1) {
1010 // Have the browser pull out our copy of the data, and only display our data
1012 Status
= FormBrowser2
->SendForm (
1014 &(HiiHandle
[DISPLAY_ONLY_MY_ITEM
]),
1022 HiiRemovePackages (HiiHandle
[0]);
1024 HiiRemovePackages (HiiHandle
[1]);
1031 Unloads the application and its installed protocol.
1033 @param[in] ImageHandle Handle that identifies the image to be unloaded.
1035 @retval EFI_SUCCESS The image has been unloaded.
1039 DriverSampleUnload (
1040 IN EFI_HANDLE ImageHandle
1043 if (DriverHandle
[0] != NULL
) {
1044 gBS
->UninstallMultipleProtocolInterfaces (
1046 &gEfiDevicePathProtocolGuid
,
1047 &mHiiVendorDevicePath0
,
1048 &gEfiHiiConfigAccessProtocolGuid
,
1049 &PrivateData
->ConfigAccess
,
1054 if (DriverHandle
[1] != NULL
) {
1055 gBS
->UninstallMultipleProtocolInterfaces (
1057 &gEfiDevicePathProtocolGuid
,
1058 &mHiiVendorDevicePath1
,
1063 if (PrivateData
->HiiHandle
[0] != NULL
) {
1064 HiiRemovePackages (PrivateData
->HiiHandle
[0]);
1067 if (PrivateData
->HiiHandle
[1] != NULL
) {
1068 HiiRemovePackages (PrivateData
->HiiHandle
[1]);
1071 if (PrivateData
!= NULL
) {
1072 FreePool (PrivateData
);