SepDuplicateClaimAttributes

__int64 __fastcall SepDuplicateClaimAttributes(__int64 a1, _QWORD *a2){
  __int64 result; 
  int v5; 
  _AUTHZBASEP_SECURITY_ATTRIBUTES_INFORMATION *v6; 
  _AUTHZBASEP_SECURITY_ATTRIBUTES_INFORMATION *v7; 
  char v8; 
  SID_AND_ATTRIBUTES *v9; 
  INT64 v10; 
  _DWORD *ClaimCollectionNoLists; 
  _AUTHZBASEP_SECURITY_ATTRIBUTES_INFORMATION *v12; 
  _AUTHZBASEP_SECURITY_ATTRIBUTES_INFORMATION *v13; 
  _SID_AND_ATTRIBUTES *v14; 
  UINT64 v15; 
  int v16; 
  SID_AND_ATTRIBUTES *PoolWithTag; 
  UINT64 v18; 
  UINT64 CaptureBufferLength; 
  _POOL_TYPE v20; 
  UINT8 v21; 
  char v22; 
  SIZE_T NumberOfBytes; 
  _SID_AND_ATTRIBUTES *CapturedArray; 
  result = 0i64;
  v22 = 0;
  LODWORD(NumberOfBytes) = 0;
  v5 = 0;
  CapturedArray = 0i64;
  v6 = 0i64;
  v7 = 0i64;
  v8 = 0;
  v9 = 0i64;
  if( !a2 )
    return 3221225485i64;
  *a2 = 0i64;
  if( a1 )
  {
    ClaimCollectionNoLists = AuthzBasepAllocateClaimCollectionNoLists(a1, (UINT64)a2);
    if( !ClaimCollectionNoLists )
      return(unsigned int)-1073741670;
    if( *(_QWORD *)(a1 + 576) )
    {
      AuthzBasepAllocateSecurityAttributesList(v10);
      v6 = v12;
      if( !v12 )
      {
        v5 = -1073741670;
LABEL_33:
        ExFreePoolWithTag(ClaimCollectionNoLists, 0);
        return(unsigned int)v5;
      }
      v5 = AuthzBasepDuplicateSecurityAttributes(*(_AUTHZBASEP_SECURITY_ATTRIBUTES_INFORMATION **)(a1 + 576), v12, 0i64);
      if( v5 < 0 )
      {
LABEL_23:
        if( v6 )
        {
          if( v8 )
            AuthzBasepFreeSecurityAttributesList(v6);
          ExFreePoolWithTag(v6, 0);
        }
        if( v7 )
        {
          if( v22 )
            AuthzBasepFreeSecurityAttributesList(v7);
          ExFreePoolWithTag(v7, 0);
        }
        if( v9 )
          ExFreePoolWithTag(v9, 0);
        goto LABEL_33;
      }
      v8 = 1;
      *((_QWORD *)ClaimCollectionNoLists + 72) = v6;
    }
    if( *(_QWORD *)(a1 + 584) )
    {
      AuthzBasepAllocateSecurityAttributesList(v10);
      v7 = v13;
      if( !v13 )
      {
LABEL_13:
        v5 = -1073741670;
        goto LABEL_23;
      }
      v5 = AuthzBasepDuplicateSecurityAttributes(*(_AUTHZBASEP_SECURITY_ATTRIBUTES_INFORMATION **)(a1 + 584), v13, 0i64);
      if( v5 < 0 )
        goto LABEL_23;
      v22 = 1;
      *((_QWORD *)ClaimCollectionNoLists + 73) = v7;
    }
    v14 = *(_SID_AND_ATTRIBUTES **)(a1 + 8);
    if( v14 )
    {
      v15 = *(unsigned int *)a1;
      if( (_DWORD)v15 )
      {
        v5 = SepLengthSidAndAttributesArray(v14, v15, &NumberOfBytes);
        if( v5 < 0 )
          goto LABEL_23;
        v16 = NumberOfBytes;
        PoolWithTag = (SID_AND_ATTRIBUTES *)ExAllocatePoolWithTag(
                                              PagedPool,
                                              (unsigned int)NumberOfBytes,
                                              0x64546553ui64);
        v9 = PoolWithTag;
        if( !PoolWithTag )
          goto LABEL_13;
        LODWORD(CaptureBufferLength) = v16;
        v5 = SeCaptureSidAndAttributesArray(
               *(_SID_AND_ATTRIBUTES **)(a1 + 8),
               *(unsigned int *)a1,
               0,
               PoolWithTag,
               CaptureBufferLength,
               v20,
               v21,
               &CapturedArray,
               &NumberOfBytes);
        if( v5 < 0 )
          goto LABEL_23;
        v18 = *(unsigned int *)a1;
        *ClaimCollectionNoLists = v18;
        *((_QWORD *)ClaimCollectionNoLists + 1) = v9;
        RtlSidHashInitialize(v9, v18, (SID_AND_ATTRIBUTES_HASH *)(ClaimCollectionNoLists + 8));
      }
    }
    *a2 = ClaimCollectionNoLists;
    if( v5 >= 0 )
      return(unsigned int)v5;
    goto LABEL_23;
  }
  return result;
}

Referenced by:

SepConvertToOwnTokenClaims
SepDuplicateTokenClaims