KiCheckWaitNext
UINT8 __stdcall KiCheckWaitNext(
_ETHREAD *Thread,
_LARGE_INTEGER *OriginalTimeout,
UINT8 Precise,
UINT64 *DueTime,
_KDUE_TIME_TYPE *TimeoutType){
unsigned __int8 v6;
UINT8 v7;
unsigned __int8 CurrentIrql;
__int64 v11;
UINT64 UnbiasedInterruptTime;
_KDUE_TIME_TYPE *v13;
INT64 CurrentQpc;
v6 = _bittestandreset((signed __int32 *)&Thread->Tcb.116, 2u);
CurrentQpc = 0i64;
v7 = v6;
if( !v6 )
{
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
Thread->Tcb.WaitIrql = CurrentIrql;
}
if( OriginalTimeout )
{
if( OriginalTimeout->anonymous_0.HighPart >= 0 )
{
*DueTime = OriginalTimeout->QuadPart;
*TimeoutType = DueTimeAbsolute;
}
else
{
if( Precise )
{
LODWORD(v11) = RtlGetInterruptTimePrecise(&CurrentQpc);
UnbiasedInterruptTime = v11 - KUSER_SHARED_DATA.InterruptTimeBias;
}
else
{
UnbiasedInterruptTime = KiQueryUnbiasedInterruptTime(0);
}
v13 = TimeoutType;
*DueTime = UnbiasedInterruptTime - Thread->Tcb.RelativeTimerBias - OriginalTimeout->QuadPart;
*v13 = DueTimeRelative;
}
}
else
{
*TimeoutType = DueTimeNone;
}
return v7;
}Referenced by:
KeDelayExecutionThread
KeWaitForAlertByThreadId
KiWaitForAllObjects