MiDeleteCachedSegment
VOID __stdcall MiDeleteCachedSegment(_MI_PARTITION *Partition, _BYTE *a2){
INT64 *v2;
INT64 v4;
_QWORD **v5;
unsigned __int64 v6;
_QWORD *i;
_BYTE *v8;
int v9;
UINT64 inserted;
_MI_CONTROL_AREA_WAIT_BLOCK *v11;
_FILE_OBJECT *v12;
int v13;
_MI_CONTROL_AREA_WAIT_BLOCK *Gate;
_FILE_OBJECT *AcquiredFileObject;
v2 = (INT64 *)((char *)Partition + 1344);
v4 = 1i64;
v5 = (_QWORD **)((char *)Partition + 1704);
v6 = ExAcquireSpinLockExclusive((PEX_SPIN_LOCK)Partition + 336);
for( i = *v5; i != v5; i = (_QWORD *)*i )
{
v4 = (INT64)(i - 1);
if( (unsigned int)ExTryAcquireSpinLockExclusiveAtDpcLevel(i + 8) )
break;
}
if( i == v5 )
{
ExReleaseSpinLockExclusiveFromDpcLevel(v2);
__writecr8(v6);
return;
}
MiUnlinkUnusedControlArea(v4);
ExReleaseSpinLockExclusiveFromDpcLevel(v2);
v9 = *(_DWORD *)(v4 + 56);
if( (v9 & 0x20) == 0 && *(_DWORD *)(v4 + 76) && (*((_DWORD *)Partition + 1) & 1) == 0 )
{
inserted = MiInsertUnusedSegment((_CONTROL_AREA *)v4);
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(v4 + 72));
__writecr8(v6);
if( inserted )
MiReturnCrossPartitionSectionCharges((volatile INT64 *)Partition, 1i64, inserted);
return;
}
v11 = 0i64;
v12 = 0i64;
Gate = 0i64;
AcquiredFileObject = 0i64;
if( (v9 & 0x20) == 0 )
{
LOBYTE(v8) = v6;
MiFlushControlArea((_CONTROL_AREA *)v4, v8, &Gate, &AcquiredFileObject);
v11 = Gate;
if( v13 != 1 )
goto LABEL_17;
v12 = AcquiredFileObject;
}
LOBYTE(v8) = v6;
MiDestroySection((_CONTROL_AREA *)v4, (INT16)v8, v12);
LABEL_17:
if( v11 )
MiReleaseControlAreaWaiters(v11);
}Referenced by:
MiDereferenceSegmentThread
MiRemoveUnusedSegments