EtwpRegisterPartitionPages

CHAR __stdcall EtwpRegisterPartitionPages(INT64 a1, INT64 a2, INT64 a3){
  char v6; 
  VOID **PoolWithTag; 
  VOID **v8; 
  unsigned __int64 v9; 
  __int64 v10; 
  char *v11; 
  char v12; 
  unsigned __int64 v13; 
  char v14; 
  unsigned int v15; 
  __int64 v16; 
  __int64 v17; 
  _QWORD *v18; 
  __int64 v19; 
  VOID *v20; 
  __int64 v21; 
  __int64 v22; 
  __int64 v24; 
  __int64 v25; 

  v6 = 0;
  PoolWithTag = ExAllocatePoolWithTag(0x200ui64, 0x20ui64, 1333228613i64);
  v8 = PoolWithTag;
  if( !PoolWithTag )
    return(char)PoolWithTag;
  PoolWithTag[1] = (VOID *)a3;
  PoolWithTag[2] = (VOID *)a2;
  PoolWithTag[3] = (VOID *)a1;
  v9 = (unsigned __int8)ExAcquireSpinLockExclusive((INT64 *)&ExBootDevicesRemovedEvent + 146);
  if( *(&ExBootDevicesRemovedEvent + 288) < (unsigned int)(2 * (*(&ExBootDevicesRemovedEvent + 289) >> 5)) )
    goto LABEL_24;
  v10 = (unsigned int)(2 * (*(&ExBootDevicesRemovedEvent + 289) >> 5));
  if( (unsigned int)v10 < 4 )
    v10 = 4i64;
  LODWORD(v11) = EtwpMdlHashTableAllocator(8 * 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)&ExBootDevicesRemovedEvent + 1153, v13);
    v14 = *(&ExBootDevicesRemovedEvent + 1156);
    v15 = 0;
    v16 = -1i64 << (*(&ExBootDevicesRemovedEvent + 1156) & 0x1F);
    if( (*(&ExBootDevicesRemovedEvent + 289) & 0xFFFFFFE0) != 0 )
    {
      do
      {
        v17 = *(&ExBootDevicesRemovedEvent + 145);
        while( 1 )
        {
          v18 = *(_QWORD **)(v17 + 8i64 * v15);
          if( ((unsigned __int8)v18 & 1) != 0 )
            break;
          *(_QWORD *)(v17 + 8i64 * 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 = *(&ExBootDevicesRemovedEvent + 1156);
        ++v15;
      }
      while( v15 < *(&ExBootDevicesRemovedEvent + 289) >> 5 );
    }
    v20 = (VOID *)*(&ExBootDevicesRemovedEvent + 145);
    *(&ExBootDevicesRemovedEvent + 145) = v11;
    *(&ExBootDevicesRemovedEvent + 289) = (32 * v10) | v14 & 0x1F;
    if( v20 )
      EtwpMdlHashTableDeallocator(v20);
    goto LABEL_24;
  }
  if( (*(&ExBootDevicesRemovedEvent + 289) & 0xFFFFFFE0) != 0 )
  {
LABEL_24:
    v6 = 1;
    v24 = (unsigned __int64)v8[1] & (-1i64 << (*(&ExBootDevicesRemovedEvent + 1156) & 0x1F));
    v21 = *(&ExBootDevicesRemovedEvent + 145);
    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)((*(&ExBootDevicesRemovedEvent + 289) >> 5) - 1);
    *v8 = *(VOID **)(*(&ExBootDevicesRemovedEvent + 145) + 8 * v22);
    *(_QWORD *)(v21 + 8 * v22) = v8;
    ++*(&ExBootDevicesRemovedEvent + 288);
  }
  ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&ExBootDevicesRemovedEvent + 146);
  __writecr8(v9);
  if( !v6 )
    ExFreePoolWithTag(v8, 0x4F777445u);
  LOBYTE(PoolWithTag) = v6;
  return(char)PoolWithTag;
}

Referenced by:

EtwpAllocatePartitionMemory