MiFreeSlabEntry

VOID __fastcall MiFreeSlabEntry(INT64 a1, UINT64 *a2){
  _MMPFN *PfnDb; 
  __int64 v5; 
  unsigned __int64 v6; 
  unsigned __int64 v7; 
  unsigned __int8 CurrentIrql; 
  __int16 v9; 
  unsigned __int64 v10; 
  unsigned __int64 v11; 
  unsigned __int64 v12; 
  UINT64 v13; 
  char v14; 
  volatile signed __int32 *v15; 
  int v16; 
  int v17; 
  unsigned __int64 v18; 
  UINT64 SpinCount; 
  PfnDb = MmGetPfnDb();
  v5 = 0i64;
  v6 = (unsigned __int64)PfnDb + 48 * a2[3];
  v7 = (unsigned __int64)PfnDb + 48 * a2[4];
  CurrentIrql = KeGetCurrentIrql();
  v9 = 2;
  __writecr8(2ui64);
  if( v6 <= v7 )
  {
    v10 = v6 + 24;
    do
    {
      LODWORD(SpinCount) = 0;
      if( _interlockedbittestandset64((volatile signed __int32 *)v10, 0x3Fui64) )
      {
        do
        {
          do
            KeYieldProcessorEx(&SpinCount);
          while( *(__int64 *)v10 < 0 );
        }
        while( _interlockedbittestandset64((volatile signed __int32 *)v10, 0x3Fui64) );
        v9 = 2;
      }
      if( !v5 )
        v5 = *(_QWORD *)(qword_140C4E388 + 8 * ((*(_QWORD *)(v10 + 16) >> 39) & 0x3FFi64));
      if( !*(_DWORD *)(a1 + 48) )
        *(_QWORD *)(v10 + 16) &= 0x8FFFFFFFFFFFFFFFui64;
      v11 = *(_QWORD *)v10 & 0xC000000000000001ui64;
      *(_WORD *)(v10 + 8) = v9;
      *(_QWORD *)v10 = v11 | 1;
      MiSetPfnPageState(v10 - 24, 6);
      _InterlockedAnd64((volatile signed __int64 *)v10, 0x7FFFFFFFFFFFFFFFui64);
      v10 += 48i64;
    }
    while( v10 - 24 <= v7 );
  }
  __writecr8(CurrentIrql);
  MiUpdateSlabPagePlaceholderState(a1, a2[3], 512i64, 0i64);
  LOBYTE(v12) = 1;
  v13 = a2[3] >> 9;
  v14 = v13 & 0x1F;
  v15 = (volatile signed __int32 *)(qword_140C522C8 + 4 * (a2[3] >> 14));
  if( (v13 & 0x1F) + 1 <= 0x20 )
  {
    v16 = 1 << v14;
LABEL_20:
    _InterlockedAnd(v15, ~v16);
    goto LABEL_21;
  }
  if( (v13 & 0x1F) == 0 )
    goto LABEL_19;
  v17 = v13 & 0x1F;
  _InterlockedAnd(v15++, ~(((1 << (32 - v17)) - 1) << v14));
  v12 = 1i64 - (unsigned int)(32 - v17);
  if( v12 >= 0x20 )
  {
    v18 = v12 >> 5;
    v12 += -32i64 * (v12 >> 5);
    do
    {
      *v15++ = 0;
      --v18;
    }
    while( v18 );
  }
  if( v12 )
  {
LABEL_19:
    v16 = (1 << v12) - 1;
    goto LABEL_20;
  }
LABEL_21:
  MiFreeLargePageMemory(a2[3], 1ui64, 6ui64);
  ExFreePoolWithTag(a2, 0);
}

Referenced by:

MiFreeSlabEntries