Skip to content
Draft
Show file tree
Hide file tree
Changes from all 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 @@ -73,6 +73,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 @@ -108,6 +111,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 @@ -132,4 +139,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 @@ -45,6 +45,7 @@ pub struct BuildActionParams<'a> {
pub target_platform: TargetPlatform,
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 @@ -59,6 +60,7 @@ pub struct BuildAction<'a> {
target_platform: TargetPlatform,
features: &'a Features,
verbosity_level: clap_verbosity_flag::Verbosity,
inf2cat_args: Vec<String>,

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

Expand Down Expand Up @@ -107,6 +108,7 @@ pub struct PackageTask<'a> {
arch: &'a CpuArchitecture,
os_mapping: &'a str,
driver_model: DriverConfig,
inf2cat_args: Vec<String>,
target_platform: TargetPlatform,

// Injected deps
Expand Down Expand Up @@ -213,6 +215,7 @@ impl<'a> PackageTask<'a> {
arch: params.target_arch,
os_mapping,
driver_model: params.driver_model,
inf2cat_args: params.inf2cat_args,
target_platform: params.target_platform,
wdk_build,
command_exec,
Expand Down Expand Up @@ -400,18 +403,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("\\\\?\\")
);

if let Err(e) = self.command_exec.run("inf2cat", &args, None, None) {
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());
}

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 @@ -686,6 +694,7 @@ mod tests {
sign_mode: SignMode::Test {
verify_signature: false,
},
inf2cat_args: Vec::new(),
target_platform: TargetPlatform::Universal,
};
let dest_root = target_dir.join(format!("{package_name}_package"));
Expand Down Expand Up @@ -757,6 +766,7 @@ mod tests {
sign_mode: SignMode::Test {
verify_signature: false,
},
inf2cat_args: Vec::new(),
target_platform: TargetPlatform::Universal,
};

Expand Down Expand Up @@ -786,6 +796,7 @@ mod tests {
sign_mode: SignMode::Test {
verify_signature: false,
},
inf2cat_args: Vec::new(),
target_platform: TargetPlatform::Universal,
};

Expand Down Expand Up @@ -824,6 +835,7 @@ mod tests {
sign_mode: SignMode::Test {
verify_signature: false,
},
inf2cat_args: Vec::new(),
target_platform: TargetPlatform::Universal,
};

Expand Down Expand Up @@ -864,6 +876,96 @@ 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(),
target_platform: TargetPlatform::Universal,
};

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()],
target_platform: TargetPlatform::Universal,
};

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

fn assert_infverif_mode_flag(
driver_model: DriverConfig,
target_platform: TargetPlatform,
Expand All @@ -882,6 +984,7 @@ mod tests {
driver_model,
sample_class: false,
sign_mode: SignMode::Off,
inf2cat_args: Vec::new(),
target_platform,
};

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 @@ -1758,6 +1758,7 @@ fn initialize_build_action<'a>(
target_platform: TargetPlatform::Universal,
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