diff options
| author | Fuwn <[email protected]> | 2022-01-04 13:48:00 -0800 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2022-01-04 13:48:00 -0800 |
| commit | c33b9e296ab9563f2b180a8fa63155665055261e (patch) | |
| tree | 086cf2702939fd25769fea83e117d7058af2e75a /crates/windows-kernel-rs/examples | |
| parent | fix(makefile.toml): tidy up (diff) | |
| download | driver-c33b9e296ab9563f2b180a8fa63155665055261e.tar.xz driver-c33b9e296ab9563f2b180a8fa63155665055261e.zip | |
feat(examples): lots of new examples
Thanks, StephanvanSchaik.
Diffstat (limited to 'crates/windows-kernel-rs/examples')
9 files changed, 357 insertions, 0 deletions
diff --git a/crates/windows-kernel-rs/examples/build.rs b/crates/windows-kernel-rs/examples/build.rs new file mode 100644 index 0000000..362047d --- /dev/null +++ b/crates/windows-kernel-rs/examples/build.rs @@ -0,0 +1 @@ +fn main() { windows_kernel_build::build().unwrap() } diff --git a/crates/windows-kernel-rs/examples/creating_devices/Cargo.toml b/crates/windows-kernel-rs/examples/creating_devices/Cargo.toml new file mode 100644 index 0000000..1a7fbc4 --- /dev/null +++ b/crates/windows-kernel-rs/examples/creating_devices/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "creating_devices" +version = "0.1.0" +authors = ["Fuwn <[email protected]>"] +edition = "2021" +publish = false +build = "../build.rs" + +[lib] +crate-type = ["cdylib"] + +[build-dependencies] +windows-kernel-build = { path = "../../../windows-kernel-build" } + +[dependencies] +widestring = { version = "0.4", default-features = false, features = ["alloc"] } +windows-kernel-rs = { path = "../../../windows-kernel-rs" } +windows-kernel-sys = { path = "../../../windows-kernel-sys" } 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); diff --git a/crates/windows-kernel-rs/examples/io_controls/Cargo.toml b/crates/windows-kernel-rs/examples/io_controls/Cargo.toml new file mode 100644 index 0000000..1d8e6a5 --- /dev/null +++ b/crates/windows-kernel-rs/examples/io_controls/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "io_controls" +version = "0.1.0" +authors = ["Fuwn <[email protected]>"] +edition = "2021" +publish = false +build = "../build.rs" + +[lib] +crate-type = ["cdylib"] + +[build-dependencies] +windows-kernel-build = { path = "../../../windows-kernel-build" } + +[dependencies] +widestring = { version = "0.4", default-features = false, features = ["alloc"] } +windows-kernel-rs = { path = "../../../windows-kernel-rs" } +windows-kernel-sys = { path = "../../../windows-kernel-sys" } diff --git a/crates/windows-kernel-rs/examples/io_controls/src/lib.rs b/crates/windows-kernel-rs/examples/io_controls/src/lib.rs new file mode 100644 index 0000000..15e59e9 --- /dev/null +++ b/crates/windows-kernel-rs/examples/io_controls/src/lib.rs @@ -0,0 +1,98 @@ +#![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}; +use windows_kernel_rs::request::IoControlRequest; +use windows_kernel_rs::{kernel_module, println}; +use windows_kernel_rs::{Access, Driver, Error, KernelModule, RequiredAccess, SymbolicLink}; + +struct MyDevice { + value: u32, +} + +const IOCTL_PRINT_VALUE: u32 = 0x800; +const IOCTL_READ_VALUE: u32 = 0x801; +const IOCTL_WRITE_VALUE: u32 = 0x802; + +impl MyDevice { + fn print_value(&mut self, _request: &IoControlRequest) -> Result<u32, Error> { + println!("value: {}", self.value); + + Ok(0) + } + + fn read_value(&mut self, request: &IoControlRequest) -> Result<u32, Error> { + let mut user_ptr = request.user_ptr(); + + user_ptr.write(&self.value)?; + + Ok(core::mem::size_of::<u32>() as u32) + } + + fn write_value(&mut self, request: &IoControlRequest) -> Result<u32, Error> { + let user_ptr = request.user_ptr(); + + self.value = user_ptr.read()?; + + Ok(0) + } +} + +impl DeviceOperations for MyDevice { + fn ioctl(&mut self, _device: &Device, request: IoControlRequest) -> Result<Completion, RequestError> { + let result = match request.function() { + (_, IOCTL_PRINT_VALUE) => + self.print_value(&request), + (RequiredAccess::READ_DATA, IOCTL_READ_VALUE) => + self.read_value(&request), + (RequiredAccess::WRITE_DATA, IOCTL_WRITE_VALUE) => + self.write_value(&request), + _ => Err(Error::INVALID_PARAMETER), + }; + + match result { + Ok(size) => Ok(Completion::Complete(size, request.into())), + Err(e) => Err(RequestError(e, request.into())), + } + } +} + +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 { + value: 0, + }, + )?; + 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); diff --git a/crates/windows-kernel-rs/examples/reading_and_writing/Cargo.toml b/crates/windows-kernel-rs/examples/reading_and_writing/Cargo.toml new file mode 100644 index 0000000..2e6dad0 --- /dev/null +++ b/crates/windows-kernel-rs/examples/reading_and_writing/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "reading_and_writing" +version = "0.1.0" +authors = ["Fuwn <[email protected]>"] +edition = "2021" +publish = false +build = "../build.rs" + +[lib] +crate-type = ["cdylib"] + +[build-dependencies] +windows-kernel-build = { path = "../../../windows-kernel-build" } + +[dependencies] +widestring = { version = "0.4", default-features = false, features = ["alloc"] } +windows-kernel-rs = { path = "../../../windows-kernel-rs" } +windows-kernel-sys = { path = "../../../windows-kernel-sys" } diff --git a/crates/windows-kernel-rs/examples/reading_and_writing/src/lib.rs b/crates/windows-kernel-rs/examples/reading_and_writing/src/lib.rs new file mode 100644 index 0000000..38453ca --- /dev/null +++ b/crates/windows-kernel-rs/examples/reading_and_writing/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)] + +extern crate alloc; + +use alloc::vec; +use alloc::vec::Vec; +use windows_kernel_rs::device::{ + Completion, Device, DeviceDoFlags, DeviceFlags, DeviceOperations, DeviceType, RequestError}; +use windows_kernel_rs::request::{ReadRequest, WriteRequest}; +use windows_kernel_rs::{Access, Driver, Error, kernel_module, KernelModule, SymbolicLink}; + +struct MyDevice { + data: Vec<u8>, +} + +impl DeviceOperations for MyDevice { + fn read(&mut self, _device: &Device, request: ReadRequest) -> Result<Completion, RequestError> { + let mut user_ptr = request.user_ptr(); + let slice = user_ptr.as_mut_slice(); + + let offset = (request.offset() as usize).min(self.data.len()); + let size = slice.len().min(self.data.len() - offset); + + slice[0..size].copy_from_slice(&self.data[offset..offset + size]); + + Ok(Completion::Complete(size as u32, request.into())) + } + + fn write(&mut self, _device: &Device, request: WriteRequest) -> Result<Completion, RequestError> { + let user_ptr = request.user_ptr(); + + if request.offset() > 0 { + return Err(RequestError(Error::END_OF_FILE, request.into()))?; + } + + let slice = user_ptr.as_slice(); + let size = slice.len().min(4096); + + self.data = slice[0..size].to_vec(); + + Ok(Completion::Complete(size as u32, request.into())) + } +} + +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 { + data: vec![], + }, + )?; + let symbolic_link = SymbolicLink::new("\\??\\Example", "\\Device\\Example")?; + + Ok(Module { + _device: device, + _symbolic_link: symbolic_link, + }) + } +} + +kernel_module!(Module); diff --git a/crates/windows-kernel-rs/examples/safe_framework/Cargo.toml b/crates/windows-kernel-rs/examples/safe_framework/Cargo.toml new file mode 100644 index 0000000..df9e4df --- /dev/null +++ b/crates/windows-kernel-rs/examples/safe_framework/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "safe_framework" +version = "0.1.0" +authors = ["Fuwn <[email protected]>"] +edition = "2021" +publish = false +build = "../build.rs" + +[lib] +crate-type = ["cdylib"] + +[build-dependencies] +windows-kernel-build = { path = "../../../windows-kernel-build" } + +[dependencies] +windows-kernel-rs = { path = "../../../windows-kernel-rs" } +windows-kernel-sys = { path = "../../../windows-kernel-sys" } diff --git a/crates/windows-kernel-rs/examples/safe_framework/src/lib.rs b/crates/windows-kernel-rs/examples/safe_framework/src/lib.rs new file mode 100644 index 0000000..33292e4 --- /dev/null +++ b/crates/windows-kernel-rs/examples/safe_framework/src/lib.rs @@ -0,0 +1,27 @@ +#![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::{kernel_module, println, Driver, Error, KernelModule}; + +struct Module; +impl KernelModule for Module { + fn init(_: Driver, _: &str) -> Result<Self, Error> { + println!("Hello, world!"); + + Ok(Module) + } + + fn cleanup(&mut self, _: Driver) { + println!("Bye bye!"); + } +} + +kernel_module!(Module); |