mirror of
https://github.com/acidanthera/OpenCorePkg.git
synced 2025-12-08 19:25:01 +00:00
230 lines
6.2 KiB
C
230 lines
6.2 KiB
C
/** @file
|
|
Control CFGLock BIOS Option
|
|
|
|
Copyright (c) 2020, Brumbaer. All rights reserved.<BR>
|
|
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 <Uefi.h>
|
|
#include <PiDxe.h>
|
|
#include <Library/PcdLib.h>
|
|
#include <Library/UefiLib.h>
|
|
#include <Library/BaseMemoryLib.h>
|
|
#include <Library/DebugLib.h>
|
|
#include <Library/OcMiscLib.h>
|
|
#include <Library/OcStringLib.h>
|
|
#include <Library/UefiBootServicesTableLib.h>
|
|
#include <Library/UefiRuntimeServicesTableLib.h>
|
|
#include <Library/UefiApplicationEntryPoint.h>
|
|
|
|
#include <Library/MemoryAllocationLib.h>
|
|
#include <Uefi/UefiInternalFormRepresentation.h>
|
|
#include <Library/UefiHiiServicesLib.h>
|
|
#include <Library/HiiLib.h>
|
|
|
|
#include <Protocol/HiiFont.h>
|
|
#include <Protocol/HiiImage.h>
|
|
#include <Protocol/HiiImageEx.h>
|
|
#include <Protocol/HiiImageDecoder.h>
|
|
#include <Protocol/HiiString.h>
|
|
#include <Protocol/HiiDatabase.h>
|
|
#include <Protocol/HiiConfigRouting.h>
|
|
#include <Protocol/HiiConfigAccess.h>
|
|
#include <Protocol/HiiConfigKeyword.h>
|
|
#include <Guid/HiiPlatformSetupFormset.h>
|
|
|
|
#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
|
|
);
|