feat(windows-drivers): vendor wdk 0.5.1 + add ApiSubset::Iddcx (M1 spike)
windows-drivers / probe-and-proto (push) Successful in 24s
apple / swift (push) Successful in 1m8s
windows-drivers / driver-build (push) Failing after 43s
ci / rust (push) Successful in 1m31s
ci / web (push) Successful in 1m5s
ci / docs-site (push) Successful in 52s
apple / screenshots (push) Failing after 2m35s
windows-host / package (push) Successful in 5m23s
ci / bench (push) Successful in 4m48s
android / android (push) Successful in 10m1s
decky / build-publish (push) Successful in 26s
docker / build-push (--build-arg FEDORA_VERSION=44, ci, ci/fedora-rpm.Dockerfile, punktfunk-fedora44-rpm) (push) Successful in 4s
docker / build-push (., web/Dockerfile, punktfunk-web) (push) Successful in 4s
docker / build-push (ci, ci/fedora-rpm.Dockerfile, punktfunk-fedora-rpm) (push) Successful in 4s
deb / build-publish (push) Successful in 3m29s
docker / build-push (docs-site, docs-site/Dockerfile, punktfunk-docs) (push) Successful in 4s
docker / build-push (ci, ci/rust-ci.Dockerfile, punktfunk-rust-ci) (push) Successful in 2m21s
rpm / build-publish (bazzite, punktfunk-fedora-rpm) (push) Successful in 8m23s
rpm / build-publish (fedora-44, punktfunk-fedora44-rpm) (push) Successful in 8m18s
docker / deploy-docs (push) Successful in 21s

Vendor the published, self-contained windows-drivers-rs 0.5.1 crates
(wdk-build, wdk-sys) under vendor/ and add a first-class ApiSubset::Iddcx that
bindgens iddcx/1.10/IddCx.h in an extra pass reusing bindgen::Builder::wdk_default
(allowlist_file (?i).*iddcx.* — emits only IddCx items; WDF/DXGI types resolve to
the shared base/wdf bindings, type-identity by construction). Mirrors the existing
gpio/hid/spb subsets exactly: wdk-build gets the enum variant + iddcx_headers()
(UMDF-only), wdk-sys gets generate_iddcx + the iddcx feature + pub mod iddcx.
[patch.crates-io] redirects all wdk-sys/wdk-build (incl. wdk 0.4.1 transitive) to
the patched copies. wdk-probe enables the iddcx feature.

MAKE-OR-BREAK: does IddCx.h bindgen in wdk-sys config without a header conflict
(issue #515) + does the generated module compile (type-identity)? CI answers it.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-24 14:12:43 +00:00
parent 6975691f7d
commit 9fd19b90a9
38 changed files with 13208 additions and 5 deletions
@@ -0,0 +1,63 @@
// Copyright (c) Microsoft Corporation
// License: MIT OR Apache-2.0
use std::{
collections::{BTreeMap, HashMap, btree_map, hash_map},
hash::{BuildHasher, Hash},
};
/// Trait for map-like type that is returned by
/// [`metadata::to_map`](crate::metadata::to_map)
/// and [`metadata::to_map_with_prefix`](crate::metadata::to_map_with_prefix).
pub trait Map<K, V>: Default {
/// Creates a new, empty map
#[must_use]
fn new() -> Self {
Self::default()
}
/// Inserts a new key-value pair into the map, or calls a function/closure
/// if the key already exists.
///
/// The function/closure is called with the existing key, the existing
/// value, and the new value it tried to insert. The closure can decide
/// whether the function will return an `Err` or if it will still return a
/// `Ok` despite not inserting the value.
///
/// # Errors
/// This function returns an error if the key already exists and `f` returns
/// an `Err` value
fn insert_or_else<F, E>(&mut self, key: K, value: V, f: F) -> Result<(), E>
where
F: FnMut(&K, &V, V) -> Result<(), E>;
}
impl<K: Eq + Hash, V, S: BuildHasher + Default> Map<K, V> for HashMap<K, V, S> {
fn insert_or_else<F, E>(&mut self, key: K, value: V, mut f: F) -> Result<(), E>
where
F: FnMut(&K, &V, V) -> Result<(), E>,
{
match self.entry(key) {
hash_map::Entry::Occupied(entry) => f(entry.key(), entry.get(), value),
hash_map::Entry::Vacant(entry) => {
entry.insert(value);
Ok(())
}
}
}
}
impl<K: Ord, V> Map<K, V> for BTreeMap<K, V> {
fn insert_or_else<F, E>(&mut self, key: K, value: V, mut f: F) -> Result<(), E>
where
F: FnMut(&K, &V, V) -> Result<(), E>,
{
match self.entry(key) {
btree_map::Entry::Occupied(entry) => f(entry.key(), entry.get(), value),
btree_map::Entry::Vacant(entry) => {
entry.insert(value);
Ok(())
}
}
}
}