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