summaryrefslogtreecommitdiff
path: root/crates/windows-kernel-rs/examples/creating_devices/src
diff options
context:
space:
mode:
authorFuwn <[email protected]>2022-01-04 13:48:00 -0800
committerFuwn <[email protected]>2022-01-04 13:48:00 -0800
commitc33b9e296ab9563f2b180a8fa63155665055261e (patch)
tree086cf2702939fd25769fea83e117d7058af2e75a /crates/windows-kernel-rs/examples/creating_devices/src
parentfix(makefile.toml): tidy up (diff)
downloaddriver-c33b9e296ab9563f2b180a8fa63155665055261e.tar.xz
driver-c33b9e296ab9563f2b180a8fa63155665055261e.zip
feat(examples): lots of new examples
Thanks, StephanvanSchaik.
Diffstat (limited to 'crates/windows-kernel-rs/examples/creating_devices/src')
-rw-r--r--crates/windows-kernel-rs/examples/creating_devices/src/lib.rs80
1 files changed, 80 insertions, 0 deletions
diff --git a/crates/windows-kernel-rs/examples/creating_devices/src/lib.rs b/crates/windows-kernel-rs/examples/creating_devices/src/lib.rs
new file mode 100644
index 0000000..119f9b4
--- /dev/null
+++ b/crates/windows-kernel-rs/examples/creating_devices/src/lib.rs
@@ -0,0 +1,80 @@
+#![no_std]
+#![feature(lang_items, const_extern_fn)]
+#![deny(
+ warnings,
+ nonstandard_style,
+ unused,
+ future_incompatible,
+ rust_2018_idioms
+)]
+#![deny(clippy::all, clippy::nursery, clippy::pedantic)]
+
+use windows_kernel_rs::{
+ device::{
+ Completion,
+ Device,
+ DeviceDoFlags,
+ DeviceFlags,
+ DeviceOperations,
+ DeviceType,
+ RequestError,
+ },
+ kernel_module,
+ println,
+ request::IoRequest,
+ Access,
+ Driver,
+ Error,
+ KernelModule,
+ SymbolicLink,
+};
+
+struct MyDevice;
+
+impl DeviceOperations for MyDevice {
+ fn create(&mut self, _device: &Device, request: IoRequest) -> Result<Completion, RequestError> {
+ println!("userspace opened the device");
+
+ Ok(Completion::Complete(0, request))
+ }
+
+ fn close(&mut self, _device: &Device, request: IoRequest) -> Result<Completion, RequestError> {
+ println!("userspace closed the device");
+
+ Ok(Completion::Complete(0, request))
+ }
+
+ fn cleanup(&mut self, _device: &Device, request: IoRequest) -> Result<Completion, RequestError> {
+ println!("device is no longer in use by userspace");
+
+ Ok(Completion::Complete(0, request))
+ }
+}
+
+struct Module {
+ _device: Device,
+ _symbolic_link: SymbolicLink,
+}
+
+impl KernelModule for Module {
+ fn init(mut driver: Driver, _: &str) -> Result<Self, Error> {
+ let device = driver.create_device(
+ "\\Device\\Example",
+ DeviceType::Unknown,
+ DeviceFlags::SECURE_OPEN,
+ DeviceDoFlags::DO_BUFFERED_IO,
+ Access::NonExclusive,
+ MyDevice,
+ )?;
+ let symbolic_link = SymbolicLink::new("\\??\\Example", "\\Device\\Example")?;
+
+ Ok(Module {
+ _device: device,
+ _symbolic_link: symbolic_link,
+ })
+ }
+
+ fn cleanup(&mut self, _driver: Driver) {}
+}
+
+kernel_module!(Module);