KeSetSystemGroupAffinityThread
VOID *__stdcall KeSetSystemGroupAffinityThread(PGROUP_AFFINITY Affinity, PGROUP_AFFINITY PreviousAffinity){
__int64 Group;
char v5;
UINT8 CurrentIrql;
struct _KPRCB *CurrentPrcb;
INT64 CurrentThread;
int v9;
int v10;
int v11;
VOID *result;
_GROUP_AFFINITY v13;
UINT64 SpinCount;
_SINGLE_LIST_ENTRY ReadyList;
Group = Affinity->Group;
ReadyList.Next = 0i64;
v13 = 0i64;
if( (unsigned __int16)Group >= KeActiveProcessors.Count
|| (KeActiveProcessors.Bitmap[Group] & Affinity->Mask) == 0
|| Affinity->Reserved[0] | (unsigned __int16)(Affinity->Reserved[1] | Affinity->Reserved[2]) )
{
v5 = 0;
}
else
{
v5 = 1;
Affinity->Mask &= KeActiveProcessors.Bitmap[Affinity->Group];
}
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
CurrentPrcb = KeGetCurrentPrcb();
LODWORD(SpinCount) = 0;
CurrentThread = (INT64)CurrentPrcb->CurrentThread;
while( _interlockedbittestandset64((volatile signed __int32 *)(CurrentThread + 64), 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *(_QWORD *)(CurrentThread + 64) );
}
v9 = *(_DWORD *)(CurrentThread + 116);
v10 = *(_DWORD *)(CurrentThread + 588);
if( (v9 & 8) != 0 )
{
v13.Group = *(_WORD *)(CurrentThread + 584);
v13.Mask = *(_QWORD *)(CurrentThread + 576);
}
else
{
*(_DWORD *)(CurrentThread + 116) = v9 | 8;
}
if( v5 )
KiSetSystemAffinityThread(CurrentPrcb, Affinity, 0x500ui64, &ReadyList);
v11 = *(_DWORD *)(CurrentThread + 588);
KiReleaseThreadLockSafe(CurrentThread);
if( (xmmword_140CFB490 & 0x8000000) != 0 )
EtwTraceIdealProcessor(CurrentThread, 0x546u, v10, v11);
KiProcessDeferredReadyList(CurrentPrcb, &ReadyList, CurrentIrql);
if( PreviousAffinity )
*PreviousAffinity = v13;
return result;
}Referenced by:
CmInitializeProcessor
CmpInitializeMachineDependentConfiguration
EmonMarkCountersReserved
EmonReleaseReservedCounters
ExAllocateCacheAwarePushLock
ExpSaPageGroupDescriptorAllocate
HalGetEnvironmentVariableEx
HalQueryEnvironmentVariableInfoEx
HalSetEnvironmentVariableEx
HalpAllocatePmcCounterSet
HalpCmcWorkerRoutine
HalpCmciInit
HalpCreateMachineCheckErrorRecord
HalpEnumerateEnvironmentVariablesWithFilter
HalpFreePmcCounterSet
HalpHandlePreviousMcaErrors
HalpInitializeMce
HalpLoadMicrocode
HalpMceInit
HalpQueryCapsuleCapabilities
HalpTimerStallExecutionProcessor
HalpUpdateCapsule
IopLiveDumpCorralProcessors
IopPassiveInterruptWorker
KeGenericProcessorCallback
KeSetSystemAffinityThreadEx
KeStallExecutionProcessor
KiAcquireInterruptConnectLock
KiAttemptBugcheckRecovery
KiComputeNumaCosts
KiDynamicProcessorInitialization
KiInterruptDispatchCommon
KiSetSystemAffinityThreadToProcessor
MakeGdtReadOnly
MiCombineAllPhysicalMemory
MiSetIdealProcessorThread
MiTimeSingleLargePageZero
PnpSetDeviceAffinityThread
PopEndMirroring
PopInvokeSystemStateHandler
PpmClearSimulatedIdle
PpmIdleInitializeConcurrency
PpmInstallFeedbackCounters
PpmSetSimulatedIdle
ViIsBTSSupported
ViSetupBTSPerProcNoEnable