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