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