PnpFindRebalanceCandidates

INT64 __fastcall PnpFindRebalanceCandidates(UINT64 a1, INT64 a2, INT64 a3, _DWORD *a4, UINT8 a5, INT64 a6){
  INT64 v8; 
  _DWORD *v9; 
  int v10; 
  int Rebalance; 
  INT64 result; 
  INT64 RebalanceDueToDynamicPartitioning; 
  v8 = a2;
  if( (_DWORD)a1 || !a2 )
  {
    v9 = (_DWORD *)a6;
    LOBYTE(RebalanceDueToDynamicPartitioning) = a5;
    PnpQueryRebalance(
      (_DEVICE_NODE *)IopRootDeviceNode,
      (_PNP_RESOURCE_REQUEST *)a3,
      a4,
      (_DEVICE_NODE **)(a6 + 64 + 8i64 * (unsigned int)a1),
      (_PNP_DEVNODE_QUERY_REBALANCE_VETO_REASON *)(a6 + 80 + 4i64 * (unsigned int)a1),
      RebalanceDueToDynamicPartitioning);
    *(_QWORD *)(a6 + 24) = IopRootDeviceNode;
    *(_BYTE *)(a6 + 32) = 1;
  }
  else
  {
    v9 = (_DWORD *)a6;
    *(_QWORD *)(a6 + 40) = a2;
    v10 = *(_DWORD *)(a2 + 300);
    if( v10 != 776 )
      v8 = *(_QWORD *)(a2 + 16);
    *(_DWORD *)(a6 + 8) = (v10 != 776) + 1;
    if( v8 )
    {
      do
      {
        LOBYTE(RebalanceDueToDynamicPartitioning) = a5;
        Rebalance = PnpQueryRebalance(
                      (_DEVICE_NODE *)v8,
                      (_PNP_RESOURCE_REQUEST *)a3,
                      a4,
                      (_DEVICE_NODE **)(a6 + 64),
                      (_PNP_DEVNODE_QUERY_REBALANCE_VETO_REASON *)(a6 + 80),
                      RebalanceDueToDynamicPartitioning);
        if( Rebalance != 281 )
          break;
        v8 = *(_QWORD *)(v8 + 16);
      }
      while( v8 );
      if( v8 )
      {
        *(_BYTE *)(a6 + 32) = Rebalance >= 0;
        *(_QWORD *)(a6 + 24) = v8;
      }
    }
  }
  result = (unsigned int)*a4;
  *v9 = result;
  return result;
}

Referenced by:

PnpRebalance