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