CmpBuildVirtualReplicationStack
INT64 __fastcall CmpBuildVirtualReplicationStack(INT64 a1, INT64 a2, _DWORD *a3, _QWORD *a4){
int v5;
INT64 v7;
_DWORD *PoolWithTag;
_DWORD *v10;
INT64 result;
__int64 v12;
_WORD *v13;
__int16 v14;
_WORD *v15;
__int16 v16;
__int64 v17;
__int16 v18;
v5 = (*(_DWORD *)(a1 + 8) >> 21) & 0x3FF;
*a4 = 0i64;
v7 = a1;
PoolWithTag = ExAllocatePoolWithTag(PagedPool, (unsigned int)(48 * v5), 0x20204D43ui64);
v10 = PoolWithTag;
if( !PoolWithTag )
return 3221225626i64;
memset((INT64)PoolWithTag, 0i64);
LODWORD(v12) = 4;
v13 = *(_WORD **)(a2 + 8);
v14 = *(_OWORD *)a2;
while( 1 )
{
if( *v13 == 92 )
{
LODWORD(v12) = v12 - 1;
if( !(_DWORD)v12 )
break;
}
v14 -= 2;
if( !v14 )
{
LABEL_21:
ExFreePoolWithTag(v10, 0);
return 3221225485i64;
}
++v13;
}
v15 = v13 + 1;
v16 = v14 - 2;
while( v16 )
{
v17 = 6i64 * (unsigned int)v12;
*(_QWORD *)&v10[12 * (unsigned int)v12 + 2] = v15;
do
{
if( *v15 == 92 )
break;
LOWORD(v10[12 * (unsigned int)v12]) += 2;
++v15;
v16 -= 2;
}
while( v16 );
v18 = v10[12 * (unsigned int)v12];
LODWORD(v12) = v12 + 1;
HIWORD(v10[2 * v17]) = v18;
if( !v16 )
break;
do
{
if( *v15 != 92 )
break;
++v15;
v16 -= 2;
}
while( v16 );
}
*a3 = v12;
while( (unsigned int)v12 > 1 )
{
if( !v7 )
goto LABEL_21;
v12 = (unsigned int)(v12 - 1);
v10[12 * v12 + 10] = *(_DWORD *)(v7 + 40) >> 31;
v7 = *(_QWORD *)(v7 + 72);
}
v10[10] = 0;
result = 0i64;
*a4 = v10;
return result;
}Referenced by:
CmpReplicateKeyToVirtual