diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec index 32bf8e3f030..d30ec3699c0 100644 --- a/dlls/kernel32/kernel32.spec +++ b/dlls/kernel32/kernel32.spec @@ -636,6 +636,7 @@ @ stdcall GetThreadSelectorEntry(long long ptr) @ stdcall GetThreadTimes(long ptr ptr ptr ptr) @ stdcall GetTickCount() +@ stdcall -ret64 GetTickCount64() @ stdcall GetTimeFormatA(long long ptr str ptr long) @ stdcall GetTimeFormatW(long long ptr wstr ptr long) @ stdcall GetTimeZoneInformation(ptr) diff --git a/dlls/kernel32/kernel_main.c b/dlls/kernel32/kernel_main.c index 5e72ceed400..846f7872a7d 100644 --- a/dlls/kernel32/kernel_main.c +++ b/dlls/kernel32/kernel_main.c @@ -46,6 +46,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(process); extern int __wine_set_signal_handler(unsigned, int (*)(unsigned)); +static ULONGLONG server_start_time; + /*********************************************************************** * KERNEL thread initialisation routine */ @@ -112,12 +114,16 @@ static void set_entry_point( HMODULE module, const char *name, DWORD rva ) static BOOL process_attach( HMODULE module ) { SYSTEM_INFO si; + SYSTEM_TIMEOFDAY_INFORMATION ti; RTL_USER_PROCESS_PARAMETERS *params = NtCurrentTeb()->Peb->ProcessParameters; /* FIXME: should probably be done in ntdll */ GetSystemInfo( &si ); NtCurrentTeb()->Peb->NumberOfProcessors = si.dwNumberOfProcessors; + NtQuerySystemInformation( SystemTimeOfDayInformation, &ti, sizeof(ti), NULL ); + server_start_time = ti.liKeBootTime.QuadPart; + /* Setup registry locale information */ LOCALE_InitRegistry(); @@ -236,6 +242,18 @@ INT WINAPI MulDiv( INT nMultiplicand, INT nMultiplier, INT nDivisor) } +/****************************************************************************** + * GetTickCount64 (KERNEL32.@) + */ +ULONGLONG WINAPI GetTickCount64(void) +{ + LARGE_INTEGER now; + + NtQuerySystemTime( &now ); + return (now.QuadPart - server_start_time) / 10000; +} + + /*********************************************************************** * GetTickCount (KERNEL32.@) * @@ -254,5 +272,5 @@ INT WINAPI MulDiv( INT nMultiplicand, INT nMultiplier, INT nDivisor) */ DWORD WINAPI GetTickCount(void) { - return NtGetTickCount(); + return GetTickCount64(); } diff --git a/include/winbase.h b/include/winbase.h index 26691bbf2ec..af6a38c7c71 100644 --- a/include/winbase.h +++ b/include/winbase.h @@ -1679,6 +1679,7 @@ DWORD WINAPI GetTempPathA(DWORD,LPSTR); DWORD WINAPI GetTempPathW(DWORD,LPWSTR); #define GetTempPath WINELIB_NAME_AW(GetTempPath) DWORD WINAPI GetTickCount(void); +ULONGLONG WINAPI GetTickCount64(void); DWORD WINAPI GetTimeZoneInformation(LPTIME_ZONE_INFORMATION); BOOL WINAPI GetThreadContext(HANDLE,CONTEXT *); INT WINAPI GetThreadPriority(HANDLE);