VrpWaitForDiffHiveEntryTransitionOwnerToLeave
VOID __stdcall VrpWaitForDiffHiveEntryTransitionOwnerToLeave(INT64 a1){
_EX_PUSH_LOCK *v2;
VOID *v3;
VOID *v4;
VOID *v5;
_ETHREAD *CurrentThread;
__int128 v7[3];
memset(v7, 0, sizeof(v7));
*(_QWORD *)&v7[1] = KeGetCurrentThread();
KeInitializeEvent((INT64)&v7[1] + 8, 1, 0);
RtlInsertHeadCircularList((__int64 *)(a1 + 48), v7);
v2 = (_EX_PUSH_LOCK *)(a1 + 24);
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)(a1 + 24), 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((_EX_PUSH_LOCK *)(a1 + 24));
KeAbPostRelease((VOID *)(a1 + 24));
KeLeaveCriticalRegionThread(KeGetCurrentThread());
v3 = (VOID *)(a1 + 40);
v4 = KeAbPreAcquire(v3, 0i64, 0i64);
v5 = v4;
if( v4 )
KeAbPreWait(v4);
KeWaitForSingleObject((UINT64)&v7[1] + 8, 0, 0, 0, 0i64);
if( v5 )
{
KeAbPreAcquire(v3, v5, 0i64);
KeAbPostReleaseEx(v3, v5);
}
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
ExAcquirePushLockExclusiveEx(v2, 0i64);
}Referenced by:
VrpLoadDifferencingHive