ExpWakePushLock
VOID __fastcall ExpWakePushLock(volatile INT64 *a1, INT64 a2){
int v2;
_QWORD *v3;
struct _KEVENT *v4;
_LIST_ENTRY *Blink;
bool v6;
INT64 v7;
unsigned __int8 CurrentIrql;
_LIST_ENTRY *v9;
__int64 Flink;
INT64 v11;
_QWORD *v12;
v2 = 1;
while( (a2 & 1) == 0 )
{
LABEL_3:
v3 = (_QWORD *)(a2 & 0xFFFFFFFFFFFFFFF0ui64);
v4 = *(struct _KEVENT **)((a2 & 0xFFFFFFFFFFFFFFF0ui64) + 0x20);
if( !v4 )
{
do
{
v12 = v3;
v3 = (_QWORD *)v3[3];
v3[5] = v12;
v4 = (struct _KEVENT *)v3[4];
}
while( !v4 );
if( v3 != (_QWORD *)(a2 & 0xFFFFFFFFFFFFFFF0ui64) )
*(_QWORD *)((a2 & 0xFFFFFFFFFFFFFFF0ui64) + 0x20) = v4;
}
if( (v4[2].Header.SignalState & 1) != 0 )
{
Blink = v4[1].Header.WaitListHead.Blink;
if( Blink )
{
*(_QWORD *)((a2 & 0xFFFFFFFFFFFFFFF0ui64) + 0x20) = Blink;
v4[1].Header.WaitListHead.Blink = 0i64;
_InterlockedAnd64(a1, 0xFFFFFFFFFFFFFFFBui64);
v2 = 0;
LABEL_7:
CurrentIrql = 2;
if( v4[1].Header.WaitListHead.Blink )
{
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
}
if( !v2 )
{
Flink = (__int64)v4[2].Header.WaitListHead.Flink;
if( Flink )
KiAbApplyWakeupBoost(*((_BYTE *)KeGetCurrentThread() + 195), Flink, 0);
}
do
{
v9 = v4[1].Header.WaitListHead.Blink;
if( !_interlockedbittestandreset(&v4[2].Header.SignalState, 1u) )
KeSetEvent(v4, 0);
v4 = (struct _KEVENT *)v9;
}
while( v9 );
if( CurrentIrql != 2 )
__writecr8(CurrentIrql);
return;
}
}
v7 = _InterlockedCompareExchange64(a1, 0i64, a2);
v6 = a2 == v7;
a2 = v7;
if( v6 )
goto LABEL_7;
}
while( 1 )
{
v11 = _InterlockedCompareExchange64(a1, a2 - 4, a2);
v6 = a2 == v11;
a2 = v11;
if( v6 )
break;
if( (v11 & 1) == 0 )
goto LABEL_3;
}
}Referenced by:
ExfReleasePushLockExclusive
ExfReleasePushLockShared
ExfReleasePushLockSharedEx
ExfTryToWakePushLock
ExpOptimizePushLockList