HvlpAffinityToHvProcessorSet

VOID __fastcall HvlpAffinityToHvProcessorSet(_KAFFINITY_EX *Affinity, _HV_GENERIC_SET *HvProcessorSet, UINT64 Size){
  unsigned __int64 v3; 
  unsigned int v5; 
  int v6; 
  __int64 v7; 
  char v8; 
  unsigned __int64 v9; 
  _KAFFINITY_ENUMERATION_CONTEXT Context; 
  UINT64 ProcIndex; 

  v3 = (unsigned int)Size;
  *(_DWORD *)(&Context.CurrentIndex + 1) = 0;
  *(&Context.CurrentIndex + 3) = 0;
  LODWORD(ProcIndex) = 0;
  HvProcessorSet->ValidBanksMask = 0i64;
  if( Affinity )
  {
    HvProcessorSet->Format = 0i64;
    v5 = 0;
    Context.CurrentMask = Affinity->Bitmap[0];
    Context.CurrentIndex = 0;
    Context.Affinity = Affinity;
    while( 1 )
    {
      KeEnumerateNextProcessor(&ProcIndex, &Context);
      if( v6 )
        break;
      v7 = (unsigned __int8)HvlpVirtualProcessorMapping[2 * (unsigned int)ProcIndex];
      v8 = HvlpVirtualProcessorMapping[2 * (unsigned int)ProcIndex + 1];
      if( (unsigned int)v7 >= v5 )
      {
        if( 8 * (unsigned __int64)(unsigned int)(v7 + 1) > v3 )
          return;
        memset(&HvProcessorSet->BankContents[v5], 0i64, 8 * (v7 - v5 + 1));
        v5 = v7 + 1;
      }
      HvProcessorSet->BankContents[v7] |= 1i64 << v8;
    }
    if( v5 == 64 )
      v9 = -1i64;
    else
      v9 = (1i64 << v5) - 1;
    HvProcessorSet->ValidBanksMask = v9;
  }
  else
  {
    HvProcessorSet->Format = 1i64;
  }
}

Referenced by:

HvlMapDeviceInterrupt
HvlRetargetDeviceInterrupt
HvlpFastFlushAddressSpaceTbEx
HvlpFastFlushListTbEx
HvlpFastSendSyntheticClusterIpiEx
HvlpSlowFlushAddressSpaceTbEx
HvlpSlowFlushListTbEx
HvlpSlowSendSyntheticClusterIpiEx