pub fn duplicate_token_ex(
token: &crate::token::OwnedHandle,
desired_access: impl Into<crate::token::AccessRights>,
token_attributes: Option<&crate::security::Attributes>,
impersonation_level: crate::security::ImpersonationLevel,
token_type: crate::token::Type,
) -> Result<crate::token::OwnedHandle, crate::Error> {
use crate::*;
use core::ptr::{null, null_mut};
let mut new = null_mut();
Error::get_last_if(0 == unsafe { winapi::um::securitybaseapi::DuplicateTokenEx(
token.as_handle(),
desired_access.into().into(),
token_attributes.map_or(null(), |a| a) as *mut _,
impersonation_level.into(),
token_type.into(),
&mut new
)})?;
unsafe { token::OwnedHandle::from_raw(new) }
}