KiIsPrimaryPresent
CHAR __stdcall KiIsPrimaryPresent(INT64 a1, INT64 a2){
_ETHREAD *CurrentThread;
CHAR v3;
_QWORD *Object;
__int64 v5;
__int64 v6;
unsigned __int8 CurrentIrql;
bool v11;
UINT64 SpinCount;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v3 = 0;
v11 = 0;
Object = CurrentThread->Tcb.WaitBlock[3].Object;
v5 = Object[4];
v6 = Object[5];
if( v5 && v6 )
{
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&CurrentThread->Tcb.ThreadLock, 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( CurrentThread->Tcb.ThreadLock );
}
if( CurrentThread->Tcb.Queue == (_DISPATCHER_HEADER *volatile)v5 )
v11 = !_interlockedbittestandset((volatile signed __int32 *)v5, 7u);
KiReleaseThreadLockSafe((INT64)CurrentThread);
if( !v11 )
goto LABEL_17;
if( *(_QWORD *)(v5 + 24) == v6 && *(_DWORD *)(v6 - 72) == *((_DWORD *)Object + 6) )
{
if( !a1 )
{
LABEL_15:
v3 = 1;
goto LABEL_16;
}
if( !*(_QWORD *)(v6 + 16) )
{
*(_QWORD *)(v6 + 16) = a1;
*(_QWORD *)(v6 + 24) = a2;
goto LABEL_15;
}
}
LABEL_16:
_InterlockedAnd((volatile signed __int32 *)v5, 0xFFFFFF7F);
LABEL_17:
__writecr8(CurrentIrql);
}
return v3;
}Referenced by:
KiParkUmsThread
NtUmsThreadYield