MiGetSinglePageToZero

NTSTATUS __stdcall MiGetSinglePageToZero(
        _MI_PARTITION *Partition,
        _MI_ZERO_THREAD_CONTEXT *ThreadContext,
        UINT64 *Color){
  _MMPFNLIST *v4; 
  int v5; 
  unsigned __int64 v6; 
  unsigned int i; 
  unsigned __int64 Flink; 
  _MMPFN *v9; 
  int v10; 
  bool v11; 
  NTSTATUS v12; 
  _MI_ZERO_THREAD_CONTEXT v14; 
  _MMPFNLIST *v15; 

  v14 = ThreadContext[65];
  v4 = Partition->PageLists.FreePagesByColor[1];
  v5 = 0;
  v15 = v4;
  LOBYTE(v6) = 17;
  for( i = 0; i < 2; ++i )
  {
    do
    {
      Flink = v4[ThreadContext[65]].Flink;
      if( Flink == 0xFFFFFFFFFi64 )
        goto LABEL_6;
      v9 = &MmGetPfnDb()[Flink];
      if( !i && v9->u2._bf_0 < 0 )
      {
        v5 = 1;
LABEL_6:
        v9 = 0i64;
      }
      if( !v9 )
        goto LABEL_14;
      v6 = MiLockPageInline(v9);
      if( Flink <= 0xFFFFFFFFFi64
        && (MmGetPfnDb()[Flink].u4._bf_0 & 0x4000000000000i64) != 0
        && (*(_BYTE *)(&v9->u3 + 1) & 7) == 1
        && (v9->u4._bf_0 & 0x1000000000i64) == 0 )
      {
        if( (*(_BYTE *)(&v9->u3 + 1) & 8) == 0 )
        {
          v5 = 0;
          break;
        }
        _InterlockedAnd64(&v9->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
        __writecr8(v6);
        v9 = 0i64;
LABEL_14:
        v10 = ThreadContext[65] & ~*(&stru_140C4DB30 + 36) | *(&stru_140C4DB30 + 36) & (ThreadContext[65] + 1);
        ThreadContext[65] = v10;
        goto LABEL_15;
      }
      _InterlockedAnd64(&v9->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
      __writecr8(v6);
      v10 = ThreadContext[65];
      v9 = 0i64;
LABEL_15:
      v11 = v10 == v14;
      v4 = v15;
    }
    while( !v11 );
    if( !v5 )
      break;
    v4 = v15;
  }
  if( !v9 )
    return 0;
  if( v9->u3.ReferenceCount )
    KeBugCheckEx(0x4Eu, (PVOID)0x8D, (PVOID)Flink, (PVOID)*(unsigned int *)&v9->u3.ReferenceCount, v9->ListEntry.Blink);
  v12 = MiBeginPageAccessor((_RTL_BALANCED_NODE *)ThreadContext, (INT64)v9);
  _InterlockedAnd64(&v9->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
  __writecr8((unsigned __int8)v6);
  if( v12 )
    return(int)v9;
  else
    return 0;
}

Referenced by:

MiGetPagesToZero