CcDeleteSharedCacheMap

VOID __fastcall CcDeleteSharedCacheMap(
        CHAR *P,
        KLOCK_QUEUE_HANDLE *LockHandle,
        KLOCK_QUEUE_HANDLE *a3,
        INT64 a4,
        FILE_OBJECT *FileObject){
  int v5; 
  INT64 Partition; 
  __int64 v10; 
  CHAR **v11; 
  __int64 v12; 
  CHAR **v13; 
  SINGLE_LIST_ENTRY *v14; 
  SINGLE_LIST_ENTRY *v15; 
  struct _DMA_ADAPTER *v16; 
  UINT64 v17; 
  struct _DMA_ADAPTER *v18; 
  __int64 v19; 
  CHAR *v20; 
  CHAR *v21; 
  CHAR *v22; 
  unsigned __int64 v23; 
  __int64 v24; 
  v5 = a4;
  Partition = CcGetPartition(P);
  if( _InterlockedIncrement64((volatile signed __int64 *)(Partition + 968)) <= 1 )
    __fastfail(0xEu);
  v10 = *((_QWORD *)P + 17);
  v11 = (CHAR **)*((_QWORD *)P + 18);
  if( *(CHAR **)(v10 + 8) != P + 136 || *v11 != P + 136 )
    goto LABEL_38;
  *v11 = (CHAR *)v10;
  *(_QWORD *)(v10 + 8) = v11;
  if( (*((_DWORD *)P + 38) & 0x3000000) == 0 )
    goto LABEL_8;
  v12 = *((_QWORD *)P + 15);
  v13 = (CHAR **)*((_QWORD *)P + 16);
  if( *(CHAR **)(v12 + 8) != P + 120 || *v13 != P + 120 )
LABEL_38:
    __fastfail(3u);
  *v13 = (CHAR *)v12;
  *(_QWORD *)(v12 + 8) = v13;
LABEL_8:
  *(_QWORD *)(*(_QWORD *)((*((_QWORD *)P + 12) & 0xFFFFFFFFFFFFFFF0ui64) + 0x28) + 8i64) = 0i64;
  *((_DWORD *)P + 38) |= 0x80020u;
  if( LockHandle )
  {
    ++CcSectionDeletionSequencePhase1;
  }
  else if( !*(_BYTE *)(Partition + 966) )
  {
    KeBugCheckEx(0x34u, 0xE53ui64, 0xFFFFFFFFC0000420ui64, 0i64, 0i64);
  }
  KeReleaseInStackQueuedSpinLockFromDpcLevel(a3);
  __writecr8(a3->OldIrql);
  if( LockHandle )
  {
    KeReleaseInStackQueuedSpinLockFromDpcLevel(LockHandle);
    __writecr8(LockHandle->OldIrql);
  }
  if( *((CHAR **)P + 2) != P + 16 )
    CcDeleteBcbs((INT64)P);
  CcUnmapAndPurge((INT64)P, *((_QWORD *)P + 1) >= 0x100000i64);
  if( v5 )
  {
    FsRtlReleaseFile(FileObject);
    CcDereferenceSharedCacheMapFileObject((INT64)P, (UINT64)FileObject);
  }
  v16 = (struct _DMA_ADAPTER *)*((_QWORD *)P + 21);
  if( v16 )
  {
    HalPutDmaAdapter(v16);
    *((_QWORD *)P + 21) = 0i64;
  }
  if( *((_QWORD *)P + 20) )
    CcDeleteMbcb((SINGLE_LIST_ENTRY *)P, v14, v15);
  CcUninitializeVolumeCacheMap(*((PVOID *)P + 63));
  v18 = (struct _DMA_ADAPTER *)ObFastReplaceObject((_EX_FAST_REF *)P + 12, 0i64, v17);
  HalPutDmaAdapter(v18);
  v19 = *((_QWORD *)P + 34);
  if( v19 )
  {
    do
    {
      v23 = v19 & 0xFFFFFFFFFFFFFFFEui64;
      v24 = *(_QWORD *)v23;
      KeSetEvent((PRKEVENT)(v23 + 8), 0);
      v19 = v24;
    }
    while( v24 );
  }
  if( LockHandle )
  {
    KeAcquireInStackQueuedSpinLock(&CcMasterLock, LockHandle);
    ++CcSectionDeletionSequencePhase2;
    KeReleaseInStackQueuedSpinLockFromDpcLevel(LockHandle);
    __writecr8(LockHandle->OldIrql);
  }
  v20 = (CHAR *)*((_QWORD *)P + 11);
  if( v20 != P + 56 && v20 )
    ExFreePoolWithTag(v20, 0);
  v21 = (CHAR *)*((_QWORD *)P + 22);
  if( v21 && v21 != P + 344 )
    ExFreePoolWithTag(v21, 0);
  v22 = (CHAR *)*((_QWORD *)P + 23);
  if( v22 && v22 != P + 344 )
    ExFreePoolWithTag(v22, 0);
  CcDereferencePartition(Partition);
  ExFreePoolWithTag(P, 0);
}

Referenced by:

CcDeleteSectionsForPartition
CcInitializeCacheMapEx
CcUninitializeCacheMap
CcWriteBehindInternal