MiUnlinkStandbyBatch

NTSTATUS __stdcall MiUnlinkStandbyBatch(
        _MMPFN *BaseStandbyPfn,
        _MMPTE *ProtoPte,
        UINT64 OldPriority,
        _MMPTE *PoINTerPte,
        UINT64 NumberOfPtes,
        _MMPFN **PfnToDiscard){
  UINT64 v6; 
  int v8; 
  _MMPFN *PfnDb; 
  union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v11; 
  union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v12; 
  INT64 v13; 
  char v14; 
  char v15; 
  int v16; 
  int v17; 
  int v18; 

  v6 = NumberOfPtes;
  v8 = OldPriority;
  if( !NumberOfPtes )
    return NumberOfPtes - v6;
  do
  {
    PfnDb = MmGetPfnDb();
    while( 1 )
    {
      while( 1 )
      {
        v11.Long = (unsigned __int64)ProtoPte->u;
        v12.Long = (unsigned __int64)ProtoPte->u;
        if( (ProtoPte->u.Long & 1) != 0 )
          goto LABEL_11;
        if( (ProtoPte->u.Long & 0xC00) != 2048 )
          return NumberOfPtes - v6;
        if( !v11.Long || !*(&stru_140C4DB30 + 42) || (*(&stru_140C4DB30 + 42) & v11.Long) != 0 )
        {
          v12.Long = (unsigned __int64)ProtoPte->u;
          if( *(&stru_140C4DB30 + 42) && (v11.Long & 0x10) == 0 )
            v12.Long = v11.Long & ~*(&stru_140C4DB30 + 42);
LABEL_11:
          if( (PfnDb[(v12.Long >> 12) & 0xFFFFFFFFFi64].u4._bf_0 & 0x4000000000000i64) != 0 )
            break;
        }
      }
      v13 = (INT64)&PfnDb[(v12.Long >> 12) & 0xFFFFFFFFFi64];
      if( _interlockedbittestandset64((volatile signed __int32 *)(v13 + 24), 0x3Fui64) )
        return NumberOfPtes - v6;
      if( ProtoPte->u.Long == v11.Long )
        break;
      _InterlockedAnd64((volatile signed __int64 *)(v13 + 24), 0x7FFFFFFFFFFFFFFFui64);
    }
    if( !v13 )
      break;
    if( (ProtoPte->u.Long & 1) == 0 )
    {
      v14 = *(_BYTE *)(v13 + 34);
      if( (v14 & 0x20) == 0 )
      {
        v15 = *(_BYTE *)(v13 + 35);
        if( (v15 & 0x40) == 0 && (v14 & 7) == 2 )
        {
          v16 = (v15 & 8) != 0 ? 5 : v15 & 7;
          if( v16 == v8 )
          {
            LOBYTE(v17) = MiIsPfnFromSlabAllocation(v13);
            if( !v17 || *(_WORD *)(v13 + 32) || *(__int64 *)v13 >= 0 )
              continue;
          }
        }
      }
    }
    _InterlockedAnd64((volatile signed __int64 *)(v13 + 24), 0x7FFFFFFFFFFFFFFFui64);
    return NumberOfPtes - v6;
    MiUnlinkPageFromList((_MMPFN *)v13, 1ui64);
    if( !v18 )
    {
      *PfnToDiscard = (_MMPFN *)v13;
      return NumberOfPtes - v6;
    }
    ++PoINTerPte;
    ++ProtoPte;
    MiReadyStandbyPageForActive((_MMPFN *)v13, PoINTerPte);
    _InterlockedAnd64((volatile signed __int64 *)(v13 + 24), 0x7FFFFFFFFFFFFFFFui64);
    --v6;
  }
  while( v6 );
  return NumberOfPtes - v6;
}

Referenced by:

MmCheckCachedPageStates