CcSetVacbLargeOffset
CHAR __fastcall CcSetVacbLargeOffset(INT64 a1, INT64 a2, UINT64 a3, VACB_LEVEL_ALLOCATION_LIST *a4){
int v6;
VACB_LEVEL_ALLOCATION_LIST *v7;
__int64 v8;
_QWORD *v9;
unsigned int v10;
__int64 v11;
int v12;
unsigned int v13;
INT64 v14;
__int64 v15;
_QWORD *VacbLevel;
char v17;
int v18;
_DWORD *v19;
_BYTE *v20;
VACB_LEVEL_ALLOCATION_LIST *v21;
_DWORD *v23;
INT64 v24;
INT64 v25;
INT64 v26;
unsigned int v27;
INT64 v28;
int v29;
int v30;
_DWORD *v31;
INT64 BcbListHeadLargeOffset;
INT64 i;
_QWORD *v34;
_QWORD *v35;
__int64 v36;
_QWORD *v37;
_QWORD *v38;
__int64 v39;
_QWORD *v40;
int v41;
unsigned int v42;
VACB_LEVEL_ALLOCATION_LIST *v43;
INT64 v44;
__int128 v45;
__int128 v46;
INT64 v47;
__int64 v48;
__int128 v49[3];
__int64 v50;
int v51[8];
v43 = a4;
v44 = a2;
v50 = 0i64;
v6 = 25;
v47 = a2;
v7 = a4;
LODWORD(v8) = 0;
v9 = *(_QWORD **)(a1 + 88);
v10 = 0;
v11 = *(_QWORD *)(a1 + 32);
memset(v49, 0, sizeof(v49));
v45 = 0i64;
v46 = 0i64;
do
{
v12 = v6;
v41 = v6;
v6 += 7;
++v10;
}
while( v11 > 1i64 << v6 );
do
{
v42 = v10;
v13 = v10;
v14 = a2 >> v12;
--v10;
if( (unsigned int)v8 >= 7 )
return 0;
v15 = (unsigned int)v8;
LODWORD(v8) = v8 + 1;
v51[v15] = v14;
*((_QWORD *)v49 + v15) = v9;
v48 = (unsigned int)v14;
VacbLevel = (_QWORD *)v9[(unsigned int)v14];
if( !VacbLevel )
{
v29 = *(_DWORD *)(a1 + 152) & 0x200;
if( !v29 || (v30 = 1, v10) )
v30 = 0;
if( !v7 )
{
*(_QWORD *)&v46 = 0i64;
*((_QWORD *)&v45 + 1) = &v45;
DWORD2(v46) = 0;
*(_QWORD *)&v45 = &v45;
LOBYTE(v14) = v29 != 0;
if( !(unsigned __int8)CcAllocateVacbLevels(v13, v14, &v45) )
return 0;
v7 = (VACB_LEVEL_ALLOCATION_LIST *)&v45;
v43 = (VACB_LEVEL_ALLOCATION_LIST *)&v45;
}
VacbLevel = CcAllocateVacbLevel((__int64)v7, v30);
if( v30 )
{
BcbListHeadLargeOffset = CcGetBcbListHeadLargeOffset(a1, v47, 0);
for( i = *(_QWORD *)(BcbListHeadLargeOffset + 8); *(_WORD *)(i - 16) == 765; i = *(_QWORD *)(i + 8) )
BcbListHeadLargeOffset = i;
v34 = *(_QWORD **)(BcbListHeadLargeOffset + 8);
v35 = VacbLevel + 128;
*(_QWORD *)(BcbListHeadLargeOffset + 8) = VacbLevel + 128;
v36 = 63i64;
VacbLevel[128] = BcbListHeadLargeOffset;
do
{
v37 = v35 + 2;
v38 = v35;
v35[1] = v35 + 2;
v35 = v37;
*v37 = v38;
--v36;
}
while( v36 );
v37[1] = v34;
*v34 = v37;
}
v9[v48] = VacbLevel;
v31 = (_DWORD *)VacbLevelReference(a1, (INT64)v9, v42);
v12 = v41;
v7 = v43;
++*v31;
}
v17 = v12;
v12 -= 7;
v9 = VacbLevel;
v41 = v12;
a2 = ((1i64 << v17) - 1) & v44;
v44 = a2;
}
while( v10 );
if( a3 >= 0xFFFFFFFFFFFFFFFEui64 )
{
v18 = 1;
if( a3 == -2i64 )
a3 = 0i64;
}
else
{
v18 = 0;
VacbLevel[(unsigned int)(a2 >> v12)] = a3;
}
if( a3 )
{
v19 = (_DWORD *)VacbLevelReference(a1, (INT64)VacbLevel, 0i64);
if( v18 )
++v19[1];
else
++*v19;
}
else
{
while( 1 )
{
v23 = (_DWORD *)VacbLevelReference(a1, (INT64)v9, v10);
if( v18 )
--v23[1];
else
--*v23;
v18 = a3;
if( *(_QWORD *)VacbLevelReference(v25, v24, v26) || !(_DWORD)v8 )
break;
v27 = v10;
v8 = (unsigned int)(v8 - 1);
++v10;
v28 = (unsigned int)a3;
if( !v27 && (*(_DWORD *)(a1 + 152) & 0x200) != 0 )
{
v39 = v9[128];
v28 = 1i64;
v40 = (_QWORD *)v9[255];
*(_QWORD *)(v39 + 8) = v40;
*v40 = v39;
}
CcDeallocateVacbLevel(v9, v28);
v9 = (_QWORD *)*((_QWORD *)v49 + v8);
v9[v51[v8]] = a3;
}
v21 = v43;
}
if( v21 == (VACB_LEVEL_ALLOCATION_LIST *)&v45 )
CcFreeUnusedVacbLevels(v21, v20);
return 1;
}Referenced by:
CcAdjustVacbLevelLockCount
CcUnmapVacbArray
SetVacb