use std::os::windows::ffi::OsStrExt;
use std::path::{Path, PathBuf};
use windows::Win32::System::LibraryLoader::{LOAD_WITH_ALTERED_SEARCH_PATH, LoadLibraryExW};
use windows::Win32::System::SystemInformation::GetSystemDirectoryW;
use windows::core::PCWSTR;
pub const DLLS: [&str; 5] = [
"dxgi.dll",
"d3d10core.dll",
"d3d11.dll",
"d3d12core.dll",
"d3d12.dll",
];
pub fn system() -> PathBuf {
let mut buf = [0u16; 260];
let n = unsafe { GetSystemDirectoryW(Some(&mut buf)) } as usize;
PathBuf::from(String::from_utf16_lossy(&buf[..n]))
}
pub fn load(layer: Option<&Path>) -> Result<(), String> {
let system = system();
let load = |from: &Path| {
let wide: Vec<u16> = from.as_os_str().encode_wide().chain(Some(0)).collect();
unsafe { LoadLibraryExW(PCWSTR(wide.as_ptr()), None, LOAD_WITH_ALTERED_SEARCH_PATH) }
.map_err(|e| format!("load {}: {e}", from.display()))
};
for name in DLLS {
let from = match layer {
Some(dir) if dir.join(name).is_file() => dir.join(name),
_ if matches!(name, "d3d12core.dll" | "d3d10core.dll") => continue,
_ => system.join(name),
};
let module = load(&from)?;
let Some(dir) = layer.filter(|dir| from.parent() == Some(*dir)) else {
continue;
};
for forwarded in unsafe { locum_capture::environment::forwards(module) } {
let beside = dir.join(&forwarded);
if beside.is_file() {
load(&beside)?;
}
}
}
Ok(())
}
#[cfg(test)]
mod tests {
#[test]
fn the_system_runtime_is_loaded_by_path() {
super::load(None).unwrap();
assert_eq!(locum_capture::environment::layers(), Default::default());
}
}