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