NtGetNextThread

NTSTATUS __stdcall NtGetNextThread(
        VOID *ProcessHandle,
        VOID *ThreadHandle,
        UINT64 DesiredAccess,
        UINT64 HandleAttributes,
        UINT64 Flags,
        VOID **NewThreadHandle){
  int v6; 
  char PreviousMode; 
  __int64 v10; 
  NTSTATUS result; 
  int v12; 
  _ETHREAD *NextProcessThread; 
  _ETHREAD *CurrentThread; 
  _EPROCESS *v15; 
  VOID *v16; 
  UINT64 Tag; 
  UINT64 Taga; 
  _KPROCESSOR_MODE Object; 
  bool v20; 
  PVOID v21; 
  UINT64 DesiredAccessa; 
  PVOID v23; 
  VOID *Handle; 
  _ETHREAD *v25; 
  VOID **v26; 
  _ETHREAD *v27; 
  int v28[40]; 
  _AUX_ACCESS_DATA AuxData; 

  v6 = HandleAttributes;
  LODWORD(DesiredAccessa) = DesiredAccess;
  v26 = NewThreadHandle;
  v21 = 0i64;
  v23 = 0i64;
  memset(v28, 0i64, sizeof(v28));
  memset(&AuxData, 0i64, sizeof(AuxData));
  Handle = 0i64;
  PreviousMode = KeGetCurrentThread()->PreviousMode;
  if( PreviousMode )
  {
    v10 = (__int64)NewThreadHandle;
    if( (unsigned __int64)NewThreadHandle >= 0x7FFFFFFF0000i64 )
      v10 = 0x7FFFFFFF0000i64;
    *(_QWORD *)v10 = *(_QWORD *)v10;
  }
  *NewThreadHandle = 0i64;
  if( (_DWORD)Flags )
    return -1073741811;
  LODWORD(Tag) = 1850045264;
  result = ObReferenceObjectByHandleWithTag(
             ProcessHandle,
             0x400ui64,
             (_OBJECT_TYPE *)PsProcessType,
             PreviousMode,
             Tag,
             &v21,
             0i64);
  if( result >= 0 )
  {
    if( ThreadHandle )
    {
      LODWORD(Taga) = 1850045264;
      v12 = ObReferenceObjectByHandleWithTag(
              ThreadHandle,
              0i64,
              (_OBJECT_TYPE *)PsThreadType,
              PreviousMode,
              Taga,
              &v23,
              0i64);
      if( v12 < 0 )
        goto LABEL_26;
      if( *((PVOID *)v23 + 68) != v21 )
      {
        ObfDereferenceObjectWithTag(v23, 0x6E457350ui64);
        v12 = -1073741811;
        goto LABEL_26;
      }
    }
    NextProcessThread = (_ETHREAD *)PsGetNextProcessThread((_EPROCESS *)v21, (_ETHREAD *)v23);
    v25 = NextProcessThread;
    if( NextProcessThread )
    {
      v20 = SeSinglePrivilegeCheck(*(_QWORD *)&SeDebugPrivilege, PreviousMode) != 0;
      CurrentThread = (_ETHREAD *)KeGetCurrentThread();
      v27 = CurrentThread;
      v15 = (_EPROCESS *)v21;
      do
      {
        if( (NextProcessThread->CrossThreadFlags & 2) != 0
          || (PsSynchronizeWithThreadInsertion(NextProcessThread, CurrentThread),
              (NextProcessThread->CrossThreadFlags & 2) != 0) )
        {
          v12 = SeCreateAccessState(
                  (_ACCESS_STATE *)v28,
                  &AuxData,
                  (unsigned int)DesiredAccessa,
                  (_GENERIC_MAPPING *)((char *)PsProcessType + 76));
          if( v12 < 0 )
            goto LABEL_20;
          if( v20 )
          {
            if( (v28[4] & 0x2000000) != 0 )
              v28[5] |= 0x1FFFFFu;
            else
              v28[5] |= v28[4];
            v28[4] = 0;
          }
          LOBYTE(Object) = PreviousMode;
          v12 = ObOpenObjectByPointer(
                  NextProcessThread,
                  v6 & (PreviousMode != 0 ? 7666 : 73714),
                  (PACCESS_STATE)v28,
                  0,
                  (POBJECT_TYPE)PsThreadType,
                  Object,
                  &Handle);
          SeDeleteAccessState((_ACCESS_STATE *)v28);
          if( v12 >= 0 )
          {
            *v26 = Handle;
            goto LABEL_20;
          }
          if( v12 != -1073741790 )
            goto LABEL_20;
        }
        NextProcessThread = (_ETHREAD *)PsGetNextProcessThread(v15, NextProcessThread);
        v25 = NextProcessThread;
        CurrentThread = v27;
      }
      while( NextProcessThread );
      v12 = -2147483622;
LABEL_20:
      ObfDereferenceObjectWithTag(v15, 0x6E457350ui64);
      if( !NextProcessThread )
        return v12;
      v16 = NextProcessThread;
LABEL_22:
      ObfDereferenceObjectWithTag(v16, 0x6E457350ui64);
      return v12;
    }
    v12 = -2147483622;
LABEL_26:
    v16 = v21;
    goto LABEL_22;
  }
  return result;
}

Referenced by:

No references.