CcDereferenceVacbArray

VOID __stdcall CcDereferenceVacbArray(_VACB_ARRAY_HEADER *VacbArrayHeader, UINT8 GlobalVacbLockAcquired){
  KIRQL v2; 
  unsigned int MappingCount; 
  unsigned int v6; 
  v2 = 0;
  if( !GlobalVacbLockAcquired )
    v2 = KeAcquireQueuedSpinLock(4ui64);
  MappingCount = VacbArrayHeader->MappingCount;
  if( !MappingCount )
    KeBugCheckEx(0x34u, 0x16Eui64, 0xFFFFFFFFC0000420ui64, 0i64, 0i64);
  v6 = MappingCount - 1;
  VacbArrayHeader->MappingCount = v6;
  if( !GlobalVacbLockAcquired )
  {
    if( v6 )
    {
      KeReleaseQueuedSpinLock(4ui64, v2);
    }
    else
    {
      CcRemoveVacbArray((UINT64 *)&VacbArrayHeader->VacbArrayIndex);
      KeReleaseQueuedSpinLock(4ui64, v2);
      CcFreeVacbArray(VacbArrayHeader);
    }
  }
}

Referenced by:

CcUnmapInactiveViewsInternal