AuthzBasepConvertRelativeToAbsoluteTokenAttribute

INT64 __fastcall AuthzBasepConvertRelativeToAbsoluteTokenAttribute(UINT64 *a1, UINT64 a2, INT64 a3, UINT64 *a4){
  unsigned int v4; 
  UINT64 v5; 
  int v9; 
  __int64 v10; 
  unsigned int v11; 
  unsigned int v12; 
  __int64 v13; 
  unsigned __int16 v14; 
  int v15; 
  unsigned int v16; 
  UINT64 *v17; 
  __int64 v18; 
  unsigned int v19; 
  int v20; 
  unsigned int v21; 
  __int64 v22; 
  unsigned int v23; 
  int v24; 
  unsigned int v25; 
  UINT64 *v26; 
  unsigned int v27; 
  unsigned int v28; 
  INT64 v29; 
  unsigned __int16 v30; 
  unsigned int v31; 
  unsigned __int64 v32; 
  unsigned int v33; 
  unsigned int v34; 
  UINT8 *v35; 
  char *v36; 
  unsigned int v37; 
  unsigned int v38; 
  __int64 v39; 
  unsigned int v40; 
  unsigned __int64 v41; 
  unsigned int v42; 
  unsigned int v43; 
  UINT8 *v44; 
  UINT64 v45; 
  unsigned int v46; 
  unsigned int v47; 
  __int64 v48; 
  unsigned int v49; 
  unsigned __int64 v50; 
  __int64 v51; 
  UINT64 i; 
  size_t pcbLength; 
  v4 = 0;
  v5 = (unsigned int)a2;
  pcbLength = 0i64;
  if( !a1 || !a3 || !a4 )
    return(unsigned int)-1073741811;
  if( (unsigned int)a2 < 0x14 )
    return(unsigned int)-1073741705;
  if( !*((_DWORD *)a1 + 3) )
    return(unsigned int)-1073741705;
  v10 = *(unsigned int *)a1;
  if( (unsigned int)a2 < (unsigned int)v10 || (unsigned int)(a2 - v10) < 4 )
    return(unsigned int)-1073741705;
  v9 = RtlStringCbLengthW((const WCHAR *)((char *)a1 + v10), (unsigned int)(a2 - v10), &pcbLength);
  if( v9 < 0 )
    return(unsigned int)v9;
  v11 = pcbLength + 2;
  if( (int)pcbLength + 2 < (unsigned int)pcbLength )
    return(unsigned int)-1073741675;
  if( (int)pcbLength + 5 < (unsigned int)(pcbLength + 2) )
    return(unsigned int)-1073741675;
  v12 = ((pcbLength + 5) & 0xFFFFFFFC) + 40;
  if( v12 < 0x28 )
    return(unsigned int)-1073741675;
  v13 = *((unsigned int *)a1 + 3);
  if( (unsigned __int64)(4 * v13) > 0xFFFFFFFF )
    return(unsigned int)-1073741675;
  if( (int)v5 - 16 < (unsigned int)(4 * v13) )
    return(unsigned int)-1073741705;
  v14 = *((_WORD *)a1 + 2);
  if( v14 )
  {
    if( v14 > 2u )
    {
      if( v14 == 3 )
      {
        v20 = 16 * v13;
        if( (unsigned __int64)(16 * v13) > 0xFFFFFFFF || v20 + v12 < v12 )
          return(unsigned int)-1073741675;
        v12 += v20;
        v21 = 0;
        if( (_DWORD)v13 )
        {
          while( 1 )
          {
            v22 = *((unsigned int *)a1 + v21 + 4);
            if( (unsigned int)v5 < (unsigned int)v22 || (unsigned int)(v5 - v22) < 2 )
              return(unsigned int)-1073741705;
            v9 = RtlStringCbLengthW((const WCHAR *)((char *)a1 + v22), (unsigned int)(v5 - v22), &pcbLength);
            if( v9 < 0 )
              return(unsigned int)v9;
            if( (int)pcbLength + 2 < (unsigned int)pcbLength
              || (int)pcbLength + 5 < (unsigned int)(pcbLength + 2)
              || (((_DWORD)pcbLength + 5) & 0xFFFFFFFC) + v23 < v23 )
            {
              return(unsigned int)-1073741675;
            }
            ++v21;
            v12 = ((pcbLength + 5) & 0xFFFFFFFC) + v23;
            if( v21 >= *((_DWORD *)a1 + 3) )
              goto LABEL_51;
          }
        }
        goto LABEL_51;
      }
      if( v14 == 5 )
        goto LABEL_21;
      if( v14 != 6 )
      {
        if( v14 != 16 )
          goto LABEL_51;
LABEL_21:
        v15 = 16 * v13;
        if( (unsigned __int64)(16 * v13) > 0xFFFFFFFF || v15 + v12 < v12 )
          return(unsigned int)-1073741675;
        v12 += v15;
        v16 = 0;
        if( (_DWORD)v13 )
        {
          v17 = a1 + 2;
          while( 1 )
          {
            v18 = *(unsigned int *)v17;
            if( (unsigned int)v5 < (unsigned int)v18 || (unsigned int)(v5 - v18) < 4 )
              return(unsigned int)-1073741705;
            v19 = *(_DWORD *)((char *)a1 + v18);
            if( (int)v18 + 4 < (unsigned int)v18 )
              return(unsigned int)-1073741675;
            if( (int)v5 - ((int)v18 + 4) < v19 )
              return(unsigned int)-1073741705;
            if( v19 + 3 < v19 || ((v19 + 3) & 0xFFFFFFFC) + v12 < v12 )
              return(unsigned int)-1073741675;
            ++v16;
            v17 = (UINT64 *)((char *)v17 + 4);
            v12 += (v19 + 3) & 0xFFFFFFFC;
            if( v16 >= (unsigned int)v13 )
              goto LABEL_51;
          }
        }
        goto LABEL_51;
      }
    }
    v24 = 8 * v13;
    if( (unsigned __int64)(8 * v13) > 0xFFFFFFFF || v24 + v12 < v12 )
      return(unsigned int)-1073741675;
    v12 += v24;
    v25 = 0;
    if( (_DWORD)v13 )
    {
      v26 = a1 + 2;
      while( (unsigned int)v5 >= *(_DWORD *)v26 && (unsigned int)(v5 - *(_DWORD *)v26) >= 8 )
      {
        ++v25;
        v26 = (UINT64 *)((char *)v26 + 4);
        if( v25 >= (unsigned int)v13 )
          goto LABEL_51;
      }
      return(unsigned int)-1073741705;
    }
  }
LABEL_51:
  v27 = *(_DWORD *)a4;
  *(_DWORD *)a4 = v12;
  if( v27 < v12 )
    return(unsigned int)-1073741789;
  memset(a3, 0i64);
  *(_WORD *)(a3 + 16) = *((_WORD *)a1 + 2);
  *(_WORD *)(a3 + 18) = *((_WORD *)a1 + 3);
  *(_DWORD *)(a3 + 20) = *((_DWORD *)a1 + 2);
  *(_DWORD *)(a3 + 24) = *((_DWORD *)a1 + 3);
  if( v11 >= 0xFFFFFFD8 || v11 + 43 < v11 + 40 )
    return(unsigned int)-1073741675;
  v28 = (v11 + 43) & 0xFFFFFFFC;
  memmove((UINT8 *)(a3 + 40), (UINT8 *)a1 + *(unsigned int *)a1, v11);
  *(_QWORD *)(a3 + 8) = a3 + 40;
  *(_WORD *)(a3 + 2) = v11;
  *(_WORD *)a3 = v11 - 2;
  v29 = a3 + v28;
  v30 = *(_WORD *)(a3 + 16);
  if( !v30 )
    return(unsigned int)-1073741705;
  if( v30 > 2u )
  {
    if( v30 == 3 )
    {
      v40 = *(_DWORD *)(a3 + 24);
      v41 = 16i64 * v40;
      if( v41 > 0xFFFFFFFF )
        return(unsigned int)-1073741675;
      v42 = v41 + v28;
      if( (unsigned int)v41 + v28 < v28 )
        return(unsigned int)-1073741675;
      v43 = 0;
      v44 = (UINT8 *)(a3 + v42);
      *(_QWORD *)(a3 + 32) = v29;
      if( !v40 )
        return 0;
      v45 = v5;
      for( i = v5; ; v45 = i )
      {
        v9 = RtlStringCbLengthW((const WCHAR *)((char *)a1 + *((unsigned int *)a1 + v43 + 4)), v45, &pcbLength);
        if( v9 < 0 )
          break;
        v46 = pcbLength + 2;
        if( (int)pcbLength + 2 < (unsigned int)pcbLength )
          return(unsigned int)-1073741675;
        v47 = v46 + v42;
        if( v46 + v42 < v42 || v47 + 3 < v47 )
          return(unsigned int)-1073741675;
        v42 = (v47 + 3) & 0xFFFFFFFC;
        memmove(v44, (UINT8 *)a1 + *((unsigned int *)a1 + v43 + 4), v46);
        v48 = 2i64 * v43++;
        *(_QWORD *)(*(_QWORD *)(a3 + 32) + 8 * v48 + 8) = v44;
        v44 = (UINT8 *)(a3 + v42);
        *(_WORD *)(*(_QWORD *)(a3 + 32) + 8 * v48) = v46 - 2;
        *(_WORD *)(*(_QWORD *)(a3 + 32) + 8 * v48 + 2) = v46;
        if( v43 >= *(_DWORD *)(a3 + 24) )
          return 0;
      }
      return(unsigned int)v9;
    }
    if( v30 == 5 )
    {
LABEL_61:
      v31 = *(_DWORD *)(a3 + 24);
      v32 = 16i64 * v31;
      if( v32 <= 0xFFFFFFFF )
      {
        v33 = v32 + v28;
        if( (unsigned int)v32 + v28 >= v28 )
        {
          v34 = 0;
          v35 = (UINT8 *)(a3 + v33);
          *(_QWORD *)(a3 + 32) = v29;
          if( v31 )
          {
            do
            {
              v36 = (char *)a1 + 4 * v34;
              v37 = *(_DWORD *)((char *)a1 + *((unsigned int *)v36 + 4));
              v38 = v33 + v37;
              if( v33 + v37 < v33 || v38 + 3 < v38 )
                return(unsigned int)-1073741675;
              v39 = 2i64 * v34;
              v33 = (v38 + 3) & 0xFFFFFFFC;
              *(_QWORD *)(*(_QWORD *)(a3 + 32) + 16i64 * v34) = 0i64;
              if( v37 )
              {
                memmove(v35, (UINT8 *)a1 + *((unsigned int *)v36 + 4) + 4, v37);
                *(_QWORD *)(*(_QWORD *)(a3 + 32) + 16i64 * v34) = v35;
              }
              ++v34;
              v35 = (UINT8 *)(a3 + v33);
              *(_DWORD *)(*(_QWORD *)(a3 + 32) + 8 * v39 + 8) = v37;
            }
            while( v34 < *(_DWORD *)(a3 + 24) );
          }
          return 0;
        }
      }
      return(unsigned int)-1073741675;
    }
    if( v30 != 6 )
    {
      if( v30 == 16 )
        goto LABEL_61;
      return(unsigned int)-1073741705;
    }
  }
  v49 = *(_DWORD *)(a3 + 24);
  v50 = 8i64 * v49;
  if( v50 > 0xFFFFFFFF || v28 + (unsigned int)v50 < v28 )
    return(unsigned int)-1073741675;
  *(_QWORD *)(a3 + 32) = v29;
  v9 = 0;
  if( v49 )
  {
    do
    {
      v51 = v4++;
      *(_QWORD *)(*(_QWORD *)(a3 + 32) + 8 * v51) = *(UINT64 *)((char *)a1 + *((unsigned int *)a1 + v51 + 4));
    }
    while( v4 < *(_DWORD *)(a3 + 24) );
  }
  return(unsigned int)v9;
}

Referenced by:

AuthzBasepInitializeResourceClaimsFromSacl