KeUpdateThreadCpuSets
unsigned __int8 __fastcall KeUpdateThreadCpuSets(__int64 a1){
unsigned __int8 CurrentIrql;
struct _KPRCB *CurrentPrcb;
unsigned __int8 result;
ULONG_PTR v4;
bool v5;
__int64 v6;
__int64 v7;
UINT64 SpinCount;
__int64 v9;
v9 = 0i64;
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
KiUpdateThreadCpuSetAffinitiesFromDpcLevel(a1, (__int64)&v9);
CurrentPrcb = KeGetCurrentPrcb();
result = (unsigned __int8)KiReadyDeferredReadyList(CurrentPrcb, &v9);
if( CurrentIrql >= 2u )
{
if( *((_QWORD *)CurrentPrcb + 2) )
{
result = *((_BYTE *)CurrentPrcb + 12586);
if( !result )
return KiRequestSoftwareInterrupt(CurrentPrcb, 2);
}
}
else
{
v4 = *((_QWORD *)CurrentPrcb + 1);
if( *((_QWORD *)CurrentPrcb + 2) )
{
KiAbProcessContextSwitch(*((_KTHREAD **)CurrentPrcb + 1), 0i64);
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)CurrentPrcb + 12, 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *((_QWORD *)CurrentPrcb + 6) );
}
v6 = *((_QWORD *)CurrentPrcb + 2);
*((_QWORD *)CurrentPrcb + 2) = 0i64;
_disable();
KiEndThreadCycleAccumulation(CurrentPrcb, (_KTHREAD *)v4, 0i64);
_enable();
*((_QWORD *)CurrentPrcb + 1) = v6;
if( *(_BYTE *)(v6 + 388) == 1 )
*(_DWORD *)(v6 + 132) = *(_DWORD *)(v6 + 132) - *(_DWORD *)(v6 + 436) + KUSER_SHARED_DATA.TickCount.LowPart;
*(_BYTE *)(v6 + 388) = 2;
*(_BYTE *)(v4 + 643) = 32;
*(_BYTE *)(v4 + 390) = CurrentIrql;
KiQueueReadyThread((__int64)CurrentPrcb, v4, v7);
v5 = !KiSwapContext((PKTHREAD)v4, (PKTHREAD)v6);
}
else
{
v5 = (*(_DWORD *)(v4 + 116) & 0x40) == 0;
}
if( !v5 )
{
__writecr8(1ui64);
*(_DWORD *)(v4 + 116) &= ~0x40u;
KiDeliverApc(0, 0i64, 0i64);
}
result = CurrentIrql;
__writecr8(CurrentIrql);
}
return result;
}Referenced by:
NtSetInformationThread