KiSignalThread
VOID __stdcall KiSignalThread(_KPRCB *Prcb, _ETHREAD *Thread, INT64 WaitStatus, _KWAIT_BLOCK *WaitBlock){
char v6;
int v8;
__int64 v9;
__int64 v10;
struct _KPRCB *CurrentPrcb;
__int64 v12;
_ETHREAD **v13;
char v14;
__int64 v15;
__int64 v16;
UINT64 SpinCount;
v6 = *((_BYTE *)Thread + 112);
v8 = v6 & 7;
if( v8 == 1 || v8 == 4 )
{
v9 = *((_QWORD *)Thread + 29);
if( v9 )
{
if( (*(_BYTE *)v9 & 0x7F) == 21 )
{
*((_DWORD *)Thread + 135) = (unsigned __int8)*((_DWORD *)Thread + 135);
_InterlockedIncrement((volatile signed __int32 *)(v9 + 4i64 * *((unsigned int *)Thread + 135) + 536));
}
else
{
_InterlockedIncrement((volatile signed __int32 *)(v9 + 40));
}
}
v10 = *((_QWORD *)Thread + 89);
if( v10 )
{
CurrentPrcb = KeGetCurrentPrcb();
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)(v10 + 31760), 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *(_QWORD *)(v10 + 31760) );
v16 = *((_QWORD *)CurrentPrcb + 4247);
if( v16 && *((_BYTE *)CurrentPrcb + 32) <= 1u )
++*(_DWORD *)(v16 + 24);
}
if( *((_QWORD *)Thread + 89) )
{
v12 = *((_QWORD *)Thread + 27);
v13 = (_ETHREAD **)*((_QWORD *)Thread + 28);
if( *(_ETHREAD **)(v12 + 8) != (_ETHREAD *)((char *)Thread + 216) || *v13 != (_ETHREAD *)((char *)Thread + 216) )
__fastfail(3u);
*v13 = (_ETHREAD *)v12;
*(_QWORD *)(v12 + 8) = v13;
*((_QWORD *)Thread + 89) = 0i64;
}
_InterlockedAnd64((volatile signed __int64 *)(v10 + 31760), 0i64);
}
v14 = *((_BYTE *)Thread + 388);
if( v14 == 1 )
{
*((_DWORD *)Thread + 29) |= 2u;
}
else if( v14 == 5 )
{
v15 = KUSER_SHARED_DATA.TickCount.LowPart - *((_DWORD *)Thread + 109);
if( *((_BYTE *)Thread + 391) )
*((_QWORD *)Thread + 125) += v15;
else
*((_QWORD *)Thread + 124) += v15;
}
*((_BYTE *)Thread + 388) = 7;
*((_QWORD *)Thread + 27) = *((_QWORD *)Prcb + 1441);
*((_QWORD *)Prcb + 1441) = (char *)Thread + 216;
*((_QWORD *)Thread + 25) = WaitStatus;
*((_QWORD *)Thread + 122) = 0i64;
}
else if( WaitBlock )
{
if( (v6 & 7) != 0 )
{
if( v8 == 5 )
{
*((_BYTE *)Thread + 112) = v6 & 0xF8 | 6;
}
else if( v8 == 3 )
{
WaitBlock->BlockState = 2;
}
}
else
{
*((_BYTE *)Thread + 112) = v6 & 0xF8 | 2;
*((_QWORD *)Thread + 25) = WaitStatus;
*((_QWORD *)Thread + 122) = 0i64;
WaitBlock->BlockState = 0;
}
}
}Referenced by:
KeAlertThread
KeAlertThreadByThreadId
KiResumeThread
KiSuspendThread
KiTryUnwaitThreadWithPriority
KiWakeOtherQueueWaiters
KiWakeQueueWaiter