Skip to content
Draft
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion crates/cargo-wdk/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,9 @@ Options:
--locked Assert that `Cargo.lock` will remain unchanged
-h, --help Print help

Inf2Cat Options:
--inf2cat-args <ARGS> Additional arguments to forward to inf2cat

Feature Selection:
--all-features Activate all available features
--no-default-features Do not activate the `default` feature
Expand Down Expand Up @@ -106,6 +109,10 @@ If the `--verify-signature` flag is provided, the signatures are verified after

`--verify-signature` cannot be combined with `--sign-mode=off` because if signing is off there is nothing to verify. Passing both will cause `build` to fail with an error.

#### Customizing `inf2cat` arguments

To target a specific set of Windows versions or pass any additional switches other than `/driver`, you can use `--inf2cat-args` with a string of the arguments to passthrough to `inf2cat` (e.g '/os:10_x64,10_CO_X64 /verbose'). Supplying `/driver:` (or its `/drv:` alias) yourself is rejected since `cargo-wdk` provides it.

#### Examples

- To build a driver project with default options, navigate to the root of the project and run:
Expand All @@ -130,4 +137,4 @@ If the `--verify-signature` flag is provided, the signatures are verified after

```pwsh
cargo wdk build --sign-mode off
```
```
4 changes: 4 additions & 0 deletions crates/cargo-wdk/src/actions/build/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ pub struct BuildActionParams<'a> {
pub locked: bool,
pub features: &'a Features,
pub verbosity_level: clap_verbosity_flag::Verbosity,
pub inf2cat_args: Vec<String>,
}

/// Action that orchestrates the build and package of a driver project. Build is
Expand All @@ -57,6 +58,7 @@ pub struct BuildAction<'a> {
locked: bool,
features: &'a Features,
verbosity_level: clap_verbosity_flag::Verbosity,
inf2cat_args: Vec<String>,

// Injected deps
wdk_build: &'a WdkBuild,
Expand Down Expand Up @@ -104,6 +106,7 @@ impl<'a> BuildAction<'a> {
locked: params.locked,
features: params.features,
verbosity_level: params.verbosity_level,
inf2cat_args: params.inf2cat_args.clone(),
wdk_build,
command_exec,
fs,
Expand Down Expand Up @@ -407,6 +410,7 @@ impl<'a> BuildAction<'a> {
sign_mode: self.sign_mode,
sample_class: self.is_sample_class,
driver_model,
inf2cat_args: self.inf2cat_args.clone(),
},
self.wdk_build,
self.command_exec,
Expand Down
122 changes: 111 additions & 11 deletions crates/cargo-wdk/src/actions/build/package_task.rs
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ pub struct PackageTaskParams<'a> {
pub sign_mode: SignMode,
pub sample_class: bool,
pub driver_model: DriverConfig,
pub inf2cat_args: Vec<String>,
}

/// Supports low level driver packaging operations
Expand Down Expand Up @@ -87,6 +88,7 @@ pub struct PackageTask<'a> {
arch: &'a CpuArchitecture,
os_mapping: &'a str,
driver_model: DriverConfig,
inf2cat_args: Vec<String>,

// Injected deps
wdk_build: &'a WdkBuild,
Expand Down Expand Up @@ -192,6 +194,7 @@ impl<'a> PackageTask<'a> {
arch: params.target_arch,
os_mapping,
driver_model: params.driver_model,
inf2cat_args: params.inf2cat_args,
wdk_build,
command_exec,
fs,
Expand Down Expand Up @@ -378,18 +381,23 @@ impl<'a> PackageTask<'a> {

fn run_inf2cat(&self) -> Result<(), PackageTaskError> {
info!("Running inf2cat");
let args = [
&format!(
"/driver:{}",
self.dest_root_package_folder
.to_string_lossy()
.trim_start_matches("\\\\?\\")
),
&format!("/os:{}", self.os_mapping),
"/uselocaltime",
];
let driver_arg = format!(
"/driver:{}",
self.dest_root_package_folder
.to_string_lossy()
.trim_start_matches("\\\\?\\")
);

let mut args: Vec<String> = vec![driver_arg];
if self.inf2cat_args.is_empty() {
args.push(format!("/os:{}", self.os_mapping));
args.push("/uselocaltime".to_string());
} else {
args.extend(self.inf2cat_args.iter().cloned());
}
Comment thread
svasista-ms marked this conversation as resolved.

if let Err(e) = self.command_exec.run("inf2cat", &args, None, None) {
let arg_refs: Vec<&str> = args.iter().map(String::as_str).collect();
if let Err(e) = self.command_exec.run("inf2cat", &arg_refs, None, None) {
return Err(PackageTaskError::Inf2CatCommand(e));
}

Expand Down Expand Up @@ -665,6 +673,7 @@ mod tests {
sign_mode: SignMode::Test {
verify_signature: false,
},
inf2cat_args: Vec::new(),
};
let dest_root = target_dir.join(format!("{package_name}_package"));

Expand Down Expand Up @@ -735,6 +744,7 @@ mod tests {
sign_mode: SignMode::Test {
verify_signature: false,
},
inf2cat_args: Vec::new(),
};

let command_exec = CommandExec::default();
Expand Down Expand Up @@ -763,6 +773,7 @@ mod tests {
sign_mode: SignMode::Test {
verify_signature: false,
},
inf2cat_args: Vec::new(),
};

let command_exec = CommandExec::default();
Expand Down Expand Up @@ -800,6 +811,7 @@ mod tests {
sign_mode: SignMode::Test {
verify_signature: false,
},
inf2cat_args: Vec::new(),
};

let wdk_build = WdkBuild::default();
Expand Down Expand Up @@ -839,6 +851,94 @@ mod tests {
}
}

#[test]
fn run_inf2cat_with_no_args_uses_arch_os_and_uselocaltime() {
let working_dir = PathBuf::from("C:/abs/driver");
let target_dir = PathBuf::from("C:/abs/driver/target/debug");
let arch = CpuArchitecture::Amd64;

let params = PackageTaskParams {
package_name: "driver",
working_dir: &working_dir,
target_dir: &target_dir,
target_arch: &arch,
driver_model: DriverConfig::Kmdf(KmdfConfig::default()),
sample_class: false,
sign_mode: SignMode::Test {
verify_signature: false,
},
inf2cat_args: Vec::new(),
};

let wdk_build = WdkBuild::default();
let fs = Fs::default();
let mut command_exec = CommandExec::default();
command_exec
.expect_run()
.withf(move |cmd: &str, args: &[&str], _, _| {
cmd == "inf2cat"
&& args[0].starts_with("/driver:")
&& args.contains(&"/os:10_x64")
&& args.contains(&"/uselocaltime")
})
.once()
.return_once(|_, _, _, _| {
Ok(Output {
status: ExitStatus::default(),
stdout: vec![],
stderr: vec![],
})
});

let task = PackageTask::new(params, &wdk_build, &command_exec, &fs);
assert!(task.run_inf2cat().is_ok());
}

#[test]
fn run_inf2cat_with_custom_args_forwards_them_verbatim() {
let working_dir = PathBuf::from("C:/abs/driver");
let target_dir = PathBuf::from("C:/abs/driver/target/debug");
let arch = CpuArchitecture::Amd64;

let params = PackageTaskParams {
package_name: "driver",
working_dir: &working_dir,
target_dir: &target_dir,
target_arch: &arch,
driver_model: DriverConfig::Kmdf(KmdfConfig::default()),
sample_class: false,
sign_mode: SignMode::Test {
verify_signature: false,
},
inf2cat_args: vec!["/os:10_x64,10_CO_X64".to_string(), "/verbose".to_string()],
};

let wdk_build = WdkBuild::default();
let fs = Fs::default();
let mut command_exec = CommandExec::default();
command_exec
.expect_run()
.withf(move |cmd: &str, args: &[&str], _, _| {
cmd == "inf2cat"
&& args[0].starts_with("/driver:")
&& args.contains(&"/os:10_x64,10_CO_X64")
&& args.contains(&"/verbose")
&& !args.contains(&"/uselocaltime")
&& !args.contains(&"/os:10_x64")
})
.once()
.return_once(|_, _, _, _| {
Ok(Output {
status: ExitStatus::default(),
stdout: vec![],
stderr: vec![],
})
});

let task = PackageTask::new(params, &wdk_build, &command_exec, &fs);
assert!(task.run_inf2cat().is_ok());
}

mod named_mutex {
use std::{
ffi::CString,
Expand Down
1 change: 1 addition & 0 deletions crates/cargo-wdk/src/actions/build/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1680,6 +1680,7 @@ fn initialize_build_action<'a>(
locked: test_build_action.locked,
features: &test_build_action.features,
verbosity_level: clap_verbosity_flag::Verbosity::new(1, 0),
inf2cat_args: Vec::new(),
},
test_build_action.mock_wdk_build_provider(),
test_build_action.mock_run_command(),
Expand Down
Loading
Loading