MiScrubProcessLargePages

VOID __stdcall MiScrubProcessLargePages(SECONDARY_INTERRUPT_MASK *a1){
  _ETHREAD *CurrentThread; 
  _EPROCESS *Process; 
  unsigned int LargePrivateVadCount; 
  _QWORD *v4; 
  _QWORD *v5; 
  _RTL_BALANCED_NODE *Root; 
  _QWORD *Children; 
  unsigned int v8; 
  _QWORD **v9; 
  INT64 v10; 
  _QWORD *v11; 
  _QWORD *v12; 
  int v13; 
  _QWORD *Pool; 
  __int64 v15; 
  NTSTATUS v16; 
  __int64 *v17; 
  unsigned int i; 
  __int64 v19; 
  _KEVENT *v20; 
  _QWORD *v22; 
  _QWORD *v23; 

  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  Process = CurrentThread->Tcb.ApcState.Process;
  --CurrentThread->Tcb.KernelApcDisable;
  --CurrentThread->Tcb.SpecialApcDisable;
  ExAcquirePushLockSharedEx(&Process->AddressCreationLock, 0i64);
  CurrentThread->$84F33738BEE95ACDF5C5BF1C8FDC7C8C::_bf_0 |= 2u;
  if( (Process->Flags & 0x20) != 0 )
  {
    UNLOCK_ADDRESS_SPACE_SHARED(CurrentThread, Process);
  }
  else
  {
    LargePrivateVadCount = Process->LargePrivateVadCount;
    v4 = 0i64;
    v22 = 0i64;
    v5 = 0i64;
    Root = Process->VadRoot.Root;
    Children = 0i64;
    v8 = 13;
    while( Root )
    {
      Children = Root->Children;
      Root = Root->Children[0];
    }
    while( LargePrivateVadCount && Children )
    {
      v9 = (_QWORD **)Children[1];
      v10 = (INT64)Children;
      v11 = Children;
      if( v9 )
      {
        v12 = *v9;
        for( Children = (_QWORD *)Children[1]; v12; v12 = (_QWORD *)*v12 )
          Children = v12;
      }
      else
      {
        while( 1 )
        {
          Children = (_QWORD *)(Children[2] & 0xFFFFFFFFFFFFFFFCui64);
          if( !Children || (_QWORD *)*Children == v11 )
            break;
          v11 = Children;
        }
      }
      LOBYTE(v13) = MiIsVadLargePrivate(v10);
      if( v13 && (*(_DWORD *)(v10 + 48) & 0x500000) != 5242880 )
      {
        --CurrentThread->Tcb.SpecialApcDisable;
        ExAcquirePushLockSharedEx((_EX_PUSH_LOCK *)(v10 + 40), 0i64);
        CurrentThread->_bf_1 |= 0x40u;
        if( (*(_DWORD *)(v10 + 48) & 4) != 0 )
        {
          MiUnlockVadShared(&CurrentThread->Tcb, (_EX_PUSH_LOCK *)v10);
        }
        else
        {
          if( v8 >= 0xD )
          {
            Pool = MiAllocatePool(256i64, 0x70ui64, 0x7356694Dui64);
            v4 = Pool;
            if( !Pool )
            {
              MiUnlockVadShared(&CurrentThread->Tcb, (_EX_PUSH_LOCK *)v10);
              break;
            }
            v8 = 0;
            if( v5 )
              *v22 = Pool;
            else
              v5 = Pool;
            v22 = Pool;
          }
          v15 = v8++;
          v4[v15 + 1] = v10;
          if( !_InterlockedIncrement((volatile signed __int32 *)(v10 + 36)) )
            __fastfail(0xEu);
          MiUnlockVadShared(&CurrentThread->Tcb, (_EX_PUSH_LOCK *)v10);
          --LargePrivateVadCount;
        }
      }
    }
    UNLOCK_ADDRESS_SPACE_SHARED(CurrentThread, Process);
    v16 = 1;
    if( v5 )
    {
      do
      {
        v17 = v5 + 1;
        v23 = (_QWORD *)*v5;
        for( i = 0; i < 0xD; ++i )
        {
          v19 = *v17;
          if( !*v17 )
            break;
          --CurrentThread->Tcb.SpecialApcDisable;
          ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)(v19 + 40), 0i64);
          CurrentThread->$84F33738BEE95ACDF5C5BF1C8FDC7C8C::_bf_0 |= 0x80u;
          if( (*(_DWORD *)(v19 + 48) & 4) == 0 && v16 == 1 )
            v16 = MiScrubLargeMappedPage((_MMVAD *)a1, (_MISCRUB_PACKET *)Process, (_EPROCESS *)v19, v20);
          MiUnlockAndDereferenceVad((_MMVAD_SHORT *)v19);
          ++v17;
        }
        ExFreePoolWithTag(v5, 0);
        v5 = v23;
      }
      while( v23 );
    }
  }
  KeLeaveCriticalRegionThread(&CurrentThread->Tcb);
}

Referenced by:

MiScrubProcesses