CmpPostNotify

VOID __stdcall CmpPostNotify(
        CM_NOTIFY_BLOCK *NotifyBlock,
        INT64 Status,
        UINT8 PostListLockHeld,
        LIST_ENTRY *ExternalKeyDeref,
        LIST_ENTRY *ExternalDeferredPostAsync){
  LIST_ENTRY *v6; 
  _LIST_ENTRY *v7; 
  _LIST_ENTRY *p_PostList; 
  unsigned __int64 v9; 
  _LIST_ENTRY *Flink; 
  _LIST_ENTRY *v11; 
  int Blink; 
  INT64 v13; 
  _LIST_ENTRY *v14; 
  _LIST_ENTRY *v15; 
  _LIST_ENTRY *v16; 
  _LIST_ENTRY *v17; 
  _LIST_ENTRY *v18; 
  _LIST_ENTRY *v19; 
  _LIST_ENTRY *v20; 
  _LIST_ENTRY *v21; 
  unsigned __int8 CurrentIrql; 
  _LIST_ENTRY *v23; 
  _LIST_ENTRY *v24; 
  _LIST_ENTRY *v25; 
  __int128 v26; 
  __int128 v27; 
  int v28; 
  _LIST_ENTRY *DelayedDeref; 
  _LIST_ENTRY *DeferredPostAsync; 

  v28 = (int)ExternalKeyDeref;
  v26 = 0i64;
  v27 = 0i64;
  if( !DelayedDeref )
  {
    *((_QWORD *)&v26 + 1) = &v26;
    *(_QWORD *)&v26 = &v26;
  }
  v6 = (LIST_ENTRY *)&v26;
  if( DelayedDeref )
    v6 = DelayedDeref;
  if( !DeferredPostAsync )
  {
    *((_QWORD *)&v27 + 1) = &v27;
    *(_QWORD *)&v27 = &v27;
  }
  v7 = (_LIST_ENTRY *)&v27;
  if( DeferredPostAsync )
    v7 = DeferredPostAsync;
  if( !(_BYTE)ExternalDeferredPostAsync )
  {
    ExAcquireFastMutexUnsafe((PFAST_MUTEX)((char *)&CmpDummyThreadEvent + 800));
    LODWORD(ExternalKeyDeref) = v28;
  }
  p_PostList = &NotifyBlock->PostList;
  if( p_PostList->Flink == p_PostList )
  {
    *((_DWORD *)NotifyBlock + 12) |= 0x80000000;
    if( !(_BYTE)ExternalDeferredPostAsync )
      ExReleaseFastMutexUnsafe((PFAST_MUTEX)((char *)&CmpDummyThreadEvent + 800));
  }
  else
  {
    *((_DWORD *)NotifyBlock + 12) &= ~0x80000000;
LABEL_16:
    v9 = 1i64;
    while( 1 )
    {
      Flink = p_PostList->Flink;
      if( p_PostList->Flink == p_PostList )
        break;
      v11 = Flink->Flink;
      if( Flink->Blink != p_PostList || v11->Blink != Flink )
        goto LABEL_51;
      p_PostList->Flink = v11;
      v11->Blink = p_PostList;
      if( (_DWORD)ExternalKeyDeref != 267 || ((__int64)Flink[3].Blink & 0x10000) != 0 )
      {
        Blink = (int)Flink[3].Blink;
        if( (Blink & 0x10000) == 0 )
        {
          v18 = Flink;
          do
          {
            v19 = v18[2].Flink;
            LODWORD(v19[1].Blink) &= ~0x10000u;
            v18 = v19 - 2;
          }
          while( v18 != Flink );
          LODWORD(Flink[3].Blink) |= 0x10000u;
          Blink = (int)Flink[3].Blink;
        }
        if( (unsigned __int16)Blink != (_DWORD)v9 )
        {
          CmpCancelSubordinatePost((INT64)Flink, (INT64)v6);
          CmpAddToDelayedDeref((INT64)Flink, v13);
          Blink = (int)Flink[3].Blink;
        }
        if( (unsigned __int16)Blink == (_DWORD)v9 )
        {
          v25 = Flink[4].Flink;
          Flink->Flink = 0i64;
          LODWORD(v25[1].Blink) = (_DWORD)ExternalKeyDeref;
          KeSetEvent((PRKEVENT)Flink[4].Flink, 0, 0);
          goto LABEL_31;
        }
        if( (unsigned __int16)Blink == 2 )
        {
          KeInsertQueueApc((INT64)&Flink[4].Flink[1], (unsigned int)ExternalKeyDeref, (INT64)Flink, 0i64);
LABEL_31:
          LODWORD(ExternalKeyDeref) = v28;
          goto LABEL_16;
        }
        if( (unsigned int)(unsigned __int16)Blink - 3 <= (unsigned int)v9 )
        {
          CmpFreeSubordinatePost((INT64)Flink);
          v14 = Flink[1].Blink;
          v15 = Flink + 1;
          v16 = v15->Flink;
          if( v15->Flink->Blink != v15
            || v14->Flink != v15
            || (v14->Flink = v16, v16->Blink = v14, v17 = v7->Blink, v17->Flink != v7) )
          {
LABEL_51:
            __fastfail(3u);
          }
          v15->Flink = v7;
          v15->Blink = v17;
          v17->Flink = v15;
          v7->Blink = v15;
          goto LABEL_31;
        }
      }
      else
      {
        v20 = Flink[2].Flink;
        v21 = Flink[2].Blink;
        if( v20->Blink != &Flink[2] )
          goto LABEL_51;
        if( v21->Flink != &Flink[2] )
          goto LABEL_51;
        v21->Flink = v20;
        v20->Blink = v21;
        CurrentIrql = KeGetCurrentIrql();
        __writecr8(v9);
        v23 = Flink[1].Flink;
        v24 = Flink[1].Blink;
        if( v23->Blink != &Flink[1] || v24->Flink != &Flink[1] )
          goto LABEL_51;
        v24->Flink = v23;
        v23->Blink = v24;
        __writecr8(CurrentIrql);
        if( LODWORD(Flink[3].Blink) != (_DWORD)v9 )
        {
          CmpAddToDelayedDeref((INT64)Flink, (INT64)v6);
          CmpFreePostBlock(Flink);
          goto LABEL_31;
        }
      }
    }
    if( !(_BYTE)ExternalDeferredPostAsync )
      ExReleaseFastMutexUnsafe((PFAST_MUTEX)((char *)&CmpDummyThreadEvent + 800));
    if( !DelayedDeref )
      CmpDelayedDerefKeys(v6);
    if( !DeferredPostAsync )
      CmpSignalDeferredPosts(v7);
  }
}

Referenced by:

CmpCloseKeyObject
CmpFlushNotify
CmpNotifyChangeKey
CmpReportNotifyHelper