KeGenericProcessorCallback

void __fastcall KeGenericProcessorCallback(
        __int64 *a1,
        void (__fastcall *a2)(struct _KPRCB *, __int64),
        __int64 a3,
        int a4){
  _ETHREAD *CurrentThread; 
  _GROUP_AFFINITY *p_PreviousAffinity; 
  struct _KPRCB *CurrentPrcb; 
  KPRIORITY v10; 
  UINT16 *v11; 
  __int64 v12; 
  UINT8 CurrentIrql; 
  INT64 v14; 
  __int64 v15; 
  _GROUP_AFFINITY Affinity; 
  UINT16 *v17[2]; 
  __int16 v18; 
  int v19; 
  __int16 v20; 
  _GROUP_AFFINITY PreviousAffinity; 
  __int64 v22[22]; 

  v15 = a3;
  Affinity = 0i64;
  memset(v22, 0i64, 0xA8u);
  v19 = 0;
  v20 = 0;
  LODWORD(v14) = 0;
  PreviousAffinity = 0i64;
  if( !a1 )
  {
    LODWORD(v22[0]) = 1310721;
    a1 = v22;
    memset((char *)v22 + 4, 0i64, 0xA4u);
    v22[1] |= 1ui64;
  }
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  p_PreviousAffinity = &PreviousAffinity;
  CurrentPrcb = 0i64;
  *(_DWORD *)Affinity.Reserved = 0;
  v10 = 0;
  Affinity.Reserved[2] = 0;
  if( a4 )
  {
    if( (a4 & 2) != 0 )
      v10 = KeSetPriorityThread(&CurrentThread->Tcb, 30);
    else
      KeSetPriorityBoost(&CurrentThread->Tcb, 15i64);
  }
  v11 = (UINT16 *)a1[1];
  v17[0] = (UINT16 *)a1;
  v12 = v15;
  v17[1] = v11;
  v18 = 0;
  while( !KiEnumerateNextProcessorNumber((INT64)&v14, v17) )
  {
    Affinity.Group = v14;
    Affinity.Mask = 1i64 << SBYTE2(v14);
    KeSetSystemGroupAffinityThread(&Affinity, p_PreviousAffinity);
    CurrentPrcb = KeGetCurrentPrcb();
    a2(CurrentPrcb, v12);
    p_PreviousAffinity = 0i64;
  }
  CurrentIrql = KeGetCurrentIrql();
  __writecr8(2ui64);
  CurrentPrcb->DpcRoutineActive = 1;
  if( a4 )
  {
    if( (a4 & 2) != 0 )
      KeSetPriorityThread(&CurrentThread->Tcb, v10);
    else
      KiRemoveBoostThread(CurrentPrcb, CurrentThread);
  }
  KeRevertToUserGroupAffinityThread(&PreviousAffinity);
  CurrentPrcb->DpcRoutineActive = 0;
  KiCheckForThreadDispatch(CurrentPrcb, CurrentIrql);
}

Referenced by:

ExpUpdateTimerConfiguration
KeDisableTimer2
KeFlushQueuedDpcs
KeGenericCallDpc
KeRemoveQueueDpcEx
KeSetIntervalProfile
PspSetVmProcessorHostProcessWorkerRoutine
RtlUpdateSwapReference