NtDebugActiveProcess

NTSTATUS __stdcall NtDebugActiveProcess(VOID *ProcessHandle, VOID *DebugObjectHandle){
  char PreviousMode; 
  NTSTATUS result; 
  _ETHREAD *CurrentThread; 
  _EPROCESS *v6; 
  _EPROCESS *Process; 
  int v8; 
  _EWOW64PROCESS *WoW64Process; 
  unsigned __int16 Machine; 
  _EWOW64PROCESS *v11; 
  unsigned __int16 v12; 
  UINT8 v13; 
  _KEVENT *v14; 
  unsigned int v15; 
  UINT64 Tag; 
  _EX_RUNDOWN_REF *pLastThread; 
  _EPROCESS *TargetProcess; 
  PVOID Object; 

  TargetProcess = 0i64;
  PreviousMode = KeGetCurrentThread()->PreviousMode;
  pLastThread = 0i64;
  LODWORD(Tag) = 1332175428;
  result = ObReferenceObjectByHandleWithTag(
             ProcessHandle,
             0x800ui64,
             (_OBJECT_TYPE *)PsProcessType,
             PreviousMode,
             Tag,
             (VOID **)&TargetProcess,
             0i64);
  if( result >= 0 )
  {
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    v6 = TargetProcess;
    Process = CurrentThread->Tcb.ApcState.Process;
    if( TargetProcess == Process || TargetProcess == PsInitialSystemProcess )
    {
      v8 = -1073741790;
    }
    else if( PsTestProtectedProcessIncompatibility(PreviousMode, CurrentThread->Tcb.ApcState.Process, TargetProcess) )
    {
      v8 = -1073740014;
    }
    else if( (*(_BYTE *)&v6->Pcb.SecureState & 1) == 0 || (v8 = PsRequestDebugSecureProcess((__int64)v6, 1u), v8 >= 0) )
    {
      WoW64Process = Process->WoW64Process;
      if( !WoW64Process
        || (Machine = WoW64Process->Machine, Machine != 332) && Machine != 452
        || (v11 = v6->WoW64Process) != 0i64 && ((v12 = v11->Machine, v12 == 332) || v12 == 452) )
      {
        Object = 0i64;
        v8 = ObReferenceObjectByHandle(DebugObjectHandle, 2ui64, DbgkDebugObjectType, PreviousMode, &Object, 0i64);
        if( v8 >= 0 )
        {
          v13 = ExAcquireRundownProtection(&v6->RundownProtect);
          v14 = (_KEVENT *)Object;
          if( v13 )
          {
            v15 = DbgkpPostFakeProcessCreateMessages(v6, (_KEVENT *)Object, &pLastThread);
            v8 = DbgkpSetProcessDebugObject((ULONG_PTR)v6, v14, v15, (_ETHREAD *)pLastThread);
            ExReleaseRundownProtection(&v6->RundownProtect);
          }
          else
          {
            v8 = -1073741558;
          }
          HalPutDmaAdapter((PADAPTER_OBJECT)v14);
        }
      }
      else
      {
        v8 = -1073741637;
      }
    }
    ObfDereferenceObjectWithTag(v6, 0x4F676244ui64);
    return v8;
  }
  return result;
}

Referenced by:

No references.