mod as_security_descriptor;
mod borrowed;
mod c_wrappers;
mod ext;
mod owned;
mod try_clone;
#[allow(unused_imports)] pub(crate) use try_clone::LocalBox;
use {
crate::BoolExt,
std::{ffi::c_void, io},
try_clone::clone,
windows_sys::Win32::Security::{IsValidSecurityDescriptor, SECURITY_ATTRIBUTES},
};
pub use {as_security_descriptor::*, borrowed::*, ext::*, owned::*};
unsafe fn validate(ptr: *mut c_void) {
unsafe {
debug_assert!(
IsValidSecurityDescriptor(ptr) == 1,
"invalid security descriptor: {}",
io::Error::last_os_error(),
);
}
}
pub(super) fn create_security_attributes(
sd: Option<BorrowedSecurityDescriptor<'_>>,
inheritable: bool,
) -> SECURITY_ATTRIBUTES {
let mut attrs = unsafe { std::mem::zeroed::<SECURITY_ATTRIBUTES>() };
if let Some(sd) = sd {
sd.write_to_security_attributes(&mut attrs);
}
attrs.nLength = std::mem::size_of::<SECURITY_ATTRIBUTES>().try_into().unwrap();
attrs.bInheritHandle = inheritable.to_i32();
attrs
}