/SlimIFR

Make UEFI (BIOS) Setup IFR dumps easy to read, browse and use with UEFI Variable Tool

Primary LanguageJavaScript

SlimIFR – Internal Form Representation Formatting Script

The What

This script reformats an IFR Extractor dump so that:

  • It's easier to browse and read
  • Can be used as input for reading and writing settings with UefiVarTool

The purpose is to be able to change any hidden UEFI Setup settings, and make it efficient and straighforward.

Features

  • Only one row per entry for better clarity
  • Redundant and unimportant output eliminated
  • Much more concise (size reduced by over 80%)
  • Hexadecimal values padded to align with one another
  • Settings sorted alphabetically by VarStore (i.e. UEFI variable)
  • Easily customizable if need be

Comparison

IFRExtractor Verbose IFRExtractor SlimIFR
File Size 3MB 2MB 500 kB
# of Rows 33,479 33,479 4,604

Example

AMITSESetup:0x0040               Boot: Quiet Boot [0x00 / 0x01]
MeSetup:0x0003                   Firmware Update Configuration: Me FW Image Re-Flash [0x00 - Disabled, 0x01 - Enabled]
SaSetup:0x000F(0x02)             Memory Overclocking Menu: tREFI [0x0000 - 0xFFFF]
Instead of…
		CheckBox Prompt: "Quiet Boot", Help: "Enables or disables Quiet Boot option", QuestionFlags: 0x0, QuestionId: 0x106E, VarStoreId: 0xF013, VarOffset: 0x40, Flags: 0x0, Default: Disabled, MfgDefault: Disabled
			Default DefaultId: 0x0 Value: 1
			Default DefaultId: 0x1 Value: 1
		End 
	Form FormId: 0x27DA, Title: "Firmware Update Configuration"
		OneOf Prompt: "Me FW Image Re-Flash", Help: "Enable/Disable Me FW Image Re-Flash function.", QuestionFlags: 0x10, QuestionId: 0x2A0, VarStoreId: 0x9, VarOffset: 0x3, Flags: 0x10, Size: 8, Min: 0x0, Max: 0x1, Step: 0x0
			OneOfOption Option: "Disabled" Value: 0, Default, MfgDefault
			OneOfOption Option: "Enabled" Value: 1
		End 
			Numeric Prompt: "  tREFI", Help: "Refresh Interval, 0: AUTO, max: 65535", QuestionFlags: 0x14, QuestionId: 0x2773, VarStoreId: 0x5, VarOffset: 0xF, Flags: 0x11, Size: 16, Min: 0x0, Max: 0xFFFF, Step: 0x1
				Default DefaultId: 0x0 Value: 0
			End 

Also see:

The How

Note: this is just a summary. The UefiVarTool repository has detailed instructions, which I don't want to repeat here.

Prepare

  • UEFI (BIOS) image to explore
  • UEFITool or another utility to extract the Setup module from the image
  • IFR Extractor to extract the IFR data from the Setup module
  • Node.exe from Node.js

Run

  • Extract the Setup module (example, exact steps are device-specific):
UEFIExtract Image.bin 899407D7-99FE-43D8-9A21-79EC328CAC21 -m file -o Setup.efi
  • Extract the IFR data:
IFRExtractor Setup.efi verbose
  • Trim it with SlimIFR: (the parameters are simply <InputFilename> <OutputFilename>)
node SlimIFR.js IFR-Verbose.txt IFR-Slim.txt

Use

  • Browse with a good editor such as Notepad++
  • Change these settings with UefiVarTool
  • Great news: SlimIFR output format is almost the same as UefiVarTool's input format

The Why

Most of the available UEFI (BIOS) Setup settings on any given platform are typically hidden from the user. Extracting the Internal Form Representation (IFR) data from a firmware image makes it possible to see them all. Other tools can then be used to modify these settings.

The IFR data is stored as a blob within the Setup or SetupUtility EFI module. A tool to dump it in a human-readable form was first written by Donovan6000. More recently, a rewritten and updated version has been maintained by LongSoft. The verbose output provided by these tools is essential for some use cases but can be suboptimal for quickly just browsing through.

Enter SlimIFR.

SlimIFR and UefiVarTool complement each other to make the whole process easy, straightforward, and efficient, so that more people can gain access to all the hidden settings, and unlock the true abilities of their hardware.

Credits

This tool is based on IFR-Formatter by BoringBoredom, although the output format is completely different.