NtGetNextThread

NTSTATUS __stdcall NtGetNextThread(
        PVOID ProcessHandle,
        PVOID ThreadHandle,
        UINT64 DesiredAccess,
        UINT64 HandleAttributes,
        UINT64 Flags,
        PVOID *NewThreadHandle){
  int v6; 
  KPROCESSOR_MODE v9; 
  __int64 v10; 
  NTSTATUS v11; 
  NTSTATUS AccessState; 
  _DWORD *NextProcessThread; 
  _ETHREAD *CurrentThread; 
  PVOID v15; 
  PVOID v16; 
  bool v17; 
  PVOID Object; 
  UINT64 DesiredAccessa; 
  PVOID v20; 
  void *Handle; 
  _DWORD *v22; 
  PVOID *v23; 
  _ETHREAD *v24; 
  INT64 result[2]; 
  int v26; 
  int v27; 
  __int64 v28[28]; 
  v6 = HandleAttributes;
  LODWORD(DesiredAccessa) = DesiredAccess;
  v23 = NewThreadHandle;
  Object = 0i64;
  v20 = 0i64;
  memset((INT64)result, 0i64);
  memset((INT64)v28, 0i64);
  Handle = 0i64;
  v9 = *((_BYTE *)KeGetCurrentThread() + 562);
  if( v9 )
  {
    v10 = (__int64)NewThreadHandle;
    if( (unsigned __int64)NewThreadHandle >= 0x7FFFFFFF0000i64 )
      v10 = 0x7FFFFFFF0000i64;
    *(_QWORD *)v10 = *(_QWORD *)v10;
  }
  *NewThreadHandle = 0i64;
  if( (_DWORD)Flags )
    return -1073741811;
  v11 = ObReferenceObjectByHandleWithTag(
          ProcessHandle,
          0x400u,
          (POBJECT_TYPE)PsProcessType,
          v9,
          0x6E457350u,
          &Object,
          0i64);
  if( v11 >= 0 )
  {
    if( ThreadHandle )
    {
      AccessState = ObReferenceObjectByHandleWithTag(
                      ThreadHandle,
                      0,
                      (POBJECT_TYPE)PsThreadType,
                      v9,
                      0x6E457350u,
                      &v20,
                      0i64);
      if( AccessState < 0 )
        goto LABEL_26;
      if( *((PVOID *)v20 + 68) != Object )
      {
        ObfDereferenceObjectWithTag(v20, 0x6E457350ui64);
        AccessState = -1073741811;
        goto LABEL_26;
      }
    }
    NextProcessThread = PsGetNextProcessThread((__int64)Object, v20);
    v22 = NextProcessThread;
    if( NextProcessThread )
    {
      v17 = SeSinglePrivilegeCheck(*(_QWORD *)&SeDebugPrivilege, v9) != 0;
      CurrentThread = (_ETHREAD *)KeGetCurrentThread();
      v24 = CurrentThread;
      v15 = Object;
      do
      {
        if( (NextProcessThread[324] & 2) != 0
          || (PsSynchronizeWithThreadInsertion((__int64)NextProcessThread, (__int64)CurrentThread),
              (NextProcessThread[324] & 2) != 0) )
        {
          AccessState = SeCreateAccessState(
                          (_ACCESS_STATE *)result,
                          (_AUX_ACCESS_DATA *)v28,
                          (unsigned int)DesiredAccessa,
                          (_GENERIC_MAPPING *)((char *)PsProcessType + 76));
          if( AccessState < 0 )
            goto LABEL_20;
          if( v17 )
          {
            if( (v26 & 0x2000000) != 0 )
              v27 |= 0x1FFFFFu;
            else
              v27 |= v26;
            v26 = 0;
          }
          AccessState = ObOpenObjectByPointer(
                          NextProcessThread,
                          v6 & (v9 != 0 ? 7666 : 73714),
                          (PACCESS_STATE)result,
                          0,
                          (POBJECT_TYPE)PsThreadType,
                          v9,
                          &Handle);
          SeDeleteAccessState((_ACCESS_STATE *)result);
          if( AccessState >= 0 )
          {
            *v23 = Handle;
            goto LABEL_20;
          }
          if( AccessState != -1073741790 )
            goto LABEL_20;
        }
        NextProcessThread = PsGetNextProcessThread((__int64)v15, NextProcessThread);
        v22 = NextProcessThread;
        CurrentThread = v24;
      }
      while( NextProcessThread );
      AccessState = -2147483622;
LABEL_20:
      ObfDereferenceObjectWithTag(v15, 0x6E457350ui64);
      if( !NextProcessThread )
        return AccessState;
      v16 = NextProcessThread;
LABEL_22:
      ObfDereferenceObjectWithTag(v16, 0x6E457350ui64);
      return AccessState;
    }
    AccessState = -2147483622;
LABEL_26:
    v16 = Object;
    goto LABEL_22;
  }
  return v11;
}

Referenced by:

No references.