MiTrimUnusedPageFileRegionsWorker
VOID __stdcall MiTrimUnusedPageFileRegionsWorker(VOID *Parameter){
_ETHREAD *CurrentThread;
__int64 v3;
UINT64 v4;
int v5;
unsigned int SessionId;
unsigned int v7;
char *v8;
unsigned int v9;
_MMPAGING_FILE *v10;
unsigned int v11;
unsigned __int64 v12;
INT64 v13;
unsigned __int64 v14;
unsigned __int64 v15;
int v16;
INT64 v17;
_ETHREAD *v18;
int v19;
int v20;
bool v21;
__int64 v22;
_KLOCK_ENTRY *v23;
__int64 v24;
int v25[8];
int v26;
NTSTATUS Status;
int v28;
unsigned int v29;
int ApcContext;
int ApcContext_4;
__int128 ApcContext_8;
__int128 v33;
UINT64 v34[2];
char *v35;
_ETHREAD *v36;
_IO_STATUS_BLOCK IoStatusBlock;
char v38[96];
__int128 InputBuffer;
unsigned __int64 v40;
memset(v38, 0i64, 0x58u);
v40 = 0i64;
ApcContext_8 = 0i64;
v33 = 0i64;
*(_OWORD *)v34 = 0i64;
InputBuffer = 0i64;
IoStatusBlock = 0i64;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v36 = CurrentThread;
v3 = MiSwizzleInvalidPte(0i64);
if( ExAcquireRundownProtection((_EX_RUNDOWN_REF *)Parameter + 119) )
{
--CurrentThread->Tcb.SpecialApcDisable;
v4 = (UINT64)Parameter + 1128;
ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)Parameter + 141, 0i64);
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
v5 = *((_DWORD *)Parameter + 1734);
SessionId = -1;
v28 = v5;
v7 = 0;
v29 = 0;
if( v5 )
{
v8 = (char *)Parameter + 6944;
v9 = v5;
v35 = (char *)Parameter + 6944;
do
{
v10 = *(_MMPAGING_FILE **)v8;
if( (*(_WORD *)(*(_QWORD *)v8 + 204i64) & 0x850) == 16 )
{
*(_QWORD *)&ApcContext_8 = 393216i64;
*(_QWORD *)&v33 = (char *)&ApcContext_8 + 8;
v34[1] = 0i64;
*((_QWORD *)&ApcContext_8 + 1) = (char *)&ApcContext_8 + 8;
v34[0] = v7 | 0x200000000000i64;
*((_QWORD *)&v33 + 1) = Parameter;
v11 = MiPageFileLargestBitmapsRun(v10);
if( v11 >= HIDWORD(v34[0]) )
{
do
{
MiQueueSyncModifiedWriterApc(
(__int64)Parameter,
(INT64)v38,
(INT64)MiTrimUnusedPageFileRegionsApc,
(INT64)&ApcContext_8,
&ApcContext_8);
if( !HIDWORD(v34[1]) )
break;
*((_QWORD *)&InputBuffer + 1) = (unsigned __int64)LODWORD(v34[1]) << 12;
v40 = (unsigned __int64)HIDWORD(v34[1]) << 12;
*(_QWORD *)&InputBuffer = 0x100000000i64;
KeResetEvent((_KEVENT *)&ApcContext_8);
Status = ZwFsControlFile(
(_HANDLE)v10->FileHandle,
0,
(PIO_APC_ROUTINE)MiIrpCompletionApcRoutine,
&ApcContext_8,
&IoStatusBlock,
0x98208u,
&InputBuffer,
0x18u,
0i64,
0);
if( Status == 259 )
{
KeWaitForSingleObject((UINT64)&ApcContext_8, 0, 0, 0, 0i64);
Status = IoStatusBlock.Status;
}
LODWORD(v12) = MiTransferSoftwarePte(v3, (INT64)v10, LODWORD(v34[1]));
v13 = v12;
v14 = v12;
if( *(&stru_140C4DB30 + 42) )
{
if( (v12 & 0x10) != 0 )
v14 = v12 & 0xFFFFFFFFFFFFFFEFui64;
else
v14 = v12 & ~*(&stru_140C4DB30 + 42);
}
v15 = HIDWORD(v14);
if( HIDWORD(v34[1]) )
{
v16 = HIDWORD(v34[1]);
do
{
MiReleasePageFileInfo((_MI_PARTITION *)Parameter, (_MMPTE)v13, 2ui64);
LODWORD(v17) = MiUpdatePageFileHighInPte(v13, ++v15);
v13 = v17;
--v16;
}
while( v16 );
}
if( Status < 0 )
break;
KeResetEvent((_KEVENT *)&ApcContext_8);
v34[1] = (unsigned int)(HIDWORD(v34[1]) + LODWORD(v34[1]));
}
while( LODWORD(v34[1]) < v10->Size );
v7 = v29;
v8 = v35;
v9 = v28;
}
}
++v7;
v8 += 8;
v29 = v7;
v35 = v8;
}
while( v7 < v9 );
CurrentThread = v36;
v4 = (UINT64)Parameter + 1128;
SessionId = -1;
}
--CurrentThread->Tcb.SpecialApcDisable;
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)v4, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((_EX_PUSH_LOCK *)v4);
ApcContext_4 = 0;
v18 = (_ETHREAD *)KeGetCurrentThread();
if( MiGetSystemRegionType(v4) == 1 )
SessionId = MmGetSessionIdEx(v18->Tcb.ApcState.Process);
--v18->Tcb.SpecialApcDisable;
++v18->Tcb.AbAllocationRegionCount;
v19 = (char)v18->Tcb.AbEntrySummary | (char)v18->Tcb.AbOrphanedEntrySummary;
LOBYTE(v26) = v18->Tcb.AbAllocationRegionCount;
v20 = v19 ^ 0x3F;
while( 1 )
{
v21 = !_BitScanReverse((unsigned int *)&v22, v20);
ApcContext = v22;
if( v21 )
break;
v23 = &v18->Tcb.LockEntries[v22];
v20 &= ~(1 << v22);
if( (v23->AcquiredByte & 1) != 0
&& (v23->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 & 1) == 0
&& (v23->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 & 0x7FFFFFFFFFFFFFFCi64) == (v4 & 0x7FFFFFFFFFFFFFFCi64)
&& v23->LockState.SessionId == SessionId )
{
v23->AcquiredByte &= ~1u;
if( v23->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 )
{
if( v23 )
{
v23->CrossThreadReleasableAndBusyByte |= 2u;
if( v23->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 < 0 )
KiAbEntryRemoveFromTree(v23);
ApcContext_4 = v23->BoostBitmap.AllFields & 0x1FFFF;
v23->BoostBitmap.AllFields &= 0xFFFE0000;
v23->ThreadLocalFlags &= ~1u;
v23->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 = 0i64;
v24 = v23 - v18->Tcb.LockEntries;
if( (_BYTE)v26 == 1 )
v18->Tcb.AbEntrySummary |= 1 << v24;
else
_InterlockedOr8((volatile signed __int8 *)&v18->Tcb.AbOrphanedEntrySummary, 1 << v24);
goto LABEL_36;
}
break;
}
}
}
if( (*(&v18->Tcb.MiscFlags + 1) & 0x10000) == 0 )
KeBugCheckEx(0x162u, v18, (PVOID)v4, (PVOID)SessionId, 0i64);
LABEL_36:
--v18->Tcb.AbAllocationRegionCount;
KiAbThreadRemoveBoosts(&v18->Tcb, (VOID *)v4, (UINT64 *)&ApcContext_4);
v21 = v18->Tcb.SpecialApcDisable++ == -1;
if( v21 && ($F25F8C4BA33AF922A5F1AF68CD89DDDF *)v18->Tcb.ApcState.ApcListHead[0].Flink != &v18->Tcb.152 )
KiCheckForKernelApcDelivery();
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
MiContractWsSwapPageFile((_MI_PARTITION *)Parameter);
ExReleaseRundownProtection((_EX_RUNDOWN_REF *)Parameter + 119);
*((_QWORD *)Parameter + 135) = KiQueryUnbiasedInterruptTime(1u);
_InterlockedOr(v25, 0);
*((_QWORD *)Parameter + 134) = 0i64;
}
PsDereferencePartition(*((_QWORD *)Parameter + 22));
}Referenced by:
No references.