use super::*;
use crate::*;
use crate::alloc::*;
use winapi::um::winnt::TOKEN_GROUPS_AND_PRIVILEGES;
use core::fmt::{self, Debug, Formatter};
#[repr(transparent)] pub struct BoxTokenGroupsAndPrivileges(CBox<TOKEN_GROUPS_AND_PRIVILEGES>);
impl BoxTokenGroupsAndPrivileges {
pub fn from_raw(cbs: CBoxSized<TOKEN_GROUPS_AND_PRIVILEGES>) -> Self {
let sids = unsafe { assert_valid_after_header_slice(&cbs, cbs.Sids, cbs.SidCount, false) };
for sid in sids { assert_valid_saa(&cbs, *sid) }
let sids = unsafe { assert_valid_after_header_slice(&cbs, cbs.RestrictedSids, cbs.RestrictedSidCount, false) };
for sid in sids { assert_valid_saa(&cbs, *sid) }
let privs = unsafe { assert_valid_after_header_slice(&cbs, cbs.Privileges, cbs.PrivilegeCount, false) };
let _ = privs; Self(cbs.into())
}
pub fn sids (& self) -> & [sid::AndAttributes] { unsafe { core::slice::from_raw_parts (self.header().Sids.cast(), usize::from32(self.header().SidCount)) } }
pub fn sids_mut(&mut self) -> &mut [sid::AndAttributes] { unsafe { core::slice::from_raw_parts_mut(self.header().Sids.cast(), usize::from32(self.header().SidCount)) } }
pub fn restricted_sids (& self) -> & [sid::AndAttributes] { unsafe { core::slice::from_raw_parts (self.header().RestrictedSids.cast(), usize::from32(self.header().RestrictedSidCount)) } }
pub fn restricted_sids_mut(&mut self) -> &mut [sid::AndAttributes] { unsafe { core::slice::from_raw_parts_mut(self.header().RestrictedSids.cast(), usize::from32(self.header().RestrictedSidCount)) } }
pub fn privileges (& self) -> & [privilege::LuidAndAttributes] { unsafe { core::slice::from_raw_parts (self.header().Privileges.cast(), usize::from32(self.header().PrivilegeCount)) } }
pub fn privileges_mut(&mut self) -> &mut [privilege::LuidAndAttributes] { unsafe { core::slice::from_raw_parts_mut(self.header().Privileges.cast(), usize::from32(self.header().PrivilegeCount)) } }
pub fn authentication_id(&self) -> Luid { self.header().AuthenticationId.into() }
pub fn set_authentication_id(&mut self, luid: impl Into<Luid>) { self.header_mut().AuthenticationId = luid.into().into(); }
fn header (& self) -> & TOKEN_GROUPS_AND_PRIVILEGES { & *self.0 }
fn header_mut(&mut self) -> &mut TOKEN_GROUPS_AND_PRIVILEGES { &mut *self.0 }
}
impl Debug for BoxTokenGroupsAndPrivileges {
fn fmt(&self, fmt: &mut Formatter) -> fmt::Result {
fmt.debug_struct("BoxTokenGroupsAndPrivileges")
.field("sids", &self.sids() )
.field("restricted_sids", &self.restricted_sids() )
.field("privileges", &self.privileges() )
.field("authentication_id", &self.authentication_id() )
.finish()
}
}