DbgkpSetProcessDebugObject

INT64 DbgkpSetProcessDebugObject(_EPROCESS *Process, KEVENT *Event, INT64 a3, ...){
  _ETHREAD *CurrentThread; 
  int v4; 
  EX_RUNDOWN_REF *v7; 
  EX_RUNDOWN_REF *NextProcessThread; 
  KEVENT *Flink; 
  __int64 v10; 
  int v11; 
  __int64 v12; 
  __int64 v13; 
  _QWORD *v14; 
  KEVENT **v15; 
  _QWORD *v16; 
  int v17; 
  OBJECT_ATTRIBUTES *v18; 
  UINT64 v19; 
  PVOID *v20; 
  __int64 v21; 
  PVOID Object; 
  _ETHREAD *v24; 
  PKGUARDED_MUTEX Mutex; 
  PVOID P; 
  PVOID *p_P; 
  char v28; 
  char v29; 
  EX_RUNDOWN_REF *v30; 
  va_list va1; 
  va_list va; 
  va_start(va1, a3);
  va_start(va, a3);
  v30 = va_arg(va1, EX_RUNDOWN_REF *);
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  Object = 0i64;
  p_P = &P;
  P = &P;
  v4 = a3;
  v24 = CurrentThread;
  v28 = 1;
  v29 = 0;
  if( (int)a3 >= 0 )
  {
    v7 = v30;
    v4 = 0;
  }
  else
  {
    v7 = 0i64;
    v30 = 0i64;
  }
  if( v4 >= 0 )
  {
    ExAcquireFastMutex(&DbgkpProcessDebugPortMutex);
    while( 1 )
    {
      if( *((_QWORD *)Process + 175) )
      {
        v4 = -1073741752;
        v29 = 1;
        goto LABEL_11;
      }
      *((_QWORD *)Process + 175) = Event;
      ObfReferenceObjectWithTag(v7, 0x4F676244u);
      v29 = 1;
      NextProcessThread = (EX_RUNDOWN_REF *)PsGetNextProcessThread((__int64)Process, v7);
      if( !NextProcessThread )
        goto LABEL_11;
      *((_QWORD *)Process + 175) = 0i64;
      KeReleaseGuardedMutex(&DbgkpProcessDebugPortMutex);
      v29 = 0;
      ObfDereferenceObjectWithTag(v7, 0x4F676244ui64);
      v4 = DbgkpPostFakeThreadMessages(
             (INT64)Process,
             Event,
             NextProcessThread,
             (EX_RUNDOWN_REF **)&Object,
             (EX_RUNDOWN_REF **)va);
      if( v4 < 0 )
        break;
      ObfDereferenceObjectWithTag(Object, 0x4F676244ui64);
      ExAcquireFastMutex(&DbgkpProcessDebugPortMutex);
      v7 = v30;
    }
    v7 = 0i64;
    v30 = 0i64;
  }
LABEL_11:
  Mutex = (PKGUARDED_MUTEX)&Event[1];
  ExAcquireFastMutex((FAST_MUTEX *)&Event[1]);
  if( v4 >= 0 )
  {
    if( (Event[4].Header.LockNV & 1) != 0 )
    {
      *((_QWORD *)Process + 175) = 0i64;
      v4 = -1073740972;
    }
    else
    {
      _InterlockedOr((volatile signed __int32 *)Process + 281, 3u);
      ObfReferenceObject(Event);
      v7 = v30;
    }
  }
  Flink = (KEVENT *)Event[3].Header.WaitListHead.Flink;
  if( Flink == (KEVENT *)&Event[3].Header.WaitListHead )
    goto LABEL_37;
  do
  {
    v10 = (__int64)Flink;
    Flink = *(KEVENT **)&Flink->Header.Lock;
    v11 = *(_DWORD *)(v10 + 76);
    if( (v11 & 4) == 0 || *(_ETHREAD **)(v10 + 80) != CurrentThread )
      continue;
    v12 = *(_QWORD *)(v10 + 64);
    if( v4 < 0 )
    {
      if( Flink->Header.WaitListHead.Flink != (_LIST_ENTRY *)v10
        || (v15 = *(KEVENT ***)(v10 + 8), *v15 != (KEVENT *)v10) )
      {
LABEL_45:
        __fastfail(3u);
      }
      *v15 = Flink;
      Flink->Header.WaitListHead.Flink = (_LIST_ENTRY *)v15;
      goto LABEL_30;
    }
    if( (v11 & 0x10) != 0 )
    {
      _InterlockedOr((volatile signed __int32 *)(v12 + 1296), 0x80u);
      v13 = *(_QWORD *)v10;
      if( *(_QWORD *)(*(_QWORD *)v10 + 8i64) != v10 )
        goto LABEL_45;
      v14 = *(_QWORD **)(v10 + 8);
      if( *v14 != v10 )
        goto LABEL_45;
      *v14 = v13;
      *(_QWORD *)(v13 + 8) = v14;
LABEL_30:
      v16 = p_P;
      if( *p_P != &P )
        goto LABEL_45;
      *(_QWORD *)v10 = &P;
      *(_QWORD *)(v10 + 8) = v16;
      *v16 = v10;
      p_P = (PVOID *)v10;
      goto LABEL_32;
    }
    if( v28 )
    {
      *(_DWORD *)(v10 + 76) = v11 & 0xFFFFFFFB;
      KeSetEvent(Event, 0);
      v28 = 0;
    }
    *(_QWORD *)(v10 + 80) = 0i64;
    _InterlockedOr((volatile signed __int32 *)(v12 + 1296), 0x40u);
LABEL_32:
    v17 = *(_DWORD *)(v10 + 76);
    if( (v17 & 8) != 0 )
    {
      *(_DWORD *)(v10 + 76) = v17 & 0xFFFFFFF7;
      ExReleaseRundownProtection((PEX_RUNDOWN_REF)(v12 + 1272));
    }
    CurrentThread = v24;
  }
  while( Flink != (KEVENT *)&Event[3].Header.WaitListHead );
  v7 = v30;
LABEL_37:
  KeReleaseGuardedMutex(Mutex);
  if( v29 )
    KeReleaseGuardedMutex(&DbgkpProcessDebugPortMutex);
  if( v7 )
    ObfDereferenceObjectWithTag(v7, 0x4F676244ui64);
  while( 1 )
  {
    v20 = (PVOID *)P;
    if( P == &P )
      break;
    if( *((PVOID **)P + 1) != &P )
      goto LABEL_45;
    v21 = *(_QWORD *)P;
    if( *(PVOID *)(*(_QWORD *)P + 8i64) != P )
      goto LABEL_45;
    P = *(PVOID *)P;
    *(_QWORD *)(v21 + 8) = &P;
    DbgkpWakeTarget(v20, (UINT64)&P, v18, v19);
  }
  if( v4 >= 0 )
    DbgkpMarkProcessPeb((PEPROCESS)Process);
  return(unsigned int)v4;
}

Referenced by:

NtDebugActiveProcess