RtlpQuerySecurityDescriptor

VOID __stdcall RtlpQuerySecurityDescriptor(
        _SECURITY_DESCRIPTOR *SecurityDescriptor,
        VOID **Owner,
        UINT64 *OwnerSize,
        VOID **PrimaryGroup,
        UINT64 *PrimaryGroupSize,
        _ACL **Dacl,
        UINT64 *DaclSize,
        _ACL **Sacl,
        UINT64 *SaclSize){
  unsigned int v9; 
  unsigned __int8 *v10; 
  unsigned int v11; 
  signed __int16 Control; 
  _ACL *v13; 
  unsigned int v14; 
  unsigned __int8 *Group; 
  unsigned int v16; 
  signed __int16 v17; 
  _ACL *v18; 
  __int64 v19; 
  __int64 Group_low; 
  __int64 Owner_low; 
  __int64 Owner_high; 

  v9 = 0;
  if( (SecurityDescriptor->Control & 0x8000u) != 0 )
  {
    v19 = *(unsigned int *)(&SecurityDescriptor->Control + 1);
    if( (_DWORD)v19 )
      v10 = &SecurityDescriptor->Revision + v19;
    else
      v10 = 0i64;
  }
  else
  {
    v10 = (unsigned __int8 *)SecurityDescriptor->Owner;
  }
  *Owner = v10;
  if( v10 )
    v11 = (4 * v10[1] + 11) & 0xFFFFFFFC;
  else
    v11 = 0;
  *(_DWORD *)OwnerSize = v11;
  Control = SecurityDescriptor->Control;
  if( (Control & 4) == 0 )
    goto LABEL_31;
  if( Control >= 0 )
  {
    v13 = SecurityDescriptor->Dacl;
    goto LABEL_8;
  }
  Group_low = LODWORD(SecurityDescriptor->Group);
  if( (_DWORD)Group_low )
    v13 = (_ACL *)(&SecurityDescriptor->Revision + Group_low);
  else
LABEL_31:
    v13 = 0i64;
LABEL_8:
  *Dacl = v13;
  if( v13 )
    v14 = (v13->AclSize + 3) & 0xFFFFFFFC;
  else
    v14 = 0;
  *(_DWORD *)DaclSize = v14;
  if( (SecurityDescriptor->Control & 0x8000u) != 0 )
  {
    Owner_low = LODWORD(SecurityDescriptor->Owner);
    if( (_DWORD)Owner_low )
      Group = &SecurityDescriptor->Revision + Owner_low;
    else
      Group = 0i64;
  }
  else
  {
    Group = (unsigned __int8 *)SecurityDescriptor->Group;
  }
  *PrimaryGroup = Group;
  if( Group )
    v16 = (4 * Group[1] + 11) & 0xFFFFFFFC;
  else
    v16 = 0;
  *(_DWORD *)PrimaryGroupSize = v16;
  v17 = SecurityDescriptor->Control;
  if( (v17 & 0x10) == 0 )
    goto LABEL_15;
  if( v17 < 0 )
  {
    Owner_high = HIDWORD(SecurityDescriptor->Owner);
    if( !(_DWORD)Owner_high )
    {
LABEL_15:
      v18 = 0i64;
      goto LABEL_16;
    }
    v18 = (_ACL *)(&SecurityDescriptor->Revision + Owner_high);
  }
  else
  {
    v18 = SecurityDescriptor->Sacl;
  }
LABEL_16:
  *Sacl = v18;
  if( v18 )
    v9 = (v18->AclSize + 3) & 0xFFFFFFFC;
  *(_DWORD *)SaclSize = v9;
}

Referenced by:

RtlMakeSelfRelativeSD
RtlSelfRelativeToAbsoluteSD
RtlSelfRelativeToAbsoluteSD2