KeSetProcess

NTSTATUS __stdcall KeSetProcess(_EPROCESS *Process){
  _KPRCB *CurrentPrcb; 
  _KWAIT_BLOCK *v3; 
  _KWAIT_BLOCK *Flink; 
  _KWAIT_BLOCK *v6; 
  unsigned __int8 WaitType; 
  INT64 WaitKey; 
  _KQUEUE *NotificationQueue; 
  _LIST_ENTRY *p_WaitListHead; 
  struct _KPRCB *v11; 
  __int64 v12; 
  int SignalState; 
  _LIST_ENTRY *Blink; 
  NTSTATUS v15; 
  _KPRCB *v16; 
  UINT8 OldIrql; 
  OldIrql = KeGetCurrentIrql();
  __writecr8(2ui64);
  CurrentPrcb = KeGetCurrentPrcb();
  v16 = CurrentPrcb;
  KiAcquireKobjectLockSafe(Process);
  v3 = (_KWAIT_BLOCK *)((char *)Process + 8);
  Flink = (_KWAIT_BLOCK *)*((_QWORD *)Process + 1);
  v15 = *((_DWORD *)Process + 1);
  *((_DWORD *)Process + 1) = 1;
  while( Flink != v3 )
  {
    v6 = Flink;
    Flink = (_KWAIT_BLOCK *)Flink->WaitListEntry.Flink;
    WaitType = v6->WaitType;
    if( WaitType == 1 )
    {
      WaitKey = v6->WaitKey;
      goto LABEL_6;
    }
    if( WaitType == 2 )
    {
      v6->BlockState = 5;
      NotificationQueue = v6->NotificationQueue;
      v6->WaitListEntry.Flink = 0i64;
      p_WaitListHead = &NotificationQueue->Header.WaitListHead;
      KeGetCurrentIrql();
      __writecr8(2ui64);
      v11 = KeGetCurrentPrcb();
      v12 = *((_QWORD *)v11 + 1);
      KiAcquireKobjectLockSafe(NotificationQueue);
      if( p_WaitListHead->Flink == p_WaitListHead
        || NotificationQueue->CurrentCount >= NotificationQueue->MaximumCount
        || *(_KQUEUE **)(v12 + 232) == NotificationQueue && *(_BYTE *)(v12 + 643) == 15
        || !KiWakeQueueWaiter(v11, NotificationQueue, (INT64)v6) )
      {
        SignalState = NotificationQueue->Header.SignalState;
        NotificationQueue->Header.SignalState = SignalState + 1;
        Blink = NotificationQueue->EntryListHead.Blink;
        if( Blink->Flink != &NotificationQueue->EntryListHead )
          __fastfail(3u);
        v6->WaitListEntry.Flink = &NotificationQueue->EntryListHead;
        v6->WaitListEntry.Blink = Blink;
        Blink->Flink = &v6->WaitListEntry;
        NotificationQueue->EntryListHead.Blink = &v6->WaitListEntry;
        if( !SignalState && p_WaitListHead->Flink != p_WaitListHead )
          KiWakeOtherQueueWaiters(v11, NotificationQueue);
      }
      _InterlockedAnd(&NotificationQueue->Header.Lock, 0xFFFFFF7F);
      CurrentPrcb = v16;
    }
    else
    {
      WaitKey = 256i64;
LABEL_6:
      KiTryUnwaitThread(CurrentPrcb, v6, WaitKey, 0i64);
    }
  }
  *((_QWORD *)Process + 2) = (char *)Process + 8;
  v3->WaitListEntry.Flink = &v3->WaitListEntry;
  _InterlockedAnd((volatile signed __int32 *)Process, 0xFFFFFF7F);
  KiExitDispatcher(CurrentPrcb, 0i64, AdjustUnwait, 0i64, OldIrql);
  return v15;
}

Referenced by:

PspRundownSingleProcess