Module: wine Branch: refs/heads/master Commit: 026dd2d88ad1070cc990925a00f11fa8488fe651 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=026dd2d88ad1070cc990925a...
Author: Stefan Siebert stefan.siebert@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 )