MiDeleteKernelStack

VOID __stdcall MiDeleteKernelStack(_MMPTE *PointerPte, UINT64 DeleteFlags){
  __int64 v2; 
  __int64 v3; 
  UINT64 v4; 
  UINT64 v5; 
  _MI_PARTITION *v6; 
  _MMPTE *v7; 
  _MMPTE *v8; 
  _MMPTE *v9; 
  unsigned __int8 v10; 
  UINT64 v11; 
  _MMPTE *PteBase; 
  UINT64 Long; 
  struct _KPRCB *CurrentPrcb; 
  unsigned __int64 v15; 
  __int64 CachedResidentAvailable; 
  unsigned __int64 v17; 
  bool v18; 
  signed __int32 v19; 
  _MMPTE *v20; 
  unsigned __int64 v21; 
  int v22; 
  unsigned __int8 v23; 
  UINT64 v24; 
  UINT64 v25; 

  v21 = 0i64;
  if( (DeleteFlags & 1) != 0 )
    v2 = 18i64;
  else
    v2 = *(&stru_140C4DB30 + 3532);
  v3 = (unsigned int)(v2 + 1);
  v4 = (unsigned int)v2;
  v22 = v2 + 1;
  v25 = (unsigned int)v2;
  v5 = 0i64;
  v6 = 0i64;
  v7 = &PointerPte[-v2];
  v20 = v7;
  v8 = v7;
  v9 = &v7[v3];
  MiLockWorkingSetShared();
  v23 = v10;
  if( v7 >= v9 )
    goto LABEL_15;
  v11 = (UINT64)v7;
  PteBase = MmGetPteBase();
  do
  {
    if( v5 )
    {
      if( (v11 & 0xFFF) != 0 )
        goto LABEL_7;
      MiUnlockPageTableInternal((INT64)&stru_140C4DB30 + 5904, v5);
    }
    v5 = (UINT64)PteBase + ((v11 >> 9) & 0x7FFFFFFFF8i64);
    MiLockPageTableInternal((INT64)&stru_140C4DB30 + 5904, v5, 0i64);
LABEL_7:
    Long = v7->u.Long;
    MiPteInShadowRange(v11);
    v24 = Long;
    if( (Long & 1) != 0 )
    {
      if( !v6 )
      {
        MiPteInShadowRange((UINT64)&v24);
        v6 = *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267)
                               + 8
                               * (((unsigned __int64)MmGetPfnDb()[(Long >> 12) & 0xFFFFFFFFFi64].u4._bf_0 >> 39) & 0x3FF));
      }
      MiDeleteValidSystemPage((_MMPTE *)&stru_140C4DB30 + 738, (UINT64)v7, 0i64);
      ++v21;
    }
    v11 = (UINT64)++v7;
  }
  while( v7 < v9 );
  v4 = v25;
  v8 = v20;
  if( v5 )
    MiUnlockPageTableInternal((INT64)&stru_140C4DB30 + 5904, v5);
  v10 = v23;
  LODWORD(v3) = v22;
LABEL_15:
  MiUnlockWorkingSetShared((_MMSUPPORT_INSTANCE *)((char *)&stru_140C4DB30 + 5904), v10);
  if( v6 == &Irp )
    _InterlockedExchangeAdd64((_QWORD *)&stru_140C4DB30 + 571, -(__int64)v4);
  v15 = v21;
  if( v6 == &Irp )
  {
    CurrentPrcb = KeGetCurrentPrcb();
    CachedResidentAvailable = (int)CurrentPrcb->CachedResidentAvailable;
    if( (_DWORD)CachedResidentAvailable == -1 )
    {
      v15 = v21;
    }
    else
    {
      v17 = v21;
      if( v21 + CachedResidentAvailable <= 0x100 )
      {
        do
        {
          if( v17 >= 0x80000 )
            break;
          v19 = _InterlockedCompareExchange(
                  (volatile signed __int32 *)&CurrentPrcb->CachedResidentAvailable,
                  CachedResidentAvailable + v17,
                  CachedResidentAvailable);
          v18 = (_DWORD)CachedResidentAvailable == v19;
          LODWORD(CachedResidentAvailable) = v19;
          if( v18 )
            goto LABEL_22;
          if( v19 == -1 )
            break;
          v17 = v21;
        }
        while( v21 + v19 <= 0x100 );
      }
      if( (int)CachedResidentAvailable > 192
        && (_DWORD)CachedResidentAvailable != -1
        && (_DWORD)CachedResidentAvailable == _InterlockedCompareExchange(
                                                (volatile signed __int32 *)&CurrentPrcb->CachedResidentAvailable,
                                                192,
                                                CachedResidentAvailable) )
      {
        v15 = v21 + (int)CachedResidentAvailable - 192;
      }
    }
  }
  if( v15 )
    _InterlockedExchangeAdd64((volatile signed __int64 *)&v6->Vp.ResidentAvailablePages, v15);
LABEL_22:
  MiReleasePtes(
    (_MI_SYSTEM_PTE_TYPE *)((char *)&stru_140C4DB30 + 3432),
    v8,
    (unsigned int)v3,
    (_KTBFLUSH_TYPE)CurrentPrcb);
  MiReturnCommit(v6, v4);
}

Referenced by:

MiDeleteCachedKernelStack
MmDeleteKernelStack