Files
overlord/BackstageInjection-Rust/build.rs
T

69 lines
2.4 KiB
Rust
Raw Normal View History

2026-08-19 18:16:28 -05:00
use std::time::{SystemTime, UNIX_EPOCH};
2026-08-19 17:57:55 -05:00
fn main() {
let root_dir = std::env::var("CARGO_MANIFEST_DIR").unwrap();
let mh_dir = std::path::Path::new(&root_dir).join("vendor/minhook");
let mh_src = mh_dir.join("src");
let target = std::env::var("TARGET").unwrap();
let arch = target.splitn(4, '-').next().unwrap();
let hde = if arch == "i686" {
"hde/hde32.c"
} else if arch == "x86_64" {
"hde/hde64.c"
} else {
panic!("unsupported arch {arch}");
};
cc::Build::new()
.flag("-ffunction-sections")
.flag("-fdata-sections")
.file(mh_src.join("buffer.c"))
.file(mh_src.join("hook.c"))
.file(mh_src.join("trampoline.c"))
.file(mh_src.join(hde))
.compile("libminhook.a");
2026-08-19 18:16:28 -05:00
generate_loader_entry();
2026-08-19 17:57:55 -05:00
println!("cargo:rerun-if-changed=vendor/minhook");
2026-08-19 18:16:28 -05:00
println!("cargo:rerun-if-changed=build.rs");
}
fn generate_loader_entry() {
2026-08-20 09:01:27 -05:00
let name = match std::env::var("BACKSTAGE_LOADER_EXPORT").ok().as_deref() {
Some("ReflectiveLoader") => "ReflectiveLoader".to_string(),
Some(value) => panic!("unsupported BACKSTAGE_LOADER_EXPORT value: {value}"),
None => {
let seed = std::env::var("BACKSTAGE_LOADER_SEED")
.ok()
.and_then(|value| value.parse::<u64>().ok())
.unwrap_or_else(|| {
SystemTime::now()
.duration_since(UNIX_EPOCH)
.unwrap()
.as_nanos() as u64
^ (std::process::id() as u64).wrapping_mul(0x9E37_79B9_7F4A_7C15)
});
format!("x{:06x}", seed & 0xFFFF_FF)
}
};
2026-08-19 18:16:28 -05:00
let src = format!(
"// Generated by build.rs — do not edit.\n\
2026-08-20 09:01:27 -05:00
// Version-selected reflective loader export name.\n\
2026-08-19 18:16:28 -05:00
pub(crate) const LOADER_EXPORT: &[u8] = b\"{name}\\0\";\n\
\n\
#[unsafe(no_mangle)]\n\
pub extern \"system\" fn {name}(lpParameter: usize) -> usize {{\n\
\x20 crate::reflective::loader_impl(lpParameter)\n\
}}\n"
);
let out_dir = std::env::var("OUT_DIR").unwrap();
std::fs::write(std::path::Path::new(&out_dir).join("loader_entry.rs"), src)
.expect("failed to write loader_entry.rs");
2026-08-20 09:01:27 -05:00
println!("cargo:rerun-if-env-changed=BACKSTAGE_LOADER_EXPORT");
println!("cargo:rerun-if-env-changed=BACKSTAGE_LOADER_SEED");
}