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