FsRtlSplitBaseMcb
INT8 __fastcall FsRtlSplitBaseMcb(INT64 a1, UINT64 a2, INT64 a3){
int v3;
int v4;
int v5;
char v7;
__int64 v8;
__int64 v9;
int v10;
__int64 v11;
int v12;
int v13;
int v14;
char v15;
char v16;
__int64 v18;
__int64 v19;
int v20;
__int64 v21;
_BYTE *WhereToAddIndex;
v3 = a3;
v4 = 0;
LODWORD(WhereToAddIndex) = 0;
v5 = a2;
FsRtlFindLargeIndex((_BASE_MCB *)a1, a2, (UINT64 *)&WhereToAddIndex);
if( v7 )
{
v8 = (unsigned int)WhereToAddIndex;
v9 = *(_QWORD *)(a1 + 16);
if( *(_DWORD *)(v9 + 8i64 * (unsigned int)WhereToAddIndex + 4) == -1 )
{
LABEL_29:
while( (unsigned int)v8 < *(_DWORD *)(a1 + 4) )
{
*(_DWORD *)(*(_QWORD *)(a1 + 16) + 8i64 * (unsigned int)v8) += v3;
LABEL_28:
LODWORD(v8) = v8 + 1;
}
LOBYTE(v4) = 1;
return v4;
}
if( (_DWORD)WhereToAddIndex )
v10 = *(_DWORD *)(v9 + 8i64 * (unsigned int)((_DWORD)WhereToAddIndex - 1));
else
v10 = 0;
if( v10 == v5 )
{
if( !(_DWORD)WhereToAddIndex )
goto LABEL_15;
v11 = (unsigned int)((_DWORD)WhereToAddIndex - 1);
v12 = *(_DWORD *)(v9 + 8 * v11 + 4);
if( v12 == -1
|| ((_DWORD)WhereToAddIndex != 1 ? (v13 = *(_DWORD *)(v9 + 8i64 * (unsigned int)((_DWORD)WhereToAddIndex - 2))) : (v13 = 0),
!(v12 + *(_DWORD *)(v9 + 8 * v11) - v13)) )
{
LODWORD(v8) = (_DWORD)WhereToAddIndex - 1;
goto LABEL_29;
}
}
if( (_DWORD)WhereToAddIndex )
{
v14 = *(_DWORD *)(v9 + 8i64 * (unsigned int)((_DWORD)WhereToAddIndex - 1));
LABEL_17:
if( v14 == v5 )
{
FsRtlAddEntry((_BASE_MCB *)a1, (_BYTE *)(unsigned int)WhereToAddIndex, 1ui64);
if( v15 )
{
*(_DWORD *)(*(_QWORD *)(a1 + 16) + 8 * v8 + 4) = -1;
*(_DWORD *)(*(_QWORD *)(a1 + 16) + 8 * v8) = v3 + v5;
goto LABEL_28;
}
}
else
{
FsRtlAddEntry((_BASE_MCB *)a1, (_BYTE *)(unsigned int)WhereToAddIndex, 2ui64);
if( v16 )
{
v18 = (unsigned int)(v8 + 1);
v19 = (unsigned int)(v8 + 2);
v20 = 0;
*(_DWORD *)(*(_QWORD *)(a1 + 16) + 8 * v8 + 4) = *(_DWORD *)(*(_QWORD *)(a1 + 16) + 8 * v19 + 4);
*(_DWORD *)(*(_QWORD *)(a1 + 16) + 8 * v8) = v5;
*(_DWORD *)(*(_QWORD *)(a1 + 16) + 8 * v18 + 4) = -1;
*(_DWORD *)(*(_QWORD *)(a1 + 16) + 8 * v18) = v3 + v5;
v21 = *(_QWORD *)(a1 + 16);
if( (_DWORD)v8 != -1 )
v20 = *(_DWORD *)(v21 + 8 * v8);
if( (_DWORD)v8 )
v4 = *(_DWORD *)(v21 + 8i64 * (unsigned int)(v8 - 1));
LODWORD(v8) = v8 + 2;
*(_DWORD *)(v21 + 8 * v19 + 4) += v20 - v4;
goto LABEL_29;
}
}
return 0;
}
LABEL_15:
v14 = 0;
goto LABEL_17;
}
return v4;
}Referenced by:
FsRtlSplitLargeMcb