MiFreeSlabEntry

VOID __stdcall MiFreeSlabEntry(INT64 a1, UINT64 *a2){
  _MMPFN *PfnDb; 
  __int64 v5; 
  _MMPFN *v6; 
  unsigned __int64 v7; 
  unsigned __int8 CurrentIrql; 
  __int16 v9; 
  _MIPFNBLINK *p_u2; 
  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 = &PfnDb[a2[3]];
  v7 = (unsigned __int64)&PfnDb[a2[4]];
  CurrentIrql = KeGetCurrentIrql();
  v9 = 2;
  __writecr8(2ui64);
  if( (unsigned __int64)v6 <= v7 )
  {
    p_u2 = &v6->u2;
    do
    {
      LODWORD(SpinCount) = 0;
      if( _interlockedbittestandset64((volatile signed __int32 *)p_u2, 0x3Fui64) )
      {
        do
        {
          do
            KeYieldProcessorEx(&SpinCount);
          while( p_u2->_bf_0 < 0 );
        }
        while( _interlockedbittestandset64((volatile signed __int32 *)p_u2, 0x3Fui64) );
        v9 = 2;
      }
      if( !v5 )
        v5 = *(_QWORD *)(*(&stru_140C4DB30 + 267) + 8 * (((unsigned __int64)p_u2[2]._bf_0 >> 39) & 0x3FF));
      if( !*(_DWORD *)(a1 + 48) )
        p_u2[2]._bf_0 &= 0x8FFFFFFFFFFFFFFFui64;
      v11 = p_u2->_bf_0 & 0xC000000000000001ui64;
      LOWORD(p_u2[1]._bf_0) = v9;
      p_u2->_bf_0 = v11 | 1;
      MiSetPfnPageState((INT64)&p_u2[-3], 6);
      _InterlockedAnd64(&p_u2->Lock, 0x7FFFFFFFFFFFFFFFui64);
      p_u2 += 6;
    }
    while( (unsigned __int64)&p_u2[-3] <= v7 );
  }
  __writecr8(CurrentIrql);
  MiUpdateSlabPagePlaceholderState(a1, a2[3], 512i64, 0);
  LOBYTE(v12) = 1;
  v13 = a2[3] >> 9;
  v14 = v13 & 0x1F;
  v15 = (volatile signed __int32 *)(*(&stru_140C50B28 + 756) + 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