VrpWaitForDiffHiveEntryTransitionOwnerToLeave
VOID __fastcall VrpWaitForDiffHiveEntryTransitionOwnerToLeave(INT64 a1){
UINT64 v2;
void *v3;
void *v4;
void *v5;
_ETHREAD *CurrentThread;
_QWORD a2[2];
__int128 Object[2];
*(_OWORD *)a2 = 0i64;
memset(Object, 0, sizeof(Object));
*(_QWORD *)&Object[0] = KeGetCurrentThread();
KeInitializeEvent((_KEVENT *)((char *)Object + 8), SynchronizationEvent, 0);
RtlInsertHeadCircularList((INT64 *)(a1 + 48), a2);
v2 = a1 + 24;
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)(a1 + 24), 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)(a1 + 24));
KeAbPostRelease((PVOID)(a1 + 24));
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
v3 = (void *)(a1 + 40);
LODWORD(v4) = KeAbPreAcquire(v3, 0i64, 0i64);
v5 = v4;
if( v4 )
KeAbPreWait(v4);
KeWaitForSingleObject((char *)Object + 8, Executive, 0, 0, 0i64);
if( v5 )
{
KeAbPreAcquire(v3, v5, 0i64);
KeAbPostReleaseEx(v3, v5);
}
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
ExAcquirePushLockExclusiveEx(v2, 0i64);
}Referenced by:
VrpLoadDifferencingHive