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