Martin Storsjo : kernel32: Implement GetSystemTimePreciseAsFileTime.

Alexandre Julliard julliard at wine.codeweavers.com
Wed May 20 10:04:11 CDT 2015


Module: wine
Branch: master
Commit: c9c5ceccb4f50a81a0f99d683a46dc1f5d4ede62
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=c9c5ceccb4f50a81a0f99d683a46dc1f5d4ede62

Author: Martin Storsjo <martin at martin.st>
Date:   Tue May 19 22:20:46 2015 +0300

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 d3df6bd..9b05674 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 29262c5..018ab05 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 1261738..8f6a13e 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 378941d..d205174 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 2b8e1d9..daafc7f 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 at fandra.org, 20-Sep-1998)
  *
diff --git a/include/winbase.h b/include/winbase.h
index a8f3fb6..7540e6d 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)




More information about the wine-cvs mailing list