ExpWnfDeleteSubscription

VOID __stdcall ExpWnfDeleteSubscription(VOID *Subscription, PEPROCESS Process){
  _EX_PUSH_LOCK *WnfContext; 
  int v4; 
  _BYTE *v5; 
  _BYTE *v6; 
  _WNF_NAME_INSTANCE *v7; 
  int v8; 
  _BYTE *v9; 
  _BYTE *v10; 
  VOID **v11; 
  VOID **v12; 
  int v13; 
  VOID **v14; 
  VOID **v15; 
  _BYTE *v16; 
  _BYTE *v17; 
  int v18; 
  int v19; 
  VOID **v20; 
  VOID **v21; 
  _BOOL4 v23; 

  WnfContext = (_EX_PUSH_LOCK *)Process->WnfContext;
  v4 = 1;
  if( WnfContext )
  {
    v5 = KeAbPreAcquire(&WnfContext[10], 0i64, 0i64);
    v6 = v5;
    if( _interlockedbittestandset64((volatile signed __int32 *)&WnfContext[10], 0i64) )
      ExfAcquirePushLockExclusiveEx(WnfContext + 10, v5, &WnfContext[10]);
    if( v6 )
      v6[26] |= 1u;
  }
  if( !*((_QWORD *)Subscription + 5) )
  {
    v4 = 0;
    goto LABEL_42;
  }
  v7 = (_WNF_NAME_INSTANCE *)*((_QWORD *)Subscription + 6);
  v8 = 0;
  v23 = 0;
  if( v7 )
  {
    v9 = KeAbPreAcquire(&v7->StateSubscriptionListLock, 0i64, 0i64);
    v10 = v9;
    if( _interlockedbittestandset64((volatile signed __int32 *)&v7->StateSubscriptionListLock, 0i64) )
      ExfAcquirePushLockExclusiveEx(&v7->StateSubscriptionListLock.PushLock, v9, &v7->StateSubscriptionListLock);
    if( v10 )
      v10[26] |= 1u;
    v11 = (VOID **)*((_QWORD *)Subscription + 8);
    if( v11[1] != (char *)Subscription + 64 )
      goto LABEL_60;
    v12 = (VOID **)*((_QWORD *)Subscription + 9);
    if( *v12 != (char *)Subscription + 64 )
      goto LABEL_60;
    *v12 = v11;
    v11[1] = v12;
    v13 = *((_DWORD *)Subscription + 25);
    *((_QWORD *)Subscription + 6) = 0i64;
    if( (v13 & 1) != 0 )
      v23 = _InterlockedExchangeAdd(&v7->DataSubscribersCount, 0xFFFFFFFF) == 1;
  }
  v14 = (VOID **)*((_QWORD *)Subscription + 3);
  if( v14[1] != (char *)Subscription + 24 )
    goto LABEL_60;
  v15 = (VOID **)*((_QWORD *)Subscription + 4);
  if( *v15 != (char *)Subscription + 24 )
    goto LABEL_60;
  *v15 = v14;
  v14[1] = v15;
  v16 = KeAbPreAcquire(&WnfContext[13], 0i64, 0i64);
  v17 = v16;
  if( _interlockedbittestandset64((volatile signed __int32 *)&WnfContext[13], 0i64) )
    ExfAcquirePushLockExclusiveEx(WnfContext + 13, v16, &WnfContext[13]);
  if( v17 )
    v17[26] |= 1u;
  v18 = *((_DWORD *)Subscription + 30);
  if( v18 != 1 && (*((PEPROCESS *)Subscription + 5) == PsInitialSystemProcess || !v18) )
    goto LABEL_25;
  v20 = (VOID **)*((_QWORD *)Subscription + 13);
  if( v20[1] != (char *)Subscription + 104
    || (v21 = (VOID **)*((_QWORD *)Subscription + 14), *v21 != (char *)Subscription + 104) )
  {
LABEL_60:
    __fastfail(3u);
  }
  *v21 = v20;
  v20[1] = v21;
  if( v7
    && (*((_BYTE *)Subscription + 100) & 1) != 0
    && ((*((_BYTE *)Subscription + 124) & 1) != 0 || (*((_BYTE *)Subscription + 128) & 1) != 0) )
  {
    LOBYTE(v8) = _InterlockedExchangeAdd(&v7->CurrentDeliveryCount, 0xFFFFFFFF) == 1;
  }
LABEL_25:
  *((_QWORD *)Subscription + 5) = 0i64;
  if( (_InterlockedExchangeAdd64(&WnfContext[13]._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock(WnfContext + 13);
  KeAbPostRelease(&WnfContext[13]);
  if( v7 )
  {
    v19 = 0;
    if( v23 || v8 )
    {
      if( ExAcquireRundownProtection(&v7->RunRef) )
      {
        v19 = 1;
      }
      else
      {
        v23 = 0;
        v8 = 0;
      }
    }
    if( (_InterlockedExchangeAdd64(&v7->StateSubscriptionListLock.PushLock._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock(&v7->StateSubscriptionListLock.PushLock);
    KeAbPostRelease(&v7->StateSubscriptionListLock);
    if( WnfContext )
    {
      if( (_InterlockedExchangeAdd64(&WnfContext[10]._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
        ExfTryToWakePushLock(WnfContext + 10);
      KeAbPostRelease(&WnfContext[10]);
      WnfContext = 0i64;
    }
    if( v8 )
      ExpWnfNotifyNameSubscribers(v7, 8ui64, 1ui64, Process != PsInitialSystemProcess);
    if( v23 )
      ExpWnfNotifyNameSubscribers(v7, 4ui64, 1ui64, Process != PsInitialSystemProcess);
    if( v19 )
      ExReleaseRundownProtection(&v7->RunRef);
  }
LABEL_42:
  if( WnfContext )
  {
    if( (_InterlockedExchangeAdd64(&WnfContext[10]._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock(WnfContext + 10);
    KeAbPostRelease(&WnfContext[10]);
  }
  ExReleaseRundownProtection((_EX_RUNDOWN_REF *)Subscription + 1);
  if( v4 )
  {
    ExWaitForRundownProtectionRelease((_EX_RUNDOWN_REF *)Subscription + 1);
    ExFreePoolWithTag(Subscription, 0x20666E57u);
  }
}

Referenced by:

ExUnsubscribeWnfStateChange
ExpWnfDeleteProcessContext
NtUnsubscribeWnfStateChange