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