ExWaitForRundownProtectionReleaseCacheAware
VOID __stdcall ExWaitForRundownProtectionReleaseCacheAware(_EX_RUNDOWN_REF_CACHE_AWARE *RunRefCacheAware){
unsigned __int64 v1;
unsigned int Number;
unsigned int v3;
int v4;
__int64 v5;
signed __int64 v6;
__int128 Object;
__int128 v8;
v6 = 0i64;
v1 = 0i64;
Number = RunRefCacheAware->Number;
v3 = 0;
Object = 0i64;
v8 = 0i64;
if( Number )
{
do
{
v4 = v3 % Number;
++v3;
v5 = _InterlockedExchange64(
(volatile __int64 *)((char *)RunRefCacheAware->RunRefs + RunRefCacheAware->RunRefSize * v4),
(__int64)&v6 + 1);
Number = RunRefCacheAware->Number;
v1 += v5;
}
while( v3 < Number );
if( v1 )
{
DWORD1(Object) = 0;
*(_QWORD *)&v8 = (char *)&Object + 8;
*((_QWORD *)&Object + 1) = (char *)&Object + 8;
LOWORD(Object) = 1;
BYTE2(Object) = 6;
if( _InterlockedExchangeAdd64(&v6, v1 >> 1) != -(__int64)(v1 >> 1) )
KeWaitForSingleObject((UINT64)&Object, 0, 0, 0, 0i64);
}
}
}Referenced by:
EtwpFreeLoggerContext
MiDrainCrossPartitionUsage
RawUserFsCtrl
RawVerifyVolume