MiNoPagesLastChance
VOID __stdcall MiNoPagesLastChance(_MI_PARTITION *Partition, UINT64 Limit){
int LastModifiedWriteError;
void *TotalPagesForPagingFile;
int v4;
int LastMappedWriteError;
UINT64 v6;
int v7;
unsigned __int64 v9;
unsigned __int64 v10;
volatile unsigned int NumberOfPagingFiles;
int v12;
_MMPAGING_FILE **PagingFile;
__int64 v14;
_MMPAGING_FILE *v15;
int v16;
UINT32 v17;
unsigned __int64 Total;
unsigned __int64 v19;
_EPROCESS *SystemProcess;
UINT64 UnbiasedInterruptTime;
__int64 v22;
unsigned __int64 *p_Lock;
__int64 v24;
unsigned __int64 *p_Flink;
__int64 v26;
unsigned __int8 CurrentIrql;
__int64 v28;
_MMPFN *v29;
__int64 bf_0;
__int64 v31;
_MI_LDW_WORK_CONTEXT *p_LastChanceLdwContext;
char v33;
UINT8 v34;
UINT64 *v35;
unsigned int BugCheckParameter3;
int BugCheckParameter3_4;
_KLOCK_QUEUE_HANDLE LockQueue;
__int64 v39;
_FILE_OBJECT *v40;
PVOID BugCheckParameter2;
__int64 v42;
int v44;
LastModifiedWriteError = Partition->Modwriter.LastModifiedWriteError;
TotalPagesForPagingFile = (void *)Partition->Vp.TotalPagesForPagingFile;
*(_QWORD *)&LockQueue.OldIrql = 0i64;
v4 = LastModifiedWriteError;
LastMappedWriteError = Partition->Modwriter.LastMappedWriteError;
v6 = (unsigned int)Limit;
v7 = (unsigned int)LastMappedWriteError >> 31;
BugCheckParameter2 = TotalPagesForPagingFile;
v9 = 0i64;
if( LastMappedWriteError >= 0 )
LastMappedWriteError = 0;
v10 = 0i64;
LockQueue.LockQueue = 0i64;
if( LastModifiedWriteError >= 0 )
v4 = LastMappedWriteError;
NumberOfPagingFiles = Partition->Vp.NumberOfPagingFiles;
v12 = v7 | 2;
BugCheckParameter3_4 = v4;
if( LastModifiedWriteError >= 0 )
v12 = v7;
if( !NumberOfPagingFiles )
goto LABEL_13;
PagingFile = Partition->Vp.PagingFile;
v14 = NumberOfPagingFiles;
do
{
v15 = *PagingFile;
if( ((*PagingFile)->_bf_cc & 0x50) == 0 )
{
v9 += v15->MaximumSize - v15->Size;
v10 += v15->FreeSpace;
}
++PagingFile;
--v14;
}
while( v14 );
if( v10 < 0x400 )
LABEL_13:
v12 |= 4u;
v16 = v12 | 8;
if( v9 >= 0x400 )
v16 = v12;
BugCheckParameter3 = v16;
if( *(&stru_140C4DB30 + 565) )
{
v17 = 243;
}
else
{
Total = Partition->Vp.ModifiedNoWritePageListHead.Total;
v19 = Partition->Vp.ModifiedPageListHead.Total >> 2;
if( Total < v19 )
{
v17 = Partition->Vp.TotalPagesForPagingFile < v19 ? 235 : 77;
}
else
{
v17 = 253;
BugCheckParameter2 = (PVOID)Partition->Vp.ModifiedNoWritePageListHead.Total;
TotalPagesForPagingFile = (void *)Total;
}
}
SystemProcess = Partition->Core.PartitionObject->SystemProcess;
if( !SystemProcess->Job
|| (PsGetJobLastThrottledIoTime((INT64)SystemProcess->Job),
UnbiasedInterruptTime = KiQueryUnbiasedInterruptTime(1u),
UnbiasedInterruptTime - v22 >= -MiNoPagesTimeout.QuadPart) )
{
if( KdPitchDebugger || (_BYTE)KdDebuggerNotPresent )
{
v44 = 0;
}
else
{
DbgPrintEx(
0x66u,
0,
"Without a debugger attached, the following bugcheck would have occurred.\n%4lx %p %p %x %x\n",
v17,
(const void *)Partition->Vp.ModifiedPageListHead.Total,
TotalPagesForPagingFile,
v16,
v4);
if( (MiFlags & 8) != 0 )
__debugbreak();
v44 = 1;
}
if( !MiSufficientAvailablePages((INT64)Partition, v6)
&& !_InterlockedCompareExchange(&Partition->PageLists.LastChanceLdwContext.Active, 1, 0) )
{
p_Lock = &Partition->PageLists.MappedPageListHead[0].Lock;
v24 = 0i64;
p_Flink = &Partition->PageLists.MappedPageListHead[0].Flink;
v40 = 0i64;
v26 = 16i64;
v35 = &Partition->PageLists.MappedPageListHead[0].Lock;
v39 = 16i64;
while( 1 )
{
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
LockQueue.LockQueue.Next = 0i64;
LockQueue.LockQueue.Lock = p_Lock;
KxAcquireQueuedSpinLock(&LockQueue.LockQueue, p_Lock);
v28 = *p_Flink;
if( *p_Flink == 0xFFFFFFFFFi64 )
goto LABEL_45;
do
{
v42 = 48 * v28;
v29 = &MmGetPfnDb()[v28];
v28 = v29->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0 & 0xFFFFFFFFFi64;
bf_0 = v29->OriginalPte.u.Hard.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0;
if( *(&stru_140C4DB30 + 42) && (bf_0 & 0x10) == 0 )
bf_0 &= ~*(&stru_140C4DB30 + 42);
v31 = *(_QWORD *)(bf_0 >> 16);
if( (*(_DWORD *)(v31 + 56) & 0x28) != 0
|| v24 && v24 != v31
|| _interlockedbittestandset64((volatile signed __int32 *)&v29->u2, 0x3Fui64) )
{
goto LABEL_42;
}
ExAcquireSpinLockExclusiveAtDpcLevel((INT64 *)(v31 + 72));
if( (*(_DWORD *)(v31 + 56) & 8) != 0 )
{
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(v31 + 72));
_InterlockedAnd64(&v29->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
LABEL_42:
p_Lock = v35;
continue;
}
if( !v24 )
{
v40 = (_FILE_OBJECT *)ObFastReferenceObjectLocked((_EX_FAST_REF *)(v31 + 64));
v24 = v31;
}
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(v31 + 72));
MiUnlinkPageFromList(v29, 1ui64);
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
v33 = *((_BYTE *)&v29->u3 + 2);
v29->u2._bf_0 &= 0xC000000000000000ui64;
*((_BYTE *)&v29->u3 + 2) = v33 & 0xEF;
MiPfnReferenceCountIsZero(v29, v42 / 48, v34);
_InterlockedAnd64(&v29->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(CurrentIrql);
++dword_140C4C954;
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
p_Lock = v35;
LockQueue.LockQueue.Next = 0i64;
LockQueue.LockQueue.Lock = v35;
KxAcquireQueuedSpinLock(&LockQueue.LockQueue, v35);
v28 = *p_Flink;
}
while( v28 != 0xFFFFFFFFFi64 );
v26 = v39;
LABEL_45:
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
__writecr8(CurrentIrql);
p_Lock += 5;
p_Flink += 5;
--v26;
v35 = p_Lock;
v39 = v26;
if( !v26 )
{
p_LastChanceLdwContext = &Partition->PageLists.LastChanceLdwContext;
if( v24 )
{
Partition->PageLists.LastChanceLdwContext.FileObject = v40;
Partition->PageLists.LastChanceLdwContext.ErrorStatus = -1073741566;
p_LastChanceLdwContext->WorkItem.List.Flink = 0i64;
Partition->PageLists.LastChanceLdwContext.WorkItem.WorkerRoutine = (void(__fastcall *)(void *))MiLdwPopupWorker;
Partition->PageLists.LastChanceLdwContext.WorkItem.Parameter = &Partition->PageLists.LastChanceLdwContext;
ExQueueWorkItem(&p_LastChanceLdwContext->WorkItem, DelayedWorkQueue);
++dword_140C4C950;
}
else
{
_InterlockedAnd(&Partition->PageLists.LastChanceLdwContext.Active, 0);
if( !v44 )
KeBugCheckEx(
v17,
(PVOID)Partition->Vp.ModifiedPageListHead.Total,
BugCheckParameter2,
(PVOID)BugCheckParameter3,
(PVOID)BugCheckParameter3_4);
}
return;
}
}
}
}
}Referenced by:
MiWaitForFreePage