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 10:57:56 -05:00
|
|
|
// The loader export is always a per-build randomized `x<hex>` name. The
|
|
|
|
|
// legacy fixed `ReflectiveLoader` export is no longer supported.
|
|
|
|
|
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)
|
|
|
|
|
});
|
|
|
|
|
let name = 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_SEED");
|
|
|
|
|
}
|