VrpDereferenceDiffHiveEntry

NTSTATUS __stdcall VrpDereferenceDiffHiveEntry(PVOID P){
  signed __int64 v2; 
  signed __int64 i; 
  signed __int64 v4; 
  _ETHREAD *CurrentThread; 
  _m_prefetchw((char *)P + 16);
  v2 = *((_QWORD *)P + 2);
  for( i = v2 - 1; i > 0; i = v2 - 1 )
  {
    v4 = v2;
    v2 = _InterlockedCompareExchange64((volatile signed __int64 *)P + 2, i, v2);
    if( v4 == v2 )
      return v2;
  }
  if( i )
    __fastfail(0xEu);
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --*((_WORD *)CurrentThread + 242);
  ExAcquirePushLockExclusiveEx((UINT64)&gLoadedDiffHivesLock, 0i64);
  VrpDereferenceDiffHiveEntryWithLock(P);
  ExReleasePushLockEx((UINT64)&gLoadedDiffHivesLock, 0i64);
  LODWORD(v2) = (unsigned int)KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
  return v2;
}

Referenced by:

VrpLoadDifferencingHive
VrpUnloadDifferencingHive