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