SepAppendAceToTokenDefaultDacl
NTSTATUS __stdcall SepAppendAceToTokenDefaultDacl(_TOKEN *Token, VOID *InputSid){
_ACL *DefaultDacl;
_ACL *v3;
int AclSize;
int Acl;
unsigned int v8;
VOID **PoolWithTag;
UINT64 v10;
unsigned int v11;
UINT64 AceListLength;
unsigned int AclInformation;
PVOID Ace;
__int64 v16;
int v17;
DefaultDacl = Token->DefaultDacl;
AclInformation = 0;
v3 = 0i64;
Ace = 0i64;
v16 = 0i64;
v17 = 0;
if( !DefaultDacl )
{
Acl = 0;
LABEL_12:
if( v3 )
ExFreePoolWithTag(v3, 0);
return Acl;
}
if( RtlFindAceBySid(DefaultDacl, InputSid, 0i64) )
return 0;
AclSize = DefaultDacl->AclSize;
Acl = RtlQueryInformationAcl(DefaultDacl, &AclInformation, 4ui64, AclRevisionInformation);
if( Acl >= 0 )
{
Acl = RtlQueryInformationAcl(DefaultDacl, &v16, 0xCui64, AclSizeInformation);
if( Acl >= 0 )
{
v8 = (AclSize + 4 * *((unsigned __int8 *)InputSid + 1) + 19) & 0xFFFFFFFC;
PoolWithTag = ExAllocatePoolWithTag(1ui64, v8, 1665230163i64);
v3 = (_ACL *)PoolWithTag;
if( !PoolWithTag )
return -1073741670;
v11 = AclInformation;
Acl = RtlCreateAcl((PACL)PoolWithTag, (_ACL)v8, AclInformation, v10);
if( Acl >= 0 )
{
Acl = RtlGetAce(DefaultDacl, 0i64, &Ace);
if( Acl >= 0 )
{
LODWORD(AceListLength) = HIDWORD(v16) - 8;
Acl = RtlAddAce(v3, v11, 0i64, Ace, AceListLength);
if( Acl >= 0 )
{
Acl = RtlAddAccessAllowedAce(v3, v11, 0x10000000, InputSid);
if( Acl >= 0 )
{
Acl = SepExpandDynamic(Token, (v8 + 4 * *((unsigned __int8 *)Token->PrimaryGroup + 1) + 11) & 0xFFFFFFFC);
if( Acl >= 0 )
{
SepFreeDefaultDacl(Token);
SepAppendDefaultDacl(Token, v3);
}
}
}
}
}
goto LABEL_12;
}
}
return Acl;
}Referenced by:
NtCreateLowBoxToken