PopFxConvertV1Components

PO_FX_COMPONENT_V2 *__stdcall PopFxConvertV1Components(PO_FX_COMPONENT_V1 *ComponentsV1, UINT64 ComponentCount){
  PO_FX_COMPONENT_V2 *v2; 
  UINT64 v3; 
  unsigned int v5; 
  unsigned int v6; 
  ULONG *p_IdleStateCount; 
  ULONG v8; 
  unsigned int v9; 
  ULONGLONG v10; 
  unsigned __int64 v11; 
  unsigned __int64 v12; 
  PO_FX_COMPONENT_V2 *PoolWithTag; 
  PO_FX_COMPONENT_V2 *v14; 
  unsigned int v15; 
  char *v16; 
  ULONG *v17; 
  ULONG *v18; 
  __int128 v19; 
  __int64 v20; 
  __int64 v21; 
  __int64 v22; 
  ULONGLONG pullResult; 
  pullResult = 0i64;
  v2 = 0i64;
  v3 = (unsigned int)ComponentCount;
  if( (_DWORD)ComponentCount )
  {
    v5 = 0;
    v6 = 0;
    if( (_DWORD)v3 )
    {
      p_IdleStateCount = &ComponentsV1->IdleStateCount;
      while( 1 )
      {
        v8 = *p_IdleStateCount;
        if( !*p_IdleStateCount || v8 + v5 < v5 )
          break;
        ++v6;
        p_IdleStateCount += 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 = (PO_FX_COMPONENT_V2 *)ExAllocatePoolWithTag(
                                                  NonPagedPoolNx,
                                                  v10 + (unsigned int)v11,
                                                  0x4D584650ui64);
            v14 = PoolWithTag;
            if( PoolWithTag )
            {
              memset((INT64)PoolWithTag, 0i64);
              v15 = 0;
              v16 = (char *)v14 + v10;
              if( (_DWORD)v3 )
              {
                v17 = &ComponentsV1->IdleStateCount;
                v18 = &v14->IdleStateCount;
                while( 1 )
                {
                  v19 = *((_OWORD *)v17 - 1);
                  *(_QWORD *)(v18 - 3) = 0i64;
                  v20 = 0i64;
                  *(_OWORD *)(v18 - 7) = v19;
                  *v18 = *v17;
                  *(_QWORD *)(v18 + 1) = v16;
                  *(v18 - 1) = v17[1];
                  if( *v17 )
                    break;
LABEL_16:
                  ++v15;
                  v17 += 8;
                  v18 += 14;
                  if( v15 >= (unsigned int)v3 )
                    goto LABEL_17;
                }
                while( v16 - (char *)v14 <= v12 - 24 )
                {
                  v21 = *((_QWORD *)v17 + 1);
                  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 >= *v17 )
                    goto LABEL_16;
                }
              }
              else
              {
LABEL_17:
                v2 = v14;
                v14 = 0i64;
              }
              if( v14 )
                ExFreePoolWithTag(v14, 0x4D584650u);
            }
          }
        }
      }
    }
  }
  return v2;
}

Referenced by:

PoFxRegisterCoreDevice
PoFxRegisterDevice
PoFxRegisterPrimaryDevice