MiProcessDeleteOnClose
VOID __stdcall MiProcessDeleteOnClose(_MI_PARTITION *Partition, UINT64 Exiting){
_QWORD *v2;
volatile LONG *v3;
int v4;
unsigned int v5;
unsigned __int64 v7;
_QWORD *v8;
INT64 v9;
INT64 *v10;
_BYTE *v11;
UINT64 inserted;
INT16 v13;
int v14;
unsigned int v15;
_FILE_OBJECT *AcquiredFileObject;
_MI_CONTROL_AREA_WAIT_BLOCK *Gate;
AcquiredFileObject = 0i64;
v2 = (_QWORD *)((char *)Partition + 1600);
Gate = 0i64;
v3 = (volatile LONG *)((char *)Partition + 1344);
v4 = 0;
v5 = -1;
while( 1 )
{
v7 = ExAcquireSpinLockExclusive(v3);
v8 = (_QWORD *)*v2;
if( (_QWORD *)*v2 == v2 )
break;
if( (++v4 & 0x3F) == 0 && *((_DWORD *)Partition + 337) >= v5 )
{
if( v8 != v2 )
{
*((_BYTE *)Partition + 1680) = 1;
KiSetTimerEx((_KTIMER *)((char *)Partition + 1616), Mi10Milliseconds, 0i64, 0, 0i64);
goto LABEL_20;
}
break;
}
v9 = (INT64)(v8 - 1);
v15 = *((_DWORD *)Partition + 337);
v10 = v8 + 8;
if( !(unsigned int)ExTryAcquireSpinLockExclusiveAtDpcLevel(v10) )
{
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)v3);
__writecr8(v7);
goto LABEL_2;
}
MiUnlinkUnusedControlArea(v9);
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)v3);
if( (*(_DWORD *)(v9 + 56) & 0x20) != 0 )
{
LOBYTE(v11) = v7;
MiDestroySection((_CONTROL_AREA *)v9, (INT16)v11, 0i64);
goto LABEL_2;
}
if( *(_DWORD *)(v9 + 76) )
{
inserted = MiInsertUnusedSegment((_CONTROL_AREA *)v9);
ExReleaseSpinLockExclusiveFromDpcLevel(v10);
__writecr8(v7);
if( inserted )
MiReturnCrossPartitionSectionCharges((volatile INT64 *)Partition, 1i64, inserted);
LABEL_2:
v5 = v15;
}
else
{
AcquiredFileObject = 0i64;
LOBYTE(v11) = v7;
MiFlushControlArea((_CONTROL_AREA *)v9, v11, &Gate, &AcquiredFileObject);
if( v14 == 1 )
{
LOBYTE(v13) = v7;
MiDestroySection((_CONTROL_AREA *)v9, v13, AcquiredFileObject);
}
v5 = v15;
if( Gate )
MiReleaseControlAreaWaiters(Gate);
}
}
*((_BYTE *)Partition + 1680) = 0;
LABEL_20:
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)v3);
__writecr8(v7);
}Referenced by:
MiDereferenceSegmentThread