diff --git a/packaging/windows/drivers/vendor/wdk-sys/build.rs b/packaging/windows/drivers/vendor/wdk-sys/build.rs index b96d51b..48aebba 100644 --- a/packaging/windows/drivers/vendor/wdk-sys/build.rs +++ b/packaging/windows/drivers/vendor/wdk-sys/build.rs @@ -145,8 +145,6 @@ const ENABLED_API_SUBSETS: &[ApiSubset] = &[ ApiSubset::Storage, #[cfg(feature = "usb")] ApiSubset::Usb, - #[cfg(feature = "iddcx")] - ApiSubset::Iddcx, ]; type GenerateFn = fn(&Path, &Config) -> Result<(), ConfigError>; @@ -356,18 +354,20 @@ fn generate_iddcx(out_path: &Path, config: &Config) -> Result<(), ConfigError> { let bindgen_builder = { bindgen::Builder::wdk_default(config)? - // IddCx headers MUST be in STUB mode (function-table dispatch): IddCxFuncEnum.h otherwise - // errors "IDDCX_VERSION_MAJOR is not defined", cascading into "must use 'struct' tag" on the - // IDARG_* types (their version-gated typedefs get skipped). `#define IDD_STUB` is exactly - // what the proven wdf-umdf oracle uses. Do NOT add WDF_STUB — wdk-sys parses wdf.h - // non-stubbed, and stubbing it only here would desync the WDF types the iddcx module resolves - // against, breaking type-identity. + // IddCx.h MUST be parsed as C++: under wdk-sys's default C mode the IDARG_* typedef names + // hit clang's "must use 'struct' tag" (verified: IddCx.h parses with 0 errors as C++, fails + // as C). `IDD_STUB` puts IddCxFuncEnum.h in table-dispatch mode (else its `#error + // IDDCX_VERSION_MAJOR is not defined` fires — it's inside `#ifndef IDD_STUB`). Matches the + // proven wdf-umdf oracle's `--language=c++` + `#define IDD_STUB`. NOT WDF_STUB (wdk-sys + // parses wdf.h non-stubbed; stubbing only here would desync WDF type-identity). + .clang_arg("--language=c++") .clang_arg("-DIDD_STUB") - .with_codegen_config((CodegenConfig::TYPES | CodegenConfig::VARS).complement()) + // Emit ONLY IddCx items (its types + the IddFunctions table enums + the DDI fn-pointer + // typedefs) and DON'T recurse into referenced WDF/Win/DXGI types — those resolve to wdk-sys's + // shared bindings via `use crate::types::*` in src/iddcx.rs (type-identity, no re-emission, + // no fragile blocklist). Full codegen (no .complement()) so the IDARG_* structs are emitted. + .allowlist_recursively(false) .header_contents("iddcx-input.h", &header_contents) - // Allowlist by the "iddcx" path component (separator-agnostic) so ONLY IddCx items are - // emitted; the WDF/Win/DXGI types they reference RESOLVE to the shared base/wdf bindings - // instead of being redefined. .allowlist_file("(?i).*iddcx.*") }; trace!(bindgen_builder = ?bindgen_builder);