diff options
| author | Fuwn <[email protected]> | 2022-01-03 03:20:12 -0800 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2022-01-03 03:20:12 -0800 |
| commit | 85db2b507f3f69b32811c54a89d9ac7bbbc46121 (patch) | |
| tree | 2efd66da452f8a6a2cc6c91584c925f237506ddf /crates/windows-kernel-rs/src/symbolic_link.rs | |
| download | driver-85db2b507f3f69b32811c54a89d9ac7bbbc46121.tar.xz driver-85db2b507f3f69b32811c54a89d9ac7bbbc46121.zip | |
feat(driver): commit primer
Diffstat (limited to 'crates/windows-kernel-rs/src/symbolic_link.rs')
| -rw-r--r-- | crates/windows-kernel-rs/src/symbolic_link.rs | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/crates/windows-kernel-rs/src/symbolic_link.rs b/crates/windows-kernel-rs/src/symbolic_link.rs new file mode 100644 index 0000000..8c30f6b --- /dev/null +++ b/crates/windows-kernel-rs/src/symbolic_link.rs @@ -0,0 +1,39 @@ +use widestring::U16CString; +use windows_kernel_sys::ntoskrnl::{IoCreateSymbolicLink, IoDeleteSymbolicLink}; + +use crate::{ + error::{Error, IntoResult}, + string::create_unicode_string, +}; + +pub struct SymbolicLink { + name: U16CString, +} + +impl SymbolicLink { + pub fn new(name: &str, target: &str) -> Result<Self, Error> { + // Convert the name to UTF-16 and then create a UNICODE_STRING. + let name = U16CString::from_str(name).unwrap(); + let mut name_ptr = create_unicode_string(name.as_slice()); + + // Convert the target to UTF-16 and then create a UNICODE_STRING. + let target = U16CString::from_str(target).unwrap(); + let mut target_ptr = create_unicode_string(target.as_slice()); + + unsafe { IoCreateSymbolicLink(&mut name_ptr, &mut target_ptr) }.into_result()?; + + Ok(Self { + name, + }) + } +} + +impl Drop for SymbolicLink { + fn drop(&mut self) { + let mut name_ptr = create_unicode_string(self.name.as_slice()); + + unsafe { + IoDeleteSymbolicLink(&mut name_ptr); + } + } +} |