CcGetVacbMiss
LIST_ENTRY *__fastcall CcGetVacbMiss(INT64 a1, INT64 a2, INT64 a3, INT64 a4){
unsigned int v4;
char v5;
int v6;
unsigned int v7;
LARGE_INTEGER v9;
INT64 Partition;
KIRQL v11;
_LIST_ENTRY *VacbFromFreeList;
UINT64 v13;
NTSTATUS v14;
INT64 v15;
INT64 v17;
KIRQL v18;
int v19;
KIRQL v20;
KIRQL v21;
char v22;
LARGE_INTEGER SectionOffset;
INT64 v24;
__int64 CapturedViewSize[9];
unsigned int UnmapFlags;
int v27;
v27 = a4;
SectionOffset.HighPart = HIDWORD(a2);
v4 = 0;
UnmapFlags = 0;
v5 = 0;
SectionOffset.LowPart = a2 - (a2 & 0x3FFFF);
v6 = a4;
v7 = a3;
v9 = SectionOffset;
Partition = CcGetPartition((_QWORD *)a1);
v24 = Partition;
while( 1 )
{
v11 = KeAcquireQueuedSpinLock(4ui64);
if( v5 )
UnmapFlags = v4 | 2;
VacbFromFreeList = CcGetVacbFromFreeList(Partition);
KeReleaseQueuedSpinLock(4ui64, v11);
if( VacbFromFreeList )
break;
while( 1 )
{
CcUnmapInactiveViews(*(_QWORD *)(Partition + 8), v13, 0i64);
if( !v19 )
break;
v20 = KeAcquireQueuedSpinLock(4ui64);
VacbFromFreeList = CcGetVacbFromFreeList(Partition);
KeReleaseQueuedSpinLock(4ui64, v20);
if( VacbFromFreeList )
goto LABEL_5;
}
if( v6 == 1 )
++CcDbgNumberOfFailedHighPriorityMappingsDueToCcResources;
v14 = -1073741670;
LABEL_35:
if( v5 || v6 != 1 )
RtlRaiseStatus(v14);
Partition = v24;
v5 = 1;
v4 = UnmapFlags;
}
LABEL_5:
CapturedViewSize[0] = *(_QWORD *)(a1 + 32) - v9.QuadPart;
if( CapturedViewSize[0] > 0x40000ui64 )
LODWORD(CapturedViewSize[0]) = 0x40000;
v14 = MmMapViewInSystemCache(
*(VOID **)(a1 + 168),
(VOID **)&VacbFromFreeList->Flink,
&SectionOffset,
(UINT64 *)CapturedViewSize);
CcAcquireBcbLockAndVacbLock(v7, (FAST_MUTEX *)a1);
v9 = SectionOffset;
if( *(__int64 *)(a1 + 32) > 0x2000000 )
{
CcGetVacbLargeOffset((_SHARED_CACHE_MAP *)a1, SectionOffset.QuadPart);
v15 = v17;
}
else
{
v15 = *(_QWORD *)(*(_QWORD *)(a1 + 88) + 8 * ((unsigned __int64)SectionOffset.LowPart >> 18));
}
if( v15 )
goto LABEL_12;
if( v14 < 0 )
goto LABEL_29;
if( SetVacb((_SHARED_CACHE_MAP *)a1, v9, (_VACB *)VacbFromFreeList, 0i64) )
{
LABEL_12:
if( v14 >= 0 )
{
if( v15 )
{
CcIncrementVacbActiveCount(v15);
CcReleaseBcbLockAndVacbLock(v7, (struct FAST_MUTEX *)a1);
CcUnmapVacb((_VACB *)VacbFromFreeList, (_SHARED_CACHE_MAP *)a1, UnmapFlags);
v18 = KeAcquireQueuedSpinLock(4ui64);
CcSetVacbInFreeList(v24, VacbFromFreeList, v5);
KeReleaseQueuedSpinLock(4ui64, v18);
VacbFromFreeList = (_LIST_ENTRY *)v15;
}
else
{
if( VacbFromFreeList->Blink != (_LIST_ENTRY *)-1i64 )
KeBugCheckEx(0x34u, 0x770ui64, 0xFFFFFFFFC0000420ui64, 0i64, 0i64);
VacbFromFreeList->Blink = (_LIST_ENTRY *)a1;
VacbFromFreeList[1].Flink = (_LIST_ENTRY *)v9.QuadPart;
CcIncrementVacbActiveCount((INT64)VacbFromFreeList);
if( v9.QuadPart >= *(_QWORD *)(a1 + 368) )
*(_QWORD *)(a1 + 368) = v9.QuadPart + 0x40000;
CcReleaseBcbLockAndVacbLock(v7, (struct FAST_MUTEX *)a1);
}
goto LABEL_18;
}
}
else
{
v14 = -1073741670;
CcUnmapVacb((_VACB *)VacbFromFreeList, (_SHARED_CACHE_MAP *)a1, UnmapFlags);
}
LABEL_29:
CcReleaseBcbLockAndVacbLock(v7, (struct FAST_MUTEX *)a1);
if( v5 )
++CcDbgNumberOfFailedHighPriorityMappingsDueToMmResources;
else
VacbFromFreeList->Flink = 0i64;
v21 = KeAcquireQueuedSpinLock(4ui64);
CcSetVacbInFreeList(v24, VacbFromFreeList, v5);
KeReleaseQueuedSpinLock(4ui64, v21);
VacbFromFreeList = 0i64;
FsRtlIsNtstatusExpected((unsigned int)v14);
if( !v22 )
{
v14 = -1073741589;
goto LABEL_34;
}
LABEL_18:
if( v14 < 0 )
{
LABEL_34:
v6 = v27;
goto LABEL_35;
}
return VacbFromFreeList;
}Referenced by:
CcGetVirtualAddress