MiStoreWriteModifiedPages
__int64 __fastcall MiStoreWriteModifiedPages(__int64 a1){
__int64 v1;
MDL *v2;
unsigned int v3;
__int64 v4;
INT64 v5;
UINT64 v6;
__int64 v7;
unsigned __int64 v8;
char *v9;
unsigned int v10;
MDL *p_Size;
unsigned int v12;
_MDL *Next;
int v14;
unsigned int v15;
unsigned int v16;
unsigned int v17;
int v18;
char *v19;
unsigned int v20;
unsigned int v21;
__int64 *v22;
__int64 i;
unsigned int v24;
int v25;
UINT64 v26;
UINT64 v27;
unsigned int v28;
int v29;
unsigned __int64 v30;
UINT64 v31;
UINT64 v32;
INT64 v33;
int v34;
struct _SLIST_ENTRY *v35;
__int64 v36;
int *v37;
int v38;
int *v39;
bool j;
unsigned int v41;
__int64 v42;
UINT64 updated;
unsigned int *v44;
unsigned int v45;
unsigned int v46;
unsigned int v47;
int v48;
int v49;
__int64 v50;
unsigned int v51;
__int64 v52;
INT64 k;
_QWORD *v54;
unsigned __int64 v55;
__int64 v56;
INT64 v57;
unsigned int v58;
__int64 v59;
unsigned int v60;
_DWORD *v61;
__int64 result;
unsigned __int8 v63;
_DWORD *v64;
unsigned int SizeOfBitMap;
int v66;
volatile signed __int64 *v67;
unsigned __int64 v68;
const GUID *a5;
INT64 a5a;
const GUID *a6;
INT64 a7;
INT64 a8;
INT64 a9;
INT64 a10;
INT64 v76;
struct _SLIST_ENTRY *ListEntry;
unsigned __int8 ListEntrya;
INT64 v79;
MDL *v80;
UINT64 a3;
_ETHREAD *CurrentThread;
INT64 v83[2];
UINT64 UnbiasedInterruptTime;
MDL *v85;
MDL *v86;
_MI_PAGING_FILE_SPACE_BITMAPS ReferencedBitmaps;
unsigned int v89;
unsigned int v90;
unsigned int v91;
v1 = *(_QWORD *)(a1 + 144);
v2 = (MDL *)(a1 + 208);
v3 = *(_DWORD *)(a1 + 248) >> 12;
v4 = a1;
a3 = 0i64;
v5 = *(_QWORD *)(v1 + 248);
*(_OWORD *)v83 = 0i64;
v79 = 0i64;
memset(&ReferencedBitmaps.AllocationBitmap, 0, 32);
v6 = *(unsigned int *)(v5 + 1172);
v86 = v2;
HIDWORD(a10) = v3;
if( (_DWORD)v6 )
{
MiStoreLogWriteDisabled(v6, v3);
result = 3221225626i64;
--*(_DWORD *)(v5 + 1172);
return result;
}
v7 = *(_QWORD *)(v5 + 8i64 * *(unsigned int *)(v5 + 1156) + 6944);
v76 = v7;
if( !*(_QWORD *)(v7 + 24) )
{
MiStoreLogFullPagefile();
return 3221225599i64;
}
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
ReferencedBitmaps.Anchor = 0i64;
*(_DWORD *)(v4 + 44) = 1;
LOBYTE(v8) = 17;
v9 = 0i64;
v90 = *(_DWORD *)(v7 + 120);
LODWORD(a10) = 0;
ListEntry = 0i64;
v91 = 0;
v89 = 1;
UnbiasedInterruptTime = KiQueryUnbiasedInterruptTime(1u);
p_Size = v2 + 1;
v12 = 0;
v85 = v2 + 1;
LABEL_4:
v80 = p_Size;
HIDWORD(a9) = v12;
while( v12 < v10 )
{
Next = p_Size->Next;
v14 = 1;
LODWORD(a9) = 1;
if( p_Size->Next == (_MDL *)qword_140C4EAA8 || !*(_QWORD *)(v7 + 24) )
goto LABEL_29;
if( ReferencedBitmaps.Anchor != *(_MI_PAGING_FILE_SPACE_BITMAPS **)(v7 + 112) )
{
if( ReferencedBitmaps.Anchor )
{
v64 = MiDerefPageFileSpaceBitmaps(v7, &ReferencedBitmaps, 1);
if( v64 )
ExFreePoolWithTag(v64, 0);
}
MiRefPageFileSpaceBitmaps((_MMPAGING_FILE *)v7, &ReferencedBitmaps);
}
v15 = v90;
v16 = ReferencedBitmaps.AllocationBitmap.SizeOfBitMap - 1;
v17 = v90 < ReferencedBitmaps.AllocationBitmap.SizeOfBitMap ? v90 : 0;
v18 = ((__int64)ReferencedBitmaps.AllocationBitmap.Buffer & 4) != 0i64 ? 0x20 : 0;
v19 = (char *)ReferencedBitmaps.AllocationBitmap.Buffer
- (((__int64)ReferencedBitmaps.AllocationBitmap.Buffer & 4) != 0i64 ? 4 : 0);
while( 1 )
{
v20 = v16 + v18;
v21 = v17 + v18;
if( v16 - v17 == -1 )
{
v24 = -1;
}
else
{
v22 = (__int64 *)&v19[8 * ((unsigned __int64)v21 >> 6)];
for( i = ((1i64 << (v21 & 0x3F)) - 1) | *v22; i == -1; i = *v22 )
{
if( ++v22 > (__int64 *)&v19[8 * ((unsigned __int64)v20 >> 6)] )
goto LABEL_35;
}
_BitScanForward64((unsigned __int64 *)&i, ~i);
v24 = i + ((unsigned int)(((char *)v22 - v19) >> 3) << 6);
if( v24 > v20 )
{
LABEL_35:
v24 = -1;
goto LABEL_36;
}
if( v24 != -1 )
{
v24 -= v18;
break;
}
LABEL_36:
v15 = v90;
}
if( !v17 )
break;
SizeOfBitMap = v15 + 1;
if( v15 + 1 > ReferencedBitmaps.AllocationBitmap.SizeOfBitMap )
SizeOfBitMap = ReferencedBitmaps.AllocationBitmap.SizeOfBitMap;
v16 = SizeOfBitMap - 1;
v17 = 0;
}
v9 = (char *)MmGetPfnDb() + 48 * (_QWORD)Next;
v8 = (unsigned __int8)MiLockPageInline((INT64)v9);
if( (*((_QWORD *)v9 + 3) & 0x4000000000000000i64) != 0 )
goto LABEL_80;
v79 = 0i64;
v25 = MiStoreCheckCandidatePage((UINT64)v9, v24, &a3, v83, (INT64)&v79);
if( v25 < 0 )
{
MiStoreLogNotCandidate((unsigned int)v25, v24, v26, v27, a5, a6);
LABEL_80:
v14 = 1;
LABEL_29:
if( (_BYTE)v8 != 17 )
{
_InterlockedAnd64((volatile signed __int64 *)v9 + 3, 0x7FFFFFFFFFFFFFFFui64);
__writecr8((unsigned __int8)v8);
LOBYTE(v8) = 17;
}
if( v14 )
{
LABEL_34:
v34 = HIDWORD(a9);
_bittestandset(*(signed __int32 **)(*(_QWORD *)(v5 + 1272) + 8i64), HIDWORD(a9));
}
else
{
v34 = HIDWORD(a9);
}
v12 = v34 + 1;
v10 = HIDWORD(a10);
p_Size = (MDL *)&v80->Size;
v91 = 0;
v4 = a1;
v7 = v76;
goto LABEL_4;
}
_InterlockedAnd64((volatile signed __int64 *)v9 + 3, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v8);
LOBYTE(v8) = 17;
if( !ListEntry )
{
ListEntry = RtlpInterlockedPopEntrySList((PSLIST_HEADER)(v5 + 1232));
if( !ListEntry )
{
LODWORD(v35) = MiAllocatePool((struct _SLIST_ENTRY *)0x40);
ListEntry = v35;
if( !v35 )
{
LODWORD(a10) = 1;
goto LABEL_34;
}
}
}
if( (unsigned __int64)(*(_QWORD *)(v76 + 24) - 1i64) < 8 )
v28 = *(_DWORD *)(v76 + 24) - 1;
else
v28 = 8;
if( v89 )
{
if( (unsigned int)MiSufficientAvailablePages(v5, 0x120ui64) )
{
v89 &= -(KiQueryUnbiasedInterruptTime(1u) - UnbiasedInterruptTime < 0x2FAF080);
}
else
{
v89 = 0;
if( v28 >= 3 )
v28 = 3;
}
}
v4 = a1;
_InterlockedIncrement((volatile signed __int32 *)(a1 + 44));
LODWORD(a8) = v89;
v29 = MiStoreWriteIssue(
(INT64)ListEntry,
(INT64)v9,
(union MM_STORE_KEY *)&a3,
(INT64)v83,
(INT64)ListEntry,
v79,
a1,
a8);
if( v29 >= 0 )
{
LODWORD(a9) = 0;
ListEntrya = 0;
v8 = ExAcquireSpinLockExclusive((PEX_SPIN_LOCK)(v76 + 232));
v90 = v24 + 1;
_bittestandset(*(signed __int32 **)(*(_QWORD *)(v76 + 112) + 16i64), v24);
--*(_QWORD *)(v76 + 24);
*(_DWORD *)(v76 + 120) = v24 + 1;
MiUpdatePagefilePeakUsage((_QWORD *)v76);
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(v76 + 232));
__writecr8(v8);
v30 = (unsigned __int8)MiLockPageInline((INT64)v9);
v31 = MiCapturePageFileInfoInline((UINT64 *)v9 + 2, 1i64, 1i64);
*((_QWORD *)v9 + 2) &= ~2ui64;
v32 = v31;
MiUpdatePfnBackingStore((INT64)v9, v76, v24, 1i64);
_InterlockedAnd64((volatile signed __int64 *)v9 + 3, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v30);
LOBYTE(v8) = 17;
MiReleasePageFileInfo(v5, v32, 2, v33, a5a, (INT64)a6, a7, a8, a9, a10, v76, ListEntrya);
v14 = a9;
goto LABEL_29;
}
_InterlockedDecrement((volatile signed __int32 *)(a1 + 44));
if( v29 != -1073740682 )
{
v66 = a10;
if( v29 == -1073741670 )
v66 = 1;
LODWORD(a10) = v66;
LABEL_99:
LODWORD(a6) = ++*(_DWORD *)(v5 + 1176);
LODWORD(a5a) = v89;
MiStoreLogWriteIssueFailure((unsigned int)v29, (INT64)v83, v24, v91, a5a, (INT64)a6);
goto LABEL_34;
}
v90 = v24 + 1;
if( v91 >= v28 )
goto LABEL_99;
LODWORD(a5a) = *(_DWORD *)(v5 + 1176);
MiStoreLogWriteIssueRetry((INT64)v83, v24, v91, v89, a5a);
v10 = HIDWORD(a10);
v7 = v76;
v12 = HIDWORD(a9);
p_Size = v80;
++v91;
}
if( (_DWORD)a10 )
*(_DWORD *)(v5 + 1172) = 32;
v36 = *(_QWORD *)(v5 + 1272);
if( *(_DWORD *)v36 )
{
if( v10 <= 1 )
{
if( v10 == 1 )
{
v63 = _bittest(*(const signed __int32 **)(v36 + 8), 0);
goto LABEL_77;
}
}
else if( *(_DWORD *)v36 >= v10 )
{
v37 = *(int **)(v36 + 8);
v38 = *v37;
v39 = &v37[(unsigned __int64)(v10 - 1) >> 5];
if( v37 != v39 )
{
for( j = v38 == -1; ; j = *v37 == -1 )
{
if( !j )
goto LABEL_47;
if( ++v37 == v39 )
break;
}
if( ((0xFFFFFFFF >> ~(v10 - 1)) & *v37) != 0xFFFFFFFF >> ~(v10 - 1) )
{
v63 = 0;
LABEL_77:
if( v63 )
goto LABEL_74;
goto LABEL_47;
}
LABEL_74:
RtlClearBits(*(RTL_BITMAP **)(v5 + 1272), 0i64, v10);
*(_DWORD *)(v4 + 44) = 0;
v60 = -1073740759;
v59 = (__int64)CurrentThread;
goto LABEL_67;
}
if( (v38 & (0xFFFFFFFF >> (32 - v10))) == 0xFFFFFFFF >> (32 - v10) )
goto LABEL_74;
}
}
LABEL_47:
v41 = -1;
v42 = *(_QWORD *)(v4 + 176) >> 12;
updated = MiTransferSoftwarePte(ZeroPte, *(_QWORD *)(v4 + 144), (unsigned int)v42);
while( 2 )
{
v44 = *(unsigned int **)(v5 + 1272);
v45 = v41 + 1;
v46 = *v44;
v47 = v45 < *v44 ? v45 : 0;
v48 = *v44 - 1;
v49 = (v44[2] & 4) != 0i64 ? 0x20 : 0;
v50 = *((_QWORD *)v44 + 1) - ((*((_QWORD *)v44 + 1) & 4i64) != 0 ? 4 : 0);
while( 1 )
{
v51 = v48 + v49;
v52 = 1i64;
k = v47 + v49;
if( v51 - (_DWORD)k != -1 )
{
v54 = (_QWORD *)(v50 + 8 * ((unsigned __int64)(unsigned int)k >> 6));
v52 = ~*v54 | ((1i64 << ((v47 + v49) & 0x3F)) - 1);
for( k = -1i64; v52 == -1; v52 = ~*v54 )
{
if( (unsigned __int64)++v54 > v50 + 8 * ((unsigned __int64)v51 >> 6) )
goto LABEL_59;
}
v52 = ~v52;
_BitScanForward64(&v55, v52);
v41 = v55 + ((unsigned int)(((__int64)v54 - v50) >> 3) << 6);
if( v41 <= v51 )
break;
}
LABEL_59:
v41 = -1;
LABEL_60:
if( !v47 )
goto LABEL_56;
v58 = v45 + 1;
if( v45 + 1 > v46 )
v58 = v46;
v48 = v58 - 1;
v47 = 0;
}
if( v41 == -1 )
goto LABEL_60;
v41 -= v49;
LABEL_56:
if( v41 != -1 )
{
_bittestandreset(*(signed __int32 **)(*(_QWORD *)(v5 + 1272) + 8i64), v41);
v56 = *((_QWORD *)&v85->Next + v41);
if( v56 == qword_140C4EAA8 )
{
updated = MiUpdatePageFileHighInPte(updated, v41 + (unsigned int)v42);
MiReleasePageFileInfo(v5, updated, 2, v57, (INT64)a5, (INT64)a6, a7, a8, a9, a10, v76, (INT64)ListEntry);
}
else
{
v67 = (volatile signed __int64 *)((char *)MmGetPfnDb() + 48 * v56);
v68 = (unsigned __int8)MiLockPageInline((INT64)v67);
*((_BYTE *)v67 + 34) |= 0x10u;
_InterlockedAnd64(v67 + 3, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v68);
}
continue;
}
break;
}
MiStoreUpdatePagefileHash(k, v52, v86, HIDWORD(a10));
v59 = (__int64)CurrentThread;
*(_DWORD *)(a1 + 40) |= 0x20u;
--*(_WORD *)(v59 + 486);
++*(_DWORD *)(v5 + 1180);
KiLeaveGuardedRegionUnsafe(v59);
MiStoreModifiedWriteDereference(a1);
v7 = v76;
v60 = 259;
LABEL_67:
KeLeaveCriticalRegionThread(v59);
if( ListEntry )
MiStoreFreeWriteSupport(ListEntry, (union SLIST_HEADER *)v5);
if( ReferencedBitmaps.Anchor )
{
v61 = MiDerefPageFileSpaceBitmaps(v7, &ReferencedBitmaps, 0);
if( v61 )
ExFreePoolWithTag(v61, 0);
}
return v60;
}Referenced by:
MiGatherPagefilePages