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