SeCaptureObjectTypeList

INT64 __fastcall SeCaptureObjectTypeList(UINT64 a1, UINT64 a2, CHAR a3, CHAR **a4){
  unsigned int v5; 
  int v7; 
  char *PoolWithTag; 
  __int64 v9; 
  char *v10; 
  __int64 v11; 
  __int64 v12; 
  __int64 v13; 
  __int64 v14; 
  char *v15; 
  _OWORD *v16; 
  unsigned int v17; 
  __int64 v18; 
  int v20; 
  char *v21; 
  __int64 v22[4]; 
  v5 = a2;
  v22[0] = (__int64)a4;
  v7 = 0;
  PoolWithTag = 0i64;
  *(_QWORD *)v22[0] = 0i64;
  if( a3 != 1 )
    return 3221225474i64;
  if( (_DWORD)a2 )
  {
    if( a1 )
    {
      v9 = 16i64 * (unsigned int)a2;
      if( v9 )
      {
        if( (a1 & 3) != 0 )
          ExRaiseDatatypeMisalignment();
        if( v9 + a1 > 0x7FFFFFFF0000i64 || v9 + a1 < a1 )
          MEMORY[0x7FFFFFFF0000] = 0;
      }
      PoolWithTag = (char *)ExAllocatePoolWithTag(PagedPool, 48i64 * (unsigned int)a2, 0x744F6553ui64);
      v21 = PoolWithTag;
      v10 = PoolWithTag;
      if( PoolWithTag )
      {
        v11 = 0i64;
        v20 = 0;
        while( (unsigned int)v11 < v5 )
        {
          v12 = (unsigned int)v11;
          v13 = 2 * v11;
          v14 = *(unsigned __int16 *)(a1 + 8 * v13);
          if( (unsigned int)v14 > 4 )
            goto LABEL_27;
          v15 = &PoolWithTag[48 * v12];
          *(_DWORD *)v15 = (unsigned __int16)v14;
          v16 = *(_OWORD **)(a1 + 8 * v13 + 8);
          if( ((unsigned __int8)v16 & 3) != 0 )
            ExRaiseDatatypeMisalignment();
          *(_OWORD *)(v15 + 4) = *v16;
          *((_QWORD *)v15 + 3) = 0i64;
          *((_DWORD *)v15 + 8) = 0;
          *((_QWORD *)v15 + 5) = 0i64;
          if( v20 )
          {
            v17 = v14;
            PoolWithTag = v21;
            if( (unsigned int)v14 > (unsigned int)*(unsigned __int16 *)&v21[48 * (v20 - 1)] + 1 || !(_WORD)v14 )
              goto LABEL_27;
          }
          else
          {
            if( (_WORD)v14 )
            {
              v7 = -1073741811;
              PoolWithTag = v21;
              break;
            }
            v17 = 0;
            PoolWithTag = v21;
          }
          v18 = 6 * v12;
          if( (_WORD)v14 )
            *(_DWORD *)&v10[8 * v18 + 20] = *((_DWORD *)v22 + v17 + 1);
          else
            *(_DWORD *)&v10[8 * v18 + 20] = -1;
          *((_DWORD *)&v22[1] + v14) = v20;
          v11 = (unsigned int)++v20;
          v7 = 0;
        }
      }
      else
      {
        v7 = -1073741670;
      }
    }
    else
    {
LABEL_27:
      v7 = -1073741811;
    }
  }
  if( v7 < 0 )
  {
    if( PoolWithTag )
      ExFreePoolWithTag(PoolWithTag, 0);
  }
  else
  {
    *a4 = PoolWithTag;
  }
  return(unsigned int)v7;
}

Referenced by:

SeAccessCheckByTypeWithAdminlessChecks
SepAccessCheckAndAuditAlarmWithAdminlessChecks