CcPinFileData

VOID __fastcall CcPinFileData(
        _FILE_OBJECT *FileObject,
        _LARGE_INTEGER *FileOffset,
        UINT64 Length,
        UINT8 ReadOnly,
        UINT8 WriteOnly,
        UINT64 Flags,
        _BCB **Bcb,
        VOID **BaseAddress,
        _LARGE_INTEGER *BeyondLastByte){
  char v10; 
  __int64 v11; 
  char *SharedCacheMap; 
  VOID **v13; 
  volatile signed __int32 *v14; 
  _ETHREAD *CurrentThread; 
  unsigned __int8 AbEntrySummary; 
  __int64 v17; 
  NTSTATUS SessionId; 
  bool v19; 
  unsigned __int8 CurrentIrql; 
  _LARGE_INTEGER v21; 
  unsigned __int64 QuadPart_high; 
  unsigned int v23; 
  LONGLONG v24; 
  __int64 v25; 
  __int64 v26; 
  unsigned __int64 v27; 
  _LIST_ENTRY *BcbListHeadLargeOffset; 
  __int64 v29; 
  __int16 v30; 
  unsigned int v31; 
  unsigned int v32; 
  char v33; 
  __int64 v34; 
  VOID **v35; 
  volatile signed __int32 *v36; 
  unsigned __int64 v37; 
  unsigned __int32 v38; 
  INT64 v39; 
  _WORD *v40; 
  __int16 v41; 
  unsigned __int64 v42; 
  _ETHREAD *v43; 
  NTSTATUS v44; 
  unsigned __int64 v45; 
  char *v46; 
  unsigned int v47; 
  _ETHREAD *v48; 
  unsigned __int8 v49; 
  __int64 v50; 
  __int64 v51; 
  NTSTATUS v52; 
  __int16 SpecialApcDisable; 
  unsigned __int8 v54; 
  unsigned __int64 v55; 
  unsigned __int32 v56; 
  __int64 v57; 
  _KEVENT *v58; 
  unsigned int v59; 
  UINT64 v60; 
  int v61; 
  INT64 v62; 
  _ERESOURCE *v63; 
  int v64; 
  _LARGE_INTEGER v65; 
  ULONG v66; 
  __int16 LowPart; 
  unsigned int v68; 
  ULONG v69; 
  _BCB *v70; 
  INT64 v71; 
  _ERESOURCE *v72; 
  unsigned __int8 v73; 
  _ETHREAD *v74; 
  char v75; 
  char v76; 
  unsigned __int8 v77; 
  LONGLONG v78; 
  _SHARED_CACHE_MAP *v79; 
  _KEVENT *v80; 
  __int64 AbOrphanedEntrySummary; 
  UINT64 RequestHighPriorityMapping; 
  UINT64 PerformingReadAhead; 
  char v84; 
  int v85; 
  _QWORD *v86; 
  _VACB *Vacb; 
  UINT64 ReceivedLength; 
  _LARGE_INTEGER Lengtha; 
  _LARGE_INTEGER FileOffseta; 
  int v91; 
  char v92[12]; 
  char *v93; 
  int v94; 
  UINT64 a3; 
  int v96; 
  int v97; 
  __int64 v98; 
  __int64 v99; 
  __int64 v100; 
  char *v101; 
  int v102; 
  _ETHREAD *v103; 
  _ETHREAD *v104; 
  UINT8 ReturnResult; 
  _LARGE_INTEGER *v106; 
  unsigned int v107; 
  UINT8 v108; 

  v108 = ReadOnly;
  v107 = Length;
  v106 = FileOffset;
  v10 = Flags;
  v11 = 0i64;
  *(_QWORD *)&v92[4] = 0i64;
  ReceivedLength = 0i64;
  Vacb = 0i64;
  SharedCacheMap = (char *)FileObject->SectionObjectPointer->SharedCacheMap;
  v101 = SharedCacheMap;
  if( FileOffset->QuadPart + (unsigned int)Length > *((_QWORD *)SharedCacheMap + 4) )
    KeBugCheckEx(0x34u, (PVOID)0x128, (PVOID)0xFFFFFFFFC0000420i64, 0i64, 0i64);
  *Bcb = 0i64;
  v13 = BaseAddress;
  *BaseAddress = 0i64;
  if( (v10 & 4) != 0 )
  {
    LODWORD(ReceivedLength) = 0x40000 - (FileOffset->anonymous_0.LowPart & 0x3FFFF);
    CcReferenceFileOffset((_SHARED_CACHE_MAP *)SharedCacheMap, *FileOffset);
  }
  else
  {
    LODWORD(PerformingReadAhead) = 0;
    LODWORD(RequestHighPriorityMapping) = (v10 & 0x40) != 0;
    *v13 = CcGetVirtualAddress(
             (_SHARED_CACHE_MAP *)SharedCacheMap,
             *FileOffset,
             &Vacb,
             &ReceivedLength,
             RequestHighPriorityMapping,
             PerformingReadAhead);
  }
  v14 = (volatile signed __int32 *)(SharedCacheMap + 280);
  LODWORD(a3) = 0;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --CurrentThread->Tcb.SpecialApcDisable;
  if( ++CurrentThread->Tcb.AbAllocationRegionCount != 1 )
    KeBugCheckEx(0x192u, CurrentThread, SharedCacheMap + 280, (PVOID)KeGetCurrentIrql(), 0i64);
  v94 = 0;
  AbEntrySummary = CurrentThread->Tcb.AbEntrySummary;
  if( AbEntrySummary )
    goto LABEL_6;
  if( CurrentThread->Tcb.AbOrphanedEntrySummary )
  {
    AbOrphanedEntrySummary = CurrentThread->Tcb.AbOrphanedEntrySummary;
    CurrentThread->Tcb.AbOrphanedEntrySummary = 0;
    AbEntrySummary = CurrentThread->Tcb.AbEntrySummary | AbOrphanedEntrySummary;
LABEL_6:
    _BitScanForward((unsigned int *)&v17, AbEntrySummary);
    v94 = v17;
    CurrentThread->Tcb.AbEntrySummary = AbEntrySummary & ~(1 << v17);
    v11 = (__int64)&CurrentThread->Tcb.LockEntries[v17];
  }
  if( v11 )
  {
    if( (unsigned __int64)v14 >= 0xFFFF800000000000ui64
      && *((_BYTE *)&MiState[1537] + (((unsigned __int64)v14 >> 39) & 0x1FF)) == 1 )
    {
      SessionId = MmGetSessionIdEx(CurrentThread->Tcb.ApcState.Process);
    }
    else
    {
      SessionId = -1;
    }
    *(_DWORD *)(v11 + 40) = SessionId;
    *(_QWORD *)(v11 + 32) = (unsigned __int64)v14 & 0x7FFFFFFFFFFFFFFCi64;
  }
  else
  {
    _interlockedbittestandset((volatile signed __int32 *)&CurrentThread->Tcb.116 + 1, 0x10u);
  }
  --CurrentThread->Tcb.AbAllocationRegionCount;
  KiAbThreadRemoveBoosts(&CurrentThread->Tcb, SharedCacheMap + 280, &a3);
  v19 = CurrentThread->Tcb.SpecialApcDisable++ == -1;
  if( v19
    && ($F25F8C4BA33AF922A5F1AF68CD89DDDF *)CurrentThread->Tcb.ApcState.ApcListHead[0].Flink != &CurrentThread->Tcb.152 )
  {
    KiCheckForKernelApcDelivery();
  }
  CurrentIrql = KeGetCurrentIrql();
  __writecr8(1ui64);
  if( !_interlockedbittestandreset(v14, 0) )
    ExpAcquireFastMutexContended((_FAST_MUTEX *)SharedCacheMap + 5, (VOID *)v11);
  if( v11 )
    *(_BYTE *)(v11 + 26) |= 1u;
  *((_QWORD *)SharedCacheMap + 36) = KeGetCurrentThread();
  *((_DWORD *)SharedCacheMap + 82) = CurrentIrql;
  v85 = 1;
  FileOffseta.QuadPart = 0i64;
  Lengtha.QuadPart = 0i64;
  v21 = *FileOffset;
  QuadPart_high = HIDWORD(FileOffset->QuadPart);
  v23 = v107;
  v24 = FileOffset->QuadPart + v107;
  *(_QWORD *)&v92[4] = v24;
  v98 = 0i64;
  v25 = v21.QuadPart + 0x80000;
  v26 = *((_QWORD *)SharedCacheMap + 4);
  v27 = HIDWORD(v21.QuadPart);
  if( v26 <= 0x200000 || (LODWORD(v27) = QuadPart_high, (*((_DWORD *)SharedCacheMap + 38) & 0x200) == 0) )
  {
    LODWORD(QuadPart_high) = v27;
    goto LABEL_113;
  }
  if( v26 <= 0x2000000 )
  {
    if( v25 < v26 )
    {
      BcbListHeadLargeOffset = (_LIST_ENTRY *)(*((_QWORD *)SharedCacheMap + 11)
                                             + 8 * ((unsigned __int64)(unsigned int)v26 >> 18)
                                             + 16 * (v25 >> 19));
      goto LABEL_23;
    }
LABEL_113:
    BcbListHeadLargeOffset = (_LIST_ENTRY *)(SharedCacheMap + 16);
    goto LABEL_23;
  }
  BcbListHeadLargeOffset = CcGetBcbListHeadLargeOffset((_SHARED_CACHE_MAP *)SharedCacheMap, v21.QuadPart + 0x80000, 1u);
  v23 = v107;
LABEL_23:
  v29 = (__int64)&BcbListHeadLargeOffset->Flink[-1];
  v98 = v29;
  if( (_DWORD)QuadPart_high || (v30 = *(_WORD *)v29, *(_WORD *)v29 != 765) || *(_DWORD *)(v29 + 36) )
  {
    while( *(_WORD *)v29 == 765 && v21.QuadPart < *(_QWORD *)(v29 + 32) )
    {
      v78 = *(_QWORD *)(v29 + 8);
      if( v21.QuadPart >= v78 )
      {
        v33 = 1;
        goto LABEL_34;
      }
      if( v24 >= v78 )
        v24 = *(_QWORD *)(v29 + 8);
      *(_QWORD *)&v92[4] = v24;
      v29 = *(_QWORD *)(v29 + 16) - 16i64;
      v98 = v29;
    }
  }
  else
  {
    v31 = *(_DWORD *)&v92[4];
    while( v30 == 765 && v21.anonymous_0.LowPart < *(_DWORD *)(v29 + 32) )
    {
      v32 = *(_DWORD *)(v29 + 8);
      if( v21.anonymous_0.LowPart >= v32 )
      {
        v33 = 1;
        goto LABEL_34;
      }
      if( v31 >= v32 )
      {
        v31 = *(_DWORD *)(v29 + 8);
        *(_DWORD *)&v92[4] = v31;
        v24 = *(_QWORD *)&v92[4];
      }
      v29 = *(_QWORD *)(v29 + 16) - 16i64;
      v98 = v29;
      v30 = *(_WORD *)v29;
    }
  }
  v33 = 0;
LABEL_34:
  v86 = (_QWORD *)v29;
  if( !v33 )
  {
    if( (v10 & 8) != 0 )
    {
      v29 = 0i64;
      v86 = 0i64;
      v84 = 0;
      v35 = BaseAddress;
      goto LABEL_72;
    }
    FileOffseta = v21;
    v65.QuadPart = v24 - v21.QuadPart;
    v64 = v21.anonymous_0.LowPart & 0xFFF;
    v65.anonymous_0.LowPart += v64;
    Lengtha = v65;
    v66 = v64 + ReceivedLength;
    LODWORD(ReceivedLength) = v64 + ReceivedLength;
    if( (v108 || (*((_DWORD *)SharedCacheMap + 38) & 4) != 0) && (LowPart = v21.anonymous_0.LowPart, !WriteOnly) )
    {
      v68 = HIDWORD(ReceivedLength);
    }
    else
    {
      LowPart = v21.anonymous_0.LowPart;
      v68 = 2;
      HIDWORD(ReceivedLength) = 2;
      if( !v64 )
      {
        if( v23 >= 0x1000 )
          v68 = 3;
        HIDWORD(ReceivedLength) = v68;
      }
      if( (v65.anonymous_0.LowPart & 0xFFF) == 0 )
      {
        v68 |= 4u;
        HIDWORD(ReceivedLength) = v68;
      }
    }
    if( (*((_DWORD *)SharedCacheMap + 38) & 0x200) == 0 )
      v108 = 1;
    v69 = (v65.anonymous_0.LowPart + 4095) & 0xFFFFF000;
    Lengtha.anonymous_0.LowPart = v69;
    *BaseAddress = (char *)*BaseAddress - (LowPart & 0xFFF);
    FileOffseta.anonymous_0.LowPart &= 0xFFFFF000;
    if( v69 > v66 )
    {
      v69 = v66;
      Lengtha.anonymous_0.LowPart = v66;
    }
    v70 = CcAllocateInitializeBcb((_SHARED_CACHE_MAP *)SharedCacheMap, (_BCB *)v29, &FileOffseta, &Lengtha);
    v29 = (__int64)v70;
    v86 = v70;
    if( (v10 & 1) != 0 )
    {
      if( !v70 )
      {
        KeReleaseGuardedMutex((PKGUARDED_MUTEX)SharedCacheMap + 5);
        RtlRaiseStatus(-1073741670);
      }
      if( !v108 )
      {
        v72 = (_ERESOURCE *)(v70 + 18);
        if( (v10 & 2) != 0 )
        {
          if( !ExAcquireResourceExclusiveLite((UINT64)v72, 0, v71) )
            KeBugCheckEx(0x34u, (PVOID)0x201F6, (PVOID)v29, 0i64, 0i64);
        }
        else if( !ExAcquireSharedStarveExclusive(v72, 0) )
        {
          KeBugCheckEx(0x34u, (PVOID)0x201FD, (PVOID)v29, 0i64, 0i64);
        }
      }
      KeReleaseGuardedMutex((PKGUARDED_MUTEX)SharedCacheMap + 5);
      v85 = 0;
      if( (v10 & 4) == 0 )
      {
        CcMapAndRead(v69, v68, 1u, *BaseAddress);
        ExAcquireFastMutex((PFAST_MUTEX)SharedCacheMap + 5);
        if( !*(_QWORD *)(v29 + 184) )
        {
          *(_QWORD *)(v29 + 184) = *BaseAddress;
          *(_QWORD *)(v29 + 56) = Vacb;
          Vacb = 0i64;
        }
        KeReleaseGuardedMutex((PKGUARDED_MUTEX)SharedCacheMap + 5);
        *BaseAddress = (VOID *)(*(_QWORD *)(v29 + 184) + FileOffset->anonymous_0.LowPart - *(_DWORD *)(v29 + 8));
      }
      v35 = BaseAddress;
      goto LABEL_71;
    }
    if( !v70 )
    {
      v84 = 0;
      v35 = BaseAddress;
      goto LABEL_72;
    }
    if( !v108 && !ExAcquireSharedStarveExclusive((PERESOURCE)(v70 + 18), 0) )
      KeBugCheckEx(0x34u, (PVOID)0x2025D, (PVOID)v29, 0i64, 0i64);
    KeReleaseGuardedMutex((PKGUARDED_MUTEX)SharedCacheMap + 5);
    v85 = 0;
    CcMapAndRead(v69, v68, 0, *BaseAddress);
    if( !v76 )
    {
      v84 = 0;
      v35 = BaseAddress;
      goto LABEL_72;
    }
    ExAcquireFastMutex((PFAST_MUTEX)SharedCacheMap + 5);
    v35 = BaseAddress;
    if( !*(_QWORD *)(v29 + 184) )
    {
      *(_QWORD *)(v29 + 184) = *BaseAddress;
      *(_QWORD *)(v29 + 56) = Vacb;
      Vacb = 0i64;
    }
    goto LABEL_132;
  }
  if( (*((_DWORD *)SharedCacheMap + 38) & 0x200) == 0 )
    v108 = 1;
  if( *(_QWORD *)(v29 + 184) )
  {
    if( (v10 & 1) != 0 )
    {
      ++*(_DWORD *)(v29 + 64);
      KeReleaseGuardedMutex((PKGUARDED_MUTEX)SharedCacheMap + 5);
      v85 = 0;
      if( !v108 )
      {
        v63 = (_ERESOURCE *)(v29 + 72);
        if( (v10 & 2) != 0 )
          ExAcquireResourceExclusiveLite((UINT64)v63, 1, v62);
        else
          ExAcquireSharedStarveExclusive(v63, 1u);
      }
    }
    else
    {
      if( !v108 && !ExAcquireSharedStarveExclusive((PERESOURCE)(v29 + 72), 0) )
      {
        v29 = 0i64;
        v86 = 0i64;
        v84 = 0;
        v35 = BaseAddress;
        goto LABEL_72;
      }
      ++*(_DWORD *)(v29 + 64);
      KeReleaseGuardedMutex((PKGUARDED_MUTEX)SharedCacheMap + 5);
      v85 = 0;
    }
    v35 = BaseAddress;
    *BaseAddress = (VOID *)(*(_QWORD *)(v29 + 184) + FileOffset->anonymous_0.LowPart - *(_DWORD *)(v29 + 8));
    goto LABEL_71;
  }
  v34 = v21.anonymous_0.LowPart - *(_DWORD *)(v29 + 8);
  v35 = BaseAddress;
  *BaseAddress = (char *)*BaseAddress - v34;
  FileOffseta = *(_LARGE_INTEGER *)(v29 + 8);
  Lengtha.QuadPart = *(unsigned int *)(v29 + 4);
  if( (v10 & 1) == 0 )
  {
    if( !v108 && !ExAcquireSharedStarveExclusive((PERESOURCE)(v29 + 72), 0) )
    {
      v29 = 0i64;
      v86 = 0i64;
      v84 = 0;
      goto LABEL_72;
    }
    ++*(_DWORD *)(v29 + 64);
    KeReleaseGuardedMutex((PKGUARDED_MUTEX)SharedCacheMap + 5);
    v85 = 0;
    CcMapAndRead(*(unsigned int *)(v29 + 4), 0i64, 0, *v35);
    if( !v75 )
    {
      v84 = 0;
      goto LABEL_72;
    }
    ExAcquireFastMutex((PFAST_MUTEX)SharedCacheMap + 5);
    if( !*(_QWORD *)(v29 + 184) )
    {
      *(_QWORD *)(v29 + 184) = *v35;
      *(_QWORD *)(v29 + 56) = Vacb;
      Vacb = 0i64;
    }
LABEL_132:
    KeReleaseGuardedMutex((PKGUARDED_MUTEX)SharedCacheMap + 5);
    *v35 = (VOID *)(*(_QWORD *)(v29 + 184) + FileOffset->anonymous_0.LowPart - *(_DWORD *)(v29 + 8));
    goto LABEL_71;
  }
  ++*(_DWORD *)(v29 + 64);
  v36 = (volatile signed __int32 *)(SharedCacheMap + 280);
  *((_QWORD *)SharedCacheMap + 36) = 0i64;
  v37 = (unsigned __int8)SharedCacheMap[328];
  v38 = _InterlockedCompareExchange((volatile signed __int32 *)SharedCacheMap + 70, 1, 0);
  if( v38 )
    ExpReleaseFastMutexContended((_FAST_MUTEX *)SharedCacheMap + 5, v38);
  __writecr8(v37);
  KeAbPostRelease(SharedCacheMap + 280);
  v85 = 0;
  if( !v108 )
  {
    v40 = (_WORD *)(v29 + 72);
    if( (v10 & 2) != 0 )
    {
      ExAcquireResourceExclusiveLite((UINT64)v40, 1, v39);
    }
    else
    {
      if( (v40[13] & 0x41) == 1 )
        KeBugCheckEx(0x1C6u, (PVOID)0xF, v40, 0i64, 0i64);
      v41 = v40[13] & 1;
      if( v41 )
      {
        v73 = KeGetCurrentIrql();
        v74 = (_ETHREAD *)KeGetCurrentThread();
        if( v73 > 1u )
          KeBugCheckEx(0x1C6u, 0i64, (PVOID)v73, (PVOID)1, 0i64);
        if( (v74->Tcb.ApcState.InProgressFlags & 2) != 0 )
          KeBugCheckEx(0x1C6u, (PVOID)6, 0i64, 0i64, 0i64);
        if( !v73 && (v74->Tcb._bf_0 & 0x400) == 0 && !v74->Tcb.WaitBlock[3].SpareLong )
          KeBugCheckEx(0x1C6u, (PVOID)7, 0i64, 0i64, 0i64);
      }
      if( v41 )
        ExpFastResourceLegacyAcquireSharedStarveExclusive(v40);
      else
        ExpAcquireSharedStarveExclusive(v40, 1);
    }
  }
  if( (v10 & 4) == 0 )
  {
    v42 = (unsigned __int64)*BaseAddress;
    v43 = (_ETHREAD *)KeGetCurrentThread();
    v103 = v43;
    HIDWORD(a3) = 0;
    v102 = 0;
    v44 = 0;
    v96 = 0;
    ReturnResult = 1;
    v45 = ((v42 & 0xFFF) + Lengtha.anonymous_0.LowPart + 4095i64) >> 12;
    v91 = v45;
    v46 = (char *)(v42 & 0xFFFFFFFFFFFFF000ui64);
    v93 = v46;
    v47 = v43->CacheManagerActive + 4 * v43->ReadClusterSize;
    while( (_DWORD)v45 )
    {
      v43->CacheManagerActive = 1;
      v59 = v45 - 1;
      if( (unsigned int)(v45 - 1) > v43->ReadClusterSize )
      {
        if( v59 > 0xF )
          v59 = 15;
        v43->ReadClusterSize = v59;
      }
      HIDWORD(a3) = 0;
      v60 = (unsigned int)((_DWORD)v45 << 12);
      v93 = (char *)(unsigned int)v60;
      MmCheckCachedPageStates(v46, v60, 0i64, &ReturnResult);
      v44 = v61;
      v96 = v61;
      if( v61 < 0 )
        break;
      v46 = &v46[(_QWORD)v93];
      v93 = v46;
      LODWORD(v45) = 0;
      v91 = 0;
    }
    v43->CacheManagerActive = v47 & 3;
    v43->ReadClusterSize = v47 >> 2;
    if( v44 < 0 )
      RtlRaiseStatus(v44);
    v100 = 0i64;
    *(_DWORD *)v92 = 0;
    v48 = (_ETHREAD *)KeGetCurrentThread();
    --v48->Tcb.SpecialApcDisable;
    if( ++v48->Tcb.AbAllocationRegionCount != 1 )
      KeBugCheckEx(0x192u, v48, SharedCacheMap + 280, (PVOID)KeGetCurrentIrql(), 0i64);
    v100 = 0i64;
    v99 = 0i64;
    v97 = 0;
    v49 = v48->Tcb.AbEntrySummary;
    if( !v49 )
    {
      if( !v48->Tcb.AbOrphanedEntrySummary )
      {
        v51 = 0i64;
        v99 = 0i64;
        goto LABEL_54;
      }
      v77 = v48->Tcb.AbOrphanedEntrySummary;
      v48->Tcb.AbOrphanedEntrySummary = 0;
      v48->Tcb.AbEntrySummary |= v77;
      v49 = v48->Tcb.AbEntrySummary;
    }
    _BitScanForward((unsigned int *)&v50, v49);
    v97 = v50;
    v48->Tcb.AbEntrySummary = v49 & ~(1 << v50);
    v51 = (__int64)&v48->Tcb.LockEntries[v50];
    v99 = v51;
LABEL_54:
    v100 = v51;
    if( v51 )
    {
      if( (unsigned __int64)v36 >= 0xFFFF800000000000ui64
        && *((_BYTE *)&MiState[1537] + (((unsigned __int64)v36 >> 39) & 0x1FF)) == 1 )
      {
        v52 = MmGetSessionIdEx(v48->Tcb.ApcState.Process);
      }
      else
      {
        v52 = -1;
      }
      *(_DWORD *)(v51 + 40) = v52;
      *(_QWORD *)(v51 + 32) = (unsigned __int64)v36 & 0x7FFFFFFFFFFFFFFCi64;
    }
    else
    {
      _interlockedbittestandset((volatile signed __int32 *)&v48->Tcb.116 + 1, 0x10u);
    }
    --v48->Tcb.AbAllocationRegionCount;
    KiAbThreadRemoveBoosts(&v48->Tcb, SharedCacheMap + 280, (UINT64 *)v92);
    SpecialApcDisable = v48->Tcb.SpecialApcDisable;
    v48->Tcb.SpecialApcDisable = SpecialApcDisable + 1;
    if( SpecialApcDisable == -1
      && ($F25F8C4BA33AF922A5F1AF68CD89DDDF *)v48->Tcb.ApcState.ApcListHead[0].Flink != &v48->Tcb.152 )
    {
      KiCheckForKernelApcDelivery();
    }
    v54 = KeGetCurrentIrql();
    __writecr8(1ui64);
    if( !_interlockedbittestandreset(v36, 0) )
      ExpAcquireFastMutexContended((_FAST_MUTEX *)SharedCacheMap + 5, (VOID *)v51);
    if( v51 )
      *(_BYTE *)(v51 + 26) |= 1u;
    v104 = (_ETHREAD *)KeGetCurrentThread();
    *((_QWORD *)SharedCacheMap + 36) = v104;
    *((_DWORD *)SharedCacheMap + 82) = v54;
    if( !v86[23] )
    {
      v86[23] = *BaseAddress;
      v86[7] = Vacb;
      Vacb = 0i64;
    }
    *((_QWORD *)SharedCacheMap + 36) = 0i64;
    v55 = (unsigned __int8)SharedCacheMap[328];
    v56 = _InterlockedCompareExchange(v36, 1, 0);
    if( v56 )
      ExpReleaseFastMutexContended((_FAST_MUTEX *)SharedCacheMap + 5, v56);
    __writecr8(v55);
    KeAbPostRelease(SharedCacheMap + 280);
    v29 = (__int64)v86;
    v35 = BaseAddress;
    *BaseAddress = (VOID *)(v86[23] + FileOffset->anonymous_0.LowPart - *((_DWORD *)v86 + 2));
    goto LABEL_71;
  }
  v29 = (__int64)v86;
  v35 = BaseAddress;
LABEL_71:
  v84 = 1;
LABEL_72:
  if( (v10 & 6) == 6 && v29 && *(_QWORD *)(v29 + 184) )
  {
    v57 = *(_QWORD *)(*(_QWORD *)(v29 + 56) + 8i64);
    if( !(unsigned __int16)_InterlockedDecrement((volatile signed __int32 *)(*(_QWORD *)(v29 + 56) + 16i64)) )
    {
      v58 = *(_KEVENT **)(v57 + 184);
      if( v58 )
        KeSetEvent(v58, 0, 0);
      _InterlockedDecrement((volatile signed __int32 *)(v57 + 544));
    }
    *(_QWORD *)(v29 + 184) = 0i64;
    *(_QWORD *)(v29 + 56) = 0i64;
    v29 = (__int64)v86;
  }
  if( v85 )
    KeReleaseGuardedMutex((PKGUARDED_MUTEX)SharedCacheMap + 5);
  if( Vacb )
  {
    v79 = Vacb->SharedCacheMap;
    if( !(unsigned __int16)_InterlockedDecrement((volatile signed __int32 *)&Vacb->Overlay) )
    {
      v80 = (_KEVENT *)*((_QWORD *)v79 + 23);
      if( v80 )
        KeSetEvent(v80, 0, 0);
      _InterlockedDecrement((volatile signed __int32 *)v79 + 136);
    }
    v29 = (__int64)v86;
  }
  if( (v10 & 4) != 0 )
    CcDereferenceFileOffset((_SHARED_CACHE_MAP *)SharedCacheMap, *FileOffset);
  if( v84 )
  {
    *Bcb = (_BCB *)v29;
    *BeyondLastByte = *(_LARGE_INTEGER *)(v29 + 32);
  }
  else
  {
    *v35 = 0i64;
    if( v29 )
      CcUnpinFileDataEx((VOID *)v29, v108, UNPIN);
  }
}

Referenced by:

CcMapData
CcMapDataCommon
CcPinMappedData
CcPinRead
CcPreparePinWrite
CcZeroDataInCache