/** @file Control CFGLock BIOS Option Copyright (c) 2020, Brumbaer. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at http://opensource.org/licenses/bsd-license.php THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. **/ // // Unless otherwise specified all data types are naturally aligned. Structures are // aligned on boundaries equal to the largest internal datum of the structure and // internal data are implicitly padded to achieve natural alignment. // #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define CHAR_ESC 0x1B #define DONT_STOP_AT 0xFFFF /** Parameters to search in a Form for IfrHeaders which contain a Description and to return the VarStore @param SearchText Text that must be part of the options description @param EfiHandle Handle of the list the Form is part of @param ListHeader Pointer to the contents of the handle @param PkgHeader Pointer to the current package in the list @param FirstIfrHeader Pointer to first IfrHeader in Package @param IfrVarStore Pointer to IfrHeader of corresponding varstore in same list @param IfrOneOf Pointer to IfrHeader of BIOS Option @param StopAt Find a certain BIOS Option @param Count Running number of suitable BIOS Options **/ typedef struct ONE_OF_CONTEXT_ { EFI_STRING SearchText; EFI_HII_HANDLE EfiHandle; EFI_HII_PACKAGE_LIST_HEADER *ListHeader; EFI_HII_PACKAGE_HEADER *PkgHeader; EFI_IFR_OP_HEADER *FirstIfrHeader; EFI_IFR_VARSTORE *IfrVarStore; EFI_IFR_ONE_OF *IfrOneOf; UINT16 StopAt; UINT16 Count; } ONE_OF_CONTEXT; /** Callback - What to do, when a IfrHeader with a defined OP_CODE is found @param[in] IfrHeader Current IfrHeader under scrutiny @param[in,out] Stop Pointer to Stop flag. If TRUE no further search for opcodes. Can be NULL. @param[in] Context Pointer to Handler specific data **/ typedef VOID OP_CODE_HANDLER ( IN EFI_IFR_OP_HEADER *IfrHeader, IN OUT BOOLEAN *Stop OPTIONAL, IN VOID *Context ); /** Commandline Arguments **/ enum { ARG_VERIFY = 0, ARG_LOCK = 1, ARG_UNLOCK = 2, ARG_INTERACTIVE = 8, }; #define PADD(x, y) (VOID *)(((CHAR8 *) x) + y) #define BUFFER_LENGTH 128 extern UINTN mArgumentFlags; /** Check MsrE2 Status - original VerifyMSRE2 @retval EFI_SUCCESS Success @retval Other Fail to verify MSR 0xE2 status **/ EFI_STATUS EFIAPI VerifyMSRE2 ( VOID ); /** Wait for Keypress of Y or N. Ignores case. @retval TRUE Keypress is Y @retval FALSE Keypress is N **/ BOOLEAN ReadYN ( VOID ); /** Wait for any key press @retval Other Unicode for pressed key **/ CHAR16 ReadAnyKey ( VOID ); /** Parse commandline arguments @retval EFI_SUCCESS Success @retval EFI_OUT_OF_RESOURCES Could not allocate memory @retval EFI_INVALID_PARAMETER More than 1 parameter provided **/ EFI_STATUS InterpretArguments ( VOID ); /** Displays SearchString and allows to change it @param[in,out] SearchString Current configuration string **/ VOID ModifySearchString ( IN OUT EFI_STRING *SearchString ); /** Copies Package Lists to Memory @param[in] Handle An EFI_HII_HANDLE that corresponds to the desired package list in the HIIdatabase. **/ EFI_HII_PACKAGE_LIST_HEADER * HiiExportPackageLists ( IN EFI_HII_HANDLE Handle ); /** Callback to Handle EFI_IFR_ONE_OF_OP @param[in] IfrHeader Current IfrHeader under scrutiny @param[in,out] Stop Pointer to Stop flag. If TRUE no further search for opcodes. Can be NULL. @param[in] Context Pointer to Handler specific data **/ VOID HandleIfrOption ( IN EFI_IFR_OP_HEADER *IfrHeader, IN OUT BOOLEAN *Stop OPTIONAL, IN OUT VOID *Context ); /** Displaying and Changing value of BIOS Option. Including UI @param[in] Context Pointer to Handler specific data **/ VOID HandleIfrVariable ( IN OUT ONE_OF_CONTEXT *Context ); /** Call Handler for each occurence of opCode, starting to search at header. Called recursively @param[in] Header Current Header under scrutiny @param[in] OpCode Type for OpCode @param[in,out] Stop Pointer to Stop flag. If TRUE no further search for opcodes. Can be NULL. @param[in] Context Pointer to Handler specific data @param[in] Handler Handler for data **/ EFI_IFR_OP_HEADER * IterateOpCode ( IN EFI_IFR_OP_HEADER *Header, IN UINT8 OpCode, IN OUT BOOLEAN *Stop OPTIONAL, IN VOID *Context, IN OP_CODE_HANDLER Handler );