Skip to content

add kernel sync primitives#684

Open
ntoskrnl7 wants to merge 3 commits into
microsoft:mainfrom
ntoskrnl7:ntoskrnl7/wdk-sync-primitives
Open

add kernel sync primitives#684
ntoskrnl7 wants to merge 3 commits into
microsoft:mainfrom
ntoskrnl7:ntoskrnl7/wdk-sync-primitives

Conversation

@ntoskrnl7

Copy link
Copy Markdown

Summary

Adds safe Rust synchronization wrappers for common kernel-mode shared/exclusive locks:

  • wdk::sync::RwLock<T> backed by ERESOURCE
  • wdk::sync::PushLock<T> backed by EX_PUSH_LOCK
  • wdk::sync::RwSpinLock<T> backed by EX_SPIN_LOCK

The wrappers provide RAII read/write guards, document IRQL constraints, and expose get_mut for exclusive mutable access without locking.

Details

RwLock allocates the backing ERESOURCE separately so the kernel object has a stable address for its lifetime. PushLock wraps the modern ExAcquirePushLock*Ex APIs. RwSpinLock includes normal acquire methods that restore IRQL on drop plus *_at_dpc_level methods for callers already at DISPATCH_LEVEL.

The WDM sample driver now demonstrates all three wrappers. WDM config tests cover guard access and get_mut, with matching wdk-sys test stubs for the kernel routines used by these wrappers.

Validation

  • cargo +1.91.0 check -p wdk
  • cargo +1.91.0 test --manifest-path tests\config-wdm\Cargo.toml
  • cargo +1.91.0 build --manifest-path examples\sample-wdm-driver\Cargo.toml
  • cargo +1.91.0 clippy -p wdk --all-targets -- -D warnings
  • cargo +1.91.0 clippy --manifest-path tests\config-wdm\Cargo.toml --all-targets -- -D warnings
  • cargo +1.91.0 clippy --manifest-path examples\sample-wdm-driver\Cargo.toml --all-targets -- -D warnings -A clippy::multiple-crate-versions

The sample driver clippy command allows multiple-crate-versions because the current dependency graph includes windows-sys through both fs4 and build-time dependencies.

Copilot AI review requested due to automatic review settings June 18, 2026 18:22
@ntoskrnl7

Copy link
Copy Markdown
Author

@microsoft-github-policy-service agree

@ntoskrnl7 ntoskrnl7 changed the title [codex] add kernel sync primitives add kernel sync primitives Jun 18, 2026

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR adds a new wdk::sync module providing safe, RAII-based wrappers around common kernel-mode shared/exclusive synchronization primitives for WDM/KMDF, along with WDM sample usage and test coverage via wdk-sys test stubs.

Changes:

  • Introduces wdk::sync::{RwLock, PushLock, RwSpinLock} with guard types and IRQL/critical-region handling.
  • Updates wdk-sys test stubs and WDM config tests to enable exercising these primitives in unit tests.
  • Extends the sample WDM driver to demonstrate the new locks and improves UNICODE_STRING handling.

Reviewed changes

Copilot reviewed 9 out of 10 changed files in this pull request and generated 7 comments.

Show a summary per file
File Description
tests/config-wdm/tests/rw_lock_tests.rs Adds WDM config tests covering guard access and get_mut for the new sync wrappers.
tests/config-wdm/Cargo.toml Adds dev-deps on wdk/wdk-sys(test-stubs) and a nightly feature passthrough.
tests/config-wdm/Cargo.lock Updates lockfile to include the new dependency graph (lockfile v4).
examples/sample-wdm-driver/src/lib.rs Demonstrates RwLock, PushLock, and RwSpinLock; refines registry path parsing.
crates/wdk/src/sync/rw_spin_lock.rs Implements RwSpinLock<T> backed by EX_SPIN_LOCK with IRQL-restoring guards.
crates/wdk/src/sync/rw_lock.rs Implements RwLock<T> backed by heap-allocated ERESOURCE with read/write guards and try-acquire.
crates/wdk/src/sync/push_lock.rs Implements PushLock<T> backed by EX_PUSH_LOCK with critical-region-managed guards.
crates/wdk/src/sync/mod.rs Adds module-level docs and re-exports for the new sync primitives.
crates/wdk/src/lib.rs Exposes wdk::sync (WDM/KMDF only) and enables alloc at crate root for those targets.
crates/wdk-sys/src/test_stubs.rs Adds stubs for the kernel routines needed to link/run tests for the new wrappers.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread crates/wdk/src/sync/rw_lock.rs
Comment thread crates/wdk/src/sync/rw_lock.rs
Comment thread crates/wdk/src/sync/rw_lock.rs
Comment thread crates/wdk/src/sync/push_lock.rs
Comment thread crates/wdk/src/sync/push_lock.rs
Comment thread crates/wdk/src/sync/rw_spin_lock.rs
Comment thread crates/wdk/src/sync/rw_spin_lock.rs
@ntoskrnl7
ntoskrnl7 force-pushed the ntoskrnl7/wdk-sync-primitives branch from 62f09d1 to 6bbf7bc Compare June 18, 2026 18:33
@ntoskrnl7
ntoskrnl7 marked this pull request as ready for review June 18, 2026 18:39
Copilot AI review requested due to automatic review settings June 18, 2026 18:39

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 9 out of 10 changed files in this pull request and generated no new comments.

@ntoskrnl7
ntoskrnl7 force-pushed the ntoskrnl7/wdk-sync-primitives branch from 6bbf7bc to 66679d3 Compare June 19, 2026 05:29
@ntoskrnl7

ntoskrnl7 commented Jun 19, 2026

Copy link
Copy Markdown
Author

Addressed the Copilot review feedback and folded the cleanup into the existing feature commit.

  • Split the RwLock::drop unsafe operations into separate unsafe blocks.
  • Replaced the guard marker with a private NotSend marker based on PhantomData<alloc::rc::Rc<()>> instead of negative Send impls, since negative impls are not stable Rust.
  • Clarified the PushLock and RwSpinLock WDK usage constraints in the public docs.
  • Renamed the WDM sync test file to sync_tests.rs now that it covers all three sync wrappers.

Copilot AI review requested due to automatic review settings July 14, 2026 18:48

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 9 out of 10 changed files in this pull request and generated 6 comments.

Comment thread crates/wdk-sys/src/test_stubs.rs Outdated
Comment thread crates/wdk-sys/src/test_stubs.rs Outdated
Comment thread crates/wdk-sys/src/test_stubs.rs Outdated
Comment thread crates/wdk-sys/src/test_stubs.rs Outdated
Comment thread crates/wdk-sys/src/test_stubs.rs Outdated
Comment thread crates/wdk/src/sync/rw_spin_lock.rs
Copilot AI review requested due to automatic review settings July 14, 2026 20:33
@ntoskrnl7

Copy link
Copy Markdown
Author

Addressed the latest review feedback in f2f74d4.

  • Changed all newly added push-lock and EX_SPIN_LOCK test stubs to extern system so their ABI matches the WDK exports, including 32-bit Windows targets.
  • Added config-WDM coverage for RwSpinLock::read_at_dpc_level and write_at_dpc_level, including guard dereference/mutation and the drop/release paths.
  • git diff --check passes.

I could not run cargo fmt/test/clippy locally because the available environment does not have a Rust/Cargo toolchain installed; CI should provide the executable verification.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 9 out of 10 changed files in this pull request and generated 1 comment.

Comment on lines +205 to +215
// SAFETY: The resource was initialized by `try_new`, is owned by this
// `RwLock`, and no guards can outlive `self`.
unsafe {
let _ = ExDeleteResourceLite(self.resource.as_ptr());
}

// SAFETY: `self.resource` was allocated by `allocate_resource` and has
// not already been deallocated.
unsafe {
deallocate_resource(self.resource);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants