MiSetPagesModified
INT64 __stdcall MiSetPagesModified(
in6_addr *Address,
UINT64 ScopeId,
UINT16 Port,
INT8 *AddressString,
UINT64 *AddressStringLength){
int v5;
_MI_PARTITION *v7;
UINT64 v8;
CHAR v9;
INT64 v10;
unsigned __int64 v12;
unsigned int v13;
NTSTATUS v14;
INT64 v15;
unsigned __int64 v16;
__int64 v17;
INT64 i;
_MMPTE *v19;
char *v20;
UNICODE_STRING *v21;
UINT8 v22;
PWCHAR v23;
int v24;
INT64 v25;
UINT64 v26;
__int64 v27;
INT64 CommittedPages;
UINT64 v29;
UINT64 v30;
_ETHREAD *v31;
volatile INT64 *v32;
INT64 v33;
INT64 v34;
UINT64 v35;
INT64 v36;
INT64 v37;
in6_addr *v38;
UINT64 SpinCount;
INT64 v40;
INT64 v41;
INT64 v42;
__int64 v43;
UINT64 v44;
_MI_PARTITION *Partition;
_MI_PARTITION *v46;
unsigned __int64 v47;
unsigned __int64 v48;
INT64 v49;
__int64 v50;
unsigned __int64 v51;
INT64 *v52;
INT64 v53;
UINT64 v54;
_ETHREAD *CurrentThread;
INT64 v56[10];
v5 = ScopeId;
v38 = Address;
v52 = 0i64;
memset((INT64)v56, 0i64);
v7 = *(_MI_PARTITION **)(qword_140C4E388 + 8i64 * (Address[3].u.Word[6] & 0x3FF));
v46 = v7;
Partition = v7;
v50 = *(_QWORD *)Address->u.Byte;
v43 = v50;
v8 = *(unsigned int *)(v50 + 8);
v44 = v8;
if( !(unsigned int)MiChargeCommit(v7, (unsigned int)v8, 0i64) )
return 3221225773i64;
v12 = *(_QWORD *)&Address[8].u.Word[4];
v47 = v12;
v51 = v12 + 8 * v8;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
MiGetEffectivePagePriorityThread(CurrentThread, v9, v10);
if( v13 > 5 )
v13 = 5;
LODWORD(v35) = v5;
LODWORD(v33) = 0;
MiPrefetchControlArea((INT64)Address, RtlpInterceptorRoutines, 0i64, v13, v33, v35);
v14 = MiMapImageInSystemSpace((__int64)Address, 3, (__int64)v56);
if( v14 >= 0 )
{
v40 = v56[3];
v15 = v56[0];
v42 = v56[0];
v16 = (unsigned __int64)MmGetPteBase() + (((unsigned __int64)v56[0] >> 9) & 0x7FFFFFFFF8i64);
v17 = 0i64;
v41 = 0i64;
HIDWORD(v37) = 0;
while( 1 )
{
v49 = v15;
v48 = v16;
if( v12 >= v51 )
break;
if( MI_READ_PTE_LOCK_FREE(v12) )
{
for( i = v40; ; MiUnlockWorkingSetShared(i, v37) )
{
LOBYTE(v37) = MiLockWorkingSetShared(i);
v19 = MiLockLowestValidPageTable(i, (INT64 *)v16, &v52);
v54 = (UINT64)v19;
if( v19 == (_MMPTE *)((char *)MmGetPteBase() + ((v16 >> 9) & 0x7FFFFFFFF8i64)) && (*(_BYTE *)v16 & 1) != 0 )
break;
MiUnlockPageTableInternal(i, (UINT64)v19);
}
v41 = ++v17;
v53 = MI_READ_PTE_LOCK_FREE(v16);
v20 = (char *)MmGetPfnDb()
+ 48 * (((unsigned __int64)MI_READ_PTE_LOCK_FREE((INT64)&v53) >> 12) & 0xFFFFFFFFFi64);
LOBYTE(v24) = MI_PFN_IS_PROTO((UNICODE_STRING *)v20, v21, v22, v23);
if( v24 )
{
v26 = 0i64;
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)v20 + 6, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *((__int64 *)v20 + 3) < 0 );
}
if( (*((_DWORD *)v20 + 4) & 0x400i64) == 0 && (v20[34] & 8) == 0 )
v26 = MiCapturePageFileInfoInline((UINT64 *)v20 + 2, 1i64, 0i64);
v20[34] |= 0x10u;
_InterlockedAnd64((volatile signed __int64 *)v20 + 3, 0x7FFFFFFFFFFFFFFFui64);
if( v26 )
MiReleasePageFileInfo(
*(_QWORD *)(qword_140C4E388 + 8 * ((*((_QWORD *)v20 + 5) >> 39) & 0x3FFi64)),
v26,
1,
v25,
v34,
v36,
v37,
(INT64)v38,
SpinCount,
v40,
v41,
v42);
v15 = v42;
}
MiUnlockPageTableInternal(v40, v54);
MiUnlockWorkingSetShared(v40, v37);
v7 = v46;
}
v12 += 8i64;
v47 = v12;
v16 += 8i64;
v15 += 4096i64;
v42 = v15;
}
v27 = v50;
MiUnmapImageInSystemSpace((INT64)v56);
CommittedPages = MiGetCommittedPages(v38);
v29 = CommittedPages - v17 + v8;
if( v29 )
MiReturnCommit(v7, v29);
v30 = v17 - CommittedPages;
if( v30 )
{
v31 = CurrentThread;
--*((_WORD *)CurrentThread + 243);
v32 = (volatile INT64 *)(v27 + 40);
ExAcquirePushLockExclusiveEx((UINT64)v32, 0i64);
MiUpdateControlAreaCommitCount((INT64)v38, v30);
if( (_InterlockedExchangeAdd64(v32, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(v32);
KeAbPostRelease((PVOID)v32);
KiLeaveGuardedRegionUnsafe((__int64)v31);
}
MiDeleteFileExtents((INT64)v38);
return 0i64;
}
else
{
MiReturnCommit(v7, v8);
return(unsigned int)v14;
}
}Referenced by:
No references.