//! Emits the WDK link flags for the cdylib (the same call the gamepad drivers use). If wdk-build adds //! `/INTEGRITYCHECK`, it shows up in the produced DLL's PE DllCharacteristics — which the CI step //! inspects to answer the M0 self-signed-load question. Also links `IddCxStub` so the `iddcx` DDIs the //! probe calls resolve (the M1 link gate). fn main() -> Result<(), wdk_build::ConfigError> { wdk_build::configure_wdk_binary_build()?; link_iddcx_stub(); Ok(()) } /// Link `IddCxStub.lib`. It ships only under the SDK *version* that includes IddCx (e.g. 10.0.26100.0), /// at `Lib\\um\\iddcx\\` — a newer base SDK installed alongside (e.g. 10.0.28000.0) /// has `um\` but no `iddcx`, so we glob for the dir that actually contains the lib rather than /// trusting the max SDK version (the same gotcha the `wdf-umdf` oracle's build script documents). x64 /// only (the Windows host is x64-only). fn link_iddcx_stub() { const ARCH: &str = "x64"; const ROOTS: [&str; 2] = [ r"C:\Program Files (x86)\Windows Kits\10\Lib", r"C:\Program Files\Windows Kits\10\Lib", ]; for root in ROOTS { let Ok(versions) = std::fs::read_dir(root) else { continue; }; for ver in versions.flatten() { let iddcx = ver.path().join("um").join(ARCH).join("iddcx"); let Ok(subdirs) = std::fs::read_dir(&iddcx) else { continue; }; for sub in subdirs.flatten() { if sub.path().join("IddCxStub.lib").is_file() { println!("cargo:rustc-link-search={}", sub.path().display()); println!("cargo:rustc-link-lib=static=IddCxStub"); return; } } } } panic!( "IddCxStub.lib not found under any Windows Kits Lib\\\\um\\{ARCH}\\iddcx\\\\" ); }