MiDrainCrossPartitionUsage
VOID __stdcall MiDrainCrossPartitionUsage(INT64 a1){
unsigned __int64 v2;
_QWORD *v3;
__int64 v4;
_EX_RUNDOWN_REF_CACHE_AWARE *v5;
int Object[2];
__int64 v7[2];
_KLOCK_QUEUE_HANDLE LockHandle;
Object[0] = 393216;
Object[1] = 0;
v7[1] = (__int64)v7;
v7[0] = (__int64)v7;
memset(&LockHandle, 0, sizeof(LockHandle));
KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)&stru_140C4DB30 + 258, &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 signed __int64 *)(a1 + 1360));
MiDecrementControlAreaCount(a1, (volatile signed __int64 *)(a1 + 1352));
MiMakeUnusedSegmentDeleteOnClose(a1);
CcExitPartition();
KeWaitForSingleObject((UINT64)Object, 0, 0, 0, 0i64);
v2 = (unsigned __int8)ExAcquireSpinLockExclusive((INT64 *)(a1 + 1344));
v3 = (_QWORD *)(a1 + 1896);
v4 = 0i64;
while( !*v3 )
{
++v4;
v3 += 4;
if( v4 >= 7 )
goto LABEL_6;
}
KeResetEvent((_KEVENT *)Object);
*(_QWORD *)(a1 + 2120) = Object;
LABEL_6:
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(a1 + 1344));
__writecr8(v2);
KeWaitForSingleObject((UINT64)Object, 0, 0, 0, 0i64);
KeResetEvent((_KEVENT *)Object);
*(_QWORD *)(a1 + 2136) = Object;
MiDecrementCloneHeaderCount(a1);
KeWaitForSingleObject((UINT64)Object, 0, 0, 0, 0i64);
v5 = *(_EX_RUNDOWN_REF_CACHE_AWARE **)(a1 + 2144);
if( v5 )
ExWaitForRundownProtectionReleaseCacheAware(v5);
}Referenced by:
MiDeletePartition