ExTimedWaitForUnblockPushLock
NTSTATUS __stdcall ExTimedWaitForUnblockPushLock(
_EX_PUSH_LOCK *PushLock,
_EX_PUSH_LOCK_WAIT_BLOCK *WaitBlock,
_LARGE_INTEGER *Timeout){
volatile signed __int32 *v3;
__int64 v4;
int v8;
NTSTATUS v9;
unsigned __int64 v11;
unsigned __int64 v12;
unsigned __int64 v13;
unsigned __int64 v14;
*(_WORD *)WaitBlock = 0;
WaitBlock[1] = 0;
v3 = WaitBlock + 13;
v4 = (unsigned int)ExpSpinCycleCount;
*((_QWORD *)WaitBlock + 2) = WaitBlock + 2;
*((_QWORD *)WaitBlock + 1) = WaitBlock + 2;
*((_BYTE *)WaitBlock + 2) = 6;
if( KUSER_SHARED_DATA.UnparkedProcessorCount <= 1u )
{
LABEL_8:
if( !_interlockedbittestandreset(v3, 1u) )
return 0;
v9 = KeWaitForSingleObject((UINT64)WaitBlock, 28, 0, 0, (INT64)Timeout);
if( v9 )
ExpUnblockPushLock(PushLock, WaitBlock, 1u);
return v9;
}
else
{
if( WaitBlock != (_EX_PUSH_LOCK_WAIT_BLOCK *)-52i64 && KUSER_SHARED_DATA.ProcessorFeatures[35] )
{
v11 = __rdtsc();
v12 = v11 + v4;
while( 1 )
{
__asm { monitorx rax, rcx, rdx }
if( (*v3 & 2) == 0 )
break;
v13 = v11;
v14 = __rdtsc();
v11 = v14;
if( v14 <= v13 || v14 >= v12 )
goto LABEL_8;
__asm { mwaitx rax, rcx, rbx }
}
}
else
{
v8 = 0;
while( (*v3 & 2) != 0 )
{
if( v8 == (unsigned int)v4 / KUSER_SHARED_DATA.CyclesPerYield )
goto LABEL_8;
_mm_pause();
++v8;
}
}
return 0;
}
}Referenced by:
ExBlockOnAddressPushLock
ExWaitForUnblockPushLock
ExpUnblockPushLock