CcRemoveVacbArray

UINT64 *__fastcall CcRemoveVacbArray(UINT64 *a1){
  unsigned int v1; 
  __int64 v3; 
  int v4; 
  _QWORD *v5; 
  int v6; 
  UINT64 *result; 
  UINT64 v8; 
  UINT64 **v9; 
  v1 = 0;
  if( *((_DWORD *)a1 + 1) )
    KeBugCheckEx(0x34u, 0x20Dui64, 0xFFFFFFFFC0000420ui64, 0i64, 0i64);
  v3 = *(unsigned int *)a1;
  if( *(UINT64 **)(CcVacbArrays + 8 * v3) != a1 )
    KeBugCheckEx(0x34u, 0x213ui64, 0xFFFFFFFFC0000420ui64, 0i64, 0i64);
  v4 = CcVacbArraysHighestUsedIndex;
  if( (_DWORD)v3 == CcVacbArraysHighestUsedIndex && CcVacbArraysHighestUsedIndex )
  {
    v5 = (_QWORD *)(CcVacbArrays + 8i64 * (unsigned int)CcVacbArraysHighestUsedIndex);
    while( !*v5 )
    {
      --v5;
      if( !--v4 )
        goto LABEL_10;
    }
    CcVacbArraysHighestUsedIndex = v4;
  }
LABEL_10:
  v6 = CcVacbArraysAllocated;
  *(_QWORD *)(CcVacbArrays + 8 * v3) = 0i64;
  if( !v6 )
    KeBugCheckEx(0x34u, 0x22Fui64, 0xFFFFFFFFC0000420ui64, 0i64, 0i64);
  CcVacbArraysAllocated = v6 - 1;
  do
  {
    result = &a1[5 * v1 + 4];
    v8 = *result;
    if( *(UINT64 **)(*result + 8) != result || (v9 = (UINT64 **)result[1], *v9 != result) )
      __fastfail(3u);
    ++v1;
    *v9 = (UINT64 *)v8;
    *(_QWORD *)(v8 + 8) = v9;
  }
  while( v1 < 0xCCC );
  CcNumberOfFreeVacbs -= 3276;
  return result;
}

Referenced by:

CcDereferenceVacbArray