KeStartThread
VOID __stdcall KeStartThread(_ETHREAD *Thread, _GROUP_AFFINITY *GroupAffinity, UINT64 *IdealProcessor){
_GROUP_AFFINITY *p_Affinity;
_KNODE *v6;
unsigned __int16 ThreadSeed;
_ETHREAD *CurrentThread;
__int64 v9;
UINT16 v10;
UINT64 *v11;
char v12;
WORK_QUEUE_TYPE v13;
void *v14;
__int64 v15;
unsigned int v16;
_QWORD *v17;
_KPRCB *v18;
int v19;
int v20;
__int64 v21;
_QWORD *v22;
_QWORD *v23;
char v24;
char v25;
_QWORD *v26;
_QWORD *v27;
__int64 Group;
__int64 v29;
char v30;
char v31;
UINT64 AltSeed;
__int64 CurrentIrql;
__int64 v34;
struct _KLOCK_QUEUE_HANDLE LockHandle;
_GROUP_AFFINITY Affinity;
HIDWORD(AltSeed) = 0;
v34 = 0i64;
p_Affinity = GroupAffinity;
Affinity = 0i64;
memset(&LockHandle, 0, sizeof(LockHandle));
if( !IdealProcessor && GroupAffinity && GroupAffinity->Mask )
{
v6 = KeSelectNodeForAffinity(GroupAffinity);
v31 = v30;
ThreadSeed = v6->ThreadSeed;
}
else
{
v6 = 0i64;
v31 = 1;
ThreadSeed = 0;
}
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v9 = *((_QWORD *)Thread + 23);
*((_DWORD *)Thread + 30) ^= (*((_DWORD *)Thread + 30) ^ (4 * *(_DWORD *)(v9 + 632))) & 8;
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
ExAcquireSpinLockExclusiveAtDpcLevel((INT64 *)(v9 + 64));
v12 = *(_BYTE *)(v9 + 640);
*((_BYTE *)Thread + 563) = v12;
*((_BYTE *)Thread + 195) = v12;
if( p_Affinity )
{
Group = p_Affinity->Group;
v29 = *(_QWORD *)(v9 + 8 * Group + 88);
if( !v29 || (v29 & p_Affinity->Mask) != p_Affinity->Mask )
KiExtendProcessAffinity(v9, Group);
if( !p_Affinity->Mask )
p_Affinity->Mask = *(_QWORD *)(v9 + 8i64 * p_Affinity->Group + 88);
}
else
{
if( v9 == *((_QWORD *)CurrentThread + 68) )
{
Affinity.Group = *((_WORD *)CurrentThread + 280);
Affinity.Mask = *(_QWORD *)(v9 + 8i64 * Affinity.Group + 88);
}
else
{
KeFirstGroupAffinityEx(&Affinity, v9 + 80, v10, v11);
}
p_Affinity = &Affinity;
}
*((_WORD *)Thread + 292) = p_Affinity->Group;
*((_QWORD *)Thread + 72) = p_Affinity->Mask;
*((_WORD *)Thread + 280) = p_Affinity->Group;
*((_QWORD *)Thread + 69) = p_Affinity->Mask;
KiUpdateNodeAffinitizedFlag((_KTHREAD *)Thread);
if( IdealProcessor )
{
v16 = *(_DWORD *)IdealProcessor;
}
else
{
if( !v6 )
{
v15 = p_Affinity->Group;
ThreadSeed = *(_WORD *)(v9 + 2 * v15 + 644);
v6 = (_KNODE *)*((_QWORD *)&KeNodeBlock + *(unsigned __int16 *)(v9 + 2 * v15 + 772));
HIDWORD(AltSeed) = *(unsigned __int16 *)(v9 + 2 * v15 + 708);
v34 = (__int64)&AltSeed + 4;
}
p_Affinity->Mask &= v6->Affinity.Mask;
LOWORD(AltSeed) = ThreadSeed;
v16 = (unsigned __int16)KeSelectIdealProcessor(v6, p_Affinity, &AltSeed);
if( v31 )
*(_WORD *)(v9 + 2i64 * p_Affinity->Group + 644) = AltSeed;
}
*((_DWORD *)Thread + 49) = v16;
v17 = (_QWORD *)(v9 + 48);
*((_DWORD *)Thread + 147) = v16;
v18 = *(&KiProcessorBlock + v16);
if( (_QWORD *)*v17 == v17 && (__int64 *)v9 != KiInitialProcess )
{
LockHandle.LockQueue.Next = 0i64;
LockHandle.LockQueue.Lock = (unsigned __int64 *volatile)KiProcessListLock;
KxAcquireQueuedSpinLock((PIO_WORKITEM)&LockHandle, KiProcessListLock, v13, v14);
v26 = (_QWORD *)qword_140C319F8;
v27 = (_QWORD *)(v9 + 848);
if( *(__int64 **)qword_140C319F8 != &KiProcessListHead )
goto LABEL_45;
*(_QWORD *)(v9 + 856) = qword_140C319F8;
*v27 = &KiProcessListHead;
*v26 = v27;
qword_140C319F8 = v9 + 848;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
}
*((_DWORD *)Thread + 30) ^= (*((_DWORD *)Thread + 30) ^ (*(_DWORD *)(v9 + 632) << 6)) & 0x100;
v19 = *(unsigned __int8 *)(v9 + 641);
v20 = *((_DWORD *)Thread + 30);
*((_BYTE *)Thread + 651) = v19;
v21 = (unsigned int)(KiCyclesPerClockQuantum * v19);
if( (v20 & 0x20) != 0 )
_interlockedbittestandreset((volatile signed __int32 *)Thread + 30, 5u);
*((_QWORD *)Thread + 4) = v21;
KiAcquireKobjectLockSafe((PVOID)v9);
v22 = *(_QWORD **)(v9 + 56);
v23 = (_QWORD *)((char *)Thread + 760);
if( (_QWORD *)*v22 != v17 )
LABEL_45:
__fastfail(3u);
*v23 = v17;
*((_QWORD *)Thread + 96) = v22;
*v22 = v23;
*(_QWORD *)(v9 + 56) = v23;
_InterlockedAnd((volatile signed __int32 *)v9, 0xFFFFFF7F);
if( (*(_DWORD *)(v9 + 632) & 8) != 0 )
KiFreezeSingleThread(KeGetCurrentPrcb(), (_KTHREAD *)Thread);
*((_QWORD *)Thread + 13) = *(_QWORD *)(v9 + 880);
if( *(_QWORD *)(v9 + 880) )
_interlockedbittestandset((volatile signed __int32 *)Thread, 0x12u);
KiUpdateSharedReadyQueueAffinityThread(v18, (_KTHREAD *)Thread);
if( *(_BYTE *)(*((_QWORD *)Thread + 68) + 1850i64) == 2
&& !*((_BYTE *)Thread + 564)
&& (*((_DWORD *)Thread + 30) & 8) == 0 )
{
v24 = *((_BYTE *)Thread + 195);
if( v24 > 0 )
{
v25 = PsPrioritySeparation + *((_BYTE *)Thread + 563);
if( v25 >= 16 )
v25 = 15;
if( v25 > v24 )
{
*((_BYTE *)Thread + 564) = (v25 - v24) & 0xF;
KiUpdateThreadPriority(0i64, (_KTHREAD *)Thread, (unsigned int)v25, 0);
KiUpdateSharedReadyQueueAffinityThread(0i64, (_KTHREAD *)Thread);
}
}
}
if( (*((_DWORD *)Thread + 29) & 0x400) == 0 )
*((_DWORD *)Thread + 238) = *(_DWORD *)(v9 + 68);
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(v9 + 64));
__writecr8((unsigned __int8)CurrentIrql);
if( (xmmword_140CFB490 & 0x8000000) != 0 )
{
EtwTraceIdealProcessor((INT64)Thread, 0x546u, 0xFFFFFFFFi64, v16);
if( (xmmword_140CFB490 & 0x8000000) != 0 )
EtwTraceIdealProcessor((INT64)Thread, 0x547u, 0xFFFFFFFFi64, v16);
}
_InterlockedExchangeAdd((volatile signed __int32 *)(v9 + 840), 8u);
}Referenced by:
KiInitializeIdleThread
PspInsertThread