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();
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 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()))?;
}
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());
}
}