CcCreateVacbArray

NTSTATUS __stdcall CcCreateVacbArray(_SHARED_CACHE_MAP *SharedCacheMap, _LARGE_INTEGER NewSectionSize){
  int v2; 
  int v3; 
  __int64 v6; 
  __int64 v7; 
  _VACB **InitialVacbs; 
  NTSTATUS result; 
  unsigned int v10; 
  int v11; 
  _LIST_ENTRY *v12; 
  _LIST_ENTRY *v13; 
  _LIST_ENTRY *p_BcbList; 
  _LIST_ENTRY *i; 
  _LIST_ENTRY *v16; 
  v2 = 0;
  v3 = 0;
  if( NewSectionSize.HighPart )
  {
    LODWORD(v6) = -1;
  }
  else if( NewSectionSize.LowPart > 0x100000 )
  {
    LODWORD(v6) = 8 * (NewSectionSize.LowPart >> 18);
  }
  else
  {
    LODWORD(v6) = NewSectionSize.HighPart + 32;
  }
  v7 = (unsigned int)v6;
  if( NewSectionSize.HighPart < 0 )
    return -1073741760;
  if( (_DWORD)v6 == 32 )
  {
    InitialVacbs = SharedCacheMap->InitialVacbs;
  }
  else
  {
    if( (unsigned int)v6 > 0x400 )
    {
      v10 = 0;
      v7 = 1024i64;
      LODWORD(v6) = 1032;
      v11 = 25;
      v3 = 1;
      do
      {
        v11 += 7;
        ++v10;
      }
      while( NewSectionSize.QuadPart > 1i64 << v11 );
      if( v10 >= CcMaxVacbLevelsSeen )
        CcMaxVacbLevelsSeen = v10 + 1;
    }
    else
    {
      if( (SharedCacheMap->Flags & 0x200) != 0 && NewSectionSize.QuadPart > 0x200000 )
      {
        v2 = 1;
        LODWORD(v6) = ((v6 + 15) & 0xFFFFFFF0) + v6;
      }
      if( (_DWORD)v7 == 1024 )
      {
        LODWORD(v6) = v6 + 8;
        v3 = 1;
      }
    }
    InitialVacbs = (_VACB **)ExAllocatePoolWithTag(NonPagedPoolNx, (unsigned int)v6, 0x70566343ui64);
    if( !InitialVacbs )
    {
      result = -1073741670;
      SharedCacheMap->Status = -1073741670;
      return result;
    }
  }
  memset((INT64)InitialVacbs, 0i64);
  if( v3 )
  {
    v6 = (unsigned int)(v6 - 8);
    *(_VACB **)((char *)InitialVacbs + v6) = 0i64;
  }
  if( v2 )
  {
    v12 = (_LIST_ENTRY *)((char *)InitialVacbs + v7);
    v13 = (_LIST_ENTRY *)((char *)InitialVacbs + (unsigned int)v6);
    if( (char *)InitialVacbs + v7 < (char *)v13 )
    {
      p_BcbList = &SharedCacheMap->BcbList;
      for( i = SharedCacheMap->BcbList.Flink; ; i = v16 )
      {
        v16 = v12;
        if( i->Blink != p_BcbList )
          __fastfail(3u);
        v12->Flink = i;
        v12->Blink = p_BcbList;
        i->Blink = v12;
        p_BcbList->Flink = v12++;
        if( v12 >= v13 )
          break;
      }
    }
  }
  SharedCacheMap->Vacbs = InitialVacbs;
  result = 0;
  SharedCacheMap->SectionSize = NewSectionSize;
  return result;
}

Referenced by:

CcInitializeCacheMapEx