CcSetVacbLargeOffset

UINT8 __stdcall CcSetVacbLargeOffset(
        _SHARED_CACHE_MAP *SharedCacheMap,
        INT64 FileOffset,
        _VACB *Vacb,
        VACB_LEVEL_ALLOCATION_LIST *VacbLevels){
  int v6; 
  VACB_LEVEL_ALLOCATION_LIST *p_VacbLevelsa; 
  __int64 v8; 
  _VACB **v9; 
  unsigned int v10; 
  __int64 v11; 
  int v12; 
  unsigned int v13; 
  INT64 v14; 
  __int64 v15; 
  _VACB **VacbLevel; 
  char v17; 
  int v18; 
  _VACB_LEVEL_REFERENCE *v19; 
  VACB_LEVEL_ALLOCATION_LIST *v20; 
  _VACB_LEVEL_REFERENCE *v22; 
  _VACB **v23; 
  _SHARED_CACHE_MAP *v24; 
  UINT64 v25; 
  unsigned int v26; 
  UINT64 v27; 
  int v28; 
  unsigned int v29; 
  _VACB_LEVEL_REFERENCE *v30; 
  _LIST_ENTRY *BcbListHeadLargeOffset; 
  _LIST_ENTRY *i; 
  _LIST_ENTRY *Blink; 
  _VACB **v34; 
  __int64 v35; 
  _VACB **v36; 
  _VACB **v37; 
  _VACB *v38; 
  _VACB *v39; 
  int v40; 
  unsigned int Level; 
  VACB_LEVEL_ALLOCATION_LIST *v42; 
  INT64 v43; 
  VACB_LEVEL_ALLOCATION_LIST VacbLevelsa; 
  INT64 FileOffseta; 
  __int64 v46; 
  __int128 v47[3]; 
  __int64 v48; 
  int v49[8]; 

  v42 = VacbLevels;
  v43 = FileOffset;
  v48 = 0i64;
  v6 = 25;
  FileOffseta = FileOffset;
  p_VacbLevelsa = VacbLevels;
  LODWORD(v8) = 0;
  v9 = (_VACB **)*((_QWORD *)SharedCacheMap + 11);
  v10 = 0;
  v11 = *((_QWORD *)SharedCacheMap + 4);
  memset(v47, 0, sizeof(v47));
  memset(&VacbLevelsa, 0, sizeof(VacbLevelsa));
  do
  {
    v12 = v6;
    v40 = v6;
    v6 += 7;
    ++v10;
  }
  while( v11 > 1i64 << v6 );
  do
  {
    Level = v10;
    v13 = v10;
    v14 = FileOffset >> v12;
    --v10;
    if( (unsigned int)v8 >= 7 )
      return 0;
    v15 = (unsigned int)v8;
    LODWORD(v8) = v8 + 1;
    v49[v15] = v14;
    *((_QWORD *)v47 + v15) = v9;
    v46 = (unsigned int)v14;
    VacbLevel = (_VACB **)v9[(unsigned int)v14];
    if( !VacbLevel )
    {
      v28 = *((_DWORD *)SharedCacheMap + 38) & 0x200;
      if( !v28 || (v29 = 1, v10) )
        v29 = 0;
      if( !p_VacbLevelsa )
      {
        VacbLevelsa.VacbLevelWithBcbListHeads = 0i64;
        VacbLevelsa.VacbLevelList.Blink = (_LIST_ENTRY *)&VacbLevelsa;
        VacbLevelsa.VacbLevelsAllocated = 0;
        VacbLevelsa.VacbLevelList.Flink = (_LIST_ENTRY *)&VacbLevelsa;
        LOBYTE(v14) = v28 != 0;
        if( !(unsigned __int8)CcAllocateVacbLevels(v13, v14, &VacbLevelsa) )
          return 0;
        p_VacbLevelsa = &VacbLevelsa;
        v42 = &VacbLevelsa;
      }
      VacbLevel = CcAllocateVacbLevel(p_VacbLevelsa, v29);
      if( v29 )
      {
        BcbListHeadLargeOffset = CcGetBcbListHeadLargeOffset(SharedCacheMap, FileOffseta, 0);
        for( i = BcbListHeadLargeOffset->Blink; LOWORD(i[-1].Flink) == 765; i = i->Blink )
          BcbListHeadLargeOffset = i;
        Blink = BcbListHeadLargeOffset->Blink;
        v34 = VacbLevel + 128;
        BcbListHeadLargeOffset->Blink = (_LIST_ENTRY *)(VacbLevel + 128);
        v35 = 63i64;
        VacbLevel[128] = (_VACB *)BcbListHeadLargeOffset;
        do
        {
          v36 = v34 + 2;
          v37 = v34;
          v34[1] = (_VACB *)(v34 + 2);
          v34 = v36;
          *v36 = (_VACB *)v37;
          --v35;
        }
        while( v35 );
        v36[1] = (_VACB *)Blink;
        Blink->Flink = (_LIST_ENTRY *)v36;
      }
      v9[v46] = (_VACB *)VacbLevel;
      v30 = VacbLevelReference(SharedCacheMap, v9, Level);
      v12 = v40;
      p_VacbLevelsa = v42;
      ++v30->Reference;
    }
    v17 = v12;
    v12 -= 7;
    v9 = VacbLevel;
    v40 = v12;
    FileOffset = ((1i64 << v17) - 1) & v43;
    v43 = FileOffset;
  }
  while( v10 );
  if( (unsigned __int64)Vacb >= 0xFFFFFFFFFFFFFFFEui64 )
  {
    v18 = 1;
    if( Vacb == (_VACB *)-2i64 )
      Vacb = 0i64;
  }
  else
  {
    v18 = 0;
    VacbLevel[(unsigned int)(FileOffset >> v12)] = Vacb;
  }
  if( Vacb )
  {
    v19 = VacbLevelReference(SharedCacheMap, VacbLevel, 0i64);
    if( v18 )
      ++v19->SpecialReference;
    else
      ++v19->Reference;
  }
  else
  {
    while( 1 )
    {
      v22 = VacbLevelReference(SharedCacheMap, v9, v10);
      if( v18 )
        --v22->SpecialReference;
      else
        --v22->Reference;
      v18 = (int)Vacb;
      if( *(_QWORD *)VacbLevelReference(v24, v23, v25) || !(_DWORD)v8 )
        break;
      v26 = v10;
      v8 = (unsigned int)(v8 - 1);
      ++v10;
      v27 = (unsigned int)Vacb;
      if( !v26 && (*((_DWORD *)SharedCacheMap + 38) & 0x200) != 0 )
      {
        v38 = v9[128];
        v27 = 1i64;
        v39 = v9[255];
        v38->SharedCacheMap = (_SHARED_CACHE_MAP *)v39;
        v39->BaseAddress = v38;
      }
      CcDeallocateVacbLevel(v9, v27);
      v9 = (_VACB **)*((_QWORD *)v47 + v8);
      v9[v49[v8]] = Vacb;
    }
    v20 = v42;
  }
  if( v20 == &VacbLevelsa )
    CcFreeUnusedVacbLevels(v20);
  return 1;
}

Referenced by:

CcAdjustVacbLevelLockCount
CcUnmapVacbArray
SetVacb