KiResumeThread
VOID __stdcall KiResumeThread(_ETHREAD *Thread, _KPRCB *Prcb, UINT8 ForceResume){
_ETHREAD *v6;
_ETHREAD *v7;
unsigned __int8 v8;
unsigned __int8 i;
__int64 v10;
_BYTE *v11;
char v12;
__int64 *v13;
int v14;
unsigned int v15;
char v16;
_KWAIT_BLOCK *v17;
unsigned __int8 WaitType;
INT64 WaitKey;
_LARGE_INTEGER v20;
_KQUEUE *NotificationQueue;
_LIST_ENTRY *p_WaitListHead;
struct _KPRCB *CurrentPrcb;
__int64 v24;
int SignalState;
_LIST_ENTRY *Blink;
UINT64 SpinCount;
UINT64 Hand;
UINT64 v29;
LODWORD(Hand) = 0;
*((_DWORD *)Thread + 185) = 1;
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)Thread + 16, 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *((_QWORD *)Thread + 8) );
}
if( *((_BYTE *)Thread + 388) == 5 && (*((_BYTE *)Thread + 112) & 7) == 4 )
{
if( !ForceResume )
{
*((_BYTE *)Thread + 112) = *((_BYTE *)Thread + 112) & 0xF8 | 5;
KiReleaseThreadLockSafe((INT64)Thread);
v8 = *((_BYTE *)Thread + 587);
for( i = 0; i < v8; ++i )
{
v10 = *((_QWORD *)Thread + 26) + 48i64 * i;
if( *(_BYTE *)(v10 + 17) == 6 )
{
v11 = *(_BYTE **)(v10 + 32);
*(_BYTE *)(v10 + 17) = 4;
KiAcquireKobjectLockSafe(v11);
if( *((int *)v11 + 1) > 0 || (v12 = *v11 & 0x7F, v12 == 2) )
{
_InterlockedAnd((volatile signed __int32 *)v11, 0xFFFFFF7F);
*(_BYTE *)(v10 + 17) = 5;
ForceResume = 1;
break;
}
v13 = (__int64 *)*((_QWORD *)v11 + 2);
if( (_BYTE *)*v13 != v11 + 8 )
LABEL_60:
__fastfail(3u);
*(_QWORD *)v10 = v11 + 8;
*(_QWORD *)(v10 + 8) = v13;
*v13 = v10;
*((_QWORD *)v11 + 2) = v10;
_InterlockedAnd((volatile signed __int32 *)v11, 0xFFFFFF7F);
}
}
v14 = 0;
if( (*((_DWORD *)Thread + 29) & 0x20000) != 0 && !ForceResume )
{
v20 = *(_LARGE_INTEGER *)((char *)Thread + 280);
*((_DWORD *)Thread + 64) |= 0x40000080u;
if( (unsigned int)KiComputeDueTime((_KTIMER *)((char *)Thread + 256), v20, 0, &Hand) )
{
if( KiInsertTimerTable(Prcb, (_KTIMER *)((char *)Thread + 256), 0i64, (unsigned int)Hand, 0i64) )
_InterlockedAnd((volatile signed __int32 *)Thread + 64, 0xFFFFFF7F);
else
KiTimerWaitTest(Prcb, (_KTIMER *)((char *)Thread + 256), 0i64);
v14 = 1;
}
else
{
ForceResume = 1;
v14 = 0;
}
}
LODWORD(v29) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)Thread + 16, 0i64) )
{
do
KeYieldProcessorEx(&v29);
while( *((_QWORD *)Thread + 8) );
}
v15 = *((_DWORD *)Thread + 29) & 0xFFFDFDFF | (v14 << 9) & 0xFFFDFFFF;
v16 = *((_BYTE *)Thread + 112) & 0xE7;
*((_DWORD *)Thread + 29) = v15;
if( v16 != 5
|| (unsigned int)KiTestForAlertPending((__int64)Thread, (v15 & 0x10) != 0, *((_BYTE *)Thread + 391), 0) )
{
ForceResume = 1;
}
else if( *((_BYTE *)Thread + 643) == 37 && (*((_BYTE *)Thread + 120) & 0x10) != 0 )
{
ForceResume = 1;
}
}
*((_BYTE *)Thread + 112) = *((_BYTE *)Thread + 112) & 0xF8 | 1;
}
if( ForceResume )
{
if( (*((_DWORD *)Thread + 30) & 0x8000) != 0 )
{
if( *((_BYTE *)Thread + 388) == 5 )
KiSignalThread(Prcb, Thread, 256i64, 0i64);
}
else
{
KiSignalThreadForApc(Prcb, (_KAPC *)((char *)Thread + 648), 2u);
}
}
KiReleaseThreadLockSafe((INT64)Thread);
v6 = (_ETHREAD *)((char *)Thread + 744);
v7 = (_ETHREAD *)*((_QWORD *)Thread + 93);
if( v7 != (_ETHREAD *)((char *)Thread + 744) )
{
while( 1 )
{
v17 = (_KWAIT_BLOCK *)v7;
v7 = *(_ETHREAD **)v7;
WaitType = v17->WaitType;
if( WaitType == 1 )
break;
if( WaitType != 2 )
{
WaitKey = 256i64;
goto LABEL_29;
}
v17->BlockState = 5;
NotificationQueue = v17->NotificationQueue;
v17->WaitListEntry.Flink = 0i64;
p_WaitListHead = &NotificationQueue->Header.WaitListHead;
KeGetCurrentIrql();
__writecr8(2ui64);
CurrentPrcb = KeGetCurrentPrcb();
v24 = *((_QWORD *)CurrentPrcb + 1);
KiAcquireKobjectLockSafe(NotificationQueue);
if( p_WaitListHead->Flink == p_WaitListHead
|| NotificationQueue->CurrentCount >= NotificationQueue->MaximumCount
|| *(_KQUEUE **)(v24 + 232) == NotificationQueue && *(_BYTE *)(v24 + 643) == 15
|| !KiWakeQueueWaiter(CurrentPrcb, NotificationQueue, (INT64)v17) )
{
SignalState = NotificationQueue->Header.SignalState;
NotificationQueue->Header.SignalState = SignalState + 1;
Blink = NotificationQueue->EntryListHead.Blink;
if( Blink->Flink != &NotificationQueue->EntryListHead )
goto LABEL_60;
v17->WaitListEntry.Flink = &NotificationQueue->EntryListHead;
v17->WaitListEntry.Blink = Blink;
Blink->Flink = &v17->WaitListEntry;
NotificationQueue->EntryListHead.Blink = &v17->WaitListEntry;
if( !SignalState && p_WaitListHead->Flink != p_WaitListHead )
KiWakeOtherQueueWaiters(CurrentPrcb, NotificationQueue);
}
_InterlockedAnd(&NotificationQueue->Header.Lock, 0xFFFFFF7F);
LABEL_30:
if( v7 == v6 )
goto LABEL_8;
}
WaitKey = v17->WaitKey;
LABEL_29:
KiTryUnwaitThread(Prcb, v17, WaitKey, 0i64);
goto LABEL_30;
}
LABEL_8:
*((_QWORD *)v6 + 1) = v6;
*(_QWORD *)v6 = v6;
}Referenced by:
KeForceResumeThread
KeResumeThread
KiAdjustThreadTimer
KiThawSingleThread