Stefan Siebert : ntdll: Implementation of process CreationTime and ExitTime .

Alexandre Julliard julliard at wine.codeweavers.com
Fri Jul 21 13:49:19 CDT 2006


Module: wine
Branch: refs/heads/master
Commit: 026dd2d88ad1070cc990925a00f11fa8488fe651
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=026dd2d88ad1070cc990925a00f11fa8488fe651

Author: Stefan Siebert <stefan.siebert at web.de>
Date:   Thu Jul 20 23:30:04 2006 +0200

ntdll: Implementation of process CreationTime and ExitTime.

---

 dlls/kernel/time.c             |    7 ++++++-
 dlls/ntdll/process.c           |   13 ++++++++++++-
 include/wine/server_protocol.h |    4 +++-
 server/process.c               |    4 ++++
 server/protocol.def            |    2 ++
 server/trace.c                 |    7 ++++++-
 6 files changed, 33 insertions(+), 4 deletions(-)

diff --git a/dlls/kernel/time.c b/dlls/kernel/time.c
index ae06aa3..0768266 100644
--- a/dlls/kernel/time.c
+++ b/dlls/kernel/time.c
@@ -575,16 +575,21 @@ static void TIME_ClockTimeToFileTime(clo
  *  Also, there is a need to separate times used by different applications.
  *
  * BUGS
- *  lpCreationTime and lpExitTime are not initialised in the Wine implementation.
+ *  KernelTime and UserTime are always for the current process
  */
 BOOL WINAPI GetProcessTimes( HANDLE hprocess, LPFILETIME lpCreationTime,
     LPFILETIME lpExitTime, LPFILETIME lpKernelTime, LPFILETIME lpUserTime )
 {
     struct tms tms;
+    KERNEL_USER_TIMES pti;
 
     times(&tms);
     TIME_ClockTimeToFileTime(tms.tms_utime,lpUserTime);
     TIME_ClockTimeToFileTime(tms.tms_stime,lpKernelTime);
+    if (NtQueryInformationProcess( hprocess, ProcessTimes, &pti, sizeof(pti), NULL))
+        return FALSE;
+    LL2FILETIME( pti.CreateTime.QuadPart, lpCreationTime);
+    LL2FILETIME( pti.ExitTime.QuadPart, lpExitTime);
     return TRUE;
 }
 
diff --git a/dlls/ntdll/process.c b/dlls/ntdll/process.c
index 433e6d9..c187086 100644
--- a/dlls/ntdll/process.c
+++ b/dlls/ntdll/process.c
@@ -228,9 +228,20 @@ NTSTATUS WINAPI NtQueryInformationProces
                     ret = STATUS_INVALID_HANDLE;
                 else
                 {
-                    /* FIXME : real data */
+                    /* FIXME : User- and KernelTime have to be implemented */
                     memset(&pti, 0, sizeof(KERNEL_USER_TIMES));
 
+                    SERVER_START_REQ(get_process_info)
+                    {
+                      req->handle = ProcessHandle;
+                      if ((ret = wine_server_call( req )) == STATUS_SUCCESS)
+                      {
+                          NTDLL_from_server_timeout(&pti.CreateTime, &reply->start_time);
+                          NTDLL_from_server_timeout(&pti.ExitTime, &reply->end_time);
+                      }
+                    }
+                    SERVER_END_REQ;
+
                     memcpy(ProcessInformation, &pti, sizeof(KERNEL_USER_TIMES));
 
                     len = sizeof(KERNEL_USER_TIMES);
diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h
index 2755827..6186fb8 100644
--- a/include/wine/server_protocol.h
+++ b/include/wine/server_protocol.h
@@ -347,6 +347,8 @@ struct get_process_info_reply
     int          priority;
     int          affinity;
     void*        peb;
+    abs_time_t   start_time;
+    abs_time_t   end_time;
 };
 
 
@@ -4383,6 +4385,6 @@ union generic_reply
     struct query_symlink_reply query_symlink_reply;
 };
 
-#define SERVER_PROTOCOL_VERSION 238
+#define SERVER_PROTOCOL_VERSION 239
 
 #endif /* __WINE_WINE_SERVER_PROTOCOL_H */
diff --git a/server/process.c b/server/process.c
index 231eb2f..a73aa66 100644
--- a/server/process.c
+++ b/server/process.c
@@ -924,6 +924,10 @@ DECL_HANDLER(get_process_info)
         reply->priority         = process->priority;
         reply->affinity         = process->affinity;
         reply->peb              = process->peb;
+        reply->start_time.sec   = process->start_time.tv_sec;
+        reply->start_time.usec  = process->start_time.tv_usec;
+        reply->end_time.sec     = process->end_time.tv_sec;
+        reply->end_time.usec    = process->end_time.tv_usec;
         release_object( process );
     }
 }
diff --git a/server/protocol.def b/server/protocol.def
index eab3115..0b0d40f 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -317,6 +317,8 @@ struct token_groups
     int          priority;         /* priority class */
     int          affinity;         /* process affinity mask */
     void*        peb;              /* PEB address in process address space */
+    abs_time_t   start_time;       /* process start time */
+    abs_time_t   end_time;         /* process end time */
 @END
 
 
diff --git a/server/trace.c b/server/trace.c
index b5e40b8..a30310c 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -737,7 +737,12 @@ static void dump_get_process_info_reply(
     fprintf( stderr, " exit_code=%d,", req->exit_code );
     fprintf( stderr, " priority=%d,", req->priority );
     fprintf( stderr, " affinity=%d,", req->affinity );
-    fprintf( stderr, " peb=%p", req->peb );
+    fprintf( stderr, " peb=%p,", req->peb );
+    fprintf( stderr, " start_time=" );
+    dump_abs_time( &req->start_time );
+    fprintf( stderr, "," );
+    fprintf( stderr, " end_time=" );
+    dump_abs_time( &req->end_time );
 }
 
 static void dump_set_process_info_request( const struct set_process_info_request *req )




More information about the wine-cvs mailing list