[PATCH 3/3] Kernel32: Fix getting remote process times in GetProcessTimes

brock at polynubstudios.com brock at polynubstudios.com
Wed Feb 19 04:02:04 CST 2020


From: Brock York <twunknown at gmail.com>

-GetProcessTimes would return the current processes cpu and kernel times
 even if the handle was for a different remote process.
-Read the user and kernel times using get_process_times from wineserver
 if the requested process to read from is not the current process. If the
 requested process is the current process then the times(7) syscall
 is used instead as it was before.

Signed-off-by: Brock York <brock at polynubstudios.com>
---
 dlls/kernel32/time.c | 32 ++++++++++++++++++++++++++++++--
 1 file changed, 30 insertions(+), 2 deletions(-)

diff --git a/dlls/kernel32/time.c b/dlls/kernel32/time.c
index 4ebdabf18c..050c8b6b5c 100644
--- a/dlls/kernel32/time.c
+++ b/dlls/kernel32/time.c
@@ -180,7 +180,8 @@ static void TIME_ClockTimeToFileTime(clock_t unix_time, LPFILETIME filetime)
  *  Also, there is a need to separate times used by different applications.
  *
  * BUGS
- *  KernelTime and UserTime are always for the current process
+ *  twunknown at gmail.com:
+ *  Cannot get process time if hprocess handle is for another process and not on Linux
  */
 BOOL WINAPI GetProcessTimes( HANDLE hprocess, LPFILETIME lpCreationTime,
     LPFILETIME lpExitTime, LPFILETIME lpKernelTime, LPFILETIME lpUserTime )
@@ -188,7 +189,34 @@ BOOL WINAPI GetProcessTimes( HANDLE hprocess, LPFILETIME lpCreationTime,
     struct tms tms;
     KERNEL_USER_TIMES pti;
 
-    times(&tms);
+    //CompareObjectHandles is a Window 10 thing so this should suffice
+    //If process is current process then just use times syscall
+    if (hprocess == GetCurrentProcess())
+        times(&tms);
+#ifdef linux
+    else
+    {
+        SERVER_START_REQ( get_process_time )
+        {
+            req->handle = wine_server_obj_handle( hprocess );
+            if (wine_server_call( req ) == STATUS_SUCCESS)
+            {
+                tms.tms_utime = reply->utime;
+                tms.tms_stime = reply->stime;
+            }
+            else
+                return FALSE;
+        }
+        SERVER_END_REQ;
+    }
+#else //If not on linux we can't get another processes time, so return failure
+    else
+    {
+        FIXME("Cannot get process time for another process on non linux OS\n");
+        return FALSE;
+    }
+#endif
+
     TIME_ClockTimeToFileTime(tms.tms_utime,lpUserTime);
     TIME_ClockTimeToFileTime(tms.tms_stime,lpKernelTime);
     if (NtQueryInformationProcess( hprocess, ProcessTimes, &pti, sizeof(pti), NULL))
-- 
2.25.0




More information about the wine-devel mailing list