MiPfPutPagesInTransition

void __fastcall MiPfPutPagesInTransition(INT64 a1, _QWORD *a2, int a3, __int64 a4, const char *__ptr32 a5, int a6){
  struct _SLIST_ENTRY *v6; 
  unsigned int v7; 
  INT64 v8; 
  __int16 *v9; 
  __int64 v10; 
  _MMPTE *v11; 
  __int64 v12; 
  int IoPriorityThread; 
  __int64 v14; 
  unsigned int v15; 
  __int64 v16; 
  __int64 v17; 
  _MMPFN *v18; 
  char v19; 
  _MMPFN *PfnDb; 
  _QWORD *v21; 
  INT64 v22; 
  unsigned __int64 v23; 
  _QWORD *v24; 
  unsigned int v25; 
  unsigned __int64 v26; 
  int v27; 
  unsigned int v28; 
  unsigned __int64 v29; 
  unsigned __int64 v30; 
  unsigned __int64 v31; 
  INT64 v32; 
  unsigned __int64 v33; 
  __int64 v34; 
  __int64 v35; 
  __int64 v36; 
  int v37; 
  UINT64 v38; 
  int v39; 
  int v40; 
  __int64 v41; 
  char *v42; 
  _QWORD *v43; 
  _BYTE *v44; 
  UINT64 *v45; 
  __int64 v46; 
  unsigned __int8 CurrentIrql; 
  int v48; 
  signed __int32 i; 
  struct _KPRCB *CurrentPrcb; 
  UINT64 v51; 
  __int16 *v52; 
  UINT64 v53; 
  _MMPFN *v54; 
  int v55; 
  bool v56; 
  signed __int32 v57; 
  __int64 v58; 
  struct _SLIST_ENTRY *v59; 
  PSLIST_ENTRY *v60; 
  char *v61; 
  unsigned __int64 v62; 
  __int16 *v63; 
  INT64 SlabAllocator; 
  _MI_PARTITION *v65; 
  unsigned int v66; 
  signed __int32 v67; 
  UINT64 Page; 
  UINT64 v69; 
  unsigned int PagingFileOffset; 
  __int64 v71; 
  int IsPteInStore; 
  __int64 v73; 
  bool v74; 
  __int64 v75; 
  UINT64 v76; 
  __int64 v77; 
  __int64 v78; 
  UINT64 v79; 
  int v80; 
  int v81; 
  char *v82; 
  unsigned int v83; 
  INT64 v84; 
  _MMPFN *v85; 
  __int64 v86; 
  char *v87; 
  _MMPTE *v88; 
  char v89; 
  int v90; 
  unsigned int v91; 
  INT64 a1a; 
  UINT64 SpinCount; 
  unsigned int v94; 
  UINT64 PageFrameIndex; 
  _BYTE *v96; 
  unsigned __int64 v97; 
  char *v98; 
  UINT64 NewPriority; 
  __int16 *v100; 
  void *Src; 
  INT64 v102[2]; 
  unsigned __int64 v103; 
  unsigned __int64 v104; 
  __int64 v105; 
  unsigned __int64 v106; 
  PSLIST_ENTRY ListEntry; 
  int PageIrql; 
  int v111; 
  PageIrql = a3;
  v6 = 0i64;
  v7 = *(_DWORD *)(a1 + 80);
  v8 = a1;
  v94 = *(_DWORD *)(a1 + 84);
  v9 = 0i64;
  v10 = *(_QWORD *)(a1 + 8);
  v97 = 0i64;
  v11 = 0i64;
  *(_OWORD *)v102 = 0i64;
  v12 = *(_WORD *)(v10 + 60) & 0x3FF;
  v91 = v7;
  v100 = 0i64;
  v85 = 0i64;
  a1a = *(_QWORD *)(qword_140C4E388 + 8 * v12);
  v88 = 0i64;
  HIDWORD(NewPriority) = *(_DWORD *)(v8 + 88) + 1;
  LOBYTE(PageIrql) = 17;
  IoPriorityThread = PsGetIoPriorityThread((__int64)KeGetCurrentThread());
  v15 = *(_DWORD *)(v14 + 56);
  v16 = *(_QWORD *)(v8 + 120);
  HIDWORD(SpinCount) = IoPriorityThread;
  v105 = v8 + 120;
  v86 = v16;
  v89 = v7 & 7 | 0x18;
  v87 = 0i64;
  MiInitializePageColorBase(v17 + 1664, (v15 >> 20) & 0x3F, (INT64)v102);
  if( v16 == v8 + 120 )
    goto LABEL_63;
  v19 = v7 & 7 | 0x18;
  while( 2 )
  {
    PfnDb = MmGetPfnDb();
    ListEntry = (PSLIST_ENTRY)v16;
    if( SHIDWORD(SpinCount) < 2 )
    {
      *(_DWORD *)(v16 + 192) |= 0x80u;
    }
    else if( (*(_DWORD *)(v8 + 104) & 1) != 0 )
    {
      *(_DWORD *)(v16 + 192) |= 0x20u;
    }
    v21 = *(_QWORD **)(v16 + 240);
    v22 = 0i64;
    v23 = *(_QWORD *)(v16 + 200) + 8i64;
    v96 = v21;
    v106 = v23;
    *(_QWORD *)(v16 + 240) = *v21 & 0xFFFFFFFFFFFFFFFCui64;
    v103 = *v21 & 0xFFFFFFFFFFFFFFFCui64;
    Src = *(void **)(v16 + 256);
    v24 = (char *)Src + 48;
    v25 = 0;
    v26 = (((*((_DWORD *)Src + 8) + *((_DWORD *)Src + 11)) & 0xFFF)
         + (unsigned __int64)*((unsigned int *)Src + 10)
         + 4095) >> 12;
    if( v26 )
    {
      do
      {
        ++v25;
        *v24++ = qword_140C4EAB8;
      }
      while( v25 < v26 );
    }
    v27 = 0;
    v111 = 0;
    if( !v87 )
    {
      v87 = (char *)MiGetInPageSupportBlock(0);
      if( v87 )
      {
        v28 = v94;
        *((_QWORD *)v87 + 31) = 0i64;
        MiSetInPagePriority((__int64)v87, v28, v91);
      }
      v18 = v85;
      v22 = 0i64;
      PfnDb = MmGetPfnDb();
    }
    if( (unsigned __int64)v21 >= v23 )
      goto LABEL_54;
    while( 2 )
    {
      v29 = *v21 & 0xFFFFFFFFFFFFFFFCui64;
      if( v18 )
      {
        if( v11 == (_MMPTE *)((char *)MmGetPteBase() + ((v29 >> 9) & 0x7FFFFFFFF8i64)) )
          goto LABEL_15;
        MiUnlockProtoPoolPage(v18, (unsigned __int8)PageIrql);
      }
      v11 = (_MMPTE *)((char *)MmGetPteBase() + ((v29 >> 9) & 0x7FFFFFFFF8i64));
      v88 = v11;
      while( 1 )
      {
        v54 = MiLockProtoPoolPage((_MMPTE *)v29, (UINT8 *)&PageIrql);
        v22 = 0i64;
        v85 = v54;
        if( v54 )
          break;
        MmAccessFault(2ui64, (PVOID)v29, 0, 0i64);
      }
      v19 = v89;
      v16 = v86;
      PfnDb = MmGetPfnDb();
      while( 1 )
      {
LABEL_15:
        while( 1 )
        {
          v30 = *(_QWORD *)v29;
          v31 = *(_QWORD *)v29;
          if( (*(_QWORD *)v29 & 1) == 0 )
            break;
LABEL_86:
          if( (*((_QWORD *)MmGetPfnDb() + 6 * ((v31 >> 12) & 0xFFFFFFFFFi64) + 5) & 0x4000000000000i64) != 0 )
          {
            v32 = (INT64)PfnDb + 48 * ((v31 >> 12) & 0xFFFFFFFFFi64);
            LODWORD(NewPriority) = v22;
            if( _interlockedbittestandset64((volatile signed __int32 *)(v32 + 24), 0x3Fui64) )
            {
              do
              {
                do
                  KeYieldProcessorEx(&NewPriority);
                while( *(__int64 *)(v32 + 24) < 0 );
              }
              while( _interlockedbittestandset64((volatile signed __int32 *)(v32 + 24), 0x3Fui64) );
              v22 = 0i64;
              PfnDb = MmGetPfnDb();
            }
            if( *(_QWORD *)v29 == v30 )
              goto LABEL_18;
            _InterlockedAnd64((volatile signed __int64 *)(v32 + 24), 0x7FFFFFFFFFFFFFFFui64);
          }
        }
        if( (*(_QWORD *)v29 & 0xC00i64) != 2048 )
          break;
        if( MiInvalidPteConforms(*(_QWORD *)v29) )
        {
          v31 = v30;
          if( qword_140C4DC80 && (v30 & 0x10) == 0 )
            v31 = v30 & ~qword_140C4DC80;
          goto LABEL_86;
        }
      }
      v32 = v22;
LABEL_18:
      v33 = *(_QWORD *)v29;
      v104 = *(_QWORD *)v29;
      if( v32 )
      {
        MiUpdatePfnPriority(v32);
        _InterlockedAnd64((volatile signed __int64 *)(v32 + 24), 0x7FFFFFFFFFFFFFFFui64);
        v18 = v85;
        v22 = 0i64;
        goto LABEL_45;
      }
      if( (v33 & 0x400) == 0 )
      {
        if( !IS_PTE_NOT_DEMAND_ZERO(v33) || !v87 )
        {
LABEL_81:
          v18 = v85;
          goto LABEL_45;
        }
        v39 = 2;
        v36 = v22;
        v38 = 1i64;
        goto LABEL_26;
      }
      v34 = v33;
      if( qword_140C4DC80 && (v33 & 0x10) == 0 )
        v34 = v33 & ~qword_140C4DC80;
      v35 = *(_QWORD *)(v8 + 8);
      v36 = v34 >> 16;
      v37 = *(_DWORD *)(v35 + 56);
      if( (v37 & 0x40000000) != 0 )
      {
        MiUnlockProtoPoolPage(v85, (unsigned __int8)PageIrql);
        v85 = 0i64;
        if( (int)MiRefillPurgedExtents((__int64 *)v36, v29) < 0 )
        {
          v27 = v111;
          goto LABEL_56;
        }
LABEL_79:
        v22 = 0i64;
        goto LABEL_80;
      }
      if( (v37 & 0x20) != 0 && (*(_QWORD *)(*(_QWORD *)(v35 + 96) + 48i64) & 0xFFFFFFFFFFFFFFF0ui64) != 0 )
      {
LABEL_80:
        v11 = v88;
        goto LABEL_81;
      }
      v38 = 1i64;
      v39 = 1;
      v40 = *(_DWORD *)(*(_QWORD *)v36 + 56i64);
      if( (v40 & 0x20) == 0
        || (v40 & 0x40000000) != 0
        || (*(_DWORD *)(*(_QWORD *)v36 + 92i64) & 0xC0000) == 0
        || (*(_DWORD *)(a1a + 4) & 8) == 0
        || (*(_BYTE *)(v36 + 34) & 2) != 0 && (*(_BYTE *)(v36 + 32) & 0xA) == 8 )
      {
LABEL_26:
        v41 = 40i64;
        goto LABEL_27;
      }
      SlabAllocator = MiGetSlabAllocator(a1a, 0i64, (*(unsigned __int16 *)(v36 + 32) >> 1) & 0x1F);
      LODWORD(v22) = 0;
      v38 = 1i64;
      v41 = 8i64 * *(int *)(SlabAllocator + 52) + 48;
LABEL_27:
      v42 = *(char **)(v41 + v8);
      v43 = (_QWORD *)(v41 + v8);
      v98 = v42;
      if( v42 )
      {
        *v43 = *(_QWORD *)v42;
        v44 = v96;
        PageFrameIndex = (v42 - (char *)MmGetPfnDb()) / 48;
        goto LABEL_29;
      }
      if( !(unsigned int)MiPrefetchNormally((_MI_PARTITION *)a1a, HIDWORD(NewPriority)) )
        goto LABEL_142;
      if( !a2 )
        goto LABEL_119;
      if( !*a2 )
        goto LABEL_142;
      --*a2;
LABEL_119:
      if( !(unsigned int)MiObtainFaultCharges(v65, v66, v66) )
        goto LABEL_142;
      v67 = _InterlockedExchangeAdd((volatile signed __int32 *)v102[0], 1u);
      if( v43 == (_QWORD *)(v8 + 40) )
      {
        v44 = v96;
        v69 = 770i64;
        if( (*v96 & 1) == 0 )
          v69 = 512i64;
        Page = MiGetPage((_MI_PARTITION *)a1a, v102[1] & v67 | HIDWORD(v102[1]), v69);
      }
      else
      {
        LODWORD(v84) = 0;
        Page = MiGetSlabPage(a1a, (*(unsigned __int16 *)(v36 + 32) >> 1) & 0x1F, 0i64, 0i64, v84);
        v44 = v96;
      }
      PageFrameIndex = Page;
      if( Page == -1i64 )
      {
        MiReturnFaultCharges((_MI_PARTITION *)a1a, 1ui64, 1ui64);
LABEL_142:
        v18 = v85;
        v16 = v86;
        break;
      }
      v42 = (char *)MmGetPfnDb() + 48 * Page;
      LODWORD(v22) = 0;
      v98 = v42;
      v38 = 1i64;
LABEL_29:
      v90 = v22;
      if( (*v44 & 1) != 0 )
      {
        if( MiPfnZeroingNeeded((INT64)v42, 1i64) )
          v55 = v38;
        v90 = v55;
      }
      if( v39 != 1 )
      {
        MiReturnCommit((_MI_PARTITION *)a1a, v38);
        MiInitializeReadInProgressPfn(0xFFFFFFFFFFFFFFFFui64, &PageFrameIndex, 1, (__int64 *)v29, (__int64)v87, v19);
        PagingFileOffset = MiGetPagingFileOffset((MMPTE *)&v104);
        v71 = PagingFileOffset;
        LODWORD(v97) = PagingFileOffset;
        IsPteInStore = MiIsPteInStore(a1a, v33);
        v73 = (unsigned __int16)v33 >> 12;
        v74 = SHIDWORD(SpinCount) < 2;
        v75 = *(_QWORD *)(a1a + 8 * v73 + 6944);
        *((_QWORD *)v87 + 32) = v87 + 272;
        if( v74 )
          *((_DWORD *)v87 + 48) |= 0x80u;
        v76 = PageFrameIndex;
        *((_QWORD *)v87 + 34) = 0i64;
        *((_QWORD *)v87 + 38) = 0i64;
        *((_DWORD *)v87 + 70) = 56;
        *((_QWORD *)v87 + 39) = 4096i64;
        *((_WORD *)v87 + 141) |= 0x4042u;
        *((_QWORD *)v87 + 40) = v76;
        MiObtainProtoReference((INT64)v85, 0);
        v77 = v105;
        *((_QWORD *)v87 + 20) = v85;
        v78 = *(_QWORD *)v77;
        if( *(_QWORD *)(*(_QWORD *)v77 + 8i64) == v77 )
        {
          *(_QWORD *)v87 = v78;
          *((_QWORD *)v87 + 1) = v77;
          *(_QWORD *)(v78 + 8) = v87;
          *(_QWORD *)v77 = v87;
          v79 = (unsigned __int8)PageIrql;
          ++*(_DWORD *)(a1 + 108);
          MiUnlockProtoPoolPage(v85, v79);
          v85 = 0i64;
          if( v90 == 1 )
            MiZeroPhysicalPage(v76, 1ui64, (_MI_PFN_CACHE_ATTRIBUTE)((unsigned __int8)v98[34] >> 6));
          *((_QWORD *)v87 + 28) = 0i64;
          if( IsPteInStore )
          {
            v81 = *((_DWORD *)v87 + 48);
            *((_QWORD *)v87 + 12) = v71 | (v73 << 60);
            v80 = v81 | 0x100;
          }
          else
          {
            v97 = (unsigned __int64)(unsigned int)v97 << 12;
            *((_QWORD *)v87 + 12) = v97;
            v80 = *((_DWORD *)v87 + 48);
          }
          *((_QWORD *)v87 + 25) = v75;
          *((_DWORD *)v87 + 48) = v80 | 0x200000;
          *((_QWORD *)v87 + 31) = v98;
          *((_QWORD *)v87 + 30) = v29;
          v82 = (char *)MiGetInPageSupportBlock(0);
          v87 = v82;
          if( v82 )
          {
            v83 = v94;
            *((_QWORD *)v82 + 31) = 0i64;
            MiSetInPagePriority((__int64)v82, v83, v91);
          }
          v16 = v86;
          v18 = 0i64;
          v8 = a1;
          v22 = 0i64;
          v11 = v88;
          goto LABEL_45;
        }
        goto LABEL_143;
      }
      if( !*(_QWORD *)(v86 + 248) )
        *(_QWORD *)(v86 + 248) = v42;
      ++v111;
      MiInitializeReadInProgressPfn(0xFFFFFFFFFFFFFFFFui64, &PageFrameIndex, v38, (__int64 *)v29, v86, v19);
      v46 = *(_QWORD *)(v8 + 8);
      if( (*(_DWORD *)(v46 + 56) & 0x20) != 0 || !*(_QWORD *)(v46 + 64) )
        v36 = 0i64;
      CurrentIrql = KeGetCurrentIrql();
      __writecr8(2ui64);
      v48 = KiIrqlFlags;
      LODWORD(SpinCount) = 0;
      if( _interlockedbittestandset((volatile signed __int32 *)(v46 + 72), 0x1Fu) )
      {
        v48 = ExpWaitForSpinLockExclusiveAndAcquire((RTL_BITMAP *)(v46 + 72), CurrentIrql, v45);
        LODWORD(SpinCount) = v48;
      }
      for( i = *(_DWORD *)(v46 + 72); (i & 0xBFFFFFFF) != 0x80000000; v48 = i & 0xBFFFFFFF )
      {
        if( (i & 0x40000000) == 0 )
        {
          v57 = _InterlockedCompareExchange((volatile signed __int32 *)(v46 + 72), i | 0x40000000, i);
          v56 = i == v57;
          i = v57;
          if( !v56 )
            continue;
        }
        KeYieldProcessorEx(&SpinCount);
        i = *(_DWORD *)(v46 + 72);
      }
      v16 = v86;
      ++*(_QWORD *)(v46 + 32);
      if( v36 )
        ++*(_DWORD *)(v36 + 104);
      v22 = 0i64;
      *(_DWORD *)(v46 + 72) = 0;
      CurrentPrcb = KeGetCurrentPrcb();
      if( *((_QWORD *)CurrentPrcb + 4247) && *((_BYTE *)CurrentPrcb + 32) <= 1u && !v48 )
        v22 = 0i64;
      __writecr8(CurrentIrql);
      v51 = PageFrameIndex;
      *((_QWORD *)Src + ((__int64)(v29 - v103) >> 3) + 6) = PageFrameIndex;
      if( *(_QWORD *)(v86 + 160) )
      {
        v18 = v85;
      }
      else
      {
        MiObtainProtoReference((INT64)v85, 0);
        v18 = v85;
        v22 = 0i64;
        *(_QWORD *)(v86 + 160) = v85;
      }
      if( v90 == 1 )
      {
        MiUnlockProtoPoolPage(v18, (unsigned __int8)PageIrql);
        v85 = 0i64;
        MiZeroPhysicalPage(v51, 1ui64, (_MI_PFN_CACHE_ATTRIBUTE)((unsigned __int8)v98[34] >> 6));
        v8 = a1;
        goto LABEL_79;
      }
      v8 = a1;
      v11 = v88;
LABEL_45:
      v21 = v96 + 8;
      v96 = v21;
      if( (unsigned __int64)v21 < v106 )
      {
        PfnDb = MmGetPfnDb();
        continue;
      }
      break;
    }
    v27 = v111;
LABEL_54:
    if( v18 )
    {
      MiUnlockProtoPoolPage(v18, (unsigned __int8)PageIrql);
      v85 = 0i64;
    }
LABEL_56:
    if( !v27 )
    {
      v58 = *(_QWORD *)v16;
      v59 = ListEntry;
      v16 = v58;
      v86 = v58;
      v60 = (PSLIST_ENTRY *)*((_QWORD *)&ListEntry->Next + 1);
      if( *(PSLIST_ENTRY *)(v58 + 8) == ListEntry && *v60 == ListEntry )
      {
        *v60 = (PSLIST_ENTRY)v58;
        *(_QWORD *)(v58 + 8) = v60;
        --*(_DWORD *)(v8 + 108);
        MiFreeInPageSupportBlock(v59);
        goto LABEL_61;
      }
LABEL_143:
      __fastfail(3u);
    }
    v52 = (__int16 *)Src;
    v53 = MiReduceMdl((MDL *)Src);
    if( v53 )
    {
      *(_QWORD *)(v16 + 96) += v53 << 12;
      v61 = (char *)MmGetPfnDb() + 48 * *((_QWORD *)v52 + 6);
      v62 = *((_QWORD *)v61 + 1) | 0x8000000000000000ui64;
      *(_QWORD *)(v16 + 248) = v61;
      *(_QWORD *)(v16 + 240) = v62;
    }
    if( v52 != (__int16 *)(v16 + 272) && *((_DWORD *)v52 + 10) <= 0x10000u )
    {
      memmove((UINT8 *)(v16 + 272), (UINT8 *)v52, v52[4]);
      *(_QWORD *)v52 = v100;
      *(_QWORD *)(v16 + 256) = v16 + 272;
      v100 = v52;
    }
    v16 = *(_QWORD *)v16;
    v86 = v16;
LABEL_61:
    if( v16 != v8 + 120 )
    {
      v18 = v85;
      v11 = v88;
      continue;
    }
    break;
  }
  v6 = (struct _SLIST_ENTRY *)v87;
  v9 = v100;
LABEL_63:
  MiFreeReadListPages(v8);
  if( v9 )
  {
    do
    {
      v63 = *(__int16 **)v9;
      ExFreePoolWithTag(v9, 0);
      v9 = v63;
    }
    while( v63 );
  }
  if( v6 )
    MiFreeInPageSupportBlock(v6);
}

Referenced by:

MiPrefetchControlArea
MmPrefetchForCacheManager
MmPrefetchPagesEx