KiUpdateThreadCpuSetAffinitiesFromDpcLevel

void __fastcall KiUpdateThreadCpuSetAffinitiesFromDpcLevel(__int64 a1, __int64 a2){
  unsigned int v4; 
  _KPRCB *updated; 
  unsigned int v6; 
  _KPRCB *v7; 
  UINT64 v8; 
  UINT64 SpinCount; 
  LODWORD(SpinCount) = 0;
  while( _interlockedbittestandset64((volatile signed __int32 *)(a1 + 64), 0i64) )
  {
    do
      KeYieldProcessorEx(&SpinCount);
    while( *(_QWORD *)(a1 + 64) );
  }
  v4 = *(_DWORD *)(a1 + 588);
  updated = KiUpdateThreadCpuSets((_KTHREAD *)a1, (_SINGLE_LIST_ENTRY *)a2);
  v6 = *(_DWORD *)(a1 + 588);
  v7 = updated;
  KiReleaseThreadLockSafe(a1);
  if( (*(_DWORD *)(&PerfGlobalGroupMask + 2) & 0x8000000) != 0 )
    EtwTraceIdealProcessor(a1, 0x546u, v4, v6);
  if( v7 )
  {
    v8 = *((unsigned int *)v7 + 9);
    if( *((_DWORD *)KeGetPcr() + 105) != (_DWORD)v8 )
      KiSendSoftwareInterrupt(v8, 2u);
  }
}

Referenced by:

KeUpdateThreadCpuSets
KiUpdateThreadCpuSetAffinitiesProcess