SepSetTokenCapabilities

INT64 __fastcall SepSetTokenCapabilities(
        _TOKEN *Token,
        VOID *PackageSid,
        _SID_AND_ATTRIBUTES *InputCapabilityArray,
        UINT64 CapabilityArrayCount){
  unsigned int v4; 
  INT64 result; 
  unsigned int v8; 
  _SID_AND_ATTRIBUTES *PoolWithTag; 
  SID_AND_ATTRIBUTES *v10; 
  int v11; 
  unsigned int v12; 
  void *Package; 
  UINT64 CaptureBufferLength; 
  _POOL_TYPE v15; 
  UINT8 v16; 
  _SID_AND_ATTRIBUTES *CapturedArray; 
  SIZE_T NumberOfBytes; 
  LODWORD(NumberOfBytes) = 0;
  v4 = CapabilityArrayCount;
  CapturedArray = 0i64;
  if( Token->Capabilities )
  {
    if( !PackageSid )
      return 3221225506i64;
    Package = Token->Package;
    if( Package )
    {
      if( !RtlIsParentOfChildAppContainer(Package, PackageSid) )
        return 3221225506i64;
    }
  }
  if( v4 )
  {
    if( v4 > 0x1000 )
      return 3221225485i64;
    if( SepTokenCapabilitySidSharingEnabled )
    {
      v8 = 32 * v4;
    }
    else
    {
      result = SepLengthSidAndAttributesArray(InputCapabilityArray, v4, &NumberOfBytes);
      if( (int)result < 0 )
        return result;
      v8 = NumberOfBytes;
    }
    PoolWithTag = (_SID_AND_ATTRIBUTES *)ExAllocatePoolWithTag(PagedPool, v8, 0x73536553ui64);
    v10 = PoolWithTag;
    if( PoolWithTag )
    {
      if( SepTokenCapabilitySidSharingEnabled )
      {
        v11 = SepInsertOrReferenceSharedSidEntries(InputCapabilityArray, PoolWithTag, v4);
      }
      else
      {
        LODWORD(CaptureBufferLength) = v8;
        v11 = SeCaptureSidAndAttributesArray(
                InputCapabilityArray,
                v4,
                0,
                PoolWithTag,
                CaptureBufferLength,
                v15,
                v16,
                &CapturedArray,
                &NumberOfBytes);
      }
      v12 = v11;
      if( v11 < 0 )
      {
        ExFreePoolWithTag(v10, 0);
      }
      else
      {
        if( Token->Capabilities )
          SepFreeTokenCapabilities(Token);
        Token->Capabilities = v10;
        Token->CapabilityCount = v4;
        RtlSidHashInitialize(v10, v4, &Token->CapabilitiesHash);
      }
      return v12;
    }
    else
    {
      return 3221225626i64;
    }
  }
  else
  {
    if( Token->Capabilities )
      SepFreeTokenCapabilities(Token);
    Token->Capabilities = 0i64;
    Token->CapabilityCount = 0;
    return 0i64;
  }
}

Referenced by:

NtCreateLowBoxToken
SepDuplicateToken
SepFilterToken
SepGetAnonymousToken