CreateNewEventEntry

__int64 __fastcall CreateNewEventEntry(
        char a1,
        __int128 *a2,
        unsigned __int8 a3,
        __int64 a4,
        unsigned __int8 a5,
        int a6,
        __int64 *a7){
  unsigned __int8 v7; 
  __int64 v8; 
  __int64 v11; 
  __int64 v12; 
  unsigned __int8 v13; 
  unsigned int *v14; 
  __int64 v15; 
  __int64 v16; 
  __int64 v17; 
  VOID **PoolWithTag; 
  __int64 v19; 
  __int64 NextOffset; 
  VOID *v21; 
  size_t v22; 
  __int64 v23; 
  __int64 v24; 
  __int128 v25; 
  unsigned __int8 v26; 
  const VOID **v27; 
  __int64 v28; 
  __int64 v29; 
  VOID *v30; 
  size_t v31; 
  char *v32; 
  int v33; 
  __int64 v35[7]; 

  v7 = 0;
  v8 = a3;
  v11 = 0i64;
  v12 = 0i64;
  v13 = 0;
  *a7 = 0i64;
  if( (_BYTE)v8 )
  {
    v14 = (unsigned int *)(a4 + 8);
    do
    {
      v15 = *v14;
      v14 += 4;
      if( v13 >= 2u )
        v12 += v15;
      v16 = v15 + v11;
      if( v13 >= 2u )
        v16 = v11;
      ++v13;
      v11 = v16;
    }
    while( v13 < (unsigned __int8)v8 );
  }
  if( (unsigned __int64)(v12 + v11) > 0xFFFF )
    return 3221225621i64;
  v17 = v12 + 16 * v8 + 46;
  if( !v17 )
    return 3221225495i64;
  PoolWithTag = ExAllocatePoolWithTag(a1 != 0 ? 1 : 512, v17, 1195471444i64);
  v19 = (__int64)PoolWithTag;
  if( PoolWithTag )
    memset(PoolWithTag, 0i64, v17);
  v35[0] = v19;
  if( !v19 )
    return 3221225495i64;
  v35[1] = v17;
  NextOffset = CBufferGetNextOffset(v35, 16 * v8);
  if( a5 != -2 )
  {
    do
    {
      if( v7 < 2u )
      {
        *(_OWORD *)(NextOffset + 16i64 * v7) = *(_OWORD *)(a4 + 16i64 * v7);
      }
      else
      {
        v21 = (VOID *)CBufferGetNextOffset(v35, *(unsigned int *)(a4 + 16i64 * v7 + 8));
        memmove(v21, *(const VOID **)(a4 + 16i64 * v7), v22);
        *(_QWORD *)(NextOffset + 16i64 * v7) = v21;
        *(_DWORD *)(NextOffset + 16i64 * v7 + 12) = *(_DWORD *)(a4 + 16i64 * v7 + 12);
        *(_DWORD *)(NextOffset + 16i64 * v7 + 8) = *(_DWORD *)(a4 + 16i64 * v7 + 8);
      }
      ++v7;
    }
    while( v7 < (unsigned int)a5 + 2 );
  }
  v24 = CBufferGetNextOffset(v35, 0x2Eui64);
  *(_QWORD *)(v24 + 16) = NextOffset;
  v25 = *a2;
  *(_BYTE *)(v24 + 45) = a5;
  v26 = a5 + 2;
  *(_BYTE *)(v24 + 44) = v8;
  *(_DWORD *)(v24 + 40) = a6;
  *(_OWORD *)v24 = v25;
  if( (unsigned __int8)(a5 + 2) < (unsigned __int8)v8 )
  {
    v27 = (const VOID **)(16i64 * v26 + a4 + 8);
    v28 = v23 - 54 - a4;
    v29 = (unsigned __int8)(v8 - v26);
    do
    {
      v30 = (VOID *)CBufferGetNextOffset(v35, *(unsigned int *)v27);
      memmove(v30, *(v27 - 1), v31);
      v32 = (char *)v27 + v28;
      *(_QWORD *)&v32[*(_QWORD *)(v24 + 16)] = v30;
      *(_DWORD *)&v32[*(_QWORD *)(v24 + 16) + 12] = *((_DWORD *)v27 + 1);
      v33 = *(_DWORD *)v27;
      v27 += 2;
      *(_DWORD *)&v32[*(_QWORD *)(v24 + 16) + 8] = v33;
      --v29;
    }
    while( v29 );
  }
  *a7 = v24;
  return 0i64;
}

Referenced by:

InsertEventEntryInLookUpTable