use {
super::{validate, AsSecurityDescriptor, AsSecurityDescriptorMut},
crate::ref2ptr,
std::{ffi::c_void, marker::PhantomData, ptr::NonNull},
windows_sys::Win32::Security::SECURITY_DESCRIPTOR,
};
#[repr(transparent)]
#[derive(Copy, Clone, Debug)]
pub struct BorrowedSecurityDescriptor<'a>(NonNull<c_void>, PhantomData<&'a SECURITY_DESCRIPTOR>);
unsafe impl Sync for BorrowedSecurityDescriptor<'_> {}
unsafe impl Send for BorrowedSecurityDescriptor<'_> {}
unsafe impl AsSecurityDescriptor for BorrowedSecurityDescriptor<'_> {
#[inline(always)]
fn as_sd(&self) -> *const c_void { self.0.as_ptr().cast_const() }
}
impl<'a> BorrowedSecurityDescriptor<'a> {
#[inline]
pub unsafe fn from_ref(r: &'a SECURITY_DESCRIPTOR) -> Self {
unsafe { Self::from_ptr(ref2ptr(r).cast()) }
}
#[inline]
pub unsafe fn from_ptr(p: *const c_void) -> Self {
let p = p.cast_mut();
unsafe {
debug_assert!(!p.is_null(), "null pointer to security descriptor");
validate(p);
Self(NonNull::new(p).unwrap_unchecked(), PhantomData)
}
}
}
#[repr(transparent)]
#[derive(Debug)]
pub struct MutBorrowedSecurityDescriptor<'a>(
NonNull<SECURITY_DESCRIPTOR>,
PhantomData<&'a mut SECURITY_DESCRIPTOR>,
);
unsafe impl Sync for MutBorrowedSecurityDescriptor<'_> {}
unsafe impl Send for MutBorrowedSecurityDescriptor<'_> {}
unsafe impl AsSecurityDescriptor for MutBorrowedSecurityDescriptor<'_> {
#[inline(always)]
fn as_sd(&self) -> *const c_void { ref2ptr(&self.0).cast() }
}
unsafe impl AsSecurityDescriptorMut for MutBorrowedSecurityDescriptor<'_> {
#[inline(always)]
fn as_sd_mut(&mut self) -> *mut c_void { self.as_sd().cast_mut() }
}
impl<'a> MutBorrowedSecurityDescriptor<'a> {
#[inline]
pub unsafe fn from_ref(r: &'a mut SECURITY_DESCRIPTOR) -> Self {
unsafe { Self::from_ptr(r) }
}
#[inline]
pub unsafe fn from_ptr(p: *mut SECURITY_DESCRIPTOR) -> Self {
unsafe {
debug_assert!(!p.is_null(), "null pointer to security descriptor");
validate(p.cast());
Self(NonNull::new(p).unwrap_unchecked(), PhantomData)
}
}
}