ExpWnfDispatchKernelSubscription

VOID __stdcall ExpWnfDispatchKernelSubscription(){
  _EX_PUSH_LOCK *WnfContext; 
  volatile signed __int64 *p_bf_0; 
  _BYTE *v2; 
  _BYTE *v3; 
  _EX_RUNDOWN_REF *bf_0; 
  _EX_RUNDOWN_REF *v5; 
  _EX_RUNDOWN_REF v6; 
  _EX_RUNDOWN_REF **Count; 
  volatile signed __int64 *v8; 
  unsigned int Ptr_high; 
  _BYTE *v10; 
  unsigned __int64 v11; 
  unsigned int v12; 
  unsigned int v13; 
  const _WNF_TYPE_ID *v14; 
  __int64 v15; 
  _BYTE *v16; 
  _BYTE *v17; 
  unsigned __int64 v18; 

  v18 = 0i64;
  WnfContext = (_EX_PUSH_LOCK *)PsInitialSystemProcess->WnfContext;
  p_bf_0 = &WnfContext[13]._bf_0;
  v2 = KeAbPreAcquire(&WnfContext[13], 0i64, 0i64);
  v3 = v2;
  if( _interlockedbittestandset64((volatile signed __int32 *)&WnfContext[13], 0i64) )
    ExfAcquirePushLockExclusiveEx(WnfContext + 13, v2, &WnfContext[13]);
  if( v3 )
    v3[26] |= 1u;
  while( 1 )
  {
    bf_0 = (_EX_RUNDOWN_REF *)WnfContext[14]._bf_0;
    if( bf_0 == (_EX_RUNDOWN_REF *)&WnfContext[14] )
      break;
    v5 = bf_0 - 13;
    ExAcquireRundownProtection(bf_0 - 12);
    LODWORD(bf_0[2].Count) = 2;
    v6.Count = bf_0->Count;
    if( *(_EX_RUNDOWN_REF **)(bf_0->Count + 8) != bf_0 || (Count = (_EX_RUNDOWN_REF **)bf_0[1].Count, *Count != bf_0) )
      __fastfail(3u);
    *Count = (_EX_RUNDOWN_REF *)v6.Count;
    v8 = &WnfContext[10]._bf_0;
    *(_QWORD *)(v6.Count + 8) = Count;
    Ptr_high = HIDWORD(v5[15].Ptr);
    do
    {
      HIDWORD(v5[15].Ptr) = 0;
      if( (_InterlockedExchangeAdd64(p_bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
        ExfTryToWakePushLock(WnfContext + 13);
      KeAbPostRelease(&WnfContext[13]);
      v10 = KeAbPreAcquire(&WnfContext[10], 0i64, 0i64);
      if( _InterlockedCompareExchange64(v8, 17i64, 0i64) )
        ExfAcquirePushLockSharedEx(WnfContext + 10, v10, &WnfContext[10]);
      if( v10 )
        v10[26] |= 1u;
      v11 = v5[6].Count;
      if( v11 )
        v11 &= -(__int64)(ExAcquireRundownProtection((_EX_RUNDOWN_REF *)(v11 + 8)) != 0);
      v12 = Ptr_high & 0xFFFFFFFE;
      if( v11 )
        v12 = Ptr_high;
      if( (v12 & 1) != 0 )
      {
        v13 = *(_DWORD *)(v11 + 96);
        if( v13 <= LODWORD(v5[12].Count) )
          v12 &= ~1u;
        else
          LODWORD(v5[12].Count) = v13;
      }
      if( v12 )
      {
        if( _InterlockedCompareExchange64(v8, 0i64, 17i64) != 17 )
          ExfReleasePushLockShared(WnfContext + 10);
        KeAbPostRelease(&WnfContext[10]);
        v18 = v5[7].Count ^ 0x41C64E6DA3BC0074i64;
        if( v11 )
          v14 = *(const _WNF_TYPE_ID **)(v11 + 64);
        else
          v14 = 0i64;
        if( v11 && (v12 & 1) != 0 )
          v15 = *(unsigned int *)(v11 + 96);
        else
          v15 = 0i64;
        ((void(__fastcall *)(_EX_RUNDOWN_REF *, unsigned __int64 *, _QWORD, __int64, const _WNF_TYPE_ID *, unsigned __int64))v5[10].Count)(
          v5,
          &v18,
          v12,
          v15,
          v14,
          v5[11].Count);
        if( (v12 & 1) != 0 && _InterlockedExchangeAdd((volatile signed __int32 *)(v11 + 164), 0xFFFFFFFF) == 1 )
          ExpWnfNotifyNameSubscribers((_WNF_NAME_INSTANCE *)v11, 8ui64, 0i64, 0i64);
      }
      else
      {
        if( _InterlockedCompareExchange64(v8, 0i64, 17i64) != 17 )
          ExfReleasePushLockShared(WnfContext + 10);
        KeAbPostRelease(&WnfContext[10]);
      }
      if( v11 )
        ExReleaseRundownProtection((_EX_RUNDOWN_REF *)(v11 + 8));
      v16 = KeAbPreAcquire(&WnfContext[13], 0i64, 0i64);
      v17 = v16;
      if( _interlockedbittestandset64((volatile signed __int32 *)p_bf_0, 0i64) )
        ExfAcquirePushLockExclusiveEx(WnfContext + 13, v16, &WnfContext[13]);
      if( v17 )
        v17[26] |= 1u;
      Ptr_high = HIDWORD(v5[15].Ptr);
    }
    while( Ptr_high );
    LODWORD(v5[15].Count) = 0;
    ExReleaseRundownProtection(v5 + 1);
  }
  if( (_InterlockedExchangeAdd64(p_bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock(WnfContext + 13);
  KeAbPostRelease(&WnfContext[13]);
}

Referenced by:

ExpWnfStartKernelDispatcher
ExpWnfWorkItemRoutine