KiAcquireThreadStateLock
VOID __fastcall KiAcquireThreadStateLock(
_ETHREAD *Thread,
_KPRCB **ControlPrcb,
_KSHARED_READY_QUEUE **ControlReadyQueue){
__int64 v6;
volatile signed __int32 *v7;
__int64 v8;
struct _KPRCB *CurrentPrcb;
bool v10;
char v11;
__int64 v12;
struct _KPRCB *v13;
__int64 v14;
struct _KPRCB *v15;
__int64 v16;
__int64 v17;
__int64 v18;
struct _KPRCB *v19;
__int64 v20;
__int64 v21;
UINT64 v22[9];
UINT64 SpinCount;
UINT64 v24;
while( 1 )
{
while( 1 )
{
while( 1 )
{
v6 = 0i64;
v7 = 0i64;
if( *((_BYTE *)Thread + 388) != 2 )
break;
LABEL_2:
v8 = *((unsigned int *)Thread + 134);
if( (int)v8 >= 0 )
{
CurrentPrcb = KeGetCurrentPrcb();
v6 = (__int64)*(&KiProcessorBlock + v8);
HIDWORD(v22[0]) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)(v6 + 48), 0i64) )
{
do
KeYieldProcessorEx((UINT64 *)((char *)v22 + 4));
while( *(_QWORD *)(v6 + 48) );
v17 = *((_QWORD *)CurrentPrcb + 4247);
if( v17 && *((_BYTE *)CurrentPrcb + 32) <= 1u )
++*(_DWORD *)(v17 + 24);
}
v10 = Thread == *(_ETHREAD **)(v6 + 8);
LABEL_6:
if( v10 )
goto LABEL_7;
goto LABEL_19;
}
}
if( *((_BYTE *)Thread + 388) == 1 )
break;
if( *((_BYTE *)Thread + 388) != 3 )
{
if( *((_BYTE *)Thread + 388) != 5 )
goto LABEL_7;
v11 = *((_BYTE *)Thread + 112) & 7;
if( v11 == 1 || (unsigned __int8)(v11 - 3) <= 3u )
goto LABEL_7;
goto LABEL_2;
}
v12 = *((unsigned int *)Thread + 134);
if( (int)v12 >= 0 )
{
v13 = KeGetCurrentPrcb();
v6 = (__int64)*(&KiProcessorBlock + v12);
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)(v6 + 48), 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *(_QWORD *)(v6 + 48) );
v18 = *((_QWORD *)v13 + 4247);
if( v18 && *((_BYTE *)v13 + 32) <= 1u )
++*(_DWORD *)(v18 + 24);
}
if( Thread == *(_ETHREAD **)(v6 + 16) )
goto LABEL_7;
if( *((_BYTE *)Thread + 388) == 3 && *((_DWORD *)Thread + 134) == (_DWORD)v12 )
__fastfail(0x1Eu);
LABEL_19:
_InterlockedAnd64((volatile signed __int64 *)(v6 + 48), 0i64);
}
}
v14 = *((unsigned int *)Thread + 134);
if( (int)v14 >= 0 )
{
v19 = KeGetCurrentPrcb();
v6 = (__int64)*(&KiProcessorBlock + v14);
LODWORD(v22[0]) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)(v6 + 48), 0i64) )
{
do
KeYieldProcessorEx(v22);
while( *(_QWORD *)(v6 + 48) );
v20 = *((_QWORD *)v19 + 4247);
if( v20 && *((_BYTE *)v19 + 32) <= 1u )
++*(_DWORD *)(v20 + 24);
}
if( *((_BYTE *)Thread + 388) != 1 )
goto LABEL_19;
v10 = *((_DWORD *)Thread + 134) == (_DWORD)v14;
goto LABEL_6;
}
v15 = KeGetCurrentPrcb();
v16 = (unsigned int)v14;
LODWORD(v16) = v14 & 0x7FFFFFFF;
LODWORD(v24) = 0;
v7 = (volatile signed __int32 *)*((_QWORD *)*(&KiProcessorBlock + v16) + 4233);
while( _interlockedbittestandset64(v7, 0i64) )
{
do
KeYieldProcessorEx(&v24);
while( *(_QWORD *)v7 );
v21 = *((_QWORD *)v15 + 4247);
if( v21 && *((_BYTE *)v15 + 32) <= 1u )
++*(_DWORD *)(v21 + 24);
}
if( *((_BYTE *)Thread + 388) == 1 && *((_DWORD *)Thread + 134) == (_DWORD)v14 )
break;
_InterlockedAnd64((volatile signed __int64 *)v7, 0i64);
}
v6 = 0i64;
LABEL_7:
*ControlPrcb = (_KPRCB *)v6;
*ControlReadyQueue = (_KSHARED_READY_QUEUE *)v7;
}Referenced by:
KeAbCrossThreadDelete
KeQueryTotalCycleTimeThread
KeSetActualBasePriorityThread
KeSetIdealProcessorThreadEx
KeSetThreadSchedulerAssist
KeTryToFreezeThreadStack
KeUpdateThreadTag
KiApplyForegroundBoostThread
KiRemoveThreadFromSchedulingGroup
KiSendHeteroRescheduleIntRequestHelper
KiSetAffinityThread
KiSetHeteroPolicyThread
KiSetPriorityThread
KiSetThreadSchedulingGroup
KiUpdateThreadCpuSets