MiProcessDereferenceList
VOID __stdcall MiProcessDereferenceList(_MI_PARTITION *Partition){
int v1;
_MI_PARTITION_SEGMENTS *p_Segments;
unsigned __int8 v4;
_BYTE *v5;
unsigned __int8 v6;
__int64 *v7;
__int64 v8;
__int64 **v9;
__int64 *v10;
int v11;
_QWORD **v12;
_QWORD *v13;
__int64 v14;
__int64 v15;
__int64 v16;
__int128 v17;
char v18;
__int64 v19;
__int64 v20;
__int128 v21;
int v22;
int v23;
bool v24;
unsigned __int64 ActualExpansion;
_MMPAGE_FILE_EXPANSION PageExpand;
int v27;
int v28;
v28 = v1;
memset(&PageExpand, 0i64, sizeof(PageExpand));
v27 = 0;
p_Segments = &Partition->Segments;
v4 = ExAcquireSpinLockExclusive((INT64 *)&Partition->Segments.SegmentListLock);
v5 = &Partition->Segments.gapB0[32];
LABEL_2:
v6 = v4;
do
{
v7 = *(__int64 **)v5;
if( *(_BYTE **)v5 != v5 )
{
v8 = *v7;
if( (_BYTE *)v7[1] != v5 || *(__int64 **)(v8 + 8) != v7 )
LABEL_41:
__fastfail(3u);
*(_QWORD *)v5 = v8;
*(_QWORD *)(v8 + 8) = v5;
if( (unsigned int)ExTryAcquireSpinLockExclusiveAtDpcLevel(v7 + 8) )
{
*((_DWORD *)v7 + 12) &= ~0x8000000u;
v7[1] = (__int64)v7;
*v7 = (__int64)v7;
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&p_Segments->SegmentListLock);
ExReleaseSpinLockExclusiveFromDpcLevel(v7 + 8);
__writecr8(v6);
MiSegmentDelete((_CONTROL_AREA *)(v7 - 1));
}
else
{
v14 = *(_QWORD *)v5;
if( *(_BYTE **)(*(_QWORD *)v5 + 8i64) != v5 )
goto LABEL_41;
*v7 = v14;
v7[1] = (__int64)v5;
*(_QWORD *)(v14 + 8) = v7;
*(_QWORD *)v5 = v7;
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&p_Segments->SegmentListLock);
__writecr8(v6);
}
v4 = ExAcquireSpinLockExclusive((INT64 *)&p_Segments->SegmentListLock);
goto LABEL_2;
}
v9 = (__int64 **)&Partition->Segments.gapB0[64];
while( 1 )
{
v10 = *v9;
if( *v9 == (__int64 *)v9 )
break;
v15 = *v10;
if( (__int64 **)v10[1] != v9 || *(__int64 **)(v15 + 8) != v10 )
goto LABEL_41;
*v9 = (__int64 *)v15;
v16 = (__int64)(v10 - 1);
*(_QWORD *)(v15 + 8) = v9;
if( *(_QWORD *)(v16 + 32) == -1i64 )
{
if( ExAcquireRundownProtection(&Partition->Modwriter.ModifiedPageWriterRundown) )
{
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&p_Segments->SegmentListLock);
__writecr8(v6);
MiAttemptPageFileReduction((_MMPAGE_FILE_EXPANSION *)v16);
ExReleaseRundownProtection(&Partition->Modwriter.ModifiedPageWriterRundown);
v6 = ExAcquireSpinLockExclusive((INT64 *)&p_Segments->SegmentListLock);
}
if( (*(_BYTE *)(v16 + 79) & 0x10) == 0 )
KeSetEvent((PRKEVENT)(v16 + 48), 0, 0);
}
else
{
*(_OWORD *)&PageExpand.Segment = *(_OWORD *)v16;
*(_OWORD *)&PageExpand.DereferenceList.Blink = *(_OWORD *)(v16 + 16);
*(_OWORD *)&PageExpand.RequestedExpansionSize = *(_OWORD *)(v16 + 32);
*(_OWORD *)PageExpand.gap30 = *(_OWORD *)(v16 + 48);
v17 = *(_OWORD *)(v16 + 64);
PageExpand.ActiveEntry = (void **volatile)v16;
*(_OWORD *)&PageExpand.gap30[16] = v17;
*(_QWORD *)(v16 + 80) = &PageExpand;
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&p_Segments->SegmentListLock);
__writecr8(v6);
if( ExAcquireRundownProtection(&Partition->Modwriter.ModifiedPageWriterRundown) )
{
MiExtendPagingFiles(&PageExpand);
ExReleaseRundownProtection(&Partition->Modwriter.ModifiedPageWriterRundown);
}
v18 = MiProcessingPageExtendComplete((__int64)&PageExpand, v16, (__int64)Partition);
--Partition->Segments.PagefileExtensionRequests;
v6 = v18;
if( Partition->Segments.PagefileExtensionWaiters )
KeSetEvent((PRKEVENT)Partition->Segments.gap210, 0, 0);
}
}
v11 = v28;
if( v28 )
{
v12 = (_QWORD **)&Partition->Segments.gapB0[48];
while( 1 )
{
v13 = *v12;
if( *v12 == v12 )
break;
v19 = *v13;
if( (_QWORD **)v13[1] != v12 || *(_QWORD **)(v19 + 8) != v13 )
goto LABEL_41;
*v12 = (_QWORD *)v19;
v20 = (__int64)(v13 - 1);
*(_QWORD *)(v19 + 8) = v12;
*(_OWORD *)&PageExpand.Segment = *(_OWORD *)(v13 - 1);
*(_OWORD *)&PageExpand.DereferenceList.Blink = *(_OWORD *)(v13 + 1);
*(_OWORD *)&PageExpand.RequestedExpansionSize = *(_OWORD *)(v13 + 3);
*(_OWORD *)PageExpand.gap30 = *(_OWORD *)(v13 + 5);
v21 = *(_OWORD *)(v13 + 7);
PageExpand.ActiveEntry = (void **volatile)(v13 - 1);
*(_OWORD *)&PageExpand.gap30[16] = v21;
v13[9] = &PageExpand;
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&Partition->Segments.SegmentListLock);
__writecr8(v6);
MiRemoveUnusedSegments(Partition);
v22 = v27;
v24 = v23 == 0;
ActualExpansion = PageExpand.ActualExpansion;
if( !v24 )
v22 = 1;
v27 = v22;
if( v22 )
ActualExpansion = 1i64;
PageExpand.ActualExpansion = ActualExpansion;
v6 = MiProcessingPageExtendComplete((__int64)&PageExpand, v20, (__int64)Partition);
}
v11 = v28;
p_Segments = &Partition->Segments;
}
}
while( *(_BYTE **)v5 != v5
|| v11 && *(_MI_PARTITION **)&Partition->Segments.gapB0[48] != (_MI_PARTITION *)&Partition->Segments.gapB0[48]
|| *v9 != (__int64 *)v9 );
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&p_Segments->SegmentListLock);
__writecr8(v6);
if( *(_DWORD *)&Partition->Segments.gap1D0[4] )
{
KeResetEvent((_KEVENT *)Partition->Segments.gap1D0);
MiFreeClonePool();
}
}Referenced by:
MiDereferenceSegmentThread
MiRemoveUnusedSegments