KeSetProcess

VOID __stdcall KeSetProcess(){
  _QWORD *v0; 
  _QWORD *v1; 
  _KPRCB *CurrentPrcb; 
  _KWAIT_BLOCK *v3; 
  _KWAIT_BLOCK *Flink; 
  _KWAIT_BLOCK *v5; 
  unsigned __int8 WaitType; 
  INT64 WaitKey; 
  _ETHREAD *Thread; 
  _QWORD *v9; 
  struct _KPRCB *v10; 
  _ETHREAD *CurrentThread; 
  int v12; 
  _KWAIT_BLOCK **QuantumTarget; 
  char v14; 
  _KPRCB *v15; 
  UINT8 OldIrql; 

  v1 = v0;
  OldIrql = KeGetCurrentIrql();
  __writecr8(2ui64);
  CurrentPrcb = KeGetCurrentPrcb();
  v15 = CurrentPrcb;
  KiAcquireKobjectLockSafe(v0);
  v3 = (_KWAIT_BLOCK *)(v1 + 1);
  Flink = (_KWAIT_BLOCK *)v1[1];
  *((_DWORD *)v1 + 1) = 1;
  while( Flink != v3 )
  {
    v5 = Flink;
    Flink = (_KWAIT_BLOCK *)Flink->WaitListEntry.Flink;
    WaitType = v5->WaitType;
    if( WaitType == 1 )
    {
      WaitKey = v5->WaitKey;
      goto LABEL_6;
    }
    if( WaitType == 2 )
    {
      v5->BlockState = 5;
      Thread = v5->Thread;
      v5->WaitListEntry.Flink = 0i64;
      v9 = &Thread->Tcb.gap0[8];
      KeGetCurrentIrql();
      __writecr8(2ui64);
      v10 = KeGetCurrentPrcb();
      CurrentThread = v10->CurrentThread;
      KiAcquireKobjectLockSafe(Thread);
      if( (_QWORD *)*v9 == v9
        || LODWORD(Thread->Tcb.InitialStack) >= HIDWORD(Thread->Tcb.InitialStack)
        || (_ETHREAD *)CurrentThread->Tcb.Queue == Thread && CurrentThread->Tcb.WaitReason == 15
        || (KiWakeQueueWaiter(v10, (_KQUEUE *)Thread, (INT64)v5), !v14) )
      {
        v12 = *(_DWORD *)&Thread->Tcb.gap0[4];
        *(_DWORD *)&Thread->Tcb.gap0[4] = v12 + 1;
        QuantumTarget = (_KWAIT_BLOCK **)Thread->Tcb.QuantumTarget;
        if( *QuantumTarget != (_KWAIT_BLOCK *)&Thread->Tcb.SListFaultAddress )
          __fastfail(3u);
        v5->WaitListEntry.Flink = (_LIST_ENTRY *)&Thread->Tcb.SListFaultAddress;
        v5->WaitListEntry.Blink = (_LIST_ENTRY *)QuantumTarget;
        *QuantumTarget = v5;
        Thread->Tcb.QuantumTarget = (unsigned __int64)v5;
        if( !v12 && (_QWORD *)*v9 != v9 )
          KiWakeOtherQueueWaiters(v10, (_KQUEUE *)Thread);
      }
      _InterlockedAnd((volatile signed __int32 *)Thread, 0xFFFFFF7F);
      CurrentPrcb = v15;
    }
    else
    {
      WaitKey = 256i64;
LABEL_6:
      KiTryUnwaitThread(CurrentPrcb, v5, WaitKey, 0i64);
    }
  }
  v1[2] = v1 + 1;
  v3->WaitListEntry.Flink = &v3->WaitListEntry;
  _InterlockedAnd((volatile signed __int32 *)v1, 0xFFFFFF7F);
  KiExitDispatcher(CurrentPrcb, 0i64, AdjustUnwait, 0i64, OldIrql);
}

Referenced by:

PspRundownSingleProcess