From 6c3b7e0065c239b488bb224c1c67ff971562fdca Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
Date: Thu, 9 Mar 2017 21:14:13 +0100
Subject: ntdll: Fill out thread times in process enumeration.

---
 dlls/ntdll/nt.c     | 6 ++++++
 server/protocol.def | 1 +
 server/snapshot.c   | 1 +
 server/thread.h     | 1 +
 4 files changed, 9 insertions(+)

diff --git a/dlls/ntdll/nt.c b/dlls/ntdll/nt.c
index 8c54e7edfb..8b84cd865b 100644
--- a/dlls/ntdll/nt.c
+++ b/dlls/ntdll/nt.c
@@ -1928,6 +1928,7 @@ NTSTATUS WINAPI NtQuerySystemInformation(
             WCHAR* exename;
             DWORD wlen = 0;
             DWORD procstructlen = 0;
+            int unix_pid = -1;
 
             SERVER_START_REQ( create_snapshot )
             {
@@ -1982,6 +1983,7 @@ NTSTATUS WINAPI NtQuerySystemInformation(
                             if (reply->unix_pid != -1)
                                 read_process_time(reply->unix_pid, -1, clk_tck,
                                                   &spi->KernelTime, &spi->UserTime);
+                            unix_pid = reply->unix_pid;
                         }
                         len += procstructlen;
                     }
@@ -2022,6 +2024,10 @@ NTSTATUS WINAPI NtQuerySystemInformation(
                                     spi->ti[i].ClientId.UniqueThread  = UlongToHandle(reply->tid);
                                     spi->ti[i].dwCurrentPriority = reply->base_pri + reply->delta_pri;
                                     spi->ti[i].dwBasePriority = reply->base_pri;
+
+                                    if (unix_pid != -1 && reply->unix_tid != -1)
+                                        read_process_time(unix_pid, reply->unix_tid, clk_tck,
+                                                          &spi->ti[i].KernelTime, &spi->ti[i].UserTime);
                                     i++;
                                 }
                             }
diff --git a/server/protocol.def b/server/protocol.def
index b0b837cb93..542060decd 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -1789,6 +1789,7 @@ enum char_info_mode
     timeout_t    creation_time; /* thread creation time */
     int          base_pri;      /* base priority */
     int          delta_pri;     /* delta priority */
+    int          unix_tid;      /* Unix tid */
 @END
 
 
diff --git a/server/snapshot.c b/server/snapshot.c
index cc8a9be1b5..a32207c720 100644
--- a/server/snapshot.c
+++ b/server/snapshot.c
@@ -151,6 +151,7 @@ static int snapshot_next_thread( struct snapshot *snapshot, struct next_thread_r
     reply->creation_time = get_thread_creation_time( ptr->thread );
     reply->base_pri      = ptr->priority;
     reply->delta_pri     = 0;  /* FIXME */
+    reply->unix_tid      = get_thread_unix_tid( ptr->thread );
     return 1;
 }
 
diff --git a/server/thread.h b/server/thread.h
index 2098c76a47..9614e2140d 100644
--- a/server/thread.h
+++ b/server/thread.h
@@ -145,6 +145,7 @@ static inline void clear_error(void)             { set_error(0); }
 static inline void set_win32_error( unsigned int err ) { set_error( 0xc0010000 | err ); }
 
 static inline thread_id_t get_thread_id( struct thread *thread ) { return thread->id; }
+static inline int get_thread_unix_tid( struct thread *thread ) { return thread->unix_tid; }
 static inline timeout_t get_thread_creation_time( struct thread *thread ) { return thread->creation_time; }
 
 #endif  /* __WINE_SERVER_THREAD_H */
-- 
2.11.0

