├── .github ├── ISSUE_TEMPLATE │ └── bug_report.yaml ├── dependabot.yaml └── workflows │ └── deploy.yaml ├── .gitignore ├── IFR-Formatter └── IFR-Formatter.js ├── README.md ├── eslint.config.js ├── images ├── extraction │ ├── 1.png │ ├── 2.png │ ├── 3.png │ ├── 4.png │ ├── 5.png │ ├── 6.png │ └── 7.png ├── insertion │ ├── 1.png │ ├── 2.png │ ├── 3.png │ └── 4.png ├── showcase │ ├── 1.png │ └── 2.png └── usage │ ├── 1.png │ ├── 2.jpg │ ├── 3.png │ └── 4.png ├── index.html ├── package-lock.json ├── package.json ├── postcss.config.cjs ├── public └── bios.png ├── src ├── App.module.css ├── App.tsx ├── components │ ├── FileUploads │ │ └── FileUploads.tsx │ ├── Footer │ │ ├── Footer.module.css │ │ └── Footer.tsx │ ├── FormUi │ │ ├── FormUi.module.css │ │ ├── FormUi.tsx │ │ └── SearchUi │ │ │ └── SearchUi.tsx │ ├── Header │ │ ├── Header.module.css │ │ └── Header.tsx │ ├── Navigation │ │ ├── Navigation.module.css │ │ └── Navigation.tsx │ └── scripts │ │ ├── hexWorker.ts │ │ ├── scripts.ts │ │ └── types.ts ├── main.tsx └── vite-env.d.ts ├── tsconfig.app.json ├── tsconfig.json ├── tsconfig.node.json └── vite.config.ts /.github/ISSUE_TEMPLATE/bug_report.yaml: -------------------------------------------------------------------------------- 1 | name: Bug Report 2 | description: Only use this form for bug reports. 3 | body: 4 | - type: input 5 | id: uefi-download 6 | attributes: 7 | label: Provide the official URL to the UEFI you tried to modify. 8 | description: I will only investigate official downloads from motherboard vendors. 9 | validations: 10 | required: true 11 | - type: dropdown 12 | id: is-modified 13 | attributes: 14 | label: Did you modify a previously modified UEFI or the stock one? 15 | options: 16 | - Previously modified 17 | - Stock 18 | validations: 19 | required: true 20 | - type: input 21 | id: flashing-method 22 | attributes: 23 | label: What flashing method did you use? 24 | description: E.g. motherboard's flashback feature 25 | validations: 26 | required: true 27 | - type: dropdown 28 | id: tested 29 | attributes: 30 | label: Did you successfully flash a stock UEFI with said method? 31 | options: 32 | - "No" 33 | - "Yes" 34 | validations: 35 | required: true 36 | - type: input 37 | id: setup-sct-sha256 38 | attributes: 39 | label: SHA256 hash of unmodified Setup SCT 40 | validations: 41 | required: true 42 | - type: input 43 | id: setup-txt-sha256 44 | attributes: 45 | label: SHA256 hash of IFR Extractor output TXT 46 | validations: 47 | required: true 48 | - type: input 49 | id: amitse-sct-sha256 50 | attributes: 51 | label: SHA256 hash of unmodified AMITSE SCT 52 | validations: 53 | required: true 54 | - type: input 55 | id: setupdata-bin-sha256 56 | attributes: 57 | label: SHA256 hash of unmodified Setupdata BIN 58 | validations: 59 | required: true 60 | - type: textarea 61 | id: data-json 62 | attributes: 63 | label: Attach the data.json file with the modification you attempted to do. 64 | description: Limit it to the problematic setting for easier debugging. 65 | validations: 66 | required: true 67 | - type: input 68 | id: final-rom-sha256 69 | attributes: 70 | label: SHA256 hash of modified UEFI 71 | validations: 72 | required: true 73 | - type: textarea 74 | id: expected-outcome 75 | attributes: 76 | label: Describe the expected outcome as detailed as possible. 77 | description: Attach images if necessary. 78 | validations: 79 | required: true 80 | - type: textarea 81 | id: actual-outcome 82 | attributes: 83 | label: Describe the actual outcome as detailed as possible. 84 | description: Attach images if necessary. 85 | validations: 86 | required: true 87 | -------------------------------------------------------------------------------- /.github/dependabot.yaml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: "github-actions" 4 | directory: "/" 5 | schedule: 6 | interval: "weekly" 7 | -------------------------------------------------------------------------------- /.github/workflows/deploy.yaml: -------------------------------------------------------------------------------- 1 | # Simple workflow for deploying static content to GitHub Pages 2 | name: Deploy static content to Pages 3 | 4 | on: 5 | # Runs on pushes targeting the default branch 6 | # push: 7 | # branches: ["master"] 8 | 9 | # Allows you to run this workflow manually from the Actions tab 10 | workflow_dispatch: 11 | 12 | # Sets the GITHUB_TOKEN permissions to allow deployment to GitHub Pages 13 | permissions: 14 | contents: read 15 | pages: write 16 | id-token: write 17 | 18 | # Allow one concurrent deployment 19 | concurrency: 20 | group: "pages" 21 | cancel-in-progress: true 22 | 23 | jobs: 24 | # Single deploy job since we're just deploying 25 | deploy: 26 | environment: 27 | name: github-pages 28 | url: ${{ steps.deployment.outputs.page_url }} 29 | runs-on: ubuntu-latest 30 | steps: 31 | - name: Checkout 32 | uses: actions/checkout@v4 33 | - name: Set up Node 34 | uses: actions/setup-node@v4 35 | with: 36 | node-version: 20 37 | cache: "npm" 38 | - name: Install dependencies 39 | run: npm ci 40 | - name: Build 41 | run: npm run build 42 | - name: Setup Pages 43 | uses: actions/configure-pages@v5 44 | - name: Upload artifact 45 | uses: actions/upload-pages-artifact@v3 46 | with: 47 | # Upload dist folder 48 | path: "./dist" 49 | - name: Deploy to GitHub Pages 50 | id: deployment 51 | uses: actions/deploy-pages@v4 52 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /IFR-Formatter/IFR-Formatter.js: -------------------------------------------------------------------------------- 1 | const fs = require("fs"); 2 | const path = require("path"); 3 | 4 | function returnForm(currentForm) { 5 | return `${" ".repeat(120)}${currentForm}\n`; 6 | } 7 | 8 | (async function () { 9 | const currentVersion = "0.1.2"; 10 | const wantedIFRExtractorVersions = ["1.5.1", "1.6.0"]; 11 | 12 | let script; 13 | let latestVersionMatch; 14 | 15 | try { 16 | script = await ( 17 | await fetch( 18 | "https://raw.githubusercontent.com/BoringBoredom/UEFI-Editor/master/IFR-Formatter/IFR-Formatter.js" 19 | ) 20 | ).text(); 21 | } catch { 22 | // skip 23 | } 24 | 25 | if (script) { 26 | latestVersionMatch = script.match( 27 | /const currentVersion = "(\d).(\d).(\d)";/ 28 | ); 29 | } 30 | 31 | if (latestVersionMatch) { 32 | const [currentMajor, currentMinor, currentPatch] = currentVersion 33 | .split(".") 34 | .map((number) => parseInt(number, 10)); 35 | const [, latestMajor, latestMinor, latestPatch] = latestVersionMatch.map( 36 | (number) => parseInt(number, 10) 37 | ); 38 | 39 | if ( 40 | currentMajor < latestMajor || 41 | (currentMajor === latestMajor && currentMinor < latestMinor) || 42 | (currentMajor === latestMajor && 43 | currentMinor === latestMinor && 44 | currentPatch < latestPatch) 45 | ) { 46 | fs.writeFileSync(process.argv[1], script); 47 | 48 | return console.log("The script has been updated. Run it again."); 49 | } 50 | } 51 | 52 | const filePath = process.argv[2]; 53 | let file = fs.readFileSync(filePath, "utf8"); 54 | let formattedFile = ""; 55 | 56 | if ( 57 | !wantedIFRExtractorVersions.some((version) => 58 | file.includes(`Program version: ${version}`) 59 | ) 60 | ) { 61 | return console.log( 62 | `Wrong IFRExtractor-RS version. Compatible versions: ${wantedIFRExtractorVersions.join( 63 | ", " 64 | )}.` 65 | ); 66 | } 67 | 68 | if (!file.includes("Extraction mode: UEFI")) { 69 | return console.log("Only UEFI is supported."); 70 | } 71 | 72 | if (!/\{ .* \}/.test(file)) { 73 | return console.log(`Use the "verbose" option of IFRExtractor.`); 74 | } 75 | 76 | file = file.replaceAll(/[\r\n|\n|\r](?!0x[0-9A-F]{3})/g, "
"); 77 | 78 | const varStores = {}; 79 | let currentForm; 80 | 81 | for (const line of file.split("\n")) { 82 | const varStore = line.match( 83 | /VarStore Guid: (.*), VarStoreId: (.*), Size: (.*), Name: "(.*)" \{/ 84 | ); 85 | const form = line.match(/Form FormId: (.*), Title: "(.*)" \{ (.*) \}/); 86 | const string = line.match( 87 | /String Prompt: "(.*)", Help: "(.*)", QuestionFlags: (.*), QuestionId: (.*), VarStoreId: (.*), VarStoreInfo: (.*), MinSize: (.*), MaxSize: (.*), Flags: (.*) \{ (.*) \}/ 88 | ); 89 | const numeric = line.match( 90 | /Numeric Prompt: "(.*)", Help: "(.*)", QuestionFlags: (.*), QuestionId: (.*), VarStoreId: (.*), VarOffset: (.*), Flags: (.*), Size: (.*), Min: (.*), Max: (.*), Step: (.*) \{ (.*) \}/ 91 | ); 92 | const checkBox = line.match( 93 | /CheckBox Prompt: "(.*)", Help: "(.*)", QuestionFlags: (.*), QuestionId: (.*), VarStoreId: (.*), VarOffset: (.*), Flags: (.*) \{ (.*) \}/ 94 | ); 95 | const oneOf = line.match( 96 | /OneOf Prompt: "(.*)", Help: "(.*)", QuestionFlags: (.*), QuestionId: (.*), VarStoreId: (.*), VarOffset: (.*), Flags: (.*), Size: (.*), Min: (.*), Max: (.*), Step: (.*) \{ (.*) \}/ 97 | ); 98 | const oneOfOption = line.match(/OneOfOption Option: "(.*)" Value: (.*) \{/); 99 | 100 | if (varStore) { 101 | varStores[varStore[2]] = varStore[4]; 102 | } 103 | 104 | if (form) { 105 | currentForm = form[2]; 106 | } 107 | 108 | if (string) { 109 | formattedFile += `${returnForm(currentForm)}${string[1]}\n`; 110 | } 111 | 112 | if (numeric) { 113 | formattedFile += `${returnForm(currentForm)}${numeric[1]} | VarStore: ${ 114 | varStores[numeric[5]] 115 | } | VarOffset: ${numeric[6]} | Size: 0x${(parseInt(numeric[8], 10) / 8) 116 | .toString(16) 117 | .toUpperCase()}\n Min: ${numeric[9]} | Max: ${numeric[10]} | Step: ${ 118 | numeric[11] 119 | }\n`; 120 | } 121 | 122 | if (checkBox) { 123 | formattedFile += `${returnForm(currentForm)}${checkBox[1]} | VarStore: ${ 124 | varStores[checkBox[5]] 125 | } | VarOffset: ${checkBox[6]}\n`; 126 | } 127 | 128 | if (oneOf) { 129 | formattedFile += `${returnForm(currentForm)}${oneOf[1]} | VarStore: ${ 130 | varStores[oneOf[5]] 131 | } | VarOffset: ${oneOf[6]} | Size: 0x${(parseInt(oneOf[8], 10) / 8) 132 | .toString(16) 133 | .toUpperCase()}\n`; 134 | } 135 | 136 | if (oneOfOption) { 137 | formattedFile += ` ${oneOfOption[1]}: 0x${parseInt( 138 | oneOfOption[2].split(",")[0], 139 | 10 140 | ) 141 | .toString(16) 142 | .toUpperCase()}\n`; 143 | } 144 | } 145 | 146 | fs.writeFileSync( 147 | path.join(path.dirname(filePath), `formatted_${path.basename(filePath)}`), 148 | formattedFile 149 | ); 150 | })(); 151 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # [Aptio V UEFI Editor](https://boringboredom.github.io/UEFI-Editor/) 2 | 3 | ![](./images/showcase/1.png) 4 | ![](./images/showcase/2.png) 5 | 6 | # Usage guide 7 | 8 | ## Prerequisites 9 | 10 | - [UEFITool NE](https://github.com/LongSoft/UEFITool/releases) (press `Show all assets`) 11 | - [UEFITool 0.28.0](https://github.com/LongSoft/UEFITool/releases/tag/0.28.0) ([why?](https://github.com/LongSoft/UEFITool#known-issues)) 12 | - [IFRExtractor-RS](https://github.com/LongSoft/IFRExtractor-RS/releases) 13 | - [UEFI Editor](https://boringboredom.github.io/UEFI-Editor/) 14 | 15 | ## Extracting the necessary files 16 | 17 | - Drag and drop the BIOS file into `UEFITool NE`. 18 | - Search (`CTRL + F`) for a known setting. 19 | 20 | ![](./images/extraction/1.png) 21 | 22 | - Double-click the reference to `Setup/PE32 image section` at the bottom. 23 | 24 | ![](./images/extraction/2.png) 25 | 26 | - Extract `PE32 image section` `as is`. 27 | 28 | ![](./images/extraction/3.png) 29 | 30 | - Move `ifrextractor.exe` to the current folder, open the CLI inside and convert the `.sct` file you just extracted. 31 | 32 | ``` 33 | ifrextractor.exe "Section_PE32_image_Setup_Setup.sct" verbose 34 | ``` 35 | 36 | ![](./images/extraction/4.png) 37 | 38 | - Scroll down inside the currently expanded section and find `AMITSE` and `setupdata` (sometimes both required files are under `AMITSE`). Extract `PE32 image section` `as is` and `setupdata` as `body`. 39 | 40 | ![](./images/extraction/5.png) 41 | ![](./images/extraction/6.png) 42 | 43 | - Upload the 4 files to the `UEFI Editor` page. 44 | 45 | ![](./images/extraction/7.png) 46 | 47 | ## Using the UEFI Editor GUI 48 | 49 | - ### Navigation 50 | - Dotted underlined text has references to Forms and can be clicked. 51 | - ### Menu 52 | 53 | - You can change the target Form of top-level references here. This is useful for UEFIs that have a custom `Advanced` Form. 54 | 55 | ![](./images/usage/1.png) 56 | ![](./images/usage/2.jpg) 57 | 58 | - E.g. on MSI boards, you can replace `OC Profiles` with `Advanced` (child of `Setup`) to gain access to a lot of Forms that are otherwise inaccessible due to missing references while still retaining access to `OC Profiles`. Press `ESC` after selecting `OC Profiles` to access `Setup`. 59 | 60 | - ### Item visibility control 61 | 62 | - Make sure the parent forms are visible when targeting a setting. Use the top-right navigation to travel upwards. 63 | - If one method doesn't work, try the other one. Using both at the same time can cause issues. It varies from UEFI to UEFI. Try modifying `Access Level` first. 64 | - #### Suppress If 65 | 66 | - A `Suppress If` opcode hides nested items if the condition is true. The presence of a `Suppress If` opcode doesn't always mean the condition is true. However, if it is, you can remove the suppression by unchecking the offset. 67 | 68 | ![](./images/usage/3.png) 69 | 70 | - #### Access level 71 | 72 | - Another method of controlling item visibility is changing the access level. `05` usually works. A different value does not necessarily mean it's hidden. [Here is a forum post by Lost_N_BIOS with possible access level values](https://winraid.level1techs.com/t/request-maximus-xi-hero-unlock-amibcp/33743/4) (`CTRL + F` `05/Yes`). 73 | 74 | ![](./images/usage/4.png) 75 | 76 | ## Inserting modified files 77 | 78 | - Press the `UEFI Files` download button to download the modified files and the change log. 79 | - To find the correct sections in `UEFITool 0.28.0` you can search for `File GUID`s you copy from `UEFITool NE`. 80 | - Replace files the same way you extracted them: `Extract as is` -> `Replace as is` and `Extract body` -> `Replace body` 81 | 82 | Example for `Setup/PE32 image section`: 83 | 84 | `UEFITool NE`: 85 | 86 | ![](./images/insertion/1.png) 87 | 88 | `UEFITool 0.28.0`: 89 | 90 | ![](./images/insertion/2.png) 91 | ![](./images/insertion/3.png) 92 | 93 | - Save the modifications. 94 | 95 | ![](./images/insertion/4.png) 96 | 97 | --- 98 | 99 | The section below is unrelated to the above tool. 100 | 101 | --- 102 | 103 | # How to change hidden settings without flashing a modded BIOS 104 | 105 | ## Preparation 106 | 107 | Download [datasone's modded shell](https://github.com/datasone/grub-mod-setup_var/releases) and rename it to `BOOTX64.EFI`. 108 | 109 | Format a USB drive as `FAT32` and move `BOOTX64.EFI` to `USB:\EFI\BOOT\` (create the folders `EFI` and `BOOT` manually). The final path of the shell will be `USB:\EFI\BOOT\BOOTX64.EFI`. 110 | 111 | Download your **_current_** BIOS version from the motherboard vendor's site. The structure changes across different versions, so make sure you have the **_same_** BIOS. 112 | 113 | Follow [these instructions](#extracting-the-necessary-files) until and including the conversion with `ifrextractor.exe`. If there are two `Setup` sections, use the one that has matching offsets (change settings in BIOS and read values with datasone's shell to confirm). 114 | 115 | Optionally, download [IFR-Formatter.js](https://raw.githubusercontent.com/BoringBoredom/UEFI-Editor/master/IFR-Formatter/IFR-Formatter.js) (right-click and `Save link as...`) and [node.exe](https://nodejs.org/dist/latest/win-x64/node.exe). Place them in the same folder as the IFR Extractor output and execute `node IFR-Formatter.js yourIfrExtractorOutput.txt` in the CLI. 116 | 117 | Disable `Secure Boot` and `CSM` and boot from the USB drive in UEFI mode. 118 | 119 | ## Example 120 | 121 | ### IFR Extractor output 122 | 123 | ``` 124 | OneOf Prompt: "Intel C-State", Help: "[...]", QuestionFlags: [...], QuestionId: [...], VarStoreId: 0x2, VarOffset: 0x14, Flags: [...], Size: 8, Min: [...], Max: [...], Step: [...] { [...] } 125 | OneOfOption Option: "Auto" Value: 2, Default, MfgDefault { [...] } 126 | OneOfOption Option: "Enabled" Value: 1 { [...] } 127 | OneOfOption Option: "Disabled" Value: 0 { [...] } 128 | End { 29 02 } 129 | ``` 130 | 131 | `Size` is a decimal in bits. Convert it to a hexadecimal in bytes. 132 | `Value` is a decimal. Convert it to a hexadecimal. 133 | 134 | Search for the `VarStoreId` to find the `VarStoreName`. 135 | 136 | ``` 137 | VarStore Guid: [...], VarStoreId: 0x2, Size: [...], Name: "CpuSetup" { [...] } 138 | ``` 139 | 140 | ### IFR-Formatter.js output 141 | 142 | ``` 143 | Intel C-State | VarStore: CpuSetup | VarOffset: 0x14 | Size: 0x1 144 | Auto: 0x2 145 | Enabled: 0x1 146 | Disabled: 0x0 147 | ``` 148 | 149 | ### [Syntax](https://github.com/datasone/grub-mod-setup_var#setup_var_cv) (READ THIS) 150 | 151 | #### Writing 152 | 153 | ``` 154 | setup_var_cv VarStoreName VarOffset Size Value 155 | ``` 156 | 157 | ``` 158 | setup_var_cv CpuSetup 0x14 0x1 0x0 159 | ``` 160 | 161 | #### Reading 162 | 163 | ``` 164 | setup_var_cv VarStoreName VarOffset Size 165 | ``` 166 | 167 | ``` 168 | setup_var_cv CpuSetup 0x14 0x1 169 | ``` 170 | 171 | ### Miscellaneous 172 | 173 | To exit and reboot, type: 174 | 175 | ``` 176 | reboot 177 | ``` 178 | 179 | --- 180 | 181 | Workarounds for various issues (e.g. multiple `Setup` `VarStores`): [legacy commands](https://github.com/datasone/grub-mod-setup_var#legacy-commands) 182 | 183 | --- 184 | 185 | If something unexpected happens, force shutdown and reset CMOS. 186 | -------------------------------------------------------------------------------- /eslint.config.js: -------------------------------------------------------------------------------- 1 | import js from "@eslint/js"; 2 | import globals from "globals"; 3 | import reactHooks from "eslint-plugin-react-hooks"; 4 | import reactRefresh from "eslint-plugin-react-refresh"; 5 | import tseslint from "typescript-eslint"; 6 | import reactX from "eslint-plugin-react-x"; 7 | import reactDom from "eslint-plugin-react-dom"; 8 | 9 | export default tseslint.config( 10 | { ignores: ["dist"] }, 11 | { 12 | extends: [ 13 | js.configs.recommended, 14 | ...tseslint.configs.strictTypeChecked, 15 | ...tseslint.configs.stylisticTypeChecked, 16 | ], 17 | files: ["**/*.{ts,tsx}"], 18 | languageOptions: { 19 | ecmaVersion: 2020, 20 | globals: globals.browser, 21 | parserOptions: { 22 | project: ["./tsconfig.node.json", "./tsconfig.app.json"], 23 | tsconfigRootDir: import.meta.dirname, 24 | }, 25 | }, 26 | settings: { react: { version: "detect" } }, 27 | plugins: { 28 | "react-hooks": reactHooks, 29 | "react-refresh": reactRefresh, 30 | "react-x": reactX, 31 | "react-dom": reactDom, 32 | }, 33 | rules: { 34 | ...reactHooks.configs.recommended.rules, 35 | "react-refresh/only-export-components": [ 36 | "warn", 37 | { allowConstantExport: true }, 38 | ], 39 | ...reactX.configs["recommended-typescript"].rules, 40 | ...reactDom.configs.recommended.rules, 41 | }, 42 | } 43 | ); 44 | -------------------------------------------------------------------------------- /images/extraction/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoringBoredom/UEFI-Editor/f28cf867a0bff16a70a2f46f9b55f94365718e97/images/extraction/1.png -------------------------------------------------------------------------------- /images/extraction/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoringBoredom/UEFI-Editor/f28cf867a0bff16a70a2f46f9b55f94365718e97/images/extraction/2.png -------------------------------------------------------------------------------- /images/extraction/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoringBoredom/UEFI-Editor/f28cf867a0bff16a70a2f46f9b55f94365718e97/images/extraction/3.png -------------------------------------------------------------------------------- /images/extraction/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoringBoredom/UEFI-Editor/f28cf867a0bff16a70a2f46f9b55f94365718e97/images/extraction/4.png -------------------------------------------------------------------------------- /images/extraction/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoringBoredom/UEFI-Editor/f28cf867a0bff16a70a2f46f9b55f94365718e97/images/extraction/5.png -------------------------------------------------------------------------------- /images/extraction/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoringBoredom/UEFI-Editor/f28cf867a0bff16a70a2f46f9b55f94365718e97/images/extraction/6.png -------------------------------------------------------------------------------- /images/extraction/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoringBoredom/UEFI-Editor/f28cf867a0bff16a70a2f46f9b55f94365718e97/images/extraction/7.png -------------------------------------------------------------------------------- /images/insertion/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoringBoredom/UEFI-Editor/f28cf867a0bff16a70a2f46f9b55f94365718e97/images/insertion/1.png -------------------------------------------------------------------------------- /images/insertion/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoringBoredom/UEFI-Editor/f28cf867a0bff16a70a2f46f9b55f94365718e97/images/insertion/2.png -------------------------------------------------------------------------------- /images/insertion/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoringBoredom/UEFI-Editor/f28cf867a0bff16a70a2f46f9b55f94365718e97/images/insertion/3.png -------------------------------------------------------------------------------- /images/insertion/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoringBoredom/UEFI-Editor/f28cf867a0bff16a70a2f46f9b55f94365718e97/images/insertion/4.png -------------------------------------------------------------------------------- /images/showcase/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoringBoredom/UEFI-Editor/f28cf867a0bff16a70a2f46f9b55f94365718e97/images/showcase/1.png -------------------------------------------------------------------------------- /images/showcase/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoringBoredom/UEFI-Editor/f28cf867a0bff16a70a2f46f9b55f94365718e97/images/showcase/2.png -------------------------------------------------------------------------------- /images/usage/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoringBoredom/UEFI-Editor/f28cf867a0bff16a70a2f46f9b55f94365718e97/images/usage/1.png -------------------------------------------------------------------------------- /images/usage/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoringBoredom/UEFI-Editor/f28cf867a0bff16a70a2f46f9b55f94365718e97/images/usage/2.jpg -------------------------------------------------------------------------------- /images/usage/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoringBoredom/UEFI-Editor/f28cf867a0bff16a70a2f46f9b55f94365718e97/images/usage/3.png -------------------------------------------------------------------------------- /images/usage/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoringBoredom/UEFI-Editor/f28cf867a0bff16a70a2f46f9b55f94365718e97/images/usage/4.png -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | UEFI Editor 9 | 13 | 14 | 15 | 19 | 23 | 24 | 25 | 26 | 30 | 34 | 35 | 36 | 37 | 38 |
39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "uefi-editor", 3 | "private": true, 4 | "version": "0.0.0", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "tsc -b && vite build", 9 | "lint": "eslint .", 10 | "preview": "vite preview" 11 | }, 12 | "dependencies": { 13 | "@mantine/core": "7.17.2", 14 | "@mantine/hooks": "7.17.2", 15 | "@tabler/icons-react": "^3.0.0", 16 | "crypto-js": "^4.1.1", 17 | "file-saver": "^2.0.5", 18 | "immer": "^10.0.3", 19 | "react": "^19", 20 | "react-dom": "^19", 21 | "use-immer": "^0.11" 22 | }, 23 | "devDependencies": { 24 | "@eslint/js": "^9.20.0", 25 | "@types/crypto-js": "^4.2.1", 26 | "@types/file-saver": "^2.0.5", 27 | "@types/react": "^19", 28 | "@types/react-dom": "^19", 29 | "@vitejs/plugin-react": "^4.2.1", 30 | "eslint": "^9", 31 | "eslint-plugin-react-dom": "^1.40.1", 32 | "eslint-plugin-react-hooks": "^5", 33 | "eslint-plugin-react-refresh": "^0.4.5", 34 | "eslint-plugin-react-x": "^1.40.1", 35 | "globals": "^16", 36 | "postcss": "^8.4.33", 37 | "postcss-preset-mantine": "^1.12.3", 38 | "postcss-simple-vars": "^7.0.1", 39 | "typescript": "~5.7.2", 40 | "typescript-eslint": "^8.24.1", 41 | "vite": "^6", 42 | "vite-plugin-checker": "^0.9" 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /postcss.config.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | "postcss-preset-mantine": {}, 4 | "postcss-simple-vars": { 5 | variables: { 6 | "mantine-breakpoint-xs": "36em", 7 | "mantine-breakpoint-sm": "48em", 8 | "mantine-breakpoint-md": "62em", 9 | "mantine-breakpoint-lg": "75em", 10 | "mantine-breakpoint-xl": "88em", 11 | }, 12 | }, 13 | }, 14 | }; 15 | -------------------------------------------------------------------------------- /public/bios.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoringBoredom/UEFI-Editor/f28cf867a0bff16a70a2f46f9b55f94365718e97/public/bios.png -------------------------------------------------------------------------------- /src/App.module.css: -------------------------------------------------------------------------------- 1 | .padding { 2 | padding: 3vw; 3 | } 4 | -------------------------------------------------------------------------------- /src/App.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import s from "./App.module.css"; 3 | import { useImmer } from "use-immer"; 4 | import { AppShell, Button, Group, Stack } from "@mantine/core"; 5 | import type { Data } from "./components/scripts/types"; 6 | import FileUploads, { 7 | type Files, 8 | type PopulatedFiles, 9 | } from "./components/FileUploads/FileUploads"; 10 | import FormUi from "./components/FormUi/FormUi"; 11 | import Navigation from "./components/Navigation/Navigation"; 12 | import Header from "./components/Header/Header"; 13 | import Footer from "./components/Footer/Footer"; 14 | import { IconBrandGithub } from "@tabler/icons-react"; 15 | 16 | export default function App() { 17 | const [files, setFiles] = useImmer({ 18 | setupSctContainer: { isWrongFile: false }, 19 | setupTxtContainer: { isWrongFile: false }, 20 | amitseSctContainer: { isWrongFile: false }, 21 | setupdataBinContainer: { isWrongFile: false }, 22 | }); 23 | 24 | const [data, setData] = useImmer({} as Data); 25 | 26 | const [currentFormIndex, setCurrentFormIndex] = React.useState(-1); 27 | 28 | return ( 29 | <> 30 | {Object.values(data).length !== 0 ? ( 31 | <> 32 | 33 | 38 | 39 | 40 |
45 | 46 | 47 |