From 026dd2d88ad1070cc990925a00f11fa8488fe651 Mon Sep 17 00:00:00 2001 From: Stefan Siebert Date: Thu, 20 Jul 2006 23:30:04 +0200 Subject: [PATCH] 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 ae06aa3b60e..0768266e918 100644 --- a/dlls/kernel/time.c +++ b/dlls/kernel/time.c @@ -575,16 +575,21 @@ static void TIME_ClockTimeToFileTime(clock_t unix_time, LPFILETIME filetime) * 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 433e6d93a63..c1870861469 100644 --- a/dlls/ntdll/process.c +++ b/dlls/ntdll/process.c @@ -228,9 +228,20 @@ NTSTATUS WINAPI NtQueryInformationProcess( 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 2755827729c..6186fb8f40e 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 231eb2f90bd..a73aa6634fc 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 eab3115388f..0b0d40f7bc0 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 b5e40b85659..a30310ca032 100644 --- a/server/trace.c +++ b/server/trace.c @@ -737,7 +737,12 @@ static void dump_get_process_info_reply( const struct get_process_info_reply *re 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 )