MiSetIdealProcessorThread
NTSTATUS __stdcall MiSetIdealProcessorThread(PGROUP_AFFINITY Affinity){
bool v1;
_KTHREAD *CurrentThread;
KPRIORITY v4;
unsigned int FirstSetRightGroupAffinity;
NTSTATUS v6;
UINT64 OldProcessor;
struct _GROUP_AFFINITY PreviousAffinity;
LODWORD(OldProcessor) = 0;
v1 = Affinity->Mask == 0;
PreviousAffinity = 0i64;
if( v1 )
return -1;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v4 = KeQueryPriorityThread((_KTHREAD *)CurrentThread) >= 16 ? -1 : KeSetPriorityThread((PKTHREAD)CurrentThread, 16);
KeSetSystemGroupAffinityThread(Affinity, &PreviousAffinity);
KeRevertToUserGroupAffinityThread(&PreviousAffinity);
FirstSetRightGroupAffinity = KeFindFirstSetRightGroupAffinity(Affinity);
v6 = KeSetIdealProcessorThreadEx((_KTHREAD *)CurrentThread, FirstSetRightGroupAffinity, &OldProcessor);
if( v4 != -1 )
KeSetPriorityThread((PKTHREAD)CurrentThread, v4);
if( v6 < 0 )
return -1;
else
return OldProcessor;
}Referenced by:
MiGetPagesToZero
MiZeroInParallelWorker
MiZeroLargePages