summaryrefslogtreecommitdiff
path: root/crates/windows-kernel-rs/src/symbolic_link.rs
diff options
context:
space:
mode:
authorFuwn <[email protected]>2022-01-03 03:20:12 -0800
committerFuwn <[email protected]>2022-01-03 03:20:12 -0800
commit85db2b507f3f69b32811c54a89d9ac7bbbc46121 (patch)
tree2efd66da452f8a6a2cc6c91584c925f237506ddf /crates/windows-kernel-rs/src/symbolic_link.rs
downloaddriver-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.rs39
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);
+ }
+ }
+}