From 89a89f785a43c951a30764a4e69e3e922bca98b3 Mon Sep 17 00:00:00 2001 From: Philipp Oppermann Date: Wed, 24 Feb 2021 11:15:35 +0100 Subject: [PATCH] Create a fat filesystem image --- Cargo.lock | 131 +++++++++++++++++++++++++++++++++++++++++ disk_image/Cargo.toml | 1 + disk_image/src/main.rs | 33 +++++++++++ 3 files changed, 165 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index ea5a63c8..79923916 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,5 +1,136 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +version = 3 + +[[package]] +name = "autocfg" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" + +[[package]] +name = "bitflags" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" + +[[package]] +name = "byteorder" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae44d1a3d5a19df61dd0c8beb138458ac2a53a7ac09eba97d55592540004306b" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "chrono" +version = "0.4.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" +dependencies = [ + "libc", + "num-integer", + "num-traits", + "time", + "winapi", +] + +[[package]] +name = "disk_image" +version = "0.1.0" +dependencies = [ + "fatfs", +] + +[[package]] +name = "fatfs" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e18f80a87439240dac45d927fd8f8081b6f1e34c03e97271189fa8a8c2e96c8f" +dependencies = [ + "bitflags", + "byteorder", + "chrono", + "log", +] + +[[package]] +name = "libc" +version = "0.2.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7282d924be3275cec7f6756ff4121987bc6481325397dde6ba3e7802b1a8b1c" + +[[package]] +name = "log" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "num-integer" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" +dependencies = [ + "autocfg", +] + +[[package]] +name = "time" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" +dependencies = [ + "libc", + "wasi", + "winapi", +] + [[package]] name = "uefi_app" version = "0.1.0" + +[[package]] +name = "wasi" +version = "0.10.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" diff --git a/disk_image/Cargo.toml b/disk_image/Cargo.toml index fb8be2c6..c1380d61 100644 --- a/disk_image/Cargo.toml +++ b/disk_image/Cargo.toml @@ -7,3 +7,4 @@ edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +fatfs = "0.3.5" diff --git a/disk_image/src/main.rs b/disk_image/src/main.rs index e7a11a96..ae4097cd 100644 --- a/disk_image/src/main.rs +++ b/disk_image/src/main.rs @@ -1,3 +1,36 @@ +use std::{fs, io, path::Path}; + fn main() { println!("Hello, world!"); } + +fn create_fat_filesystem(fat_path: &Path, efi_file: &Path) { + // retrieve size of `.efi` file and round it up + let efi_size = fs::metadata(&efi_file).unwrap().len(); + let mb = 1024 * 1024; // size of a megabyte + // round it to next megabyte + let efi_size_rounded = ((efi_size - 1) / mb + 1) * mb; + + // create new filesystem image file at the given path and set its length + let fat_file = fs::OpenOptions::new() + .read(true) + .write(true) + .create(true) + .truncate(true) + .open(&fat_path) + .unwrap(); + fat_file.set_len(efi_size_rounded).unwrap(); + + // create new FAT file system and open it + let format_options = fatfs::FormatVolumeOptions::new(); + fatfs::format_volume(&fat_file, format_options).unwrap(); + let filesystem = fatfs::FileSystem::new(&fat_file, fatfs::FsOptions::new()).unwrap(); + + // copy EFI file to FAT filesystem + let root_dir = filesystem.root_dir(); + root_dir.create_dir("efi").unwrap(); + root_dir.create_dir("efi/boot").unwrap(); + let mut bootx64 = root_dir.create_file("efi/boot/bootx64.efi").unwrap(); + bootx64.truncate().unwrap(); + io::copy(&mut fs::File::open(&efi_file).unwrap(), &mut bootx64).unwrap(); +}