use crate::*;
use winapi::um::winnt::SID_MAX_SUB_AUTHORITIES;
#[macro_export] macro_rules! sid {
(S-$rev:literal-$identifier_authority:literal$(-$sub_authority:literal)*) => {{
const SUB_AUTHORITIES : [u32; {[0u32 $(,$sub_authority)*].len()-1}] = [$($sub_authority),*];
assert!(SUB_AUTHORITIES.len() <= 15, "too many subauthorities (> SID_MAX_SUB_AUTHORITIES = 15)");
const SID : $crate::sid::Static<{SUB_AUTHORITIES.len()}> = $crate::sid::Static::new($rev, $identifier_authority, SUB_AUTHORITIES);
SID.as_sid_ptr()
}};
}
#[doc(hidden)]
#[derive(Clone, Copy, PartialEq, Eq)]
#[repr(C)] pub struct Static<const NS: usize> {
revision: u8,
sub_authority_count: u8,
identifier_authority: [u8; 6],
sub_authority: [u32; NS],
}
impl<const NS: usize> Static<NS> {
pub const fn new(revision: u8, identifier_authority: u8, sub_authority: [u32; NS]) -> Self {
assert!(NS <= SID_MAX_SUB_AUTHORITIES as _, "too many subauthorities (> SID_MAX_SUB_AUTHORITIES = 15)");
let identifier_authority = [0, 0, 0, 0, 0, identifier_authority];
Self { revision, sub_authority_count: NS as u8, identifier_authority, sub_authority }
}
pub const fn as_sid_ptr<'s>(&'s self) -> sid::Ptr<'s> { unsafe { sid::Ptr::from_raw_unchecked(self as *const _ as *mut _) } }
}