SepCaptureFqbnArray

INT64 __fastcall SepCaptureFqbnArray(CHAR *Src, UINT64 a2, INT64 a3, CHAR **a4){
  unsigned int v4; 
  UINT64 v6; 
  UINT8 *PoolWithTag; 
  UINT64 v9; 
  unsigned int i; 
  unsigned int v11; 
  UINT8 *v12; 
  CHAR *v13; 
  unsigned int v14; 
  UINT8 *v15; 
  unsigned int j; 
  __int64 v17; 
  unsigned __int64 v18; 
  v4 = a2;
  v6 = 24i64 * (unsigned int)a2;
  if( v6 > 0xFFFFFFFF )
    return 3221225621i64;
  PoolWithTag = (UINT8 *)ExAllocatePoolWithTag(PagedPool, (unsigned int)v6, 0x74416553ui64);
  if( !PoolWithTag )
    return 3221225626i64;
  if( (_DWORD)v6 )
  {
    if( ((unsigned __int8)Src & 3) != 0 )
      ExRaiseDatatypeMisalignment();
    if( (unsigned __int64)&Src[(unsigned int)v6] > 0x7FFFFFFF0000i64 || &Src[(unsigned int)v6] < Src )
      MEMORY[0x7FFFFFFF0000] = 0;
  }
  memmove(PoolWithTag, (UINT8 *)Src, (unsigned int)v6);
  if( (((unsigned int)v6 + 1i64) & 0xFFFFFFFFFFFFFFFEui64) < (unsigned int)v6 )
  {
LABEL_27:
    v14 = -1073741675;
    goto LABEL_28;
  }
  v9 = ((_DWORD)v6 + 1) & 0xFFFFFFFE;
  for( i = 0; i < v4; ++i )
  {
    v11 = v9 + *(unsigned __int16 *)&PoolWithTag[24 * i + 8];
    if( v11 < (unsigned int)v9 )
      goto LABEL_27;
    v9 = v11;
  }
  v12 = (UINT8 *)ExAllocatePoolWithTag(PagedPool, v9, 0x74416553ui64);
  v13 = (CHAR *)v12;
  if( !v12 )
  {
    v14 = -1073741670;
LABEL_28:
    ExFreePoolWithTag(PoolWithTag, 0);
    return v14;
  }
  memmove(v12, PoolWithTag, v6);
  v15 = (UINT8 *)((unsigned __int64)&v13[v6 + 1] & 0xFFFFFFFFFFFFFFFEui64);
  for( j = 0; j < v4; ++j )
  {
    v17 = *(unsigned __int16 *)&PoolWithTag[24 * j + 8];
    if( (_WORD)v17 )
    {
      v18 = *(_QWORD *)&PoolWithTag[24 * j + 16];
      if( (v18 & 1) != 0 )
        ExRaiseDatatypeMisalignment();
      if( v18 + v17 > 0x7FFFFFFF0000i64 || v18 + v17 < v18 )
      {
        MEMORY[0x7FFFFFFF0000] = 0;
        LOWORD(v17) = *(_WORD *)&PoolWithTag[24 * j + 8];
      }
    }
    memmove(v15, *(UINT8 **)&PoolWithTag[24 * j + 16], (unsigned __int16)v17);
    *(_QWORD *)&v13[24 * j + 16] = v15;
    v15 += *(unsigned __int16 *)&PoolWithTag[24 * j + 8];
  }
  ExFreePoolWithTag(PoolWithTag, 0);
  *a4 = v13;
  return 0i64;
}

Referenced by:

SepCaptureTokenSecurityAttributesInformation