KeWakeWaitChain

VOID __fastcall KeWakeWaitChain(_KWAIT_CHAIN *WaitChain, INT64 BoostIncrement, UINT64 Flags){
  _QWORD *Head; 
  unsigned int v4; 
  struct _KPRCB *CurrentPrcb; 
  _QWORD *v6; 
  _QWORD *v7; 
  _KWAIT_BLOCK *v8; 
  _KWAIT_BLOCK *v9; 
  _LIST_ENTRY *Flink; 
  _KWAIT_BLOCK *v11; 
  _LIST_ENTRY *Blink; 
  unsigned __int8 WaitType; 
  bool v14; 
  char v15; 
  _ADJUST_REASON v16; 
  _ETHREAD *Thread; 
  _QWORD *v18; 
  struct _KPRCB *v19; 
  _ETHREAD *CurrentThread; 
  char v21; 
  int v22; 
  _KWAIT_BLOCK **QuantumTarget; 
  _KWAIT_BLOCK *v24; 
  volatile signed __int32 *v25; 
  _QWORD *v26; 
  _QWORD *v27; 
  UINT8 OldIrql; 
  char v30; 
  int v31; 

  v30 = Flags;
  Head = WaitChain->Head;
  v31 = 0;
  v4 = BoostIncrement;
  v27 = WaitChain->Head;
  if( WaitChain->Head )
  {
    OldIrql = KeGetCurrentIrql();
    __writecr8(2ui64);
    CurrentPrcb = KeGetCurrentPrcb();
    v6 = Head;
    do
    {
      v7 = v6;
      v26 = (_QWORD *)*v6;
      v25 = (volatile signed __int32 *)(v6 + 3);
      KiAcquireKobjectLockSafe(v6 + 3);
      v8 = (_KWAIT_BLOCK *)(v7 + 4);
      *((_DWORD *)v7 + 7) = 1;
      v9 = (_KWAIT_BLOCK *)v7[4];
      while( v9 != v8 )
      {
        Flink = v9->WaitListEntry.Flink;
        v11 = v9;
        v9 = (_KWAIT_BLOCK *)Flink;
        v24 = (_KWAIT_BLOCK *)Flink;
        Blink = v11->WaitListEntry.Blink;
        if( (_KWAIT_BLOCK *)Flink->Blink != v11 || (_KWAIT_BLOCK *)Blink->Flink != v11 )
LABEL_6:
          __fastfail(3u);
        Blink->Flink = Flink;
        Flink->Blink = Blink;
        WaitType = v11->WaitType;
        if( WaitType == 1 )
        {
          if( KiTryUnwaitThread(CurrentPrcb, v11, v11->WaitKey, 0i64) )
          {
            v14 = (*((_DWORD *)v7 + 7))-- == 1;
            if( v14 )
              break;
          }
        }
        else if( WaitType == 2 )
        {
          v11->BlockState = 5;
          Thread = v11->Thread;
          v11->WaitListEntry.Flink = 0i64;
          v18 = &Thread->Tcb.gap0[8];
          KeGetCurrentIrql();
          __writecr8(2ui64);
          v19 = KeGetCurrentPrcb();
          CurrentThread = v19->CurrentThread;
          KiAcquireKobjectLockSafe(Thread);
          if( (_QWORD *)*v18 == v18
            || LODWORD(Thread->Tcb.InitialStack) >= HIDWORD(Thread->Tcb.InitialStack)
            || (_ETHREAD *)CurrentThread->Tcb.Queue == Thread && CurrentThread->Tcb.WaitReason == 15
            || (KiWakeQueueWaiter(v19, (_KQUEUE *)Thread, (INT64)v11), !v21) )
          {
            v22 = *(_DWORD *)&Thread->Tcb.gap0[4];
            *(_DWORD *)&Thread->Tcb.gap0[4] = v22 + 1;
            QuantumTarget = (_KWAIT_BLOCK **)Thread->Tcb.QuantumTarget;
            if( *QuantumTarget != (_KWAIT_BLOCK *)&Thread->Tcb.SListFaultAddress )
              goto LABEL_6;
            v11->WaitListEntry.Flink = (_LIST_ENTRY *)&Thread->Tcb.SListFaultAddress;
            v11->WaitListEntry.Blink = (_LIST_ENTRY *)QuantumTarget;
            *QuantumTarget = v11;
            Thread->Tcb.QuantumTarget = (unsigned __int64)v11;
            if( !v22 && (_QWORD *)*v18 != v18 )
              KiWakeOtherQueueWaiters(v19, (_KQUEUE *)Thread);
          }
          _InterlockedAnd((volatile signed __int32 *)Thread, 0xFFFFFF7F);
          v14 = (*((_DWORD *)v7 + 7))-- == 1;
          if( v14 )
            break;
          v9 = v24;
        }
        else
        {
          KiTryUnwaitThread(CurrentPrcb, v11, 256i64, 0i64);
        }
        v8 = (_KWAIT_BLOCK *)(v7 + 4);
      }
      _InterlockedAnd(v25, 0xFFFFFF7F);
      v6 = v26;
      ++v31;
    }
    while( v26 != v27 );
    if( (v30 & 1) != 0 && (KiRemoveBoostThread(CurrentPrcb, CurrentPrcb->CurrentThread), v4) )
    {
      v16 = AdjustBoost;
      if( v15 > (char)v4 )
        v4 = v15;
    }
    else
    {
      v16 = AdjustUnwait;
    }
    if( (v30 & 2) != 0 && v16 == AdjustUnwait )
      v4 = 1;
    KiExitDispatcher(CurrentPrcb, 0i64, v16, v4, OldIrql);
    WaitChain->Head = 0i64;
  }
}

Referenced by:

ExpConvertExclusiveToSharedLite
ExpConvertFastResourceExclusiveToShared
ExpReleaseDisownedFastResourceExclusive
ExpReleaseDisownedFastResourceShared
ExpReleaseFastResourceExclusive
ExpReleaseFastResourceShared
VrpRelinquishDiffHiveEntryTransitionOwner