MiDrainCrossPartitionUsage
VOID __fastcall MiDrainCrossPartitionUsage(INT64 a1){
unsigned __int64 v2;
UINT8 v3;
UINT8 v4;
_QWORD *v5;
signed __int64 v6;
UINT64 v7;
UINT8 v8;
UINT8 v9;
struct _EX_RUNDOWN_REF_CACHE_AWARE *v10;
IRP *v11;
IRP *v12;
int Object[2];
__int64 v14[2];
struct _KLOCK_QUEUE_HANDLE LockHandle;
Object[0] = 393216;
Object[1] = 0;
v14[1] = (__int64)v14;
v14[0] = (__int64)v14;
memset(&LockHandle, 0, sizeof(LockHandle));
KeAcquireInStackQueuedSpinLock(&qword_140C4E340, &LockHandle);
ExAcquireSpinLockExclusiveAtDpcLevel((INT64 *)(a1 + 1344));
*(_DWORD *)(a1 + 4) |= 1u;
*(_QWORD *)(a1 + 2128) = Object;
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(a1 + 1344));
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
MiDecrementControlAreaCount(a1, (volatile INT64 *)(a1 + 1360));
MiDecrementControlAreaCount(a1, (volatile INT64 *)(a1 + 1352));
MiMakeUnusedSegmentDeleteOnClose(a1);
CcExitPartition(*(_QWORD *)(a1 + 176), 0i64);
KeWaitForSingleObject(Object, Executive, 0, 0, 0i64);
v2 = ExAcquireSpinLockExclusive((PEX_SPIN_LOCK)(a1 + 1344));
v5 = (_QWORD *)(a1 + 1896);
v6 = 0i64;
while( !*v5 )
{
++v6;
v5 += 4;
if( v6 >= 7 )
goto LABEL_6;
}
KeResetEvent(Object, v6, v3, v4, v11);
*(_QWORD *)(a1 + 2120) = Object;
LABEL_6:
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(a1 + 1344));
__writecr8(v2);
KeWaitForSingleObject(Object, Executive, 0, 0, 0i64);
KeResetEvent(Object, v7, v8, v9, v12);
*(_QWORD *)(a1 + 2136) = Object;
MiDecrementCloneHeaderCount(a1);
KeWaitForSingleObject(Object, Executive, 0, 0, 0i64);
v10 = *(struct _EX_RUNDOWN_REF_CACHE_AWARE **)(a1 + 2144);
if( v10 )
ExWaitForRundownProtectionReleaseCacheAware(v10);
}Referenced by:
MiDeletePartition