CcUninitializeCacheMap

VOID __fastcall CcUninitializeCacheMap(
        _FILE_OBJECT *FileObject,
        _LARGE_INTEGER *TruncateSize,
        _CACHE_UNINITIALIZE_EVENT *UninitializeEvent){
  bool v4; 
  _FILE_OBJECT *v5; 
  char *Partition; 
  unsigned __int8 CurrentIrql; 
  _FILE_OBJECT **PrivateCacheMap; 
  _LARGE_INTEGER *SharedCacheMap; 
  _FILE_OBJECT *v10; 
  void **v11; 
  _CACHE_UNINITIALIZE_EVENT *v12; 
  ULONG LowPart; 
  bool v14; 
  unsigned __int64 OldIrql; 
  _FILE_OBJECT *v16; 
  __int64 v17; 
  _DEVICE_OBJECT *DeviceObject; 
  VOID *FsContext; 
  _KLOCK_QUEUE_HANDLE LockQueue; 
  _KLOCK_QUEUE_HANDLE LockHandle; 
  _KLOCK_QUEUE_HANDLE v22; 

  LockQueue.LockQueue.Lock = (unsigned __int64 *volatile)((char *)&WheapErrorSourceTable + 1512);
  v4 = 0;
  LockQueue.LockQueue.Next = 0i64;
  v5 = 0i64;
  Partition = 0i64;
  memset(&LockHandle, 0, sizeof(LockHandle));
  memset(&v22, 0, sizeof(v22));
  CurrentIrql = KeGetCurrentIrql();
  __writecr8(2ui64);
  *(_QWORD *)&LockQueue.OldIrql = CurrentIrql;
  KxAcquireQueuedSpinLock(&LockQueue.LockQueue, (UINT64 *)&WheapErrorSourceTable + 189);
  PrivateCacheMap = (_FILE_OBJECT **)FileObject->PrivateCacheMap;
  SharedCacheMap = (_LARGE_INTEGER *)FileObject->SectionObjectPointer->SharedCacheMap;
  if( SharedCacheMap )
  {
    Partition = (char *)CcGetPartition((_QWORD *)FileObject->SectionObjectPointer->SharedCacheMap);
    if( _InterlockedIncrement64((volatile signed __int64 *)Partition + 121) <= 1 )
      __fastfail(0xEu);
    KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)Partition + 16, &LockHandle);
  }
  if( PrivateCacheMap )
  {
    if( PrivateCacheMap[1] != FileObject )
      KeBugCheckEx(0x34u, (PVOID)0x93D, (PVOID)0xFFFFFFFFC0000420i64, 0i64, 0i64);
    if( !Partition )
      KeBugCheckEx(0x34u, (PVOID)0x943, (PVOID)0xFFFFFFFFC0000420i64, 0i64, 0i64);
    if( PrivateCacheMap[14] )
    {
      v22.LockQueue.Lock = (unsigned __int64 *volatile)(Partition + 192);
      v22.LockQueue.Next = 0i64;
      KxAcquireQueuedSpinLock(&v22.LockQueue, (UINT64 *)Partition + 24);
      v16 = PrivateCacheMap[14];
      if( v16 )
      {
        v17 = *(_QWORD *)&v16->Type;
        v5 = PrivateCacheMap[14];
        ++CcDbgNumberOfNoopedReadAheads;
        DeviceObject = v16->DeviceObject;
        if( *(_FILE_OBJECT **)(v17 + 8) != v16 || *(_FILE_OBJECT **)&DeviceObject->Type != v16 )
          goto LABEL_66;
        *(_QWORD *)&DeviceObject->Type = v17;
        *(_QWORD *)(v17 + 8) = DeviceObject;
        v16->DeviceObject = 0i64;
        *(_QWORD *)&v16->Type = 0i64;
        if( (_FILE_OBJECT *)v16->Vpb != FileObject )
          KeBugCheckEx(0x34u, (PVOID)0x964, (PVOID)0xFFFFFFFFC0000420i64, 0i64, 0i64);
        --SharedCacheMap->anonymous_0.HighPart;
        --SharedCacheMap[67].anonymous_0.LowPart;
      }
      KeReleaseInStackQueuedSpinLockFromDpcLevel(&v22);
    }
    --SharedCacheMap->anonymous_0.HighPart;
    v10 = PrivateCacheMap[12];
    v11 = (void **)PrivateCacheMap[13];
    if( (_FILE_OBJECT **)v10->DeviceObject == PrivateCacheMap + 12 && *v11 == PrivateCacheMap + 12 )
    {
      *v11 = v10;
      v10->DeviceObject = (_DEVICE_OBJECT *)v11;
      if( PrivateCacheMap == (_FILE_OBJECT **)&SharedCacheMap[47] )
      {
        *(_WORD *)PrivateCacheMap = 0;
        PrivateCacheMap = 0i64;
      }
      FileObject->PrivateCacheMap = 0i64;
      goto LABEL_13;
    }
LABEL_66:
    __fastfail(3u);
  }
LABEL_13:
  if( SharedCacheMap )
  {
    if( TruncateSize )
    {
      if( TruncateSize->QuadPart || !SharedCacheMap[1].QuadPart )
      {
        if( (_LARGE_INTEGER *)SharedCacheMap[28].QuadPart == &SharedCacheMap[28] )
          SharedCacheMap[1] = *TruncateSize;
      }
      else
      {
        SharedCacheMap[19].anonymous_0.LowPart |= 0x10u;
      }
    }
    if( SharedCacheMap->anonymous_0.HighPart )
    {
      if( UninitializeEvent )
      {
        if( (_LARGE_INTEGER *)SharedCacheMap[28].QuadPart == &SharedCacheMap[28] )
        {
          *(_QWORD *)UninitializeEvent = SharedCacheMap[34].QuadPart;
          SharedCacheMap[34].QuadPart = (LONGLONG)UninitializeEvent;
          v4 = (FileObject->DeviceObject->Characteristics & 0x10) != 0;
        }
        else
        {
          KeSetEvent((PRKEVENT)((char *)UninitializeEvent + 8), 0, 0);
        }
      }
      KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
      OldIrql = LockHandle.OldIrql;
      goto LABEL_27;
    }
    if( (_LARGE_INTEGER *)SharedCacheMap[28].QuadPart != &SharedCacheMap[28] )
      KeBugCheckEx(0x34u, (PVOID)0x9E0, (PVOID)0xFFFFFFFFC0000420i64, 0i64, 0i64);
    v12 = UninitializeEvent;
    if( UninitializeEvent )
    {
      *(_QWORD *)UninitializeEvent = SharedCacheMap[34].QuadPart;
      SharedCacheMap[34].QuadPart = (LONGLONG)UninitializeEvent;
      v4 = (FileObject->DeviceObject->Characteristics & 0x10) != 0;
    }
    LowPart = SharedCacheMap[19].anonymous_0.LowPart;
    if( (LowPart & 4) == 0 && !UninitializeEvent )
      goto LABEL_21;
    if( (LowPart & 0x20) != 0 )
    {
LABEL_23:
      Partition[633] = 1;
      if( Partition[966] )
      {
        SharedCacheMap[19].anonymous_0.LowPart |= 0x10000u;
        v14 = 1;
      }
      else
      {
        v14 = v12 && (SharedCacheMap[19].anonymous_0.LowPart & 0x20) == 0;
      }
      CcScheduleLazyWriteScan((UINT8)Partition, v14);
      KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
      OldIrql = LockHandle.OldIrql;
LABEL_27:
      __writecr8(OldIrql);
      KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
      __writecr8(LockQueue.OldIrql);
      goto LABEL_28;
    }
    if( SharedCacheMap[14].anonymous_0.LowPart
      || (LowPart & 0x400) != 0 && SharedCacheMap[5].QuadPart != 0x7FFFFFFFFFFFFFFFi64 )
    {
LABEL_21:
      if( (LowPart & 0x20) == 0 )
        CcInsertIntoDirtySharedCacheMapList((_SHARED_CACHE_MAP *)SharedCacheMap);
      goto LABEL_23;
    }
    CcDeleteSharedCacheMap((_SHARED_CACHE_MAP *)SharedCacheMap, (UINT8)&LockQueue, (UINT64)&LockHandle, 0i64);
    v4 = 0;
  }
  else
  {
    if( TruncateSize && !TruncateSize->QuadPart && FileObject->SectionObjectPointer->DataSectionObject )
    {
      if( Partition )
        KeBugCheckEx(0x34u, (PVOID)0xA82, (PVOID)0xFFFFFFFFC0000420i64, 0i64, 0i64);
      KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
      __writecr8(LockQueue.OldIrql);
      CcPurgeCacheSection((INT64 *)FileObject->SectionObjectPointer, (UINT64)TruncateSize, 0i64, 0);
    }
    else
    {
      KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
      __writecr8(LockQueue.OldIrql);
    }
    if( UninitializeEvent )
      KeSetEvent((PRKEVENT)((char *)UninitializeEvent + 8), 0, 0);
  }
LABEL_28:
  if( PrivateCacheMap )
    ExFreePoolWithTag(PrivateCacheMap, 0);
  if( v4 )
    CcAdjustWriteBehindThreadPoolIfNeeded((UINT8)Partition);
  if( v5 )
  {
    HalPutDmaAdapter((PADAPTER_OBJECT)FileObject);
    FsContext = v5->FsContext;
    if( FsContext )
      IoDiskIoAttributionDereference(FsContext);
    CcFreeWorkQueueEntry((_WORK_QUEUE_ENTRY *)v5);
  }
  if( Partition )
    CcDereferencePartition((INT64)Partition);
}

Referenced by:

CcPurgeCacheSection