EtwpRundownNotifications

VOID __fastcall EtwpRundownNotifications(_EPROCESS *Process, _ETW_REG_ENTRY *RegEntry){
  __int64 v2; 
  _ETHREAD *CurrentThread; 
  UINT64 v5; 
  _ETW_REG_ENTRY **v6; 
  _ETW_REG_ENTRY *Flink; 
  volatile INT32 **v8; 
  _ETW_REG_ENTRY **v9; 
  _ETW_REG_ENTRY ***v10; 
  _QWORD *v11; 
  __int64 v12; 
  PVOID P[2]; 
  v2 = *((_QWORD *)Process + 178);
  if( v2 )
  {
    P[1] = P;
    P[0] = P;
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    --*((_WORD *)CurrentThread + 242);
    v5 = v2 + 16;
    ExAcquirePushLockExclusiveEx(v2 + 16, 0i64);
    v6 = (_ETW_REG_ENTRY **)(v2 + 24);
    Flink = *v6;
    while( Flink != (_ETW_REG_ENTRY *)v6 )
    {
      v9 = (_ETW_REG_ENTRY **)Flink;
      Flink = (_ETW_REG_ENTRY *)Flink->RegList.Flink;
      if( v9[3] == RegEntry )
      {
        if( (_ETW_REG_ENTRY **)Flink->RegList.Blink != v9
          || (v10 = (_ETW_REG_ENTRY ***)v9[1], *v10 != v9)
          || (*v10 = (_ETW_REG_ENTRY **)Flink,
              Flink->RegList.Blink = (_LIST_ENTRY *)v10,
              v11 = P[0],
              *((PVOID **)P[0] + 1) != P) )
        {
LABEL_15:
          __fastfail(3u);
        }
        *v9 = (_ETW_REG_ENTRY *)P[0];
        v9[1] = (_ETW_REG_ENTRY *)P;
        v11[1] = v9;
        P[0] = v9;
      }
    }
    ExReleasePushLockEx(v5, 0i64);
    KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
    while( 1 )
    {
      v8 = (volatile INT32 **)P[0];
      if( P[0] == P )
        break;
      if( *((PVOID **)P[0] + 1) != P )
        goto LABEL_15;
      v12 = *(_QWORD *)P[0];
      if( *(PVOID *)(*(_QWORD *)P[0] + 8i64) != P[0] )
        goto LABEL_15;
      P[0] = *(PVOID *)P[0];
      *(_QWORD *)(v12 + 8) = P;
      EtwpUnreferenceDataBlock(v8[2]);
      EtwpReleaseQueueEntry(v8, 1);
    }
  }
}

Referenced by:

EtwpDeleteRegistrationObject