use crate::AsPtr;
use super::{validate, AsSecurityDescriptor, AsSecurityDescriptorMut};
use std::{ffi::c_void, marker::PhantomData, ptr::NonNull};
use 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(r.as_ptr().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 {
self.0.as_ptr().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)
}
}
}