KiWaitSatisfyAny
VOID __stdcall KiWaitSatisfyAny(VOID *Object, _ETHREAD *Thread, _KPRCB *Prcb){
__int64 v6;
char v7;
_BYTE *v9;
UINT64 SpinCount;
if( !KiWaitSatisfyOther((_KMUTANT *)Object) )
{
v7 = *(_BYTE *)v6 & 0x7F;
if( v7 == 2 && (*(_DWORD *)(v6 + 4))-- == 1 )
{
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&Thread->Tcb.ThreadLock, 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( Thread->Tcb.ThreadLock );
}
KiWaitSatisfyMutant((_KMUTANT *)Object, &Thread->Tcb, Prcb);
KiReleaseThreadLockSafe((INT64)Thread);
if( (*((_BYTE *)Object + 48) & 2) != 0 )
{
v9 = KeAbPreAcquire(Object, 0i64, 1ui64);
if( v9 )
v9[26] |= 1u;
}
}
}
}Referenced by:
KiWaitForAllObjects