#![allow(clippy::missing_safety_doc)]
use crate::{
raw::{
RtlInitAnsiString, RtlInitUnicodeString, ANSI_STRING, UNICODE_STRING,
},
AStr, WStr,
};
use core::ops;
#[repr(C)]
#[derive(Debug, Clone, Eq, PartialEq)]
pub struct UnicodeString<'a> {
us: UNICODE_STRING,
s: &'a WStr,
}
impl<'a> UnicodeString<'a> {
pub fn new(s: &'a WStr) -> Self {
let mut us = UNICODE_STRING {
Length: 0,
MaximumLength: 0,
Buffer: 0 as _,
};
unsafe {
RtlInitUnicodeString(&mut us, s.as_ptr());
}
Self { us, s }
}
pub fn as_raw(&self) -> &UNICODE_STRING { &self.us }
pub unsafe fn as_mut_raw(&mut self) -> &mut UNICODE_STRING { &mut self.us }
pub fn as_ptr(&self) -> *const UNICODE_STRING { &self.us as _ }
pub fn as_mut_ptr(&mut self) -> *mut UNICODE_STRING { &mut self.us as _ }
}
impl<'a> ops::Deref for UnicodeString<'a> {
type Target = WStr;
fn deref(&self) -> &Self::Target { self.s }
}
#[repr(C)]
#[derive(Debug, Clone, Eq, PartialEq)]
pub struct AnsiString<'a> {
us: ANSI_STRING,
s: &'a AStr,
}
impl<'a> AnsiString<'a> {
pub fn new(s: &'a AStr) -> Self {
let mut us = ANSI_STRING {
Length: 0,
MaximumLength: 0,
Buffer: 0 as _,
};
unsafe {
RtlInitAnsiString(&mut us, s.as_ptr());
}
Self { us, s }
}
pub fn as_raw(&self) -> &ANSI_STRING { &self.us }
pub unsafe fn as_mut_raw(&mut self) -> &mut ANSI_STRING { &mut self.us }
pub fn as_ptr(&self) -> *const ANSI_STRING { &self.us as _ }
pub fn as_mut_ptr(&mut self) -> *mut ANSI_STRING { &mut self.us as _ }
}
impl<'a> ops::Deref for AnsiString<'a> {
type Target = AStr;
fn deref(&self) -> &Self::Target { self.s }
}