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