From c9c5ceccb4f50a81a0f99d683a46dc1f5d4ede62 Mon Sep 17 00:00:00 2001 From: Martin Storsjo Date: Tue, 19 May 2015 22:20:46 +0300 Subject: [PATCH] kernel32: Implement GetSystemTimePreciseAsFileTime. This just falls back to doing the same as GetSystemTimeAsFileTime. --- .../api-ms-win-core-sysinfo-l1-2-0.spec | 2 +- .../api-ms-win-core-sysinfo-l1-2-1.spec | 2 +- dlls/kernel32/kernel32.spec | 1 + dlls/kernel32/tests/time.c | 42 +++++++++++++++++++ dlls/kernel32/time.c | 15 +++++++ include/winbase.h | 1 + 6 files changed, 61 insertions(+), 2 deletions(-) diff --git a/dlls/api-ms-win-core-sysinfo-l1-2-0/api-ms-win-core-sysinfo-l1-2-0.spec b/dlls/api-ms-win-core-sysinfo-l1-2-0/api-ms-win-core-sysinfo-l1-2-0.spec index d3df6bd76f8..9b0567412d5 100644 --- a/dlls/api-ms-win-core-sysinfo-l1-2-0/api-ms-win-core-sysinfo-l1-2-0.spec +++ b/dlls/api-ms-win-core-sysinfo-l1-2-0/api-ms-win-core-sysinfo-l1-2-0.spec @@ -14,7 +14,7 @@ @ stdcall GetSystemTime(ptr) kernel32.GetSystemTime @ stdcall GetSystemTimeAdjustment(ptr ptr ptr) kernel32.GetSystemTimeAdjustment @ stdcall GetSystemTimeAsFileTime(ptr) kernel32.GetSystemTimeAsFileTime -@ stub GetSystemTimePreciseAsFileTime +@ stdcall GetSystemTimePreciseAsFileTime(ptr) kernel32.GetSystemTimePreciseAsFileTime @ stdcall GetSystemWindowsDirectoryA(ptr long) kernel32.GetSystemWindowsDirectoryA @ stdcall GetSystemWindowsDirectoryW(ptr long) kernel32.GetSystemWindowsDirectoryW @ stdcall GetTickCount() kernel32.GetTickCount diff --git a/dlls/api-ms-win-core-sysinfo-l1-2-1/api-ms-win-core-sysinfo-l1-2-1.spec b/dlls/api-ms-win-core-sysinfo-l1-2-1/api-ms-win-core-sysinfo-l1-2-1.spec index 29262c5fc3b..018ab05b222 100644 --- a/dlls/api-ms-win-core-sysinfo-l1-2-1/api-ms-win-core-sysinfo-l1-2-1.spec +++ b/dlls/api-ms-win-core-sysinfo-l1-2-1/api-ms-win-core-sysinfo-l1-2-1.spec @@ -16,7 +16,7 @@ @ stdcall GetSystemTime(ptr) kernel32.GetSystemTime @ stdcall GetSystemTimeAdjustment(ptr ptr ptr) kernel32.GetSystemTimeAdjustment @ stdcall GetSystemTimeAsFileTime(ptr) kernel32.GetSystemTimeAsFileTime -@ stub GetSystemTimePreciseAsFileTime +@ stdcall GetSystemTimePreciseAsFileTime(ptr) kernel32.GetSystemTimePreciseAsFileTime @ stdcall GetSystemWindowsDirectoryA(ptr long) kernel32.GetSystemWindowsDirectoryA @ stdcall GetSystemWindowsDirectoryW(ptr long) kernel32.GetSystemWindowsDirectoryW @ stdcall -ret64 GetTickCount64() kernel32.GetTickCount64 diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec index 12617387986..8f6a13e61bc 100644 --- a/dlls/kernel32/kernel32.spec +++ b/dlls/kernel32/kernel32.spec @@ -829,6 +829,7 @@ @ stdcall GetSystemTime(ptr) @ stdcall GetSystemTimeAdjustment(ptr ptr ptr) @ stdcall GetSystemTimeAsFileTime(ptr) +@ stdcall GetSystemTimePreciseAsFileTime(ptr) @ stdcall GetSystemTimes(ptr ptr ptr) @ stdcall GetSystemWindowsDirectoryA(ptr long) @ stdcall GetSystemWindowsDirectoryW(ptr long) diff --git a/dlls/kernel32/tests/time.c b/dlls/kernel32/tests/time.c index 378941dd2b9..d205174859d 100644 --- a/dlls/kernel32/tests/time.c +++ b/dlls/kernel32/tests/time.c @@ -28,6 +28,7 @@ static BOOL (WINAPI *pSystemTimeToTzSpecificLocalTime)(LPTIME_ZONE_INFORMATION, static int (WINAPI *pGetCalendarInfoA)(LCID,CALID,CALTYPE,LPSTR,int,LPDWORD); static int (WINAPI *pGetCalendarInfoW)(LCID,CALID,CALTYPE,LPWSTR,int,LPDWORD); static DWORD (WINAPI *pGetDynamicTimeZoneInformation)(DYNAMIC_TIME_ZONE_INFORMATION*); +static void (WINAPI *pGetSystemTimePreciseAsFileTime)(LPFILETIME); #define SECSPERMIN 60 #define SECSPERDAY 86400 @@ -761,6 +762,45 @@ static void test_GetDynamicTimeZoneInformation(void) trace("Dyn TimeZoneKeyName %s\n", wine_dbgstr_w(dyninfo.TimeZoneKeyName)); } +static ULONGLONG get_longlong_time(FILETIME *time) +{ + ULARGE_INTEGER uli; + uli.LowPart = time->dwLowDateTime; + uli.HighPart = time->dwHighDateTime; + return uli.QuadPart; +} + +static void test_GetSystemTimePreciseAsFileTime(void) +{ + FILETIME ft; + ULONGLONG time1, time2; + LONGLONG diff; + + if (!pGetSystemTimePreciseAsFileTime) + { + win_skip("GetSystemTimePreciseAsFileTime() is not supported.\n"); + return; + } + + GetSystemTimeAsFileTime(&ft); + time1 = get_longlong_time(&ft); + pGetSystemTimePreciseAsFileTime(&ft); + time2 = get_longlong_time(&ft); + diff = time2 - time1; + if (diff < 0) + diff = -diff; + ok(diff < 1000000, "Difference between GetSystemTimeAsFileTime and GetSystemTimePreciseAsFileTime more than 100 ms\n"); + + pGetSystemTimePreciseAsFileTime(&ft); + time1 = get_longlong_time(&ft); + do { + pGetSystemTimePreciseAsFileTime(&ft); + time2 = get_longlong_time(&ft); + } while (time2 == time1); + diff = time2 - time1; + ok(diff < 10000 && diff > 0, "GetSystemTimePreciseAsFileTime incremented by more than 1 ms\n"); +} + START_TEST(time) { HMODULE hKernel = GetModuleHandleA("kernel32"); @@ -769,6 +809,7 @@ START_TEST(time) pGetCalendarInfoA = (void *)GetProcAddress(hKernel, "GetCalendarInfoA"); pGetCalendarInfoW = (void *)GetProcAddress(hKernel, "GetCalendarInfoW"); pGetDynamicTimeZoneInformation = (void *)GetProcAddress(hKernel, "GetDynamicTimeZoneInformation"); + pGetSystemTimePreciseAsFileTime = (void *)GetProcAddress(hKernel, "GetSystemTimePreciseAsFileTime"); test_conversions(); test_invalid_arg(); @@ -779,4 +820,5 @@ START_TEST(time) test_FileTimeToDosDateTime(); test_GetCalendarInfo(); test_GetDynamicTimeZoneInformation(); + test_GetSystemTimePreciseAsFileTime(); } diff --git a/dlls/kernel32/time.c b/dlls/kernel32/time.c index 2b8e1d99ded..daafc7fd6ef 100644 --- a/dlls/kernel32/time.c +++ b/dlls/kernel32/time.c @@ -548,6 +548,21 @@ VOID WINAPI GetSystemTimeAsFileTime( } +/*********************************************************************** + * GetSystemTimePreciseAsFileTime (KERNEL32.@) + * + * Get the current time in utc format, with <1 us precision. + * + * RETURNS + * Nothing. + */ +VOID WINAPI GetSystemTimePreciseAsFileTime( + LPFILETIME time) /* [out] Destination for the current utc time */ +{ + GetSystemTimeAsFileTime(time); +} + + /********************************************************************* * TIME_ClockTimeToFileTime (olorin@fandra.org, 20-Sep-1998) * diff --git a/include/winbase.h b/include/winbase.h index a8f3fb64a2f..7540e6d558f 100644 --- a/include/winbase.h +++ b/include/winbase.h @@ -2040,6 +2040,7 @@ WINBASEAPI BOOL WINAPI GetSystemRegistryQuota(PDWORD,PDWORD); WINBASEAPI VOID WINAPI GetSystemTime(LPSYSTEMTIME); WINBASEAPI BOOL WINAPI GetSystemTimeAdjustment(PDWORD,PDWORD,PBOOL); WINBASEAPI VOID WINAPI GetSystemTimeAsFileTime(LPFILETIME); +WINBASEAPI VOID WINAPI GetSystemTimePreciseAsFileTime(LPFILETIME); WINBASEAPI UINT WINAPI GetSystemWindowsDirectoryA(LPSTR,UINT); WINBASEAPI UINT WINAPI GetSystemWindowsDirectoryW(LPWSTR,UINT); #define GetSystemWindowsDirectory WINELIB_NAME_AW(GetSystemWindowsDirectory)