ExpWnfDispatchKernelSubscription
VOID __stdcall ExpWnfDispatchKernelSubscription(){
_QWORD *v0;
volatile signed __int64 *v1;
_BYTE *v2;
_BYTE *v3;
struct _EX_RUNDOWN_REF *v4;
struct _EX_RUNDOWN_REF *v5;
struct _EX_RUNDOWN_REF v6;
struct _EX_RUNDOWN_REF **Count;
volatile signed __int64 *v8;
unsigned int Ptr_high;
_BYTE *v10;
_BYTE *v11;
INT64 v12;
unsigned int v13;
unsigned int v14;
__int64 v15;
__int64 v16;
_BYTE *v17;
_BYTE *v18;
unsigned __int64 v19;
v19 = 0i64;
v0 = (_QWORD *)*((_QWORD *)PsInitialSystemProcess + 269);
v1 = v0 + 13;
LODWORD(v2) = KeAbPreAcquire(v0 + 13, 0i64, 0i64);
v3 = v2;
if( _interlockedbittestandset64((volatile signed __int32 *)v0 + 26, 0i64) )
ExfAcquirePushLockExclusiveEx(v0 + 13, v2, v0 + 13);
if( v3 )
v3[26] |= 1u;
while( 1 )
{
v4 = (struct _EX_RUNDOWN_REF *)v0[14];
if( v4 == (struct _EX_RUNDOWN_REF *)(v0 + 14) )
break;
v5 = v4 - 13;
ExAcquireRundownProtection(v4 - 12);
LODWORD(v4[2].Count) = 2;
v6.Count = v4->Count;
if( *(struct _EX_RUNDOWN_REF **)(v4->Count + 8) != v4
|| (Count = (struct _EX_RUNDOWN_REF **)v4[1].Count, *Count != v4) )
{
__fastfail(3u);
}
*Count = (struct _EX_RUNDOWN_REF *)v6.Count;
v8 = v0 + 10;
*(_QWORD *)(v6.Count + 8) = Count;
Ptr_high = HIDWORD(v5[15].Ptr);
do
{
HIDWORD(v5[15].Ptr) = 0;
if( (_InterlockedExchangeAdd64(v1, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(v0 + 13);
KeAbPostRelease(v0 + 13);
LODWORD(v10) = KeAbPreAcquire(v0 + 10, 0i64, 0i64);
v11 = v10;
if( _InterlockedCompareExchange64(v8, 17i64, 0i64) )
ExfAcquirePushLockSharedEx(v0 + 10, v10, v0 + 10);
if( v11 )
v11[26] |= 1u;
v12 = v5[6].Count;
if( v12 )
v12 &= -(__int64)ExAcquireRundownProtection((PEX_RUNDOWN_REF)(v12 + 8));
v13 = Ptr_high & 0xFFFFFFFE;
if( v12 )
v13 = Ptr_high;
if( (v13 & 1) != 0 )
{
v14 = *(_DWORD *)(v12 + 96);
if( v14 <= LODWORD(v5[12].Count) )
v13 &= ~1u;
else
LODWORD(v5[12].Count) = v14;
}
if( v13 )
{
if( _InterlockedCompareExchange64(v8, 0i64, 17i64) != 17 )
ExfReleasePushLockShared(v0 + 10);
KeAbPostRelease(v0 + 10);
v19 = v5[7].Count ^ 0x41C64E6DA3BC0074i64;
if( v12 )
v15 = *(_QWORD *)(v12 + 64);
else
v15 = 0i64;
if( v12 && (v13 & 1) != 0 )
v16 = *(unsigned int *)(v12 + 96);
else
v16 = 0i64;
((void(__fastcall *)(struct _EX_RUNDOWN_REF *, unsigned __int64 *, _QWORD, __int64, __int64, unsigned __int64))v5[10].Count)(
v5,
&v19,
v13,
v16,
v15,
v5[11].Count);
if( (v13 & 1) != 0 && _InterlockedExchangeAdd((volatile signed __int32 *)(v12 + 164), 0xFFFFFFFF) == 1 )
ExpWnfNotifyNameSubscribers(v12, 8ui64, 0i64, 0i64);
}
else
{
if( _InterlockedCompareExchange64(v8, 0i64, 17i64) != 17 )
ExfReleasePushLockShared(v0 + 10);
KeAbPostRelease(v0 + 10);
}
if( v12 )
ExReleaseRundownProtection((PEX_RUNDOWN_REF)(v12 + 8));
LODWORD(v17) = KeAbPreAcquire(v0 + 13, 0i64, 0i64);
v18 = v17;
if( _interlockedbittestandset64((volatile signed __int32 *)v1, 0i64) )
ExfAcquirePushLockExclusiveEx(v0 + 13, v17, v0 + 13);
if( v18 )
v18[26] |= 1u;
Ptr_high = HIDWORD(v5[15].Ptr);
}
while( Ptr_high );
LODWORD(v5[15].Count) = 0;
ExReleaseRundownProtection(v5 + 1);
}
if( (_InterlockedExchangeAdd64(v1, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(v0 + 13);
KeAbPostRelease(v0 + 13);
}Referenced by:
ExpWnfStartKernelDispatcher
ExpWnfWorkItemRoutine