PopFxConvertV1Components

VOID **__fastcall PopFxConvertV1Components(__int64 a1, unsigned int a2){
  VOID **v2; 
  ULONGLONG v3; 
  unsigned int v5; 
  unsigned int v6; 
  int *v7; 
  int v8; 
  unsigned int v9; 
  UINT64 v10; 
  unsigned __int64 v11; 
  unsigned __int64 v12; 
  VOID **PoolWithTag; 
  VOID **v14; 
  unsigned int v15; 
  char *v16; 
  __int64 v17; 
  char *v18; 
  __int128 v19; 
  __int64 v20; 
  __int64 v21; 
  __int64 v22; 
  UINT64 pullResult; 

  pullResult = 0i64;
  v2 = 0i64;
  v3 = a2;
  if( a2 )
  {
    v5 = 0;
    v6 = 0;
    if( (_DWORD)v3 )
    {
      v7 = (int *)(a1 + 16);
      while( 1 )
      {
        v8 = *v7;
        if( !*v7 || v8 + v5 < v5 )
          break;
        ++v6;
        v7 += 8;
        v5 += v8;
        if( v6 >= (unsigned int)v3 )
          goto LABEL_7;
      }
    }
    else
    {
LABEL_7:
      if( RtlULongLongMult(v3, 0x38ui64, &pullResult) >= 0 )
      {
        v10 = (pullResult + 7) & 0xFFFFFFFFFFFFFFF8ui64;
        v11 = 24i64 * v9;
        if( v11 <= 0xFFFFFFFF )
        {
          v12 = v10 + (unsigned int)v11;
          if( v12 >= (unsigned int)v11 )
          {
            PoolWithTag = ExAllocatePoolWithTag(0x200ui64, v10 + (unsigned int)v11, 1297630800i64);
            v14 = PoolWithTag;
            if( PoolWithTag )
            {
              memset(PoolWithTag, 0i64, v12);
              v15 = 0;
              v16 = (char *)v14 + v10;
              if( (_DWORD)v3 )
              {
                v17 = a1 + 16;
                v18 = (char *)v14 + 28;
                while( 1 )
                {
                  v19 = *(_OWORD *)(v17 - 16);
                  *(_QWORD *)(v18 - 12) = 0i64;
                  v20 = 0i64;
                  *(_OWORD *)(v18 - 28) = v19;
                  *(_DWORD *)v18 = *(_DWORD *)v17;
                  *(_QWORD *)(v18 + 4) = v16;
                  *((_DWORD *)v18 - 1) = *(_DWORD *)(v17 + 4);
                  if( *(_DWORD *)v17 )
                    break;
LABEL_16:
                  ++v15;
                  v17 += 32i64;
                  v18 += 56;
                  if( v15 >= (unsigned int)v3 )
                    goto LABEL_17;
                }
                while( v16 - (char *)v14 <= v12 - 24 )
                {
                  v21 = *(_QWORD *)(v17 + 8);
                  v22 = 3 * v20;
                  v20 = (unsigned int)(v20 + 1);
                  *((_DWORD *)v16 + 4) = *(_DWORD *)(v21 + 8 * v22 + 16);
                  *(_QWORD *)v16 = *(_QWORD *)(v21 + 8 * v22);
                  *((_QWORD *)v16 + 1) = *(_QWORD *)(v21 + 8 * v22 + 8);
                  v16 += 24;
                  if( (unsigned int)v20 >= *(_DWORD *)v17 )
                    goto LABEL_16;
                }
              }
              else
              {
LABEL_17:
                v2 = v14;
                v14 = 0i64;
              }
              if( v14 )
                ExFreePoolWithTag(v14, 0x4D584650u);
            }
          }
        }
      }
    }
  }
  return v2;
}

Referenced by:

PoFxRegisterCoreDevice
PoFxRegisterDevice
PoFxRegisterPrimaryDevice