Init.
This commit is contained in:
parent
797345abf6
commit
97595e4071
2 changed files with 113 additions and 0 deletions
8
Cargo.toml
Normal file
8
Cargo.toml
Normal file
|
@ -0,0 +1,8 @@
|
|||
[package]
|
||||
name = "rsfus"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
105
src/main.rs
Normal file
105
src/main.rs
Normal file
|
@ -0,0 +1,105 @@
|
|||
use std::env;
|
||||
use std::fs::File;
|
||||
use std::io::{Read, Write};
|
||||
use std::path::Path;
|
||||
|
||||
fn main() {
|
||||
let args: Vec<String> = env::args().collect();
|
||||
|
||||
let iso_mount_dir = Path::new(args.get(1)
|
||||
.expect("Arguments: rsfus (path to XP ISO mount)"))
|
||||
.canonicalize().expect("Can't canonicalize path to XP ISO mount.");
|
||||
|
||||
if !iso_mount_dir.exists() || !iso_mount_dir.is_dir() {
|
||||
panic!("XP ISO mount is not a directory.");
|
||||
}
|
||||
|
||||
let amd64_basedir = iso_mount_dir.join("amd64");
|
||||
let i386_basedir = iso_mount_dir.join("i386");
|
||||
|
||||
{
|
||||
let mut ntdetect = File::open(amd64_basedir.join("ntdetect.com"))
|
||||
.or(File::open(i386_basedir.join("ntdetect.com")))
|
||||
.expect("Can't open file ntdetect.com.");
|
||||
let mut ntdetect_copy = File::create(iso_mount_dir.join("ntdetect.com"))
|
||||
.expect("Can't create file ntdetect.com.");
|
||||
|
||||
let mut ntdetect_contents = Vec::new();
|
||||
println!("Reading {ntdetect:?}");
|
||||
ntdetect.read_to_end(&mut ntdetect_contents).expect("Can't read ntdetect.com.");
|
||||
println!("Writing {ntdetect_copy:?}");
|
||||
ntdetect_copy.write_all(&ntdetect_contents).expect("Can't write to ntdetect.com.");
|
||||
}
|
||||
|
||||
{
|
||||
let mut txtsetup = File::open(amd64_basedir.join("txtsetup.sif"))
|
||||
.or(File::open(i386_basedir.join("txtsetup.sif")))
|
||||
.expect("Can't open file txtsetup.sif");
|
||||
let mut txtsetup_copy = File::create(iso_mount_dir.join("txtsetup.sif"))
|
||||
.expect("Can't create file txtsetup.sif");
|
||||
|
||||
let mut txtsetup_contents = String::new();
|
||||
println!("Reading {txtsetup:?}");
|
||||
txtsetup.read_to_string(&mut txtsetup_contents).expect("Can't read from txtsetup.sif.");
|
||||
let mut txtsetup_lines: Vec<&str> = Vec::new();
|
||||
for line in txtsetup_contents.lines() {
|
||||
txtsetup_lines.push(line);
|
||||
if line == "[SetupData]" {
|
||||
println!("TXTSETP: Found [SetupData]");
|
||||
txtsetup_lines.push(r#"SetupSourceDevice = "\device\harddisk1\partition1""#);
|
||||
}
|
||||
}
|
||||
println!("Writing {txtsetup_copy:?}");
|
||||
txtsetup_copy.write_all(txtsetup_lines.join("\r\n").as_bytes())
|
||||
.expect("Couldn't write to txtsetup.sif.");
|
||||
}
|
||||
|
||||
{
|
||||
let mut bootmgr = File::open(amd64_basedir.join("setupldr.bin"))
|
||||
.or(File::open(i386_basedir.join("setupldr.bin")))
|
||||
.expect("Can't open file setupldr.bin");
|
||||
let mut bootmgr_copy = File::create(iso_mount_dir.join("BOOTMGR"))
|
||||
.expect("Can't create file BOOTMGR");
|
||||
|
||||
let mut bootmgr_contents = Vec::new();
|
||||
println!("Reading {bootmgr:?}");
|
||||
bootmgr.read_to_end(&mut bootmgr_contents).expect("Can't read from setupldr.bin");
|
||||
|
||||
if bootmgr_contents.len() > 0x2061
|
||||
&& bootmgr_contents[0x2060] == 0x74
|
||||
&& bootmgr_contents[0x2061] == 0x03 {
|
||||
bootmgr_contents[0x2060] = 0xeb;
|
||||
bootmgr_contents[0x2061] = 0x1a;
|
||||
println!("BOOTMGR: 0x00002060 0x74 0x03 --> 0xeb 0x1a (Disable Win2k3 CRC check)");
|
||||
}
|
||||
|
||||
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";
|
||||
|
||||
for index in 0..(bootmgr_contents.len() - win_nt_bt.len()) {
|
||||
if &bootmgr_contents[index..index+rdisk0.len()] == rdisk0 {
|
||||
println!("BOOTMGR: {index:#010x} Patching rdisk(0) --> rdisk(1)");
|
||||
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];
|
||||
}
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
println!("Writing {bootmgr_copy:?}");
|
||||
bootmgr_copy.write_all(bootmgr_contents.as_slice()).expect("Couldn't write to BOOTMGR");
|
||||
}
|
||||
|
||||
println!("Done! :D");
|
||||
}
|
Loading…
Reference in a new issue