diff --git a/src/main.rs b/src/main.rs index e1bb776..acfc649 100644 --- a/src/main.rs +++ b/src/main.rs @@ -17,6 +17,8 @@ fn main() { let amd64_basedir = iso_mount_dir.join("amd64"); let i386_basedir = iso_mount_dir.join("i386"); + let x64_edition = amd64_basedir.is_dir(); + { let mut ntdetect = File::open(amd64_basedir.join("ntdetect.com")) .or(File::open(i386_basedir.join("ntdetect.com"))) @@ -76,24 +78,34 @@ fn main() { let rdisk0 = b"rdisk(0)".as_slice(); let win_nt_bt = b"$win_nt$.~bt".as_slice(); let win_nt_bt_caps = b"$WIN_NT$.~BT".as_slice(); - let amd64_bytes = b"amd64"; + let new_dir_bytes = b"i386"; + let new_dir_bytes_x64 = b"amd64"; for index in 0..(bootmgr_contents.len() - win_nt_bt.len()) { - if &bootmgr_contents[index..index+rdisk0.len()] == rdisk0 { + if &bootmgr_contents[index..index + rdisk0.len()] == rdisk0 { println!("BOOTMGR: {index:#010x} Patching rdisk(0) --> rdisk(1)"); - bootmgr_contents[index+6] = 0x31; + bootmgr_contents[index + 6] = 0x31; } - // $WIN_NT$_~BT -> i386/amd64 - if &bootmgr_contents[index..index+win_nt_bt.len()] == win_nt_bt - || &bootmgr_contents[index..index+win_nt_bt.len()] == win_nt_bt_caps { - println!("BOOTMGR: {index:#010x} Patching {:?} --> \"amd64\"", bootmgr_contents[index..index+win_nt_bt.len()].to_vec()); - for i in 0..amd64_bytes.len() { - bootmgr_contents[index+i] = amd64_bytes[i]; + if &bootmgr_contents[index..index + win_nt_bt.len()] == win_nt_bt + || &bootmgr_contents[index..index + win_nt_bt.len()] == win_nt_bt_caps { + if x64_edition { + println!("BOOTMGR: {index:#010x} Patching {:?} --> \"amd64\"", bootmgr_contents[index..index + win_nt_bt.len()].to_vec()); + for i in 0..new_dir_bytes_x64.len() { + bootmgr_contents[index + i] = new_dir_bytes_x64[i]; + } + bootmgr_contents[index + new_dir_bytes_x64.len()] = 0; + bootmgr_contents[index + new_dir_bytes_x64.len()] = bootmgr_contents[index + win_nt_bt.len()]; + bootmgr_contents[index + new_dir_bytes_x64.len() + 1] = 0; + } else { + println!("BOOTMGR: {index:#010x} Patching {:?} --> \"i386\"", bootmgr_contents[index..index + win_nt_bt.len()].to_vec()); + for i in 0..new_dir_bytes.len() { + bootmgr_contents[index + i] = new_dir_bytes[i]; + } + bootmgr_contents[index + new_dir_bytes.len()] = 0; + bootmgr_contents[index + new_dir_bytes.len()] = bootmgr_contents[index + win_nt_bt.len()]; + bootmgr_contents[index + new_dir_bytes.len() + 1] = 0; } - bootmgr_contents[index + amd64_bytes.len()] = 0; - bootmgr_contents[index + amd64_bytes.len()] = bootmgr_contents[index + win_nt_bt.len()]; - bootmgr_contents[index + amd64_bytes.len() + 1] = 0; } }