EtwpRegisterPartitionPages

CHAR __fastcall EtwpRegisterPartitionPages(INT64 a1, INT64 a2, INT64 a3){
  char v6; 
  _QWORD *PoolWithTag; 
  _QWORD *v8; 
  unsigned __int64 v9; 
  __int64 v10; 
  char *v11; 
  char v12; 
  unsigned __int64 v13; 
  char v14; 
  unsigned int v15; 
  __int64 v16; 
  _QWORD *v17; 
  _QWORD *v18; 
  __int64 v19; 
  VOID *v20; 
  _QWORD *v21; 
  __int64 v22; 
  __int64 v24; 
  __int64 v25; 
  v6 = 0;
  PoolWithTag = ExAllocatePoolWithTag(NonPagedPoolNx, 0x20ui64, 0x4F777445ui64);
  v8 = PoolWithTag;
  if( !PoolWithTag )
    return(char)PoolWithTag;
  PoolWithTag[1] = a3;
  PoolWithTag[2] = a2;
  PoolWithTag[3] = a1;
  v9 = ExAcquireSpinLockExclusive(&dword_140C19690);
  if( EtwpMdlTable < 2 * ((unsigned int)dword_140C19684 >> 5) )
    goto LABEL_24;
  v10 = 2 * ((unsigned int)dword_140C19684 >> 5);
  if( (unsigned int)v10 < 4 )
    v10 = 4i64;
  v11 = (char *)EtwpMdlHashTableAllocator(8i64 * (unsigned int)v10);
  if( v11 )
  {
    if( (((_DWORD)v10 - 1) & (unsigned int)v10) != 0 )
    {
      v12 = -1;
      do
      {
        ++v12;
        LODWORD(v10) = (unsigned int)v10 >> 1;
      }
      while( (_DWORD)v10 );
      v10 = (unsigned int)(1 << v12);
    }
    if( (unsigned int)v10 > 0x4000000 )
      v10 = 0x4000000i64;
    v13 = (unsigned int)v10;
    if( v11 > &v11[8 * v10] )
      v13 = 0i64;
    if( v13 )
      memset64(v11, (unsigned __int64)&EtwpMdlTable + 1, v13);
    v14 = dword_140C19684;
    v15 = 0;
    v16 = -1i64 << (dword_140C19684 & 0x1F);
    if( (dword_140C19684 & 0xFFFFFFE0) != 0 )
    {
      do
      {
        v17 = qword_140C19688;
        while( 1 )
        {
          v18 = (_QWORD *)v17[v15];
          if( ((unsigned __int8)v18 & 1) != 0 )
            break;
          v17[v15] = *v18;
          v25 = v16 & v18[1];
          v19 = (37
               * (BYTE6(v25)
                + 37
                * (BYTE5(v25)
                 + 37
                 * (BYTE4(v25)
                  + 37 * (BYTE3(v25) + 37 * (BYTE2(v25) + 37 * (BYTE1(v25) + 37 * ((unsigned __int8)v25 + 11623883)))))))
               + HIBYTE(v25)) & (unsigned int)(v10 - 1);
          *v18 = *(_QWORD *)&v11[8 * v19];
          *(_QWORD *)&v11[8 * v19] = v18;
        }
        v14 = dword_140C19684;
        ++v15;
      }
      while( v15 < (unsigned int)dword_140C19684 >> 5 );
    }
    v20 = qword_140C19688;
    qword_140C19688 = v11;
    dword_140C19684 = (32 * v10) | v14 & 0x1F;
    if( v20 )
      EtwpMdlHashTableDeallocator(v20);
    goto LABEL_24;
  }
  if( (dword_140C19684 & 0xFFFFFFE0) != 0 )
  {
LABEL_24:
    v6 = 1;
    v24 = v8[1] & (-1i64 << (dword_140C19684 & 0x1F));
    v21 = qword_140C19688;
    v22 = (37
         * (BYTE6(v24)
          + 37
          * (BYTE5(v24)
           + 37
           * (BYTE4(v24)
            + 37 * (BYTE3(v24) + 37 * (BYTE2(v24) + 37 * (BYTE1(v24) + 37 * ((unsigned __int8)v24 + 11623883)))))))
         + HIBYTE(v24)) & (((unsigned int)dword_140C19684 >> 5) - 1);
    *v8 = *((_QWORD *)qword_140C19688 + v22);
    v21[v22] = v8;
    ++EtwpMdlTable;
  }
  ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&dword_140C19690);
  __writecr8(v9);
  if( !v6 )
    ExFreePoolWithTag(v8, 0x4F777445u);
  LOBYTE(PoolWithTag) = v6;
  return(char)PoolWithTag;
}

Referenced by:

EtwpAllocatePartitionMemory