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