KeRevertToUserGroupAffinityThread
VOID *__stdcall KeRevertToUserGroupAffinityThread(PGROUP_AFFINITY PreviousAffinity){
PGROUP_AFFINITY p_UserAffinity;
_ETHREAD *CurrentThread;
VOID *result;
UINT8 CurrentIrql;
_KPRCB *CurrentPrcb;
int IdealProcessor;
UINT64 UserIdealProcessor;
int v8;
int Group;
bool v10;
UINT64 SpinCount;
_SINGLE_LIST_ENTRY ReadyList;
p_UserAffinity = PreviousAffinity;
ReadyList.Next = 0i64;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
result = (VOID *)(unsigned int)CurrentThread->Tcb._bf_0;
if( ((unsigned __int8)result & 8) != 0
&& !(PreviousAffinity->Reserved[0] | (unsigned __int16)(PreviousAffinity->Reserved[1] | PreviousAffinity->Reserved[2])) )
{
if( !PreviousAffinity->Mask
|| (result = (VOID *)KeActiveProcessors.Count,
Group = PreviousAffinity->Group,
(unsigned __int16)Group < KeActiveProcessors.Count)
&& (result = (VOID *)KeActiveProcessors.Bitmap[Group],
v10 = ((unsigned __int64)result & p_UserAffinity->Mask) == 0,
p_UserAffinity->Mask &= (unsigned __int64)result,
!v10) )
{
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
CurrentPrcb = KeGetCurrentPrcb();
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&CurrentThread->Tcb.ThreadLock, 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( CurrentThread->Tcb.ThreadLock );
}
IdealProcessor = CurrentThread->Tcb.IdealProcessor;
if( p_UserAffinity->Mask )
{
UserIdealProcessor = 1280i64;
}
else
{
UserIdealProcessor = CurrentThread->Tcb.UserIdealProcessor;
p_UserAffinity = &CurrentThread->Tcb.UserAffinity;
CurrentThread->Tcb._bf_0 &= ~8u;
}
KiSetSystemAffinityThread(CurrentPrcb, p_UserAffinity, UserIdealProcessor, &ReadyList);
v8 = CurrentThread->Tcb.IdealProcessor;
KiReleaseThreadLockSafe((INT64)CurrentThread);
if( (xmmword_140CFB490 & 0x8000000) != 0 )
EtwTraceIdealProcessor((__int64)CurrentThread, 0x546u, IdealProcessor, v8);
KiProcessDeferredReadyList(CurrentPrcb, &ReadyList, CurrentIrql);
}
}
return result;
}Referenced by:
CmInitializeProcessor
CmpInitializeMachineDependentConfiguration
EmonMarkCountersReserved
EmonReleaseReservedCounters
ExAllocateCacheAwarePushLock
ExpSaPageGroupDescriptorAllocate
ExpWorkerThread
HalGetEnvironmentVariableEx
HalQueryEnvironmentVariableInfoEx
HalSetEnvironmentVariableEx
HalpAllocatePmcCounterSet
HalpCmcWorkerRoutine
HalpCmciInit
HalpCreateMachineCheckErrorRecord
HalpEnumerateEnvironmentVariablesWithFilter
HalpFreePmcCounterSet
HalpHandlePreviousMcaErrors
HalpLoadMicrocode
HalpMceInit
HalpQueryCapsuleCapabilities
HalpTimerStallExecutionProcessor
HalpUpdateCapsule
IopLiveDumpUncorralProcessors
IopPassiveInterruptWorker
KeGenericProcessorCallback
KeMaskInterrupt
KeRevertToUserAffinityThread
KeRevertToUserAffinityThreadEx
KeStallExecutionProcessor
KiAttemptBugcheckRecovery
KiComputeNumaCosts
KiConnectInterrupt
KiDeregisterNmiSxCallback
KiDisconnectInterruptCommon
KiDynamicProcessorInitialization
KiInitMachineDependent
KiInterruptDispatchCommon
MakeGdtReadOnly
MiCombineAllPhysicalMemory
MiSetIdealProcessorThread
MiTimeSingleLargePageZero
PnpCallAddDevice
PnpSendIrp
PpmClearSimulatedIdle
PpmIdleInitializeConcurrency
PpmInstallFeedbackCounters
PpmSetSimulatedIdle
ViIsBTSSupported
ViSetupBTSPerProcNoEnable