MiTrimUnusedPageFileRegionsWorker
VOID __stdcall MiTrimUnusedPageFileRegionsWorker(PVOID Parameter){
_ETHREAD *CurrentThread;
INT64 v3;
UINT64 v4;
unsigned int v5;
unsigned int SessionId;
unsigned int v7;
char *v8;
unsigned int v9;
__int64 v10;
unsigned int v11;
UINT64 v12;
UINT8 v13;
UINT8 v14;
UINT64 v15;
UINT64 updated;
UINT8 v17;
INT64 v18;
unsigned __int64 v19;
unsigned __int64 v20;
int v21;
_ETHREAD *v22;
int v23;
int v24;
bool v25;
__int64 v26;
unsigned __int64 v27;
__int64 v28;
int v29[8];
PIO_STATUS_BLOCK IoStatusBlock;
ULONG FsControlCode[2];
PVOID InputBuffer;
ULONG InputBufferLength[2];
PVOID OutputBuffer;
INT64 OutputBufferLength;
INT64 v36;
INT64 a12;
struct _KEVENT Event;
__int128 v39;
UINT64 v40[2];
char *v41;
_ETHREAD *v42;
struct _IO_STATUS_BLOCK v43;
KAPC result;
INT64 a7[2];
unsigned __int64 v46;
memset((INT64)&result, 0i64);
v46 = 0i64;
Event.Header.WaitListHead = 0i64;
v39 = 0i64;
*(_OWORD *)v40 = 0i64;
*(_OWORD *)a7 = 0i64;
v43 = 0i64;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v42 = CurrentThread;
v3 = MiSwizzleInvalidPte(0i64);
if( ExAcquireRundownProtection((PEX_RUNDOWN_REF)Parameter + 119) )
{
--*((_WORD *)CurrentThread + 243);
v4 = (UINT64)Parameter + 1128;
ExAcquirePushLockExclusiveEx((UINT64)Parameter + 1128, 0i64);
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
v5 = *((_DWORD *)Parameter + 1734);
SessionId = -1;
a12 = v5;
v7 = 0;
if( v5 )
{
v8 = (char *)Parameter + 6944;
v9 = v5;
v41 = (char *)Parameter + 6944;
do
{
v10 = *(_QWORD *)v8;
if( (*(_WORD *)(*(_QWORD *)v8 + 204i64) & 0x850) == 16 )
{
Event.Header.WaitListHead.Flink = (_LIST_ENTRY *)393216;
*(_QWORD *)&v39 = &Event.Header.WaitListHead.Blink;
v40[1] = 0i64;
Event.Header.WaitListHead.Blink = (_LIST_ENTRY *)&Event.Header.WaitListHead.Blink;
v40[0] = v7 | 0x200000000000i64;
*((_QWORD *)&v39 + 1) = Parameter;
v11 = MiPageFileLargestBitmapsRun(v10);
if( v11 >= HIDWORD(v40[0]) )
{
do
{
MiQueueSyncModifiedWriterApc(
(INT64)Parameter,
&result,
(INT64)MiTrimUnusedPageFileRegionsApc,
(INT64)&Event.Header.WaitListHead,
&Event.Header.WaitListHead);
if( !HIDWORD(v40[1]) )
break;
a7[1] = (unsigned __int64)LODWORD(v40[1]) << 12;
v46 = (unsigned __int64)HIDWORD(v40[1]) << 12;
a7[0] = 0x100000000i64;
KeResetEvent(&Event.Header.WaitListHead, v12, v13, v14, (IRP *)IoStatusBlock);
HIDWORD(v36) = ZwFsControlFile(
*(HANDLE *)(v10 + 224),
0i64,
(PIO_APC_ROUTINE)MiIrpCompletionApcRoutine,
&Event.Header.WaitListHead,
&v43,
0x98208u,
a7,
0x18u,
0i64,
0);
if( HIDWORD(v36) == 259 )
{
KeWaitForSingleObject(&Event.Header.WaitListHead, Executive, 0, 0, 0i64);
HIDWORD(v36) = v43.Status;
}
updated = MiTransferSoftwarePte(v3, v10, LODWORD(v40[1]));
v19 = updated;
if( qword_140C4DC80 )
{
if( (updated & 0x10) != 0 )
v19 = updated & 0xFFFFFFFFFFFFFFEFui64;
else
v19 = updated & ~qword_140C4DC80;
}
v20 = HIDWORD(v19);
if( HIDWORD(v40[1]) )
{
v21 = HIDWORD(v40[1]);
do
{
MiReleasePageFileInfo(
(INT64)Parameter,
updated,
2,
v18,
(INT64)IoStatusBlock,
*(INT64 *)FsControlCode,
(INT64)InputBuffer,
*(INT64 *)InputBufferLength,
(INT64)OutputBuffer,
OutputBufferLength,
v36,
a12);
updated = MiUpdatePageFileHighInPte(updated, ++v20);
--v21;
}
while( v21 );
}
if( v36 < 0 )
break;
KeResetEvent(&Event.Header.WaitListHead, v15, v17, v18, (IRP *)IoStatusBlock);
v40[1] = (unsigned int)(HIDWORD(v40[1]) + LODWORD(v40[1]));
}
while( (unsigned __int64)LODWORD(v40[1]) < *(_QWORD *)v10 );
v7 = HIDWORD(a12);
v8 = v41;
v9 = a12;
}
}
++v7;
v8 += 8;
HIDWORD(a12) = v7;
v41 = v8;
}
while( v7 < v9 );
CurrentThread = v42;
v4 = (UINT64)Parameter + 1128;
SessionId = -1;
}
--*((_WORD *)CurrentThread + 243);
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)v4, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)v4);
Event.Header.SignalState = 0;
v22 = (_ETHREAD *)KeGetCurrentThread();
if( (unsigned int)MiGetSystemRegionType(v4) == 1 )
SessionId = MmGetSessionIdEx(*((_QWORD *)v22 + 23));
--*((_WORD *)v22 + 243);
++*((_BYTE *)v22 + 794);
v23 = *((char *)v22 + 792) | *((char *)v22 + 870);
LOBYTE(v36) = *((_BYTE *)v22 + 794);
v24 = v23 ^ 0x3F;
while( 1 )
{
v25 = !_BitScanReverse((unsigned int *)&v26, v24);
Event.Header.LockNV = v26;
if( v25 )
break;
v27 = *((_QWORD *)v22 + 100) + 96 * v26;
v24 &= ~(1 << v26);
if( (*(_BYTE *)(v27 + 26) & 1) != 0
&& (*(_DWORD *)(v27 + 32) & 1) == 0
&& (*(_QWORD *)(v27 + 32) & 0x7FFFFFFFFFFFFFFCi64) == (v4 & 0x7FFFFFFFFFFFFFFCi64)
&& *(_DWORD *)(v27 + 40) == SessionId )
{
*(_BYTE *)(v27 + 26) &= ~1u;
if( *(_QWORD *)(v27 + 32) )
{
if( v27 )
{
*(_BYTE *)(v27 + 32) |= 2u;
if( *(__int64 *)(v27 + 32) < 0 )
KiAbEntryRemoveFromTree(v27);
Event.Header.SignalState = *(_DWORD *)(v27 + 88) & 0x1FFFF;
*(_DWORD *)(v27 + 88) &= 0xFFFE0000;
*(_BYTE *)(v27 + 25) &= ~1u;
*(_QWORD *)(v27 + 32) = 0i64;
v28 = (__int64)(v27 - *((_QWORD *)v22 + 100)) / 96;
if( (_BYTE)v36 == 1 )
*((_BYTE *)v22 + 792) |= 1 << v28;
else
_InterlockedOr8((volatile signed __int8 *)v22 + 870, 1 << v28);
goto LABEL_36;
}
break;
}
}
}
if( (*((_DWORD *)v22 + 30) & 0x10000) == 0 )
KeBugCheckEx(0x162u, (ULONG_PTR)v22, v4, SessionId, 0i64);
LABEL_36:
--*((_BYTE *)v22 + 794);
KiAbThreadRemoveBoosts((ULONG_PTR)v22, v4, (unsigned int *)&Event.Header.SignalState);
v25 = (*((_WORD *)v22 + 243))++ == 0xFFFF;
if( v25 && *((_ETHREAD **)v22 + 19) != (_ETHREAD *)((char *)v22 + 152) )
KiCheckForKernelApcDelivery();
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
MiContractWsSwapPageFile((_MI_PARTITION *)Parameter);
ExReleaseRundownProtection((PEX_RUNDOWN_REF)Parameter + 119);
*((_QWORD *)Parameter + 135) = KiQueryUnbiasedInterruptTime(1u);
_InterlockedOr(v29, 0);
*((_QWORD *)Parameter + 134) = 0i64;
}
PsDereferencePartition(*((_QWORD *)Parameter + 22));
}Referenced by:
No references.