use crate::*;
use winapi::shared::winerror::ERROR_INVALID_PARAMETER;
use winapi::um::securitybaseapi::SetTokenInformation;
use winapi::um::winnt::*;
pub fn default_dacl<'acl>(token: &token::OwnedHandle, dacl: impl Into<acl::Ptr<'acl>>) -> Result<(), Error> { unsafe { raw_fixed(token, TokenDefaultDacl, &TOKEN_DEFAULT_DACL { DefaultDacl: dacl.into().as_pacl() }) } }
pub fn integrity_level(token: &token::OwnedHandle, saa: sid::AndAttributes) -> Result<(), Error> { unsafe { raw_fixed(token, TokenIntegrityLevel, &saa) } }
impl token::OwnedHandle {
pub fn set_default_dacl<'acl>(&self, dacl: impl Into<acl::Ptr<'acl>>) -> Result<(), Error> { default_dacl(self, dacl) }
pub fn set_integrity_level(&self, saa: sid::AndAttributes) -> Result<(), Error> { integrity_level(self, saa) }
}
unsafe fn raw_slice<E>(token: &token::OwnedHandle, class: TOKEN_INFORMATION_CLASS, slice: &[E]) -> Result<(), Error> {
let len32 = u32::try_from(core::mem::size_of_val(slice)).map_err(|_| Error(ERROR_INVALID_PARAMETER))?;
Error::get_last_if(0 == unsafe { SetTokenInformation(token.as_handle(), class, slice.as_ptr() as *mut _, len32) })
}
unsafe fn raw_fixed<E>(token: &token::OwnedHandle, class: TOKEN_INFORMATION_CLASS, value: &E) -> Result<(), Error> {
unsafe { raw_slice(token, class, core::slice::from_ref(value)) }
}